From 9c1b6f195c15a6e5c1a443d01e9e1227d6d7659b Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Wed, 2 Nov 2022 15:17:53 +0100
Subject: [PATCH] Support raw subbands for LOFAR2 and keep quantized subbands
 for DISTURB2.

---
 .../libraries/sdp/src/vhdl/sdp_station.vhd    | 63 +++++++++++++------
 1 file changed, 44 insertions(+), 19 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
index 90e1a6ab1a..08ede03ff0 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd
@@ -23,14 +23,21 @@
 -- Purpose:  
 --   Core design for Lofar2 SDP station
 -- Description:
---   Combines sdp nodes. Contains the UniBoard2 HW version independent LOFAR2 SDP application code.
+-- * Combines sdp nodes. Contains the UniBoard2 HW version independent LOFAR2
+--   SDP application code.
+-- * Supports default PFB for LOFAR2 [1]
+--   - Uses raw subband input to improve the accuracy of weighted subbands
+--     and weighted beamlets
+-- * Supports 2x oversampled PFB for DISTURB2 [2]
+--   - Still uses quantized subband input, because using raw subbands might
+--     require too many DSP multipliers.
 -- References:
 -- [1] LOFAR2 SDP FW: https://support.astron.nl/confluence/display/L2M/L4+SDP+Firmware+Design+Document
--- [2] DISTURB2 revision: https://support.astron.nl/confluence/x/vIIjBQ
+-- [2] DISTURB2 design revision: https://support.astron.nl/confluence/x/vIIjBQ
 -- [3] SST, SST_OS packets: https://plm.astron.nl/polarion/#/project/LOFAR2System/wiki/L2%20Interface%20Control%20Documents/SC%20to%20SDP%20ICD
 -------------------------------------------------------------------------------
 
-LIBRARY IEEE, common_lib, diag_lib, dp_lib, tech_jesd204b_lib, wpfb_lib, tech_pll_lib, tr_10GbE_lib, nw_10GbE_lib, eth_lib, ring_lib;
+LIBRARY IEEE, common_lib, diag_lib, dp_lib, tech_jesd204b_lib, fft_lib, wpfb_lib, tech_pll_lib, tr_10GbE_lib, nw_10GbE_lib, eth_lib, ring_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.NUMERIC_STD.ALL;
 USE common_lib.common_pkg.ALL;
@@ -39,6 +46,7 @@ USE common_lib.common_network_layers_pkg.ALL;
 USE common_lib.common_field_pkg.ALL;
 USE diag_lib.diag_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
+USE fft_lib.fft_pkg.ALL;
 USE wpfb_lib.wpfb_pkg.ALL;
 USE work.sdp_pkg.ALL;
 USE eth_lib.eth_pkg.ALL;
@@ -376,6 +384,14 @@ END sdp_station;
 
 ARCHITECTURE str OF sdp_station IS
 
+  -- WPFB subband width
+  CONSTANT c_fft                : t_fft := func_wpfb_map_wpfb_parameters_to_fft(g_wpfb);
+  CONSTANT c_fft_raw_dat_w      : NATURAL := func_fft_raw_dat_w(c_fft);
+  CONSTANT c_fft_raw_fraction_w : NATURAL := func_fft_raw_fraction_w(c_fft);
+
+  CONSTANT c_subband_raw_dat_w       : NATURAL := sel_a_b(g_use_oversample, c_sdp_W_subband, c_fft_raw_dat_w);
+  CONSTANT c_subband_raw_fraction_w  : NATURAL := sel_a_b(g_use_oversample, 0, c_fft_raw_fraction_w);
+
   -- Make Tx FIFOs at least c_fifo_tx_fill_margin larger than needed to fit the largest Tx packet
   CONSTANT c_fifo_tx_fill_margin           : NATURAL := 10;  -- >= c_fifo_fill_margin = 6 that is used in dp_fifo_fill_eop
 
@@ -520,9 +536,9 @@ ARCHITECTURE str OF sdp_station IS
   ----------------------------------------------
 
   SIGNAL ait_sosi_arr                      : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);         
-  SIGNAL fsub_sosi_arr                     : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0);  -- weighted subbands
-  SIGNAL fsub_oversampled_sosi_arr         : t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0); 
-  SIGNAL fsub_sosi_2arr                    : t_dp_sosi_2arr_pfb(c_sdp_N_beamsets-1 DOWNTO 0);
+  SIGNAL fsub_raw_sosi_arr                 : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0);
+  SIGNAL fsub_oversampled_sosi_arr         : t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0);
+  SIGNAL fsub_raw_sosi_2arr                : t_dp_sosi_2arr_pfb(c_sdp_N_beamsets-1 DOWNTO 0);
 
   SIGNAL xst_bs_sosi                       : t_dp_sosi;  -- block sync reference for Xsub ring latency monitor
   SIGNAL bf_bs_sosi                        : t_dp_sosi;  -- block sync reference for BF ring latency monitor
