一种双精度浮点数除法器的设计方法及除法器 技术领域
本发明涉及一种除法器。特别是涉及一种高性能、低面积开销的双精度浮点数除法器的
设计方法及除法器。
背景技术
除法算法主要分为两种:一种是慢速算法,一种是快速算法。慢速算法是一种基于数位
迭代的方法,每次迭代产生一位商位,收敛速度为线性收敛。恢复余数法、不恢复余数法及
SRT法都属于慢速算法。快速算法通常使用查表法得到一个接近商值的种子值,以乘法作为
基本的迭代步骤,每次迭代产生多个商位,收敛速度为对数收敛。Newton-Raphson和
Goldschmidt都属于快速算法。
由IEEE-754标准对双精度浮点数的定义得知,一个双精度浮点数占64bit,其中1位符号位,
11位指数位,52位尾数位(加上隐含的前导1则为53位)。两双精度浮点数相除得到的结果,
尾数部分的取值范围为(0.5,2),因此要确保尾数部分的最终误差ε<2-54,这样才能保证最终
的尾数是精确的结果。
高性能双精度浮点除法器的一种广泛被认可的设计方法是先通过二次逼近查表法得到被
除数X(以Y/X为例)倒数的种子值Rf,该种子值是1/X的近似值,精度为30bit。得到种
子值之后再通过一次Goldschmidt的方法,具体来讲是一次乘法运算和两次乘加运算,得到
最终的结果。
在实际的应用中,相比较于乘法和加法来讲除法并不是一种常见的操作,如果用上述方
法设计双精度浮点除法器,其面积开销会远大于设计乘法器和加法器所带来的面积开销,分
析得知,主要的面积开销在于通过二次逼近法得到的查找表的面积(31Kb),一个53x30乘
法器面积,一个53x30的乘加单元面积和56x28的乘加单元的面积。虽然该方法可以实现完
全流水,但是由于除法操作的较少使用,使得在实际应用中不能发挥该双精度浮点除法器的
性能优势。
发明内容
本发明所要解决的技术问题是,提供一种能够减少双精度浮点除法器的面积开销又满足
应用需求的双精度浮点数除法器的设计方法及除法器。
本发明所采用的技术方案是:一种双精度浮点数除法器的设计方法,包括:
第一阶段,采用最小最大二次多项式逼近算法计算倒数函数1/X的种子值Rf,基中,X
为除数的53位尾数部分;
第二阶段,基于硬件复用方法的两次Goldschmidt迭代,得到最终精确的结果。
第一阶段包括如下步骤:
1)将53位尾数X被分成三个部分:高位部分X1,中间部分X2和低位部分X3,得到,
X1=[1.x1x2x3...xm1]
X2=[xm1+1........xm2]×2-m1
X3=[xm2+1.........xn]×2-m2
对于倒数函数1/X通过如下公式进行计算,
X-1≈C0+C1X2+C2X22 (1)
其中,系数C0,C1,C2通过软件Maple获得,在Maple中通过调用Remez算法来实现最小
最大算法,从而得到三个系数C0、C1和C2,并将三个系数C0,C1,C2存入系数查找表;
2)采用高位部分X1进行查表,得到C0、C1和C2的位宽,同时对中间部分X2进行基
数为4的Booth编码,以及求中间部分X2的平方值和对所述该平方值进行Booth编码;
3)将用两个部分积产生模块分别产生C1X2和C2X22的部分积与查表得到的C0,采用
三级4:2CSA树得到最终种子值的CARRY和SUM项;
4)采用一个超前进位加法器CLA对最终种子值的CARRY和SUM项进行相加,得到输
出结果倒数函数1/X的种子值Rf。
第二阶段包括两次Goldschmidt迭代共涉及5次乘法和2次求补运算,如下步骤:
1)将第一阶段得到的种子值Rf分别与53位尾数X和被除数的尾数部分Y相乘得到d0
和z0,对d0求补后得到x0,然后将z0与x0相乘得到z1;
2)在第二次Goldschmidt迭代中,将d0与x0相乘得到d1,d1求补后得到x1,将得到
的x1与z1相乘得到最终的结果z。
本发明的采用双精度浮点数除法器的设计方法得到的除法器,包括有用于计算倒数函数
1/X的种子值Rf的第一部分和与所述的第一部分的输出相连的用于计算最终精确结果的第二
部分,其中,
第一部分包括:
寄存器,分别存放53位尾数X的高位部分X1、中间部分X2和低位部分X3;
第一查找表、第二查找表和第三查找表,分别连接所述寄存器的高位部分X1的输出端;
第一Booth编码器,输入端连接所述寄存器的中间部分X2,用于对中间部分X2进行重
新编码;
专用平方单元,输入端连接所述寄存器的中间部分X2,用于求取中间部分X2的平方值;
第二Booth编码器,输入端连接所述专用平方单元输出端,用于对求出的平方值进行重
新编码;
第一部分积产行单元,分别连接第二查找表和第一Booth编码器的输出端,用于产生
C1X2的9个部分积;
第二部分积产生单元,分别连接第三查找表和第二Booth编码器的输出端,用于产生
C2X22的6个部分积;
第一级进位保存加法器单元,分别连接第一查找表、第一部分积产行单元和第二部分积
产生单元,用于产生第一级的CARRY和SUM项;
第二级进位保存加法器单元,连接第一级进位保存加法器单元的输出端,用于产生第二
级的CARRY和SUM项;
第三级进位保存加法器,连接第二级进位保存加法器单元用于产生第三级的CARRY和
SUM项;
超前进位加法器,连接第三级进位保存加法器单元的输出端,用于计算得到最终的种子
值Rf;
第二部分包括:
第一多路选择器,分别连接外部控制信号sel、补码器的输出和第二部分输出的最终的种
子值Rf,用于根据外部控制信号sel,选择补码器的输出信号和第二部分输出的最终的种子值
Rf两个信号中的一个;
第二多路选择器,分别连接外部控制信号sel、补码器的输出和第二部分输出的最终的种
子值Rf,用于根据外部控制信号sel,选择补码器的输出信号和第二部分输出的最终的种子值
Rf两个信号中的一个;
第三多路选择器,分别连接外部控制信号sel、53位尾数X的输出信号以及第一乘法器的
输出端,用于根据外部控制信号sel,选择53位尾数X的输出信号和第一乘法器的输出信号
中的一个;
第四多路选择器,分别连接外部控制信号sel、被除数的尾数部分Y的输出信号以及第二
乘法器的输出端,用于根据外部控制信号sel,选择被除数的尾数部分Y的输出信号和第二乘
法器的输出信号中的一个;
第一乘法器,分别连接第一多路选择器和第三多路选择器的输出端,用于对该两路输出
进行相乘;
第二乘法器,分别连接第二多路选择器和第四多路选择器的输出端,用于对该两路输出
进行相乘,同时输出最终结果;
补码器,连接第一乘法器的输出端,用于对第一乘法器的输出结果求补。
对应计算倒数函数1/X的公式X-1≈C0+C1X2+C2X22,所述的第一查找表内存储系
数C0,第二查找表内存储系数C1,第三查找表内存储系数C2。
所述的第一级进位保存加法器单元包括有:
第一进位保存加法器,分别连接第一查找表的输出端和第一部分积产行单元的9个部分
积中的3个部分积的输出端,用于产生第一级的第一个CARRY和SUM项;
第二进位保存加法器,连接第一部分积产行单元的9个部分积中的另4个部分积的输出
端,用于产生第一级的第二个CARRY和SUM项;
第三进位保存加法器,分别连接第一部分积产行单元的9个部分积中的最后2个部分积
的输出端和第二部分积产生单元的6个部分积中的2个部分积的输出端,用于产生第一级的
第三个CARRY和SUM项;
第四进位保存加法器,连接第二部分积产生单元的6个部分积中的其余4个部分积的输
出端,用于产生第一级的第三个CARRY和SUM项。
所述的第二级进位保存加法器单元包括有:
第六进位保存加法器,分别连接第一级进位保存加法器单元中的第一进位保存加法器和
第二进位保存加法器的输出端,用于产生第二级的第一个CARRY和SUM项;
第七进位保存加法器,分别连接第一级进位保存加法器单元中的第三进位保存加法器和
第四进位保存加法器的输出端,用于产生第二级的第二个CARRY和SUM项。
本发明的一种双精度浮点数除法器的设计方法及除法器,是一种高性能、地面积开销的
除法器,通过硬件复用方法,在性能减低很小的情况下可或者很大的面积优势,尤其适用于
对面积要求严格的嵌入式微处理器领域。
附图说明
图1是本发明基于查找表法计算1/X的种子值Rf的结构框图;
图2是本发明两次Goldschmidt迭代的结构框图;
图3是本发明两次Goldschmidt迭代的计算流程图。
图中
1:寄存器 2:第一查找表
3:第二查找表 4:第三查找表
5:第一Booth编码器 6:专用平方单元
7:第二Booth编码器 8:第一部分积产行单元
9:第二部分积产生单元 10:第一进位保存加法器
11:第二进位保存加法器 12:第三进位保存加法器
13:第四进位保存加法器 14:第六进位保存加法器
15:第七进位保存加法器 16:第三级进位保存加法器
17:超前进位加法器 18:第一多路选择器
19:第二多路选择器 20:第三多路选择器
21:第四多路选择器 22:第一乘法器
23:第二乘法器 24:补码器
具体实施方式
下面结合实施例和附图对本发明的一种双精度浮点数除法器的设计方法及除法器做出详
细说明。
发明的一种双精度浮点数除法器的设计方法及除法器,采用一次查表法+两次
Goldschmidt迭代的方法来设计双精度浮点除法器,其中查找表也是采用二次多项式逼近算法
得到,但是其面积要远小于原方法所使用的查找表的面积,经查找表之后会得到一个比原先
方法更小精度的种子值Rf,在后续的Goldschmidt中,采用两次迭代的方法来获得与原方法
相同的精度,但是两次迭代使用相同的硬件单元(2个60x60的乘法器)。总的来看,我们采
用的方法在查找表的面积上有很大的减少,但是由于采用了硬件复用技术,因此后续两次
Goldschmidt的面积开销并没有增加太多,总面积开销要小于原方法的面积开销。从性能上来
看,采用我们的方法设计出的双精度浮点除法器虽然不能完全可流水,但是由于实际应用中
除法操作并不常见,因此采用该方法设计的除法器并不会带来整体性能上的损失。
本发明的一种双精度浮点数除法器的设计方法,包括:
第一阶段,采用最小最大二次多项式逼近算法计算倒数函数1/X的种子值Rf,基中,X
为除数的53位尾数部分;第二阶段,基于硬件复用方法的两次Goldschmidt迭代,得到最终
精确的结果。
其中,第一阶段包括如下步骤:
1)将53位尾数X被分成三个部分:高位部分X1,可为5位,中间部分X2,可为17位
和低位部分X3,可为31位,得到,
X1=[1.x1x2x3...xm1]
X2=[xm1+1........xm2]×2-m1
X3=[xm2+1.........xn]×2-m2
对于倒数函数1/X通过如下公式进行计算,
X-1≈C0+C1X2+C2X22 (1)
其中,系数C0,C1,C2通过软件Maple获得,在Maple中通过调用Remez算法来实现最小
最大算法,从而得到三个系数C0,C1,C2,并将三个系数C0,C1,C2存入系数查找表;
在实际的计算中,通过53位尾数X的m1bit高位部分X1进行查表得到系数C0、C1和
C2,然后用得到的三个系数与53位尾数X的中位部分X2按照公式(1)进行二次多项式的计
算,从而得到的近似值Rf。用于查表的X1的位宽,用于计算的X2的位宽及C0、C1和
C2的位宽会直接影响得到的种子值的精度,其中X1的位宽和三个系数的位宽又会直接影响
系数查找表的大小,前者决定了查找表的深度而后者决定了查找表的宽度。查找表的面积会
极大影响整个双精度浮点除法器的面积,而得到的种子值的精度又会对后续Goldschmidt迭
代的次数有着直接的影响,因此如何折中查找表的面积与得到的种子值的精度则需要设计者
进行仔细权衡。
2)采用高位部分X1进行查表,得到C0、C1和C2的位宽,同时对中间部分X2进行基
数为4的Booth编码,以及求中间部分X2的平方值和对所述该平方值进行Booth编码;
在本方法的实施例中选用位宽较小的X1进行查表,具体来讲是采用5位X1进行查表,
得到C0、C1和C2的位宽分别为30、20和12进行多项式的计算,X2的一次项采用17bit,
二次项用12bit,最终经过多项式的计算得到一个精度为19bit的种子值Rf,由于得到的种子
值精度较低,因此在第二阶段采用两次Goldschmidt迭代来获得满足需要的精度。
在进行二次多项式的计算过程中,本发明使用了一种优化算法来计算X2的平方项,在性
能不降低的情况之下面积开销减小了一半。在得到了X2的平方项之后整个多项式的计算就
剩下了两次乘法和两次加法,在我们的设计中采用了一种融合累加树的方法进行后续多项式
的计算。
3)将用两个部分积产生模块分别产生C1X2和C2X22的部分积与查表得到的C0,采用
三级4:2CSA树得到最终种子值的CARRY和SUM项;
4)采用一个超前进位加法器CLA对最终种子值的CARRY和SUM项进行相加,得到输
出结果倒数函数1/X的种子值Rf。
其中,第二阶段包括两次Goldschmidt迭代共涉及5次乘法和2次求补运算,第一阶段
的结果产生之后就开始进行第二阶段的计算,第二阶段计算的流程如图3所示,具体采用如
下步骤:
1)将第一阶段得到的种子值Rf分别与53位尾数X和被除数的尾数部分Y相乘得到d0
和z0,对d0求补后得到x0,然后将z0与x0相乘得到z1;
2)在第二次Goldschmidt迭代中,将d0与x0相乘得到d1,d1求补后得到x1,将得到的x1
与z1相乘得到最终的结果z。
下面对本发明方法的计算过程进行误差分析:
整个双精度浮点除法器的计算过程分为两个阶段,误差分析也主要根据计算的两个阶段
进行分析。
1、Rf的误差分析
第一阶段的结果会产生一个种子值Rf,该种子值的误差来源主要有:1)二次多项式逼近算
法本身的误差(εapprox),2)在多项式计算过程中因有限位宽而引入的算术误差。
总误差 ϵ Rf ≤ ϵ approx + ϵ C 0 X 2 + ϵ C 1 X 2 2 + | C 1 | max ϵ X 2 + | C 2 | ϵ X 2 2 ]]>
由于有限位宽的系数是通过Maple程序获得的,因此实际的多项式逼近误差应为:
ϵ ′ approx = ϵ approx + ϵ C 0 X 2 + ϵ C 1 X 2 2 ]]>
因此:
ϵ Rf ≤ ϵ ′ approx + | C 1 | max ϵ X 2 + | C 2 | ϵ X 2 2 ]]>
分析得知,当m1=5时,Rf的误差(εRf<2-19)满足本发明所设的误差精度。
2、Z的误差分析
在第二阶段计算过程中,以第一阶段的结果Rf作为输入进行两次Goldschmidt迭代,得
到最终结果z,z的误差也主要来自两方面:1)Goldschmidt迭代算法本身的误差(εitera),
2)在计算过程中因有限位宽表示而带来的算术误差(εarith)。
第二阶段总误差εz=εitera+εarith
最终的误差要满足εz<2-54,这样最终的结果才是精确的,我们不妨记在迭代的过程
中要保留的小数部分的位宽为t位(输入操作数X,Y的取值范围都为[1:2),最终结果Z的取值
范围为(0.5,2))。
迭代误差:
εitera=(εRf)4·X3·Y
因此εitera<2-72。
计算误差:
ϵ arith = ϵ z ′ + ϵ z 1 · x 1 + ϵ x 1 · z 1 + ϵ z 1 · ϵ x 1 ]]>
其中εz'是因乘法器输出的有限位宽而引入的误差,其值为2-t,是计算z1的过程
中所产生的总的误差,包括传递误差和累积误差。同理,是在计算x1的过程所产生的总
的误差,包括传递误差和累积误差,x1,z1的最大值均不超过2,因此
计算误差 ϵ arith < 2 - t + 2 · ϵ z 1 + 2 · ϵ x 1 + ϵ z 1 · ϵ x 1 ]]>
与的计算过程跟εarith类似
ϵ z 1 = ϵ z ′ 1 + ϵ z 0 · x 0 + ϵ x 0 · z 0 ]]>
而
ϵ x 1 = ϵ d 1 = ϵ d ′ 1 + ϵ d 0 · x 0 + ϵ x 0 · d 0 ]]>
其中,
ϵ z 0 = 2 - t , ϵ x 0 = ϵ d 0 = 2 - t ]]>
x0,z0,d0,最大值均不超过2,因此,计算误差
ϵ arith < 2 - t + 2 · ( ϵ z ′ 1 + ϵ z 0 · x 0 + ϵ x 0 · z 0 ) + 2 · ( ϵ d ′ 1 + ϵ d 0 · x 0 + ϵ x 0 · d 0 ) + ( ϵ z ′ 1 + ϵ z 0 · x 0 + ϵ x 0 · z 0 ) · ( ϵ d ′ 1 + ϵ d 0 · x 0 + ϵ x 0 · d 0 ) ϵ arith < 2 - t + 2 · ( ϵ z ′ 1 + 2 · ϵ z 0 + ϵ x 0 · z 0 ) + 2 · ( ϵ d ′ 1 + 2 · ϵ d 0 + 2 · ϵ x 0 ) + ( ϵ z ′ 1 + 2 · ϵ z 0 + 2 · ϵ x 0 ) · ( ϵ d ′ 1 + 2 · ϵ d 0 + 2 · ϵ x 0 ) ]]>
因此总的误差
ϵ z < 2 - 72 + 2 - t + 2 · ( ϵ z ′ 1 + 2 · ϵ z 0 + ϵ x 0 · z 0 ) + 2 · ( ϵ d ′ 1 + 2 · ϵ d 0 + 2 · ϵ x 0 ) + ( ϵ z ′ 1 + 2 · ϵ z 0 + 2 · ϵ x 0 ) · ( ϵ d ′ 1 + 2 · ϵ d 0 + 2 · ϵ x 0 ) ]]>
即,
εz<2-72+2-t+2·(2-t+2·2-t+2·2-t)+2·(2-t+2·2-t+2·2-t)
+(2-t+2·2-t+2·2-t)·(2-t+2·2-t+2·2-t)
即,
εz<2-72+2-t+4+2-t+2+2-t+2-2t+4+2-2t+3+2-2t+2-3t+3+2-3t+1+2-4t
<2-t+5
由此可知,t最小为59时,可满足εz<2-54,因此选取t=59,再加上1位整数位,因
此乘法器的位宽最小为60位时可满足精度要求。
本发明的采用双精度浮点数除法器的设计方法得到的除法器,包括有用于计算倒数函数
1/X的种子值Rf的第一部分和与所述的第一部分的输出相连的用于计算最终精确结果的第二
部分,其中,
如图1所示,第一部分包括:
寄存器1,分别存放53位尾数X的高位部分X1、中间部分X2和低位部分X3;
第一查找表2、第二查找表3和第三查找表4,分别连接所述寄存器1的高位部分X1的
输出端;对应计算倒数函数1/X的公式X-1≈C0+C1X2+C2X22,所述的第一查找表2
内存储系数C0,第二查找表3内存储系数C1,第三查找表4内存储系数C2。
第一Booth编码器5,输入端连接所述寄存器1的中间部分X2,用于对中间部分X2进行
重新编码;
专用平方单元6,输入端连接所述寄存器1的中间部分X2,用于求取中间部分X2的平方
值;
第二Booth编码器7,输入端连接所述专用平方单元6输出端,用于对求出的平方值进
行重新编码;
第一部分积产行单元8,分别连接第二查找表3和第一Booth编码器5的输出端,用于
产生C1X2的9个部分积;
第二部分积产生单元9,分别连接第三查找表4和第二Booth编码器7的输出端,用于产
生C2X22的6个部分积;如图1所示,两个乘数项C1X2和C2X22,分别对乘数项中的X2
和X2的平方项进行基数为4的Booth编码,从而两个部分积产生模块中分别得到9个部分
积和6个部分积,连同C0,共计16个部分积,之后对这16个部分积进行累加。由图可知,
我们采用3级4:2CSA累加树得到最终的CARRY和SUM项。最后通过一个超前进位加法器
CLA对这两项进行相加就得到了第一阶段的输出结果Rf,得到的种子值的精度为19bit。
第一级进位保存加法器单元,分别连接第一查找表2、第一部分积产行单元8和第二部分
积产生单元9,用于产生第一级的CARRY和SUM项;所述的第一级进位保存加法器单元包
括有:
第一进位保存加法器10,分别连接第一查找表2的输出端和第一部分积产行单元8的9
个部分积中的3个部分积的输出端,用于产生第一级的第一个CARRY和SUM项;
第二进位保存加法器11,连接第一部分积产行单元8的9个部分积中的另4个部分积的
输出端,用于产生第一级的第二个CARRY和SUM项;
第三进位保存加法器12,分别连接第一部分积产行单元8的9个部分积中的最后2个部
分积的输出端和第二部分积产生单元9的6个部分积中的2个部分积的输出端,用于产生第
一级的第三个CARRY和SUM项;
第四进位保存加法器13,连接第二部分积产生单元9的6个部分积中的其余4个部分积
的输出端,用于产生第一级的第三个CARRY和SUM项。
第二级进位保存加法器单元,连接第一级进位保存加法器单元的输出端,用于产生第二
级的CARRY和SUM项;所述的第二级进位保存加法器单元包括有:
第六进位保存加法器14,分别连接第一级进位保存加法器单元中的第一进位保存加法器
10和第二进位保存加法器11的输出端,用于产生第二级的第一个CARRY和SUM项;
第七进位保存加法器15,分别连接第一级进位保存加法器单元中的第三进位保存加法器
12和第四进位保存加法器13的输出端,用于产生第二级的第二个CARRY和SUM项。
第三级进位保存加法器16,连接第二级进位保存加法器单元用于产生第三级的CARRY
和SUM项;
超前进位加法器17,连接第三级进位保存加法器单元的输出端,用于计算得到最终的种
子值Rf;
如图2所示第二部分包括:
第一多路选择器18,分别连接外部控制信号sel、补码器24的输出和第二部分输出的最
终的种子值Rf,用于根据外部控制信号sel,选择补码器24的输出信号和第二部分输出的最
终的种子值Rf两个信号中的一个;
第二多路选择器19,分别连接外部控制信号sel、补码器24的输出和第二部分输出的最
终的种子值Rf,用于根据外部控制信号sel,选择补码器24的输出信号和第二部分输出的最
终的种子值Rf两个信号中的一个;
第三多路选择器20,分别连接外部控制信号sel、53位尾数X的输出信号以及第一乘法
器22的输出端,用于根据外部控制信号sel,选择53位尾数X的输出信号和第一乘法器22
的输出信号中的一个;
第四多路选择器21,分别连接外部控制信号sel、被除数的尾数部分Y的输出信号以及第
二乘法器23的输出端,用于根据外部控制信号sel,选择被除数的尾数部分Y的输出信号和
第二乘法器23的输出信号中的一个;
第一乘法器22,分别连接第一多路选择器18和第三多路选择器20的输出端,用于对该
两路输出进行相乘;
第二乘法器23,分别连接第二多路选择器19和第四多路选择器21的输出端,用于对该
两路输出进行相乘,同时输出最终结果;
补码器24,连接第一乘法器22的输出端,用于对第一乘法器22的输出结果求补。
本领域技术人员可以理解附图只是一个优选实施例的示意图,上述本发明实施例序号仅
仅为了描述,不代表实施例的优劣。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之
内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。