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.

143 lines
4.7KB

  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. USE work.simu_pkg.ALL;
  8. USE work.utils.ALL;
  9. LIBRARY std;
  10. USE std.textio.ALL;
  11. USE work.coeff_fir.ALL;
  12. ENTITY pfb_tb IS
  13. GENERIC (
  14. demi_periode : time := 5 ns;
  15. -- duree de la demi periode des horloges
  16. test_e : string := "D:\Stage\ALMA_OPFB\simu\v0.1 - PFB\tb_txts_files\input.txt";
  17. -- fichier test contenant les echantillons d'entree
  18. test_s : string := "D:\Stage\ALMA_OPFB\simu\v0.1 - PFB\tb_txts_files\output.txt"
  19. -- fichier contenant les echantillons de sortie
  20. );
  21. END pfb_tb;
  22. ARCHITECTURE beh OF pfb_tb IS
  23. TYPE verif_vect IS ARRAY (0 TO 2*cst_nb_parallel_firs_dfts_pfb*cst_nb_subfilters_pfb-1) OF integer;
  24. --TYPE partial_input_vect IS ARRAY (0 TO 9) OF smpl_in_5ndft;
  25. --TYPE partial_output_vect IS ARRAY (0 TO 9) OF smpl_in_5ndft;
  26. --TYPE vect_from_matrix_fir_data_out IS ARRAY (0 TO cst_nb_subfilters*cst_nb_parallel_firs-1) OF smpl_fir_data_out;
  27. FILE fichier_e : text IS IN test_e;
  28. FILE fichier_s : text IS IN test_s;
  29. --FILE fichier_c : text IS IN test_c;
  30. SIGNAL initialisation : std_logic;
  31. SIGNAL h : std_logic;
  32. SIGNAL entree_pfb : vect_adc_data_out_pfb := (OTHERS => (OTHERS => '0'));
  33. SIGNAL sortie_pfb : vect_dft_output_pfb := (OTHERS => (OTHERS => '0'));
  34. SIGNAL sortie_pfb_sim : vect_dft_output_pfb := (OTHERS => (OTHERS => '0'));
  35. SIGNAL verif : verif_vect;
  36. BEGIN -- ARCHITECTURE beh
  37. module_simu : ENTITY work.pfb_blk(polyfir_dft)
  38. PORT MAP(h, entree_pfb, fir_coeffs_generated, sortie_pfb_sim);
  39. horloge_entree : horloge(h, demi_periode, demi_periode);
  40. --sortie_dft_sim_process : PROCESS(sortie_dft_sim)
  41. -- VARIABLE mots_lignes : natural := 20;
  42. --BEGIN
  43. ----FOR k IN 0 TO mots_lignes-1 LOOP
  44. ---- FOR j IN 0 TO cst_nb_subfilters-1 LOOP
  45. ---- sortie_fir_sim_vect(k*mots_lignes+j) <= sortie_fir_sim(j)(k);
  46. ---- END LOOP;
  47. ----END LOOP;
  48. --END PROCESS;
  49. source : PROCESS
  50. CONSTANT header : natural := 1; -- nombre de ligne d'en tête
  51. CONSTANT nbr_ech : natural := 800000; -- nombre d'echantillons d'entree dans le fichier test
  52. CONSTANT mots_ligne : natural := 2*cst_nb_samples_adc_in_pfb; -- nombre de mots par ligne dans le ficher
  53. VARIABLE nbr_ligne : natural := 10000; -- nombre de lignes restant à lire dans le fichier
  54. VARIABLE i : natural := 1;
  55. VARIABLE donnee : integer;
  56. VARIABLE tempo : natural := 0;
  57. VARIABLE ligne : line;
  58. VARIABLE head : boolean := false;
  59. BEGIN -- PROCESS source
  60. WAIT UNTIL falling_edge(h);
  61. IF head = true THEN
  62. head := false;
  63. FOR i IN 0 TO header-1 LOOP
  64. readline(fichier_e, ligne);
  65. END LOOP;
  66. END IF;
  67. IF tempo > 0 THEN -- temps de synchro
  68. tempo := tempo -1;
  69. ELSIF nbr_ligne > 0 THEN
  70. readline(fichier_e, ligne);
  71. nbr_ligne := nbr_ligne-1;
  72. FOR k IN 0 TO mots_ligne -1 LOOP
  73. read(ligne, donnee);
  74. entree_pfb(k) <= std_logic_vector(to_signed(donnee, cst_w_in_pfb));
  75. END LOOP; -- k
  76. END IF;
  77. END PROCESS source;
  78. test : PROCESS
  79. CONSTANT header : natural := 1; -- nombre de ligne d'en tête
  80. CONSTANT nbr_ech : natural := 1000000; --nombre d'echantillons d'entree dans le fichier test
  81. CONSTANT mots_ligne : natural := 2*cst_nb_parallel_firs_dfts_pfb*cst_nb_subfilters_pfb; -- nombre de mots par ligne dans le ficher
  82. VARIABLE nbr_ligne : natural := 10000; -- nombre de lignes restant à lire dans le fichier
  83. VARIABLE i : natural;
  84. VARIABLE donnee : donnee_sortie;
  85. VARIABLE ligne : line;
  86. VARIABLE tempo : natural := 17;
  87. VARIABLE sortie : integer;
  88. VARIABLE head : boolean := false;
  89. BEGIN -- PROCESS test
  90. WAIT UNTIL falling_edge(h);
  91. IF tempo > 0 THEN -- temps de synchro
  92. tempo := tempo -1;
  93. ASSERT false REPORT "Attente_2 ... " SEVERITY note;
  94. ELSIF nbr_ligne > 0 THEN
  95. readline(fichier_s, ligne);
  96. nbr_ligne := nbr_ligne-1;
  97. FOR k IN 0 TO mots_ligne-1 LOOP
  98. read(ligne, donnee(k));
  99. sortie := to_integer(signed(sortie_pfb_sim(k)));
  100. sortie_pfb(k) <= std_logic_vector(to_signed(donnee(k), cst_w_out_pfb));
  101. verif(k) <= sortie-donnee(k);
  102. ASSERT verif(k) = 0 REPORT "Valeur dft fausse"
  103. SEVERITY error;
  104. --ASSERT sortie /= donnee(k) REPORT "OK"
  105. -- SEVERITY note;
  106. END LOOP; -- k
  107. END IF;
  108. END PROCESS test;
  109. END ARCHITECTURE beh;