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

Subversion Repositories raytrac

[/] [raytrac/] [branches/] [fp/] [fadd32long.vhd] - Blame information for rev 227

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 118 jguarin200
------------------------------------------------
2 119 jguarin200
--! @file fadd32.vhd
3 118 jguarin200
--! @brief RayTrac Floating Point Adder  
4
--! @author Julián Andrés Guarín Reyes
5
--------------------------------------------------
6
 
7
 
8
-- RAYTRAC (FP BRANCH)
9
-- Author Julian Andres Guarin
10 119 jguarin200
-- fadd32.vhd
11 118 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
library ieee;
26
use ieee.std_logic_1164.all;
27
use ieee.std_logic_unsigned.all;
28 155 jguarin200
use work.arithpack.all;
29
 
30 227 jguarin200
library lpm;
31
use lpm.lpm_components.all;
32
 
33
 
34 118 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. 
35
--!\nLas 2 mantissas y el exponente entran despues a la entidad add2 que suma las mantissas y entrega el resultado en formato IEEE 754.
36 227 jguarin200
entity fadd32long is
37 150 jguarin200
 
38 118 jguarin200
        port (
39 150 jguarin200
                clk,dpc : in std_logic;
40 158 jguarin200
                a32,b32 : in xfloat32;
41
                c32             : out xfloat32
42 118 jguarin200
        );
43 153 jguarin200
end entity;
44 227 jguarin200
architecture fadd32_arch of fadd32long is
45 118 jguarin200
 
46
 
47 163 jguarin200
        --!TBXSTART:STAGE0
48 227 jguarin200
        signal s0delta  : std_logic_vector(8 downto 0);
49 163 jguarin200
        signal s0a,s0b  : std_logic_vector(31 downto 0); -- Float 32 bit 
50
 
51 152 jguarin200
        --!TBXEND
52 163 jguarin200
        --!TBXSTART:STAGE1
53
        signal s1zero                                                                                   : std_logic;
54
        signal s1delta                                                                                  : std_logic_vector(5 downto 0);
55
        signal s1exp                                                                                    : std_logic_vector(7 downto 0);
56
        signal s1shifter,s1datab_8x                                                             : std_logic_vector(8 downto 0);
57
        signal s1pl,s1datab                                                                             : std_logic_vector(17 downto 0);
58
        signal s1umantshift,s1umantfixed,s1postshift,s1xorslab  : std_logic_vector(23 downto 0);
59
        signal s1ph                                                                                             : std_logic_vector(26 downto 0);
60
        --!TBXEND
61
        --!TBXSTART:STAGE2
62
        signal s2exp                                            : std_logic_vector(7 downto 0);
63
        signal s2xorslab                                        : std_logic_vector(23 downto 0);
64
        signal s2umantshift, s2mantfixed        : std_logic_vector(24 downto 0);
65
        --!TBXEND
66
        --!TBXSTART:STAGE3
67
        signal s3exp                                    : std_logic_vector(7 downto 0);
68
        signal s3mantfixed,s3mantshift  : std_logic_vector (24 downto 0);
69
        --!TBXEND
70
        --!TBXSTART:STAGE4
71
        signal s4exp            : std_logic_vector (7 downto 0);
72
        signal s4xorslab        : std_logic_vector (24 downto 0);
73
        signal s4sresult                : std_logic_vector (25 downto 0);
74
        --!TBXEND
75
        --!TBXSTART:STAGE5
76
        signal s5tokena,s5tokenb,s5tokenc       : std_logic;
77
        signal s5token                                          : std_logic_vector (2 downto 0);
78
        signal s5exp,s5factor                           : std_logic_vector (7 downto 0);
79
        signal s5factorhot9                                     : std_logic_vector (8 downto 0);
80
        signal s5factorhot24                            : std_logic_vector (23 downto 0);
81
        signal s5result                                         : std_logic_vector (25 downto 0);
82
        --!TBXEND
83
        --!TBXSTART:STAGE6
84
        signal s6exp,s6factor                   : std_logic_vector(7 downto 0);
85
        signal s6factorhot9,s6datab_4x  : std_logic_vector(8 downto 0);
86
        signal s6pl,s6datab                             : std_logic_vector(17 downto 0);
87
        signal s6postshift                              : std_logic_vector(22 downto 0);
88
        signal s6result                                 : std_logic_vector(25 downto 0); -- Signed mantissa result
89
        signal s6ph                                             : std_logic_vector(26 downto 0);
90
        --!TBXEND
91
        --!TBXSTART:STAGE7
92
        signal s7sign                                   : std_logic;
93
        signal s7exp,s7factor                   : std_logic_vector(7 downto 0);
94
        signal s7postshift                              : std_logic_vector(22 downto 0);
