一种CORDIC算法的FPGA实现
数有关,运算只有移位和加/减。
CORDIC算法是一种用于计算一些常用的基本运算函数和算术操作的循环迭代算法。最初是由Voider于1959年提出来的,包括旋转和向鼍两种基本模式,可以进行向量旋转、求
三角函数、反三角函数和求向量的模等运算。而后,Walther
于1971年提出了统一的改进型CORDIC算法,改进后的
CORDIC算法可以在六种不同的模式下工作,除了可以完成三角函数、反三角函数和求向量的模,还可以完成乘法、除
法、超越函数等运算。本文主要利用CORDIC算法求反正切
函数,其算法原理如下:
向量(xj,y『)旋转0角,得到一个新的向量(以,K),如
图1,那么有:
Xk=Rcos(0+JB)=五cos0一Yisin0
K=Rsin(0+卢)=墨sin0一Ecos0
(3)
写成矩阵形式为式(4):
【》瞄-嘲si.…Ol[xE,】…s怯1p一跏爹】
(4)
假设p是由n个最角度叠加而成的。即令口=∑diO;,其
中d。表示旋转的方向,当顺时针旋转时,d;=一1,当顺时针
旋转时,d;=+1,为了便于硬件的数字实现,将每次的旋转
角度0;加以限制,使得0;=arctan(2。‘),这样式(4)变为:
【妻】=x‘【d。。al:。以,一dn‘an‘以’】…
其中K=coson""COSO,.cosOo=n(1+/以矛),
【d。。a!。如,如协:‘岛’】[爹】
c5,
最终收敛于0.6073(当迭代次数趋于无穷的时候)。因此这‘弓
从式(5)中可以看
圈1
出,每一次迭代旋转可向量旋转坐标图
以表示为:
[》t/一瞄i一翔【习㈤
定义每一次迭代后,角度累加公式为:
Z…=Z‘一diarctan(2‘‘)
(7)
式(6)中乘法因子为常数,在此可以不单独考虑它对单
-——306..——
步迭代的影响。综合式(6)、(7)可表示为式(8)。在向量化模式下,CORDIC旋转器对输入向量进行旋转必要的角度,使得向量最终调整到石轴上。即第i次旋转的角度为arctan(2“),旋转的方向由yf决定,若yl<0,则d,=一l,若K>0,则d;
=+1,最终使K一0。式(8)迭代的最终结果为式(9):
rXf+I=Xi—d‘21yl
{K+I=yi+d。2一置
(8)
‘ZⅢ=Zi—diarctan(21)
Ix,=A、、/Xo+y2n
{k亍0
(9)
I.Zn=z0+arctan(Vo/Xo)
其中,A。=n(1//r驴)。在式(9)中,令角度累加
器的初始值磊=0,则有:z。=aretan(y0/xo)。即当迭代完成时,乙的值即为初始输入蜀、y0的反正切值。
3
FPGA实现及误差分析
CORDIC算法的实现方式有两种:简单状态机法和高速
全流水线处理器。即采用简单状态机结构和流水线CORDIC
结构。简单状态机结构主要采用折叠/迭代方式,如果计算
时间不严格的话,可以采用此结构,在每个周期内都将精确地计算一次式(8)所示的迭代,其缺点是计算速度慢,迭代时所设计的筒形移位器复杂。流水线CORDIC结构虽然占用的硬件资源比简单状态机结构稍多,但是流水线结构可以提
高数据的吞吐率,对于大多数的数字信号处理算法来说,存
在很多同一指令连续处理很长一段数据的情况,此时高吞吐
率更有意义。从当前FPGA的发展趋势来看,芯片内的门资
源相对富裕,对流水线CORDIC的实现规模约束很小,此外,
流水线CORDIC不存在迭代式CORDIC的反馈回路,使得单元结构更加规则,有利于FPGA实现。
本文采用流水线CORDIC结构进行FPGA实现。图2所
示的是6步向量化模式的CORDIC旋转来求取
aretan(,,。/x。)值的硬件流水线结构。此结构优点是在实现
时运算速度快,可以实现高速实时处理。移位序列为0、0、1、
2、3、4、5,对应的旋转角度是180。、arctan(20)、arctan(2“)、
arctan(2—2)、axctan(2。3)、arctan(2—4)、aretan(2一’)(晟p
1800、450、270、140、7。、40、20),也就是在FPGA实现时,如果
输入的数处于第一、四象限,则第一步不需要旋转,如果处于
第二、三象限,则需旋转+180。或一1800。以下步骤需根据Y。的正负进行旋转相应的角度。直至Y。趋于0。图2中,‰=0是角度,x。和‰是CORDIC旋转器输入复数数据的实部和虚部,常数指每一步旋转的角度,x6是旋转所得到的模
值,z6就是向量旋转的角度,即所要求的反正切值arctan
(,,iA如)对应的角度。在实际实现时,由于是采用旋转坐标的原理,所以CORDIC算法的相位输出范围为(一仃,仃),而
不是arctan(‰A。)的范围(一mr/2,zr/2)。
在设计中特别需要注意的是数据的量化。否则得不到
个旋转算法需要一个调整增益A。,其值为收敛值0.6073的倒数即1.647。实际上,调整增益是取决于迭代次数的。
度的旋转。