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

98 lines
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;