diff --git a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd index 7d99c30ffe38520e825003d451de507df76c67c4..2d5beb5ba89c349ce176991d7a77e2bdcdb0e488 100644 --- a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd +++ b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd @@ -182,10 +182,10 @@ BEGIN CASE state IS WHEN s_wr_burst => -- Performs the rest of burst when burst_size > 1 - IF ctlr_miso.waitrequest_n = '1' THEN - IF wr_snk_in.valid = '1' THEN -- it is allowed that valid is not always active during a burst + IF wr_snk_in.valid = '1' THEN -- it is allowed that valid is not always active during a burst + ctlr_mosi.wr <= '1'; + IF ctlr_miso.waitrequest_n = '1' THEN wr_snk_out.ready <= '1'; -- wr side uses latency of 0, so wr_snk_out.ready<='1' acknowledges a successful write request. - ctlr_mosi.wr <= '1'; nxt_burst_wr_cnt <= burst_wr_cnt-1; IF burst_wr_cnt = 1 THEN -- check for the last cycle of this burst sequence nxt_state <= s_wr_request; -- initiate a new wr burst or goto idle via the wr_request state, simulation shows going directly idle by checking address_cnt_is_0 here does not save a cycle @@ -197,12 +197,12 @@ BEGIN IF address_cnt_is_0 = '1' THEN -- end address reached nxt_dvr_done <= '1'; nxt_state <= s_idle; - ELSIF ctlr_miso.waitrequest_n = '1' THEN - IF wr_snk_in.valid = '1' THEN + ELSIF wr_snk_in.valid = '1' THEN + ctlr_mosi.wr <= '1'; + ctlr_mosi.burstbegin <= '1'; -- assert burstbegin, + IF ctlr_miso.waitrequest_n = '1' THEN -- Always perform 1st write here wr_snk_out.ready <= '1'; - ctlr_mosi.wr <= '1'; - ctlr_mosi.burstbegin <= '1'; -- assert burstbegin, nxt_cur_address <= INCR_UVEC(cur_address, burst_size); nxt_address_cnt <= INCR_UVEC(address_cnt, -burst_size); nxt_burst_wr_cnt <= burst_size-1; @@ -218,10 +218,10 @@ BEGIN IF address_cnt_is_0 = '1' THEN -- end address reached nxt_dvr_done <= '1'; nxt_state <= s_idle; - ELSIF ctlr_miso.waitrequest_n = '1' THEN - IF rd_src_in.ready = '1' THEN -- the external FIFO uses almost full level assert its snk_out.ready and can then still accept the maximum rd burst of words - ctlr_mosi.rd <= '1'; - ctlr_mosi.burstbegin <= '1'; -- assert burstbegin, + ELSIF rd_src_in.ready = '1' THEN -- the external FIFO uses almost full level assert its snk_out.ready and can then still accept the maximum rd burst of words + ctlr_mosi.rd <= '1'; + ctlr_mosi.burstbegin <= '1'; -- assert burstbegin, + IF ctlr_miso.waitrequest_n = '1' THEN nxt_cur_address <= INCR_UVEC(cur_address, burst_size); nxt_address_cnt <= INCR_UVEC(address_cnt, -burst_size); -- Return for next rd request