基于FPGA的浮点指数函数算法研究与实现

2017-11-03 03:14,,
计算机测量与控制 2017年10期
关键词:计算精度级数指数函数

, ,,

(北京广利核系统工程有限公司,北京 100094)

基于FPGA的浮点指数函数算法研究与实现

史雄伟,王成,张春雷,陈乃奎

(北京广利核系统工程有限公司,北京100094)

基于FPGA的核电站仪控设备中涉及大量浮点指数运算,而常用的CORDIC算法和线性逼近法等存在计算范围小、计算精度不高等问题,对FPGA硬件实现指数函数的方法进行研究,并提出一种改进的级数近似法;该方法对输入进行预处理,将输入分解后采用查找表和泰勒级数展开结合的方法,在展开很少项数的情况下快速收敛,发挥查找表法和级数近似法的优势,提高算法的运算精度和效率;在Matlab环境下对改进算法的有效性进行仿真验证,且采用Verilog语言进行编程实现,在Microsemi公司的IGLOO2系列FPGA上进行具体算法性能验证;Matlab仿真和FPGA验证结果均表明,改进的级数近似法能够大幅增大指数函数的自变量输入范围,并提高计算精度。

指数函数; FPGA;级数近似法

0 引言

在核电站仪控系统中,需要采集堆芯外核检测仪表的数据以实现对核反应堆的实时监控。对于一部分核测设备,需要进行指数、对数等超越函数的算法运算才能得到实际物理值。FPGA凭借其并行定制计算的高效性和可重构的灵活性,在核电站仪控设备中得到越来越广泛的应用。然而FPGA本身对指数函数的直接计算缺乏有效地支持,而且通用、高效的超越函数计算IP核也较少[1],因此有必要研究运算高效、精度高、计算范围大的浮点指数函数硬件实现方法。

在对CORDIC算法、分段线性逼近法等常用算法进行性能分析的基础上,针对其计算范围小、精度差等问题,提出一种改进的级数近似法,与查表法结合实现浮点指数函数,能有效提高计算精度和计算效率。通过Matlab仿真分析和Microsemi的IGLOO2系列的FPGA器件的硬件实现,对算法进行性能测试评估。实验结果表明,相比于CORDIC 算法、分段线性逼近法,本方法在计算精度和收敛域范围方面的性能更好。而且本方法能适应于多种常见超越函数的计算,适用性较好。

1 现有算法分析

目前在FPGA中硬件实现指数函数常用的方法有CORDIC算法、分段线性逼近法、查表法、级数近似法等[2-6]。

1.1 CORDIC算法实现

CORDIC即坐标旋转数字计算方法是一种数值逼近算法,最初应用于解决三角学问题,通过多次迭代将一些在硬件实现中既耗时又占用资源的运算转换为简单的移位、加减运算,便于硬件实现,后来被广泛用于多种初等函数的运算中(包括三角函数、乘除法运算、指数运算、对数运算等)[3-6]。

最初的CORDIC算法基本原理为通过一系列固定的、与运算基数有关的角度的不断偏摆以逼近所需的旋转角度。1971年,J.S.Walther提出了统一的CORDIC算法,引入工作模式参数m:m=1为圆周系统、m=0为线性系统、m=-1为双曲系统),采用一个CORDIC迭代方程统一表示3种系统:

xi+1=xi-mδiyi·2-i

yi+1=yi+δixi·2-i,i=0,1,2,…,N-1

zi+1=zi-δiθi

选择不同参数可得到不同的计算结果,如表1所示。

表1 CORDIC算法的参数选择及结果

下面介绍利用CORDIC算法的双曲旋转法实现自然指数函数运算。

由于指数函数ex=sinhx+coshx,采用双曲系统的旋转模式可以计算sinhx和coshx,初始值设置为:x0=Kh,y0=0,z0=x。

需要注意的是在双曲系统下要保证迭代序列收敛,需要从第4项开始每隔3n+1项必须重复一次,即n=1,2,3,4,4,5,6,…,13,13,14,…,40,40,…,重复迭代的位置为:i= 4, 13, 40,…,k, 3k+1,...

根据文献[6],自变量的收敛范围仅为(-1.1182,1.1182),函数的输入范围受到极大限制。

即1.1182,解决的办法是增加i为负数的迭代,改进的迭代公式为:

当i>0时,xi+1=xi+δiyi·2-i

yi+1=yi+δixi·2-i

zi+1=zi-δiarctanh(2-i)

当i<=0时,xi+1=xi+δiyi·(1-2i-2)

