diff --git a/libraries/dsp/wpfb/src/vhdl/wpfb_pkg.vhd b/libraries/dsp/wpfb/src/vhdl/wpfb_pkg.vhd index 259ec63ffec10d5799f54d9d57273b586ca6e4cd..c986ec0db7a32f5e3768f1f6a913fabd6eb0980c 100644 --- a/libraries/dsp/wpfb/src/vhdl/wpfb_pkg.vhd +++ b/libraries/dsp/wpfb/src/vhdl/wpfb_pkg.vhd @@ -89,9 +89,30 @@ package wpfb_pkg is 8, 0, 8, 16, 9, true, false, false, 16, 16, 0, c_dsp_mult_w, 2, true, 56, 2, c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline); - + + -- Estimate maximum number of blocks of latency between WPFB input and output + function func_wpfb_maximum_sop_latency(wpfb : t_wpfb) return natural; + end package wpfb_pkg; package body wpfb_pkg is + + function func_wpfb_maximum_sop_latency(wpfb : t_wpfb) return natural is + constant c_nof_channels : natural := 2**wpfb.nof_chan; + constant c_block_size : natural := c_nof_channels * wpfb.nof_points / wpfb.wb_factor; + constant c_block_dly : natural := 10; + begin + -- The prefilter, pipelined FFT, pipelined reorder and the wideband separate reorder + -- cause block latency. + -- The parallel FFT has no block latency. + -- The parallel FFT reorder is merely a rewiring and causes no latency. + -- ==> This yields maximim 4 block latency + -- ==> Add one extra block latency to round up + -- Each block in the Wideband FFT also introduces about c_block_dly clock cycles of + -- pipeline latency. + -- ==> This yields maximum ( 5 * c_block_dly ) / c_block_size of block latency + return 4 + 1 + (5 * c_block_dly) / c_block_size; + end func_wpfb_maximum_sop_latency; + end wpfb_pkg;