OpenCores
URL https://opencores.org/ocsvn/raytrac/raytrac/trunk

Subversion Repositories raytrac

[/] [raytrac/] [trunk/] [fpbranch/] [add/] [ema32x2.vhd] - Blame information for rev 102

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 88 jguarin200
------------------------------------------------
2 102 jguarin200
--! @file ema32x2.vhd
3 100 jguarin200
--! @brief RayTrac Floating Point Adder  
4 88 jguarin200
--! @author Julián Andrés Guarín Reyes
5
--------------------------------------------------
6
 
7
 
8
-- RAYTRAC (FP BRANCH)
9
-- Author Julian Andres Guarin
10 102 jguarin200
-- ema32x2.vhd
11 88 jguarin200
-- This file is part of raytrac.
12
-- 
13
--     raytrac is free software: you can redistribute it and/or modify
14
--     it under the terms of the GNU General Public License as published by
15
--     the Free Software Foundation, either version 3 of the License, or
16
--     (at your option) any later version.
17
-- 
18
--     raytrac is distributed in the hope that it will be useful,
19
--     but WITHOUT ANY WARRANTY; without even the implied warranty of
20
--     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
--     GNU General Public License for more details.
22
-- 
23
--     You should have received a copy of the GNU General Public License
24
--     along with raytrac.  If not, see <http://www.gnu.org/licenses/>
25
 
26 84 jguarin200
library ieee;
27
use ieee.std_logic_1164.all;
28
use ieee.std_logic_unsigned.all;
29
use ieee.std_logic_arith.all;
30
 
31 93 jguarin200
 
32 88 jguarin200
--! Esta entidad recibe dos n&uacutemeros en formato punto flotante IEEE 754, de precision simple y devuelve las mantissas signadas y corridas, y el exponente correspondiente al resultado antes de normalizarlo al formato float. 
33
--!\nLas 2 mantissas y el exponente entran despues a la entidad add2 que suma las mantissas y entrega el resultado en formato IEEE 754.
34 102 jguarin200
entity ema32x2 is
35 84 jguarin200
        port (
36 93 jguarin200
                clk,dpc         : in std_logic;
37 84 jguarin200
                a32,b32         : in std_logic_vector (31 downto 0);
38 93 jguarin200
                res32           : out std_logic_vector(31 downto 0)
39 84 jguarin200
        );
40 102 jguarin200
end ema32x2;
41 84 jguarin200
 
42 102 jguarin200
architecture ema32x2_arch of ema32x2 is
43 100 jguarin200
 
44 91 jguarin200
        component lpm_mult
45
        generic (
46
                lpm_hint                        : string;
47
                lpm_representation      : string;
48
                lpm_type                        : string;
49
                lpm_widtha                      : natural;
50
                lpm_widthb                      : natural;
51
                lpm_widthp                      : natural
52
        );
53
        port (
54
                dataa   : in std_logic_vector ( lpm_widtha-1 downto 0 );
55
                datab   : in std_logic_vector ( lpm_widthb-1 downto 0 );
56
                result  : out std_logic_vector( lpm_widthp-1 downto 0 )
57
        );
58
        end component;
59 95 jguarin200
        signal s2slr                                                                            : std_logic_vector(1 downto 0);
60
        signal s3lshift,s4lshift                                                        : std_logic_vector(4 downto 0);
61
        signal s2exp,s3exp,s4exp                                                        : std_logic_vector(7 downto 0);
62
        signal s4slab                                                                           : std_logic_vector(15 downto 0);
63
        signal s2slab                                                                           : std_logic_vector(16 downto 0);
64
        signal b1s,s4nrmP                                                                       : std_logic_vector(22 downto 0); -- Inversor de la mantissa
65 102 jguarin200
        signal s0a,s0b,s1a,s1b                                                          : std_logic_vector(31 downto 0); -- Float 32 bit 
66 95 jguarin200
        signal s1sma,s2sma,s2smb,s3sma,s3smb,s3ures,s4ures      : std_logic_vector(24 downto 0); -- Signed mantissas
