1. 项目背景与核心需求
最近接手了一个高速数据采集系统的开发任务,核心是要搞定AD9680这款14位、1GSPS采样率的ADC芯片与FPGA的协同工作。作为硬件出身的工程师,我深知这种高速ADC的测试程序开发往往是个"深坑"——寄存器配置复杂、时序要求严苛、数据对齐困难。这次我决定用Xilinx Vivado 2022.1作为开发环境,记录下从零开始搭建测试平台的完整过程。
AD9680是ADI公司JESD204B接口ADC的典型代表,支持最多4个通道的同步采样。在实际项目中,我们需要验证其在不同采样率下的性能指标,包括信噪比(SNR)、无杂散动态范围(SFDR)等关键参数。传统用单片机写测试程序的方式已经跟不上高速数据处理的节奏,FPGA方案能提供更灵活的数据处理和实时监控能力。
2. 硬件环境搭建
2.1 开发板选型与连接
我选用的是Xilinx Kintex-7 KC705评估板,主要考虑其GTX收发器性能足够支撑JESD204B协议要求。硬件连接需要注意几个关键点:
-
时钟系统:
- 主时钟采用AD9680评估板上的100MHz OCXO
- SYSREF信号由FPGA通过LVDS输出
- 使用Mini-Circuits功分器确保时钟同步
-
电源配置:
- 为AD9680提供1.8V核心电压和3.3V IO电压
- 每个电源轨都加了π型滤波网络
重要提示:JESD204B对电源噪声极其敏感,实测纹波超过50mV就会导致链路失锁。建议用示波器带宽限制到20MHz测量各电源轨噪声。
2.2 Vivado工程创建
新建工程时关键配置项:
tcl复制create_project ad9680_test ./vivado_project -part xc7k325tffg900-2
set_property board_part xilinx.com:kc705:part0:1.5 [current_project]
需要特别添加的IP核:
- JESD204 PHY (配置为RX模式,Lane Rate=3.125Gbps)
- Clocking Wizard (生成156.25MHz器件时钟)
- System ILA (用于实时抓取JESD链路状态)
3. JESD204B链路建立
3.1 协议参数计算
AD9680采用Subclass1模式,需要计算以下关键参数:
-
确定帧时钟(F)和每帧字节数:
- 14位分辨率 → 2字节/样本
- 每通道2个样本/帧 → F=2
- 每帧字节数 = 2通道 × 2字节 = 4字节
-
多帧参数(K):
- 根据协议要求 K=32
- 多帧周期 = K×F = 32×2 = 64个帧时钟
-
Lane速率验证:
- 采样率1GSPS
- 总数据率 = 1G×14bit×2通道 = 28Gbps
- 实际使用4个Lane → 每个Lane速率=7Gbps
- 考虑8B/10B编码 → 实际线速率=8.75Gbps
注意:由于KC705的GTX最高支持12.5Gbps,这个配置完全可行。如果使用更低端的FPGA,可能需要降低采样率或减少通道数。
3.2 寄存器配置序列
通过FPGA模拟SPI接口配置AD9680寄存器,关键配置步骤:
-
复位序列:
- 写0x0000 = 0x01 (软复位)
- 延时10ms
- 写0x0000 = 0x00 (退出复位)
-
JESD204B核心配置:
c复制// 设置Lane数量和速率 write_reg(0x301, 0x03); // 4个Lane write_reg(0x304, 0x0A); // 10位分辨率模式 // 配置Subclass1参数 write_reg(0x310, 0x1F); // K=32 write_reg(0x311, 0x01); // F=2 -
同步校准:
c复制write_reg(0x318, 0x01); // 使能SYNC~ while(!(read_reg(0x320) & 0x01)); // 等待CGS阶段完成
4. 数据采集与处理
4.1 JESD IP核配置
Vivado中JESD204 IP核需要与ADC保持严格一致的参数配置:
tcl复制set_property CONFIG.C_NODE_IS_TRANSMIT {0} [get_ips jesd204_0]
set_property CONFIG.C_LANES {4} [get_ips jesd204_0]
set_property CONFIG.C_F {2} [get_ips jesd204_0]
set_property CONFIG.C_K {32} [get_ips jesd204_0]
数据通路设计要点:
- 使用AXI-Stream接口连接JESD IP与数据处理模块
- 添加Data FIFO缓冲跨时钟域数据
- 插入ILA核实时监测数据有效性
4.2 数据对齐校验
由于JESD204B采用8B/10B编码,需要特别注意数据对齐问题。我设计了一套校验机制:
-
查找K28.5字符:
verilog复制always @(posedge rx_clk) begin if (rx_data[9:0] == 10'b1010000011) k_char_cnt <= k_char_cnt + 1; end -
通道对齐监测:
- 每个Lane的K28.5计数器差值应小于3
- 持续10个周期不对齐则触发重新同步
-
数据重组逻辑:
verilog复制// 将4个Lane的并行数据重组为原始采样序列 always @(posedge rx_clk) begin if (data_valid) begin ch1_data <= {lane3_data[15:0], lane2_data[15:0]}; ch2_data <= {lane1_data[15:0], lane0_data[15:0]}; end end
5. 性能测试与优化
5.1 测试信号生成
使用安捷伦N5182B信号源产生测试信号:
- 单音测试:-1dBFS 10MHz正弦波
- 多音测试:5MHz(-6dBFS) + 15MHz(-12dBFS)
- 噪声测试:100MHz带宽白噪声
5.2 关键指标测量
-
SNR测量方法:
python复制# 使用Python做FFT分析 import numpy as np fft_result = np.fft.fft(adc_data) signal_power = np.max(np.abs(fft_result[10:100])) noise_power = np.sum(np.abs(fft_result)) - signal_power snr = 20 * np.log10(signal_power/noise_power) -
SFDR计算流程:
- 定位信号主频幅值
- 查找频谱中第二大峰值
- 计算两者dB差值
实测结果对比:
| 采样率 | 输入频率 | SNR(dB) | SFDR(dB) |
|---|---|---|---|
| 1GSPS | 10MHz | 72.3 | 85.6 |
| 500MSPS | 50MHz | 70.1 | 82.4 |
5.3 时序优化技巧
-
时钟树优化:
- 将SYSREF布线到全局时钟网络
- 添加IDELAYCTRL模块校准延迟
-
PCB布局经验:
- ADC时钟走线长度匹配控制在±50ps内
- 避免将数字信号线与时钟平行走线
-
电源改进方案:
- 在ADC电源引脚就近放置10μF+0.1μF电容组合
- 使用铁氧体磁珠隔离数字和模拟电源
6. 常见问题排查
6.1 链路无法锁定
现象:JESD IP核持续报告"SYNC_ERROR"
排查步骤:
-
检查SYSREF信号质量
- 用示波器测量SYSREF抖动(<50ps)
- 确认与器件时钟边沿对齐
-
验证lane速率:
tcl复制# 在Vivado TCL控制台查看链路状态 report_jesd_status -name jesd_report -
寄存器配置验证:
- 确认AD9680的0x320寄存器bit0置位
- 检查FPGA端LMF参数匹配
6.2 数据周期性错误
现象:每32768个样本出现一次数据跳变
根本原因:FPGA端FIFO溢出
解决方案:
- 增加AXI Stream FIFO深度
- 优化DMA传输突发长度
- 添加硬件流控信号
6.3 测量指标波动大
可能原因及对策:
-
电源噪声:
- 在1.8V电源轨上加装低ESR钽电容
- 改用LDO代替开关电源
-
时钟抖动:
- 更换更高稳定度的OCXO
- 缩短时钟走线长度
-
参考电压不稳定:
- 在AD9680的VREF引脚加装1μF MLCC
- 避免参考源负载变化过大
7. 项目总结与扩展
经过两周的调试,最终实现的测试平台可以稳定捕获1GSPS采样数据,并实时计算动态性能指标。这里分享几个关键心得:
-
调试工具链选择:
- 必用:Vivado ILA、SignalTap
- 推荐:ADI的VisualAnalog软件做快速频谱分析
- 神器:Tektronix RSA实时频谱仪
-
代码管理技巧:
- 为不同采样率创建不同的Constraint文件
- 使用TCL脚本自动化编译流程
-
扩展应用方向:
- 添加数字下变频(DDC)处理链
- 实现自动增益控制(AGC)算法
- 构建多板卡同步采集系统
这个项目让我深刻体会到,高速ADC测试不仅是寄存器配置那么简单,更需要从电源、时钟、PCB到FPGA逻辑的全系统协同优化。下次如果再开发类似项目,我会优先考虑使用ADI提供的参考设计框架,可以节省至少30%的开发时间。