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.

poly_shift_reg2.vhd 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE work.POLY_FIR_PKG.ALL;
  4. ENTITY POLY_SHIFT_REG IS
  5. PORT(i_clk : IN std_logic;
  6. i_data : IN vect_adc_data_out;
  7. o_data : OUT matrix3D_reg_data_out
  8. );
  9. END POLY_SHIFT_REG;
  10. ARCHITECTURE Fill_Matrix OF POLY_SHIFT_REG IS
  11. TYPE vect_i_data_temp IS ARRAY (0 TO cst_nb_subfilters-1) OF smpl_adc_data_in;
  12. TYPE matrix_i_data_temp IS ARRAY (0 TO 1) OF vect_i_data_temp;
  13. SIGNAL data_matrix : matrix3D_reg_data_out;
  14. --SIGNAL data_temp : vect_reg_data := (OTHERS =>(OTHERS => '0'));
  15. SIGNAL data_temp : matrix_reg_data := (OTHERS => (OTHERS => (OTHERS => '0')));
  16. --VARIABLE reg_i_data_temp : vect_i_data_temp := (OTHERS => (OTHERS => '0'));
  17. BEGIN
  18. -- purpose: fill a 3D matrix from a register. Each row is the input of the
  19. -- input of a partial filter; each 2D matrix rows-columns is the input for a
  20. -- subfilter
  21. -- inputs: reg_i_data_temp, i_data
  22. -- outputs: data_temp (3D matrix of std_logic_vectors)
  23. PROCESS (i_clk) IS
  24. VARIABLE subfilter_nb : natural := 0;
  25. VARIABLE data_subfilter_nb : natural := 0;
  26. VARIABLE reg_i_data_temp : matrix_i_data_temp;
  27. BEGIN -- PROCESS
  28. IF rising_edge(i_clk) THEN -- rising clock edge
  29. -- shifting the old samples towards data_temp(0)
  30. FOR i IN 0 TO cst_nb_subfilters-1 LOOP
  31. data_temp(i)(0 TO cst_nb_samples_shiftreg_temp_in-cst_nb_parallel_firs-1) <= data_temp(i)(cst_nb_parallel_firs TO cst_nb_samples_shiftreg_temp_in-1);
  32. END LOOP; -- i
  33. -- fill a temp 2D matrix for each subfilter (equivalent to filling a temp
  34. -- vector for 1 filter)
  35. parallel_fir_for : FOR parallel_fir_nb IN 0 TO cst_nb_parallel_firs-1 LOOP
  36. FOR i IN 0 TO cst_nb_subfilters-1 LOOP
  37. reg_i_data_temp(1) := reg_i_data_temp(0);
  38. END LOOP;
  39. fill_previous_content : FOR data_nb IN cst_downsampling_factor TO cst_nb_subfilters-1 LOOP
  40. data_temp(cst_nb_subfilters-1-((cst_downsampling_factor*parallel_fir_nb+data_nb) MOD cst_nb_subfilters))(cst_nb_samples_shiftreg_temp_in-cst_nb_parallel_firs+parallel_fir_nb) <= reg_i_data_temp(1)(cst_nb_subfilters-1-((cst_downsampling_factor*parallel_fir_nb+data_nb) MOD cst_nb_subfilters));
  41. END LOOP fill_previous_content; -- data_nb
  42. fill_data_temp : FOR data_nb IN 0 TO cst_downsampling_factor-1 LOOP -- fill data
  43. data_temp(cst_nb_subfilters-1-((cst_downsampling_factor*parallel_fir_nb+data_nb) MOD cst_nb_subfilters))(cst_nb_samples_shiftreg_temp_in-cst_nb_parallel_firs+parallel_fir_nb) <= i_data(cst_downsampling_factor*parallel_fir_nb+data_nb);
  44. reg_i_data_temp(0)(cst_nb_subfilters-1-((cst_downsampling_factor*parallel_fir_nb+data_nb) MOD cst_nb_subfilters)) := i_data(cst_downsampling_factor*parallel_fir_nb+data_nb);
  45. END LOOP fill_data_temp;
  46. END LOOP parallel_fir_for; -- parallel_fir_nb
  47. o_data <= data_matrix;
  48. END IF;
  49. END PROCESS;
  50. -- purpose: wiring (filling the 3D out matrix) for each line, for each subfilter
  51. third_dimension : FOR subfilter_nb IN 0 TO cst_nb_subfilters-1 GENERATE
  52. second_dimension : FOR parallel_fir IN 0 TO cst_nb_parallel_firs-1 GENERATE
  53. first_dimension : FOR data_nb IN 0 TO cst_nb_coeffs_subfilter_in-1 GENERATE
  54. data_matrix(subfilter_nb)(parallel_fir)(data_nb) <= data_temp(subfilter_nb)(data_nb+parallel_fir);
  55. END GENERATE first_dimension; -- data_nb
  56. END GENERATE second_dimension; -- parallel_fir
  57. END GENERATE third_dimension; -- subfilter_nb
  58. END Fill_Matrix;