From 8510093607e3bb0beeda471edd438e7348bfe030 Mon Sep 17 00:00:00 2001 From: Pepping <pepping> Date: Tue, 22 Sep 2015 10:11:45 +0000 Subject: [PATCH] Added generic for bypassing the prefilter. --- libraries/dsp/wpfb/src/vhdl/wpfb_unit.vhd | 340 +++++++++++----------- 1 file changed, 174 insertions(+), 166 deletions(-) diff --git a/libraries/dsp/wpfb/src/vhdl/wpfb_unit.vhd b/libraries/dsp/wpfb/src/vhdl/wpfb_unit.vhd index 75a096884b..3d063df0b3 100644 --- a/libraries/dsp/wpfb/src/vhdl/wpfb_unit.vhd +++ b/libraries/dsp/wpfb/src/vhdl/wpfb_unit.vhd @@ -20,170 +20,171 @@ -- along with this program. If not, see <http://www.gnu.org/licenses/>. -- -------------------------------------------------------------------------------- --- Purpose: Wideband FFT with Subband Statistics and streaming interfaces. +-- Purpose: Wideband FFT with Subband Statistics and streaming interfaces. -- -- Description: This unit connects an incoming array of streaming interfaces --- to the wideband fft. The output of the wideband fft is +-- to the wideband fft. The output of the wideband fft is -- connected to a set of subband statistics units. The statistics --- can be read via the memory mapped interface. +-- can be read via the memory mapped interface. -- A control unit takes care of the correct composition of the -- output streams(sop,eop,sync,bsn,err). -- --- Remarks: . The unit can handle only one sync at a time. Therfor the +-- Remarks: . The unit can handle only one sync at a time. Therfor the -- sync interval should be larger than the total pipeline --- stages of the wideband fft. +-- stages of the wideband fft. -- -- . The g_coefs_file_prefix points to the location where the files -- with the initial content for the coefficients memories are located. -- These files can be created using the python script: create_mifs.py --- create_mifs.py is located in $UNB/Firmware/dsp/filter/src/python/ --- It is possible to create the mif files based on every possible +-- create_mifs.py is located in $UNB/Firmware/dsp/filter/src/python/ +-- It is possible to create the mif files based on every possible -- configuration of the filterbank in terms of: -- * wb_factor -- * nof points --- * nof_taps +-- * nof_taps -- . The wbfb unit can handle a wideband factor > 1 (g_wpfb.wb_factor) or --- a narrowband factor > 1 (g_wpfb.nof_chan). Both factors can NOT be --- used at the same time. +-- a narrowband factor > 1 (g_wpfb.nof_chan). Both factors can NOT be +-- used at the same time. library ieee, common_lib, dp_lib, rTwoSDF_lib, st_lib, filter_lib, fft_lib, diag_lib; use IEEE.std_logic_1164.all; use STD.textio.all; use common_lib.common_pkg.all; use common_lib.common_mem_pkg.all; -use dp_lib.dp_stream_pkg.ALL; +use dp_lib.dp_stream_pkg.ALL; use rTwoSDF_lib.rTwoSDFPkg.all; -use st_lib.all; +use st_lib.all; use filter_lib.all; use filter_lib.fil_pkg.all; use fft_lib.all; -use fft_lib.fft_pkg.all; +use fft_lib.fft_pkg.all; use work.wpfb_pkg.all; entity wpfb_unit is generic ( g_wpfb : t_wpfb := c_wpfb; - g_stats_ena : boolean := TRUE; -- Enables the statistics unit + g_use_prefilter : boolean := TRUE; + g_stats_ena : boolean := TRUE; -- Enables the statistics unit g_use_bg : boolean := FALSE; g_file_index_arr : t_nat_natural_arr := array_init(0, 128, 1); - g_coefs_file_prefix : string := "../../../../filter/build/data/coefs_wide" -- File prefix for the coefficients files. + g_coefs_file_prefix : string := "../../../../filter/build/data/coefs_wide" -- File prefix for the coefficients files. ); port ( dp_rst : in std_logic := '0'; - dp_clk : in std_logic; + dp_clk : in std_logic; mm_rst : in std_logic; mm_clk : in std_logic; - ram_fil_coefs_mosi : in t_mem_mosi; + ram_fil_coefs_mosi : in t_mem_mosi; ram_fil_coefs_miso : out t_mem_miso := c_mem_miso_rst; ram_st_sst_mosi : in t_mem_mosi; -- Subband statistics registers - ram_st_sst_miso : out t_mem_miso := c_mem_miso_rst; - reg_bg_ctrl_mosi : in t_mem_mosi; - reg_bg_ctrl_miso : out t_mem_miso; - ram_bg_data_mosi : in t_mem_mosi; - ram_bg_data_miso : out t_mem_miso; - in_sosi_arr : in t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - out_sosi_arr : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) + ram_st_sst_miso : out t_mem_miso := c_mem_miso_rst; + reg_bg_ctrl_mosi : in t_mem_mosi; + reg_bg_ctrl_miso : out t_mem_miso; + ram_bg_data_mosi : in t_mem_mosi; + ram_bg_data_miso : out t_mem_miso; + in_sosi_arr : in t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); + out_sosi_arr : out t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) ); end entity wpfb_unit; architecture str of wpfb_unit is - - constant c_nof_stats : natural := g_wpfb.nof_points/g_wpfb.wb_factor; - - constant c_fil_ppf : t_fil_ppf := (g_wpfb.wb_factor, + + constant c_nof_stats : natural := 2**g_wpfb.nof_chan * g_wpfb.nof_points/g_wpfb.wb_factor; + + constant c_fil_ppf : t_fil_ppf := (g_wpfb.wb_factor, g_wpfb.nof_chan, - g_wpfb.nof_points, + g_wpfb.nof_points, g_wpfb.nof_taps, c_nof_complex*g_wpfb.nof_wb_streams, -- Complex FFT always requires 2 filter streams: real and imaginary - g_wpfb.fil_in_dat_w, - g_wpfb.fil_out_dat_w, - g_wpfb.coef_dat_w); + g_wpfb.fil_in_dat_w, + g_wpfb.fil_out_dat_w, + g_wpfb.coef_dat_w); constant c_fft : t_fft := (g_wpfb.use_reorder, g_wpfb.use_separate, g_wpfb.nof_chan, g_wpfb.wb_factor, 0, - g_wpfb.nof_points, - g_wpfb.fft_in_dat_w, - g_wpfb.fft_out_dat_w, - g_wpfb.stage_dat_w, + g_wpfb.nof_points, + g_wpfb.fft_in_dat_w, + g_wpfb.fft_out_dat_w, + g_wpfb.stage_dat_w, g_wpfb.guard_w, - g_wpfb.guard_enable, - g_wpfb.stat_data_w, - g_wpfb.stat_data_sz); - - + g_wpfb.guard_enable, + g_wpfb.stat_data_w, + g_wpfb.stat_data_sz); + + constant c_bg_buf_adr_w : natural := ceil_log2(g_wpfb.nof_points/g_wpfb.wb_factor); constant c_bg_data_file_index_arr : t_nat_natural_arr := array_init(0, 4, 1); - constant c_bg_data_file_prefix : string := "UNUSED"; - - -- Constants for the configuration of the requantizers between the filter and the fft. - constant c_prod_w : positive := g_wpfb.fil_in_dat_w + g_wpfb.coef_dat_w; - constant c_add_bit_growth : natural := ceil_log2(g_wpfb.nof_taps); - constant c_sum_w : positive := c_prod_w + c_add_bit_growth; + constant c_bg_data_file_prefix : string := "UNUSED"; + + -- Constants for the configuration of the requantizers between the filter and the fft. + constant c_prod_w : positive := g_wpfb.fil_in_dat_w + g_wpfb.coef_dat_w; + constant c_add_bit_growth : natural := ceil_log2(g_wpfb.nof_taps); + constant c_sum_w : positive := c_prod_w + c_add_bit_growth; constant c_requant_lsb_w : natural := c_sum_w - g_wpfb.fil_out_dat_w - c_add_bit_growth; - - signal ram_st_sst_mosi_arr : t_mem_mosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal ram_st_sst_miso_arr : t_mem_miso_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_mem_miso_rst); - + + signal ram_st_sst_mosi_arr : t_mem_mosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); + signal ram_st_sst_miso_arr : t_mem_miso_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_mem_miso_rst); + signal fil_in_arr : t_fil_slv_arr(c_nof_complex*g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); signal fil_out_arr : t_fil_slv_arr(c_nof_complex*g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal fil_out_val : std_logic; - + signal fil_out_val : std_logic; + signal fft_in_re_arr : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); signal fft_in_im_arr : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal fft_in_val : std_logic; + signal fft_in_val : std_logic; signal fft_out_re_arr_i : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal fft_out_im_arr_i : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); + signal fft_out_im_arr_i : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); signal fft_out_re_arr : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal fft_out_im_arr : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); - signal fft_out_val : std_logic_vector(g_wpfb.nof_wb_streams-1 downto 0); - - signal fft_out_sosi_arr : t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_dp_sosi_rst); - signal bg_siso_arr : t_dp_siso_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_dp_siso_rdy); - + signal fft_out_im_arr : t_fft_slv_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); + signal fft_out_val : std_logic_vector(g_wpfb.nof_wb_streams-1 downto 0); + + signal fft_out_sosi_arr : t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_dp_sosi_rst); + signal bg_siso_arr : t_dp_siso_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0) := (others => c_dp_siso_rdy); + type reg_type is record - in_sosi_arr : t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); + in_sosi_arr : t_dp_sosi_arr(g_wpfb.nof_wb_streams*g_wpfb.wb_factor-1 downto 0); end record; signal r, rin : reg_type; - -begin - + +begin + --------------------------------------------------------------- - -- CHECK IF PROVIDED GENERICS ARE ALLOWED. + -- CHECK IF PROVIDED GENERICS ARE ALLOWED. --------------------------------------------------------------- assert not(g_wpfb.nof_chan /= 0 and g_wpfb.wb_factor /= 1 and rising_edge(dp_clk)) report "nof_chan must be 0 when wb_factor > 1" severity FAILURE; - + --------------------------------------------------------------- -- INPUT REGISTER FOR THE SOSI ARRAY --------------------------------------------------------------- - -- The complete input sosi arry is registered. + -- The complete input sosi arry is registered. comb : process(r, in_sosi_arr) variable v : reg_type; begin v := r; - v.in_sosi_arr := in_sosi_arr; - rin <= v; + v.in_sosi_arr := in_sosi_arr; + rin <= v; end process comb; - + regs : process(dp_clk) - begin - if rising_edge(dp_clk) then - r <= rin; - end if; - end process; + begin + if rising_edge(dp_clk) then + r <= rin; + end if; + end process; --------------------------------------------------------------- -- COMBINE MEMORY MAPPED INTERFACES --------------------------------------------------------------- - -- Combine the internal array of mm interfaces for the subband - -- statistics to one array that is connected to the port of the + -- Combine the internal array of mm interfaces for the subband + -- statistics to one array that is connected to the port of the -- fft_wide_unit. u_mem_mux_sst : entity common_lib.common_mem_mux - generic map ( + generic map ( g_nof_mosi => g_wpfb.nof_wb_streams*g_wpfb.wb_factor, g_mult_addr_w => ceil_log2(g_wpfb.stat_data_sz*c_nof_stats) ) @@ -193,21 +194,21 @@ begin mosi_arr => ram_st_sst_mosi_arr, miso_arr => ram_st_sst_miso_arr ); - + gen_pfb : if g_use_bg = FALSE generate --------------------------------------------------------------- -- PREPARE INPUT DATA FOR WIDEBAND POLY PHASE FILTER --------------------------------------------------------------- - -- Extract the data from the in_sosi_arr records and resize it + -- Extract the data from the in_sosi_arr records and resize it -- to fit the format for the fil_ppf_wide unit. The reordering -- is done in such a way that the filtercoeficients are reused. - -- Note that both the real part and the imaginary part have - -- their own filterchannel. - -- When wb_factor = 4 and nof_wb_streams = 2 the mapping is as - -- follows (S = wb stream number, W = wideband stream number): + -- Note that both the real part and the imaginary part have + -- their own filterchannel. + -- When wb_factor = 4 and nof_wb_streams = 2 the mapping is as + -- follows (S = wb stream number, W = wideband stream number): -- - -- in_sosi_arr | fil_in_arr | fft_in_re_arr | fft_in_im_arr - -- S W | S W | S W | S W + -- in_sosi_arr | fil_in_arr | fft_in_re_arr | fft_in_im_arr + -- S W | S W | S W | S W -- 0 0 0 | 0 0 0 RE |0 0 0 0 RE |1 0 0 0 IM -- 1 0 1 | 1 0 0 IM |4 1 0 1 RE |5 1 0 1 IM -- 2 0 2 | 2 1 0 RE |8 2 0 2 RE |9 2 0 2 IM @@ -216,14 +217,14 @@ begin -- 5 1 1 | 5 0 1 IM |6 5 1 1 RE |7 5 1 1 IM -- 6 1 2 | 6 1 1 RE |10 6 1 2 RE |11 6 1 2 IM -- 7 1 3 | 7 1 1 IM |14 7 1 3 RE |15 7 1 3 IM - -- | 8 0 2 RE | | - -- | 9 0 2 IM | | - -- | 10 1 2 RE | | - -- | 11 1 2 IM | | - -- | 12 0 3 RE | | - -- | 13 0 3 IM | | - -- | 14 1 3 RE | | - -- | 15 1 3 IM | | + -- | 8 0 2 RE | | + -- | 9 0 2 IM | | + -- | 10 1 2 RE | | + -- | 11 1 2 IM | | + -- | 12 0 3 RE | | + -- | 13 0 3 IM | | + -- | 14 1 3 RE | | + -- | 15 1 3 IM | | -- gen_prep_filter_wb_factor: for I in 0 to g_wpfb.wb_factor-1 generate gen_prep_filter_streams: for J in 0 to g_wpfb.nof_wb_streams-1 generate @@ -233,35 +234,42 @@ begin end generate; --------------------------------------------------------------- - -- THE POLY PHASE FILTER + -- THE POLY PHASE FILTER --------------------------------------------------------------- - u_filter : entity filter_lib.fil_ppf_wide - generic map ( - g_fil_ppf => c_fil_ppf, - g_fil_ppf_pipeline => g_wpfb.fil_pipeline, - g_file_index_arr => g_file_index_arr, - g_coefs_file_prefix => g_coefs_file_prefix - ) - port map ( - dp_clk => dp_clk, - dp_rst => dp_rst, - mm_clk => mm_clk, - mm_rst => mm_rst, - ram_coefs_mosi => ram_fil_coefs_mosi, - ram_coefs_miso => ram_fil_coefs_miso, - in_dat_arr => fil_in_arr, - in_val => r.in_sosi_arr(0).valid, - out_dat_arr => fil_out_arr, - out_val => fil_out_val - ); + gen_prefilter : IF g_use_prefilter = TRUE generate + u_filter : entity filter_lib.fil_ppf_wide + generic map ( + g_fil_ppf => c_fil_ppf, + g_fil_ppf_pipeline => g_wpfb.fil_pipeline, + g_file_index_arr => g_file_index_arr, + g_coefs_file_prefix => g_coefs_file_prefix + ) + port map ( + dp_clk => dp_clk, + dp_rst => dp_rst, + mm_clk => mm_clk, + mm_rst => mm_rst, + ram_coefs_mosi => ram_fil_coefs_mosi, + ram_coefs_miso => ram_fil_coefs_miso, + in_dat_arr => fil_in_arr, + in_val => r.in_sosi_arr(0).valid, + out_dat_arr => fil_out_arr, + out_val => fil_out_val + ); + end generate; + + -- Bypass filter + gen_no_prefilter : if g_use_prefilter = FALSE generate + fil_out_arr <= fil_in_arr; + fil_out_val <= r.in_sosi_arr(0).valid; + end generate; + + fft_in_val <= fil_out_val; - fft_in_val <= fil_out_val; - - --------------------------------------------------------------- -- THE WIDEBAND FFT - --------------------------------------------------------------- - gen_wide_band_fft: if g_wpfb.wb_factor > 1 generate + --------------------------------------------------------------- + gen_wide_band_fft: if g_wpfb.wb_factor > 1 generate --------------------------------------------------------------- -- PREPARE INPUT DATA FOR WIDEBAND FFT --------------------------------------------------------------- @@ -278,7 +286,7 @@ begin generic map( g_fft => c_fft, -- generics for the WFFT g_pft_pipeline => g_wpfb.pft_pipeline, - g_fft_pipeline => g_wpfb.fft_pipeline + g_fft_pipeline => g_wpfb.fft_pipeline ) port map( clk => dp_clk, @@ -289,14 +297,14 @@ begin out_re_arr => fft_out_re_arr((I+1)*g_wpfb.wb_factor-1 downto I*g_wpfb.wb_factor), out_im_arr => fft_out_im_arr((I+1)*g_wpfb.wb_factor-1 downto I*g_wpfb.wb_factor), out_val => fft_out_val(I) - ); - end generate; - end generate; + ); + end generate; + end generate; - --------------------------------------------------------------- + --------------------------------------------------------------- -- THE PIPELINED FFT - --------------------------------------------------------------- - gen_pipeline_fft: if g_wpfb.wb_factor = 1 generate + --------------------------------------------------------------- + gen_pipeline_fft: if g_wpfb.wb_factor = 1 generate --------------------------------------------------------------- -- PREPARE INPUT DATA FOR WIDEBAND FFT --------------------------------------------------------------- @@ -304,12 +312,12 @@ begin fft_in_re_arr(I) <= fil_out_arr(I*c_nof_complex); fft_in_im_arr(I) <= fil_out_arr(I*c_nof_complex+1); end generate; - + gen_prep_pipe_fft_streams: for I in 0 to g_wpfb.nof_wb_streams-1 generate u_fft_pipe : entity fft_lib.fft_r2_pipe generic map( - g_fft => c_fft, - g_pipeline => g_wpfb.fft_pipeline + g_fft => c_fft, + g_pipeline => g_wpfb.fft_pipeline ) port map( clk => dp_clk, @@ -320,17 +328,17 @@ begin out_re => fft_out_re_arr_i(I)(c_fft.out_dat_w-1 downto 0), out_im => fft_out_im_arr_i(I)(c_fft.out_dat_w-1 downto 0), out_val => fft_out_val(I) - ); - fft_out_re_arr(I) <= RESIZE_SVEC(fft_out_re_arr_i(I)(c_fft.out_dat_w-1 downto 0), fft_out_re_arr(I)'length); - fft_out_im_arr(I) <= RESIZE_SVEC(fft_out_im_arr_i(I)(c_fft.out_dat_w-1 downto 0), fft_out_im_arr(I)'length); - end generate; - end generate; - + ); + fft_out_re_arr(I) <= RESIZE_SVEC(fft_out_re_arr_i(I)(c_fft.out_dat_w-1 downto 0), fft_out_re_arr(I)'length); + fft_out_im_arr(I) <= RESIZE_SVEC(fft_out_im_arr_i(I)(c_fft.out_dat_w-1 downto 0), fft_out_im_arr(I)'length); + end generate; + end generate; + --------------------------------------------------------------- -- FFT CONTROL UNIT --------------------------------------------------------------- -- The fft control unit composes the output array in the dp- - -- streaming format. + -- streaming format. u_fft_control : entity fft_lib.fft_wide_unit_control generic map ( g_fft => c_fft, @@ -339,18 +347,18 @@ begin port map( rst => dp_rst, clk => dp_clk, - in_re_arr => fft_out_re_arr, - in_im_arr => fft_out_im_arr, - in_val => fft_out_val(0), - ctrl_sosi => r.in_sosi_arr(0), + in_re_arr => fft_out_re_arr, + in_im_arr => fft_out_im_arr, + in_val => fft_out_val(0), + ctrl_sosi => r.in_sosi_arr(0), out_sosi_arr => fft_out_sosi_arr ); - - end generate; - + + end generate; + ---------------------------------------------------------------------------- -- Source: block generator - ---------------------------------------------------------------------------- + ---------------------------------------------------------------------------- gen_bg : if g_use_bg = TRUE generate u_bg : entity diag_lib.mms_diag_block_gen generic map( @@ -376,47 +384,47 @@ begin out_siso_arr => bg_siso_arr, out_sosi_arr => fft_out_sosi_arr ); - end generate; - + end generate; + --------------------------------------------------------------- - -- SUBBAND STATISTICS + -- SUBBAND STATISTICS --------------------------------------------------------------- - -- For all "wb_factor"x"nof_wb_streams" output streams of the - -- wideband FFT a subband statistics unit is placed if the - -- g_stats_ena is TRUE. + -- For all "wb_factor"x"nof_wb_streams" output streams of the + -- wideband FFT a subband statistics unit is placed if the + -- g_stats_ena is TRUE. -- Since the subband statistics module uses embedded DSP blocks - -- for multiplication, the incoming data cannot be wider + -- for multiplication, the incoming data cannot be wider -- than 18 bit. - gen_stats : if g_stats_ena = TRUE generate + gen_stats : if g_stats_ena = TRUE generate gen_stats_streams: for I in 0 to g_wpfb.nof_wb_streams-1 generate gen_stats_wb_factor: for J in 0 to g_wpfb.wb_factor-1 generate u_subband_stats : entity st_lib.st_sst generic map( - g_nof_stat => c_nof_stats, + g_nof_stat => c_nof_stats, g_in_data_w => g_wpfb.fft_out_dat_w, - g_stat_data_w => g_wpfb.stat_data_w, + g_stat_data_w => g_wpfb.stat_data_w, g_stat_data_sz => g_wpfb.stat_data_sz ) port map ( mm_rst => mm_rst, - mm_clk => mm_clk, + mm_clk => mm_clk, dp_rst => dp_rst, dp_clk => dp_clk, in_complex => fft_out_sosi_arr(I*g_wpfb.wb_factor+J), - ram_st_sst_mosi => ram_st_sst_mosi_arr(I*g_wpfb.wb_factor+J), + ram_st_sst_mosi => ram_st_sst_mosi_arr(I*g_wpfb.wb_factor+J), ram_st_sst_miso => ram_st_sst_miso_arr(I*g_wpfb.wb_factor+J) - ); - end generate; - end generate; - end generate; - - -- Connect to the outside world + ); + end generate; + end generate; + end generate; + + -- Connect to the outside world gen_output_streams: for I in 0 to g_wpfb.nof_wb_streams-1 generate gen_output_wb_factor : for J in 0 to g_wpfb.wb_factor-1 generate out_sosi_arr(I*g_wpfb.wb_factor+J) <= fft_out_sosi_arr(I*g_wpfb.wb_factor+J); - end generate; - end generate; - + end generate; + end generate; + end str; -- GitLab