diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index 02708a7acb4f9dd1f7021786114d15b9d5e73557..f9d7419f6564895b29f0487983d5c53845c136cb 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -85,6 +85,7 @@ ARCHITECTURE str OF ddrctrl IS CONSTANT c_io_ddr_data_w : NATURAL := func_tech_ddr_ctlr_data_w( g_tech_ddr ); CONSTANT c_wr_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 and independent of wr burst size, default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K CONSTANT c_rd_fifo_depth : NATURAL := 256; -- defined at DDR side of the FIFO, >=16 AND > max number of rd burst sizes (so > c_rd_fifo_af_margin), default >= 256 because 32b*256 fits in 1 M9K so c_ctlr_data_w=256b will require 8 M9K + CONSTANT c_rd_fifo_uw_w : NATURAL := ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w)); -- signals for connecting the components SIGNAL ctrl_clk : STD_LOGIC; @@ -98,7 +99,7 @@ ARCHITECTURE str OF ddrctrl IS SIGNAL rd_siso : t_dp_siso := c_dp_siso_rst; SIGNAL rd_sosi : t_dp_sosi := c_dp_sosi_init; SIGNAL stop : STD_LOGIC; - SIGNAL rd_fifo_usedw: STD_LOGIC_VECTOR(ceil_log2(c_rd_fifo_depth*(func_tech_ddr_ctlr_data_w(g_tech_ddr)/c_io_ddr_data_w) )-1 DOWNTO 0); + SIGNAL rd_fifo_usedw: STD_LOGIC_VECTOR(c_rd_fifo_uw_w-1 DOWNTO 0); SIGNAL rd_ready : STD_LOGIC; SIGNAL inp_ds : NATURAL; SIGNAL inp_bsn : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); @@ -236,7 +237,8 @@ BEGIN g_out_data_w => g_data_w, g_wr_data_w => c_io_ddr_data_w, g_rd_fifo_depth => c_rd_fifo_depth, - g_rd_data_w => c_io_ddr_data_w + g_rd_data_w => c_io_ddr_data_w, + g_rd_fifo_uw_w => c_rd_fifo_uw_w ) 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 2da04e15bcee33174de1ef7a49fcfa75d3858e6b..106dbaf1f8fdc877eae1ce30799c56c734cfb901 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -44,7 +44,8 @@ ENTITY ddrctrl_controller IS g_out_data_w : NATURAL; g_wr_data_w : NATURAL; g_rd_fifo_depth : NATURAL; - g_rd_data_w : NATURAL + g_rd_data_w : NATURAL; + g_rd_fifo_uw_w : NATURAL ); PORT ( clk : IN STD_LOGIC; @@ -62,7 +63,7 @@ ENTITY ddrctrl_controller IS dvr_mosi : OUT t_mem_ctlr_mosi; dvr_miso : IN t_mem_ctlr_miso; wr_sosi : OUT t_dp_sosi; - rd_fifo_usedw : IN STD_LOGIC_VECTOR(ceil_log2(g_rd_fifo_depth * (func_tech_ddr_ctlr_data_w(g_tech_ddr)/g_rd_data_w) )-1 DOWNTO 0); + rd_fifo_usedw : IN STD_LOGIC_VECTOR(g_rd_fifo_uw_w-1 DOWNTO 0); -- ddrctrl_output outp_ds : OUT NATURAL; @@ -96,7 +97,7 @@ ARCHITECTURE rtl OF ddrctrl_controller IS -- state of program state : t_state; - -- stoppping signals + -- stopping signals stop_adr : STD_LOGIC_VECTOR(c_adr_w-1 DOWNTO 0); stopped : STD_LOGIC; @@ -131,22 +132,11 @@ BEGIN v := q_reg; + CASE q_reg.state IS WHEN RESET => v := c_t_reg_init; - IF rst = '1' THEN - v.state := RESET; - ELSIF stop_in = '1' THEN - v.state := SET_STOP; - ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN - v.state := STOP_WRITING; - ELSIF v.stopped = '1' THEN - v.state := IDLE; - ELSE - v.state := WRITING; - END IF; - WHEN WRITING => -- if adr mod c_burstsize = 0 @@ -167,20 +157,6 @@ BEGIN v.wr_sosi := inp_sosi; - - IF rst = '1' THEN - v.state := RESET; - ELSIF stop_in = '1' THEN - v.state := SET_STOP; - ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN - v.state := STOP_WRITING; - ELSIF v.stopped = '1' THEN - v.state := IDLE; - ELSE - v.state := WRITING; - END IF; - - WHEN SET_STOP => --setting a stop address dependend on the g_stop_percentage IF inp_adr+c_pof_ma >= c_max_adr THEN @@ -209,20 +185,6 @@ BEGIN v.wr_sosi := inp_sosi; - - IF rst = '1' THEN - v.state := RESET; - ELSIF stop_in = '1' THEN - v.state := SET_STOP; - ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN - v.state := STOP_WRITING; - ELSIF v.stopped = '1' THEN - v.state := IDLE; - ELSE - v.state := WRITING; - END IF; - - WHEN STOP_WRITING => v.dvr_mosi.burstbegin := '0'; -- wait until the write burst is finished @@ -236,11 +198,6 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - END IF; - - WHEN START_READING => v.rd_burst_en := '1'; v.dvr_mosi.wr := '0'; @@ -256,13 +213,7 @@ BEGIN END LOOP; v.outp_bsn := TO_UVEC(TO_UINT(inp_bsn)-((inp_bsn_adr+(c_max_adr-TO_UINT(q_reg.stop_adr)))*g_wr_data_w+v.outp_ds-inp_ds)/c_rd_data_w, c_dp_stream_bsn_w); -- WRONG, wil be fixed after L2SDP-705, 706, 707 and 708 - - - IF rst = '1' THEN - v.state := RESET; - ELSE - v.state := READING; - END IF; + v.state := READING; WHEN READING => @@ -285,9 +236,7 @@ BEGIN v.rd_burst_en := '1'; END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF q_reg.read_cnt >= c_max_read_cnt THEN + IF q_reg.read_cnt >= c_max_read_cnt THEN v.state := IDLE; ELSE v.state := READING; @@ -297,9 +246,17 @@ BEGIN WHEN IDLE => -- the statemachine goes to Idle when its finished or when its waiting on other components. - IF rst = '1' THEN - v.state := RESET; - ELSIF stop_in = '1' THEN + + + WHEN OTHERS => + v := c_t_reg_init; + + + END CASE; + + + IF q_reg.state = RESET OR q_reg.state = WRITING OR q_reg.state = SET_STOP OR q_reg.state = IDLE THEN + IF stop_in = '1' THEN v.state := SET_STOP; ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN v.state := STOP_WRITING; @@ -308,30 +265,13 @@ BEGIN ELSE v.state := WRITING; END IF; - - - WHEN OTHERS => - v := c_t_reg_init; - + END IF; IF rst = '1' THEN v.state := RESET; - ELSIF stop_in = '1' THEN - v.state := SET_STOP; - ELSIF v.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND v.stop_adr(c_bitshift_adr-1 DOWNTO 0) = c_zeros(c_bitshift_adr-1 DOWNTO 0) AND q_reg.stopped = '0' THEN - v.state := STOP_WRITING; - ELSIF v.stopped = '1' THEN - v.state := IDLE; - ELSE - v.state := WRITING; END IF; - - END CASE; - - - d_reg <= v; END PROCESS; diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd index 1f117a6c5f867ddbda6979fc6dfc18f017ff9e42..fb711ef3da9abacde5ab36cbff84d63468988e8f 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd @@ -108,9 +108,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN v.state := OVER_HALF; ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN v.state := IDLE; @@ -138,9 +136,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN v.state := OVER_HALF; ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN v.state := IDLE; @@ -166,9 +162,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF v.dd_fresh = '1' THEN + IF v.dd_fresh = '1' THEN v.state := SECOND_READ; ELSE v.state := IDLE; @@ -191,9 +185,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' THEN v.state := OVER_HALF; ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '0' THEN v.state := IDLE; @@ -209,14 +201,9 @@ BEGIN v.delay_data(g_in_data_w-1 DOWNTO 0) := in_sosi.data(g_in_data_w-1 DOWNTO 0); v.dd_fresh := '1'; END IF; + v.state := OFF; - IF rst = '1' THEN - v.state := RESET; - ELSE - v.state := OFF; - END IF; - WHEN IDLE => -- the statemachine goes to Idle when its finished or when its waiting on other components. v.out_ready := '1'; @@ -228,9 +215,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '1' THEN + IF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '1' THEN v.state := OVER_HALF; ELSIF (g_out_data_w*(v.op_data_cnt+1))+q_reg.a_of >= g_in_data_w AND v.dd_fresh = '1' AND q_reg.sr_done = '0' THEN v.state := SECOND_READ; @@ -251,9 +236,7 @@ BEGIN END IF; - IF rst = '1' THEN - v.state := RESET; - ELSIF in_sosi.valid = '1' THEN + IF in_sosi.valid = '1' THEN v.state := FIRST_READ; ELSE v.state := OFF; @@ -263,6 +246,9 @@ BEGIN END CASE; + IF rst = '1' THEN + v.state := RESET; + END IF; d_reg <= v; END PROCESS;