yi+1=yi+δixi·(1-2i-2)

zi+1=zi-δiarctanh(1-2i-2)

硬件实现时,首先计算出Kh的值,然后给定x0=Kh,y0=0,z0=x,进行多次迭代后,z趋近于0,指数函数的计算结果为x+y。

1.2 分段线性逼近法

分段线性逼近法是将查找表与多项式逼近相结合,保存各段多项式的系数,计算速度快,消耗资源少,易于硬件实现[7],广泛应用于人工神经网络、图像处理等非线性函数的计算过程[8]。

分段线性逼近法采用多段直线来逼近曲线,创建查找表保存各段直线的系数,计算时根据输入选择合适的直线段逼近非线性函数。每个直线段表示为y=kix+bi,根据每一个分段区间逼近基点处直线与非线性函数的值相同,可以求得各段直线段的k值和b值。

基于分段线性逼近法在FPGA 中实现指数函数的主要步骤为:

步骤1:按照一定的分段规则将指数函数的输入区间进行划分,求取各个直线段的逼近基点。本文根据需求定义输入区间为[-10,10],采用均分输入区间的方法,以s为步进针对[-10,10]区间划分为20/s个区间。

步骤2:根据相邻2个逼近基点的指数函数值,计算各个直线段y=kix+bi中的k、b值。为方便硬件实现直接使用,需要将k、b值转换成相应的数据格式。一般采用最小二乘法拟合得到每段的k、b值,并将其存储在FPGA的片内RAM中。

步骤3:使用硬件描述语言实现硬件设计。首先要计算的指数函数自变量x,选择正确的k、b值,然后再进行一次乘法和加法操作即得到计算结果,其计算速度较快。

1.3 查表法原理

查表法是根据计算精度要求,先将指数函数的输入值分为若干个点,分别求出对应点的函数值,并将结果写入ROM/RAM等存储器中。然后通过适当的运算将输入变量与存储器地址对应起来,再计算时直接查表得到结果。

用查表法实现函数计算,虽然没有输出延时,但其所需存储单元随着函数输入域的增大或是计算精度的提高呈指数形式增加,资源消耗巨大[2],甚至是不可行的。

1.4 级数近似法原理

级数近似法利用泰勒展开式将超越函数的复杂运算转换为基本的乘法和加减法运算,再根据计算精度对级数进行截取。级数近似法需要的乘法器、加法器较多,硬件实现复杂,资源消耗较大。

根据泰勒公式可以得到指数函数ex的幂级数展开式为:

2 改进算法设计

针对现有算法存在精度不高、计算范围小、消耗资源多等问题,提出一种改进的级数近似法,采用查找表与级数近似法相结合实现浮点函数计算,有效提高计算精度和计算效率。

2.1 改进级数近似法的原理

针对泰勒级数近似法的缺点进行改进,将输入数据x进行预处理,将其转换到0点附近的区域,采用较少的展开项满足误差需求。原理为:

x=a+c,其中a为整数部分,c为小数部分。但是在c取值接近1时,需要的迭代步骤仍然较多,进一步,令x=a+b1*2^(-1)+b2*2^(-2)+…+bn*2^(-n)+c其中,a为整数部分,b1~bn分别2-1~2-n的二进制系数,c为接近与0的余项。c<2(-n),能够保证只采用幂级数展开的前几项即可满足精度要求。最终结果ex=ea·eb·ec。其中,b=b1*2^(-1)+b2*2^(-2)+…+bn*2^(-n)。

在n确定后,根据IEEE754标准浮点数的表示方法,可以方便求得a,b1~bn,和c.以n取3为例,x=1.3125时,浮点表示为0x3FA80000,即:

符号位(1bit)指数位(8bit)尾数位(23bit)00111111101010000000000000000000

则a=1,b1=0,b2=1,b3=0,c=0.00010000000000000000000(0.0625)

硬件实现时,根据所需精度确定n的取值和泰勒级数展开的项数,并将ea的值事先计算出来做成查找表,a=0,1,2,…,88(单精度浮点数能表示的数值范围决定a最大值为88),同理将eb也分别计算出来存入查找表中备用。

基于该算法在FPGA 中实现指数函数的计算,主要步骤为:

步骤1:将输入值x进行预处理,拆分成整数部分a,并通过移位等操作得到b1,b2,b3,…bn和小数余项c。

步骤2:根据a的结果查找ea的值,根据b1,b2,b3,…bn查找eb的值。

步骤3:根据泰勒级数展开式计算ec的值。

