From c2e7f0e8ea997b4528ed2461f4270aa5a38f3617 Mon Sep 17 00:00:00 2001 From: Erik Kooistra <kooistra@astron.nl> Date: Thu, 8 Jan 2015 06:39:26 +0000 Subject: [PATCH] Clarified flushing mixed width FIFO. --- .../ddr/src/vhdl/io_ddr_driver_flush_ctrl.vhd | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libraries/io/ddr/src/vhdl/io_ddr_driver_flush_ctrl.vhd b/libraries/io/ddr/src/vhdl/io_ddr_driver_flush_ctrl.vhd index b2a84cb351..159b017dd3 100644 --- a/libraries/io/ddr/src/vhdl/io_ddr_driver_flush_ctrl.vhd +++ b/libraries/io/ddr/src/vhdl/io_ddr_driver_flush_ctrl.vhd @@ -32,6 +32,14 @@ -- . g_mode = "SYN" : start filling on next sync -- -- . g_use_channel = TRUE : start filling when channel matches g_start_channel +-- +-- Remarks: +-- . The flushing does ensure that the write FIFO does not run full. If the +-- write input FIFO is a mixed width FIFO with narrow write data, then it +-- may not be possible to read the FIFO empty, because a wide data word +-- can only be read when it is complete. Typically this behaviour is fine +-- in applications, so no need to try to somehow flush an incomplete last +-- wide word from the FIFO. LIBRARY IEEE, common_lib, dp_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -55,7 +63,7 @@ ENTITY io_ddr_driver_flush_ctrl IS dvr_wr_flush_en : IN STD_LOGIC := '1'; dvr_wr_not_rd : IN STD_LOGIC; - wr_sosi : IN t_dp_sosi; + ctlr_wr_sosi : IN t_dp_sosi; ctlr_wr_flush_en : OUT STD_LOGIC ); @@ -79,17 +87,17 @@ BEGIN -- Flush disable control no_channel: IF g_use_channel=FALSE GENERATE - gen_valid : IF g_mode="VAL" GENERATE flush_dis <= wr_sosi.valid; END GENERATE; - gen_sop : IF g_mode="SOP" GENERATE flush_dis <= wr_sosi.sop ; END GENERATE; - gen_sync : IF g_mode="SYN" GENERATE flush_dis <= wr_sosi.sync ; END GENERATE; + gen_valid : IF g_mode="VAL" GENERATE flush_dis <= ctlr_wr_sosi.valid; END GENERATE; + gen_sop : IF g_mode="SOP" GENERATE flush_dis <= ctlr_wr_sosi.sop ; END GENERATE; + gen_sync : IF g_mode="SYN" GENERATE flush_dis <= ctlr_wr_sosi.sync ; END GENERATE; END GENERATE; use_channel: IF g_use_channel=TRUE GENERATE - channel <= TO_UINT(wr_sosi.channel(c_channel_w-1 DOWNTO 0)); + channel <= TO_UINT(ctlr_wr_sosi.channel(c_channel_w-1 DOWNTO 0)); - gen_valid : IF g_mode="VAL" GENERATE flush_dis <= '1' WHEN wr_sosi.valid='1' AND channel=g_start_channel ELSE '0'; END GENERATE; - gen_sop : IF g_mode="SOP" GENERATE flush_dis <= '1' WHEN wr_sosi.sop ='1' AND channel=g_start_channel ELSE '0'; END GENERATE; - gen_sync : IF g_mode="SYN" GENERATE flush_dis <= '1' WHEN wr_sosi.sync ='1' AND channel=g_start_channel ELSE '0'; END GENERATE; + gen_valid : IF g_mode="VAL" GENERATE flush_dis <= '1' WHEN ctlr_wr_sosi.valid='1' AND channel=g_start_channel ELSE '0'; END GENERATE; + gen_sop : IF g_mode="SOP" GENERATE flush_dis <= '1' WHEN ctlr_wr_sosi.sop ='1' AND channel=g_start_channel ELSE '0'; END GENERATE; + gen_sync : IF g_mode="SYN" GENERATE flush_dis <= '1' WHEN ctlr_wr_sosi.sync ='1' AND channel=g_start_channel ELSE '0'; END GENERATE; END GENERATE; p_reg : PROCESS(rst, clk) -- GitLab