CONSTANTc_wr_fifo_depth:NATURAL:=g_wr_fifo_depth*(g_tech_ddr.data_w/g_wr_data_w);-- Multiply fifo depth by the fifo's rd/wr width ratio to get write side depth
CONSTANTc_wr_fifo_depth:NATURAL:=g_wr_fifo_depth*(c_ctlr_data_w/g_wr_data_w);-- Multiply fifo depth by the fifo's rd/wr width ratio to get write side depth
CONSTANTc_ddr_ctrl_nof_latent_reads:NATURAL:=100;-- Due to having a command cue, even after de-asserting read requests, the PHY keeps processing the cued read requests.
-- This makes sure 100 words are still available in the read FIFO after it de-asserted its siso.ready signal towards the ddr3 read side.
SIGNALctlr_address:STD_LOGIC_VECTOR(ceil_log2(g_tech_ddr.cs_w-1)+g_tech_ddr.ba_w+g_tech_ddr.a_w+g_tech_ddr.a_col_w-g_tech_ddr.rsl_w-1DOWNTO0);-- ceil_log2(..-1) because the chip select lines are converted to a logical address
SIGNALctlr_rd_req:STD_LOGIC;
SIGNALctlr_wr_req:STD_LOGIC;
SIGNALctlr_ref_rst_n:STD_LOGIC;
SIGNALctlr_gen_rst_n:STD_LOGIC;
SIGNALi_ctlr_gen_clk:STD_LOGIC;
SIGNALi_ctlr_gen_rst:STD_LOGIC;
SIGNALi_ctlr_gen_clk_2x:STD_LOGIC;
SIGNALi_ctlr_init_done:STD_LOGIC;
SIGNALi_ctlr_rdy:STD_LOGIC;
SIGNALi_dvr_done:STD_LOGIC;
SIGNALctlr_gen_clk:STD_LOGIC;
SIGNALctlr_gen_rst:STD_LOGIC;
SIGNALctlr_mosi:t_tech_ddr_mosi;
SIGNALctlr_miso:t_tech_ddr_miso;
SIGNALdvr_cur_addr:t_tech_ddr_addr;
SIGNALdvr_flush:STD_LOGIC:='0';
...
...
@@ -121,21 +115,14 @@ ARCHITECTURE str OF io_ddr IS
BEGIN
ctlr_init_done<=i_ctlr_init_done;
ctlr_rdy<=ctlr_miso.waitrequest_n;
dvr_done<=i_dvr_done;
ctlr_ref_rst_n<=NOT(ctlr_ref_rst);
i_ctlr_gen_rst<=NOT(ctlr_gen_rst_n);
ctlr_gen_clk<=i_ctlr_gen_clk;
ctlr_gen_rst<=i_ctlr_gen_rst;
ctlr_gen_clk_2x<=i_ctlr_gen_clk_2x;
ctlr_rdy<=i_ctlr_rdy;
ctlr_init_done<=i_ctlr_init_done;
u_wr_fifo:ENTITYdp_lib.dp_fifo_dc_mixed_widths
GENERICMAP(
g_wr_data_w=>g_wr_data_w,
g_rd_data_w=>g_tech_ddr.data_w,
g_rd_data_w=>c_ctlr_data_w,
g_use_ctrl=>g_wr_use_ctrl,
g_wr_fifo_size=>c_wr_fifo_depth,
g_wr_fifo_af_margin=>4+c_latency,--default (4) + c_latency to compensate for latency introduced by registering wr_siso.ready
...
...
@@ -144,8 +131,8 @@ BEGIN
PORTMAP(
wr_rst=>wr_rst,
wr_clk=>wr_clk,
rd_rst=>i_ctlr_gen_rst,
rd_clk=>i_ctlr_gen_clk,
rd_rst=>ctlr_gen_rst,
rd_clk=>ctlr_gen_clk,
snk_out=>wr_siso,
snk_in=>wr_sosi,
...
...
@@ -165,20 +152,20 @@ BEGIN
g_framed_xoff=>FALSE-- immediately start flushing when dvr_flush goes high
)
PORTMAP(
rst=>i_ctlr_gen_rst,
clk=>i_ctlr_gen_clk,
rst=>ctlr_gen_rst,
clk=>ctlr_gen_clk,
snk_in=>flush_wr_sosi,
snk_out=>flush_wr_siso,
src_out=>ctlr_wr_sosi,
src_in=>ctlr_wr_siso,-- fixed streaming xon='1'
src_in=>ctlr_wr_siso,
flush_en=>dvr_flush-- memory mapped xon/xoff control