基于FPGA的嵌入式处理器的浮点系统 - FPGA/ASIC技术 -
浮点算法不遵循整数算法规则,但利用 FPGA 或者基于 FPGA 的嵌入式处理器不难设计出精确的浮点系统。
工程人员一看到浮点运算就会头疼,因为浮点运算用软件实现速度慢,用硬件实现则占用资源多。理解和领会浮点数的最佳方法是将它们视为实数的近似值。实际上这也是开发浮点表达式的目的。正如老话所说,真实的世界是模拟的,有许多电子系统在与真实世界的信号打交道。因此,对于设计这些系统的工程师来说,有必要理解浮点表达式以及浮点计算的优势和局限性。这将有助于我们设计可靠性更高、容错性更好的系统。
首先深入了解一下浮点运算。通过一些示例计算就可以看到浮点运算不如整数运算直接,工程师在设计使用浮点数据的系统时必须考虑这一点。这里有个重要的技巧:用对数来运算极小的浮点数据。我们的目的是熟悉一些数值运算的特点,把重点放在设计问题上。本文结尾列出的参考文献中有更加深入的介绍。
就设计实现而言, 设计人员可以使用赛灵思LogiCORE™ IP FloaTIng-Point Operator 生成和实例化RTL 设计中的浮点运算符。如果采用 FPGA 中的嵌入式处理器构建浮点软件系统,则可以使用 Virtex-5 FXT 中面向PowerPC 440 嵌入式处理器的 LogicCORE IP Virtex®-5辅助处理器单元 (APU) 浮点单元 (FPU)。
浮点运算 101
IEEE 754-2008 是现行的浮点运算 IEEE 标准。(1)它取代了该标准的 IEEE 754-1985 和 IEEE 754-1987 版本。该标准中的浮点数据表达规则如下:
要求零带符号:+0,-0
非零浮点数可表达为 (-1)^s x b^e x m,这里:s 为 +1 或者 -1,用于表明该数为正数还是负数,b是底数(2 或者 10),e 是指数,m 则是以 d0.d1d2—dp-1 形式表达的数,这里 di 对以 2 为底数的情况可以是 0 或者 1,对以 10 为底数的情况可以是0 和 9 之间的任意值。请注意小数点应紧跟 d0。
分正负的极限:+∞,-∞。
非数值,有两种形式:qNaN(静态)和 sNaN(信号)。
表达式 d0.d1d2—dp-1 指“有效值”,e 为“指数”。有效值总共有 p 位数,p 即为表达式的精度。IEEE754-2008 定义了五种基本的表达式格式,三种用于 2 为底数的情况,两种用于 10 为底数的情况。标准中还提供更多的衍生格式。IEEE 754-1985 中规定的单精度浮点数和双精度浮点数分别称为 binary32 和 binary64。对每种格式都规定有最小的指数 emin 和最大的指数 emax。
可以用浮点数格式表达的有限值的范围取决于底数(b)、精度 (p) 和 emax。该标准一般将 emin 定义为1-emax:
m 是 0 到 b^p-1 内的整数
例如,在 p=10 和 b=2 的情况下,m 就介于 0 到1023 之间。
对给定的数,e 必须满足下式
1-emax<=e+p-1<=emax
例如,如果 p=24,emax=+127,则 e 的取值范围是-126 到 104。
这里需要清楚一点,即浮点表达式往往不是唯一的。
例如,0.02x10^1 和 2.00x10^(-1) 都代表相同的实数,即0.2。如果第一位数 d0 为 0,则称该数值被“标准化”。同时,对某个实数来说,可能不存在浮点表达式。例如,0.1 在十进制中是一个确定的值,但它的二进制表达式是一个小数点后 0011 的无穷循环。因此,0.1 无法用浮点格式确定地表达。表 1 给出了 IEEE 754-2008 规定的五种基本格式。
浮点计算的误差
因为要用固定位数来表达无穷数量的实数,因此在浮点计算中四舍五入是必不可少的。这就会不可避免地带来舍入误差,故需要有一种方法来衡量结果与采用无穷精度计算时的差距。我们来观察一下 b=10 和 p=4 的浮点格式。用这种格式,.0123456 可以表达成 1.234x10^(-2)。很明显这种表达方式在最后位置单位 (ulps) 发生了 .56 的差异。又如,如果浮点计算的结果是 4.567x10^(-2),而采用无穷精度计算的结果是 4.567895,则最后差 .895 最后位置单位。
“最后位置单位”(ulps) 是规定这种计算误差的一种方法。相对误差是另一种用来衡量浮点数近似实数误差的方法。相对误差被定义为实数与浮点数之差除以实数的商。比如,将 4.567895 用浮点数表达为 4.567x10^(-2) 时的相对误差为 .000895/4.567895≈.00019。根据标准的要求,每个浮点数的正确计算结果的误差应不大于 0.5ulps。
浮点系统设计
在为数值应用开发设计的时候,很重要的一环是考虑输入的数据或者常数是否可以为实数。如果可以为实数,则在完成设计之前需要注意一些问题。需要检验来自数据集的数值在浮点表达式中是否很接近,有没有出现过大或者过小的情况。下面以二次方程求根为例。二次方程的根α 和 β 分别表达为下面两个等式:
查看评论 回复