diff --git a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd index dcebc6288bd85298d199de6da70e72779bedf1ac..c8e3d4e667ff1a49202863cf048f982bb954f2f3 100644 --- a/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd +++ b/libraries/base/dp/src/vhdl/dp_fifo_fill_eop.vhd @@ -122,7 +122,7 @@ ARCHITECTURE rtl OF dp_fifo_fill_eop IS SIGNAL received_eop : BOOLEAN := FALSE; SIGNAL nxt_received_eop : BOOLEAN := FALSE; - + SIGNAL crossed_domain_snk_in_eop : STD_LOGIC := '0'; BEGIN -- Output monitor FIFO filling @@ -136,6 +136,7 @@ BEGIN rd_fill_ctrl <= rd_fill_32b(c_fifo_size_w-1 DOWNTO 0); gen_dp_fifo_sc : IF g_use_dual_clock=FALSE GENERATE + crossed_domain_snk_in_eop <= snk_in.eop; u_dp_fifo_sc : ENTITY work.dp_fifo_sc GENERIC MAP ( g_technology => g_technology, @@ -173,7 +174,17 @@ BEGIN wr_fifo_usedw <= rd_fifo_usedw; END GENERATE; - gen_dp_fifo_dc : IF g_use_dual_clock=TRUE GENERATE + gen_dp_fifo_dc : IF g_use_dual_clock=TRUE GENERATE + u_common_spulse : ENTITY common_lib.common_spulse + PORT MAP ( + in_rst => wr_rst, + in_clk => wr_clk, + in_pulse => snk_in.eop, + out_rst => rd_rst, + out_clk => rd_clk, + out_pulse => crossed_domain_snk_in_eop + ); + u_dp_fifo_dc : ENTITY work.dp_fifo_dc GENERIC MAP ( g_technology => g_technology, @@ -218,7 +229,7 @@ BEGIN END GENERATE; -- no_fill gen_fill : IF g_fifo_fill>0 GENERATE - + src_out <= i_src_out; p_rd_clk: PROCESS(rd_clk, rd_rst) @@ -232,7 +243,11 @@ BEGIN xon_reg <= nxt_xon_reg; state <= nxt_state; i_src_out <= nxt_src_out; - received_eop <= nxt_received_eop; + IF crossed_domain_snk_in_eop = '1' THEN + received_eop <= TRUE; + ELSE + received_eop <= nxt_received_eop; + END IF; END IF; END PROCESS; @@ -242,7 +257,7 @@ BEGIN p_state : PROCESS(state, rd_sosi, src_in, xon_reg, rd_fifo_usedw, rd_fill_ctrl, received_eop) BEGIN nxt_state <= state; - + nxt_received_eop <= received_eop; rd_siso <= src_in; -- default acknowledge (RL=1) this input when output is ready -- The output register stage increase RL=0 to 1, so it matches RL = 1 for src_in.ready @@ -252,12 +267,6 @@ BEGIN nxt_src_out.eop <= '0'; nxt_src_out.sync <= '0'; - IF snk_in.eop = '1' THEN - nxt_received_eop <= TRUE; - ELSE - nxt_received_eop <= received_eop; - END IF; - CASE state IS WHEN s_idle => IF xon_reg='0' THEN @@ -302,7 +311,7 @@ BEGIN nxt_state <= s_idle; END IF; END CASE; - + -- Pass on frame level flow control rd_siso.xon <= src_in.xon; END PROCESS; @@ -329,7 +338,8 @@ BEGIN p_state : PROCESS(state, src_in, xon_reg, pend_src_out, rd_fifo_usedw, rd_fill_ctrl, received_eop) BEGIN nxt_state <= state; - + nxt_received_eop <= received_eop; + hold_src_in <= src_in; -- default request (RL=1) new input when output is ready -- The output register stage matches RL = 1 for src_in.ready @@ -338,12 +348,6 @@ BEGIN nxt_src_out.sop <= '0'; nxt_src_out.eop <= '0'; nxt_src_out.sync <= '0'; - - IF snk_in.eop = '1' THEN - nxt_received_eop <= TRUE; - ELSE - nxt_received_eop <= received_eop; - END IF; CASE state IS WHEN s_idle => @@ -389,7 +393,7 @@ BEGIN nxt_state <= s_idle; END IF; END CASE; - + -- Pass on frame level flow control hold_src_in.xon <= src_in.xon; END PROCESS;