本节将介绍浮点数的表示方法。许多具有专用浮点单元 (Float-Point Unit,FPU )的DSPs中广泛使用浮点处理单元。但是,在FPGA中不建议使用浮点处理,这是因为:
(1)运算速度慢;
(2)消耗大量的逻辑设计资源。
但是,某些情况下,FPU也许是必不可少的,如在需要一个很大动态范围或者很高计算精度的应用场合。
此外,使用浮点可能使得设计更加简单。这是因为在定点设计中,需要关注可用的动态范围。但是,在浮点设计中不需要考虑动态范围的限制。
浮点数可以在更大的动态范围内提供更高的分辨率。当定点数由于受其精度和动态范围所限不能精确表示数值时,浮点数能提供更好的解决方法。当然,在速度和复杂度方面带来了损失。大多数的浮点数表示方法都满足单精度/双精度IEEE浮点标准。标准浮点数字长由符号位S(1比特位)、指数e和无符号(小数)的规格化尾数 m 构成,其格式如下:
因此,浮点数可以表示为
X =(-1) s (1. m )·2 e -bias
对于IEEE-754标准而言,还有下面的约定。
(1)当指数 e =0,尾数 m =0时,表示0。
(2)当指数 e =255,尾数 m =0时,表示无穷大。
(3)当指数 e =255,尾数 m !=0时,表示不是一个数(Not a Number,NaN)。
(4)对于最接近于0的数,根据IEEE754的约定,为了扩大对0值附近数据的表示能力,取阶码 P =-126,尾数 m =(0.00000000000000000000001) 2 。此时,该数的二进制表示为
0 00000000 00000000000000000000001
IEEE的单精度和双精度浮点格式如表3.8所示。
表3.8 IEEE的单精度和双精度浮点格式
在浮点乘法中,尾数部分可以像定点数一样相乘,而把指数部分相加。浮点数的减法运算会复杂一些,因为首先需要将尾数归一化,就是将两个数都调整到较大的指数。然后将两个数的尾数相加。对于加法和乘法混合运算而言,最终的归一化,就是将结果尾数再统一乘小数“1. m ”形式的表达式,这是非常必要的。
简化浮点硬件的一种方法是创建一种短指数的浮点数据格式。浮点数的短指数表示格式如图3.39所示。
图3.39 浮点数的短指数表示格式
在这种表示格式中,有一个4位的指数和一个11位的尾数。因此,可以表示-7~8范围内的指数。其结果在动态范围内显著地增加,而代价就是稍微降低了精度。定点数和短指数的性能比较如表3.9所示。
表3.9 定点数和短指数的性能比较
不同浮点数的短指数表示格式如表3.10所示。
表3.10 不同浮点数的短指数表示格式