CORDIC迭代算法的一种最直接的实现方法是,只设计一级CORDIC运算迭代单元,然后在系统时钟的驱动下,将本级的输出作为本级的输入,通过同一级迭代完成运算。这种方法虽然很直观,但是为了将计算结果提供给下一级运算而导致占用了大量的寄存器,带来许多额外的资源消耗。而最大的缺点是运算速度较慢(需要n-1个时钟周期才能输出一个数据),不利于数据的高速实时处理。
因此在实际设计中,采用的是图2所示的由16级CORDIC运算单元组成的流水线结构,正常工作时只需1个时钟周期就能输出1个数据,为数据实现高速实时处理提供了前提。每一级实现的功能是根据式(5)进行一次迭代,移位的位数等于当前的迭代级数,加减法选择由该级中Z 的最高位(符号位)决定,得到下一级的X 、Y 和Z 的值。经过16级流水线运算后,Z的值变为0,X 和Y 的值则为初始值z0的余弦和正弦值。每一级电路结构主要包括2个移位器和3个加(减)法器,级与级之间直接相连,不需要额外的寄存器。θi 的值为arctan(2-i),可将该小数转换为二进制数后,存储于存储单元中,为每一级流水线提供查找表。若对于16级的流水线结构,则的范围是0~15。
设计中还应该注意迭代序列所能覆盖的角度范围,若直接采用n 级迭代序列:0 ,1 ,2 ,…,n - 1 ,则迭代所能覆盖的角度范围仅有- 99.9°~99.9°。本设计采用了增加迭代次数的方法来扩大角度覆盖范围,即增加两个i = 0 的迭代,将迭代序列扩展为0,0,0,1,2,…,n-1,从而使角度覆盖范围也扩大到-π~π。
利用ALTERA公司的QuartusII软件,采用VHDL硬件描述语言对上述数控振荡器结构进行描述,在Modlesim上通过功能仿真,结果正确后综合出电路网表,最后将程序下载至ALTERA公司生产的Stratix器件EP1S20B780C6实现。
由于设计中采用了Stratix器件,该器件的32位加减器工作频率可以达到90MHZ以上,为产生高速的正交信号提供高速可靠的的工作时钟。考虑到NCO的工作时钟瓶颈是在相位累加器,因此可以根据具体需要缩减相位累加器的位数来提高NCO的工作时钟。
本文设计的NCO工作时钟为100MHz,相位累加器的位数为16位,输入的频率控制字为4CCCH,根据公式:
其中:Φword为输入的频率控制字;fclk为工作时钟;N为相位累加器位数,可算出NCO输出的正余弦信号的频率;fout为30MHZ ;频率分辨率Δf ≈1.5 kHz。频率分辨率说明了若通过输入频率控制字来改变输出正余弦信号的频率时,可以达到1.5 kHz 的最小步进。另外,也可以根据实际需要的频率改变输入频率控制字值。当然,NCO输出频率的上限要受到Nyquist定律的限制,即fout的最大值为fclkP2,实际设计一般不大于0.4fclk。图3为数控振荡器的部分仿真时序图。