diff --git a/libraries/base/dp/src/vhdl/dp_block_gen_valid_arr.vhd b/libraries/base/dp/src/vhdl/dp_block_gen_valid_arr.vhd index d2594f5b38e62f2620cf267b98aaaa5eaba3301e..a8ae4ed7218200ae0ee7c6b16fe29567a8aa75f2 100644 --- a/libraries/base/dp/src/vhdl/dp_block_gen_valid_arr.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_gen_valid_arr.vhd @@ -30,10 +30,10 @@ -- When enabled (enable='1') then a block of g_nof_data_per_block words is -- output via src_out_arr under flow control by the input valid. -- --- The input sync, sop and eop are ignored. For the output the sync, sop and +-- The input sop and eop are ignored. For the output the sync, sop and -- eop are generated by counting the input valid and using -- g_nof_data_per_block for the output sop and eop, and using --- g_nof_blk_per_sync for the output sync. +-- g_nof_blk_per_sync and the input sync for the output sync. -- -- The first active input valid starts the dp_block_gen_valid_arr. The first -- output block will have an output sync and every g_nof_blk_per_sync there @@ -136,6 +136,9 @@ -- . Using g_check_input_sync=True is similar to using a dp_sync_checker in -- front of this dp_block_gen_valid_arr. However the advantage of -- dp_sync_checker is that it provides monitoring and control via MM. +-- . If snk_in.sync is always '0', sync out is generated at g_nof_blk_per_sync. +-- Otherwise, the output sync is also derived from snk_in.sync to allow for +-- a fractional amount of blocks per sync period. LIBRARY IEEE, common_lib; USE IEEE.STD_LOGIC_1164.ALL; @@ -147,7 +150,7 @@ ENTITY dp_block_gen_valid_arr IS GENERIC ( g_nof_streams : POSITIVE := 1; g_nof_data_per_block : POSITIVE := 1; - g_nof_blk_per_sync : POSITIVE := 8; + g_nof_blk_per_sync : POSITIVE := 8; -- Maximum nof blocks per sync period, e.g 7.3 becomes 8. g_check_input_sync : BOOLEAN := FALSE; g_nof_pages_bsn : NATURAL := 0; g_restore_global_bsn : BOOLEAN := FALSE @@ -271,12 +274,14 @@ BEGIN -- maintain blk_cnt for output sync interval, the blk_cnt is the local bsn that wraps at every sync IF r.blk_cnt>=g_nof_blk_per_sync-1 THEN nxt_r.blk_cnt <= 0; + ELSIF snk_in.sync = '1' THEN + nxt_r.blk_cnt <= 1; ELSE nxt_r.blk_cnt <= r.blk_cnt+1; END IF; -- create local sync and pass on input bsn at local sync - IF r.blk_cnt=0 THEN -- output sync starts at first input valid + IF r.blk_cnt=0 OR snk_in.sync = '1' THEN -- output sync starts at first input valid nxt_r.reg_sosi.sync <= '1'; -- output sync for this block nxt_r.reg_sosi.bsn <= in_sosi.bsn; -- output input bsn at sync ELSE