VHDL implementation of a polyphase filter bank with polyphase filter and 5ndft
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.8KB

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.numeric_std.ALL;
  4. USE work.PFB_PKG.ALL;
  5. USE work.POLY_FIR_PKG.ALL;
  6. USE work.FIVEn_DFT_PKG.ALL;
  7. ENTITY PFB_blk IS
  8. PORT (
  9. i_clk : IN std_logic;
  10. i_data : IN vect_adc_data_out_pfb;
  11. i_coeffs : IN vect_polyfir_coeffs_in;
  12. o_data : OUT vect_dft_output_pfb);
  13. END ENTITY PFB_blk;
  14. ARCHITECTURE polyfir_dft OF PFB_blk IS
  15. TYPE matrix_polyfir_data_out_transpose IS ARRAY (0 TO cst_nb_parallel_firs_dfts_pfb-1) OF vect_dft_input;
  16. TYPE matrix_dft_output_pfb IS ARRAY (0 TO cst_nb_parallel_firs_dfts_pfb-1) OF vect_dft_output;
  17. SIGNAL input_polyfir_re : vect_adc_data_out := (OTHERS => (OTHERS => '0'));
  18. SIGNAL input_polyfir_im : vect_adc_data_out := (OTHERS => (OTHERS => '0'));
  19. SIGNAL matrix_out_polyfir_re : matrix_fir_data_out := (OTHERS => (OTHERS => (OTHERS => '0')));
  20. SIGNAL matrix_out_polyfir_im : matrix_fir_data_out := (OTHERS => (OTHERS => (OTHERS => '0')));
  21. SIGNAL matrix_out_dft_re : matrix_dft_output_pfb := (OTHERS => (OTHERS => (OTHERS => '0')));
  22. SIGNAL matrix_out_dft_im : matrix_dft_output_pfb := (OTHERS => (OTHERS => (OTHERS => '0')));
  23. SIGNAL matrix_polyfir_out_transpose_re : matrix_polyfir_data_out_transpose := (OTHERS => (OTHERS => ( OTHERS => '0')));
  24. SIGNAL matrix_polyfir_out_transpose_im : matrix_polyfir_data_out_transpose := (OTHERS => (OTHERS => ( OTHERS => '0')));
  25. BEGIN -- ARCHITECTURE polyfir_dft
  26. -- purpose: wiring: placing imaginary and real part in different vectors.
  27. inputs_discriminating_real_imag : FOR i IN 0 TO cst_nb_samples_adc_in_pfb-1 GENERATE
  28. input_polyfir_re(i) <= i_data(2*i);
  29. input_polyfir_im(i) <= i_data(2*i+1);
  30. END GENERATE inputs_discriminating_real_imag;
  31. -- instanciation of 2 polyphase filter (imaginary and real part)
  32. polyfir_blk_re : ENTITY work.poly_fir_blk(polyphase)
  33. PORT MAP(
  34. i_clk => i_clk,
  35. i_coeffs => i_coeffs,
  36. i_data => input_polyfir_re,
  37. o_data => matrix_out_polyfir_re);
  38. polyfir_blk_im : ENTITY work.poly_fir_blk(polyphase)
  39. PORT MAP(
  40. i_clk => i_clk,
  41. i_coeffs => i_coeffs,
  42. i_data => input_polyfir_im,
  43. o_data => matrix_out_polyfir_im);
  44. -- purpose: wiring: transpose the polyfir matrixes
  45. transpose_for: FOR i IN 0 TO cst_nb_parallel_firs_dfts_pfb-1 GENERATE
  46. transpose_data: FOR j IN 0 TO cst_nb_subfilters_pfb-1 GENERATE
  47. matrix_polyfir_out_transpose_re(i)(j) <= matrix_out_polyfir_re(j)(i);
  48. matrix_polyfir_out_transpose_im(i)(j) <= matrix_out_polyfir_im(j)(i);
  49. END GENERATE transpose_data;
  50. END GENERATE transpose_for;
  51. -- instanciation of cst_nb_parallel_firs_dfts_pfb dfts
  52. instanciating_parallel_dfts : FOR i IN 0 TO cst_nb_parallel_firs_dfts_pfb-1 GENERATE
  53. dft_inst : ENTITY work.FFT_tree(instanciating_cells)
  54. GENERIC MAP (
  55. nb_bits_shift_round => cst_nb_bits_shift_round_pfb)
  56. PORT MAP(
  57. i_clk => i_clk,
  58. i_data_re => matrix_polyfir_out_transpose_re(i),
  59. i_data_im => matrix_polyfir_out_transpose_im(i),
  60. o_data_re => matrix_out_dft_re(i),
  61. o_data_im => matrix_out_dft_im(i)
  62. );
  63. END GENERATE instanciating_parallel_dfts;
  64. -- purpose: wiring: placing imaginary part and real part every other sample
  65. fill_vect_output : FOR parallel_dft_nb IN 0 TO cst_nb_parallel_firs_dfts_pfb-1 GENERATE
  66. fill_line_from_matrix : FOR dft_sample_nb IN 0 TO cst_nb_subfilters_pfb-1 GENERATE
  67. o_data(2*dft_sample_nb+parallel_dft_nb*2*cst_nb_subfilters_pfb) <= matrix_out_dft_re(parallel_dft_nb)(dft_sample_nb);
  68. o_data(2*dft_sample_nb+parallel_dft_nb*2*cst_nb_subfilters_pfb +1) <= matrix_out_dft_im(parallel_dft_nb)(dft_sample_nb);
  69. END GENERATE fill_line_from_matrix;
  70. END GENERATE fill_vect_output;
  71. END ARCHITECTURE polyfir_dft;