67
        signal s3res                                                                            : std_logic_vector(25 downto 0); -- Signed mantissa result
68
        signal s1pS,s1pH,s1pL,s4nrmL,s4nrmH,s4nrmS                      : std_logic_vector(17 downto 0); -- Shifert Product
69 100 jguarin200
        signal s0zeroa,s0zerob,s1z,s4sgr                                : std_logic;
70 91 jguarin200
 
71 84 jguarin200
begin
72
 
73
        process (clk)
74
        begin
75
                if clk'event and clk='1' then
76
 
77
                        --!Registro de entrada
78 95 jguarin200
                        s0a <= a32;
79 98 jguarin200
                        s0b(31) <= dpc xor b32(31);     --! Importante: Integrar el signo en el operando B
80
                        s0b(30 downto 0) <= b32(30 downto 0);
81 84 jguarin200
 
82 95 jguarin200
                        --!Etapa 0,Escoger el mayor exponente que sera el resultado desnormalizado, calcula cuanto debe ser el corrimiento de la mantissa con menor exponente y reorganiza los operandos, si el mayor es b, intercambia las posici&oacute;n si el mayor es a las posiciones la mantiene. Zero check.
83
                        if s0a(30 downto 23) >= s0b (30 downto 23) then
84 84 jguarin200
                                --!signo,exponente,mantissa
85 95 jguarin200
                                s1b(31) <= s0b(31);
86
                                s1b(30 downto 23) <= s0a(30 downto 23)-s0b(30 downto 23);
87
                                s1b(22 downto 0) <= s0b(22 downto 0);
88 90 jguarin200
                                --! zero signaling
89 95 jguarin200
                                s1z <= s0zerob;
90 84 jguarin200
                                --!clasifica a
91 95 jguarin200
                                s1a <= s0a;
92 88 jguarin200
 
93 84 jguarin200
                        else
94
                                --!signo,exponente,mantissa
95 95 jguarin200
                                s1b(31) <= s0a(31);
96
                                s1b(30 downto 23) <= s0b(30 downto 23)-s0a(30 downto 23);
97
                                s1b(22 downto 0) <= s0a(22 downto 0);
98 90 jguarin200
                                --! zero signaling
99 95 jguarin200
                                s1z <= s0zeroa;
100 84 jguarin200
                                --!clasifica b
101 95 jguarin200
                                s1a <= s0b;
102 84 jguarin200
                        end if;
103
 
104 95 jguarin200
                        --! Etapa 1: Denormalizaci&oacute;n de las mantissas.  
105
                        --! A
106
                        s2exp <= s1a(30 downto 23);
107
                        s2sma <= s1sma;
108 84 jguarin200
 
109 95 jguarin200
                        --! B
110
                        for i in 23 downto 15 loop
111
                                s2smb(i)        <= s1pL(23-i) xor s1b(31);
112 91 jguarin200
                        end loop;
113 95 jguarin200
                        for i in 14 downto 6 loop
114
                                s2smb(i)        <= (s1pH(14-i) or s1pL(14-i+9)) xor s1b(31);
115
                        end loop;
116
                        for i in 5 downto 0 loop
117
                                s2smb(i)        <= (s1pS(5-i) or s1pH(5-i+9)) xor s1b(31);
118 91 jguarin200
                        end loop;
119 95 jguarin200
 
120
                        if s1b(30 downto 28)>"000" then
121
                                s2slr <= "11";
122
                        else
123
                                s2slr <= s1b(27 downto 26);
124
                        end if;
125 91 jguarin200
 
126 95 jguarin200
                        s2smb(24) <= s1b(31);
127 91 jguarin200
 
128 95 jguarin200
                        --! Etapa2: Finalizar la denormalizaci&oacute;n de b.
129
                        --! A
130
                        s3sma <= s2sma;
131
                        s3exp <= s2exp;
132 93 jguarin200
 
133 95 jguarin200
                        --! B
