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