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

Subversion Repositories raytrac

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

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

powered by: WebSVN 2.1.0

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