Столкнулся с проблемой чтения в MIG DDR2.
Запись осуществляю в соответствии с ug086: FIG 9-12.
Нажмите для просмотра прикрепленного файла
Чтение: FIG 9-14.
Нажмите для просмотра прикрепленного файла
Видно что первые 18 отсчетов читаются верно, затем идут 2 некорректных значения, потом 2 корректных и т.д. Адрес app_af_addr увеличиваю следующим образом: 0,4,8,12,16,20 и т.д. до 256.
Код прилагаю:
CODE
i_MEM_CONTROLLER : ddr2_sdram
generic map (
BANK_WIDTH => BANK_WIDTH,
CKE_WIDTH => CKE_WIDTH,
CLK_WIDTH => CLK_WIDTH,
COL_WIDTH => COL_WIDTH,
CS_NUM => CS_NUM,
CS_WIDTH => CS_WIDTH,
CS_BITS => CS_BITS,
DM_WIDTH => DM_WIDTH,
DQ_WIDTH => DQ_WIDTH,
DQ_PER_DQS => DQ_PER_DQS,
DQ_BITS => DQ_BITS,
DQS_WIDTH => DQS_WIDTH,
DQS_BITS => DQS_BITS,
HIGH_PERFORMANCE_MODE => HIGH_PERFORMANCE_MODE,
ODT_WIDTH => ODT_WIDTH,
ROW_WIDTH => ROW_WIDTH,
APPDATA_WIDTH => APPDATA_WIDTH,
ADDITIVE_LAT => ADDITIVE_LAT,
BURST_LEN => BURST_LEN,
BURST_TYPE => BURST_TYPE,
CAS_LAT => CAS_LAT,
ECC_ENABLE => ECC_ENABLE,
MULTI_BANK_EN => MULTI_BANK_EN,
ODT_TYPE => ODT_TYPE,
REDUCE_DRV => REDUCE_DRV,
REG_ENABLE => REG_ENABLE,
TREFI_NS => TREFI_NS,
TRAS => TRAS,
TRCD => TRCD,
TRFC => TRFC,
TRP => TRP,
TRTP => TRTP,
TWR => TWR,
TWTR => TWTR,
SIM_ONLY => SIM_ONLY,
RST_ACT_LOW => RST_ACT_LOW,
CLK_PERIOD => CLK_PERIOD
)
port map (
clk0 => clk_0,
clk90 => clk_90,
clkdiv0 => clkdiv0,
clk200 => clk_200,
sys_rst_n => sys_rst_n,
dcm_lock => dcm_locked,

app_wdf_afull => app_wdf_afull,
app_af_afull => app_af_afull,
rd_data_valid => rd_data_valid,
app_wdf_wren => app_wdf_wren,
app_af_wren => app_af_wren,
app_af_addr => app_af_addr,
app_af_cmd => app_af_cmd,
rd_data_fifo_out => rd_data_fifo_out,
app_wdf_data => app_wdf_data,
app_wdf_mask_data => app_wdf_mask_data,

clk0_tb => clk0_tb,
rst0_tb => rst0_tb,
phy_init_done => phy_init_done,

ddr2_dq => ddr2_dq,
ddr2_a => ddr2_a,
ddr2_ba => ddr2_ba,
ddr2_ras_n => ddr2_ras_n,
ddr2_cas_n => ddr2_cas_n,
ddr2_we_n => ddr2_we_n,
ddr2_cs_n => ddr2_cs_n,
ddr2_odt => ddr2_odt,
ddr2_cke => ddr2_cke,
ddr2_dm => ddr2_dm,
ddr2_dqs => ddr2_dqs_p,
ddr2_dqs_n => ddr2_dqs_n,
ddr2_ck => ddr2_ck_p,
ddr2_ck_n => ddr2_ck_n

);
app_wdf_mask_data<=x"0000";

pr_ddr_test : process (clk0_tb)
begin
if (rising_edge(clk0_tb)) then
if start_wr='1' then
case (STATE) is
when S1 =>
if phy_init_done='1' and app_af_afull='0' and app_wdf_afull='0' then
STATE<=S2;
end if;
--------------ЗАПИСЬ-----------------------
when S2 =>
app_wdf_wren<='1'; cnt_ddr<=cnt_ddr+1;
app_wdf_data<=cnt_ddr;
app_af_wren<=cnt_ddr(0);

app_af_cmd<="000";

if cnt_ddr(0) ='1' then
app_af_addr<=app_af_addr+4;
end if;

if app_af_addr=256 then
app_wdf_wren<='0';
app_af_wren<='0';
app_af_addr<=( others=>'0' );
cnt_ddr<=( others=>'0' );
STATE<=S3;
end if;

when S3 =>
if app_af_afull='0' then
STATE<=S4;
end if;
--------------ЧТЕНИЕ-----------------------
when S4 =>
app_af_wren<='1'; app_af_addr<=app_af_addr+4;
app_af_cmd<="001";


if app_af_addr=256 then
app_af_wren<='0';
app_af_cmd<="000";
app_af_addr<=( others=>'0' );
STATE<=S5;
end if;
when S5 =>
if rd_data_valid='0' then
STATE<=S1;
end if;

end case;
else
app_af_wren<='0';
cnt_ddr<=( others=>'0' );
app_af_cmd<="000";
app_af_addr<=( others=>'0' );
STATE<=S1;
end if;

if rd_data_valid='1' then
data_ddr<=rd_data_fifo_out;
end if;

end if;
end process;


Что я делаю не правильно? Где может быть ошибка?