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;