
1. 项目概述与核心难点1.1 AD9694是什么为什么调试它那么折腾AD9694是ADI推出的一款四通道、14位、最高1 GSPS采样率的JESD204B接口ADC芯片。它的定位很明确用于多通道、高带宽的数据采集场景比如相控阵雷达、软件无线电、多通道示波器前端、宽带通信中频采样等。和传统LVDS/CMOS并行输出ADC相比AD9694最大的特点就是把数据通道收敛到了高速串行链路上——四条lane或者按配置减少通过JESD204B协议把数据送到FPGA的GTX/GTY/GTH等高速收发器上。这款芯片其实是AD9689/AD9208这些高端器件的“小兄弟”但它的调试复杂程度一点都不“小”。我记得第一次拿到AD9694的板子时光是把JESD204B链路跑通就花了将近三个工作日。回头复盘发现卡住的点基本都是些文档里写得不够直白、或者时序细节容易被忽略的地方。这篇博文就是把这些坑整理出来给准备调试AD9694的朋友省点走弯路的时间。1.2 调试AD9694需要哪些前置条件在动手之前有几个前置条件必须确认不然后面所有的努力都是白费硬件层面AD9694的电源供电必须正常尤其要注意模拟电源AVDD、数字电源DVDD、以及FPGA侧高速收发器电源的时序关系。AD9694对电源纹波比较敏感尤其是采样时钟的相位噪声会被直接折到输出信号里。时钟层面AD9694需要外部提供参考时钟CLK/-这颗时钟的质量直接决定了采样性能。如果是通过时钟芯片比如AD9528、LMK04828产生那这个时钟芯片的配置要先行搞定因为SYSREF也需要同源产生。FPGA开发环境我用的Vivado版本是2019.2以上JESD204B IP核从Vivado 2017.4开始集成了比较完整的支持但版本之间差异不小。如果是IntelAltera平台对应的Transceiver JESD204B IP和ADI的HDL工程集成方式不太一样本文以Xilinx环境为主。辅助工具一个支持SPI读写的上位机ADI的AD9694评估板软件、或者自己写一个SPI调试助手、Ila逻辑分析仪核、以及一个靠谱的频谱分析仪验证信号质量用。提示AD9694的SPI接口虽然是标准的四线SPI但它支持burst mode也就是一次可以连续读写多个寄存器。调试时建议第一次全部读一遍芯片的寄存器ID和版本号确认SPI链路没问题再开始配参数。这个习惯可以帮你排除一半以上的低级问题。2. 整体调试思路与JESD204B协议要点2.1 JESD204B在AD9694上的数据链路架构JESD204B和传统并行接口最大的不同是它把数据打包成帧再以串行方式逐字节传输。打个比方传统并行ADC是大巴车32个人并排坐着一起下车JESD204B更像是地铁乘客按顺序刷卡出站每个人还带着编号。AD9694的JESD204B链路有几个关键参数L通道数量即lane数。AD9694最多支持4条lane配置为LMF 4214 lane、2转换器、1 frame或者更低的通道数。M转换器数量AD9694是4通道所以M 4。F每帧字节数由采样位数和通道数决定对AD9694这样14bit采样、非半字节对齐的情况需要关注是否配置填充位。K每多帧包含的帧数K值一般选32但要注意和SYSREF的配合关系。N / NN是实际转换位数14bitN是有效传输位数默认32bit对齐即4字节这部分由芯片自动处理。CS控制位数通常为0。调试之前建议先在纸上把链路结构画出来ADC端4个通道的数据经过JESD204B的映射、加扰、8b10b编码最终通过4条lane送到FPGA。每个环节都有对应的寄存器位控制你必须让ADC端和FPGA端的参数完全一致才能正常建链。2.2 JESD204B子类1与SYSREF的时序关系AD9694只支持子类1Subclass 1也就是设备必须支持确定性时延Deterministic Latency。这意味着除了设备时钟Device Clock和SYSREF三者必须严格同源。SYSREF的作用是告诉接收端“现在开始对齐多帧边界”。它可以是单脉冲也可以是周期性的常见做法是用时钟芯片输出连续SYSREF或者在配置完成后发送有限数量脉冲比如LMK04828的B脉冲模式。对于FPGA端的IP核来说SYSREF信号必须满足setup/hold时间而且一定要在设备时钟的上升沿附近稳定否则出现了亚稳态链路状态将是“薛定谔的同步”——每次上电结果可能都不一样。实际操作中的经验是先把SYSREF的频率设置成设备时钟频率除以K的倍数关系这是JESD204B规范里说的“SYSREF必须是多帧时钟的整数倍”简单理解就是SYSREF要在同一个多帧边界点到来。如果用的是ADI的评估板或者FPGA开发板尽量用LMK04828的SYSREF输出因为它的SYSREF边沿可以通过寄存器进行精细调节能有效对冲PCB走线带来的skew问题。我踩过一个特别典型的坑SYSREF的上升沿和设备时钟靠得很近Vivado的JESD204B IP核可以正常sync_arm和sync_req但偶发出现链路同步失败。后来用示波器对比了设备时钟和SYSREF的时序发现SYSREF的建立时间不满足在FPGA端把SYSREF经过IBUFDS后加了一级IOBUF的输出延迟IDELAY问题就解决了。所以调试中如果你的SYSREF偶发失步第一个要怀疑的就是时序裕量。2.3 AD9694的SPI寄存器配置关键点AD9694的寄存器表非常长但真正关系链路建链的核心寄存器并不多。这里列出几个我在调试过程中反复打交道的寄存器地址名称作用备注0x0EPLL Enable使能内部时钟分频/倍频如果使用外部参考时钟需要确认PLL状态0x101JESD204B Link Enable使能JESD204B链路默认可能是关闭的0x10BLMF配置设置Lane数L、转换器M、帧F必须和FPGA端一致0x102编码模式使能8b10b编码通常使能0x50测试模式控制设置可测试的pattern调试链路用需要注意的是AD9694的寄存器地址有点反人类有些寄存器是read-back类型的写进去不生效只能读出芯片状态有些是read/write的。建议拿到芯片后先读一下0x00寄存器确认芯片ID是0xDFAD9694的芯片ID具体看手册再往下配置。寄存器配置顺序也有讲究务必先配置时钟相关和JESD204B链路参数最后一步再使能链路。如果顺序反了芯片内部的部分模块可能处于不确定状态。这有点像煮饭你得先把米洗好、水放好再按煮饭键否则按下去了才发现水不够就很被动。2.4 FPGA端JESD204B IP核的初始化流程FPGA端的JESD204B IP核主要由三部分组成JESD204B PHY、JESD204B Transport Layer、以及一个Link Layer的状态机。Vivado通过core configuration界面让你配置L、M、F等参数但这远远不够。核心初始化流程我总结的一般步骤根据AD9694的采样率、位宽和lane数计算线速率。公式线速率 采样率 × 位宽 × M / L再乘以8b10b的1.25倍系数同时还要考虑Framing overhead。比如4通道、14bit、500MSPS、4条lane那么线速率大约是500M × 16有效位/ 4 × 10/8 2.5 Gbps左右。在Vivado中配置GTX/GTH参考时钟确保线速率在收发器的支持范围内。例化JESD204B IP核选择Subclass 1配置好L、M、F等参数以及SYSREF相关的选项。注意IP核的tx_sysref和rx_sysref要分别接到对应AD9694输出的SYSREF实际上通常共用一个SYSREF源。协处理器比如AXI-Lite接口手动初始化先写JESD204B IP核的寄存器拉高reset等locked信号有效后再配置链路层。这里特别提醒如果FPGA端JESD204B IP核显示链路已经up但数据不对大概率是Transport Layer的字节映射问题。AD9694的Sample输出在JESD204B帧里分布是有讲究的不同LMF下映射关系不一样。这时候需要用ADI推荐的“lane mapping”设置把ADC输出的lane顺序和FPGA接收端的lane顺序对应上避免出现通道数据穿串。3. 硬件设计与时钟树注意事项3.1 AD9694的电源设计时序和噪声要求AD9694的电源轨不少模拟3.3V或1.8V取决于型号后缀、数字1.8V、以及FPGA侧需要VCCINT、VMGTAVCC等。关键要求是上电时序不能乱。芯片手册一般会给出推荐的上电顺序通常先模拟电源再数字电源再IO电源。如果电源轨上电顺序不对芯片可能锁死在未知状态表现出来就是SPI能通、但JESD链路死活建不起来。如果板子上没有专门的电源时序控制芯片可以在FPGA端用一个小模块控制各路电源DC-DC的EN引脚输出一个电源好的指示信号确保顺序无误。噪声问题也要重视AD9694对DVDD的纹波比较敏感实测在500MSPS采样率下当DVDD纹波大于50mV峰值时输出频谱的杂散比会增加好几个dB。如果你发现SFDR性能变差用示波器在AC耦合模式下看看DVDD的纹波也许能找到原因。这要求电源设计时至少用LDO给模拟部分供电数字部分适当放一些展频时钟也没有问题但模拟采样时钟的供电必须干净。3.2 采样时钟的关键指标和SYSREF联动AD9694的采样时钟既可以直接用晶振产生也可以通过PLL倍频。但如果你想发挥它的全部性能建议用专用时钟芯片LMK04828或者AD9528。这颗芯片不仅提供设备时钟还提供和它严格同步的SYSREF可以解决你可能遇到的确定性延迟问题。设备时钟的频率不是随便定的它必须满足采样率和FFT分析的需求。AD9694内置了时钟分频器你可以让外部输入一个较高频的时钟再用内部分频得到实际采样率。但注意内部分频不会改变输入时钟的相位噪声所以输入时钟本身质量很重要。一个具体案例我们项目里用LMK04828输出两路时钟一路是100MHz的设备时钟给AD9694另一路是SYSREF脉冲给FPGA和AD9694。由于LMK04828的寄存器配置里SYSREF的输出延迟不是0我需要在FPGA端调整SYSREF到JESD204B IP核的路径延迟。这里最笨但最有效的方法是在IP核的调试界面观察rx_sysref_status这个信号会显示SYSREF是否被正确识别。如果状态不对就调整LMK04828的SYSREF delay直到状态稳定。3.3 PCB布线与重要信号完整性约束布线层面的一些经验总结高速串行线JESD204B lane必须做100Ω差分阻抗控制尽量减少过孔数量。JESD204B的速率通常在2.5Gbps以上过孔stub会带来显著的反射所以关键信号尽量走表层或者埋孔。SYSREF走线最好单独包地不要和高速lane并行过长距离。SYSREF是单端网段通常用差分转单端器件一旦耦合到高速lane的开关噪声上时序裕量就会受到影响。ADC采样时钟的走线建议远离数字逻辑部分避免数字信号跳变通过空间耦合到时钟路径。现实中数字信号和模拟时钟走线平行了2cm就足以让采样时钟相位噪声恶化到不可接受。FPGA侧的GTX参考时钟引脚要经过配置确保对应bank的参考时钟源没配错。比如Vivado工程中如果误把参考时钟引到了GTX的另外一个bank即使线速率正确收发器也无法锁定。这些看起来像老生常谈但其实现场调试的时候每当出现链路不稳、误码率偏高回查硬件布线的耗时往往比查代码还长。前期把约束做好能省掉大量后顾之忧。4. 实操过程与核心环节实现4.1 从零开始AD9694的SPI初始化脚本我在实际调试中习惯用Vivado的MicroBlaze软核或者外部MCU通过SPI配置AD9694。下面给一个简化的初始化流程对应AD9694手册的寄存器表具体地址以手册为准不同版本可能有个别差异1. 读寄存器0x00验证SPI通信和芯片ID 2. 写0x0E 0x01使能内部PLL如果使用外部参考时钟 3. 配置JESD204B相关0x101 0x00 先关闭链路 4. 配置LMF参数0x10B 0x24举例L4M4F2这里是示意值具体要看实际配置 5. 设置N/N0x108 0x00表示32bit对齐0x109 0x00N 32 bit 6. 设置SYSREF相关寄存器0x110 使能SYSREF接受 7. 设置测试模式如果需要 0x50 0x01 使能输出固定pattern方便FPGA端检查链路 8. 检查所有寄存器配置无误后最后写0x101 0x01使能JESD204B链路调试时强烈建议先配置固定测试pattern而不是一上来就传真实ADC数据。这样你可以先在FPGA端验证JESD204B链路是否建链、帧是否对齐。链路真正建好了再关掉测试模式、换成真实数据。4.2 FPGA端JESD204B IP核的例化和链路建立以Vivado为例打开IP Catalog搜索JESD204B选择JESD204B PHY和JESD204B IP核。配置界面里有几个容易出错的地方JESD204B IP核的线速率设置这个数值必须和你计算的电速率一致。Reference Clock要选择正确的GTX参考时钟。字节映射如果ADC端做了lane reversal比如物理布线把lane顺序调换了需要在IP核里做相应调整。例化完成后需要用状态机控制IP核的复位和初始化。通常流程是等待GTX的reset_done拉高。向JESD204B IP核写配置寄存器确定L、M、F等。拉低tx_reset和rx_reset发送sync信号。等待link_up状态拉高或者tx_link_ready/rx_link_ready。观察链路数据是否正常可以用ILA抓数据看看。这里特别提一点JESD204B链路建链不是一蹴而就的需要经历CODE GROUP SYNC、INIT LANE SYNC、FRAME SYNC等多个阶段。如果你在某个阶段卡住比如一直处于CGS阶段无法进入ILAS阶段大概率是SYSREF或者8b10b编码的问题。在ILA里观察rx_link_status或者sync信号的反饋基本能定位卡在哪个阶段。4.3 数据通路与DDC/NCO配置要点AD9694除了纯粹的采样输出内部还有DDC数字下变频和NCO数控振荡器可以在数字域把宽带信号搬到基带。这一块对于做窄带接收的朋友非常重要。DDC和NCO配置的核心寄存器包括NCO频率字和DDC滤波系数NCO频率字计算频率字 目标频率 × 2^32 / 采样率假设32位累加器。比如采样率500MSPS想搬移100MHz的信号频率字 100e6 × 2^32 / 500e6 ≈ 858993459。DDC的抽取率和滤波带宽设置AD9694提供了多种滤波档位你需要根据目标信号带宽选择合适抽取率同时注意带外抑制是否满足要求。配置DDC之前先确认JESD204B链路的M和F参数是不是需要调整。因为DDC开启后数据率会降低输出数据的结构也会变化。如果你是先配置好完整链路、再开启DDC发现数据不对是很正常的——这两个模块会改变输出引脚上的帧格式。正确做法是在设计时就想好“到底是采样后全带宽输出还是启用DDC后输出窄带信号”然后据此配置M/F参数。4.4 验证数据正确性从固定pattern到真实信号链路建好后最关键的一步是验证数据是否真的正确。我自己一般分三步走第一步用固定pattern验证。把AD9694设为输出0xAAAA或者递增pattern然后在FPGA端用ILA抓数据确认收到的数据和预期的pattern一致。这一步能确认JESD204B链路从物理层到传输层都没有问题。第二步输入一个已知信号。用信号发生器给AD9694输入一个单音正弦波幅度控制在满量程的-1dBFS左右在FPGA端采集一段时间数据做FFT分析。观察频谱图中是否只在对应频点上有一个peak杂散是否在合理范围比如优于-60dBc。如果杂散很多、甚至出现镜像先怀疑采样时钟的相位噪声其次检查输入信号是否过载或欠载。第三步测试动态范围。把信号源的输出幅度逐步减小观察底噪电平是否合理。AD9694的理论底噪大约在-68dBFS左右满量程相对底噪如果实测底噪高出很多大概率是PCB噪声或者电源纹波引入的。验证项目判断标准常见异常现象可能原因SPI读写芯片ID正确全0或全FSPI极性/速率不对接线错误链路建链link_up1一直处于CGSSYSREF没来、线速率不对固定pattern数据符合预期字节错位Transport Layer映射不对单音测试频谱干净杂散/镜像多采样时钟质量差信号过载满量程幅度-1dBFS左右输出削顶输入幅度过大或PGA增益配置错误5. 常见问题与排查技巧实录5.1 JESD204B链路无法建链怎么办这条是AD9694调试最常遇到的问题没有之一。以我经验看链路建不起来的原因按概率排序是SYSREF时序不对概率最高。线速率计算错误尤其是8b10b的系数忘了乘。ADC端和FPGA端的LMF参数不一致。GTX参考时钟没稳定。PCB走线导致信号质量太差。排查的方法不要靠猜用ILA把关键信号都抓出来确认GTX的tx/rx_reset_done已经拉高。确认JESD204B IP核的tx/rx_sysref已经收到用ILA观察sysref信号是否出现脉冲。确认你配置的线速率和GTX实际锁定的速率一致。如果这些都没问题但链路还是起不来可以试着降低线速率把采样率从500MSPS降到100MSPS按比例降低线速率看看链路是否能建起来。如果能建起来说明线路质量或GTX配置有问题需要回头检查高速线缆、背板或者GTX的预加重/均衡参数。5.2 数据出现周期性误码或者偶发错位链路建起来之后数据偶尔错位是比较恶心的问题。通常表现为数据大部分时间正确但偶尔出现一大块数据整体错位然后又恢复正常。这种问题大概率是确定性时延没有被严格保证即SYSREF相对多帧边界发生了偏移。我在调试中遇到过一次类似现象最后发现是FPGA端JESD204B IP核的SYSREF采样时钟域问题IP核的rx_sysref没有同步到设备时钟域导致偶发的亚稳态。解决方案是在FPGA逻辑里对rx_sysref做两级触发器同步然后把它和rx_device_clk的相位比对。调整之后连续运行72小时也没有再出现错位。5.3 频谱质量差、底噪过高怎么定位如果你按4.4的测试步骤输入单音信号发现频谱质量不好建议按以下顺序排查先确认信号源本身质量。把信号源直接接到频谱仪上看确认信号源输出是否干净。检查AD9694模拟输入前端的巴伦/放大器电路是否正确地做了阻抗匹配。AD9694的输入阻抗不是标准的50Ω可能需要并联电阻匹配。检查电源纹波尤其是DVDD和AVDD。检查采样时钟是否为整数周期分频关系有些时钟芯片配置乱套后会产生较大的抖动。其中电源纹波的问题最隐蔽因为很多开发板的电源纹波指标没有达到AD9694手册要求。如果项目对性能要求高建议单独用高精度LDO给模拟电源供电数字电源适当隔离。5.4 通道间串扰问题的排查AD9694是四通道器件通道间串扰在指标上会有规定。但有时候你会发现两个相邻通道的信号互相泄露。常见原因模拟前端没有分开供电或者参考地平面被分割不当。JESD204B的lane mapping把两个通道的数据对应错了这是FPGA端配置的问题不是真正的模拟串扰。输入信号通过PCB走线耦合到相邻通道的输入端。排查时先把所有通道配置成同一测试模式再看数据是否串扰。如果固定的pattern没有串扰但实际模拟信号有串扰那多半是PCB问题而不是数字配置问题。6. 写在最后调试心得与扩展建议调试AD9694这件事说难也难说简单也简单。难在它是一个交织了模拟、时钟、高速数字协议的复杂系统任何一个环节稍有偏差都可能让你的链路起不来或者性能不达标。简单在于只要把时钟和JESD204B链路这两个核心原理吃透剩下的大量工作都是在跟寄存器手册和波形图较劲。我个人非常推荐第一次调AD9694的朋友先不要一头扎进寄存器手册而是先把JESD204B协议的白皮书通读一遍特别是子类1的确定性时延机制。这个机制理解到位了很多看起来莫名其妙的现象都会迎刃而解。另外ADI的评估板软件VisualAnalog、ACE等虽然不直接对接你的FPGA工程但用它能快速确认芯片配置和预期行为可以作为很好的参照物。后面如果再扩展可以考虑给AD9694加一个多芯片同步的功能让多片ADC共享同一个SYSREF实现更大规模的多通道采集。这项技术在很多相控阵项目里是标配但调试难度会再上一个台阶核心在于SYSREF的路径延迟校准和链路延迟补偿。等你把单芯片的AD9694玩透了再挑战多芯片同步会顺手很多。调试过程中遇到问题不要急躁。AD9694这类高速数据采集系统难点不是某个单独知识点而是各个模块之间的协同。带着示波器和ILA一个阶段一个阶段地验证才能最终把性能压榨出来。