LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; USE work.FIVEn_DFT_PKG.ALL; -- purpose : deledate the multiplication and the addition witn the complex -- exponential Wn to this bloc ENTITY MULT_BLK_5nDFT IS GENERIC( w_in : natural; w_mult : natural ); PORT(i_clk : IN std_logic; i_data_re : IN smpl_out_radix2; i_data_im : IN smpl_out_radix2; i_cos : IN smpl_cos_sin_wb; i_sin : IN smpl_cos_sin_wb; o_data_re : OUT smpl_out_radix2; o_data_im : OUT smpl_out_radix2 ); END MULT_BLK_5nDFT; ARCHITECTURE Mult_Path OF MULT_BLK_5nDFT IS SIGNAL data_mult_re_cos_signed : smpl_out_signed_radix2; -- intermediate result re*cos SIGNAL data_mult_im_cos_signed : smpl_out_signed_radix2; -- intermediate result im*cos SIGNAL data_mult_re_sin_signed : smpl_out_signed_radix2; -- intermediate result im*sin,!i*i=-1! SIGNAL data_mult_im_sin_signed : smpl_out_signed_radix2; -- intermediate result re*sin SIGNAL sin_signed : smpl_cos_sin_signed_wb; -- signed input sin SIGNAL cos_signed : smpl_cos_sin_signed_wb; -- signed input cos SIGNAL data_re_signed : smpl_out_signed_radix2; -- signed input data im SIGNAL data_im_signed : smpl_out_signed_radix2; -- signed input data re BEGIN -- assign the signed signals before doing any operation data_re_signed(w_in-1 DOWNTO 0) <= signed(i_data_re(w_in-1 DOWNTO 0)); data_im_signed(w_in-1 DOWNTO 0) <= signed(i_data_im(w_in-1 DOWNTO 0)); cos_signed <= signed(i_cos); sin_signed <= signed(i_sin); -- purpose: multiply the real and imag part with the cos ans isin part of the -- exponential, and add the results of real parts and imag ones together. -- Needs 2 clock edges to process the whole mult result -- inputs: signed data(im & re), signed exponential (cos & sin) -- outputs: o_data_re, o_data_im mult : PROCESS(i_clk) BEGIN IF rising_edge(i_clk) THEN data_mult_re_cos_signed(w_in+w_mult-1 DOWNTO 0) <= data_re_signed(w_in-1 DOWNTO 0) * cos_signed; data_mult_im_cos_signed(w_in+w_mult-1 DOWNTO 0) <= data_im_signed(w_in-1 DOWNTO 0) * cos_signed; data_mult_im_sin_signed(w_in+w_mult-1 DOWNTO 0) <= data_re_signed(w_in-1 DOWNTO 0) * sin_signed; data_mult_re_sin_signed(w_in+w_mult-1 DOWNTO 0) <= data_im_signed(w_in-1 DOWNTO 0) * sin_signed; 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 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)))); END IF; END PROCESS; END Mult_Path;