FPGA数字下变频(DDC)设计:CORDIC与NCO的配合实现
扫描二维码
随时随地手机看文章
在软件无线电(SDR)和雷达接收机中,数字下变频(DDC)是连接高速ADC与基带处理的关键桥梁。其核心任务是将高频宽带信号搬移到基带,并降低数据率。本文将详解如何利用NCO(数控振荡器)生成正交载波,并结合CORDIC(坐标旋转数字计算机)算法,在FPGA中实现高效、高精度的数字混频。
一、DDC架构:NCO + 混频器 + CORDIC
典型的数字下变频链路如下:
ADC → DDC → CIC/FIR抽取滤波 → 基带数据
其中,DDC的核心由两部分组成:
1. NCO(Numerically Controlled Oscillator):生成高精度、正交的数字本振信号(sinωt 和 cosωt)。
2. 混频器(Mixer):将ADC输入信号与NCO输出相乘,实现频谱搬移。
3. CORDIC(可选但推荐):当NCO直接输出sin/cos查找表时,CORDIC可用于相位微调或在资源受限时进行坐标变换。
二、NCO设计:相位累加器与查找表
NCO是DDC的“心脏”,其频率精度和杂散性能直接决定DDC质量。
1. 相位累加器原理
NCO通过一个频率控制字(FTW)不断累加相位。
• FTW(Frequency Tuning Word):FTW = (Desired_Frequency * 2^N) / Sampling_Frequency
• 相位:phase_acc = (phase_acc + FTW) mod 2^N
2. Verilog实现(简化版)
module nco_generator #(
parameter PHASE_WIDTH = 32,
parameter OUTPUT_WIDTH = 16
)(
input wire clk,
input wire rst_n,
input wire [PHASE_WIDTH-1:0] ftw, // 频率控制字
output wire [OUTPUT_WIDTH-1:0] sin_out,
output wire [OUTPUT_WIDTH-1:0] cos_out
);
reg [PHASE_WIDTH-1:0] phase_acc;
// 相位累加器
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
phase_acc <= {PHASE_WIDTH{1'b0}};
end else begin
phase_acc <= phase_acc + ftw;
end
end
// 查找表(LUT)实现 sin/cos
// 实际工程中通常使用ROM或Altera/Xilinx的IP核
// 此处仅为逻辑示意
assign sin_out = lookup_sin(phase_acc[PHASE_WIDTH-1:PHASE_WIDTH-16]);
assign cos_out = lookup_cos(phase_acc[PHASE_WIDTH-1:PHASE_WIDTH-16]);
endmodule
关键点:为了获得纯净的频谱,NCO的LUT深度通常很大(如2^12或2^14),且需要使用相位抖动(Dithering)技术来抑制相位截断带来的杂散。
三、CORDIC算法:替代乘法器的混频方案
传统的DDC混频需要两个高速乘法器(I = ADC cos, Q = ADC sin)。在极高采样率下,乘法器资源消耗巨大。CORDIC算法通过迭代移位和加减法来实现旋转,仅需一个加法器和移位器。
1. CORDIC在DDC中的角色
CORDIC可以接收ADC数据和NCO的相位信息,直接计算出I/Q分量,或者在NCO之后作为坐标旋转模块,修正本振的相位误差。
2. CORDIC迭代核心(Verilog伪代码)
// CORDIC迭代核心(旋转模式)
// x_{i+1} = x_i - d_i * (y_i >> i)
// y_{i+1} = y_i + d_i * (x_i >> i)
// z_{i+1} = z_i - d_i * atan_lut[i]
// d_i = sign(z_i)
reg signed [31:0] x, y, z;
reg signed [31:0] atan_lut [0:15]; // 预存atan(2^-i)
always @(posedge clk) begin
if (i < ITERATIONS) begin
// 根据z的符号决定旋转方向
if (z[31]) begin // z < 0
x <= x + (y >>> i);
y <= y - (x >>> i);
z <= z + atan_lut[i];
end else begin
x <= x - (y >>> i);
y <= y + (x >>> i);
z <= z - atan_lut[i];
end
i <= i + 1;
end
end
优势:相比直接乘法,CORDIC在FPGA中消耗的DSP Slice更少,且易于流水线化,适合超宽带DDC设计。
四、NCO与CORDIC的配合策略
1. 方案一:经典混频(NCO + 乘法器)
• 流程:NCO输出sin/cos → 分别与ADC数据相乘 → 得到I/Q。
• 适用:中频采样率(<500MSPS),FPGA资源丰富。
2. 方案二:CORDIC直接解调(推荐高性能)
• 流程:NCO仅输出相位 → ADC数据与相位一起送入CORDIC核 → CORDIC直接输出I/Q。
• 优势:省去两个大型乘法器,时序收敛更容易。
• 注意:需要将ADC数据看作直角坐标系的一个点(X=ADC, Y=0),然后通过CORDIC旋转-θ(NCO相位)来得到基带信号。
五、调试与避坑指南
1. 频谱泄露:DDC后的I/Q信号若不经滤波直接观察,会有直流偏移。务必在DDC后级联CIC或FIR滤波器。
2. NCO杂散:如果NCO的LUT深度不够,会在输出频谱上看到明显的杂散点。解决方法是增加LUT深度或使用相位抖动。
3. CORDIC增益:CORDIC迭代会产生一个固定的增益(K ≈ 1.64676)。在后级处理中,必须乘以1/K进行归一化,否则信号幅度会衰减。
4. 位宽增长:CORDIC迭代过程中,数据位宽会逐渐增加,需要在迭代中途或结束时进行截位,以匹配后续滤波器输入位宽。
六、结语
在FPGA中实现高性能DDC,关键在于NCO的频率纯度与混频结构的资源效率。对于追求极致性能的系统,采用“NCO生成相位 + CORDIC进行坐标旋转”的方案,可以在不牺牲SFDR(无杂散动态范围)的前提下,显著降低FPGA的资源占用,是实现宽带数字下变频的理想选择。





