Xilinx FPGA 中ADC 数据下变频+ CIC 滤波


🧱 一、下变频(DDC)总体结构

典型的 FPGA 下变频链路:

复制代码
高速 ADC 数据 → 直数字本振 NCO → 数控混频 → CIC 滤波(大抽 decimation) → 可选:补偿 FIR → 后级处理

📌 二、ADC 数据下变频原理(Mixing)

高速 ADC 采样通常在几十 MHz~数百 MHz。为了在 FPGA 中方便处理,需要把信号从 射频/中频 下变频到基带(I/Q)。

1. NCO(Direct Digital Synthesizer)

NCO 产生本振信号:

复制代码
                        cos(2πfLO​n/Fs​),sin(2πfLO​n/Fs​)

FPGA 中由:

  • 相位累加器(Phase Accumulator)
  • 相位到幅度查找表(LUT)或 CORDIC

构成。

2. 数控混频(Multiplier)

输入为 ADC 实数信号 (x[n]),混频后得到:

复制代码
                            I[n]=x[n]cos(ωLO​n)
                            Q[n]=x[n]sin(ωLO​n)

混频结构图(示意图)

复制代码
             ┌────────┐
ADC x[n] →──→│ Mult x Cos ───────→ I branch
             └────────┘
             ┌────────┐
             │ Mult x Sin ───────→ Q branch
             └────────┘
         ↑             ↑
         │             │
        Sin           Cos
         ←─── NCO (Phase Accumulator) ───→

🚰 三、CIC 滤波实现原理(用于大抽 decimation)

CIC(Cascaded Integrator Comb)非常适合 FPGA 做大抽 decimation,不需要系数乘法器,硬件代价极低。


1. CIC 结构图(R 倍抽取)

CIC 包含:

  • N 级积分器 Integrator
  • 抽取 Decimate by R
  • N 级梳状滤波器 Comb

图示如下:

复制代码
         ┌─────────┐ (Integrator1)
I/Q →──→│ Integr1  │→
         ├─────────┤
         │ Integr2  │→
         ├─────────┤      ┌──────────┐ (after decimation)
         │   ...    │→──R→│  Comb1   │→
         ├─────────┤      ├──────────┤
         │ IntegrN  │→      │  Comb2   │→
         └─────────┘      └──────────┘

2. 积分器(Integrator)

递推公式:

复制代码
                                      y[n]=y[n−1]+x[n]

每个采样都要累加 → 时钟频率等于 ADC 采样率。


3. 抽取(Decimation)

每 R 个采样只取 1 个进入 Comb。


4. 梳状滤波器(Comb)

差分公式:

复制代码
                                         y[n]=x[n]−x[n−M]

通常延时 M=1(最简单)。


5. CIC 数据位宽增长

CIC 内部位宽增长公式:

复制代码
                                         Bout​=Bin​+N⋅log2​(R)

例:

输入 16bit,N=3,R=32

→ 增长: (3 × 5 = 15)bit

输出需至少 31bit


🌞 四、Xilinx FPGA 中的 DDC + CIC 实现方式

你可以用两种方式:


方式 A:使用官方 IP(强烈推荐)

1. 下变频:使用 DDC CompilerDDS + Multiplier

Vivado 提供:

  • Xilinx DDS Compiler
  • Xilinx Multiplier (DSP48)
  • Complex Multiplier IP

搭起来就可以得到 I/Q 基带信号。


2. CIC 滤波:使用 CIC Compiler IP

Vivado 的 CIC Compiler 支持:

  • Integrator/Comb 级数配置
  • 抽取倍数 R
  • 输入输出位宽
  • Automatic bit growth
  • 接口可选 AXI-Stream

图示(示意图):

复制代码
     I/Q stream ----> [ CIC Compiler ] ------> Decimated I/Q stream

方式 B:手写 RTL 实现(适合 FPGA 工程师)


1. NCO 实现

verilog 复制代码
reg [31:0] phase_acc;
always @(posedge clk) begin
    phase_acc <= phase_acc + phase_step; // 控制输出频率
end
wire [15:0] cos_lut = cos_rom[phase_acc[31:20]];
wire [15:0] sin_lut = sin_rom[phase_acc[31:20]];

2. 混频实现(占用 DSP48)

verilog 复制代码
assign I = adc_data * cos_lut;
assign Q = adc_data * sin_lut;

3. CIC 积分器实现

verilog 复制代码
reg signed [47:0] integrator1;
always @(posedge clk) begin
    integrator1 <= integrator1 + I;  
end

多级 integrator 串联即可。


4. 抽取(使用计数器)

verilog 复制代码
reg [5:0] deci_cnt;
always @(posedge clk) begin
    if(deci_cnt == R-1) begin
        deci_cnt <= 0;
        I_deci   <= integratorN;
    end else
        deci_cnt <= deci_cnt + 1;
end

5. Comb 实现

verilog 复制代码
reg signed [47:0] comb_delay;
always @(posedge clk_decimated) begin
    comb_out <= I_deci - comb_delay;
    comb_delay <= I_deci;
end

📘 五、完整下变频链路图

复制代码
                ┌──────────┐
ADC Data ─────→ │   NCO    │ ───┐
                └──────────┘    │cos
                                │
                ┌──────────┐    │
ADC Data ─────→ │ Multiplier │──┼──► I (Baseband)
                └──────────┘    │
                                 │sin
                ┌──────────┐    │
ADC Data ─────→ │ Multiplier │──┘──► Q (Baseband)
                └──────────┘

       ┌─────────────────────────────┐
       │       CIC Decimation        │
       │ (N integrators -> R deci -> Comb)  
       └─────────────────────────────┘

                 ↓
         Decimated I/Q Signal

🎯 六、参数设计建议(工程经验)

项目 建议值
CIC 级数 N 3~5(常用 3)
抽取倍数 R 根据带宽,例如 32/64
NCO LUT 位宽 10~12 bit
Mixer 输出位宽 ≥ 16+12=28 bit
CIC 输出位宽 自动 bit growth 后截位
相关推荐
范纹杉想快点毕业2 小时前
FPGA面试百问:从基础到实战全解析
fpga开发
TL滕2 小时前
从0开始学算法——第十二天(KMP算法练习)
笔记·学习·算法
Math_teacher_fan3 小时前
第二篇:核心几何工具类详解
人工智能·算法
汉克老师3 小时前
CCF-NOI2025第二试题目与解析(第二题、集合(set))
c++·算法·noi·子集卷积·sos dp·mod 异常
mit6.8243 小时前
presum|
算法
不穿格子的程序员3 小时前
从零开始写算法——链表篇2:从“回文”到“环形”——链表双指针技巧的深度解析
数据结构·算法·链表·回文链表·环形链表
我送炭你添花3 小时前
可编程逻辑器件(PLD)的发展历程、原理、开发与应用详解
嵌入式硬件·fpga开发
Punchline_c3 小时前
IP核之FIFO
fpga·fifo