|
|
@@ -0,0 +1,97 @@ |
|
|
|
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;
|