步骤4:计算最终结果ex=ea·eb·ec。

地铁使人们出行更加便捷,所以对房价影响较大。小区与地铁站的间距每增加一千米,房价下降356元/m2,对住宅价格影响较显著。交通轨道能使居住区的通达度得到提高,使沿线住房价格得到提高,为开辟和建造新居住区予以潜在的利润保证,开发居住区的最佳位置大多数选择在交通干道两侧和快速路进出口周围区域。

本方法采用级数近似和查找表结合的方法,能够在整个定义域内都得到满意的精度。

2.2 性能分析

经过理论分析可得,展开式项数越多,计算精度越高,但是消耗的资源会越大,为了适合硬件实现,以展开至x4项进行分析。

其次确定n的数值,b1~bn不存在,即n=0的情况,即只将数据分解为整数部分和小数部分,最大相对误差是0.01049。n=1,2,3的情况下最大相对误差分别为:1.19277e-004,3.15153e-006,9.05842e-008;仿真结果与理论分析一致,n的取值越大,最后得到的小数余项c越小,展开项数一致的情况下精度越高。综上所述为了平衡资源和精度,FPGA硬件实现时取n=3,展开至x4项进行分析。

下面对提出的改进算法与CORDIC算法、分段线性逼近算法在matlab环境下进行精度性能分析比较。参考文献[6],CORDIC算法负向迭代次数为-5时收敛域范围扩展到(-12.42644,12.42644),从-8次迭代,收敛域扩展到(-22.82194, 22.82194)。由于硬件资源等限制,采用正向迭代22次进行分析[4]。对于分段线性逼近法,取x的范围与CORDIC算法的收敛域一致,步长为0.01,各拟合直线段的k值和b值均采用最小二乘法拟合得出。图1和图2分别是3种算法在输入范围为(-12,12)和(-22,22)时3种算法的相对精度曲线图。

图1 相对误差曲线图

图2 误差曲线图

对于CORDIC算法,负向迭代次数为-5时,最大相对误差为7.43625e-006,负向迭代次数为-7时,最大相对误差增大为6.71834e-004。由于单精度浮点数能够表示的精度有限,当不能足够精确地表示Kh时,计算结果会有较大的误差。收敛域越大,i为负数的迭代次数越多,计算的Kh的误差会越大,需要在收敛域和精度之间寻找平衡。

分段线性逼近法的在输入范围为(-12,12)和(-22,22)时,根据步长得到划分的段数分别为2 400,4 400,最大相对误差分别为-6.02285e-006,-7.46858e-006。

改进级数近似法在整个输入范围内使用的参数一致,最大相对误差为9.05842e-008,比CORDIC算法和分段线性逼近法精度都高,而且输入范围增大。经过仿真分析,改进级数近似法在输入范围(-86,88.7)内都能够保证运算的高精度,并且所消耗的资源不随输入范围的变化而改变。

3 算法的FPGA实现

为对改进级数近似法的计算精度、计算速度、资源消耗及适用范围进行评估,将上述设计在Microsemi公司的IGLOO2系列的FPGA M2GL150上实现,该芯片拥有多达240个mathblock资源和丰富的LUT和逻辑资源。

在硬件实现时,CORDIC算法从-5开始负向迭代,正向迭代次数设置为22,能够保证计算相对精度在10-6级别。分段线性逼近法计算范围与CORDIC的收敛域保持一致,步长为0.01。改进级数近似法n取3,即保证小数项c小于0.125。展开项为5项,即计算到x4项。为保证运算速度,所有算法均采用流水线结构。

经过理论分析和仿真结果以及FPGA的硬件实现,可以得到3种算法的性能对比如表2所示。

CORDIC算法可以使用简单的移位和累加代替乘法,实现简单,但是要保证精度需要迭代的次数较多,而且计算范围有限。

表2 3种算法的性能对比

分段线性逼近法实现简单,仅使用查找表和一次乘法和加法即可计算结果,查找表的大小与计算范围和步长相关,计算范围越大、步长越小则需要的查找表越大。在步长较大精度差,步长小时占用的资源多,而且查找表耗费的时间也会增长。

改进级数近似法需要使用乘法器,硬件实现相对复杂,消耗了较多的硬件mathblock资源和逻辑资源,并且计算速度也相对较慢。但是通过改进的级数近似法能够大幅加大计算范围,而且计算精度在输入范围内均保证高精度,比CORDIC算法高一个数量级,优势明显。

4 结论

