1 -------------------------------------------------------------------------------
2 -- Description: pre-normalization entity for the square-root unit
6 use ieee.std_logic_1164.all;
7 use ieee.std_logic_unsigned.all;
8 use ieee.std_logic_misc.all;
13 entity pre_norm_sqrt is
16 opa_i : in std_logic_vector(FP_WIDTH-1 downto 0);
17 fracta_52_o : out std_logic_vector(2*(FRAC_WIDTH+3)-1 downto 0);
18 exp_o : out std_logic_vector(EXP_WIDTH-1 downto 0)
22 architecture rtl of pre_norm_sqrt is
24 signal s_expa : std_logic_vector(EXP_WIDTH-1 downto 0);
25 signal s_exp_o, s_exp_tem : std_logic_vector(EXP_WIDTH downto 0);
26 signal s_fracta : std_logic_vector(FRAC_WIDTH-1 downto 0);
27 signal s_fracta_24 : std_logic_vector(FRAC_WIDTH downto 0);
28 signal s_fracta_52_o, s_fracta1_52_o, s_fracta2_52_o : std_logic_vector(2*(FRAC_WIDTH+3)-1 downto 0);
29 signal s_sqr_zeros_o : std_logic_vector(5 downto 0);
32 signal s_opa_dn : std_logic;
36 s_expa <= opa_i(FP_WIDTH-2 downto FRAC_WIDTH);
37 s_fracta <= opa_i(FRAC_WIDTH-1 downto 0);
40 exp_o <= s_exp_o(EXP_WIDTH-1 downto 0);
41 fracta_52_o <= s_fracta_52_o;
43 -- opa or opb is denormalized
44 s_opa_dn <= not or_reduce(s_expa);
46 s_fracta_24 <= (not s_opa_dn) & s_fracta;
48 -- count leading zeros
49 s_sqr_zeros_o <= count_l_zeros(s_fracta_24 );
51 -- adjust the exponent
52 s_exp_tem <= ("0"&s_expa)+"001111111" - ("000"&s_sqr_zeros_o);
56 if rising_edge(clk_i) then
57 if or_reduce(opa_i(30 downto 0))='1' then
58 s_exp_o <= ("0"&s_exp_tem(EXP_WIDTH downto 1));
60 s_exp_o <= "000000000";
65 -- left-shift the radicand
66 s_fracta1_52_o <= shl(s_fracta_24, s_sqr_zeros_o) & "0000000000000000000000000000";
67 s_fracta2_52_o <= '0' & shl(s_fracta_24, s_sqr_zeros_o) & "000000000000000000000000000";
69 s_fracta_52_o <= s_fracta1_52_o when s_expa(0)='0' else s_fracta2_52_o;