搞了几个月的高速采集项目,核心器件就是AD9653这块16位、双通道、最高125MSPS的ADC,配合FPGA搭完整的JESD204B接收链路。从选型评估、原理图设计、PCB布局到FPGA侧IP核配置和联调,整个过程踩了不少坑,也沉淀了不少可以复用的经验。这篇文章把从硬件到软件、从原理到实操的完整过程整理出来,给正在做高速ADC采集、软件无线电、示波器前端或者多通道同步采样方案的朋友做个参考。如果你也想用JESD204B接口的ADC,那这篇内容尤其值得看完。
1. 项目背景与AD9653选型思路
1.1 这个项目要解决什么问题
当时的需求是做一个双通道高速数据采集前端,模拟输入信号带宽到几十兆赫兹,要求16位分辨率,采样率至少100MSPS,数据要实时送到FPGA做后续处理。这种指标下,传统的并行LVDS接口ADC还能用,但PCB布线压力大、管脚数量多,多通道扩展也不方便。另一个选择是改用JESD204B接口的ADC,用高速串行lane替代并行总线,FPGA侧只需接几对高速差分线。
AD9653正好落在需求区间内:双通道、16bit、最高125MSPS、集成JESD204B Subclass 1接口,支持多片同步,而且ADI提供参考设计和寄存器配置向导,开发周期能明显压缩。当时对比过同档次的其他器件,比如AD9650是LVDS接口,管脚多——但它最大的问题是FPGA资源占用大,尤其是引脚和时序约束,最后综合考虑还是选了带串行接口的AD9653。
1.2 AD9653的核心参数和接口特点
先把AD9653的几个关键参数列出来,方便后面展开讨论。
| 项目 | 参数 |
|---|---|
| 分辨率 | 16 bit |
| 通道数 | 2 |
| 最高采样率 | 125 MSPS |
| 输出接口 | JESD204B Subclass 1 |
| 模拟电源 | 1.8 V AVDD |
| 数字电源 | 1.8 V DRVDD |
| 输入形式 | 差分模拟输入,带宽可达几百MHz |
| 满量程输入 | 典型1.5 Vpp 差分,可通过SPI微调 |
| 信噪比 SNR | 典型值约77 dBFS @ 10 MHz(以数据手册为准) |
| 无杂散动态范围 SFDR | 典型值约90 dBc @ 10 MHz(以数据手册为准) |
JESD204B这个接口和传统并行接口最大的不同,是把转换后的并行采样数据按帧结构打包,经过8b/10b编码后通过高速串行lane发送。AD9653在双通道16bit、125MSPS时,如果只配2条lane,每条lane的编码后线速率能达到2.5Gbps;实际更推荐按4条lane配置,把线速率降到1.25Gbps左右,对FPGA的GTX/GTH bank压力小很多,信号完整性也更好处理。
2. 硬件电路设计要点
2.1 电源树设计与去耦
AD9653对电源噪声比较敏感,模拟电源AVDD直接影响采样信噪比。项目里我用了“LDO为主、DC-DC为辅”的策略:先把外部5V用DC-DC降到2.5V,再用低噪声LDO分别转出1.8V AVDD和1.8V DRVDD。AVDD和DRVDD之间用磁珠隔离,并在芯片电源引脚附近放0.1uF和10uF电容组合去耦。如果板上有FPGA,注意FPGA的开关电源噪声不能耦合到ADC模拟电源上,在电源层划分时就要把模拟区域和数字区域分开。
有个容易被忽略的细节:SPI接口的电源域也要接到DRVDD,如果SPI上拉电阻接到了其它电源轨,上电时序不一致可能导致寄存器写不进去。我第一次调试时遇到过SPI读回全FF的情况,查了半天发现是上拉电阻接到了3.3V,而DRVDD是1.8V,两者上电先后不确定,SPI电平不匹配。
2.2 时钟方案与SYSREF处理
ADC的采样时钟质量直接决定系统信噪比,时钟抖动会折损高输入频率下的SNR。这个项目里用了低抖动时钟发生器,输出LVDS电平给AD9653的CLK+和CLK-,采样时钟频率通过SPI配置内部PLL分频。JESD204B Subclass 1还需要一个SYSREF信号,用于对齐多片ADC的本地多帧时钟LMFC。SYSREF可以来自时钟芯片,也可以由FPGA产生,但必须保证和采样时钟同源,否则建立保持时间无法满足。
我当时把SYSREF做成从FPGA可控制的引脚输出,这样在上电后可以通过FPGA动态产生SYSREF脉冲,调试对齐时比硬件固定连接灵活很多。SYSREF走线要尽量短,且远离数字开关信号,这个信号比较“娇气”,干扰大了会直接影响链路同步。
2.3 模拟输入前端与幅度匹配
AD9653是差分输入,输入满量程典型1.5Vpp。如果前端信号源是单端,需要通过巴伦转差分,或者用全差分放大器做单端转差分同时完成电平搬移。巴伦方案的优点是噪声低、无额外功耗,缺点是不能提供直流偏置,适合交流耦合场景;如果信号本身带直流分量或者需要DC采集,就用全差分放大器。
我在项目里用巴伦做了两路交流耦合输入,巴伦次级中心抽头通过电阻分压给ADC提供共模电平。这里有个坑:中心抽头电压要严格按照AD9653数据手册推荐的共模电压来设置,一般接近AVDD/2,偏离过大会导致输出波形产生削顶。调节满量程可以通过SPI配置寄存器,把输入范围适当调小可以提高小信号分辨率,但要注意别在调试初期就动这个参数,会增加排查问题的变量。
2.4 PCB布局布线与JESD204B信号质量
JESD204B高速串行信号对PCB要求比LVDS高不少。4条lane跑1.25Gbps时,虽然速率不算极端,但布局布线不合理照样出误码。
经验归纳几条:
- 差分对阻抗控制在100欧姆,走线等长等距,同一对差分线内长度差控制在5mil以内。
- 高速lane远离时钟输出和模拟输入走线,避免串扰。
- 参考层要完整,不能跨分割,否则返回路径不连续会增加误码率。
- 模拟输入部分与数字接口部分分区放置,ADC芯片底下尽量铺完整地平面。
- 所有SPI控制线属于慢速信号,可以随意点,但不要和高速lane平行走太长距离。
当时打样回来第一次上电,JESD204B链路能同步但偶发误码,后定位到是其中一条lane走线跨了电源层分割,改版后问题消失。验证了那句话:高速信号出问题,90%以上是布局布线的问题。
3. FPGA逻辑设计与JESD204B链路搭建
3.1 JESD204B协议要点和参数规划
JESD204B协议描述的是“转换器-逻辑器件”之间的串行数据链路。数据被组织成帧,多个帧组成多帧,帧结构由参数L、M、F、S、K等确定。调这套链路,第一步就是把参数算对,参数错了后面全白搭。
这次项目的链路配置如下:
| 参数 | 取值 | 说明 |
|---|---|---|
| L | 4 | 高速lane数量 |
| M | 2 | 转换器数量(双通道) |
| F | 1 | 每lane每帧包含的octet数 |
| S | 1 | 每帧每个转换器包含的样本数 |
| N | 16 | 转换器分辨率 |
| N' | 16 | 实际传输的样本bit数,N'=16 |
| CS | 0 | 无控制bit |
| K | 32 | 每个多帧包含32个帧 |
| Subclass | 1 | 使用SYSREF对齐LMFC |
线速率可以用这个公式估算:
未编码数据速率 = M × N' × S × 采样率 / L
代入数值:2 × 16 × 1 × 125MHz / 4 = 1Gbps,再乘以8b/10b编码系数10/8,得到每lane线速率1.25Gbps。这个速率对于7系列的GTP或Ultrascale的GTY来说余量很充足。
3.2 FPGA侧JESD204B IP核配置
在Vivado里使用JESD204B IP核,配置时重点确认几个地方:逻辑层参数要和ADC侧一致,物理层选择对应的GTX/GTH transceiver,参考时钟频率要与线速率匹配。1.25Gbps线速率下,GTX参考时钟一般用125MHz,IP会自动完成内部PLL配置。
另一个关键点是RX的时钟恢复。JESD204B链路接收端要从串行数据流中恢复出恢复时钟,用恢复时钟把数据送入deserializer。初始调试时,如果GTX的复位时序不对,RX不会输出有效数据。我在最初阶段经常遇到“RPLL锁定但RX数据一直为零”的情况,后来确认是GTX复位释放太早,参考时钟还没稳定导致。解决办法是把GTX的复位逻辑改成由MMCM/PLL locked和参考时钟稳定标志共同控制。
3.3 同步与对齐:SYSREF与LMFC
JESD204B Subclass 1的同步过程可以拆成三步:首先是SYSREF信号让所有器件的LMFC对齐,然后是接收端发送SYNC~信号请求同步,最后是发送端在多帧边界发送K28.5码,接收端检测到K码后完成帧和多帧对齐。
FPGA侧必须保证SYSREF的建立时间和保持时间都满足要求。SYSREF可以先打两拍同步到系统时钟域,再送给JESD204B IP的sysref引脚。如果时序余量不够,就要检查SYSREF和采样时钟的相位关系,必要时在硬件上加可控延迟线,或者在FPGA内部用IDELAY调整。
还有一个经验:上电后不要急着让FPGA产生SYSREF脉冲,先等ADC的PLL锁定,再等参考时钟稳定,最后才发SYSREF。顺序错了会导致同步不稳定,表现为偶尔同步上偶尔同步不上。
3.4 数据接收通路和采集缓存设计
JESD204B IP输出的AXI4-Stream数据格式是每个通道的采样数据按帧交替排列。AD9653输出默认是偏移二进制格式,拿到数据后需要转成二进制补码再给后续处理模块,或者直接按偏移二进制处理,取决于下游算法对格式的约定。
我在IP后面加了一个简单的数据格式转换模块和一个异步FIFO做跨时钟域。因为JESD204B IP输出的数据时钟来自GTX恢复时钟,和FPGA逻辑主时钟是异步的,FIFO是最稳妥的处理方式。FIFO读写水位要做好监控,如果读端长期为空或写端溢出,说明上下游数据速率不匹配。
调试时用ILA(集成逻辑分析仪)直接抓取FIFO读端的数据,观察波形是否符合预期。如果输入是一个低频正弦波,抓到的数据应该能看出平滑的正弦轮廓,这是验证链路通不通的最直观方法。
4. 系统联调与问题排查实录
4.1 调试流程和工具准备
AD9653系统联调,我习惯按下面的顺序走:
- 上电后先读ADC寄存器,确认SPI通信正常。
- 配置ADC为测试图案输出模式,比如斜坡或PN序列,验证JESD204B链路完整性。
- 确认链路无误后切换为正常采样模式,用信号源给一个低频正弦波。
- 用ILA抓取数据,检查波形是否正确。
- 用Matlab或Python对抓取的数据做FFT,评估SNR和SFDR。
这套流程的好处是每一步都有明确的判断标准,链路通没通、数据对不对,一目了然。如果跳过第2步直接上真实信号,链路误码和信号异常混在一起,很难定位问题。
测试图案模式是JESD204B调试的神器。AD9653内置的测试图案包括全零、全一、斜坡、PN23、PN9等。用FPGA侧产生同样的期望图案,把实际接收数据和期望数据逐bit比较,就能精确判断链路是否有误码。
4.2 问题一:SYNC~信号一直为高,链路同步不上
现象是AD9653的SYNC~引脚一直为高,说明接收端一直没有成功完成同步。排查过程如下:
先确认FPGA侧JESD204B IP是否处于正常工作状态,查看IP状态寄存器,发现GTX的PLL已经锁定,但RX byte对齐一直没完成。然后用ILA抓GTX的rxbyteisaligned信号,发现该信号一直为低,说明8b/10b字节对齐没成功。
继续追查发现GTX参考时钟实际频率和IP配置不一致,本应125MHz,但万用表和示波器量出来却是124.9MHz多。原因是时钟芯片配置有误,输出频偏超出要求。修正配置后,rxbyteisaligned正常拉高,SYNC~信号成功拉低,完成同步。
这个问题的经验总结:JESD204B链路同步问题,先查字节对齐标志,再查时钟和GTX配置。有的问题现象看起来是上层协议的事,实际根因在物理层。
4.3 问题二:数据偶发跳变和误码
链路同步后,测试图案模式误码率不高但偶发跳变。用ILA抓数据,发现某些时刻连续几个采样数据都错,随后又恢复正常。这个现象明显不是直流偏移或增益问题,更像是物理层偶发误码。
检查了高速lane的差分对走线、连接器接触、终端电阻,最后定位到问题出在电源上:AVDD上叠加了高频纹波,幅值十几毫伏,来源是相邻电源模块的开关噪声通过地平面耦合过来。在ADC电源引脚处加大容值滤波电容并加磁珠隔离后,误码消失。
高速混合信号系统中,电源完整性对误码率的影响往往比理论计算更明显。数字开关噪声耦合到模拟电源后,会直接影响ADC内部比较器的工作点,导致采样结果偶尔异常。
4.4 问题三:波形幅度和直流偏置不对
链路通了,数据也连续了,但用信号源输入一个1kHz、1Vpp的正弦波,抓出来的数据是“削顶”的,幅度偏小且带直流偏移。
先检查模拟输入配置,发现巴伦次级中心抽头的共模电压设置不当,实际比AVDD/2低了约100mV,导致ADC输入信号整体向下偏移,上端先削顶。调整中心抽头分压电阻后,削顶消失。
这个问题的要点是在排查ADC数据异常时,不要一上来就调FPGA逻辑,先用示波器测ADC模拟输入端的实际波形,确认信号到了ADC引脚时确实正确。很多“看起来很FPGA的问题”,根源其实在前级模拟电路。
4.5 常见问题速查表
| 现象 | 可能原因 | 排查方法与处理 |
|---|---|---|
| SYNC~一直为高 | GTX时钟配置错误、SYSREF没对齐、IP参数不一致 | 检查字节对齐标志,确认参考时钟频率与线速率匹配,核对L/M/F/S参数 |
| SPI读回全FF | SPI电平不匹配、DRVDD未上电、时序不对 | 检查上拉电阻电源域,输出是否和DRVDD一致 |
| 数据全零或全F | RX数据通路未工作、GTX复位时序错误 | 检查复位信号是否由lock标志控制,确认IP输出valid信号 |
| 数据偶发跳变 | 电源纹波大、高速lane信号完整性差、SYSREF干扰 | 检查电源纹波,优化去耦,检查差分走线跨分割,SYSREF远离高速lane |
| 输出波形削顶 | 输入共模电压偏移、满量程配置过小 | 用示波器测输入波形,调整共模电压和满量程寄存器 |
| 通道间数据错位 | 帧对齐错误、参数配置不一致 | 使用斜坡测试图案,检查通道顺序和帧边界 |
4.6 调试心得补充
调试过程中我还有一个习惯:每次SPI配置后都会把相关寄存器读回一遍,确认写入成功。AD9653的寄存器比较多,配置脚本化后容易掩盖问题,读回校验能快速排除配置错误。
测试图案模式下如果链路全链路无误码,基本可以放心切真实采样。还有一个小技巧:用FPGA内部计数器产生一个已知频率的方波或正弦波送给ADC做自测,这样可以不依赖外部信号源,方便在实验室环境快速验证整条链路。
5. 项目复盘与经验心得
5.1 硬件与FPGA开发的高效协作
这个项目让我对“硬件先走一步,FPGA并行介入”的流程有了更深体会。PCB布局布线阶段,FPGA工程师就应该参与到JESD204B lane规划里,确定GTX bank位置,避免lanet分配和PCB走线冲突。如果等板子回来再发现FPGA引脚约束导致走线绕大圈,就很被动了。
FPGA逻辑开发和硬件调试不必严格串行。PCB投板阶段就可以开始搭建JESD204B IP核的仿真环境,AD9653有IBIS-AMI模型,可以做完整的链路仿真。仿真虽然不能替代实测,但能把很多低级配置错误提前暴露出来,省下的时间非常可观。
5.2 高速ADC调试可以复用的经验
这次项目调完,几个通用的经验我觉得值得再强调一遍:
第一,调试JESD204B链路要“从底层往上走”。先验证物理层,再验证字节同步,再验证多帧同步,最后才看数据内容。只要链路断在哪一层,就去哪一层排查。
第二,测试图案模式是链路调试最可靠的手段,一定要善用。没有它,很多问题会牵扯到“是ADC的问题还是FPGA的问题”,有了它,链路本身通不通先给出明确结论。
第三,电源是高速ADC项目的隐性杀手。原理图看着没问题、布局布线也没踩大坑,但纹波和噪声仍然可能让数据异常。电源预算表要提前做,哪些电源轨对噪声敏感要心中有数。
第四,如果项目里后续要扩展更多通道,比如四通道、八通道,一定要在方案阶段就想好多片同步的SYSREF分配方案,等板子做出来再改成本就高了。AD9653的Subclass 1机制就是为多片同步设计的,规划好时钟树,后面扩展会顺利很多。
这次AD9653项目从零基础到稳定采集,前后大概花了一个半月。回看整个流程,最费时间的不是代码编写,而是问题定位。如果一开始就把测试图案校验、电源去耦、时钟规划这几个环节做扎实,至少能省出一周以上的调试周期。希望这篇总结能帮正在做类似项目的人少走点弯路。