diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd index 1938a563ddabd52f07caf86b92aea2801ab6b6cc..0c520a2e3185c5ab0facff2aa270f418e624ba7c 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl.vhd @@ -86,6 +86,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; @@ -99,7 +100,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); @@ -239,7 +240,11 @@ BEGIN 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, +<<<<<<< HEAD g_block_size => g_block_size +======= + g_rd_fifo_uw_w => c_rd_fifo_uw_w +>>>>>>> L2SDP-704 ) 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 a5e5acfbd1ded237123b95eaf8982c498156cb5e..8997d60756d42e26ea918a7138d19c6f09ae6dc0 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -45,7 +45,8 @@ ENTITY ddrctrl_controller IS g_wr_data_w : NATURAL; g_rd_fifo_depth : NATURAL; g_rd_data_w : NATURAL; - g_block_size : NATURAL + g_block_size : NATURAL; + g_rd_fifo_uw_w : NATURAL ); PORT ( clk : IN STD_LOGIC; @@ -63,7 +64,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; @@ -97,7 +98,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; @@ -132,22 +133,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 @@ -168,20 +158,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 @@ -210,20 +186,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 @@ -237,11 +199,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'; @@ -255,15 +212,8 @@ BEGIN v.outp_ds := v.outp_ds-c_rest; END IF; END LOOP; - v.outp_bsn := TO_UVEC(TO_UINT(inp_bsn), 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 => @@ -286,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; @@ -298,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; @@ -309,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 2ce54ce663b334185e329d0bffcd609f9e2c5ef6..e9d65b74cac157e2fd16745315559fe73c76d7bc 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd @@ -115,9 +115,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; @@ -150,9 +148,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; @@ -178,9 +174,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; @@ -203,9 +197,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; @@ -221,14 +213,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'; @@ -240,9 +227,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; @@ -263,9 +248,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; @@ -275,6 +258,9 @@ BEGIN END CASE; + IF rst = '1' THEN + v.state := RESET; + END IF; d_reg <= v; END PROCESS;