Files of a 5*2^n VHDL entity using Winograd5 and radix2 implementations
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
5.4KB

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.std_logic_signed.ALL;
  4. USE ieee.numeric_std.ALL;
  5. USE work.FIVEn_DFT_PKG.ALL;
  6. ENTITY radix_2_cell_winograd IS
  7. GENERIC(
  8. w_in : natural
  9. );
  10. PORT(
  11. i_clk : std_logic;
  12. i_cos : smpl_cos_sin_wb;
  13. i_sin : smpl_cos_sin_wb;
  14. i_data1_re : IN smpl_out_radix2;
  15. i_data1_im : IN smpl_out_radix2;
  16. i_data2_re : IN smpl_out_radix2;
  17. i_data2_im : IN smpl_out_radix2;
  18. o_data1_re : OUT smpl_out_radix2;
  19. o_data1_im : OUT smpl_out_radix2;
  20. o_data2_re : OUT smpl_out_radix2;
  21. o_data2_im : OUT smpl_out_radix2
  22. );
  23. END radix_2_cell_winograd;
  24. ARCHITECTURE radix2 OF radix_2_cell_winograd IS
  25. TYPE vect_result_multiply IS ARRAY (0 TO 1) OF std_logic_vector(w_in + cst_w_precision_radix2_coeffs_5ndft-2 DOWNTO 0);
  26. SIGNAL signed_data_im : smpl_out_winograd5_signed_5ndft := (OTHERS => '0');
  27. SIGNAL signed_data_re : smpl_out_winograd5_signed_5ndft := (OTHERS => '0');
  28. SIGNAL multiply_by_2_power_cst_w_precision : std_logic_vector(cst_w_precision_radix2_coeffs_5ndft-3 DOWNTO 0) := (OTHERS => '0');
  29. SIGNAL data_matrix_im : matrix_radix2_cell := (OTHERS => (OTHERS => (OTHERS => '0')));
  30. SIGNAL data_matrix_re : matrix_radix2_cell := (OTHERS => (OTHERS => (OTHERS => '0')));
  31. SIGNAL data_vect_result_mult_re : vect_result_multiply := (OTHERS => (OTHERS => '0'));
  32. SIGNAL data_vect_result_mult_im : vect_result_multiply := (OTHERS => (OTHERS => '0'));
  33. BEGIN
  34. -- assign block inputs and outputs their corresponding matrix columns
  35. data_matrix_re(0)(0) <= i_data1_re;
  36. data_matrix_re(1)(0) <= i_data2_re;
  37. data_matrix_im(0)(0) <= i_data1_im;
  38. data_matrix_im(1)(0) <= i_data2_im;
  39. o_data1_re <= data_matrix_re(0)(3);
  40. o_data2_re <= data_matrix_re(1)(3);
  41. o_data1_im <= data_matrix_im(0)(3);
  42. o_data2_im <= data_matrix_im(1)(3);
  43. --instanciating the MULT_BLK_5nDFT(Mult_Path)
  44. mult_inst1 : ENTITY work.MULT_BLK_5nDFT(Mult_Path)
  45. GENERIC MAP(
  46. w_in => w_in,
  47. w_mult => cst_w_precision_radix2_coeffs_5ndft
  48. )
  49. PORT MAP(i_clk => i_clk,
  50. i_data_re => data_matrix_re(1)(0),
  51. i_data_im => data_matrix_im(1)(0),
  52. i_cos => i_cos,
  53. i_sin => i_sin,
  54. o_data_re => data_matrix_re(1)(2),
  55. o_data_im => data_matrix_im(1)(2)
  56. );
  57. -- purpose: calculating the multiplication and the 2 additions/substractions.
  58. -- The multiplication per 1 in the top of the butterfly is replaced by a
  59. -- shift with 0s towards the MSBs
  60. -- inputs: data_matrix_im(x)(0), data_matrix_re(x)(0)
  61. -- outputs: data_matrix_im(x)(3), data_matrix_re(x)(3)
  62. radix2_structure : PROCESS(i_clk)
  63. BEGIN
  64. IF(rising_edge(i_clk)) THEN
  65. -- mult per 1 (top)
  66. data_matrix_im(0)(1)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0) <= data_matrix_im(0)(0)(w_in-1)&data_matrix_im(0)(0)(w_in-1)&data_matrix_im(0)(0)(w_in-1)&data_matrix_im(0)(0)(w_in-1 DOWNTO 0)&multiply_by_2_power_cst_w_precision;
  67. data_matrix_re(0)(1)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0) <= data_matrix_re(0)(0)(w_in-1)&data_matrix_re(0)(0)(w_in-1)&data_matrix_re(0)(0)(w_in-1)&data_matrix_re(0)(0)(w_in-1 DOWNTO 0)&multiply_by_2_power_cst_w_precision;
  68. data_matrix_im(0)(2) <= data_matrix_im(0)(1);
  69. data_matrix_re(0)(2) <= data_matrix_re(0)(1);
  70. -- mult (down) : see mult_blk instanciation
  71. --add
  72. data_matrix_re(0)(3)(w_in+cst_w_precision_radix2_coeffs_5ndft+1 DOWNTO 0) <= std_logic_vector(unsigned(signed(data_matrix_re(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_re(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))+signed(data_matrix_re(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_re(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))));
  73. data_matrix_re(1)(3)(w_in+cst_w_precision_radix2_coeffs_5ndft+1 DOWNTO 0) <= std_logic_vector(unsigned(signed(data_matrix_re(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_re(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))-signed(data_matrix_re(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_re(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))));
  74. data_matrix_im(0)(3)(w_in+cst_w_precision_radix2_coeffs_5ndft+1 DOWNTO 0) <= std_logic_vector(unsigned(signed(data_matrix_im(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_im(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))+signed(data_matrix_im(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_im(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))));
  75. data_matrix_im(1)(3)(w_in+cst_w_precision_radix2_coeffs_5ndft+1 DOWNTO 0) <= std_logic_vector(unsigned(signed(data_matrix_im(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_im(0)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))-signed(data_matrix_im(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft)&data_matrix_im(1)(2)(w_in+cst_w_precision_radix2_coeffs_5ndft DOWNTO 0))));
  76. END IF;
  77. END PROCESS;
  78. END radix2;