如图1所示。正交
数字下变频器前端包括两部分一是乘法器;一是NCO。乘法器设计很简单,NCO的目标是产生一个理想的正弦和余弦波。更确切地说是产生一个可变频率的正弦波样本如公式:其中为本地振荡频率; 为DDC输入信号的采样频率。正弦波样木可以用实时计算的方法产生,但这只适用信号采样频率很低的情况。在软件无线电高速信号采样频率的情况下,NCO实时计算的方法是不可取的。NCO产生正弦波样本通常采用查表法,通过输入的相位数据来寻址查表输出相应的正弦波幅值。对于一个相位位数为n,输出信号幅度位数为M的数控振荡器,这就需要耗费大量的ROM资源(2nX Mbit)。为了避免使用大容量的
存储器。可采用了一种基于
CORDIC( Coordinate Rotation Digital Computer)算法来产生正/余弦样本。该算法有线性的收敛域和序列特性。只要
迭代次数足够,即可保证结果有足够的精度。并且用于混频的乘法器也可以省掉。从而还节省了大量的逻辑硬件资源。使得
数字下变频更易于用FPGA来实现。
3.1、CORDIC算法
CORDIC算法基本原理是:设初始向量x0+jy0经旋转角度后得到的向量 xn+jyn即, ,设旋转基本角度θi,令 ,那么初始向量可通过一系列的基本角度θi的旋转,逐渐逼近目标向量。在旋转模式下,如果设Z0=θ ,根据J,S,WALTER的推导有:
其中
δi代表向量旋转方向
经过n 次旋转迭代后的结果为:
其中,,称为模校正因子。如果令 , y0=0,则,由上述推导可知:若已知角度Z0 和初始向量的 x0,y0 可由式(1)迭代运算得到角度Z0的正余弦值,而式(3)中的迭代运算用硬件实现时非常方便,只有加(减)和移位操作。
3.2、基于CORDIC算法实现NCO
我们设计的NCO顶层结构为图2所示。我们可以看到,频率控制字
寄存器将接收到的频率控制字K送入相位
累加器,累加器对
系统时钟进行累加计数,当到达输入频率控制字的值时对相位进行累加,随后将累加值送入相位相加器,与相位控制字寄存器接收到的初始相位相加,得到当前的相位值。经过上述相位处理之后,即可获得相位的正/余弦相位序列,将此序列送入基于CORDIC算法的
波形发生器,最终获得两路正交的正/余弦输出序列。
采用了流水线型实现结构,它用n级相似的算法单元在同一个时钟周期内并行工作,每级算法单元的具体实现结构如图3所示。图中的三个
累加器分别完成了该级中xi,yi,zi的迭代,累加器的加/减
控制信号为上一级算法单元中的di信号,两个i位的右移寄存器(注:图中的>>i表示右移i位)完成了迭代等式中的乘2-i运算,而该级的基本旋转角度值(2-i)可以采用直接
硬连接。
流水线结构的最大优点在于它的运算速度很快在任何一个时钟周期,n级算法单元都同时工作,如在输入端连续不断地送入数据,那么在n个时钟周期的延迟之后,输出端将连续得到相应的下变频后的数据与传统的串行结构相比,流水线结构的运算速提高了n倍。图4给出了16级流水线算法
的实现结构虚线框中部分是个初始化旋转单元,是因为。由此可见,当
迭代的次数n趋近于无穷大时,所被 覆盖的角度只能是在-99.9度~99.9度之间,若想让的覆盖范围扩展到,必须在迭代之前再增加一个初始化旋转,将输入向量先旋转 ,之后是16级流水线算法单元,最右边的是级的基本旋转角度值(2-i),di为各级
累加器加/减控制信号"X0,Y0,Z0为下变频模块的数据输端口,Xn,Yn,Zn是三个输出端口"。
3.3、初始化旋转单元代码
输入为x_in y_in z_in 输出为 phi,eps,r 定义信号为x,y,z
---Test for x_in<0 rotate 0,+90,or -90 degrees
IF x_in>o THEN
x <=x_in
y<=y_in
z<=z_in
ELSEIF y_in>0 THEN
x<=y_in
y<=-x_in
z<=z_in+90
ELSE
x<=-y_in
y<=x_in
z<=z_in-90
END IF