134
                        case (s2slr) is
135
                                when "00" =>
136
                                        s3smb   <= s2smb(24 downto 0)+s2smb(24);
137
                                when "01" =>
138
                                        s3smb   <= ( s2slab(8 downto 0) & s2smb(23 downto 8) ) + s2smb(24);
139
                                when "10"  =>
140
                                        s3smb   <= ( s2slab(16 downto 0) & s2smb(23 downto 16)) + s2smb(24);
141
                                when others =>
142
                                        s3smb   <= (others => '0');
143
                        end case;
144
 
145 93 jguarin200
 
146 95 jguarin200
                        --! Etapa 3: Etapa 3 Realizar la suma, quitar el signo de la mantissa y codificar el corrimiento hacia la izquierda.
147
                        s4ures  <= s3ures+s3res(25);                            --Resultado no signado
148 98 jguarin200
                        s4sgr   <= s3res(25);                                           --Signo
149 95 jguarin200
                        s4exp   <= s3exp;                                                       --Exponente 
150
                        s4lshift <= s3lshift;                                           --Corrimiento hacia la izquierda. 
151
 
152
                        --! Etapa 4: Corrimiento y normalizaci&oacute;n de la mantissa resultado.
153
                        res32(31) <= s4sgr;
154
                        if s4ures(24)='1' then
155
                                res32(22 downto 0) <= s4ures(23 downto 1);
156
                                res32(30 downto 23) <= s4exp+1;
157 93 jguarin200
                        else
158 95 jguarin200
                                case s4lshift(4 downto 3) is
159
                                        when "00" =>
160
                                                res32(22 downto 0)       <= s4nrmP(22 downto 0);
161
                                                res32(30 downto 23) <= s4exp - s4lshift;
162
                                        when "01" =>
163
                                                res32(22 downto 0)       <= s4nrmP(14 downto 0)   & s4slab(7 downto 0);
164
                                                res32(30 downto 23) <= s4exp - s4lshift;
165
                                        when "10" =>
166
                                                res32(22 downto 0)       <= s4nrmP(6 downto 0)    & s4slab(15 downto 0);
167
                                                res32(30 downto 23) <= s4exp - s4lshift;
168
                                        when others =>
169
                                                res32(30 downto 0) <= (others => '0');
170
                                end case;
171
 
172 93 jguarin200
                        end if;
173
 
174 84 jguarin200
                end if;
175
        end process;
176 95 jguarin200
        --! Combinatorial gremlin, Etapa 0, Escoger el mayor exponente que sera el resultado desnormalizado,\n 
177
        --! calcula cuanto debe ser el corrimiento de la mantissa con menor exponente y reorganiza los operandos,\n
178
        --! si el mayor es b, intercambia las posici&oacute;n si el mayor es a las posiciones la mantiene. Zero check.\n 
179
        process (s0b(30 downto 23),s0a(30 downto 23))
180 88 jguarin200
        begin
181 95 jguarin200
                s0zerob <='0';
182
                s0zeroa <='0';
183 88 jguarin200
                for i in 30 downto 23 loop
184 95 jguarin200
                        if s0a(i)='1' then
185
                                s0zeroa <= '1';
186 88 jguarin200
                        end if;
187 95 jguarin200
                        if s0b(i)='1' then
188
                                s0zerob <='1';
189 88 jguarin200
                        end if;
190
 
191
                end loop;
192
        end process;
193 95 jguarin200
 
194
 
195
        --! Combinatorial Gremlin, Etapa 1 Denormalizaci&oacute;n de las mantissas. 
196
        denormsupershiftermult:lpm_mult
197
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
198
        port    map ("00"&shl(conv_std_logic_vector(1,7),s1b(25 downto 23)),conv_std_logic_vector(0,3)&b1s(22 downto 17),s1pS);
199
        denormhighshiftermult:lpm_mult
200
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
201
        port    map ("00"&shl(conv_std_logic_vector(1,7),s1b(25 downto 23)),b1s(16 downto 8),s1pH);
