diff --git a/libraries/base/diag/src/vhdl/diag_block_gen.vhd b/libraries/base/diag/src/vhdl/diag_block_gen.vhd
index 4d2eba2edcbdbb338bc59bc796acc6342adc7633..1956204af9265c2562b5343127229da3dbc8b9b7 100644
--- a/libraries/base/diag/src/vhdl/diag_block_gen.vhd
+++ b/libraries/base/diag/src/vhdl/diag_block_gen.vhd
@@ -19,6 +19,46 @@
 --
 -------------------------------------------------------------------------------
 
+-- Purpose: Block generator repeating a data pattern
+-- Description:
+--   The data pattern is read via the buf_* MM interface. The output data
+--   block is controlled via ctrl of type t_diag_block_gen with fields:
+--
+--     enable             : sl  -- block enable immediately
+--     enable_sync        : sl  -- block enable at next en_sync pulse
+--     samples_per_packet : slv -- number of valid per block, from sop to eop
+--     blocks_per_sync    : slv -- number of blocks per sync interval
+--     gapsize            : slv -- number of clk cycles between blocks, so
+--                                 between last eop and next sop
+--     mem_low_adrs       : slv -- block start address at MM interface
+--     mem_high_adrs      : slv -- end address at MM interface
+--     bsn_init           : slv -- BSN of first output block
+--                                          
+--   The MM reading starts at mem_low_adrs when the BG is first enabled. If
+--   the mem_high_adrs-mem_low_adrs+1 < samples_per_packet then the reading
+--   wraps and continues from mem_low_adrs. For every new block the reading
+--   continues where it left in the previous block. This MM reading scheme
+--   allows using a periodic data pattern that can extends accross blocks and
+--   sync intervals, because is continues for as long as the BG remains
+--   enabled.
+--
+--   The input en_sync can be used as trigger to start multiple BG at the same
+--   clk cycle. The BG creates a out_sosi.sync at the first sop and the sop of
+--   every blocks_per_sync.
+--
+--   The current block is finished properly after enable gows low, to ensure 
+--   that all blocks have the same length. A new ctrl is accepted after a
+--   current block has finished, to ensure that no fractional blocks will 
+--   enter the stream.
+--
+--   The BG supports block flow control via out_siso.xon. The BG also supports
+--   sample flow control via out_siso.ready.
+--
+--   The read data is resized and output as unsigned via:
+--   . out_sosi.data(g_buf_dat_w-1:0).
+--   The read data is also output as complex data via:
+--   . out_sosi.im(g_buf_dat_w  -1:g_buf_dat_w/2)
+--   . out_sosi.re(g_buf_dat_w/2-1:            0)
 
 library IEEE, common_lib, dp_lib;
 use IEEE.STD_LOGIC_1164.ALL;
@@ -132,47 +172,51 @@ begin
           end if;
           
         when s_block =>
-          v.rd_ena := '1';
-          if r.samples_cnt = 0 and r.blocks_cnt = 0 then 
-            v.pls_sync    := '1';                      -- Always start with a pulse sync          
-            v.blk_sync    := '1';
-            v.sop         := '1';
-            v.samples_cnt := v.samples_cnt + 1; 
-          elsif r.samples_cnt = 0 then
-            v.sop         := '1';
-            v.samples_cnt := v.samples_cnt + 1; 
-          elsif r.samples_cnt >= v_samples_per_packet-1 and v_gapsize = 0 and r.blocks_cnt >= v_blocks_per_sync-1 then 
-            v.eop         := '1'; 
-            v.ctrl_reg    := ctrl;      -- accept new control settings at end of block when gapsize=0
-            v.samples_cnt := 0; 
-            v.blocks_cnt  := 0;
-          elsif r.samples_cnt >= v_samples_per_packet-1 and v_gapsize = 0 then 
-            v.eop         := '1'; 
-            v.ctrl_reg    := ctrl;      -- accept new control settings at end of block when gapsize=0
-            v.samples_cnt := 0; 
-            v.blocks_cnt  := r.blocks_cnt + 1;
-          elsif r.samples_cnt >= v_samples_per_packet-1 then 
-            v.eop         := '1'; 
-            v.samples_cnt := 0; 
-            v.rd_ena      := '0';
-            v.state       := s_gap;
-          else 
-            v.samples_cnt := r.samples_cnt + 1;
-          end if;
-          v.valid  := '1';
+          if out_siso.ready='1' then
           
-          if r.mem_cnt >= v_mem_high_adrs then 
-            v.mem_cnt := v_mem_low_adrs;
-          else
-            v.mem_cnt := r.mem_cnt + 1;
-          end if; 
+            v.rd_ena := '1';  -- read next data
+            if r.samples_cnt = 0 and r.blocks_cnt = 0 then 
+              v.pls_sync    := '1';                      -- Always start with a pulse sync          
+              v.blk_sync    := '1';
+              v.sop         := '1';
+              v.samples_cnt := v.samples_cnt + 1; 
+            elsif r.samples_cnt = 0 then
+              v.sop         := '1';
+              v.samples_cnt := v.samples_cnt + 1; 
+            elsif r.samples_cnt >= v_samples_per_packet-1 and v_gapsize = 0 and r.blocks_cnt >= v_blocks_per_sync-1 then 
+              v.eop         := '1'; 
+              v.ctrl_reg    := ctrl;      -- accept new control settings at end of block when gapsize=0
+              v.samples_cnt := 0; 
+              v.blocks_cnt  := 0;
+            elsif r.samples_cnt >= v_samples_per_packet-1 and v_gapsize = 0 then 
+              v.eop         := '1'; 
+              v.ctrl_reg    := ctrl;      -- accept new control settings at end of block when gapsize=0
+              v.samples_cnt := 0; 
+              v.blocks_cnt  := r.blocks_cnt + 1;
+            elsif r.samples_cnt >= v_samples_per_packet-1 then 
+              v.eop         := '1'; 
+              v.samples_cnt := 0; 
+              v.rd_ena      := '0';
+              v.state       := s_gap;
+            else 
+              v.samples_cnt := r.samples_cnt + 1;
+            end if;
+            v.valid  := '1';  -- output pending data
+            
+            if r.mem_cnt >= v_mem_high_adrs then 
+              v.mem_cnt := v_mem_low_adrs;
+            else
+              v.mem_cnt := r.mem_cnt + 1;
+            end if; 
+            
+            if v.eop = '1' and r.blk_en = '0' then
+              v.state := s_idle;          -- accept disable after eop, not during block
+            end if;
+            if r.eop = '1' then
+              v.blk_xon := out_siso.xon;  -- accept XOFF after eop, not during block
+            end if;
           
-          if v.eop = '1' and r.blk_en = '0' then
-            v.state := s_idle;          -- accept disable after eop, not during block
-          end if;
-          if r.eop = '1' then
-            v.blk_xon := out_siso.xon;  -- accept XOFF after eop, not during block
-          end if;
+          end if;  -- out_siso.ready='1'
 
         when s_gap => 
           if r.samples_cnt >= v_gapsize-1 and r.blocks_cnt >= v_blocks_per_sync-1 then