《基于FPGA的Cordic算法实现的设计与验证.doc》由会员分享,可在线阅读,更多相关《基于FPGA的Cordic算法实现的设计与验证.doc(4页珍藏版)》请在三一文库上搜索。
1、基于FPGA的Cordic算法实现的设计与验证CORDIC(Coordinate RotaTIon Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。本文是基于FPGA实现Cordic算法的设计与验证,使用Verilog HDL设计,初步可实现正弦、余弦、反正切函数的实现。将复杂的运算转化成FPGA擅长的加减法和乘法,而乘法运算可以用移位运算代替。Cordic算法有两种模式,旋
2、转模式和向量模式。可以在圆坐标系、线性坐标系、双曲线坐标系使用。本文线初步实现在圆坐标系下的两种模式的算法实现。Cordic算法简化旋转模式,迭代位移算法。假设有一点P0(x0,y0),经过逆时针旋转角度,到达点Pm(xm,ym),我们根据数学运算可以得到公式如下:xm = x0cos - y0sin = cos(x0 y0tan)ym = y0cos + x0sin = cos(y0 旋转,每次旋转i,i为迭代次数,规定i的范围即旋转角度的范围为-99.7, 99.7。如果的大于这个范围则可通过三角运算操作转化到该范围的角度。我们通过事先将所有每次旋转的角度计算出来,由于每次旋转的角度是固定
3、的,所以经过i次旋转的i可能会超过,所以就必须设置一个方向值di,如果旋转角度之和已经小于,则di为1,下次旋转继续为顺时针旋转,如果旋转角度之和大于,则di为-1,下次旋转为逆时针。设置zi+1为旋转剩余角度,zi+1 = z0 dizi,z0 = ,随着i值得增m的坐标应该为(xn * cosi, yn * cosi)。应为每次迭代都会提出一个cosi,旋转n次后的xn和yn就会少乘一个cosi,所以实际上最终的Pm坐标角度近似于(xn * cosi, yn * cosi)。xn * cosi = x0cos - y0sinyn * cosi = y0cos + x0sinxn = 1/c
4、osi (x0cos y0sin)yn = 1/cosi (y0cos x0sin)伸缩因子,KN = 1 / cosi,已知迭代次数,我们可以预先计算KN的值。如下这是博主使用MATLAB计算出的迭代结果数值。xn =KN (x0cos y0sin)yn = KN (y0cos x0sin)从上表可以得出,我们预先计算出KN的值,然后令x0 = cosi,y0 = 0,则上述公式可化简为xn = cosyn = sin即可实现正弦、余弦操作了。旋转模式总结一下,Cordic算法旋转模式使用Verilog HDL的实现流程(1) 确定迭代次数,将每次迭代的角度计算左边统一添0 ,算数右移,左边
5、添加的数和符号有关。例如1010_1010, 是添加的位逻辑左移一位:0101_0100算数左移一位:0101_0100逻辑右移一位:0101_0101算数右移一位:1101_0101迭代运算采用16级流水线,进行运算,最终需要判断输出的正余弦值在哪个象限,前面讲旋转角度的范围为-99.7,99.7,不在这个范围我们要进行三角运算使其满足这个范围,当输入的角度小于90度即可进行计算,当输入角度大于90度小于180度,将输入角度减去90度并设定当前角度处于第二象限,然后进行计算,当输入角度大于180度小于270度,将输入的角度减去180度设置当前角度处于第三象限,进行计算,当输入的角度大于270
6、度,减去270设置当前角度处于第四象限,进行计算。象限的设定通过quarant寄存器实现。如果角度在第一象限,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(a+180) = -cos(a)如果角度在第四象限,sin(x) = sin(a+27
7、0) = cos(a),cos(x) = cos(a+270) = -sin(a)对于正数,我们直接赋值输出,负数,这里使用有符号数表示,将其取反加1即可。最终使用modelsim对算法进行仿真,从波形图上看已经初步实现了sin,cos函数。向量模式Cordic算法在向量模式下的计算方法和旋转模式基本上是类似的,设有一点P0(x0, y0),经过顺时针旋转角度到与轴重合,得到点Pm(xm, ym),即ym = 0。xm = x0cos - y0sin = cos(x0 y0tan)ym = y0cos + x0sin = cos(y0 x0tan) = 0我们设置x0 = x, y0 = y, z0 = 0 y0)时,需要保证其在第一、四象限。下面是使用MATLAB计算出来的数据和FPGA计算出来的数据进行比较。从FPGA计算出的结果与MATLAB来比较,和实际结果之间的误差还是挺小的,毕竟是硬件计算出来的数据,向量的误差就比较大了,如果对于精度比较高的计算,我们可以通过提高迭代次数来提高精度。至此基于FPGA的Cordic算法就实现结束了。
链接地址:https://www.31doc.com/p-3410280.html