本文对当前硬件实现指数函数的方法进行了研究,并以增大计算范围、提高计算精度为目的,提出一种改进的级数近似法。该方法采用查找表和级数近似法相结合的方式,将输入数据进行预处理,在展开很少项数的情况下快速收敛,既保证了计算精度,又大幅提高了指数函数的计算范围。在Matlab环境下对CORDIC算法、分段线性逼近法和改进级数近似法进行了仿真分析,并采用Verilog语言,在Microsemi公司的IGLOO2系列的FPGA M2GL150上验证了各算法的性能,实验结果表明,改进的级数近似法虽然消耗较多的资源和计算时间,但是在计算范围和计算精度方面都有明显的优势,能够更大范围地满足工程应用需求。文中提出的改进方法已经在某核电站仪控平台实现过程中得到应用,该算法也适用于其他基于FGPA 的系统实现中。

[1]王少军,张启荣,彭 宇,等. 超越函数FPGA计算的最佳等距分段线性逼近方法[J]. 仪器仪表学报,2014,35(6):1209-1216.

[2]赵海燕,周晓方,周 电. 对数/指数算法的改进及其VLSI实现[J]. 计算机工程与应用,2007,43(7):104-107.

[3]牟胜梅,李兆刚. 一种面向FPGA的指/对数函数求值方法[J]. 计算机工程与应用,2011,47(33):59-61.

[4]黄晓可,刘洛琨,汪 涛,等. 基于改进SF-CORDIC的指数和对数函数求值算法[J]. 计算机应用与软件, 2014,31(2):279-282.

[5]刘小会,许 蕾,刘海颖,等. 基于CORDIC改进算法的反正切函数在FPGA中的实现[J]. 计算机技术与发展,2013,23(11):103-107.

[6]Hu X B, Harber R G, Bass S C. Expanding the range of convergence of the CORDIC algorithm[J]. IEEE Transactions on Computers, 1991,40(1):13-21.

[7]杨 阳,王永纲,都军伟. Piecewise算法计算超越函数及其FPGA实现[J]. 核电子学与探测技术, 2010,30(6):755-758.

[8]Florea C, Vertan C. Piecewise linear approximation of logarithmic image processing models for dynamic range enhancement[J]. IEEE Transactions on Power Systems, 2011,26(4):2581-2583.

[9]郭邵忠,许瑾晨,陈建勋. 一种改进的超越函数的通用算法[J]. 计算机工程. 2012,38(15):31-34.

[10]张玲玲,李克俭,蔡启仲.基于FPGA自主控制浮点加减乘除控制器设计[J]. 计算机测量与控制, 2014, 22(10):2941-2943.

AlgorithmResearchandImplementationofFloatPointExponentialFunctionBasedonFPGA

Shi Xiongwei, Wang Cheng, Zhang Chunlei, Chen Naikui

(China Techenergy Co., Ltd., Beijing 100094, China)

A large number of floating-point exponential calculations are involved in nuclear power plant instrumentation based on FPGA,and the methods for hardware implementation of exponential function are studied, an improved series approximation algorithm is proposed, aiming at solving the problems such as small calculation scale, low precision existing in CORDIC algorithm and linear approximation algorithm. The lookup table and series approximation algorithm are combined in the proposed algorithm, with input data splitting into two part. It takes advantage of the lookup method and the linear approximation, and can work even using a few expansion series. The validity of the improved algorithm is simulated in Matlab, and algorithm is programmed using Verilog and verified on the IGLOO2 series FPGA of Microsemi Corporation. The Matlab simulation result and the implementation result on FPGA demonstrates that this method can expand the calculation capacity and with high accuracy.

exponential function; FPGA; series approximation method

2017-04-12;

2017-05-03。

国家科技重大专项(2011ZX06004-030)。

史雄伟(1985-),男,河北石家庄人,硕士,工程师,主要从事复杂数字信号处理和实现方向的研究。

1671-4598(2017)10-0221-03

10.16526/j.cnki.11-4762/tp.2017.10.056

TP39

A

猜你喜欢
计算精度级数指数函数
幂函数、指数函数、对数函数(2)
幂函数、指数函数、对数函数(1)
幂函数、指数函数、对数函数(1)
幂函数、指数函数、对数函数(2)
二重Dirichlet级数在收敛半平面内的增长性
无穷级数的柯西和与切萨罗和
一个非终止7F6-级数求和公式的q-模拟
基于SHIPFLOW软件的某集装箱船的阻力计算分析
几种常用的正项级数审敛法的比较
钢箱计算失效应变的冲击试验