95
        --!TBXEND
96 118 jguarin200
 
97 163 jguarin200
 
98
 
99
 
100
 
101 118 jguarin200
begin
102 150 jguarin200
 
103 139 jguarin200
        process (clk)
104 118 jguarin200
        begin
105 139 jguarin200
                if clk'event and clk='1'  then
106 118 jguarin200
 
107 227 jguarin200
                        --! Debug Register.
108
                        --! datab <= s1zero&"000"&x"00000"&s0b(30 downto 23);
109
                        --! datab <= x"00"&s1exp&s0a(30 downto 23)&s0b(30 downto 23);
110
 
111 118 jguarin200
                        --!Registro de entrada
112
                        s0a <= a32;
113
                        s0b(31) <= dpc xor b32(31);     --! Importante: Integrar el signo en el operando B
114
                        s0b(30 downto 0) <= b32(30 downto 0);
115
 
116
                        --!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.
117
                        --!signo,exponente,mantissa
118 227 jguarin200
 
119
 
120
                        s1delta <= s0delta(8) & (s0delta(8) xor s0delta(4))&(s0delta(8) xor s0delta(3)) & s0delta(2 downto 0);
121
                        if s0delta(8)='1' then
122
 
123
                                s1exp <= s0b(30 downto 23);
124
                                s1umantshift <= s0a(31)&s0a(22 downto 0);
125
                                s1umantfixed <= s0b(31)&s0b(22 downto 0);
126
                                if s0a(30 downto 23)=x"00" then
127
                                        s1zero <= '0';
128
                                else
129
                                        s1zero <= '1';
130
                                end if;
131 118 jguarin200
                        else
132 227 jguarin200
                                if s0b(30 downto 23)=x"00" then
133
                                        s1zero <= '0';
134
                                else
135
                                        s1zero <= '1';
136
                                end if;
137
                                s1exp <= s0a(30 downto 23);
138
                                s1umantshift <= s0b(31)&s0b(22 downto 0);
139
                                s1umantfixed <= s0a(31)&s0a(22 downto 0);
140 118 jguarin200
                        end if;
141 164 jguarin200
                        --! Etapa 1: Denormalizaci&oacute;n de la mantissas.
142 118 jguarin200
                        case s1delta(4 downto 3) is
143
                                when "00" =>    s2umantshift <= s1umantshift(23)&s1postshift(23 downto 0);
144
                                when "01" =>    s2umantshift <= s1umantshift(23)&x"00"&s1postshift(23 downto 8);
145
                                when "10" =>    s2umantshift <= s1umantshift(23)&x"0000"&s1postshift(23 downto 16);
146
                                when others =>  s2umantshift <= (others => '0');
147
                        end case;
148 164 jguarin200
 
149
                        s2mantfixed <= s1umantfixed(23) & ( ( ('1'&s1umantfixed(22 downto 0)) xor s1xorslab) + ( x"00000"&"000"&s1umantfixed(23)  )   );
150 118 jguarin200
                        s2exp  <= s1exp;
151
 
152
                        --! Etapa2: Signar la mantissa denormalizada.
153
                        s3mantfixed <= s2mantfixed;
154
                        s3mantshift <= s2umantshift(24)&         (  (      s2umantshift(23 downto 0)  xor s2xorslab)   + ( x"00000"&"000"&s2umantshift(24)  )   );
155
                        s3exp           <= s2exp;
156
 
157 119 jguarin200
                        --! Etapa 3: Etapa 3 Realizar la suma, entre la mantissa corrida y la fija.
158 118 jguarin200
                        s4sresult       <= (s3mantshift(24)&s3mantshift)+(s3mantfixed(24)&s3mantfixed);
159
                        s4exp           <= s3exp;
160
 
161
                        --! Etapa 4: Quitar el signo a la mantissa resultante.
162
                        s5result        <= s4sresult(25)&((s4sresult(24 downto 0) xor s4xorslab)  +(x"000000"&s4sresult(25)));
163
                        s5exp           <= s4exp;
164
 
165
 
166
                        --! Etapa 5: Codificar el corrimiento para la normalizacion de la mantissa resultante.
167 119 jguarin200
                        s6result                <= s5result;
168
                        s6exp                   <= s5exp;
169 118 jguarin200
                        s6factor                <= s5factor;
170 119 jguarin200
                        s6factorhot9    <= s5factorhot9;
171 118 jguarin200
 
172 119 jguarin200
                        --! Etapa 6: Ejecutar el corrimiento de la mantissa.
173 120 jguarin200
                        s7sign                  <= s6result(25);
174 119 jguarin200
                        s7exp                   <= s6exp;
175 166 jguarin200
                        s7factor                <= not(s6factor)+1;
