VHDL implementation of a polyphase filter bank with polyphase filter and 5ndft
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

98 lignes
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;