王景悟
摘要:为了使单双精度浮点加法运算方便,减少资源浪费,设计了一套可同时运行两路单精度或一路双精度的浮点运算加法器结构。该浮点数加法器可通过信号控制端,在高电平时执行双精度浮点加法,低电平时执行单精度浮点加法,且运算结果符合IEEE-754标准格式,通过实验验证,该加法器结构合理,功能正确。
关键词:浮点运算;加法器;IEEE-754标准
中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2016)31-0231-02
浮点数的引用随着网络时代的迅速发展而变得广泛,我们对信息精度、细致度的要求越来越高,比如使用手机时对语音识别需要更清晰;电脑处理图片时要求更逼真,这些都表示对浮点运算的要求越来越高,使得当今社会在处理器设计中,浮点运算器(Floating-point unit)的设计与研究变得越来越重要[1]。在早期许多处理器中,并没有专门的浮点运算单元,只是用软件定点运算来代替,从而使运算速率大大的下降,同时也不能满足高速运算的要求,但是现在,从硬件上设计一个独立浮点运算器是一件完全可以实现的事,因此现代的处理器能使用独立的硬件来实现浮点运算单元[2]。高速有效的浮点运算器结构包括浮点加法器、浮点乘法器、浮点除法器等部分的设计,根据Oberman的技术报告可知[3],浮点加法器的使用频率高达55%,因为减法最终会转换为采用浮点加法器实现,浮点乘除法器等一些浮点运算也会用到加法器,所以加法器是使用频率最高的浮点运算模块[4]。基于上述情况,本文提出了实现单双精度浮点运算加法器,此加法器对双精度浮点加法器结构做了些调整,在计算单双精度浮点运算时,只需通过控制端便可实现功能的切换。
1 IEEE-754标准简介
IEEE-754标准是计算机领域公认的浮点数标准(IEEE standard for binary floating point arithmetic.ANSI/IEEE754-1984)[5]。IEEE-754浮点数由三部分组成:符号、阶码和尾数。尾数部分由小数部分和隐含位构成。标准定义了32位的单精度和64位的双精度两种格式,其中符号位:0代表正数,1代表负数,它们的阶码字段分别是8位和11位,尾数字段分别为23位和52位,它代表着浮点数的精确度,其包含着一个隐含位和小数部分,隐含的基数值为2。为了使浮点数格式整洁,对浮点数进行了规格化处理,规格化的浮点数的格式表达式是:,其中代码b是二进制数0或者1。要求将小数点放在第一个非零數的后面,在这种规则下,一个小优化放在二进制规格化浮点数数上,而二进制数第一个非零数字只能是1,所以在小数点前面的第一位总是1,故在IEEE-754标准中32位单精和64位双精格式中这个1是不出现的,称其为隐藏位(hidden bit)。在IEEE-754标准中,为了有效字段能表示更多的数字,内存不储存这个1,有效字段实际上只储存了尾数部分。下面显示了32位单精度和64位双精度的格式,
阶码部分既要能够要能够代表正阶码,又要能够代表负阶码,为了做到这一点,阶码部分实际储存的是浮点数指数加上一个偏移量,在IEEE-754标准中单精度浮点数的阶码偏移量位127,双精度的阶码偏移量为1023。
2 浮点数加法算法
1) 指数相减:两数阶码不相等,表示小数点位置没有对齐,必须使两阶码相等,才执行加法操作。比较两个阶码大小,求阶码差值|d|。
2) 指数对齐:采用“小阶向大阶对齐”,将阶码较小的浮点数的尾数右移|d|,使两个浮点数阶码相等,实现对阶。
3) 尾数有效位相加:根据操作码(加或减)和操作数的符号完成有效位加或减。
4) 尾数转换:计算出尾数的结果都为补码表示的,需转换为原码。
5) 规格化与舍入:结果规格化使尾数为1.F,找出高位第一个1的位置,根据它所在的位置,然后尾数左移或右移,调整阶码。
6) 溢出检查:检查阶码是否溢出,若溢出标志溢出位,若无则正常输出。
3 单、双精度浮点数加法器设计
设计单双精度浮点数加法器,经过分析与查阅相关的资料,双精度加法器经过一些改动与设计[6],便可实现的两路并行单精度或一路双精度浮点加法运算,通过功能控制端en的信号处于高电平或低电平,实现单精度或双精度加法之间的切换,即当en为高电平时,执行双精度浮点加法运算,当en为低电平,执行两路并行单精度浮点加法运算,最后输出符合IEEE-754标准格式的浮点数。
由单精度和双精度的位数可知,每一个双精度数可以由两个单精度数组成,所以当该加法器输入两个双精度数A和B时,则A可以由两个单精度数和组成,B可以两个单精度数和组成。当功能控制端en为低电平时,执行两路并行单精度加法,即执行+和+运算操作,当功能控制端en为高电平时,执行一路双精度加法,即执行A+B运算操作。该加法器尾数分离与抽取是关键模块之一,需根据控制端en信号来选取尾数为单精度还是双精度尾数。首先尾数的储存格式是个问题,双精度的尾数加上隐藏位有53位,再加上浮点数的符号位总共54位,而单精度尾数加上隐藏位与符号位共25位,所以将双精度54位尾宽的尾数格式分割成两个各27位位宽格式,用此来储存两个25位单精度尾数,且都从各自的储存格式的低位存起,各自空余出的两个高位分别用2b00填补,从而达到与双精度54位尾数同样的位宽,从而可以根据en信号来选择正确的尾数数据进行后续的操作。
该单双精度加法器在尾数进行加运算之前,首先需要使两浮点数阶码相等,按小阶向大阶看齐的规则,求出阶码的差值,使阶码较小的尾数(除去符号位)向右移动两阶码差值位。然后对移动后的浮点数尾数与未移位的浮点数尾数,使其各添加一位符号位构成双符号位,并且使两尾数原码转换为补码,符号位保持不变,这样就不用考虑浮点数尾数为正或为负,也不用交换两浮点数尾数顺序,此构造可以使浮点尾数加法运算变得简便,最后使两浮点尾数补码相加求出结果。对于浮点数双精度尾数再添加一位符号位,则双精度尾数就变成55位,单精度尾数再填加一位符号位就变成26位,同样将浮点数双精度尾数分割去储存两单精度尾数,一部分为28位位宽,空余的高两位插入2b00,另一部分为27位位宽,空余的高一位插入1b0。
上述过程中浮点加法运算结果为补码,因此需要把补码结果转换为原码,且符号位保持不变,然后对浮点尾数原码结果进行规格化与按IEEE-754标准舍入,规格化即找出第一1的位置,而本文查找第一个1的方法用的是优先编码原理,将1移至浮点尾数小数点前面第一个位置,接下来对阶码进行调整,最后对阶码进行检查看是否有溢出,如有溢出标志溢出位,最后经过整理输出符合IEEE-754标准格式的浮点数。上文所述单双精度加法器模块结构如图1所示:
4 仿真结果分析
用硬件描述语言Verlog HDL对该单双精度浮点运算器进行设计,使用Altera公司的Quartus ii 13.0开发软件对设计的加法器进行仿真,由Quartus ii 13.0随机产生测试数据,将测试的数据结果与C/C++编译的浮点加法器测试的结果进行对比,结果完全正确,证明了该浮点加法器结构与功能正确。图2为所示仿真结果,opa(A)和opb(B)为输入的两个双精度或四个单精度浮点数,mm为输出结果,aflag、bflag、aflag1、bflag1为标志位,即如果输入的浮点数为非規格化浮点数或超出单双精度范围时,标志位将进行标志,如果输入数为规格化浮点数时标志位为1,statex和statey为单精度输出结果标志位,doustate为双精度输出结果标志位,如有溢出则进行标志,图中en1(en)和op1为控制信号,当en1(en)为高电平时执行双精度浮点加法,当en1(en)为低电平时执行单精度浮点加法,op1为加减法器切换控制端。
5 结束语
本文的单双精度浮点加法器在双精度浮点加法器的结构上做了一些调整,设计出能并行执行两路单精或一路双精的浮点运算加法器,通过信号控制端,选择高或低电平时,使加法器可以在单精与双精加法器之间完成切换,通过验证该加法器结构和功能正确,且单双精度加法器切换方便,适合去处理存在大量单精度和双精度浮点数的场合是有实际意义的。
参考文献:
[1] 王重阳,夏宏.单、双、扩展精度自适应浮点乘、除和开方运算单元的实现[D].保定:华北电力大学,2011.
[2] 张素萍,李洪刚,张慧坚.单精度浮点运算单元的FPGA设计与实现[J].计算机测量与控制,2011(5).
[3] 王大宇,崔晓平.高性能浮点加法器的研究与设计[D].南京:南京航空大学,2011.
[4] 冯为,金西.一种快速浮点加法器的优化设计[D].合肥:中国科学技术大学,2009.
[5] 王冬冬,董辉.基于FPGA的浮点运算器设计[D].大连:大连海事大学,2009.
[6] 范继聪,洪琪.单双精度加法器的可重构设计研究[J].计算机工程与设计,2013(11).