From cf3147a06b9f53324b2774e8aab64e15b108aa0a Mon Sep 17 00:00:00 2001
From: Eric Kooistra <kooistra@astron.nl>
Date: Wed, 2 Nov 2022 14:35:16 +0100
Subject: [PATCH] No functional changes. Still use quantized subband with
 W_subband = 16 bits and no fraction as input.

---
 .../vhdl/node_sdp_oversampled_filterbank.vhd  | 114 +++++++++++-------
 1 file changed, 73 insertions(+), 41 deletions(-)

diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd
index 83cdf658c9..04b0078ba2 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd
@@ -25,6 +25,7 @@
 -- . Implements the functionality of the complex subband filterbank (Fsub complex) in the 
 --   DISTURB SDPFW design.
 -- Description:
+-- . See https://support.astron.nl/confluence/display/DISTURB/DISTURB-2+Station+Digital+Processor+Design+Document
 -- . The subband filterbank seperates the incoming timestamped ADC samples into
 --   512 frequency bands called subbands. 
 -- . It implements a critically sampled poly-phase filterbank (PFB). The PFB consists of a 
@@ -63,7 +64,6 @@ ENTITY node_sdp_oversampled_filterbank IS
     dp_bsn_source_new_interval : IN STD_LOGIC;
 
     in_sosi_arr   : IN  t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0);
-    pfb_sosi_arr  : OUT t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0);
     fsub_sosi_arr : OUT t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0);
     sst_udp_sosi  : OUT t_dp_sosi;
     sst_udp_siso  : IN  t_dp_siso := c_dp_siso_rst;
@@ -110,6 +110,9 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS
   CONSTANT c_complex_mult_pipeline : NATURAL := 3;
   CONSTANT c_complex_pfb_pipeline  : NATURAL := 2;
 
+  -- Use WG as local oscillator, buf contains 16b sin and 16b cos
+  -- . c_sdp_W_local_oscillator = c_halfword_w = 16b
+  -- . c_sdp_W_local_oscillator_fraction = 16b - 1 sign bit = 15b
   CONSTANT c_buf            : t_c_mem := (latency  => 1,
                                           adr_w    => ceil_log2(2 * c_sdp_N_fft),
                                           dat_w    => c_nof_complex * c_halfword_w,      
@@ -118,7 +121,11 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS
 
   CONSTANT c_buf_file       : STRING := "data/freq_shift_half_subband_2048x16_im_re.hex";
      
-  CONSTANT c_wg_ctrl : t_diag_wg := (TO_UVEC(c_diag_wg_mode_repeat, c_diag_wg_mode_w), TO_UVEC(c_buf.nof_dat, c_diag_wg_nofsamples_w), (OTHERS => '0'), (OTHERS => '0'), (OTHERS => '0'));
+  CONSTANT c_wg_ctrl : t_diag_wg := (TO_UVEC(c_diag_wg_mode_repeat, c_diag_wg_mode_w),
+                                     TO_UVEC(c_buf.nof_dat, c_diag_wg_nofsamples_w),
+                                     (OTHERS => '0'),
+                                     (OTHERS => '0'),
+                                     (OTHERS => '0'));
   CONSTANT c_wg_phase_offset : NATURAL := 6; -- Compensate for WG start latency. In nof samples.
 
   CONSTANT c_fil_coefs_mem_addr_w : NATURAL := ceil_log2(c_sdp_N_fft * c_sdp_N_taps);
@@ -138,6 +145,7 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS
   SIGNAL master_mosi_arr     : t_mem_mosi_arr(0 TO c_nof_masters-1) := (OTHERS=>c_mem_mosi_rst);
   SIGNAL master_miso_arr     : t_mem_miso_arr(0 TO c_nof_masters-1) := (OTHERS=>c_mem_miso_rst);
 
+  -- WG as local oscillator (LO)
   SIGNAL wg_rddata  : STD_LOGIC_VECTOR(c_buf.dat_w -1 DOWNTO 0);
   SIGNAL wg_rdval   : STD_LOGIC;
   SIGNAL wg_address : STD_LOGIC_VECTOR(c_buf.adr_w -1 DOWNTO 0);
@@ -145,36 +153,47 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS
   SIGNAL wg_rd      : STD_LOGIC;
   SIGNAL wg_out_dat : STD_LOGIC_VECTOR(c_buf.dat_w -1 DOWNTO 0);
 
+  -- Spectral Inversion (SI)
   SIGNAL si_sosi_arr                    : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
   SIGNAL si_sosi_0_piped                : t_dp_sosi := c_dp_sosi_rst;
+
+  -- Real input FFT
+  SIGNAL wpfb_unit_in_sosi_arr          : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
+  SIGNAL wpfb_unit_fil_sosi_arr         : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_unit_out_sosi_arr         : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_unit_out_sosi_arr_piped   : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
-  SIGNAL wpfb_unit_fil_sosi_arr         : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
-  SIGNAL wpfb_unit_in_sosi_arr          : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)  := (OTHERS => c_dp_sosi_rst);
 
