FPGA实战(53):基于FPGA的8通道并行数字下变频(DDC)系统设计
一、设计背景
数字下变频(DDC)是宽带数字接收机和软件无线电系统的核心技术环节。典型DDC链路包括:正交混频、低通滤波和抽取降速。然而,当ADC采样率高达500MSPS甚至更高时,FPGA的处理时钟难以直接匹配如此高的数据率,传统串行处理架构面临严重的时序压力。
本文设计了一种8通道并行、4相采样的DDC系统,在125MHz主时钟下实现等效500MSPS采样率的实时处理,将8个ADC通道的4相I/Q数据经信道化合并、数字混频、FIR滤波后,以25MHz时钟输出基带I/Q数据。该设计可直接应用于多通道数字化接收机、数字阵列雷达等场景。
二、系统架构与创新点
2.1 整体架构
整个系统采用自顶向下的模块化设计,分为三个层次:
2.2 核心创新点
创新点一:8通道×4相全并行处理架构
传统DDC设计通常只处理单通道数据,或采用时分复用方式在多通道间共享资源。本设计将8个ADC通道全部例化独立的DDC处理链路,每个通道内部再采用4相并行采样结构。ddc_top模块通过generate语句自动生成8个ad_chan_ddc实例,实现了真正的全并行处理,通道间完全独立、无资源竞争。
创新点二:4相数据拼接与多相滤波信道化
针对高采样率(等效500MSPS)带来的时序挑战,本设计将ADC的4个相位数据(P1~P4)拼接为64bit宽总线:
w_din_data_i_64 = {DATIN_P4_i, DATIN_P3_i, DATIN_P2_i, DATIN_P1_i};Multiphase_fir模块对4相数据进行并行滤波,输出4路18bit滤波结果后打包为72bit总线。channelization_4phase再将4路数据通过两级求和合并为单路16bit输出。这种抽取前置的策略使后续混频和滤波模块工作在对硬件友好的125MHz时钟下。
创新点三:双时钟域设计与跨时钟域同步
系统涉及125MHz处理时钟(CLK)和25MHz输出时钟(CLK_25M)两个时钟域。chan_ddc模块中实现了完整的跨时钟域处理方案:
- 25MHz时钟域的复位同步器(
r_rst_sync_25m) ddc_fifo模块完成数据从125MHz到25MHz的跨时钟域传输- 输出寄存器(
ro_ddc_en/ro_ddc_data)使用同步复位S_RST_25M
创新点四:自动化的仿真验证平台
tb_ddc_top测试平台实现了全自动化的功能验证流程:
- 4种测试用例:直流测试、通带边缘(9MHz)、阻带中心(50MHz)、下变频(30MHz→0MHz)
- 8通道一致性校验
- 基于峰峰值(Peak-to-Peak)的自动PASS/FAIL判定
- 参数化的信号生成(
generate_multiphase_rf任务)
三、各模块功能详解
3.1 ddc_top —— 顶层集成模块
功能:将8个ADC通道的4相I/Q数据(共64个16bit信号)聚合,例化8个ad_chan_ddc子模块,并将各通道输出拼接为256bit总线和8bit使能信号。
关键设计:
- 使用
reg [127:0]寄存器数组将64个输入信号按通道和相位重新组织 - 利用
generate循环生成8个DDC实例,每个实例通过位片索引[16*i +: 16]获取对应通道数据 - 输出
ddc_data[255:0]按通道0~7顺序排列,每通道32bit(I低16位 + Q高16位)
3.2 ad_chan_ddc —— 单通道DDC集成
功能:将channelization_4phase(4相信道化)和chan_ddc(单通道DDC)串联,完成从4相ADC输入到基带I/Q输出的完整链路。
数据流:
4相I/Q数据 → channelization_4phase → 单路16bit I/Q (125MHz) → chan_ddc → 32bit基带数据 (25MHz)3.3 channelization_4phase —— 4相信道化
功能:将4路相位偏移的ADC采样数据通过多相FIR滤波器合并为一路等效高速数据流。
内部处理流程:
- 数据拼接:将4个I路16bit数据拼接为64bit向量,Q路同理
- 多相滤波:
Multiphase_fir输出4路18bit滤波结果 - 符号位扩展:将18bit扩展为21bit(补3位符号位)
- 两级求和:
- 第一级:P1+P2、P3+P4(21bit)
- 第二级:两级结果相加(21bit)
- 截位输出:取
[18:3]并加上舍入位[2],得到16bit输出
3.4 chan_ddc —— 单通道DDC核心
功能:完成数字混频、FIR滤波和跨时钟域输出。
子模块:
| 子模块 | 功能 | 关键参数 |
|---|---|---|
mix_freq | NCO数字混频,将信号搬移至基带 | P_DDS_LATENCY=9 |
fir_filter | FIR低通滤波,抑制带外分量 | 系数由MATLAB生成 |
ddc_fifo | 125MHz→25MHz跨时钟域FIFO | 双时钟、独立读写 |
输入打拍:所有输入信号先经过一级寄存器(ri_*)再送入子模块,有效改善时序。
输出同步:使用25MHz时钟域的同步复位s_rst_25m对输出寄存器进行复位控制。
四、仿真验证
4.1 测试平台特性
tb_ddc_top测试平台提供了完整的自动化验证环境:
时钟与复位:
- 125MHz主时钟(周期8ns)
- 25MHz输出时钟(周期40ns)
- 复位释放后等待100ns开始测试
测试用例:
| 用例 | RF频率 | NCO频率 | 验证目标 |
|---|---|---|---|
| 1 | 10MHz | 5MHz | 直流路径(通带) |
| 2 | 9MHz | 2MHz | 通带边缘响应 |
| 3 | 50MHz | 20MHz | 阻带衰减 |
| 4 | 30MHz | 30MHz | 下变频到基带 |
自动判定机制:
- 根据输出频率与滤波器参数(截止频率12MHz、过渡带20MHz)自动计算判定阈值
- 通带内:峰峰值 > 15000判定为PASS
- 阻带内:峰峰值 < 2000判定为PASS
- 过渡带:峰峰值 < 8000判定为PASS(WARN)
- 自动校验8个通道输出一致性
4.2 信号生成
generate_multiphase_rf任务生成8通道完全相同的4相正弦波激励:
step = 2.0 * 3.1415926 * freq / 500.0; // 500MSPS等效采样率 tmp_p1_i = $rtoi(10000.0 * $cos(phase_rf)); tmp_p2_i = $rtoi(10000.0 * $cos(phase_rf + 1.0 * step)); // P3、P4依次滞后 phase_rf = phase_rf + 4.0 * step;五、代码结构
| 文件名 | 功能描述 |
|---|---|
ddc_top.v | 顶层模块,8通道DDC例化与数据拼接 |
ad_chan_ddc.v | 单通道DDC集成,连接信道化与DDC核心 |
channelization_4phase.v | 4相信道化,多相滤波与数据合并 |
chan_ddc.v | 单通道DDC核心,混频+滤波+跨时钟域 |
tb_ddc_top.v | 仿真测试平台,自动化验证 |
六、设计要点总结
- 高采样率适配:通过4相并行采样+125MHz主时钟,实现等效500MSPS处理能力
- 多通道扩展性:
generate循环例化,通道数可灵活配置 - 跨时钟域安全:双时钟域设计+复位同步+异步FIFO,确保数据可靠传输
- 资源效率:多相滤波架构将高速率处理分散到4个并行支路,降低单路时序压力
- 可验证性:完整的仿真测试平台,支持自动化回归测试
七、完整代码
// ============================================================ // 文件名: ddc_top.v // 功能: 8通道并行DDC顶层模块 // ============================================================ module ddc_top( input CLK , input CLK_25M , input RST , input [15:0] adc0_data_p1_i , input [15:0] adc0_data_p2_i , input [15:0] adc0_data_p3_i , input [15:0] adc0_data_p4_i , input [15:0] adc0_data_p1_q , input [15:0] adc0_data_p2_q , input [15:0] adc0_data_p3_q , input [15:0] adc0_data_p4_q , input [15:0] adc1_data_p1_i , input [15:0] adc1_data_p2_i , input [15:0] adc1_data_p3_i , input [15:0] adc1_data_p4_i , input [15:0] adc1_data_p1_q , input [15:0] adc1_data_p2_q , input [15:0] adc1_data_p3_q , input [15:0] adc1_data_p4_q , input [15:0] adc2_data_p1_i , input [15:0] adc2_data_p2_i , input [15:0] adc2_data_p3_i , input [15:0] adc2_data_p4_i , input [15:0] adc2_data_p1_q , input [15:0] adc2_data_p2_q , input [15:0] adc2_data_p3_q , input [15:0] adc2_data_p4_q , input [15:0] adc3_data_p1_i , input [15:0] adc3_data_p2_i , input [15:0] adc3_data_p3_i , input [15:0] adc3_data_p4_i , input [15:0] adc3_data_p1_q , input [15:0] adc3_data_p2_q , input [15:0] adc3_data_p3_q , input [15:0] adc3_data_p4_q , input [15:0] adc4_data_p1_i , input [15:0] adc4_data_p2_i , input [15:0] adc4_data_p3_i , input [15:0] adc4_data_p4_i , input [15:0] adc4_data_p1_q , input [15:0] adc4_data_p2_q , input [15:0] adc4_data_p3_q , input [15:0] adc4_data_p4_q , input [15:0] adc5_data_p1_i , input [15:0] adc5_data_p2_i , input [15:0] adc5_data_p3_i , input [15:0] adc5_data_p4_i , input [15:0] adc5_data_p1_q , input [15:0] adc5_data_p2_q , input [15:0] adc5_data_p3_q , input [15:0] adc5_data_p4_q , input [15:0] adc6_data_p1_i , input [15:0] adc6_data_p2_i , input [15:0] adc6_data_p3_i , input [15:0] adc6_data_p4_i , input [15:0] adc6_data_p1_q , input [15:0] adc6_data_p2_q , input [15:0] adc6_data_p3_q , input [15:0] adc6_data_p4_q , input [15:0]