@@ -713,7 +729,7 @@ BEGIN
         dp_rst                              => dp_rst, 
                                                                  
         in_sosi_arr                         => ait_sosi_arr,    
-        fsub_sosi_arr                       => fsub_sosi_arr,
+        fsub_raw_sosi_arr                   => fsub_raw_sosi_arr,
         dp_bsn_source_restart               => dp_bsn_source_restart,
         dp_bsn_source_new_interval          => dp_bsn_source_new_interval,
 
@@ -749,8 +765,9 @@ BEGIN
         udp_src_port                        => sst_udp_src_port
       );
 
-      gen_bf_sosi : FOR I IN 0 TO c_sdp_N_beamsets-1 GENERATE 
-        fsub_sosi_2arr(I) <= fsub_sosi_arr;
+      gen_bf_sosi : FOR I IN 0 TO c_sdp_N_beamsets-1 GENERATE
+        -- Wire same subbands to all beamsets
+        fsub_raw_sosi_2arr(I) <= fsub_raw_sosi_arr;
       END GENERATE;
     END GENERATE;
 
@@ -807,10 +824,14 @@ BEGIN
         udp_src_port                        => sst_udp_src_port
       );
 
-      fsub_sosi_arr <= fsub_oversampled_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0); -- Lower part contains normal subbands, higher part contains shifted subbands.
+      -- Lower part contains normal subbands, higher part contains shifted subbands.
+      -- . Use normal subbands for subband correlator
+      fsub_raw_sosi_arr <= fsub_oversampled_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0);
 
-      fsub_sosi_2arr(0) <= fsub_sosi_arr;
-      fsub_sosi_2arr(1) <= fsub_oversampled_sosi_arr(2 * c_sdp_P_pfb-1 DOWNTO c_sdp_P_pfb); -- Use second beamset for oversampled subbands
+      -- . Use first beamset for normal subbands
+      --   Use second beamset for oversampled subbands
+      fsub_raw_sosi_2arr(0) <= fsub_oversampled_sosi_arr(    c_sdp_P_pfb-1 DOWNTO 0);
+      fsub_raw_sosi_2arr(1) <= fsub_oversampled_sosi_arr(2 * c_sdp_P_pfb-1 DOWNTO c_sdp_P_pfb);
     END GENERATE;
   END GENERATE;
 
@@ -821,15 +842,17 @@ BEGIN
   gen_use_xsub : IF g_use_xsub GENERATE
     u_xsub : ENTITY work.node_sdp_correlator 
     GENERIC MAP(
-      g_sim     => g_sim,
-      g_sim_sdp => g_sim_sdp,
-      g_P_sq    => g_P_sq
+      g_sim                    => g_sim,
+      g_sim_sdp                => g_sim_sdp,
+      g_P_sq                   => g_P_sq,
+      g_subband_raw_dat_w      => c_subband_raw_dat_w,
+      g_subband_raw_fraction_w => c_subband_raw_fraction_w
     )
     PORT MAP(
       dp_clk                                   => dp_clk, 
       dp_rst                                   => dp_rst, 
                                                                     
-      in_sosi_arr                              => fsub_sosi_arr,    
+      in_sosi_arr                              => fsub_raw_sosi_arr,
 
       xst_udp_sosi                             => udp_tx_sosi_arr(1),
       xst_udp_siso                             => udp_tx_siso_arr(1), 
@@ -886,13 +909,15 @@ BEGIN
         g_sim                    => g_sim, 
         g_sim_sdp                => g_sim_sdp,
         g_beamset_id             => beamset_id,
-        g_scope_selected_beamlet => g_scope_selected_subband 
+        g_scope_selected_beamlet => g_scope_selected_subband,
+        g_subband_raw_dat_w      => c_subband_raw_dat_w,
+        g_subband_raw_fraction_w => c_subband_raw_fraction_w
       )
       PORT MAP(
         dp_clk                   => dp_clk,  
         dp_rst                   => dp_rst,  
       
-        in_sosi_arr              => fsub_sosi_2arr(beamset_id),
+        in_sosi_arr              => fsub_raw_sosi_2arr(beamset_id),
         from_ri_sosi             => bf_from_ri_sosi_arr(beamset_id), 
         to_ri_sosi               => bf_to_ri_sosi_arr(beamset_id),  
         bf_udp_sosi              => bf_udp_sosi_arr(beamset_id),
@@ -1233,7 +1258,7 @@ BEGIN
     END GENERATE;
 
     gen_bf_ring : IF g_use_bf GENERATE
-      bf_bs_sosi <= fsub_sosi_arr(0);
+      bf_bs_sosi <= fsub_raw_sosi_arr(0);
 
       gen_beamset_ring : FOR beamset_id IN 0 TO c_sdp_N_beamsets-1 GENERATE
         u_ring_lane_bf : ENTITY ring_lib.ring_lane
-- 
GitLab