+  -- Mixer to shift f_sub/2
   SIGNAL complex_mult_src_out_arr       : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
   SIGNAL requantize_src_out_arr         : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
+
   SIGNAL wpfb_unit_complex_in_sosi_arr  : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_unit_complex_fil_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_unit_complex_out_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_unit_out_resized_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
+
   SIGNAL wpfb_fifo_sosi_arr             : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_sosi_rst);
   SIGNAL wpfb_fifo_siso_arr             : t_dp_siso_arr(c_sdp_S_pn-1 DOWNTO 0)   := (OTHERS => c_dp_siso_rst);
   SIGNAL wpfb_resized_sosi_2arr         : t_dp_sosi_2arr_2(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => (OTHERS => c_dp_sosi_rst));
   SIGNAL wpfb_resized_siso_2arr         : t_dp_siso_2arr_2(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => (OTHERS => c_dp_siso_rst));
+
   SIGNAL subband_equalizer_in_sosi_arr  : t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
   SIGNAL subband_equalizer_out_sosi_arr : t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
   SIGNAL dp_selector_out_sosi_arr       : t_dp_sosi_arr(c_sdp_R_os * c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst);
 
-  SIGNAL scope_sosi_arr                 : t_dp_sosi_integer_arr(c_sdp_R_os * c_sdp_S_pn-1 DOWNTO 0);
+  SIGNAL scope_equalizer_in_sosi_arr    : t_dp_sosi_integer_arr(c_sdp_R_os * c_sdp_S_pn-1 DOWNTO 0);
+  SIGNAL scope_equalizer_out_sosi_arr   : t_dp_sosi_integer_arr(c_sdp_R_os * c_sdp_S_pn-1 DOWNTO 0);
   
   SIGNAL selector_en                        : STD_LOGIC;
   SIGNAL weighted_subbands_flag             : STD_LOGIC;
+
   SIGNAL dp_bsn_source_restart_pipe         : STD_LOGIC;
   SIGNAL dp_bsn_source_restart_delayed      : STD_LOGIC;
   SIGNAL dp_bsn_source_restart_wg           : STD_LOGIC;
   SIGNAL dp_bsn_source_restart_pipe_complex : STD_LOGIC;
+
 BEGIN
+
   ---------------------------------------------------------------
   -- SPECTRAL INVERSION 
   ---------------------------------------------------------------
@@ -308,17 +327,15 @@ BEGIN
   
     ctrl           => c_wg_ctrl,
 
---    out_ovr        => out_ovr,
-    out_dat        => wg_out_dat --,
---    out_val        => wg_out_val,
---    out_sync       => out_sync
+    out_dat        => wg_out_dat,
+    out_val        => OPEN
   );
 
   -- Complex mult
   gen_complex_mult: FOR I IN 0 TO c_sdp_S_pn-1 GENERATE
     u_common_complex_mult : ENTITY common_mult_lib.common_complex_mult
     GENERIC MAP (
-      g_in_a_w           => c_halfword_w,
+      g_in_a_w           => c_halfword_w,  -- = c_sdp_W_local_oscillator = 16
       g_in_b_w           => c_sdp_W_adc,
       g_out_p_w          => c_halfword_w + c_sdp_W_adc,
       g_conjugate_b      => FALSE
@@ -342,26 +359,27 @@ BEGIN
     GENERIC MAP (               
       g_complex             => TRUE,  
       g_representation      => "SIGNED",           
-      g_lsb_w               => c_sdp_W_fsub_wg_fraction,
+      g_lsb_w               => c_sdp_W_local_oscillator_fraction,
       g_lsb_round           => TRUE,       
       g_lsb_round_clip      => FALSE,      
       g_msb_clip            => TRUE,      
       g_msb_clip_symmetric  => FALSE,      
-      g_in_dat_w            => c_halfword_w + c_sdp_W_adc,                                                                                               
+      g_pipeline_remove_lsb => 0,
+      g_pipeline_remove_msb => 0,
+      g_in_dat_w            => c_halfword_w + c_sdp_W_adc,
       g_out_dat_w           => c_sdp_W_adc                                                                                              
     )
     PORT MAP (
       rst          => dp_rst, 
       clk          => dp_clk,
       -- ST sink
-      snk_in       => complex_mult_src_out_arr(I), 
+      snk_in       => complex_mult_src_out_arr(I),
       -- ST source
-      src_out      => requantize_src_out_arr(I) 
+      src_out      => requantize_src_out_arr(I)
     );
- 
   END GENERATE;
 
-  -- Pipeline to compensate for complex mult.
+  -- Pipeline to compensate for complex mult and dp_requantize.
   u_dp_pipeline : ENTITY dp_lib.dp_pipeline
   GENERIC MAP (
     g_pipeline   => c_complex_mult_pipeline  
@@ -375,7 +393,7 @@ BEGIN
     src_out      => si_sosi_0_piped
   );
 
-    -- pipeline bsn restart signal to keep dp_bsn_source_restart aligned with si_sosi_arr
+  -- pipeline bsn restart signal to keep dp_bsn_source_restart aligned with si_sosi_arr
   u_common_pipeline_sl_cplx : ENTITY common_lib.common_pipeline_sl
   GENERIC MAP (
     g_pipeline  => c_complex_mult_pipeline
@@ -499,9 +517,6 @@ BEGIN
       src_out_arr  => subband_equalizer_in_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0)
     );
 
