《基于FPGA的Cordic算法实现的设计与验证.docx》由会员分享,可在线阅读,更多相关《基于FPGA的Cordic算法实现的设计与验证.docx(6页珍藏版)》请在第一文库网上搜索。
1、基于FPGA的Cordic算法实现的设计与验证CORDIC(CoordinateRotationDigita1Computer)算法即坐标旋转数字计算方法,是J?KVO1/r1于1959年首次提出,主要用Q函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。本文是基于FPGA实现Cordic算法的设计与验证,使用Veri1ogHD1设计,初步可实现正弦、余弦、反正切函数的实现。将复杂的运算转化成FPGA擅长的加减法和乘法,而乘法运算可以用移位运算代替。CordiC算法有两种模式,旋转模式和向量模式
2、。可以在圆坐标系、线性坐标系、双曲线坐标系使用。本文线初步实现在圆坐标系下的两种模式的算法实现。Cordic算法简化旋转模式,迭代位移算法。假设有一点PO(x,y),经过逆时针旋转角度,到达点Pm(xm,ym),我们根据数学运算可以得到公式如下:xm=xOcos-ysin=cos(x-ytan)ym二yOcos+xsin=cos(y-xtan)如果不考虑旋转后的向量模值,只考虑旋转角度,即去掉cos。,得到如下方程式。这里旋转的角度的正确的,但X和y的值增加。cos值是小于等于1的,值大于等于1所以模值应该增大。我们不能通过适当的数学计算去掉COS,但是去掉COSO项可以方便我们后面的坐标平面
3、旋转的计算。这里称为伪旋转。xmx-ytanym-y-xtanCordic的方法核心就是伪旋转,将旋转角细化成若干个大小固定的角度i,规定满足tanBi=2-i,通过一系列的迭代旋转,每次旋转i,i为迭代次数,规定Bi的范围即旋转角度的范围为-99.7,99.7。如果的大于这个范围则可通过三角运算操作转化到该范围的角度。我们通过事先将所有每次旋转的角度计算出来,由于每次旋转的角度是固定的,所以经过i次旋转的EOi可能会超过O,所以就必须设置一个方向值di,如果旋转角度之和己经小于,则di为1下次旋转继续为顺时针旋转,如果旋转角度之和大于。,则di为T,下次旋转为逆时针。设置zi+1为旋转剩余角
4、度,zi+1=z-dizi,z=。,随着i值得增大,zi+1会趋向于O时,即旋转结束。di与Zi的符号位相同。采用伪旋转的方法,每次提出一个CoSOi,旋转结束后会产生一个IcoSUi的累乘,一旦我们确定了迭代次数,coSOi就是一个常数,迭代公式可写为。这是将COSei提出、tani替换成2、i后的结果。di与Zi的符号位相同。xi+1=Xi-di*yi*2-iyi+1=yi+di*xi*2-izi+1=z-di*i设迭代i=n-1,那么旋转n次后得到Pm的坐标应该为(Xn*TIcosBi,yn*TIcosBi)。应为每次迭代都会提出一个COSoi,旋转n次后的Xn和yn就会少乘一个Icos
5、i,所以实际上最终的Pm坐标角度近似于(xn*IIcosi,yn*IIcosi)oXn*cosOi=xOcos-ysinyn*cosOi=yOcos+xsinxn=1cosi(xOcos-ysin)yn=1cosi(yOcos-xsin)伸缩因子,KN=1/cosi,已知迭代次数,我们可以预先计算KN的值。如下这是博主使用MI1I1计算出的迭代结果数值。iOt(arctan(2T),单位度CoSe1cos0i1cos045.00.70710678120.70710678121.414213562126,565051180.8944271910.6324555321.58113883214.03
6、6243470.97014250010.61357199111.62980060137.1250163490.99227787670.60883391251.64248406643.5763343750.99805257850.60764825631.64568891651.7899106080.99951207610.60735177011.64649227960.89517371020.9998779520.60727764411.64669325470.44761417090.99996948380.60725911231.64674350780.22381050040.99999237
7、070.60725447931.6467560790.11190567710.99999809270.60725332111.646759211100.055952891890.99999952320.60725303151.646759996110.027976452620.99999988080.60725295911.646760193120.013988227140.99999997020.6072529411.646760242130.0069941136750.99999999250.60725293651.646760254140.0034970568510.9999999981
8、0.6072529354164576CP57一一.150.0017485284270.99999999950.6072529351xn=KN(xOcos-ysin)yn=KN(yOcos-xsin)从上表可以得出,我们预先计算出KN的值,然后令x=cosi,y=0,则上述公式可化简为Xn-cosyn=sin即可实现正弦、余弦操作了。旋转模式总结一下,COrdiC算法旋转模式使用Veri1OgHD1的实现流程(1)确定迭代次数,将每次迭代的角度计算出来,预先定义为参数,为了避免浮点运算,将角度值向左移位16位,取整数部分。(2)根据迭代公式进行迭代计算,本设计取16次迭代,从上表可以看出,当迭代
9、次数越大时,1cos0i会趋向于一个确定值。如果对结果精度要求更高,可以设置更高的迭代次数,根据迭代次数,可以将伸缩因子KN二1cosi计算出来。同样将其左移16位。xi+1=xi-di*yi*2-iyi+1=yi+di*xi*2-izi+1=z-di(3)设置x=cosi,y=0,则求出x16=cos,y16=sino这里需要注意的是,我们在进行迭代运算的时候,将2i变成移位运算,对于正余弦来说是有正负的,所以在一开始定义的时候,就应该定义成有符号数,Veri1og中也可以定义有符号数,最高位表示符号位,定义如下outputregsigned31:0sxJ角度正弦输出outputregsig
10、ned31:0cosJ/角度余弦输出16次迭代寄存器工定义xK”为有符号数,最高位为符号位regsigned;31:0;x0y0jz0jregsigned31:0X1Jy1,z1jregsigned31:0x2y2,z2;regsigned31:0x3y3,z3jregsigned31:0x4jy%z4jregsigned31:0x5y5,z5;regsigned31:0;x6,y6,z6;regsigned31:07jV7、z7;regsigned31:0x8y8,z8;regsigned31:0x9,y9,z9jregsigned1:0x10jy10)z10;regsigned31:0x1
11、1jy11,z11;regsigned31:0x12jy12,z12;regsigned31:0x13,y13,z13;regsigned31:0x1%y14)z14;regsigned31:0x15,y15,z155扇屿0笈regsigned31:0X16jy16Z16;WWW.加CFanS.com迭代雷谴定义为有符号数,那么我们移位运算就不能用逻辑右移逻辑左移或来移位了,而是用算术右移和算术左移。逻辑左移也就相当于算数左移,右边统一添O,逻辑右移,左边统一添O,算数右移,左边添加的数和符号有关。例如IO10010,口是添加的位逻辑左移一位:0101_0100算数左移一位:0101_0100
12、逻辑右移一位:0101_0101算数右移一位:1101_0101迭代运算采用16级流水线,进行运算,最终需要判断输出的正余弦值在哪个象限,前面讲旋转角度0的范围为-99.7,99.7,不在这个范围我们要进行三角运算使其满足这个范围,当输入的角度小于90度即可进行计算,当输入角度大于90度小于180度,将输入角度减去90度并设定当前角度处于第二象限,然后进行计算,当输入角度大于180度小于270度,将输入的角度减去180度设置当前角度处于第三象限,进行计算,当输入的角度大于270度,减去270设置当前角度处于第四象限,进行计算。象限的设定通过quarant寄存器实现。判断象限quarant象限0
13、0第一象限01第二象限1011第二象巴二第四象限O如果角度在第一象限,sin(x)=sin(a),cos(x)=sin(a)最后的结果x16=cos,y16二sin,这里我想起了那句口诀,一全正,二正弦,三正切,四余弦如果角度在第二象限,sin(x)=sin(a+90)=cos(a),cos(x)=cos(a+90)=-sin(a)如果角度在第三象限,sin(x)=sin(a+180)=-sin(a),cos(x)=cos(a180)=-cos(a)如果角度在第四象限,sin(x)=sin(a+270)=cos(a),cos(x)=cos(a270)=-sin(a)对于正数,我们直接赋值输出,
14、负数,这里使用有符号数表示,将其取反加1即可。最终使用mode对算法进行仿真,从波形图上看已经初步实现了sin,cos函数。向量模式Cordic算法在向量模式下的计算方法和旋转模式基本上是类似的,设有一点Po(x,y),经过顺时针旋转角度到与轴重合,得到点Pm(xm,ym),即ym=0。Xm=xOcos-ysin=cos(x-ytan)ym=yOcos+xsin=cos(y-xtan)=0我们设置x=x,y=y,z=0,迭代次数为16,经过16次迭代后得到Zn二。二arctan(yx)和坐标所代表的向量的模值d=Xm=Xn*cosi,di与yi方向相反,即当时结束运算。实现方法为判断yi的符号位,符号位为1,C1i为1,符号位为0,C1i为Toxi+1=xi-di*yi*2-iyi+1=yi+di*xi*2izi+1=ZO-di*i关于反正切函数,由于在-99.7,99.7范围内,所以我们输入向量PO(x,y)时,需要保证其在第一、四象限。下面是使用MAT1AB计算出来的数据和