diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg
index b5890bb8eb13e7910a555888274c1a32b5b94567..08537b9386a3559f408af39417fe3e639007a298 100644
--- a/libraries/base/dp/hdllib.cfg
+++ b/libraries/base/dp/hdllib.cfg
@@ -73,6 +73,8 @@ synth_files =
     src/vhdl/dp_bsn_restore_global.vhd
     src/vhdl/dp_block_gen.vhd
     src/vhdl/dp_block_gen_valid_arr.vhd
+    src/vhdl/dp_block_from_mm.vhd
+    src/vhdl/dp_block_to_mm.vhd
     src/vhdl/dp_bsn_source.vhd
     src/vhdl/dp_bsn_source_v2.vhd
     src/vhdl/dp_bsn_source_reg.vhd
@@ -166,6 +168,9 @@ synth_files =
     src/vhdl/dp_selector_arr.vhd
     src/vhdl/dp_selector.vhd
     src/vhdl/mms_dp_scale.vhd
+    
+    
+    
     tb/vhdl/dp_stream_player.vhd
     tb/vhdl/dp_sosi_recorder.vhd
     tb/vhdl/dp_stream_rec_play.vhd
@@ -184,6 +189,7 @@ test_bench_files =
     tb/vhdl/tb_dp_block_reshape_sync.vhd
     tb/vhdl/tb_dp_block_gen.vhd
     tb/vhdl/tb_dp_block_gen_valid_arr.vhd
+    tb/vhdl/tb_dp_block_from_mm.vhd
     tb/vhdl/tb_dp_bsn_align.vhd
     tb/vhdl/tb_mms_dp_bsn_align.vhd
     tb/vhdl/tb_dp_bsn_monitor.vhd
@@ -251,12 +257,14 @@ test_bench_files =
     tb/vhdl/tb_mms_dp_force_data_serial_arr.vhd
     tb/vhdl/tb_mms_dp_gain_arr.vhd
     tb/vhdl/tb_mms_dp_gain_serial_arr.vhd
+    
 
     tb/vhdl/tb_tb_dp_block_select.vhd
     tb/vhdl/tb_tb_dp_block_reshape.vhd
     tb/vhdl/tb_tb_dp_block_reshape_sync.vhd
     tb/vhdl/tb_tb_dp_block_gen.vhd
     tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd
+    tb/vhdl/tb_tb_dp_block_from_mm.vhd
     tb/vhdl/tb_tb_dp_bsn_align.vhd
     tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
     tb/vhdl/tb_tb_dp_concat.vhd
@@ -318,6 +326,7 @@ regression_test_vhdl =
     tb/vhdl/tb_tb_dp_block_reshape_sync.vhd
     tb/vhdl/tb_tb_dp_block_gen.vhd
     tb/vhdl/tb_tb_dp_block_gen_valid_arr.vhd
+    tb/vhdl/tb_tb_dp_block_from_mm.vhd
     tb/vhdl/tb_tb_dp_bsn_align.vhd
     tb/vhdl/tb_tb_dp_bsn_source_v2.vhd
     tb/vhdl/tb_tb_dp_concat.vhd
