diff --git a/libraries/io/ddr/src/vhdl/io_ddr.vhd b/libraries/io/ddr/src/vhdl/io_ddr.vhd index cf341546316922bbefcb3d2f9b09ad9fa586ed5f..ef7132294c741413de11566e233d579b9937daa6 100644 --- a/libraries/io/ddr/src/vhdl/io_ddr.vhd +++ b/libraries/io/ddr/src/vhdl/io_ddr.vhd @@ -141,13 +141,11 @@ ENTITY io_ddr IS -- Driver clock domain dvr_clk : IN STD_LOGIC; dvr_rst : IN STD_LOGIC; - dvr_en : IN STD_LOGIC; - dvr_done : OUT STD_LOGIC; - dvr_wr_not_rd : IN STD_LOGIC; - dvr_start_address : IN STD_LOGIC_VECTOR(func_tech_ddr_ctlr_address_w(g_tech_ddr)-1 DOWNTO 0); -- ctlr start address = dvr_start_address - dvr_nof_data : IN STD_LOGIC_VECTOR(func_tech_ddr_ctlr_address_w(g_tech_ddr)-1 DOWNTO 0); -- ctlr end address = dvr_start_address + dvr_nof_data - 1 + + dvr_miso : OUT t_mem_ctlr_miso; + dvr_mosi : IN t_mem_ctlr_mosi; dvr_wr_flush_en : IN STD_LOGIC := '0'; - + -- Write FIFO clock domain wr_clk : IN STD_LOGIC; wr_rst : IN STD_LOGIC; @@ -185,11 +183,8 @@ ARCHITECTURE str OF io_ddr IS CONSTANT c_wr_fifo_af_margin : NATURAL := 4 + 1; -- use +1 to compensate for latency introduced by registering wr_siso.ready due to RL=0 CONSTANT c_rd_fifo_af_margin : NATURAL := 4 + g_tech_ddr.maxburstsize; -- use ctlr_rd_src_in.ready to only start new rd access when there is sufficient space in the read FIFO - SIGNAL ctlr_dvr_en : STD_LOGIC; - SIGNAL ctlr_dvr_done : STD_LOGIC; - SIGNAL ctlr_dvr_wr_not_rd : STD_LOGIC; - SIGNAL ctlr_dvr_start_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); - SIGNAL ctlr_dvr_nof_data : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); + SIGNAL ctlr_dvr_miso : t_mem_ctlr_miso; + SIGNAL ctlr_dvr_mosi : t_mem_ctlr_mosi; SIGNAL ctlr_dvr_wr_flush_en : STD_LOGIC := '0'; SIGNAL ctlr_init_done : STD_LOGIC; @@ -227,22 +222,22 @@ BEGIN dvr_clk => dvr_clk, dvr_rst => dvr_rst, - dvr_en => dvr_en, - dvr_done => dvr_done, - dvr_wr_not_rd => dvr_wr_not_rd, - dvr_start_address => dvr_start_address, - dvr_nof_data => dvr_nof_data, + dvr_done => dvr_miso.waitrequest_n, + dvr_en => dvr_mosi.burstbegin, + dvr_wr_not_rd => dvr_mosi.wr, + dvr_start_address => dvr_mosi.address, + dvr_nof_data => dvr_mosi.burstsize, dvr_wr_flush_en => dvr_wr_flush_en, -- DDR controller clock domain ctlr_clk => ctlr_clk_in, ctlr_rst => ctlr_rst_in, - ctlr_dvr_en => ctlr_dvr_en, - ctlr_dvr_done => ctlr_dvr_done, - ctlr_dvr_wr_not_rd => ctlr_dvr_wr_not_rd, - ctlr_dvr_start_address => ctlr_dvr_start_address, - ctlr_dvr_nof_data => ctlr_dvr_nof_data, + ctlr_dvr_done => ctlr_dvr_miso.waitrequest_n, + ctlr_dvr_en => ctlr_dvr_mosi.burstbegin, + ctlr_dvr_wr_not_rd => ctlr_dvr_mosi.wr, + ctlr_dvr_start_address => ctlr_dvr_mosi.address, + ctlr_dvr_nof_data => ctlr_dvr_mosi.burstsize, ctlr_dvr_wr_flush_en => ctlr_dvr_wr_flush_en ); @@ -322,13 +317,14 @@ BEGIN rst => ctlr_rst_in, clk => ctlr_clk_in, - dvr_en => ctlr_dvr_en, - dvr_done => ctlr_dvr_done, - dvr_wr_not_rd => ctlr_dvr_wr_not_rd, + -- Inputs + dvr_en => ctlr_dvr_mosi.burstbegin, + dvr_wr_not_rd => ctlr_dvr_mosi.wr, dvr_wr_flush_en => ctlr_dvr_wr_flush_en, - + dvr_done => ctlr_dvr_miso.waitrequest_n, ctlr_wr_sosi => ctlr_wr_flush_snk_in, + -- Output ctlr_wr_flush_en => ctlr_wr_flush_en ); @@ -366,11 +362,8 @@ BEGIN rst => ctlr_rst_in, clk => ctlr_clk_in, - dvr_en => ctlr_dvr_en, - dvr_wr_not_rd => ctlr_dvr_wr_not_rd, - dvr_start_address => ctlr_dvr_start_address, - dvr_nof_data => ctlr_dvr_nof_data, - dvr_done => ctlr_dvr_done, + dvr_miso => ctlr_dvr_miso, + dvr_mosi => ctlr_dvr_mosi, wr_snk_in => ctlr_wr_snk_in, wr_snk_out => ctlr_wr_snk_out, diff --git a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd index feff3240cd762d085ef9c0fcf7a314b61c19e725..9d1e30ddd94fddd808005f5a62638fcd738f7b59 100644 --- a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd +++ b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd @@ -30,7 +30,12 @@ -- The burst size for both write and read depends on the maximum burst size -- and the remaining block size. -- Remarks: --- . +-- . Both this driver and the DDR IP controller use the t_mem_ctlr_miso/mosi +-- interface. The maximum burst size of the controller is defined by +-- g_tech_ddr.maxburstsize and eg. 64 ctlr data words. The maximum burst size +-- of this driver is as large as the entire ctlr address span. The burst size +-- of driver depends on the block size of the application. + LIBRARY IEEE, tech_ddr_lib, common_lib, dp_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -48,11 +53,8 @@ ENTITY io_ddr_driver IS rst : IN STD_LOGIC; clk : IN STD_LOGIC; - dvr_en : IN STD_LOGIC := '1'; - dvr_wr_not_rd : IN STD_LOGIC; - dvr_start_address : IN STD_LOGIC_VECTOR; - dvr_nof_data : IN STD_LOGIC_VECTOR; - dvr_done : OUT STD_LOGIC; -- Requested wr or rd sequence is done + dvr_miso : OUT t_mem_ctlr_miso; + dvr_mosi : IN t_mem_ctlr_mosi; wr_snk_in : IN t_dp_sosi; wr_snk_out : OUT t_dp_siso; @@ -77,13 +79,18 @@ ARCHITECTURE str OF io_ddr_driver IS SIGNAL nxt_state : t_state_enum; SIGNAL prev_state : t_state_enum; + SIGNAL dvr_en : STD_LOGIC; + SIGNAL dvr_wr_not_rd : STD_LOGIC; + SIGNAL dvr_start_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); + SIGNAL dvr_nof_data : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); + SIGNAL dvr_done : STD_LOGIC; + SIGNAL nxt_dvr_done : STD_LOGIC; + SIGNAL burst_size : POSITIVE RANGE 1 TO 2**g_tech_ddr.maxburstsize_w-1; -- burst size >= 1 SIGNAL nxt_burst_size : POSITIVE; SIGNAL burst_wr_cnt : STD_LOGIC_VECTOR(g_tech_ddr.maxburstsize_w-1 DOWNTO 0); -- count down from burst_size to 0 SIGNAL nxt_burst_wr_cnt : STD_LOGIC_VECTOR(g_tech_ddr.maxburstsize_w-1 DOWNTO 0); - SIGNAL nxt_dvr_done : STD_LOGIC; - SIGNAL cur_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); SIGNAL nxt_cur_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); SIGNAL address_cnt : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); -- count down nof addresses = nof ctlr data words @@ -91,11 +98,18 @@ ARCHITECTURE str OF io_ddr_driver IS BEGIN + -- Map original dvr interface signals to t_mem_ctlr_mosi/miso + dvr_miso.waitrequest_n <= dvr_done; -- Requested wr or rd sequence is done + dvr_en <= dvr_mosi.burstbegin; + dvr_wr_not_rd <= dvr_mosi.wr; -- No need to use dvr_mosi.rd + dvr_start_address <= dvr_mosi.address(c_ctlr_address_w-1 DOWNTO 0); + dvr_nof_data <= dvr_mosi.burstsize(c_ctlr_address_w-1 DOWNTO 0); + p_clk : PROCESS(rst, clk) BEGIN IF rst='1' THEN state <= s_init; - burst_wr_cnt <= (OTHERS => '0'); + burst_wr_cnt <= (OTHERS=>'0'); dvr_done <= '0'; cur_address <= (OTHERS=>'0'); address_cnt <= (OTHERS=>'0'); diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd index e5b70fc7b8a0d580de83e24984627e541b9a76d9..91d3bb78911fb0dfea10c20495d7bc430217b285 100644 --- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd +++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd @@ -93,13 +93,15 @@ ARCHITECTURE str of tb_io_ddr IS SIGNAL dp_clk : STD_LOGIC := '0'; SIGNAL dp_rst : STD_LOGIC; - SIGNAL dvr_start_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); - SIGNAL dvr_nof_data : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); - - SIGNAL dvr_en : STD_LOGIC; + SIGNAL dvr_miso : t_mem_ctlr_miso; + SIGNAL dvr_mosi : t_mem_ctlr_mosi; + SIGNAL dvr_wr_flush_en : STD_LOGIC; + SIGNAL dvr_done : STD_LOGIC; + SIGNAL dvr_en : STD_LOGIC; SIGNAL dvr_wr_not_rd : STD_LOGIC; - SIGNAL dvr_wr_flush_en : STD_LOGIC; + SIGNAL dvr_start_address : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); + SIGNAL dvr_nof_data : STD_LOGIC_VECTOR(c_ctlr_address_w-1 DOWNTO 0); SIGNAL diag_wr_src_in : t_dp_siso; SIGNAL diag_wr_src_out : t_dp_sosi; @@ -252,6 +254,14 @@ BEGIN END IF; END IF; END PROCESS; + + + -- Map original dvr interface signals to t_mem_ctlr_mosi/miso + dvr_done <= dvr_miso.waitrequest_n; -- Requested wr or rd sequence is done + dvr_mosi.burstbegin <= dvr_en; + dvr_mosi.wr <= dvr_wr_not_rd; -- No need to use dvr_mosi.rd + dvr_mosi.address <= RESIZE_MEM_CTLR_ADDRESS(dvr_start_address); + dvr_mosi.burstsize <= RESIZE_MEM_CTLR_BURSTSIZE(dvr_nof_data); u_io_ddr: ENTITY work.io_ddr GENERIC MAP( @@ -281,12 +291,10 @@ BEGIN -- Driver clock domain dvr_clk => dvr_clk, - dvr_rst => dvr_rst, - dvr_en => dvr_en, - dvr_wr_not_rd => dvr_wr_not_rd, - dvr_done => dvr_done, - dvr_start_address => dvr_start_address, - dvr_nof_data => dvr_nof_data, + dvr_rst => dvr_rst, + + dvr_miso => dvr_miso, + dvr_mosi => dvr_mosi, dvr_wr_flush_en => dvr_wr_flush_en, -- Write FIFO clock domain