176 119 jguarin200
                        s7postshift             <= s6postshift;
177
 
178 137 jguarin200
 
179 118 jguarin200
                end if;
180
        end process;
181 137 jguarin200
 
182
        --! Etapa 7: Entregar el resultado.
183
        c32(31) <= s7sign;
184
        process(s7exp,s7postshift,s7factor)
185
        begin
186
                c32(30 downto 23)       <= s7exp+s7factor;
187
                case s7factor(4 downto 3) is
188
                        when "01"       => c32(22 downto 0) <= s7postshift(14 downto 00)&x"00";
189
                        when "10"       => c32(22 downto 0) <= s7postshift(06 downto 00)&x"0000";
190
                        when others => c32(22 downto 0)  <= s7postshift;
191
                end case;
192
        end process;
193 118 jguarin200
        --! Combinatorial gremlin, Etapa 0 el corrimiento de la mantissa con menor exponente y reorganiza los operandos,\n
194
        --! si el mayor es b, intercambia las posici&oacute;n si el mayor es a las posiciones la mantiene. 
195 227 jguarin200
        s0delta <=  ('0'&s0a(30 downto 23))-('0'&s0b(30 downto 23));
196 118 jguarin200
        --! Combinatorial Gremlin, Etapa 1 Codificar el factor de corrimiento de denormalizacion y denormalizar la mantissa no fija. Signar la mantissa que se queda fija.
197
        decodeshiftfactor:
198
        process (s1delta(2 downto 0))
199
        begin
200
                case s1delta(2 downto 0) is
201
                        when "111" =>  s1shifter(8 downto 0) <= '0'&s1delta(5)&"00000"&not(s1delta(5))&'0';
202
                        when "110" =>  s1shifter(8 downto 0) <= "00"&s1delta(5)&"000"&not(s1delta(5))&"00";
203
                        when "101" =>  s1shifter(8 downto 0) <= "000"&s1delta(5)&'0'&not(s1delta(5))&"000";
204
                        when "100" =>  s1shifter(8 downto 0) <= '0'&x"10";
205
                        when "011" =>  s1shifter(8 downto 0) <= "000"&not(s1delta(5))&'0'&s1delta(5)&"000";
206
                        when "010" =>  s1shifter(8 downto 0) <= "00"&not(s1delta(5))&"000"&s1delta(5)&"00";
207
                        when "001" =>  s1shifter(8 downto 0) <= '0'&not(s1delta(5))&"00000"&s1delta(5)&'0';
208
                        when others => s1shifter(8 downto 0) <=    not(s1delta(5))&"0000000"&s1delta(5);
209
                end case;
210
        end process;
211 157 jguarin200
        s1datab <= s1zero&s1umantshift(22 downto 06);
212 118 jguarin200
        denormhighshiftermult:lpm_mult
213 155 jguarin200
        generic map (
214
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
215
                lpm_pipeline => 0,
216
                lpm_representation => "UNSIGNED",
217
                lpm_type => "LPM_MULT",
218
                lpm_widtha => 9,
219
                lpm_widthb => 18,
220
                lpm_widthp => 27
221
        )
222
        port map (
223
                dataa => s1shifter,
224 157 jguarin200
                datab => s1datab,
225 155 jguarin200
                result => s1ph
226
        );
227 157 jguarin200
        s1datab_8x <= s1umantshift(5 downto 0)&"000";
228 118 jguarin200
        denormlowshiftermult:lpm_mult
229 155 jguarin200
        generic map (
230
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
231
                lpm_pipeline => 0,
232
                lpm_representation => "UNSIGNED",
233
                lpm_type => "LPM_MULT",
234
                lpm_widtha => 9,
235
                lpm_widthb => 9,
236
                lpm_widthp => 18
237
        )
238
        port map (
239
                dataa => s1shifter,
240 157 jguarin200
                datab(8 downto 0) => s1datab_8x,
241 155 jguarin200
                result => s1pl
242
        );
243 118 jguarin200
 
244
        s1postshift(23 downto 7) <= s1ph(25 downto 9);
245
        s1postshift(06 downto 0) <= s1ph(08 downto 2) or s1pl(17 downto 11);
246
        s1xorslab(23 downto 0) <= (others => s1umantfixed(23));
247
 
248
        --! Combinatorial Gremlin, Etapa 2: Signar la mantissa denormalizada. 
249
        s2xorslab <= (others => s2umantshift(24));
250
 
251
        --! Combinatorial Gremlin, Etapa 4: Quitar el signo de la mantissa resultante.
252
        s4xorslab <= (others => s4sresult(25));
253
 
254
        --! Combinatorial Gremlin, Etapa 5: Codificar el factor de normalizacion de la mantissa resultante.
