Menu Close

FPGA 浮点运算算法

1.背景介绍

在早期的计算机设计中, 只有定点计算, 没有浮点运算。不论是8位计算机, 16位计算机,还是32位计算机系统。 以32为计算机为例, 使用定点计算可以表示 0- 232 数值范围, 或者是-231  ~  +231之间。 即表达范围是 32’h0000_0000 ~ 32’hffff_ffff。数值表达范围在0-4G 这个空间。但随着科学计算的需要, 在32位计算机上,很多计算可能会需要很大的数值空间,同时,不可避免的需要使用小数(不是所有的应用都是整数计算的)。因此,浮点运算应运而生了。浮点计算在现代CPU设计中也会经常使用的。浮点运算的好处是可以表达更大的数值空间(不一定是232 ,在32位CPU 中, 可以表达更大的数值),缺点是增加了CPU 设计的复杂程度,有些数值不能被正确表示,只能通过近似值替代, 而且小数部分的数值空间也不是连续的。

2. 浮点数表示方式

%title插图%num

%title插图%num

图1

%title插图%num

图2

以32为浮点为例, 浮点数由3个部分组成:

sign: 代表符号部分,表示当前的数是正数还是负数。举例10进制的1.5 = 0x3fc00000; 10进制的-1.5 = 0xbfc00000

exponent:指数部分,在2进制当中,表示的是2e 。 在CPU和FPGA等设计中都是以2进制为基础。

fraction:分数部分,即小数部分,在CPU 和FPGA 等设计中是指以2进制为基础的小数部分。

以上图为例:

位 23 = 1 => 1 或者 0 下文中会描述这个部分,bit23没有在32位浮点数中明确指出,有指数部分来决定这个位的数值。
位 22 = 1 =>0.5
位 21 = 1 =>0.25
位 20 = 1 =>0.125
位 19 = 1 =>0.0625
位 18 = 1 =>0.03125
.
.
位 0 = 1 =>0.00000011920928955078125

 

以32位浮点为例: sign位 占1位;指数部分占8位;小数部分占23位。 指数部分和小数部分都是可以自行定义的。

%title插图%num

图3

当然,国际组织IEEE754也作出了相应的标准。

 

3. IEEE754 标准

%title插图%num

图4

  • sign符号位:1位                                       (bit[31])
  • exponent指数宽度:8位                           (bit[30:23])
  • fraction小数位:24 位                              (bit[22:0]) ,最高位bit[23] 由 exponent 位决定)
指数部分 bit[30:23] 小数部分 == 0 bit[22:0] 小数部分 != 0 bit[22:0] 真实数值计算公式
8’h00 ±0 次正规数(subnormal Numbers) (-1)sign * 2-126 * 0.fraction
8’h01 ~ 8’hFE 正常数值 (normalized value) (-1)sign * 2exponent-127 * 1.fraction
8’hFF ±无穷大 (infinity) NaN (Not a Number)

 

正常数值范围的公式:

%title插图%num

10进制(1.17549435082*e38 ~ 3.40282346639*e+38),16进制(32’h0080_0000 ~ 32’h7f7f_ffff)   e = 10

小数范围公式:

%title插图%num

10进制(0 ~ 1.17549421069*e38),16进制(32’h0000_0000 ~ 32’h007f_ffff)    e = 10

 

在IEEE754标准中, 指数部分占8位, 数值范围8’h00 ~ 8’hff,这里有127 的偏移量。

 

4. 举例

10进制 1.5 = 20 * 1.5 = 2127 – 127 * 1.5 = 32’h 3fc0_0000 = 32’b 0_01111111_1000000000000000000

10进制 123.25 = 26 * 1.92578125 = 2133-127  * 1.92578125 = 32’h42f6_8000 = 32’b0_10000101_11101101000000000000000

步骤 操作 结果 比较 2进制记录值
1 1.92578125 *2 3.8515625 >= 2 1
3.8515625 – 2 1.8515625
2 1.8515625 * 2 3.703125 >= 2 1
3.703125 – 2 1.703125
3 1.703125 * 2 3.40625 >= 2 1
3.40625 – 2 1.40625
4 1.40625 * 2 2.8125 >= 2 1
2.8125 – 2 0.8125
5 0.8125 * 2 1.625 < 2 0
6 1.625 * 2 3.25 >= 2 1
3.25 – 2 1.25
7 1.25 * 2 2.5 >= 2 1
2.5 – 2 0.5
8 0.5 * 2 1 < 2 0
9 1 * 2 2 = 2 1
2 – 2 0 结束

32’b0_10000101_11101101000000000000000

                                 1.11101101

5. 在线浮点转换工具

https://www.h-schmidt.net/FloatConverter/IEEE754.html

 

Posted in FPGA, 教材与教案, 文章

发表回复

相关链接