-  -- Output PFB streams
-  pfb_sosi_arr <= subband_equalizer_in_sosi_arr;
-
   ---------------------------------------------------------------
   -- COMBINE MEMORY MAPPED INTERFACES OF RAM_FIL_COEFS
   ---------------------------------------------------------------
@@ -529,8 +544,8 @@ BEGIN
       dp_clk         => dp_clk,
       dp_rst         => dp_rst,
 
-      in_sosi_arr    => subband_equalizer_in_sosi_arr,
-      out_sosi_arr   => subband_equalizer_out_sosi_arr,
+      in_raw_sosi_arr  => subband_equalizer_in_sosi_arr,
+      out_raw_sosi_arr => subband_equalizer_out_sosi_arr,
   
       mm_rst         => mm_rst,
       mm_clk         => mm_clk,
@@ -566,6 +581,41 @@ BEGIN
       selector_en    => selector_en
     );
  
+  ---------------------------------------------------------------
+  -- SIGNAL SCOPE
+  ---------------------------------------------------------------
+  -- synthesis translate_off
+  u_sdp_scope_equalizer_in : ENTITY work.sdp_scope
+    GENERIC MAP (
+      g_sim            => g_sim,
+      g_selection      => g_scope_selected_subband,
+      g_nof_input      => c_sdp_R_os * c_sdp_P_pfb,
+      g_n_deinterleave => c_sdp_Q_fft,
+      g_dat_w          => c_sdp_W_subband
+    )
+    PORT MAP (
+      clk            => dp_clk,
+      rst            => dp_rst,
+      sp_sosi_arr    => subband_equalizer_in_sosi_arr,
+      scope_sosi_arr => scope_equalizer_in_sosi_arr
+    );
+
+  u_sdp_scope_equalizer_out : ENTITY work.sdp_scope
+    GENERIC MAP (
+      g_sim            => g_sim,
+      g_selection      => g_scope_selected_subband,
+      g_nof_input      => c_sdp_R_os * c_sdp_P_pfb,
+      g_n_deinterleave => c_sdp_Q_fft,
+      g_dat_w          => c_sdp_W_subband
+    )
+    PORT MAP (
+      clk            => dp_clk,
+      rst            => dp_rst,
+      sp_sosi_arr    => subband_equalizer_out_sosi_arr,
+      scope_sosi_arr => scope_equalizer_out_sosi_arr
+    );
+  -- synthesis translate_on
+
   ---------------------------------------------------------------
   -- SUBBAND STATISTICS
   ---------------------------------------------------------------
@@ -626,28 +676,10 @@ BEGIN
     mux_miso        => master_mem_mux_miso
   );
   
-  ---------------------------------------------------------------
-  -- SIGNAL SCOPE
-  ---------------------------------------------------------------
-  u_sdp_scope : ENTITY work.sdp_scope
-    GENERIC MAP (
-      g_sim            => g_sim,
-      g_selection      => g_scope_selected_subband,
-      g_nof_input      => c_sdp_R_os * c_sdp_P_pfb,
-      g_n_deinterleave => c_sdp_Q_fft,
-      g_dat_w          => c_sdp_W_subband
-    )
-    PORT MAP (
-      clk            => dp_clk,
-      rst            => dp_rst,
-      sp_sosi_arr    => subband_equalizer_out_sosi_arr,
-      scope_sosi_arr => scope_sosi_arr
-    );
-
   ---------------------------------------------------------------
   -- STATISTICS OFFLOAD
   ---------------------------------------------------------------
-  weighted_subbands_flag <= NOT selector_en;
+  weighted_subbands_flag <= NOT selector_en WHEN rising_edge(dp_clk);
 
   u_sdp_sst_udp_offload: ENTITY work.sdp_statistics_offload
   GENERIC MAP (
-- 
GitLab