From 0af24c7a7f469be31907121a4637c88f46ad94a9 Mon Sep 17 00:00:00 2001
From: donker <donker@astron.nl>
Date: Wed, 23 Sep 2020 14:52:56 +0200
Subject: [PATCH] add mms_dp_bsn_source_v2.vhd

---
 libraries/base/dp/hdllib.cfg                  |   2 +
 .../base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd | 124 ++++++++++++++++++
 .../dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd    |   2 +-
 3 files changed, 127 insertions(+), 1 deletion(-)
 create mode 100644 libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd

diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg
index 12048d88a8..3cbdaf9fdf 100644
--- a/libraries/base/dp/hdllib.cfg
+++ b/libraries/base/dp/hdllib.cfg
@@ -77,6 +77,7 @@ synth_files =
     src/vhdl/dp_bsn_source_v2.vhd
     src/vhdl/dp_bsn_source_reg.vhd
     src/vhdl/mms_dp_bsn_source.vhd
+    src/vhdl/mms_dp_bsn_source_v2.vhd
     src/vhdl/dp_bsn_scheduler.vhd
     src/vhdl/dp_bsn_scheduler_reg.vhd
     src/vhdl/mms_dp_bsn_scheduler.vhd
@@ -184,6 +185,7 @@ test_bench_files =
     tb/vhdl/tb_dp_bsn_align.vhd
     tb/vhdl/tb_mms_dp_bsn_align.vhd
     tb/vhdl/tb_dp_bsn_monitor.vhd
+    tb/vhdl/tb_dp_bsn_source.vhd
     tb/vhdl/tb_dp_bsn_source_v2.vhd
     tb/vhdl/tb_mms_dp_bsn_source.vhd
     tb/vhdl/tb_mms_dp_bsn_source_v2.vhd
diff --git a/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
new file mode 100644
index 0000000000..f6429063ae
--- /dev/null
+++ b/libraries/base/dp/src/vhdl/mms_dp_bsn_source_v2.vhd
@@ -0,0 +1,124 @@
+-------------------------------------------------------------------------------
+--
+-- Copyright (C) 2012
+-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
+-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-------------------------------------------------------------------------------
+
+-- Purpose : MMS for dp_bsn_source
+-- Description: See dp_bsn_source.vhd
+
+LIBRARY IEEE, common_lib;
+USE IEEE.STD_LOGIC_1164.ALL;
+USE common_lib.common_pkg.ALL;
+USE common_lib.common_mem_pkg.ALL;
+USE work.dp_stream_pkg.ALL;
+
+
+ENTITY mms_dp_bsn_source_v2 IS
+  GENERIC (
+    g_cross_clock_domain     : BOOLEAN := TRUE;           -- use FALSE when mm_clk and st_clk are the same, else use TRUE to cross the clock domain
+    g_block_size             : NATURAL := 256;            -- 1024 samples @ 800M / 4 = 256 4 sample words @ 200 M
+    g_nof_block_per_sync     : NATURAL := 8;              -- 800M/1024 = 781250;
+    g_bsn_w                  : NATURAL := 48
+  );
+  PORT (
+    -- Clocks and reset
+    mm_rst            : IN  STD_LOGIC;         -- reset synchronous with mm_clk
+    mm_clk            : IN  STD_LOGIC;         -- memory-mapped bus clock
+    dp_rst            : IN  STD_LOGIC;         -- reset synchronous with st_clk
+    dp_clk            : IN  STD_LOGIC;         -- other clock domain clock
+    dp_pps            : IN  STD_LOGIC := '1';  -- external PPS in captured in dp_clk domain
+    
+    -- Memory-mapped clock domain
+    reg_mosi          : IN  t_mem_mosi;  -- actual ranges defined by c_mm_reg
+    reg_miso          : OUT t_mem_miso;  -- actual ranges defined by c_mm_reg
+    
+    -- Streaming clock domain
+    bs_sosi           : OUT t_dp_sosi
+  );
+END mms_dp_bsn_source_v2;
+
+
+ARCHITECTURE str OF mms_dp_bsn_source_v2 IS
+
+  SIGNAL dp_on              : STD_LOGIC;
+  SIGNAL dp_on_pps          : STD_LOGIC;
+  SIGNAL nof_block_per_sync : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0);
+  SIGNAL init_bsn           : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0);
+  
+  SIGNAL i_bs_sosi          : t_dp_sosi;
+
+  SIGNAL dp_on_status       : STD_LOGIC;
+  
+  SIGNAL capture_bsn        : STD_LOGIC_VECTOR(g_bsn_w-1 DOWNTO 0) := (OTHERS=>'0');
+
+BEGIN
+
+  bs_sosi <= i_bs_sosi;
+
+  u_mm_reg : ENTITY work.dp_bsn_source_reg
+  GENERIC MAP (
+    g_cross_clock_domain => g_cross_clock_domain,
+    g_nof_block_per_sync => g_nof_block_per_sync
+  )
+  PORT MAP (
+    -- Clocks and reset
+    mm_rst                => mm_rst,
+    mm_clk                => mm_clk,
+    st_rst                => dp_rst,
+    st_clk                => dp_clk,
+    
+    -- Memory Mapped Slave in mm_clk domain
+    sla_in                => reg_mosi,
+    sla_out               => reg_miso,
+    
+    -- MM registers in st_clk domain
+    st_on                 => dp_on,
+    st_on_pps             => dp_on_pps,
+    st_on_status          => dp_on_status,
+    st_nof_block_per_sync => nof_block_per_sync,
+    st_init_bsn           => init_bsn,
+    st_current_bsn        => capture_bsn
+  );
+  
+  u_bsn_source : ENTITY work.dp_bsn_source_v2
+  GENERIC MAP (
+    g_block_size             => g_block_size,
+    g_nof_block_per_sync     => g_nof_block_per_sync,
+    g_bsn_w                  => g_bsn_w
+  )
+  PORT MAP (
+    rst                => dp_rst,
+    clk                => dp_clk,
+    pps                => dp_pps,
+    -- MM control
+    dp_on              => dp_on,
+    dp_on_pps          => dp_on_pps,
+    dp_on_status       => dp_on_status,
+    init_bsn           => init_bsn,
+    nof_block_per_sync => nof_block_per_sync,
+    -- Streaming
+    src_out            => i_bs_sosi
+  );
+  
+  --capture_bsn <= i_bs_sosi.bsn;                                                  -- capture current BSN
+  --capture_bsn <= i_bs_sosi.bsn WHEN rising_edge(dp_clk) AND dp_pps='1';          -- capture BSN at external PPS
+  capture_bsn <= i_bs_sosi.bsn WHEN rising_edge(dp_clk) AND i_bs_sosi.sync='1';  -- capture BSN at internal sync
+  
+END str;
+
diff --git a/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd b/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd
index 3f4d442837..56046797b6 100644
--- a/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_mms_dp_bsn_source_v2.vhd
@@ -157,7 +157,7 @@ BEGIN
      WAIT;
   END PROCESS;
 
-  u_dut : ENTITY work.mms_dp_bsn_source
+  u_dut : ENTITY work.mms_dp_bsn_source_v2
   GENERIC MAP (
     g_cross_clock_domain => TRUE,          -- use FALSE when mm_clk and st_clk are the same, else use TRUE to cross the clock domain
     g_block_size         => c_block_size,
-- 
GitLab