diff --git a/libraries/base/dp/src/vhdl/dp_bsn_sync_scheduler.vhd b/libraries/base/dp/src/vhdl/dp_bsn_sync_scheduler.vhd index f9081f32ad448919e2aa767fe712a6d058150cd9..64242905331882b1fa4f1aa503c986be8acbe48d 100644 --- a/libraries/base/dp/src/vhdl/dp_bsn_sync_scheduler.vhd +++ b/libraries/base/dp/src/vhdl/dp_bsn_sync_scheduler.vhd @@ -102,7 +102,7 @@ USE work.dp_stream_pkg.ALL; ENTITY dp_bsn_sync_scheduler IS GENERIC ( g_bsn_w : NATURAL := c_dp_stream_bsn_w; - g_block_size : NATURAL := 256; -- = number of data valid per BSN block + g_block_size : NATURAL := 256; -- = number of data valid per BSN block, must be >= 2 g_pipeline : NATURAL := 1 -- use '1' on HW, use '0' for easier debugging in Wave window ); PORT ( @@ -140,8 +140,8 @@ ARCHITECTURE rtl OF dp_bsn_sync_scheduler IS nof_blk_min : NATURAL; nof_blk_max : NATURAL; nof_blk : NATURAL; - extra : INTEGER;-- RANGE -g_block_size TO g_block_size; - accumulate : INTEGER;-- RANGE -g_block_size TO g_block_size; + extra : NATURAL RANGE 0 TO g_block_size; + accumulate : NATURAL RANGE 0 TO g_block_size*2; hold_eop : STD_LOGIC; update_bsn : STD_LOGIC; output_enable : STD_LOGIC; @@ -160,6 +160,8 @@ ARCHITECTURE rtl OF dp_bsn_sync_scheduler IS BEGIN + ASSERT g_block_size >= 2 REPORT "g_block_size must be >= 2." SEVERITY FAILURE; + -- Capture monitoring info mon_input_current_bsn <= in_sosi.bsn(g_bsn_w-1 DOWNTO 0) WHEN rising_edge(clk) AND in_sosi.sop = '1'; mon_input_bsn_at_sync <= in_sosi.bsn(g_bsn_w-1 DOWNTO 0) WHEN rising_edge(clk) AND in_sosi.sync = '1'; @@ -225,11 +227,20 @@ BEGIN v.blk_cnt := 0; END IF; - -- If ctrl_enable is still active after initialization then continue with enable + -- Enable / disable control IF ctrl_enable = '0' THEN - v.enable := '0'; + v.enable := '0'; -- disable when ctrl_enable requests disable + ELSIF ctrl_enable_evt = '1' THEN + v.enable := '0'; -- disable when ctrl_enable requests re-enable ELSIF r.enable_init = '0' THEN - v.enable := '1'; + IF r.hold_eop = '1' THEN + -- enable after in_sosi.eop, so that r.enable has caused + -- v.output_enable = '0', to ensure that a re-enable starts + -- with the nof_blk_max sync interval. Otherwise + -- v.output_enable = '1' can cause that re-enable can restart + -- with the nof_blk_min sync interval + v.enable := '1'; + END IF; END IF; -- Hold input eop to detect when input has finished a block and to detect