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.

65 lines
3.0KB

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.numeric_std.ALL;
  4. USE work.FIVEn_DFT_PKG.ALL;
  5. -- purpose : deledate the multiplication and the addition witn the complex
  6. -- exponential Wn to this bloc
  7. ENTITY MULT_BLK_5nDFT IS
  8. GENERIC(
  9. w_in : natural;
  10. w_mult : natural
  11. );
  12. PORT(i_clk : IN std_logic;
  13. i_data_re : IN smpl_out_radix2;
  14. i_data_im : IN smpl_out_radix2;
  15. i_cos : IN smpl_cos_sin_wb;
  16. i_sin : IN smpl_cos_sin_wb;
  17. o_data_re : OUT smpl_out_radix2;
  18. o_data_im : OUT smpl_out_radix2
  19. );
  20. END MULT_BLK_5nDFT;
  21. ARCHITECTURE Mult_Path OF MULT_BLK_5nDFT IS
  22. SIGNAL data_mult_re_cos_signed : smpl_out_signed_radix2; -- intermediate result re*cos
  23. SIGNAL data_mult_im_cos_signed : smpl_out_signed_radix2; -- intermediate result im*cos
  24. SIGNAL data_mult_re_sin_signed : smpl_out_signed_radix2; -- intermediate result im*sin,!i*i=-1!
  25. SIGNAL data_mult_im_sin_signed : smpl_out_signed_radix2; -- intermediate result re*sin
  26. SIGNAL sin_signed : smpl_cos_sin_signed_wb; -- signed input sin
  27. SIGNAL cos_signed : smpl_cos_sin_signed_wb; -- signed input cos
  28. SIGNAL data_re_signed : smpl_out_signed_radix2; -- signed input data im
  29. SIGNAL data_im_signed : smpl_out_signed_radix2; -- signed input data re
  30. BEGIN
  31. -- assign the signed signals before doing any operation
  32. data_re_signed(w_in-1 DOWNTO 0) <= signed(i_data_re(w_in-1 DOWNTO 0));
  33. data_im_signed(w_in-1 DOWNTO 0) <= signed(i_data_im(w_in-1 DOWNTO 0));
  34. cos_signed <= signed(i_cos);
  35. sin_signed <= signed(i_sin);
  36. -- purpose: multiply the real and imag part with the cos ans isin part of the
  37. -- exponential, and add the results of real parts and imag ones together.
  38. -- Needs 2 clock edges to process the whole mult result
  39. -- inputs: signed data(im & re), signed exponential (cos & sin)
  40. -- outputs: o_data_re, o_data_im
  41. mult : PROCESS(i_clk)
  42. BEGIN
  43. IF rising_edge(i_clk) THEN
  44. data_mult_re_cos_signed(w_in+w_mult-1 DOWNTO 0) <= data_re_signed(w_in-1 DOWNTO 0) * cos_signed;
  45. data_mult_im_cos_signed(w_in+w_mult-1 DOWNTO 0) <= data_im_signed(w_in-1 DOWNTO 0) * cos_signed;
  46. data_mult_im_sin_signed(w_in+w_mult-1 DOWNTO 0) <= data_re_signed(w_in-1 DOWNTO 0) * sin_signed;
  47. data_mult_re_sin_signed(w_in+w_mult-1 DOWNTO 0) <= data_im_signed(w_in-1 DOWNTO 0) * sin_signed;
  48. o_data_re(w_in+w_mult DOWNTO 0) <= std_logic_vector(unsigned(signed(data_mult_re_cos_signed(w_in+w_mult-1)&data_mult_re_cos_signed(w_in+w_mult-1 DOWNTO 0)) - signed(data_mult_re_sin_signed(w_in+w_mult-1)&data_mult_re_sin_signed(w_in+w_mult-1 DOWNTO 0))));-- i*i=-1
  49. o_data_im(w_in+w_mult DOWNTO 0) <= std_logic_vector(unsigned(signed(data_mult_im_cos_signed(w_in+w_mult-1)&data_mult_im_cos_signed(w_in+w_mult-1 DOWNTO 0)) + signed(data_mult_im_sin_signed(w_in+w_mult-1)&data_mult_im_sin_signed(w_in+w_mult-1 DOWNTO 0))));
  50. END IF;
  51. END PROCESS;
  52. END Mult_Path;