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 c5e3babf49bcb77568dc796923ab222233061423..bec60072a6ac16140d3fcd74bb33d0a8cdfc6a99 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 @@ -107,7 +107,10 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS NATURAL'IMAGE(c_sdp_W_sub_weight) & "b" & NATURAL'IMAGE(c_sdp_W_sub_weight_fraction) & "f_unit"; - -- Use quantized subbands + -- Use quantized subbands, so c_subband_raw_dat_w = 18b. + -- . Maybe later use raw subbands like in node_sdp_filterbank, but for now + -- appling subband weights and bf weights at c_sdp_W_subband = 18b subbands + -- is acceptable. CONSTANT c_subband_raw_dat_w : NATURAL := c_sdp_W_subband; CONSTANT c_subband_raw_fraction_w : NATURAL := 0; @@ -118,11 +121,11 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS 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 = 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, + dat_w => c_nof_complex * c_sdp_W_local_oscillator, nof_dat => c_sdp_R_os * c_sdp_N_fft, init_sl => '0'); @@ -171,18 +174,22 @@ ARCHITECTURE str OF node_sdp_oversampled_filterbank IS SIGNAL wpfb_unit_out_sosi_arr_piped : 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 mixer_complex_mult_src_out_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL mixer_complex_requantize_src_out_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + -- Complex input FFT (from LO mixer) 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)); + -- Remove negative frequencies + SIGNAL wpfb_complex_out_resized_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + + -- Interleave positive frequencies per factor Q_fft = 2, like with output of real input FFT + SIGNAL wpfb_complex_out_fifo_sosi_arr : t_dp_sosi_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL wpfb_complex_out_fifo_siso_arr : t_dp_siso_arr(c_sdp_S_pn-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst); + SIGNAL wpfb_complex_out_resized_sosi_2arr : t_dp_sosi_2arr_2(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => (OTHERS => c_dp_sosi_rst)); + SIGNAL wpfb_complex_out_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); @@ -342,23 +349,23 @@ BEGIN 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, -- = 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_in_a_w => c_sdp_W_local_oscillator, -- = 16 + g_in_b_w => c_sdp_W_adc, -- = 14 + g_out_p_w => c_sdp_W_local_oscillator + c_sdp_W_adc, -- = 16 + 14 = 30 g_conjugate_b => FALSE ) PORT MAP ( clk => dp_clk, clken => '1', rst => dp_rst, - in_ar => wg_out_dat(c_halfword_w-1 DOWNTO 0), - in_ai => wg_out_dat(2 * c_halfword_w-1 DOWNTO c_halfword_w), + in_ar => wg_out_dat(c_sdp_W_local_oscillator-1 DOWNTO 0), + in_ai => wg_out_dat(2 * c_sdp_W_local_oscillator-1 DOWNTO c_sdp_W_local_oscillator), in_br => si_sosi_arr(I).data(c_sdp_W_adc-1 DOWNTO 0), in_bi => (OTHERS => '0'), in_val => si_sosi_arr(I).valid, - out_pr => complex_mult_src_out_arr(I).re(c_halfword_w + c_sdp_W_adc-1 DOWNTO 0), - out_pi => complex_mult_src_out_arr(I).im(c_halfword_w + c_sdp_W_adc-1 DOWNTO 0), - out_val => complex_mult_src_out_arr(I).valid + out_pr => mixer_complex_mult_src_out_arr(I).re(c_sdp_W_local_oscillator + c_sdp_W_adc-1 DOWNTO 0), + out_pi => mixer_complex_mult_src_out_arr(I).im(c_sdp_W_local_oscillator + c_sdp_W_adc-1 DOWNTO 0), + out_val => mixer_complex_mult_src_out_arr(I).valid ); --requantize @@ -373,16 +380,16 @@ BEGIN g_msb_clip_symmetric => FALSE, g_pipeline_remove_lsb => 0, g_pipeline_remove_msb => 0, - g_in_dat_w => c_halfword_w + c_sdp_W_adc, + g_in_dat_w => c_sdp_W_local_oscillator + 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 => mixer_complex_mult_src_out_arr(I), -- ST source - src_out => requantize_src_out_arr(I) + src_out => mixer_complex_requantize_src_out_arr(I) ); END GENERATE; @@ -411,12 +418,12 @@ BEGIN in_dat => dp_bsn_source_restart_pipe, out_dat => dp_bsn_source_restart_pipe_complex ); - PROCESS(requantize_src_out_arr, si_sosi_0_piped) + PROCESS(mixer_complex_requantize_src_out_arr, si_sosi_0_piped) BEGIN FOR I IN 0 TO c_sdp_S_pn-1 LOOP wpfb_unit_complex_in_sosi_arr(I) <= si_sosi_0_piped; - wpfb_unit_complex_in_sosi_arr(I).re <= requantize_src_out_arr(I).re; - wpfb_unit_complex_in_sosi_arr(I).im <= requantize_src_out_arr(I).im; + wpfb_unit_complex_in_sosi_arr(I).re <= mixer_complex_requantize_src_out_arr(I).re; + wpfb_unit_complex_in_sosi_arr(I).im <= mixer_complex_requantize_src_out_arr(I).im; END LOOP; END PROCESS; @@ -461,7 +468,7 @@ BEGIN rst => dp_rst, clk => dp_clk, snk_in => wpfb_unit_complex_out_sosi_arr(I), - src_out => wpfb_unit_out_resized_sosi_arr(I) + src_out => wpfb_complex_out_resized_sosi_arr(I) ); END GENERATE; @@ -479,18 +486,18 @@ BEGIN PORT MAP ( rst => dp_rst, clk => dp_clk, - snk_in => wpfb_unit_out_resized_sosi_arr(I), - src_out => wpfb_fifo_sosi_arr(I), - src_in => wpfb_fifo_siso_arr(I) + snk_in => wpfb_complex_out_resized_sosi_arr(I), + src_out => wpfb_complex_out_fifo_sosi_arr(I), + src_in => wpfb_complex_out_fifo_siso_arr(I) ); END GENERATE; -- rewire 1d array of 1 X S_pn to 2d array of 2 X P_pfb gen_rewire: FOR I IN 0 TO c_sdp_P_pfb-1 GENERATE - wpfb_resized_sosi_2arr(I)(0) <= wpfb_fifo_sosi_arr(2*I); - wpfb_resized_sosi_2arr(I)(1) <= wpfb_fifo_sosi_arr(2*I + 1); - wpfb_fifo_siso_arr(2*I) <= wpfb_resized_siso_2arr(I)(0); - wpfb_fifo_siso_arr(2*I + 1) <= wpfb_resized_siso_2arr(I)(1); + wpfb_complex_out_resized_sosi_2arr(I)(0) <= wpfb_complex_out_fifo_sosi_arr(2*I); + wpfb_complex_out_resized_sosi_2arr(I)(1) <= wpfb_complex_out_fifo_sosi_arr(2*I + 1); + wpfb_complex_out_fifo_siso_arr(2*I) <= wpfb_complex_out_resized_siso_2arr(I)(0); + wpfb_complex_out_fifo_siso_arr(2*I + 1) <= wpfb_complex_out_resized_siso_2arr(I)(1); END GENERATE; -- Interleave 2 to 1 for all S_pn signals. @@ -502,8 +509,8 @@ BEGIN PORT MAP ( rst => dp_rst, clk => dp_clk, - snk_in_arr => wpfb_resized_sosi_2arr(I), - snk_out_arr => wpfb_resized_siso_2arr(I), + snk_in_arr => wpfb_complex_out_resized_sosi_2arr(I), + snk_out_arr => wpfb_complex_out_resized_siso_2arr(I), src_out => subband_equalizer_in_sosi_arr(c_sdp_P_pfb + I) ); END GENERATE;