[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[f-cpu] FPU Adder....

I\'m in charge of the Floating Point Unit (engineer school project
supervised by yann himself!!).
Since we started only this year learning VHDL, i took lot of time to
understand how both VHDL and F-CPU works.
And i don\'t know if the current adder i wrote is correct or not (will
it work with other units, is it F-CPU compatible,...?)
So i give you the current fadd and i\'m waiting for any comment...
For the moment, the fadder works for \"trivial\" calculation like 1+5,
6+15.5, 1000+6...
I will start rounding and other problems next year (only 2 days  ), but
i really want to have
a correct code (especialy if i have to restart from scratch)...

I\'m not a VHDL expert so if you see some howful things, don\'t be
It takes 6 cycles to have a result, i don\'t know if it\'s too mush or
not enough (i cannot synthetise so
i don\'t know if my stages are too deep or not)

Here the output of my tests :

*** testing FPU add/sub unit (fadd/fsub instruction) ***
Clock period: 10 ns
Reseting unit...
End of reset.
Default values:
En        := 0
Rst       := 0
Din_0     :=
Din_1     :=
Substract := 0
Flags     := 000000
SIMD      := 000
Dout_0    :=
FExout    := UUUUUUUUU
------ FLOAT ADDITION -----
First calculation
Din_0 := 01000001011100000000000000000000 (15.0f)
Din_1 := 01000000110000000000000000000000 (6.0f)
Launching ONE calculation (over 6 cycles)...
Check successfull: Dout_0 := 01000001101010000000000000000000 (21.0f)
Launching cascading calculations (6 calculations)
1st cycle
Din_0 := 01000000110000000000000000000000 (6.0f)
Din_1 := 11000001011100000000000000000000 (-15.0f)
2nd cycle
Din_0 := 11000000110000000000000000000000 (-6.0f)
Din_1 := 11000001011100000000000000000000 (-15.0f)
3rd cycle
Din_0 := 11000000110000000000000000000000 (-6.0f)
Din_1 := 01000001011110010101101000001000 (15.58448f)
4th cycle
Din_0 := 01000000110000000000000000000000 (6.0f)
Din_1 := 01000100011110100000000000000000 (1000.0f)
5th cycle
Din_0 := 01000000110000000000000000000000 (6.0f)
Din_1 := 01000100011110100000000000000000 (-1000.0f)
6th cycle
Din_0 := 01000100011110100000000000000000 (1000.0f)
Din_1 := 01100010010110001101011100100111 (1e21f)
Result first calculation (6.0f + -15.0f)
Check successfull: Dout_0 := 11000001000100000000000000000000 (-9.0f)
7th cycle
Din_0 := 01000001000110010101101000001000 (9.58448f)
Din_1 := 01000001100101100100101101011110 (18.7848f)
Result second calculation (-6.0f + -15.0f)
Check successfull: Dout_0 := 11000001101010000000000000000000 (-21.0f)
8th cycle
Result third calculation (-6.0f + 15.58448f)
Check successfull: Dout_0 := 01000001000110010101101000001000
9th cycle
Result fourth calculation (6.0f + 1000.0f)
Check successfull: Dout_0 := 01000100011110111000000000000000
10th cycle
Result fifth calculation (6.0f + -1000.0f)
Check successfull: Dout_0 := 11000100011110001000000000000000
11th cycle
Result sixth calculation (1000.0f + 1e21f)
Dout_0 := 01100010011010000111011100100111
Dout_0 /= 01100010010110001101011100100111
Result seventh calculation (9.58448f + 18.7868)
Check successfull: Dout_0 := 01000001111000101111100001100010

=> we see here a little rounding problem...

For the moment, the unit only work with 32-bit floats (for easy
I plan to use the same unit for both 32bit/64bit calculations, with a
select bit in Mode vector...

What else to say???

Happy new year!!



~~ Gaetan ~~

Attachment: eu_fasu-20031230.tar.gz
Description: application/gzip