snk_out<=src_in;-- Pass on the flow control by default
CASEstateIS
WHENs_wait_for_val=>-- Wait for valid data to come in
IFsnk_in.valid='1'THEN
nxt_clk_cnt<=TO_UVEC(1,c_dat_len_w);
nxt_gap_cnt<=(OTHERS=>'0');
nxt_state<=s_counting;
ENDIF;
WHENs_counting=>-- Start counting cycles
nxt_clk_cnt<=INCR_UVEC(clk_cnt,1);
IFclk_cnt=TO_UVEC(g_dat_len-1,c_dat_len_w)THEN-- time to force a gap
nxt_state<=s_force_not_rdy;
snk_out.ready<='0';
nxt_clk_cnt<=TO_UVEC(1,c_dat_len_w);-- we already have 1 clk cycle with ready='0' here
ENDIF;
IFsnk_in.valid='0'THEN-- Also start counting any invalid cycles
IFg_gap_extend=TRUETHEN
snk_out.ready<='0';-- Keep ready de-asserted. Gap_cnt will increment so it will be released again after g_gap_len.
ENDIF;
nxt_gap_cnt<=INCR_UVEC(gap_cnt,1);
ELSE
nxt_gap_cnt<=(OTHERS=>'0');
ENDIF;
IFgap_cnt=TO_UVEC(g_gap_len-1,c_gap_len_w)ANDsnk_in.valid='0'THEN-- A gap of sufficient length occured by itself (or valid='0' was extended); no need to force gap
-- We've counted g_gap_len-1, plus the current gap cycle = g_gap_len
nxt_gap_cnt<=(OTHERS=>'0');
nxt_clk_cnt<=(OTHERS=>'0');
nxt_state<=s_wait_for_val;
IFg_gap_extend=TRUETHEN
snk_out.ready<=src_in.ready;-- Release the ready signal again if it was forced down because of gap extension
ENDIF;
ENDIF;
WHENs_force_not_rdy=>-- Force snk_out.ready to '0' for g_gap_len clk cycles