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 后截位
相关推荐
一个不知名程序员www13 小时前
算法学习入门 --- 哈希表和unordered_map、unordered_set(C++)
c++·算法
Sarvartha14 小时前
C++ STL 栈的便捷使用
c++·算法
夏鹏今天学习了吗15 小时前
【LeetCode热题100(92/100)】多数元素
算法·leetcode·职场和发展
飞Link15 小时前
深度解析 MSER 最大稳定极值区域算法
人工智能·opencv·算法·计算机视觉
bubiyoushang88815 小时前
基于CLEAN算法的杂波抑制Matlab仿真实现
数据结构·算法·matlab
2401_8948281216 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
Remember_99316 小时前
【LeetCode精选算法】前缀和专题二
算法·哈希算法·散列表
源代码•宸16 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
全栈开发圈16 小时前
干货分享|深度学习计算的FPGA优化思路
人工智能·深度学习·fpga开发
博大世界17 小时前
matlab结构体数组定义
数据结构·算法