202
        denormlowshiftermult:lpm_mult
203
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
204
        port    map ("00"&shl(conv_std_logic_vector(1,7),s1b(25 downto 23)),b1s(7 downto 0)&s1z,s1pL);
205
        s1b2b1s:
206 91 jguarin200
        for i in 22 downto 0 generate
207 95 jguarin200
                b1s(i) <= s1b(22-i);
208
        end generate s1b2b1s;
209
        signa:
210
        for i in 22 downto 0 generate
211
                s1sma(i) <= s1a(31) xor s1a(i);
212
        end generate;
213
        s1sma(23) <= not(s1a(31));
214
        s1sma(24) <= s1a(31);
215 84 jguarin200
 
216 93 jguarin200
 
217 95 jguarin200
        --! Combinatorial Gremlin, Etapa2: Finalizar la denormalizaci&oacute;n de b.
218
        s2signslab:
219
        for i in 16 downto 0 generate
220
                s2slab(i) <= s2smb(24);
221
        end generate s2signslab;
222
 
223
        --! Combinatorial Gremlin, Etapa 3 Realizar la suma, quitar el signo de la mantissa y codificar el corrimiento hacia la izquierda. 
224 97 jguarin200
        --adder:sadd2
225
        --port map (s3sma(24)&s3sma,s3smb(24)&s3smb,dpc,s3res);
226 98 jguarin200
        process (s3sma,s3smb)
227 97 jguarin200
        begin
228 98 jguarin200
                --! Magia: La suma ocurre aqui
229
                s3res <= (s3sma(24)&s3sma)+(s3smb(24)&s3smb);
230 97 jguarin200
        end process;
231
 
232 95 jguarin200
        process(s3res)
233
                variable lshift : integer range 24 downto 0;
234 93 jguarin200
        begin
235 95 jguarin200
                lshift:=24;
236
 
237 93 jguarin200
                for i in 0 to 23 loop
238 95 jguarin200
                        s3ures(i) <= s3res(25) xor s3res(i);
239
                        if (s3res(25) xor s3res(i))='1' then
240 93 jguarin200
                                lshift:=23-i;
241
                        end if;
242
                end loop;
243 95 jguarin200
                s3ures(24) <= s3res(24) xor s3res(25);
244
                s3lshift <= conv_std_logic_vector(lshift,5);
245 93 jguarin200
        end process;
246
 
247
 
248 95 jguarin200
        --! Combinatorial Gremlin, Etapa 4 corrimientos y normalizaci&oacute;n de la mantissa resultado.
249
        normsupershiftermult:lpm_mult
250
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
251
        port    map (shl(conv_std_logic_vector(1,9),s4lshift(2 downto 0)),s4ures(22 downto 14),s4nrmS);
252
        normhighshiftermult:lpm_mult
253
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
254
        port    map (shl(conv_std_logic_vector(1,9),s4lshift(2 downto 0)),s4ures(13 downto 5),s4nrmH);
255
        normlowshiftermult:lpm_mult
256
        generic map ("DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9","UNSIGNED","LPM_MULT",9,9,18)
257
        port    map (shl(conv_std_logic_vector(1,9),s4lshift(2 downto 0)),s4ures(4 downto 0)&conv_std_logic_vector(0,4),s4nrmL);
258
        process (s4nrmS,s4nrmH,s4nrmL)
259
        begin
260
                s4nrmP(22 downto 14) <= s4nrmS(8 downto 0) or s4nrmH(17 downto 9);
261
                s4nrmP(13 downto 5) <= s4nrmH(8 downto 0) or s4nrmL(17 downto 9);
262
                s4nrmP(4 downto 0) <= s4nrmL(8 downto 4);
263
        end process;
264
        s4signslab:
265
        for i in 15 downto 0 generate
266
                s4slab(i) <= '0';
267
        end generate s4signslab;
268 102 jguarin200
end ema32x2_arch;
269 84 jguarin200
 
270
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.