|
- LIBRARY ieee;
- USE ieee.std_logic_1164.ALL;
- USE ieee.std_logic_signed.ALL;
- USE ieee.numeric_std.ALL;
- USE work.FIVEn_DFT_PKG.ALL;
-
- ENTITY radix_2_cell_winograd IS
- GENERIC(
- w_in : natural
- );
- PORT(
- i_clk : std_logic;
- i_cos : smpl_cos_sin_wb;
- i_sin : smpl_cos_sin_wb;
- i_data1_re : IN smpl_out_radix2;
- i_data1_im : IN smpl_out_radix2;
- i_data2_re : IN smpl_out_radix2;
- i_data2_im : IN smpl_out_radix2;
- o_data1_re : OUT smpl_out_radix2;
- o_data1_im : OUT smpl_out_radix2;
- o_data2_re : OUT smpl_out_radix2;
- o_data2_im : OUT smpl_out_radix2
- );
- END radix_2_cell_winograd;
-
- ARCHITECTURE radix2 OF radix_2_cell_winograd IS
-
- TYPE vect_result_multiply IS ARRAY (0 TO 1) OF std_logic_vector(w_in + cst_w_precision_radix2_coeffs_5ndft-2 DOWNTO 0);
- SIGNAL signed_data_im : smpl_out_winograd5_signed_5ndft := (OTHERS => '0');
- SIGNAL signed_data_re : smpl_out_winograd5_signed_5ndft := (OTHERS => '0');
- SIGNAL multiply_by_2_power_cst_w_precision : std_logic_vector(cst_w_precision_radix2_coeffs_5ndft-3 DOWNTO 0) := (OTHERS => '0');
- SIGNAL data_matrix_im : matrix_radix2_cell := (OTHERS => (OTHERS => (OTHERS => '0')));
- SIGNAL data_matrix_re : matrix_radix2_cell := (OTHERS => (OTHERS => (OTHERS => '0')));
- SIGNAL data_vect_result_mult_re : vect_result_multiply := (OTHERS => (OTHERS => '0'));
- SIGNAL data_vect_result_mult_im : vect_result_multiply := (OTHERS => (OTHERS => '0'));
-
- BEGIN
-
-
- -- assign block inputs and outputs their corresponding matrix columns
- data_matrix_re(0)(0) <= i_data1_re;
- data_matrix_re(1)(0) <= i_data2_re;
- data_matrix_im(0)(0) <= i_data1_im;
- data_matrix_im(1)(0) <= i_data2_im;
- o_data1_re <= data_matrix_re(0)(3);
- o_data2_re <= data_matrix_re(1)(3);
- o_data1_im <= data_matrix_im(0)(3);
- o_data2_im <= data_matrix_im(1)(3);
-
-
-
- --instanciating the MULT_BLK_5nDFT(Mult_Path)
- mult_inst1 : ENTITY work.MULT_BLK_5nDFT(Mult_Path)
- GENERIC MAP(
- w_in => w_in,
- w_mult => cst_w_precision_radix2_coeffs_5ndft
- )
- PORT MAP(i_clk => i_clk,
- i_data_re => data_matrix_re(1)(0),
- i_data_im => data_matrix_im(1)(0),
- i_cos => i_cos,
- i_sin => i_sin,
- o_data_re => data_matrix_re(1)(2),
- o_data_im => data_matrix_im(1)(2)
- );
-
-
-
- -- purpose: calculating the multiplication and the 2 additions/substractions.
- -- The multiplication per 1 in the top of the butterfly is replaced by a
- -- shift with 0s towards the MSBs
- -- inputs: data_matrix_im(x)(0), data_matrix_re(x)(0)
- -- outputs: data_matrix_im(x)(3), data_matrix_re(x)(3)
- radix2_structure : PROCESS(i_clk)
- BEGIN
- IF(rising_edge(i_clk)) THEN
- -- mult per 1 (top)
- 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;
- 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;
- data_matrix_im(0)(2) <= data_matrix_im(0)(1);
- data_matrix_re(0)(2) <= data_matrix_re(0)(1);
-
- -- mult (down) : see mult_blk instanciation
-
-
-
- --add
- 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))));
- 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))));
-
- 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))));
- 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))));
- END IF;
-
- END PROCESS;
-
- END radix2;
|