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