diff --git a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..553d7370c4038002aed2b45922052cddf6fff0af
--- /dev/null
+++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
@@ -0,0 +1,133 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+-- --------------------------------------------------------------------------
+
+-- --------------------------------------------------------------------------
+-- Author: 
+-- . Pieter Donker
+-- Purpose:
+-- . Read a block of data from memory mapped (MM) location and stream it as a block of data.
+-- Description:
+-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE,common_lib;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE work.dp_stream_pkg.ALL;
+
+ENTITY dp_block_from_mm IS
+  GENERIC (
+    g_data_size  : NATURAL;
+    g_step_size  : NATURAL;
+    g_nof_data   : NATURAL
+  ); 
+  PORT (
+    rst           : IN  STD_LOGIC;
+    clk           : IN  STD_LOGIC;
+    start_pulse   : IN  STD_LOGIC;
+    start_address : IN  NATURAL RANGE 0 TO g_step_size * g_nof_data;
+    mm_done       : OUT STD_LOGIC;
+    mm_mosi       : OUT t_mem_mosi;
+    mm_miso       : IN  t_mem_miso;
+    out_sosi      : OUT t_dp_sosi;
+    out_siso      : IN  t_dp_siso
+  );
+END dp_block_from_mm;
+
+
+ARCHITECTURE rtl OF dp_block_from_mm IS 
+
+  CONSTANT c_mem_size : NATURAL := g_step_size * g_nof_data;
+
+  TYPE t_reg IS RECORD
+    busy       : STD_LOGIC;
+    sop        : STD_LOGIC;
+    eop        : STD_LOGIC;
+    word_index : NATURAL;
+    step_index : NATURAL;
+  END RECORD;
+
+  CONSTANT c_reg_rst : t_reg := ('0', '0', '0', 0, 0);
+
+  SIGNAL r : t_reg;
+  SIGNAL d : t_reg;
+  SIGNAL mm_address      : NATURAL := 0;
+  SIGNAL last_mm_address : NATURAL := 0;
+BEGIN
+
+  last_mm_address <= g_step_size * (g_nof_data - 1) + g_data_size + start_address;
+  mm_address      <= start_address + r.word_index + r.step_index;
+  
+  mm_mosi.address <= TO_MEM_ADDRESS(mm_address);
+
+  out_sosi.data  <= RESIZE_DP_DATA(mm_miso.rddata(c_word_w-1 DOWNTO 0));
+  out_sosi.valid <= mm_miso.rdval;  -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1)
+  out_sosi.sop   <= r.sop;          -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.sop can be used for output sop
+  out_sosi.eop   <= r.eop;          -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.eop can be used for output eop
+  
+  mm_done <= d.eop;
+
+  p_reg : PROCESS(rst, clk)
+  BEGIN
+    IF rst='1' THEN
+      r <= c_reg_rst;
+    ELSIF rising_edge(clk) THEN
+      r <= d;
+    END IF;
+  END PROCESS;
+
+  p_comb : PROCESS(r, start_pulse, out_siso, mm_address, last_mm_address)
+  BEGIN
+    d <= r;
+    d.sop <= '0';
+    d.eop <= '0';
+    mm_mosi.rd <= '0';
+    IF r.busy = '0' AND start_pulse = '1' THEN
+      -- initiate next block
+      d.busy <= '1';
+    ELSIF r.busy = '1' THEN
+      IF out_siso.ready = '1' THEN
+        -- continue with block
+        mm_mosi.rd <= '1';
+        IF r.word_index < g_data_size - 1 THEN
+          d.word_index <= r.word_index + 1;
+        ELSE
+          d.word_index <= 0;
+          d.step_index <= r.step_index + g_step_size;
+        END IF;
+        
+        -- check start of block
+        IF r.word_index = 0 AND r.step_index = 0 THEN
+          d.sop <= '1';
+        END IF;
+        
+        -- check end of block
+        IF mm_address >= last_mm_address THEN
+          d.eop <= '1';
+          -- prepare for next block
+          d.busy <= '0';
+          d.word_index <= 0;
+          d.step_index <= 0;
+        END IF;
+      END IF;
+    END IF;
+  END PROCESS;
+    
+END rtl;
\ No newline at end of file
diff --git a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..7f2fd8aed81aba0ee3dd2924874cd8fb3afe0fc0
--- /dev/null
+++ b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd
@@ -0,0 +1,107 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+-- --------------------------------------------------------------------------
+
+-- --------------------------------------------------------------------------
+-- Author: 
+-- . Pieter Donker
+-- Purpose:
+-- . get a block of data from a stream and write it to a memory mapped (MM) location.
+-- Description:
+-- . https://support.astron.nl/confluence/display/L2M/L5+SDPFW+Design+Document%3A+Subband+filterbank
+-- --------------------------------------------------------------------------
+
+LIBRARY IEEE,common_lib;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE work.dp_stream_pkg.ALL;
+
+ENTITY dp_block_to_mm IS
+  GENERIC (
+    g_data_size  : NATURAL;
+    g_step_size  : NATURAL;
+    g_nof_data   : NATURAL
+  ); 
+  PORT (
+    rst           : IN  STD_LOGIC;
+    clk           : IN  STD_LOGIC;
+    start_address : IN  NATURAL RANGE 0 TO g_step_size * g_nof_data;
+    mm_mosi       : OUT t_mem_mosi;
+    in_sosi       : IN  t_dp_sosi
+  );
+END dp_block_to_mm;
+
+
+ARCHITECTURE rtl OF dp_block_to_mm IS 
+
+  CONSTANT c_mem_size : NATURAL := g_step_size * g_nof_data;
+
+  TYPE t_reg IS RECORD
+    wr         : STD_LOGIC;
+    word_index : NATURAL;
+    step_index : NATURAL;
+  END RECORD;
+
+  CONSTANT c_reg_rst : t_reg := ('0', 0, 0);
+
+  SIGNAL r : t_reg;
+  SIGNAL d : t_reg;
+  SIGNAL address : NATURAL := 0;
+
+BEGIN
+  address         <= start_address + r.word_index + r.step_index;
+  mm_mosi.address <= TO_MEM_ADDRESS(address);
+  mm_mosi.wrdata  <= RESIZE_MEM_DATA(in_sosi.data);
+  mm_mosi.wr      <= r.wr;
+  
+  p_reg : PROCESS(rst, clk)
+  BEGIN
+    IF rst='1' THEN
+      r <= c_reg_rst;
+    ELSIF rising_edge(clk) THEN
+      r <= d;
+    END IF;
+  END PROCESS;
+
+  p_comb : PROCESS(r, in_sosi)
+  BEGIN
+    d <= r;
+    d.wr <= '0';
+    -- while receiving block
+    IF in_sosi.valid = '1' THEN
+      -- continue with block
+      IF r.step_index <= c_mem_size THEN
+        d.wr <= '1';
+        IF r.word_index < g_data_size - 1 THEN
+          d.word_index <= r.word_index + 1;
+        ELSE
+          d.word_index <= 0;
+          d.step_index <= r.step_index + g_step_size;
+        END IF;
+      END IF;
+    END IF;
+    -- if end of block
+    IF in_sosi.eop = '1' THEN
+      -- prepare for next block
+      d.word_index <= 0;
+      d.step_index <= 0;
+    END IF;
+  END PROCESS;
+    
+END rtl;
\ No newline at end of file
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..8313c467f3690c236eba85393fec21351941cb2d
--- /dev/null
+++ b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd
@@ -0,0 +1,245 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+-- --------------------------------------------------------------------------
+
+-- --------------------------------------------------------------------------
+-- Author: 
+-- . Pieter Donker
+-- Purpose:
+-- . Test bench for dp_block_from_mm.vhd and dp_block_to_mm.vhd 
+--
+-- Description:
+-- . data flow:
+--   p_init_ram --> u_ram_rd --> u_dp_block_from_mm --> dp_block_to_mm --> u_ram_wr --> p_verify_read
+-- . process flow:
+--   p_init_ram --> p_transfer --> p_verify_read / p_verify_check. 
+--   . p_init_ram, initializes u_ram_rd with ascending values.
+--   . p_transfer, u_dp_block_from_mm reads data (using g_data_size and g_step size)
+--     from u_ram_rd and stream it to u_dp_block_to_mm which write it to u_ram_wr.
+--   . p_verify_read, set ram address (using g_data_size and g_step_size) to check and
+--     read value from ram, also set expected ram value.
+--   . p_verify_check, check if ram_value is equal to expected value. 
+-- --------------------------------------------------------------------------
+
+-- > as 10
+-- > run -all  -- signal tb_end will stop the simulation by stopping the clk
+  
+LIBRARY IEEE, common_lib, dp_lib;
+USE IEEE.std_logic_1164.ALL;
+USE IEEE.numeric_std.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE common_lib.tb_common_pkg.ALL;
+USE dp_lib.dp_stream_pkg.ALL;
+USE dp_lib.tb_dp_pkg.ALL;
+
+
+ENTITY tb_dp_block_from_mm IS
+  GENERIC (
+    g_data_size : NATURAL := 2;
+    g_step_size : NATURAL := 4;
+    g_nof_data  : NATURAL := 512
+  );
+END tb_dp_block_from_mm;
+
+ARCHITECTURE tb OF tb_dp_block_from_mm IS
+
+  CONSTANT c_nof_blocks    : NATURAL := g_step_size / g_data_size;
+  CONSTANT c_ram_data_size : NATURAL := g_nof_data * g_data_size * c_nof_blocks;
+  CONSTANT c_ram_adr_w     : NATURAL := ceil_log2(c_ram_data_size);
+
+  CONSTANT c_ram : t_c_mem := (1, c_ram_adr_w, c_word_w, 2**c_ram_adr_w, '0');
+
+  SIGNAL tb_end            : STD_LOGIC := '0';
+  SIGNAL clk               : STD_LOGIC := '1';
+  SIGNAL rst               : STD_LOGIC := '1';
+
+  SIGNAL start_pulse       : STD_LOGIC := '0';
+  SIGNAL start_address     : NATURAL := 0;
+  SIGNAL start_address_dly : NATURAL := 0;
+  SIGNAL block_done        : STD_LOGIC;
+
+  SIGNAL rd_mosi           : t_mem_mosi;
+  SIGNAL rd_miso           : t_mem_miso;
+  
+  SIGNAL blk_sosi          : t_dp_sosi;
+  SIGNAL blk_siso          : t_dp_siso := c_dp_siso_rdy;
+
+  SIGNAL wr_mosi           : t_mem_mosi;
+  SIGNAL wr_miso           : t_mem_miso;
+
+  -- needed for init and verify
+  SIGNAL ram_wr_en  : STD_LOGIC := '0';
+  SIGNAL ram_wr_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0) := (OTHERS=>'0');
+  SIGNAL ram_wr_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0) := (OTHERS=>'0');
+  SIGNAL ram_rd_en  : STD_LOGIC := '0';
+  SIGNAL ram_rd_adr : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0);
+  SIGNAL ram_rd_dat : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0);
+  SIGNAL ram_rd_val : STD_LOGIC;
+
+  SIGNAL init_done     : STD_LOGIC := '0';
+  SIGNAL transfer_done : STD_LOGIC := '0';
+  
+BEGIN
+
+  clk <= (NOT clk) OR tb_end AFTER clk_period/2;
+  rst <= '1', '0' AFTER clk_period*7;
+  
+  ------------------------------------------------------------------------------
+  -- STIMULI
+  ------------------------------------------------------------------------------
+  
+  start_address_dly <= start_address WHEN rising_edge(clk);  -- dp_block_to_mm is 1 clock behind so set address also 1 clock later. 
+  
+  p_init_ram : PROCESS
+  BEGIN
+    ram_wr_en <= '0';
+    proc_common_wait_until_low(clk, rst);
+    proc_common_wait_some_cycles(clk, 10);
+    FOR i IN 0 TO c_ram_data_size-1 LOOP
+      ram_wr_adr <= TO_UVEC(i, c_ram.adr_w);
+      ram_wr_dat <= TO_UVEC(i, c_ram.dat_w);
+      ram_wr_en  <= '1'; 
+      proc_common_wait_some_cycles(clk, 1);
+    END LOOP;
+    ram_wr_en <= '0'; 
+
+    init_done <= '1';
+    WAIT;
+  END PROCESS;
+
+  p_transfer : PROCESS
+  BEGIN
+    start_pulse   <= '0';
+    start_address <= 0;
+    proc_common_wait_until_high(clk, init_done);
+    FOR i IN 0 TO c_nof_blocks-1 LOOP
+      start_address <= i * g_data_size; 
+      start_pulse <= '1';
+      proc_common_wait_some_cycles(clk, 1);
+      
+      start_pulse <= '0';
+      proc_common_wait_until_high(clk, block_done);
+    END LOOP;
+    proc_common_wait_some_cycles(clk, 1);  -- needed for dp_block_to_mm to proccess last word.
+    transfer_done <= '1';
+    WAIT;
+  END PROCESS;
+
+  p_verify_read : PROCESS
+  BEGIN
+    ram_rd_en  <= '0';
+    ram_rd_adr <= TO_UVEC(0 , c_ram.adr_w);
+    proc_common_wait_until_high(clk, transfer_done);
+    ram_rd_en  <= '1';
+    FOR i IN 0 TO c_ram_data_size-1 LOOP  
+      ram_rd_adr <= TO_UVEC(i, c_ram.adr_w);
+      proc_common_wait_some_cycles(clk, 1);
+    END LOOP;
+    ram_rd_en <= '0'; 
+
+    proc_common_wait_some_cycles(clk, 10);
+    tb_end <= '1';
+    WAIT;
+  END PROCESS;
+
+  p_verify_check: PROCESS
+    VARIABLE v_cnt: NATURAL := 0; 
+  BEGIN
+    proc_common_wait_until_high(clk, transfer_done);
+    WHILE tb_end = '0' LOOP
+      WAIT UNTIL rising_edge(clk);
+      IF ram_rd_val = '1' THEN
+        ASSERT v_cnt = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR;
+        v_cnt := v_cnt + 1;
+      END IF;
+    END LOOP;
+    WAIT;
+  END PROCESS;
+  
+  ------------------------------------------------------------------------------
+  -- DUT, dp_block_from_mm and dp_block_to_mm
+  ------------------------------------------------------------------------------
+  -- RAM with test data
+  u_ram_rd: ENTITY common_lib.common_ram_r_w
+  GENERIC MAP (
+    g_ram => c_ram
+  )
+  PORT MAP (
+    rst    => rst,
+    clk    => clk,
+    wr_en  => ram_wr_en,
+    wr_adr => ram_wr_adr,
+    wr_dat => ram_wr_dat,
+    rd_en  => rd_mosi.rd,
+    rd_adr => rd_mosi.address(c_ram.adr_w-1 DOWNTO 0),
+    rd_dat => rd_miso.rddata(c_ram.dat_w-1 DOWNTO 0),
+    rd_val => rd_miso.rdval
+  );
+  
+  -- DUT, dp_block_from_mm
+  u_dp_block_from_mm: ENTITY work.dp_block_from_mm
+  GENERIC MAP (
+    g_data_size => g_data_size,
+    g_step_size => g_step_size,
+    g_nof_data  => g_nof_data
+  )
+  PORT MAP (
+    rst           => rst,
+    clk           => clk,
+    start_pulse   => start_pulse,
+    start_address => start_address,
+    mm_done       => block_done,
+    mm_mosi       => rd_mosi,
+    mm_miso       => rd_miso,
+    out_sosi      => blk_sosi,
+    out_siso      => blk_siso
+  );
+    
+  -- DUT, dp_block_to_mm
+  u_dp_block_to_mm: ENTITY work.dp_block_to_mm
+  GENERIC MAP (
+    g_data_size => g_data_size,
+    g_step_size => g_step_size,
+    g_nof_data  => g_nof_data
+  )
+  PORT MAP (
+    rst           => rst,
+    clk           => clk,
+    start_address => start_address_dly,
+    mm_mosi       => wr_mosi,
+    in_sosi       => blk_sosi
+  );
+
+  -- RAM with transferred data
+  u_ram_wr: ENTITY common_lib.common_ram_r_w
+  GENERIC MAP (
+    g_ram => c_ram
+  )
+  PORT MAP (
+    rst    => rst,
+    clk    => clk,
+    wr_en  => wr_mosi.wr,
+    wr_adr => wr_mosi.address(c_ram.adr_w-1 DOWNTO 0),
+    wr_dat => wr_mosi.wrdata(c_ram.dat_w-1 DOWNTO 0),
+    rd_en  => ram_rd_en,
+    rd_adr => ram_rd_adr,
+    rd_dat => ram_rd_dat,
+    rd_val => ram_rd_val
+  );
+
+END tb;
diff --git a/libraries/base/dp/tb/vhdl/tb_tb_dp_block_from_mm.vhd b/libraries/base/dp/tb/vhdl/tb_tb_dp_block_from_mm.vhd
new file mode 100644
index 0000000000000000000000000000000000000000..cc66e86052b50ef422e7ec8f5ed75359fecec06d
--- /dev/null
+++ b/libraries/base/dp/tb/vhdl/tb_tb_dp_block_from_mm.vhd
@@ -0,0 +1,54 @@
+-- --------------------------------------------------------------------------
+-- Copyright 2020
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+-- --------------------------------------------------------------------------
+
+-- --------------------------------------------------------------------------
+-- Author: 
+-- . Pieter Donker
+-- Purpose:
+-- . Test bench running multiple tb_dp_block_from_mm.vhd with different settings 
+--
+-- Description:
+--   
+-- --------------------------------------------------------------------------
+
+-- > as 10
+-- > run -all  -- signal tb_end will stop the simulation by stopping the clk
+ 
+LIBRARY IEEE;
+USE IEEE.std_logic_1164.ALL;
+USE work.tb_dp_pkg.ALL;
+
+
+ENTITY tb_tb_dp_block_from_mm IS
+END tb_tb_dp_block_from_mm;
+
+
+ARCHITECTURE tb OF tb_tb_dp_block_from_mm IS
+  SIGNAL tb_end : STD_LOGIC := '0';  -- declare tb_end to avoid 'No objects found' error on 'when -label tb_end'
+BEGIN
+  -- used generics for tb_dp_block_from_mm (g_data_size, g_step_size, g_nof_data)
+  u0_tst_1_1_1   : ENTITY work.tb_dp_block_from_mm GENERIC MAP (1, 1, 1);
+  u1_tst_2_2_17  : ENTITY work.tb_dp_block_from_mm GENERIC MAP (2, 2, 17);
+  u2_tst_2_2_256 : ENTITY work.tb_dp_block_from_mm GENERIC MAP (2, 2, 256);
+  u3_tst_2_4_256 : ENTITY work.tb_dp_block_from_mm GENERIC MAP (2, 4, 256);
+  u4_tst_2_6_256 : ENTITY work.tb_dp_block_from_mm GENERIC MAP (2, 6, 256);
+  u5_tst_2_8_256 : ENTITY work.tb_dp_block_from_mm GENERIC MAP (2, 8, 256);
+  u6_tst_3_6_17  : ENTITY work.tb_dp_block_from_mm GENERIC MAP (3, 6, 17);
+  
+END tb;
+  
\ No newline at end of file