diff --git a/applications/lofar2/libraries/ddrctrl/hdllib.cfg b/applications/lofar2/libraries/ddrctrl/hdllib.cfg index 53fe5f5958c0cf866e1870d4ed11367b023c7df5..680087809228f4bc30595a66a693a7c95f6a998f 100644 --- a/applications/lofar2/libraries/ddrctrl/hdllib.cfg +++ b/applications/lofar2/libraries/ddrctrl/hdllib.cfg @@ -11,6 +11,7 @@ synth_files = src/vhdl/ddrctrl_input.vhd src/vhdl/ddrctrl_controller.vhd src/vhdl/ddrctrl.vhd + src/vhdl/ddrctrl_pkg.vhd test_bench_files = tb/vhdl/tb_ddrctrl_input_address_counter.vhd diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index e24344df83a4fc634179dea7d83932802c79b93f..507909186e5af0cf92db7afa6895982180ecaa0c 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -32,7 +32,7 @@ -- https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding -- The maximum value of the address is determend by g_tech_ddr. -LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib, io_ddr_lib; +LIBRARY IEEE, technology_lib, tech_ddr_lib, common_lib, dp_lib, io_ddr_lib, lofar2_ddrctrl_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE technology_lib.technology_pkg.ALL; @@ -42,6 +42,7 @@ USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; USE io_ddr_lib.ALL; +USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL; ENTITY ddrctrl IS @@ -50,7 +51,8 @@ ENTITY ddrctrl IS g_sim_model : BOOLEAN := TRUE; -- determens if this is a simulation g_technology : NATURAL := c_tech_select_default; g_nof_streams : NATURAL := 12; -- number of input streams - g_data_w : NATURAL := 14 -- data with of input data vectors + g_data_w : NATURAL := 14; -- data with of input data vectors + g_stop_pos : t_c_stop_pos ); PORT ( clk : IN STD_LOGIC := '0'; @@ -193,7 +195,8 @@ BEGIN -- controller of ddrctrl u_ddrctrl_controller : ENTITY work.ddrctrl_controller GENERIC MAP( - g_tech_ddr => g_tech_ddr + g_tech_ddr => g_tech_ddr, + g_stop_pos => g_stop_pos ) PORT MAP( clk => clk, diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd index 2332d8737e7e834d1d67c0c5bf5f41707992b454..7d596e9ade0dff10240c95a858bfd258f49bd6e3 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -27,18 +27,20 @@ -- https://support.astron.nl/confluence/display/SBe/VHDL+design+patterns+for+RTL+coding -- -LIBRARY IEEE, dp_lib, common_lib, tech_ddr_lib; +LIBRARY IEEE, dp_lib, common_lib, tech_ddr_lib, lofar2_ddrctrl_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE common_lib.common_pkg.ALL; USE tech_ddr_lib.tech_ddr_pkg.ALL; +USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL; ENTITY ddrctrl_controller IS GENERIC ( - g_tech_ddr : t_c_tech_ddr + g_tech_ddr : t_c_tech_ddr; + g_stop_pos : t_c_stop_pos ); PORT ( clk : IN STD_LOGIC; @@ -68,7 +70,7 @@ ARCHITECTURE rtl OF ddrctrl_controller IS CONSTANT c_zeros : STD_LOGIC_VECTOR(c_bitshift_adr-1 DOWNTO 0) := (OTHERS => '0'); -- type for statemachine - TYPE t_state IS (RESET, WRITING, STOP_WRITING, READING, STOP_READING, IDLE); + TYPE t_state IS (RESET, WRITING, SET_STOP, STOP_WRITING, READING, STOP_READING, IDLE); -- record for readability TYPE t_reg IS RECORD @@ -123,24 +125,60 @@ BEGIN ELSE v.dvr_mosi.burstbegin := '0'; END IF; - v.dvr_mosi.burstsize := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length); - v.dvr_mosi.wr := '1'; - v.dvr_mosi.rd := '0'; + v.dvr_mosi.burstsize := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length); + v.dvr_mosi.wr := '1'; + v.dvr_mosi.rd := '0'; + v.wr_sosi := out_sosi; - WHEN STOP_WRITING => - IF (out_adr + (c_max_adr / 2) >= c_max_adr) THEN - v.stop_adr := out_adr - (c_max_adr / 2); - ELSE - v.stop_adr := out_adr + (c_max_adr / 2); + WHEN SET_STOP => + --setting a stop address dependend on the g_stop_pos + IF g_stop_pos=START THEN + v.stop_adr := 0; + END IF; + + IF g_stop_pos=HALFWAY THEN + IF (out_adr + (c_max_adr / 2) >= c_max_adr) THEN + v.stop_adr := out_adr - (c_max_adr / 2); + ELSE + v.stop_adr := out_adr + (c_max_adr / 2); + END IF; + IF (stop_in = '1' AND out_adr = v.stop_adr) THEN + --stop_out <= '1'; + v.dvr_mosi.address := TO_UVEC(out_adr, dvr_mosi.address'length); + ELSE + --stop_out <= '0'; + END IF; + END IF; + + IF g_stop_pos=IMMIDIATE THEN + v.stop_adr := c_max_adr; END IF; - IF (stop_in = '1' AND out_adr = v.stop_adr) THEN - --stop_out <= '1'; - v.dvr_mosi.address := TO_UVEC(out_adr, dvr_mosi.address'length); + + + -- still a write cyle + IF TO_UVEC(out_adr, c_adr_w)(c_bitshift_adr-1 DOWNTO 0) = c_zeros THEN -- adr mod 64 = 0 + v.dvr_mosi.burstbegin := '1'; + IF out_adr = 0 THEN + v.dvr_mosi.address := TO_UVEC(c_max_adr-c_burstsize, dvr_mosi.address'length); + ELSE + v.dvr_mosi.address := TO_UVEC(out_adr-c_burstsize, dvr_mosi.address'length); + END IF; ELSE - --stop_out <= '0'; + v.dvr_mosi.burstbegin := '0'; END IF; + v.dvr_mosi.burstsize := TO_UVEC(c_burstsize, dvr_mosi.burstsize'length); + v.dvr_mosi.wr := '1'; + v.dvr_mosi.rd := '0'; + v.wr_sosi := out_sosi; + + + + WHEN STOP_WRITING => + v.stopped := '0'; + v.wr_sosi.valid := '0'; + -- enable flush @@ -154,16 +192,16 @@ BEGIN IF rst = '1' THEN v.state := RESET; ELSIF stop_in = '1' THEN - v.state := STOP_WRITING; + v.state := SET_STOP; ELSE v.state := WRITING; END IF; - d_reg <= v; + d_reg <= v; END PROCESS; -- fill outputs dvr_mosi <= q_reg.dvr_mosi; wr_sosi <= q_reg.wr_sosi; - rd_siso <= q_reg.rd_siso; + rd_siso <= q_reg.rd_siso; END rtl; diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd index 1c0f45653e7e0d4613a98d6b8509b6ab06c08d4a..c87511a955a1777cc2193d302262eec0b9c924c3 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd @@ -22,7 +22,7 @@ -- Usage: -- > run -a -LIBRARY IEEE, common_lib, technology_lib, tech_ddr_lib, dp_lib; +LIBRARY IEEE, common_lib, technology_lib, tech_ddr_lib, dp_lib, lofar2_ddrctrl_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; USE IEEE.MATH_REAL.ALL; @@ -32,6 +32,8 @@ USE dp_lib.dp_stream_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE common_lib.common_pkg.ALL; USE technology_lib.technology_select_pkg.ALL; +USE lofar2_ddrctrl_lib.ddrctrl_pkg.ALL; + ENTITY tb_ddrctrl IS GENERIC ( @@ -43,7 +45,8 @@ ENTITY tb_ddrctrl IS g_sim_length : NATURAL := 16500; -- close to the amount of word that gets put into the memory g_technology : NATURAL := c_tech_select_default; g_tech_ddr3 : t_c_tech_ddr := c_tech_ddr3_4g_800m_master; - g_tech_ddr4 : t_c_tech_ddr := c_tech_ddr4_4g_1600m + g_tech_ddr4 : t_c_tech_ddr := c_tech_ddr4_4g_1600m; + g_stop_pos : t_c_stop_pos := HALFWAY ); END tb_ddrctrl; @@ -161,7 +164,8 @@ BEGIN g_sim_model => g_sim_model, g_technology => g_technology, g_nof_streams => g_nof_streams, - g_data_w => g_data_w + g_data_w => g_data_w, + g_stop_pos => g_stop_pos ) PORT MAP ( clk => clk,