Simulation files of Polyphase Filter in VHDL for FPGA.
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

201 Zeilen
7.3KB

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.numeric_std.ALL;
  4. USE ieee.std_logic_unsigned.ALL;
  5. USE ieee.std_logic_signed.ALL;
  6. PACKAGE POLY_FIR_PKG IS
  7. -- NOTES and PACKAGE INSTRUCTIONS :
  8. -- cst_downsampling_factor must be a multiplier OF cst_nb_samples_adc_in
  9. -- and cst_nb_subfilters/cst_nb_samples_adc_in*cst_downsampling_factor must be an integer
  10. -- with cst_downsampling_factor < or = cst_nb_subfilters.
  11. --
  12. -- INPUT : vector of samples (cst_nb_samples_adc_in samples);
  13. -- OUTPUT : 2D matrix of samples (matrix_fir_data_out(y)(x), with y the
  14. -- subfilter number, and x the xth parallel fir);
  15. --
  16. -- the lower parallel fir, the older result.
  17. FUNCTION log2_sup_integer (number : natural) RETURN natural;
  18. FUNCTION log2_inf_integer (number : natural) RETURN natural;
  19. -- -- CONSTANTS -- --
  20. -- ADC
  21. CONSTANT cst_w_in : natural := 6; -- ADC in bitwidth
  22. CONSTANT cst_nb_samples_adc_in : natural := 80; -- ADC in nb samples
  23. -- FILTER
  24. --coefficients
  25. CONSTANT cst_w_coeff : natural := 8; -- coeffs bitwidth
  26. CONSTANT cst_nb_coeffs_filter_in : natural := 7*20;
  27. CONSTANT cst_log2_sup_nb_coeffs_subfilter_in : natural := 3;
  28. -- FIR
  29. CONSTANT cst_downsampling_factor : natural := 8;
  30. -- POLYPHASE FILTER
  31. CONSTANT cst_nb_subfilters : natural := 20;
  32. -- -- CALCULATIONS -- --
  33. CONSTANT cst_w_out : natural := cst_w_in + cst_w_coeff+cst_log2_sup_nb_coeffs_subfilter_in;
  34. -- SHIFT REG
  35. CONSTANT cst_nb_coeffs_subfilter_in : natural := cst_nb_coeffs_filter_in/cst_nb_subfilters;
  36. CONSTANT cst_nb_samples_shiftreg_temp_in : natural := cst_nb_coeffs_subfilter_in + cst_nb_samples_adc_in/cst_downsampling_factor;
  37. -- mult
  38. CONSTANT cst_w_mult_out : natural := cst_w_coeff+cst_w_in;
  39. -- adder
  40. CONSTANT cst_log2_adder_stages : natural := cst_log2_sup_nb_coeffs_subfilter_in;
  41. -- fir
  42. CONSTANT cst_w_fir_adder_out : natural := cst_w_mult_out+cst_log2_adder_stages;
  43. CONSTANT cst_nb_parallel_firs : natural := cst_nb_samples_adc_in/cst_downsampling_factor;
  44. -- TYPES
  45. -- ADC
  46. SUBTYPE smpl_adc_data_in IS std_logic_vector(cst_w_in-1 DOWNTO 0);
  47. SUBTYPE smpl_fir_data_out IS std_logic_vector(cst_w_out-1 DOWNTO 0);
  48. -- SHIFT REG
  49. TYPE vect_adc_data_out IS ARRAY (0 TO cst_nb_samples_adc_in-1) OF smpl_adc_data_in;
  50. TYPE vect_fir_data_in IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_adc_data_in;
  51. TYPE vect_reg_data IS ARRAY(0 TO cst_nb_samples_shiftreg_temp_in-1) OF smpl_adc_data_in;
  52. TYPE matrix_reg_data IS ARRAY(0 TO cst_nb_subfilters-1) OF vect_reg_data;
  53. TYPE matrix_reg_data_out IS ARRAY(0 TO cst_nb_parallel_firs-1) OF vect_fir_data_in;
  54. TYPE matrix3D_reg_data_out IS ARRAY (0 TO cst_nb_subfilters-1) OF matrix_reg_data_out;
  55. -- FILTER
  56. SUBTYPE smpl_coeff IS std_logic_vector(cst_w_coeff-1 DOWNTO 0);
  57. -- mult
  58. SUBTYPE smpl_mult_data_out IS std_logic_vector(cst_w_mult_out-1 DOWNTO 0);
  59. SUBTYPE smpl_mult_data_out_signed IS signed(cst_w_mult_out-1 DOWNTO 0);
  60. SUBTYPE smpl_coeffs_signed IS signed(cst_w_coeff-1 DOWNTO 0);
  61. SUBTYPE smpl_mult_data_in_signed IS signed(cst_w_in-1 DOWNTO 0);
  62. TYPE vect_polyfir_coeffs_in IS ARRAY (0 TO cst_nb_coeffs_filter_in-1) OF smpl_coeff;
  63. TYPE vect_data_mult_in_signed IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_mult_data_in_signed;
  64. TYPE vect_fir_coeffs_in IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_coeff;
  65. TYPE vect_mult_coeffs_signed IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_coeffs_signed;
  66. TYPE vect_mult_data_out IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_mult_data_out;
  67. TYPE vect_mult_data_out_signed IS ARRAY(0 TO cst_nb_coeffs_subfilter_in-1) OF smpl_mult_data_out_signed;
  68. TYPE matrix_fir_coeffs_in IS ARRAY (0 TO cst_nb_subfilters-1) OF vect_fir_coeffs_in;
  69. -- adder
  70. SUBTYPE smpl_adder_generic IS std_logic_vector(cst_w_fir_adder_out-1 DOWNTO 0);
  71. SUBTYPE smpl_adder_generic_signed IS signed(cst_w_fir_adder_out-1 DOWNTO 0);
  72. TYPE vect_adder_generic IS ARRAY(0 TO 2**(cst_log2_adder_stages)-1) OF smpl_adder_generic;
  73. TYPE vect_adder_generic_signed IS ARRAY(0 TO 2**(cst_log2_adder_stages)-1) OF smpl_adder_generic_signed;
  74. TYPE matrix_adder_generic IS ARRAY(0 TO cst_log2_adder_stages) OF vect_adder_generic;
  75. TYPE matrix_adder_generic_signed IS ARRAY(0 TO cst_log2_adder_stages) OF vect_adder_generic_signed;
  76. -- fir
  77. SUBTYPE smpl_fir_adder_data_out IS std_logic_vector(cst_w_fir_adder_out-1 DOWNTO 0);
  78. TYPE vect_fir_adder_data_out IS ARRAY (0 TO cst_nb_parallel_firs-1) OF smpl_fir_adder_data_out;
  79. TYPE vect_fir_data_out IS ARRAY(0 TO cst_nb_parallel_firs-1) OF smpl_fir_data_out;
  80. -- POLYPHASE FILTER
  81. TYPE matrix_fir_data_out IS ARRAY (0 TO cst_nb_subfilters-1) OF vect_fir_data_out;
  82. -- TYPE matrix_coeffs_polyphase_filter IS array(0 to cst_nb_subfilters) OF vect_mult_coeffs;
  83. END;
  84. PACKAGE BODY POLY_FIR_PKG IS
  85. --functions
  86. FUNCTION log2_sup_integer (number : natural) RETURN natural IS
  87. VARIABLE result : natural;
  88. BEGIN
  89. IF(number <= 1) THEN
  90. result := 0;
  91. ELSIF(number = 2) THEN
  92. result := 1;
  93. ELSIF(number > 2 AND number <= 4) THEN
  94. result := 2;
  95. ELSIF(number > 4 AND number <= 8) THEN
  96. result := 3;
  97. ELSIF(number > 8 AND number <= 16) THEN
  98. result := 4;
  99. ELSIF(number > 16 AND number <= 32) THEN
  100. result := 5;
  101. ELSIF(number > 32 AND number <= 64) THEN
  102. result := 6;
  103. ELSIF(number > 64 AND number <= 128) THEN
  104. result := 7;
  105. ELSIF(number > 128 AND number <= 256) THEN
  106. result := 8;
  107. ELSIF(number > 256 AND number <= 512) THEN
  108. result := 9;
  109. ELSIF(number > 512 AND number <= 1024) THEN
  110. result := 10;
  111. ELSIF(number > 1024 AND number <= 2048) THEN
  112. result := 11;
  113. ELSIF(number > 2048 AND number <= 4096) THEN
  114. result := 12;
  115. ELSIF(number > 4096 AND number <= 8192) THEN
  116. result := 13;
  117. ELSIF(number > 8192 AND number <= 16384) THEN
  118. result := 14;
  119. ELSIF(number > 16384 AND number <= 32768) THEN
  120. result := 15;
  121. END IF;
  122. RETURN result;
  123. END FUNCTION;
  124. FUNCTION log2_inf_integer (number : natural) RETURN natural IS
  125. VARIABLE result : natural;
  126. BEGIN
  127. IF(number < 2) THEN
  128. result := 0;
  129. ELSIF(number >= 2 AND number < 4) THEN
  130. result := 1;
  131. ELSIF(number >= 4 AND number < 8) THEN
  132. result := 2;
  133. ELSIF(number >= 8 AND number < 16) THEN
  134. result := 3;
  135. ELSIF(number >= 16 AND number < 32) THEN
  136. result := 4;
  137. ELSIF(number >= 32 AND number < 64) THEN
  138. result := 5;
  139. ELSIF(number >= 64 AND number < 128) THEN
  140. result := 6;
  141. ELSIF(number >= 128 AND number < 256) THEN
  142. result := 7;
  143. ELSIF(number >= 256 AND number < 512) THEN
  144. result := 8;
  145. ELSIF(number >= 512 AND number < 1024) THEN
  146. result := 9;
  147. ELSIF(number >= 1024 AND number < 2048) THEN
  148. result := 10;
  149. ELSIF(number >= 2048 AND number < 4096) THEN
  150. Result := 11;
  151. ELSIF(Number >= 4096 AND number < 8192) THEN
  152. result := 12;
  153. ELSIF(number >= 8192 AND number < 16384) THEN
  154. result := 13;
  155. ELSIF(number >= 16384 AND number < 32768) THEN
  156. result := 14;
  157. END IF;
  158. RETURN result;
  159. END FUNCTION;
  160. END PACKAGE BODY;