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.

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