255
        normalizerdecodeshift:
256 120 jguarin200
        process (s5result,s5factorhot24,s5token,s5tokena,s5tokenb,s5tokenc,s5factorhot9)
257 118 jguarin200
        begin
258 120 jguarin200
                s5tokena <= not(s5result(24));
259
                s5tokenb <= not(s5result(24));
260
                s5tokenc <= not(s5result(24));
261
                s5factor(7 downto 5) <= (others => s5result(24));
262
                s5factorhot24 <= x"000000";
263
                for i in 23 downto 16 loop
264 118 jguarin200
                        if s5result(i)='1' then
265 120 jguarin200
                                s5factorhot24(23-i) <= s5tokena;
266
                                s5tokenb <= '0';
267
                                s5tokenc <= '0';
268 118 jguarin200
                                exit;
269
                        end if;
270
                end loop;
271 120 jguarin200
                for i in 15 downto 8 loop
272
                        if s5result(i)='1' then
273
                                s5factorhot24(23-i) <= s5tokenb;
274
                                s5tokenc <= '0';
275
                                exit;
276
                        end if;
277
                end loop;
278
                for i in 7 downto 0 loop
279
                        if s5result(i)='1' then
280
                                s5factorhot24(23-i) <= s5tokenc;
281
                                exit;
282
                        end if;
283
                end loop;
284
                s5token <=s5tokena&s5tokenb&s5tokenc;
285
                case (s5token) is
286 165 jguarin200
                        when "100"  => s5factor(4 downto 3) <= "00";
287 120 jguarin200
                        when "110"  => s5factor(4 downto 3) <= "01";
288 165 jguarin200
                        when "111"      => s5factor(4 downto 3) <= "10";
289 120 jguarin200
                        when others => s5factor(4 downto 3) <= (others => s5result(24));
290
                end case;
291
                s5factorhot9 <= (s5factorhot24(7 downto 0)or s5factorhot24(15 downto 8)or s5factorhot24(23 downto 16)) & s5result(24);
292
                case s5factorhot9 is
293
                        when "100000000" => s5factor(2 downto 0) <= "111";
294
                        when "010000000" => s5factor(2 downto 0) <= "110";
295
                        when "001000000" => s5factor(2 downto 0) <= "101";
296
                        when "000100000" => s5factor(2 downto 0) <= "100";
297
                        when "000010000" => s5factor(2 downto 0) <= "011";
298
                        when "000001000" => s5factor(2 downto 0) <= "010";
299
                        when "000000100" => s5factor(2 downto 0) <= "001";
300
                        when "000000010" => s5factor(2 downto 0) <= "000";
301
                        when others => s5factor (2 downto 0) <= (others => s5result(24));
302
                end case;
303
 
304 118 jguarin200
        end process;
305 119 jguarin200
 
306
        --! Etapa 6: Ejecutar el corrimiento para normalizar la mantissa.
307 157 jguarin200
        s6datab <= s6result(24 downto 7);
308 118 jguarin200
        normhighshiftermult:lpm_mult
309 155 jguarin200
        generic map (
310
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
311
                lpm_pipeline => 0,
312
                lpm_representation => "UNSIGNED",
313
                lpm_type => "LPM_MULT",
314
                lpm_widtha => 9,
315
                lpm_widthb => 18,
316
                lpm_widthp => 27
317
        )
318
        port map (
319
                dataa => s6factorhot9,
320 157 jguarin200
                datab => s6datab,
321 155 jguarin200
                result => s6ph
322
        );
323 157 jguarin200
        s6datab_4x <= s6result(06 downto 0)&"00";
324 118 jguarin200
        normlowshiftermult:lpm_mult
325 155 jguarin200
        generic map (
326
                lpm_hint => "DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=9",
327
                lpm_pipeline => 0,
328
                lpm_representation => "UNSIGNED",
329
                lpm_type => "LPM_MULT",
330
                lpm_widtha => 9,
331
                lpm_widthb => 9,
332
                lpm_widthp => 18
333
        )
334
        port map (
335
                dataa => s6factorhot9,
336 157 jguarin200
                datab => s6datab_4x,
337 155 jguarin200
                result => s6pl
338
        );
339 119 jguarin200
        s6postshift(22 downto 15) <= s6ph(16 downto 09);
340 120 jguarin200
        s6postshift(14 downto 06) <= s6ph(08 downto 00) + s6pl(17 downto 09);
341 119 jguarin200
        s6postshift(05 downto 00) <= s6pl(08 downto 03);
342 118 jguarin200
 
343
 
344
 
345
 
346
 
347 153 jguarin200
end architecture;
348 118 jguarin200
 
349
 

powered by: WebSVN 2.1.0

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