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