From 97aa595cd3b03dc016e3b2cd29a4f24d46aa9859 Mon Sep 17 00:00:00 2001 From: JobvanWee <wee@astron.nl> Date: Tue, 26 Apr 2022 10:25:19 +0200 Subject: [PATCH] Reading in whole bocks, Ready for review. --- .../ddrctrl/src/vhdl/ddrctrl_controller.vhd | 26 +++++++++---------- .../src/vhdl/ddrctrl_output_unpack.vhd | 4 +-- .../libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd index 4c837e3f52..8a91295a14 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_controller.vhd @@ -134,7 +134,6 @@ ARCHITECTURE rtl OF ddrctrl_controller IS SIGNAL d_reg : t_reg := c_t_reg_init; SIGNAL q_reg : t_reg := c_t_reg_init; - SIGNAL s_bim : NATURAL := g_bim; BEGIN @@ -175,6 +174,7 @@ BEGIN WHEN START_WRITING => + -- this state generates the first write burst. IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND v.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w); v.dvr_mosi.wr := '1'; @@ -191,8 +191,7 @@ BEGIN WHEN WRITING => - -- if adr mod g_burstsize = 0 - -- this makes sure that only ones every 64 writes a writeburst is started. + -- this state generates the rest of the write bursts, it also checks if there is a stop signal or if it needs to stop writing. IF TO_UINT(wr_fifo_usedw) > g_burstsize AND dvr_miso.done = '1' AND q_reg.wr_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN v.dvr_mosi.burstbegin := '1'; v.wr_burst_en := '0'; @@ -228,7 +227,7 @@ BEGIN WHEN SET_STOP => - --setting a stop address dependend on the g_stop_percentage + -- this state sets a stop address dependend on the g_stop_percentage. IF inp_adr+c_pof_ma >= g_max_adr THEN v.stop_adr(c_adr_w-1 DOWNTO 0) := TO_UVEC(inp_adr-c_pof_ma, c_adr_w)(c_adr_w-1 DOWNTO 0); ELSE @@ -271,9 +270,11 @@ BEGIN WHEN STOP_WRITING => + -- this state stops the writing by generatign one last whole write burst which almost empties wr_fifo. v.wr_sosi.valid := '0'; v.dvr_mosi.burstbegin := '0'; v.stopped := '1'; + v.stop_adr := TO_UVEC(g_max_adr, c_adr_w); -- wait until the write burst is finished IF inp_data_stopped = '0' THEN v.state := STOP_WRITING; @@ -309,7 +310,7 @@ BEGIN WHEN LAST_WRITE_BURST => - + -- this state stops the writing by generatign one last write burst which empties wr_fifo. IF dvr_miso.done = '1' THEN v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0); @@ -326,17 +327,18 @@ BEGIN WHEN START_READING => + -- this state generates the first read burst, the size of this burst is dependend on the size of the last write burst. v.dvr_mosi.burstbegin := '0'; v.outp_bsn := TO_UVEC(TO_UINT(inp_sosi.bsn)-g_bim, c_dp_stream_bsn_w); IF dvr_miso.done = '1' AND v.rd_burst_en = '1' AND q_reg.dvr_mosi.burstbegin = '0' THEN - v.dvr_mosi.burstbegin := '1'; + v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.burstsize(dvr_mosi.burstsize'length-1 DOWNTO 0) := TO_UVEC(g_burstsize-q_reg.stop_burstsize, dvr_mosi.burstsize'length); - v.dvr_mosi.wr := '0'; - v.dvr_mosi.rd := '1'; + v.dvr_mosi.wr := '0'; + v.dvr_mosi.rd := '1'; v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := TO_UVEC(TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+q_reg.stop_burstsize, c_adr_w); - v.rd_burst_en := '0'; - v.read_adr := TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+g_burstsize; + v.rd_burst_en := '0'; + v.read_adr := TO_UINT(q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0))+g_burstsize; END IF; -- makes sure the fifo is filled before asking for another rd request. to prevent 4 rd burst to happend directly after one another. @@ -383,7 +385,7 @@ BEGIN WHEN STOP_READING => - + -- this is the last read burst, this make sure every data containing word in the memory has been read. IF TO_UINT(rd_fifo_usedw) <= g_burstsize AND dvr_miso.done = '1' AND q_reg.rd_burst_en = '1' THEN v.dvr_mosi.burstbegin := '1'; v.dvr_mosi.address(c_adr_w-1 DOWNTO 0) := q_reg.last_adr_to_write_to(c_adr_w-1 DOWNTO 0); @@ -426,8 +428,6 @@ BEGIN v.state := SET_STOP; ELSIF q_reg.stop_adr = TO_UVEC(inp_adr, c_adr_w) AND q_reg.stopped = '0' THEN v.state := STOP_WRITING; - --ELSIF v.stopped = '0' AND inp_sosi.sop = '1' AND q_reg.started = '1' THEN - --v.state := START_WRITING; ELSIF v.stopped = '0' AND inp_sosi.valid = '1' AND q_reg.started = '1' THEN v.state := WRITING; ELSIF q_reg.stopped = '1' THEN 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 e412655b39..5f92f62557 100644 --- a/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd +++ b/applications/lofar2/libraries/ddrctrl/src/vhdl/ddrctrl_output_unpack.vhd @@ -212,7 +212,7 @@ BEGIN WHEN FIRST_READ => - -- fills the first half of c_v and generates a output from it. + -- fills the first half of c_v and generates output from it. v.out_ready := '0'; v.c_v(c_v_w-1 DOWNTO 0) := (OTHERS => '0'); v.c_v(g_in_data_w-1 DOWNTO 0) := q_reg.delay_data(g_in_data_w-1 DOWNTO 0); @@ -240,8 +240,8 @@ BEGIN v.state := READING; WHEN BSN => + -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added also increases the bsn output v.out_sosi.valid := '0'; - -- generating output data from c_v but past the halfway point of c_v so there needs to be new data added IF q_reg.dd_fresh = '1' AND q_reg.valid_data = '1' THEN -- generate output from the middle of c_v v.out_sosi.data(g_out_data_w-1 DOWNTO 0) := q_reg.c_v((g_out_data_w*(q_reg.op_data_cnt+1))+q_reg.a_of-1 DOWNTO (g_out_data_w*q_reg.op_data_cnt)+q_reg.a_of); diff --git a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd index 0222a38227..881d039d0b 100644 --- a/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd +++ b/applications/lofar2/libraries/ddrctrl/tb/vhdl/tb_ddrctrl.vhd @@ -179,7 +179,7 @@ BEGIN -- wr fifo has delay of 4 clockcylces after reset -- filling the input data vectors with the corresponding numbers - run_multiple_times : FOR K in 0 TO 2 LOOP + run_multiple_times : FOR K in 0 TO 3 LOOP make_data : FOR J IN 0 TO c_bim*g_block_size-1 LOOP in_data_cnt <= in_data_cnt+1; fill_in_sosi_arr : FOR I IN 0 TO g_nof_streams-1 LOOP -- GitLab