diff --git a/libraries/technology/ddr/tech_ddr_pkg.vhd b/libraries/technology/ddr/tech_ddr_pkg.vhd index 853f266f3017bc3c108d0e40d018fb4b2c396cb6..e0609ff1880c4e336568c27e5c75260e524f0e5c 100644 --- a/libraries/technology/ddr/tech_ddr_pkg.vhd +++ b/libraries/technology/ddr/tech_ddr_pkg.vhd @@ -26,54 +26,68 @@ USE common_lib.common_pkg.ALL; PACKAGE tech_ddr_pkg IS - -- DDR3 - TYPE t_c_tech_ddr_phy IS RECORD - a_w : NATURAL; -- = 16; - a_row_w : NATURAL; -- = 16; -- = a_w, row address width, via a_w lines - a_col_w : NATURAL; -- = 10; -- <= a_w, col address width, via a_w lines - ba_w : NATURAL; -- = 3; - dq_w : NATURAL; -- = 64; - dqs_w : NATURAL; -- = 8; -- = dq_w / nof_dq_per_dqs; - dm_w : NATURAL; -- = 8; - cs_w : NATURAL; -- = 2; - clk_w : NATURAL; -- = 2; - terminationcontrol_w : NATURAL; -- = 14; + -- Gather all parameters in one record + TYPE t_c_tech_ddr IS RECORD + -- PHY variant within a technology + mts : NATURAL; -- = 800 access rate in mega transfers per second + master : BOOLEAN; -- = TRUE TRUE = uniphy master, FALSE = uniphy slave regarding OCT and terminationcontrol for DDR3 + -- PHY external FPGA IO + a_w : NATURAL; -- = 16 + a_row_w : NATURAL; -- = 16 = a_w, row address width, via a_w lines + a_col_w : NATURAL; -- = 10 <= a_w, col address width, via a_w lines + ba_w : NATURAL; -- = 3 + dq_w : NATURAL; -- = 64 + dqs_w : NATURAL; -- = 8 = dq_w / nof_dq_per_dqs; + dm_w : NATURAL; -- = 8 + cs_w : NATURAL; -- = 2 + clk_w : NATURAL; -- = 2 + -- PHY internal FPGA IO + terminationcontrol_w : NATURAL; -- = 14 internal bus in FPGA + -- Controller + rsl : NATURAL; -- = 4 = 2 (use both PHY clock edges) * 2 (PHY transfer at double rate), resolution + rsl_w : NATURAL; -- = 2 = ceil_log2(rsl) + address_w : NATURAL; -- = 32 = (2**32)*c_tech_ddr_phy.dq_w/c_byte_w bytes + data_w : NATURAL; -- = 256 = rsl * c_tech_ddr_phy.dq_w + maxburstsize : NATURAL; -- = 64 + maxburstsize_w : NATURAL; -- = 7 = ceil_log2(maxburstsize+1) END RECORD; - - CONSTANT c_tech_ddr_phy : t_c_tech_ddr_phy := (16, 16, 10, 3, 64, 8, 8, 2, 2, 14); - CONSTANT c_tech_ddr_phy_4g : t_c_tech_ddr_phy := (15, 15, 10, 3, 64, 8, 8, 2, 2, 14); - + + CONSTANT c_tech_ddr_max : t_c_tech_ddr := ( 800, TRUE, 16, 16, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); -- maximum ranges for record field definitions + CONSTANT c_tech_ddr_4g_800m : t_c_tech_ddr := ( 800, TRUE, 15, 15, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); + CONSTANT c_tech_ddr_4g_800m_slave : t_c_tech_ddr := ( 800, FALSE, 15, 15, 10, 3, 64, 8, 8, 2, 2, 14, 4, 2, 32, 256, 64, 7); + + -- PHY in, inout and out signal records TYPE t_tech_ddr_phy_in IS RECORD evt : STD_LOGIC; -- event signal is Not Connected to DDR3 PHY oct_rup : STD_LOGIC; -- only master DDR3 PHY has On Chip Termination OCT inputs oct_rdn : STD_LOGIC; -- only master DDR3 PHY has On Chip Termination OCT inputs - seriesterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_phy.terminationcontrol_w-1 DOWNTO 0); -- termination control to slave from master DDR3 PHY - parallelterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_phy.terminationcontrol_w-1 DOWNTO 0); -- termination control to slave from master DDR3 PHY + seriesterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_max.terminationcontrol_w-1 DOWNTO 0); -- termination control to slave from master DDR3 PHY (internal signal in FPGA) + parallelterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_max.terminationcontrol_w-1 DOWNTO 0); -- termination control to slave from master DDR3 PHY (internal signal in FPGA) END RECORD; TYPE t_tech_ddr_phy_io IS RECORD - dq : STD_LOGIC_VECTOR(c_tech_ddr_phy.dq_w-1 DOWNTO 0); -- data bus - dqs : STD_LOGIC_VECTOR(c_tech_ddr_phy.dqs_w-1 DOWNTO 0); -- data strobe bus - dqs_n : STD_LOGIC_VECTOR(c_tech_ddr_phy.dqs_w-1 DOWNTO 0); - clk : STD_LOGIC_VECTOR(c_tech_ddr_phy.clk_w-1 DOWNTO 0); -- clock, positive edge clock - clk_n : STD_LOGIC_VECTOR(c_tech_ddr_phy.clk_w-1 DOWNTO 0); -- clock, negative edge clock + dq : STD_LOGIC_VECTOR(c_tech_ddr_max.dq_w-1 DOWNTO 0); -- data bus + dqs : STD_LOGIC_VECTOR(c_tech_ddr_max.dqs_w-1 DOWNTO 0); -- data strobe bus + dqs_n : STD_LOGIC_VECTOR(c_tech_ddr_max.dqs_w-1 DOWNTO 0); + clk : STD_LOGIC_VECTOR(c_tech_ddr_max.clk_w-1 DOWNTO 0); -- clock, positive edge clock + clk_n : STD_LOGIC_VECTOR(c_tech_ddr_max.clk_w-1 DOWNTO 0); -- clock, negative edge clock scl : STD_LOGIC; -- I2C sda : STD_LOGIC; END RECORD; TYPE t_tech_ddr_phy_ou IS RECORD - a : STD_LOGIC_VECTOR(c_tech_ddr_phy.a_w-1 DOWNTO 0); -- row and column address - ba : STD_LOGIC_VECTOR(c_tech_ddr_phy.ba_w-1 DOWNTO 0); -- bank address - dm : STD_LOGIC_VECTOR(c_tech_ddr_phy.dm_w-1 DOWNTO 0); -- data mask bus + a : STD_LOGIC_VECTOR(c_tech_ddr_max.a_w-1 DOWNTO 0); -- row and column address + ba : STD_LOGIC_VECTOR(c_tech_ddr_max.ba_w-1 DOWNTO 0); -- bank address + dm : STD_LOGIC_VECTOR(c_tech_ddr_max.dm_w-1 DOWNTO 0); -- data mask bus cas_n : STD_LOGIC; -- column address strobe ras_n : STD_LOGIC; -- row address strobe we_n : STD_LOGIC; -- write enable signal reset_n : STD_LOGIC; -- reset signal - odt : STD_LOGIC_VECTOR(c_tech_ddr_phy.cs_w-1 DOWNTO 0); -- on-die termination control signal - cke : STD_LOGIC_VECTOR(c_tech_ddr_phy.cs_w-1 DOWNTO 0); -- clock enable - cs_n : STD_LOGIC_VECTOR(c_tech_ddr_phy.cs_w-1 DOWNTO 0); -- chip select - seriesterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_phy.terminationcontrol_w-1 DOWNTO 0); -- termination control from master to slave DDR3 PHY - parallelterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_phy.terminationcontrol_w-1 DOWNTO 0); -- termination control from master to slave DDR3 PHY + odt : STD_LOGIC_VECTOR(c_tech_ddr_max.cs_w-1 DOWNTO 0); -- on-die termination control signal + cke : STD_LOGIC_VECTOR(c_tech_ddr_max.cs_w-1 DOWNTO 0); -- clock enable + cs_n : STD_LOGIC_VECTOR(c_tech_ddr_max.cs_w-1 DOWNTO 0); -- chip select + seriesterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_max.terminationcontrol_w-1 DOWNTO 0); -- termination control from master to slave DDR3 PHY (internal signal in FPGA) + parallelterminationcontrol : STD_LOGIC_VECTOR(c_tech_ddr_max.terminationcontrol_w-1 DOWNTO 0); -- termination control from master to slave DDR3 PHY (internal signal in FPGA) END RECORD; CONSTANT c_tech_ddr_phy_in_rst : t_tech_ddr_phy_in := ('0', 'X', 'X', (OTHERS=>'X'), (OTHERS=>'X')); @@ -84,46 +98,37 @@ PACKAGE tech_ddr_pkg IS TYPE t_tech_ddr_phy_io_arr IS ARRAY(NATURAL RANGE <>) OF t_tech_ddr_phy_io; TYPE t_tech_ddr_phy_ou_arr IS ARRAY(NATURAL RANGE <>) OF t_tech_ddr_phy_ou; + -- PHY address signal record TYPE t_tech_ddr_addr IS RECORD - chip : STD_LOGIC_VECTOR(ceil_log2(c_tech_ddr_phy.cs_w) -1 DOWNTO 0); -- Use ceil_log2() because the controller interprets the chip address as logical address (NOT individual chip select lines) - bank : STD_LOGIC_VECTOR( c_tech_ddr_phy.ba_w -1 DOWNTO 0); - row : STD_LOGIC_VECTOR( c_tech_ddr_phy.a_row_w-1 DOWNTO 0); - column : STD_LOGIC_VECTOR( c_tech_ddr_phy.a_col_w-1 DOWNTO 0); + chip : STD_LOGIC_VECTOR(ceil_log2(c_tech_ddr_max.cs_w) -1 DOWNTO 0); -- Use ceil_log2() because the controller interprets the chip address as logical address (NOT individual chip select lines) + bank : STD_LOGIC_VECTOR( c_tech_ddr_max.ba_w -1 DOWNTO 0); + row : STD_LOGIC_VECTOR( c_tech_ddr_max.a_row_w-1 DOWNTO 0); + column : STD_LOGIC_VECTOR( c_tech_ddr_max.a_col_w-1 DOWNTO 0); END RECORD; TYPE t_tech_ddr_addr_arr IS ARRAY(NATURAL RANGE <>) OF t_tech_ddr_addr; - - TYPE t_c_tech_ddr_ctlr IS RECORD -- DDR3 - rsl : NATURAL; -- = 4 = 2 (use both PHY clock edges) * 2 (PHY transfer at double rate), resolution - rsl_w : NATURAL; -- = 2 = ceil_log2(rsl) - address_w : NATURAL; -- = 32 = (2**32)*c_tech_ddr_phy.dq_w/c_byte_w bytes - data_w : NATURAL; -- = 256 = rsl * c_tech_ddr_phy.dq_w - maxburstsize : NATURAL; -- = 64 - maxburstsize_w : NATURAL; -- = 7 = ceil_log2(maxburstsize+1) - END RECORD; - - CONSTANT c_tech_ddr_ctlr : t_c_tech_ddr_ctlr := (4, 2, 32, 256, 64, 7); CONSTANT c_tech_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. + -- 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. - CONSTANT c_tech_ddr_addr_lo : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0')); - CONSTANT c_tech_ddr_addr_hi_4gb : t_tech_ddr_addr := ((OTHERS=>'1'), (OTHERS=>'1'), (OTHERS=>'1'), TO_UVEC(2**c_tech_ddr_phy_4g.a_col_w - c_tech_ddr_ctlr.rsl, c_tech_ddr_phy_4g.a_col_w)); - CONSTANT c_tech_ddr_addr_hi_sim : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), TO_UVEC(3, c_tech_ddr_phy.a_row_w), TO_UVEC(2**c_tech_ddr_phy_4g.a_col_w - c_tech_ddr_ctlr.rsl, c_tech_ddr_phy_4g.a_col_w)); + CONSTANT c_tech_ddr_addr_lo : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0'), (OTHERS=>'0')); + CONSTANT c_tech_ddr_addr_hi_4gb_800m : t_tech_ddr_addr := ((OTHERS=>'1'), (OTHERS=>'1'), (OTHERS=>'1'), TO_UVEC(2**c_tech_ddr_4g_800m.a_col_w - c_tech_ddr_4g_800m.rsl, c_tech_ddr_4g_800m.a_col_w)); + CONSTANT c_tech_ddr_addr_hi_sim : t_tech_ddr_addr := ((OTHERS=>'0'), (OTHERS=>'0'), TO_UVEC(3, c_tech_ddr_4g_800m.a_row_w), TO_UVEC(2**c_tech_ddr_4g_800m.a_col_w - c_tech_ddr_4g_800m.rsl, c_tech_ddr_4g_800m.a_col_w)); + -- PHY MM access signal record TYPE t_tech_ddr_miso IS RECORD - rddata : STD_LOGIC_VECTOR(c_tech_ddr_ctlr.data_w-1 DOWNTO 0); + rddata : STD_LOGIC_VECTOR(c_tech_ddr_max.data_w-1 DOWNTO 0); rdval : STD_LOGIC; waitrequest_n : STD_LOGIC; END RECORD; TYPE t_tech_ddr_mosi IS RECORD - address : STD_LOGIC_VECTOR(c_tech_ddr_ctlr.address_w-1 DOWNTO 0); - wrdata : STD_LOGIC_VECTOR(c_tech_ddr_ctlr.data_w-1 DOWNTO 0); + address : STD_LOGIC_VECTOR(c_tech_ddr_max.address_w-1 DOWNTO 0); + wrdata : STD_LOGIC_VECTOR(c_tech_ddr_max.data_w-1 DOWNTO 0); wr : STD_LOGIC; rd : STD_LOGIC; burstbegin : STD_LOGIC; - burstsize : STD_LOGIC_VECTOR(c_tech_ddr_ctlr.maxburstsize_w-1 DOWNTO 0); + burstsize : STD_LOGIC_VECTOR(c_tech_ddr_max.maxburstsize_w-1 DOWNTO 0); END RECORD; END tech_ddr_pkg; diff --git a/libraries/technology/ddr3/tech_ddr3.vhd b/libraries/technology/ddr3/tech_ddr3.vhd index 8c38c491fe98ead82d6eab7831fc777dbeaa4c1d..fa8dd8a7eee33b895a004bd33d97a74d3719963f 100644 --- a/libraries/technology/ddr3/tech_ddr3.vhd +++ b/libraries/technology/ddr3/tech_ddr3.vhd @@ -29,9 +29,7 @@ USE tech_ddr_lib.tech_ddr_pkg.ALL; ENTITY tech_ddr3 IS GENERIC ( g_technology : NATURAL := c_tech_select_default; - g_master : BOOLEAN := TRUE; - g_ddr_phy : t_c_tech_ddr_phy; - g_ddr_ctlr : t_c_tech_ddr_ctlr + g_ddr : t_c_tech_ddr ); PORT ( -- PLL reference clock @@ -63,7 +61,7 @@ BEGIN gen_ip_stratixiv : IF g_technology=c_tech_stratixiv GENERATE u0 : ENTITY work.tech_ddr3_stratixiv - GENERIC MAP (g_master, g_ddr_phy, g_ddr_ctlr) + GENERIC MAP (g_ddr) PORT MAP (ctlr_ref_clk, ctlr_ref_rst, ctlr_gen_clk, ctlr_gen_rst, ctlr_gen_clk_2x, ctlr_gen_rst_2x, ctlr_init_done, diff --git a/libraries/technology/ddr3/tech_ddr3_stratixiv.vhd b/libraries/technology/ddr3/tech_ddr3_stratixiv.vhd index 3b847387c8042ef2e80e75c8a6104b8be3c64ab0..2444e87fe1ab420578ef93050a759d252f437fdc 100644 --- a/libraries/technology/ddr3/tech_ddr3_stratixiv.vhd +++ b/libraries/technology/ddr3/tech_ddr3_stratixiv.vhd @@ -32,9 +32,7 @@ USE work.tech_ddr3_component_pkg.ALL; ENTITY tech_ddr3_stratixiv IS GENERIC ( - g_master : BOOLEAN := TRUE; - g_ddr_phy : t_c_tech_ddr_phy; - g_ddr_ctlr : t_c_tech_ddr_ctlr + g_ddr : t_c_tech_ddr ); PORT ( -- PLL reference clock @@ -67,105 +65,105 @@ ARCHITECTURE str OF tech_ddr3_stratixiv IS BEGIN - gen_master : IF g_master=TRUE GENERATE + gen_master : IF g_ddr.master=TRUE GENERATE u_ip_stratixiv_ddr3_uphy_4g_800_master : ip_stratixiv_ddr3_uphy_4g_800_master PORT MAP ( - pll_ref_clk => ctlr_ref_clk, -- pll_ref_clk.clk - global_reset_n => ctlr_ref_rst, -- global_reset.reset_n - soft_reset_n => '0', -- soft_reset.reset_n - afi_clk => ctlr_gen_clk, -- afi_clk.clk - afi_half_clk => OPEN, -- afi_half_clk.clk - afi_reset_n => ctlr_gen_rst, -- afi_reset.reset_n - mem_a => phy_ou.a(g_ddr_phy.a_w-1 DOWNTO 0), -- memory.mem_a - mem_ba => phy_ou.ba(g_ddr_phy.ba_w-1 DOWNTO 0), -- .mem_ba - mem_ck => phy_io.clk(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_ck - mem_ck_n => phy_io.clk_n(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_ck_n - mem_cke => phy_ou.cke(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_cke - mem_cs_n => phy_ou.cs_n(g_ddr_phy.cs_w-1 DOWNTO 0), -- .mem_cs_n - mem_dm => phy_ou.dm(g_ddr_phy.dm_w-1 DOWNTO 0), -- .mem_dm - mem_ras_n => phy_ou.ras_n, -- .mem_ras_n - mem_cas_n => phy_ou.cas_n, -- .mem_cas_n - mem_we_n => phy_ou.we_n, -- .mem_we_n - mem_reset_n => phy_ou.reset_n, -- .mem_reset_n - mem_dq => phy_io.dq(g_ddr_phy.dq_w-1 DOWNTO 0), -- .mem_dq - mem_dqs => phy_io.dqs(g_ddr_phy.dqs_w-1 DOWNTO 0), -- .mem_dqs - mem_dqs_n => phy_io.dqs_n(g_ddr_phy.dqs_w-1 DOWNTO 0), -- .mem_dqs_n - mem_odt => phy_ou.odt(g_ddr_phy.cs_w-1 DOWNTO 0), -- .mem_odt - avl_ready => ctrl_miso.waitrequest_n, -- avl.waitrequest_n - avl_burstbegin => ctrl_mosi.burstbegin, -- .beginbursttransfer - avl_addr => ctrl_mosi.address(g_ddr_ctlr.address_w-1 DOWNTO 0), -- .address - avl_rdata_valid => ctrl_miso.rdval, -- .readdatavalid - avl_rdata => ctrl_miso.rddata(g_ddr_ctlr.data_w-1 DOWNTO 0), -- .readdata - avl_wdata => ctrl_mosi.wrdata(g_ddr_ctlr.data_w-1 DOWNTO 0), -- .writedata - avl_be => (OTHERS=>'1'), -- .byteenable - avl_read_req => ctrl_mosi.rd, -- .read - avl_write_req => ctrl_mosi.wr, -- .write - avl_size => ctrl_mosi.burstsize(g_ddr_ctlr.maxburstsize_w-1 DOWNTO 0), -- .burstcount - local_init_done => ctlr_init_done, -- status.local_init_done - local_cal_success => OPEN, -- .local_cal_success - local_cal_fail => OPEN, -- .local_cal_fail - oct_rdn => phy_in.oct_rdn, -- oct.rdn - oct_rup => phy_in.oct_rup, -- .rup - seriesterminationcontrol => phy_ou.seriesterminationcontrol(g_ddr_phy.terminationcontrol_w-1 DOWNTO 0), -- oct_sharing.seriesterminationcontrol - parallelterminationcontrol => phy_ou.parallelterminationcontrol(g_ddr_phy.terminationcontrol_w-1 DOWNTO 0), -- .parallelterminationcontrol - pll_mem_clk => i_ctlr_gen_clk_2x, -- pll_sharing.pll_mem_clk - pll_write_clk => OPEN, -- .pll_write_clk - pll_write_clk_pre_phy_clk => OPEN, -- .pll_write_clk_pre_phy_clk - pll_addr_cmd_clk => OPEN, -- .pll_addr_cmd_clk - pll_locked => OPEN, -- .pll_locked - pll_avl_clk => OPEN, -- .pll_avl_clk - pll_config_clk => OPEN, -- .pll_config_clk - dll_delayctrl => OPEN -- dll_sharing.dll_delayctrl + pll_ref_clk => ctlr_ref_clk, -- pll_ref_clk.clk + global_reset_n => ctlr_ref_rst, -- global_reset.reset_n + soft_reset_n => '0', -- soft_reset.reset_n + afi_clk => ctlr_gen_clk, -- afi_clk.clk + afi_half_clk => OPEN, -- afi_half_clk.clk + afi_reset_n => ctlr_gen_rst, -- afi_reset.reset_n + mem_a => phy_ou.a(g_ddr.a_w-1 DOWNTO 0), -- memory.mem_a + mem_ba => phy_ou.ba(g_ddr.ba_w-1 DOWNTO 0), -- .mem_ba + mem_ck => phy_io.clk(g_ddr.clk_w-1 DOWNTO 0), -- .mem_ck + mem_ck_n => phy_io.clk_n(g_ddr.clk_w-1 DOWNTO 0), -- .mem_ck_n + mem_cke => phy_ou.cke(g_ddr.clk_w-1 DOWNTO 0), -- .mem_cke + mem_cs_n => phy_ou.cs_n(g_ddr.cs_w-1 DOWNTO 0), -- .mem_cs_n + mem_dm => phy_ou.dm(g_ddr.dm_w-1 DOWNTO 0), -- .mem_dm + mem_ras_n => phy_ou.ras_n, -- .mem_ras_n + mem_cas_n => phy_ou.cas_n, -- .mem_cas_n + mem_we_n => phy_ou.we_n, -- .mem_we_n + mem_reset_n => phy_ou.reset_n, -- .mem_reset_n + mem_dq => phy_io.dq(g_ddr.dq_w-1 DOWNTO 0), -- .mem_dq + mem_dqs => phy_io.dqs(g_ddr.dqs_w-1 DOWNTO 0), -- .mem_dqs + mem_dqs_n => phy_io.dqs_n(g_ddr.dqs_w-1 DOWNTO 0), -- .mem_dqs_n + mem_odt => phy_ou.odt(g_ddr.cs_w-1 DOWNTO 0), -- .mem_odt + avl_ready => ctrl_miso.waitrequest_n, -- avl.waitrequest_n + avl_burstbegin => ctrl_mosi.burstbegin, -- .beginbursttransfer + avl_addr => ctrl_mosi.address(g_ddr.address_w-1 DOWNTO 0), -- .address + avl_rdata_valid => ctrl_miso.rdval, -- .readdatavalid + avl_rdata => ctrl_miso.rddata(g_ddr.data_w-1 DOWNTO 0), -- .readdata + avl_wdata => ctrl_mosi.wrdata(g_ddr.data_w-1 DOWNTO 0), -- .writedata + avl_be => (OTHERS=>'1'), -- .byteenable + avl_read_req => ctrl_mosi.rd, -- .read + avl_write_req => ctrl_mosi.wr, -- .write + avl_size => ctrl_mosi.burstsize(g_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount + local_init_done => ctlr_init_done, -- status.local_init_done + local_cal_success => OPEN, -- .local_cal_success + local_cal_fail => OPEN, -- .local_cal_fail + oct_rdn => phy_in.oct_rdn, -- oct.rdn + oct_rup => phy_in.oct_rup, -- .rup + seriesterminationcontrol => phy_ou.seriesterminationcontrol(g_ddr.terminationcontrol_w-1 DOWNTO 0), -- oct_sharing.seriesterminationcontrol + parallelterminationcontrol => phy_ou.parallelterminationcontrol(g_ddr.terminationcontrol_w-1 DOWNTO 0), -- .parallelterminationcontrol + pll_mem_clk => i_ctlr_gen_clk_2x, -- pll_sharing.pll_mem_clk + pll_write_clk => OPEN, -- .pll_write_clk + pll_write_clk_pre_phy_clk => OPEN, -- .pll_write_clk_pre_phy_clk + pll_addr_cmd_clk => OPEN, -- .pll_addr_cmd_clk + pll_locked => OPEN, -- .pll_locked + pll_avl_clk => OPEN, -- .pll_avl_clk + pll_config_clk => OPEN, -- .pll_config_clk + dll_delayctrl => OPEN -- dll_sharing.dll_delayctrl ); END GENERATE; - gen_slave : IF g_master=FALSE GENERATE + gen_slave : IF g_ddr.master=FALSE GENERATE u_ip_stratixiv_ddr3_uphy_4g_800_slave : ip_stratixiv_ddr3_uphy_4g_800_slave PORT MAP ( - pll_ref_clk => ctlr_ref_clk, -- pll_ref_clk.clk - global_reset_n => ctlr_ref_rst, -- global_reset.reset_n - soft_reset_n => '0', -- soft_reset.reset_n - afi_clk => ctlr_gen_clk, -- afi_clk.clk - afi_half_clk => OPEN, -- afi_half_clk.clk - afi_reset_n => ctlr_gen_rst, -- afi_reset.reset_n - mem_a => phy_ou.a(g_ddr_phy.a_w-1 DOWNTO 0), -- memory.mem_a - mem_ba => phy_ou.ba(g_ddr_phy.ba_w-1 DOWNTO 0), -- .mem_ba - mem_ck => phy_io.clk(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_ck - mem_ck_n => phy_io.clk_n(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_ck_n - mem_cke => phy_ou.cke(g_ddr_phy.clk_w-1 DOWNTO 0), -- .mem_cke - mem_cs_n => phy_ou.cs_n(g_ddr_phy.cs_w-1 DOWNTO 0), -- .mem_cs_n - mem_dm => phy_ou.dm(g_ddr_phy.dm_w-1 DOWNTO 0), -- .mem_dm - mem_ras_n => phy_ou.ras_n, -- .mem_ras_n - mem_cas_n => phy_ou.cas_n, -- .mem_cas_n - mem_we_n => phy_ou.we_n, -- .mem_we_n - mem_reset_n => phy_ou.reset_n, -- .mem_reset_n - mem_dq => phy_io.dq(g_ddr_phy.dq_w-1 DOWNTO 0), -- .mem_dq - mem_dqs => phy_io.dqs(g_ddr_phy.dqs_w-1 DOWNTO 0), -- .mem_dqs - mem_dqs_n => phy_io.dqs_n(g_ddr_phy.dqs_w-1 DOWNTO 0), -- .mem_dqs_n - mem_odt => phy_ou.odt(g_ddr_phy.cs_w-1 DOWNTO 0), -- .mem_odt - avl_ready => ctrl_miso.waitrequest_n, -- avl.waitrequest_n - avl_burstbegin => ctrl_mosi.burstbegin, -- .beginbursttransfer - avl_addr => ctrl_mosi.address(g_ddr_ctlr.address_w-1 DOWNTO 0), -- .address - avl_rdata_valid => ctrl_miso.rdval, -- .readdatavalid - avl_rdata => ctrl_miso.rddata(g_ddr_ctlr.data_w-1 DOWNTO 0), -- .readdata - avl_wdata => ctrl_mosi.wrdata(g_ddr_ctlr.data_w-1 DOWNTO 0), -- .writedata - avl_be => (OTHERS=>'1'), -- .byteenable - avl_read_req => ctrl_mosi.rd, -- .read - avl_write_req => ctrl_mosi.wr, -- .write - avl_size => ctrl_mosi.burstsize(g_ddr_ctlr.maxburstsize_w-1 DOWNTO 0), -- .burstcount - local_init_done => ctlr_init_done, -- status.local_init_done - local_cal_success => OPEN, -- .local_cal_success - local_cal_fail => OPEN, -- .local_cal_fail - seriesterminationcontrol => phy_in.seriesterminationcontrol(g_ddr_phy.terminationcontrol_w-1 DOWNTO 0), -- oct_sharing.seriesterminationcontrol - parallelterminationcontrol => phy_in.parallelterminationcontrol(g_ddr_phy.terminationcontrol_w-1 DOWNTO 0), -- .parallelterminationcontrol - pll_mem_clk => i_ctlr_gen_clk_2x, -- pll_sharing.pll_mem_clk - pll_write_clk => OPEN, -- .pll_write_clk - pll_write_clk_pre_phy_clk => OPEN, -- .pll_write_clk_pre_phy_clk - pll_addr_cmd_clk => OPEN, -- .pll_addr_cmd_clk - pll_locked => OPEN, -- .pll_locked - pll_avl_clk => OPEN, -- .pll_avl_clk - pll_config_clk => OPEN, -- .pll_config_clk - dll_delayctrl => OPEN -- dll_sharing.dll_delayctrl + pll_ref_clk => ctlr_ref_clk, -- pll_ref_clk.clk + global_reset_n => ctlr_ref_rst, -- global_reset.reset_n + soft_reset_n => '0', -- soft_reset.reset_n + afi_clk => ctlr_gen_clk, -- afi_clk.clk + afi_half_clk => OPEN, -- afi_half_clk.clk + afi_reset_n => ctlr_gen_rst, -- afi_reset.reset_n + mem_a => phy_ou.a(g_ddr.a_w-1 DOWNTO 0), -- memory.mem_a + mem_ba => phy_ou.ba(g_ddr.ba_w-1 DOWNTO 0), -- .mem_ba + mem_ck => phy_io.clk(g_ddr.clk_w-1 DOWNTO 0), -- .mem_ck + mem_ck_n => phy_io.clk_n(g_ddr.clk_w-1 DOWNTO 0), -- .mem_ck_n + mem_cke => phy_ou.cke(g_ddr.clk_w-1 DOWNTO 0), -- .mem_cke + mem_cs_n => phy_ou.cs_n(g_ddr.cs_w-1 DOWNTO 0), -- .mem_cs_n + mem_dm => phy_ou.dm(g_ddr.dm_w-1 DOWNTO 0), -- .mem_dm + mem_ras_n => phy_ou.ras_n, -- .mem_ras_n + mem_cas_n => phy_ou.cas_n, -- .mem_cas_n + mem_we_n => phy_ou.we_n, -- .mem_we_n + mem_reset_n => phy_ou.reset_n, -- .mem_reset_n + mem_dq => phy_io.dq(g_ddr.dq_w-1 DOWNTO 0), -- .mem_dq + mem_dqs => phy_io.dqs(g_ddr.dqs_w-1 DOWNTO 0), -- .mem_dqs + mem_dqs_n => phy_io.dqs_n(g_ddr.dqs_w-1 DOWNTO 0), -- .mem_dqs_n + mem_odt => phy_ou.odt(g_ddr.cs_w-1 DOWNTO 0), -- .mem_odt + avl_ready => ctrl_miso.waitrequest_n, -- avl.waitrequest_n + avl_burstbegin => ctrl_mosi.burstbegin, -- .beginbursttransfer + avl_addr => ctrl_mosi.address(g_ddr.address_w-1 DOWNTO 0), -- .address + avl_rdata_valid => ctrl_miso.rdval, -- .readdatavalid + avl_rdata => ctrl_miso.rddata(g_ddr.data_w-1 DOWNTO 0), -- .readdata + avl_wdata => ctrl_mosi.wrdata(g_ddr.data_w-1 DOWNTO 0), -- .writedata + avl_be => (OTHERS=>'1'), -- .byteenable + avl_read_req => ctrl_mosi.rd, -- .read + avl_write_req => ctrl_mosi.wr, -- .write + avl_size => ctrl_mosi.burstsize(g_ddr.maxburstsize_w-1 DOWNTO 0), -- .burstcount + local_init_done => ctlr_init_done, -- status.local_init_done + local_cal_success => OPEN, -- .local_cal_success + local_cal_fail => OPEN, -- .local_cal_fail + seriesterminationcontrol => phy_in.seriesterminationcontrol(g_ddr.terminationcontrol_w-1 DOWNTO 0), -- oct_sharing.seriesterminationcontrol + parallelterminationcontrol => phy_in.parallelterminationcontrol(g_ddr.terminationcontrol_w-1 DOWNTO 0), -- .parallelterminationcontrol + pll_mem_clk => i_ctlr_gen_clk_2x, -- pll_sharing.pll_mem_clk + pll_write_clk => OPEN, -- .pll_write_clk + pll_write_clk_pre_phy_clk => OPEN, -- .pll_write_clk_pre_phy_clk + pll_addr_cmd_clk => OPEN, -- .pll_addr_cmd_clk + pll_locked => OPEN, -- .pll_locked + pll_avl_clk => OPEN, -- .pll_avl_clk + pll_config_clk => OPEN, -- .pll_config_clk + dll_delayctrl => OPEN -- dll_sharing.dll_delayctrl ); END GENERATE;