Don't print random debug information
[ipdf/vfpu.git] / src / pre_norm_sqrt.vhd
1 -------------------------------------------------------------------------------
2 -- Description: pre-normalization entity for the square-root unit
3 -- See COPYRIGHT.jop
4
5 library ieee ;
6 use ieee.std_logic_1164.all;
7 use ieee.std_logic_unsigned.all;
8 use ieee.std_logic_misc.all;
9
10 library work;
11 use work.fpupack.all;
12
13 entity pre_norm_sqrt is
14         port(
15                          clk_i                  : in std_logic;
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)
19                 );
20 end pre_norm_sqrt;
21
22 architecture rtl of pre_norm_sqrt is
23
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);
30
31
32 signal s_opa_dn : std_logic;
33
34 begin
35
36         s_expa <= opa_i(FP_WIDTH-2 downto FRAC_WIDTH);
37         s_fracta <= opa_i(FRAC_WIDTH-1 downto 0);
38
39
40         exp_o <= s_exp_o(EXP_WIDTH-1 downto 0);
41         fracta_52_o <= s_fracta_52_o;   
42
43         -- opa or opb is denormalized
44         s_opa_dn <= not or_reduce(s_expa);
45         
46         s_fracta_24 <= (not s_opa_dn) & s_fracta;
47         
48         -- count leading zeros
49         s_sqr_zeros_o <= count_l_zeros(s_fracta_24 ); 
50         
51         -- adjust the exponent
52         s_exp_tem <= ("0"&s_expa)+"001111111" - ("000"&s_sqr_zeros_o);
53         
54         process(clk_i)
55         begin
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)); 
59                         else 
60                                 s_exp_o <= "000000000";
61                         end if;
62                 end if;
63         end process;
64
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";
68         
69         s_fracta_52_o <= s_fracta1_52_o when s_expa(0)='0' else s_fracta2_52_o; 
70
71 end rtl;

UCC git Repository :: git.ucc.asn.au