Walther JS于1971年提出了统一的CORDIC形式。假定初始向量V1(x1 ,y1)旋转角度θ后得到向量V2(x2,y2):
即:
若每次旋转的角度θ是正切值为2 的倍数,即θi=arctan(2-i),则cosθi=(1 2-2i)-1/2 。假设以δi代表矢量的旋转方向, 1表示逆时针旋转,-1表示顺时针旋转,故第i 步旋转可用下式表示:
其中:(1 2-2i)-1/2为模校正因子。对于字长一定的运算,该因子是一个常数,用K表示,以16 bits字长为例,则:
可见,迭代运算不能使幅值比例因子恒为1。为了抵消因迭代产生的比例因子的影响,可将输入数据X,Y校正后再参与运算,以避免在迭代运算中增加校正运算,降低CORDIC算法的速度。由此运算迭代式可以简化成:
公式(5)运算仅通过加法器及移位器就可以实现。此外,若用Zi表示第i次旋转时与目标角度之差, 则:
经过n次旋转后,式(5)的n次迭代可以得到以下结果:
本文介绍的数控振荡器的设计是在式(7)的基础上,给定x0=K ,y0=0,则迭代结果为:
将所需产生的角度值作为z0输入,通过式(5)、(6)的迭代运算,迭代结果输出的xn和yn就是所需要的三角函数值。
数控振荡器的FPGA实现
图1是数控振荡器的顶层电路。由图可见,频率控制字寄存器将接收到的的频率控制字送入相位累加器,相位累加器对系统时钟进行计数,每到达输入频率控制字的值即对相位进行累加,随后将累加值送入相位相加器,与相位控制字寄存器接收到的初始相位进行相加,得到当前的相位值。其中,相位累加器是决定NCO性能的一个关键模块,可以利用FPGA器件的进位链实现快速、高效的电路结构。然而,由于进位链必须位于临近的逻辑阵列块CLB和逻辑单元LC内,所以长的进位链会减少其它逻辑使用的布线资源;同时,过长的进位链也会制约整个系统速度的提高。因此,设计中采用进位链和流水线技术相结合的办法。所谓流水线技术,即把在一个时钟内要完成的逻辑操作分成几步较小的操作,并插入几个时钟周期来提高系统的数据吞吐率。采用以上做法实现的相位累加器既能保证具有较高的资源利用率,又能大幅提高系统的性能和速度。
经过上述相位的处理之后,即可获得具有所设定初始相位的一定频率的正余弦相位序列,将此序列送入基于CORDIC算法的波形发生器,最终获得两路正交的正余弦输出序列。