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.

65 lignes
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;