FPGA与AD9174的JESD204B链路调试实战:从IP核配置到多lane同步 1. 项目缘起与整体设计思路1.1 为什么选JESD204B这条链路做高速数据采集或者信号发射的朋友大概率都绕不开一个组合FPGA加高速DAC或者ADC。早些年大家用的是LVDS并行接口走线多、速率上不去、同步也麻烦。后来JESD204B协议慢慢成了主流它把数据线从十几根甚至几十根压缩到一对或者几对SerDes差分线速率直接拉到几个Gbps甚至更高布线压力小了很多同步机制也更清晰。我这次要搞的是FPGA和AD9174之间的通信。AD9174是ADI的一款双通道16位DAC采样率能到12GSPS支持JESD204B子类1。FPGA这边用的是Xilinx的器件开发工具是Vivado。整个链路的核心就是FPGA通过JESD204B IP核把数据打包成帧经过GT高速收发器发出去AD9174收到后解帧、还原成模拟信号。反过来AD9174的同步信号和时钟也要正确反馈给FPGA保证链路能建立起来。这个项目适合谁看如果你已经做过基本的FPGA开发用过Vivado对时钟、复位这些概念不陌生但第一次接触JESD204B或者之前配过但没调通那这篇内容应该能帮到你。我会从IP核的配置参数怎么算、怎么填讲到链路调试时常见的坑尽量把每个选择的理由说清楚。1.2 整体方案选型与链路架构先说一下整体架构。FPGA内部的数据流是这样的用户逻辑产生并行数据比如16位宽、采样率几百兆送到JESD204B IP核的发送接口。IP核按照配置好的帧格式把数据映射到多个lane上然后通过GT收发器串行发出去。AD9174那边接收到串行数据后按照同样的帧格式解帧恢复出并行数据再送到DAC核心。时钟方面AD9174需要一个器件时钟通常是DAC采样率除以某个整数。这个时钟可以由外部时钟芯片提供也可以由FPGA的GT收发器输出。我这次用的是外部时钟芯片给AD9174提供参考时钟同时给FPGA的GT提供参考时钟。SYSREF信号很关键它是子类1实现确定性延迟的基础必须保证在器件时钟的上升沿采样到而且所有lane的SYSREF对齐。为什么选子类1而不是子类0子类0不需要SYSREF但链路延迟不确定每次上电可能都不一样。子类1用SYSREF来对齐所有lane的本地多帧时钟实现确定性延迟。对于多通道同步或者需要精确时间对齐的应用子类1是必须的。AD9174支持子类1所以没理由不用。注意SYSREF的时序要求非常严格它必须满足相对于器件时钟的建立保持时间。如果时序不满足链路可能偶尔能建立但会随机失锁。这个后面会详细说。2. JESD204B IP核配置参数详解2.1 关键参数的计算与选择打开Vivado的IP Catalog找到JESD204B IP核双击进去。第一页是“Configuration”里面有一堆参数要填。这些参数不是随便选的它们之间有关联填错了链路肯定通不了。我一个个说。Lanes就是SerDes通道数。AD9174有两个DAC通道每个通道可以配置成不同的模式。我这次用的是双通道模式每个通道用2个lane总共4个lane。为什么不用1个lane因为采样率太高单lane的线速率会超过GT的极限。4个lane可以把数据分摊开线速率降下来。Line Rate线速率单位Gbps。这个要根据采样率、通道数、位宽、编码方式反推。JESD204B用的是8B/10B编码所以有效数据速率是线速率的80%。公式是线速率 采样率 × 位宽 × 通道数 × 过采样因子 / lane数 / 0.8。我这次采样率是6GSPS位宽16双通道过采样因子1lane数4。算一下6G × 16 × 2 × 1 / 4 / 0.8 60Gbps不对单位搞错了。采样率是6GSPS每个采样16位双通道就是2个通道所以总数据率是6G × 16 × 2 192Gbps。分到4个lane每个lane 48Gbps再除以0.8线速率是60Gbps。这显然不对GT收发器跑不了这么高。我重新算一下。AD9174的采样率是12GSPS但那是DAC核心的采样率。JESD204B的线速率跟DAC采样率不是直接相等的。实际上AD9174内部有插值滤波器JESD204B接口的数据率是DAC采样率除以插值倍数。比如我设置插值倍数为8那么JESD204B接口的采样率就是12G / 8 1.5GSPS。每个采样16位双通道总数据率是1.5G × 16 × 2 48Gbps。分到4个lane每个lane 12Gbps再除以0.8线速率是15Gbps。这个GT能跑。所以参数要这样填采样率填1.5G位宽16通道数2lane数4过采样因子1。线速率算出来是15Gbps。Vivado的IP核会自动算你填了前面的它会把线速率显示出来。如果显示的不是你想要的就回去改前面的参数。Reference ClockGT的参考时钟我用的150MHz。这个频率要跟你的板子上的时钟芯片匹配。线速率15Gbps参考时钟150MHz那么GT的PLL倍频系数就是15G / 0.15G 100。这个倍频系数要在GT的配置里设置JESD204B IP核会自动处理。Frames每帧的字节数。JESD204B的帧结构是每帧有F个字节其中K个帧组成一个多帧。F和K的选择跟链路延迟和缓冲有关。我一般用F2K32。为什么F2表示每帧2个字节这样每个lane每帧传2个字节4个lane就是8个字节。每个采样16位也就是2个字节所以每帧正好传4个采样。K32表示32帧一个多帧多帧长度是64个字节。这个长度要跟AD9174的配置匹配AD9174的寄存器里要设置同样的F和K。Subclass选1。前面说了子类1支持确定性延迟。Scrambler扰码一般开。扰码可以让数据频谱更随机减少EMI。AD9174也支持解扰所以两边都开就行。CS控制字符数一般填0。除非你有特殊需求否则不用改。填完这些IP核会显示一个“JESD204B Link Parameters”的总结包括线速率、帧时钟、多帧时钟等。你要把这些参数记下来后面配置AD9174的寄存器要用。2.2 时钟方案与SYSREF的处理时钟是JESD204B链路能不能通的关键。我这次用了三路时钟GT参考时钟150MHz、器件时钟DAC采样时钟给AD9174、SYSREF。GT参考时钟直接给FPGA的GT bank器件时钟和SYSREF由外部时钟芯片产生。器件时钟的频率是DAC采样率我这里是12GHz不对AD9174的DAC采样率是12GSPS但器件时钟不是12GHz。AD9174内部有PLL器件时钟可以是采样率除以某个整数。我用的器件时钟是3GHzAD9174内部再倍频到12GHz。3GHz的时钟走PCB的时候要注意尽量短、阻抗匹配否则信号质量会很差。SYSREF的频率是器件时钟除以某个整数一般是多帧时钟的整数倍。我设置SYSREF频率为3GHz / 32 93.75MHz。SYSREF的时序要求很严它必须在器件时钟的上升沿之前稳定一段时间建立时间并且在上升沿之后保持一段时间保持时间。具体数值看AD9174的数据手册一般是几百皮秒。如果时序不满足链路会随机失锁。实操心得SYSREF的走线要跟器件时钟等长最好在同一层参考同一地平面。如果板子已经做好了发现SYSREF时序不对可以尝试调整时钟芯片的相位或者用FPGA内部的延迟单元来微调。但最好还是在设计阶段就保证。FPGA这边JESD204B IP核需要几个时钟core clock、gt clock、sysref。core clock是IP核内部逻辑的时钟一般是线速率除以40再除以某个数。我这次core clock是150MHz。gt clock是GT收发器的时钟就是参考时钟150MHz。sysref就是外部进来的SYSREF频率93.75MHz。在Vivado的IP核配置里有一个“Clock”页面要填这些时钟的频率。填错了IP核会报错或者生成的逻辑跑不起来。我一般会先用一个时钟向导生成这些时钟然后连到IP核上。2.3 IP核接口与用户逻辑的对接JESD204B IP核的发送接口是AXI4-Stream数据位宽是32位或者64位取决于配置。我这次是4个lane每个lane每帧2个字节所以每个帧时钟周期有8个字节也就是64位。IP核的发送接口位宽就是64位。用户逻辑要把数据按照帧格式排列好送到IP核的s_axis_tx接口。数据排列的顺序是先送lane0的字节0再送lane0的字节1然后lane1的字节0lane1的字节1以此类推。每个采样16位所以要拆成两个字节低字节在前还是高字节在前要看AD9174的配置。AD9174默认是低字节在前所以要先送低字节。IP核还有一个“tx_sysref”输入用来对齐多帧时钟。这个信号就是外部SYSREF经过FPGA的IBUFDS和BUFG后的信号。注意SYSREF要跟core clock同步否则IP核内部会亚稳态。我一般会在IP核外面加一个同步器用core clock采样SYSREF然后送到IP核。IP核的“tx_reset”是复位信号高有效。复位的时候IP核会重新初始化链路。一般上电后先复位一次然后等链路建立。链路建立的状态可以通过“tx_sync”信号观察当tx_sync从低变高说明AD9174已经同步上了。3. 实操过程与核心环节实现3.1 Vivado工程搭建与IP核例化先新建一个Vivado工程选好器件型号。我用的器件是xcvu9p属于UltraScale系列。然后添加JESD204B IP核按照前面的参数配置好。IP核会生成一个示例工程里面包含了GT的例化、时钟模块、复位模块等。我一般会参考示例工程但不会直接用因为示例工程里的用户逻辑很简单只是个计数器。例化IP核的时候要注意GT的参考时钟要连接到正确的bank。UltraScale的GT bank有专门的参考时钟引脚不能随便连。我这次用的是bank 224参考时钟从外部时钟芯片进来经过IBUFDS后送到GT的refclk引脚。IP核的复位逻辑要仔细处理。JESD204B IP核有两个复位一个是GT的复位一个是IP核本身的复位。GT的复位要等参考时钟稳定后再释放IP核的复位要等GT的复位释放后再释放。我一般用一个状态机来控制复位顺序先等参考时钟稳定用计数器数一段时间然后释放GT复位再等GT的txresetdone信号变高然后释放IP核复位。注意GT的复位时间比较长一般要等几百个时钟周期。如果复位释放太快GT可能还没初始化完链路就起不来。3.2 AD9174寄存器配置与链路建立AD9174的配置是通过SPI接口进行的。FPGA要通过SPI写AD9174的寄存器设置JESD204B的参数、插值倍数、通道模式等。SPI的时序比较简单但要注意AD9174的SPI是4线模式还是3线模式我这次用的是4线模式有单独的SDIO和SDO。配置的顺序一般是先复位AD9174然后配置时钟和PLL再配置JESD204B的参数最后使能链路。JESD204B的参数包括Llane数、F每帧字节数、K每多帧帧数、M通道数、S每帧采样数、N位宽、N调整后的位宽、CS、CF等。这些参数必须跟FPGA的IP核配置完全一致否则链路建立不起来。我写了一个SPI配置模块把AD9174的寄存器配置写成一个ROM上电后依次读出并写入。配置完成后拉高AD9174的“link enable”位然后观察FPGA的tx_sync信号。如果tx_sync变高说明链路建立成功。如果一直不变高就要检查参数是否匹配、时钟是否正常、SYSREF是否满足时序。3.3 链路调试与信号观测链路调试的时候Vivado的ILA集成逻辑分析仪是必不可少的。我会在IP核的tx_sync、tx_reset、tx_sysref等信号上挂ILA观察链路建立的过程。如果tx_sync一直不变高先看tx_reset是否已经释放再看tx_sysref是否有脉冲。如果tx_sysref没有脉冲说明外部时钟芯片没配置好或者SYSREF的走线有问题。如果tx_sync有脉冲但很快又变低说明链路建立了但又失锁。这种情况一般是SYSREF的时序不满足或者GT的均衡参数不对。可以尝试调整GT的预加重和均衡或者调整SYSREF的相位。还有一个常见问题是GT的线速率不对。如果线速率跟AD9174的期望值不匹配链路根本建立不起来。可以用Vivado的“GT Wizard”来单独测试GT看能不能正常收发数据。如果GT本身有问题先解决GT再搞JESD204B。实操心得调试的时候先用一个简单的测试模式比如PRBS来验证GT链路。GT通了再搞JESD204B。如果GT都不通JESD204B肯定通不了。4. 常见问题与排查技巧实录4.1 链路建立失败的原因分析链路建立失败是最常见的问题。我整理了一个排查表按优先级排序问题现象可能原因排查方法tx_sync一直为低参数不匹配检查FPGA和AD9174的L、F、K、M、S、N是否一致tx_sync一直为低时钟不正常用示波器测GT参考时钟、器件时钟、SYSREF的频率和幅度tx_sync一直为低SYSREF时序不满足用示波器测SYSREF和器件时钟的相位关系tx_sync有脉冲但很快变低SYSREF抖动大检查SYSREF的走线和端接tx_sync有脉冲但很快变低GT均衡参数不对调整GT的预加重和均衡tx_sync有脉冲但很快变低电源噪声大检查GT bank的电源滤波参数不匹配是最容易犯的错误。我刚开始搞的时候FPGA的F填了2AD9174的F填了1结果链路死活起不来。后来用ILA抓了JESD204B的同步头发现帧长度不对才找到问题。所以配置参数的时候一定要两边对着填填完再检查一遍。4.2 SYSREF时序问题的独家避坑技巧SYSREF的时序问题很隐蔽因为链路有时候能建立但跑一段时间就失锁。我踩过几次坑之后总结了一个方法用示波器的高带宽探头同时测器件时钟和SYSREF看SYSREF的跳变沿是否在器件时钟的上升沿之前稳定。如果SYSREF的跳变沿离器件时钟的上升沿太近就要调整SYSREF的相位。调整相位的方法有两种一是改时钟芯片的配置让SYSREF的相位提前或者延后二是在FPGA内部用IDELAY或者ODELAY来微调。我一般先用时钟芯片调如果调不出来再用FPGA的延迟单元。但FPGA的延迟单元精度有限而且受温度影响所以最好还是在时钟芯片上解决。还有一个技巧SYSREF可以是周期性的也可以是脉冲式的。周期性SYSREF对时序要求更宽松因为它每个多帧周期都有链路可以多次尝试对齐。脉冲式SYSREF只在初始化时发一次如果那次时序不对链路就起不来。我一般用周期性SYSREF虽然功耗稍微大一点但可靠性高很多。4.3 GT收发器调试的注意事项GT收发器是JESD204B的物理层GT不通什么都白搭。GT调试的时候要注意几点第一参考时钟的质量。GT的参考时钟抖动要小一般要求小于1ps RMS。如果参考时钟抖动大GT的误码率会很高链路会频繁失锁。我一般会用专用的时钟芯片比如LMK04828它的抖动很小。第二GT的电源。GT bank的电源要干净纹波要小。我一般会在GT bank的电源引脚旁边放很多去耦电容而且用LDO而不是DC-DC。DC-DC的开关噪声会耦合到GT里导致误码。第三GT的均衡。线速率高的时候PCB走线的损耗会很大GT需要做均衡。我一般先用Vivado的IBERT工具扫一下眼图看眼张开度。如果眼图不好就调整GT的预加重和均衡参数。预加重是发送端补偿均衡是接收端补偿两个要配合调。注意GT的均衡参数不是越大越好。预加重太大会导致过冲均衡太大会放大噪声。一般调到眼图张开度最大就行。4.4 多lane同步的难点与解决方案多lane同步是JESD204B的另一个难点。4个lane的数据要同时到达AD9174而且顺序不能乱。如果某个lane的延迟跟其他lane不一样AD9174解帧的时候就会出错。解决多lane同步的关键是SYSREF。SYSREF要同时到达所有lane的GT而且要在同一个器件时钟周期内被采样到。如果SYSREF到不同lane的走线长度不一样延迟就不一样同步就会失败。所以PCB设计的时候SYSREF到所有GT的走线要等长误差控制在几个mil以内。如果板子已经做好了发现多lane同步有问题可以尝试在FPGA内部对每个lane的SYSREF单独做延迟调整。JESD204B IP核支持每个lane独立的SYSREF延迟可以在IP核的配置里设置。但这个方法比较麻烦最好还是在PCB设计阶段就保证等长。5. 链路优化与性能验证5.1 确定性延迟的测量与验证子类1的确定性延迟是指从SYSREF采样到数据出现在DAC输出之间的延迟是固定的每次上电都一样。这个特性对于多通道同步或者相控阵应用很重要。验证确定性延迟的方法是多次上电用示波器测DAC输出的脉冲相对于SYSREF的延迟看每次是否一样。我测的时候让FPGA发送一个已知的脉冲图案AD9174输出模拟脉冲然后用示波器同时抓SYSREF和模拟脉冲。如果每次上电的延迟偏差在几个采样周期以内说明确定性延迟实现了。如果偏差很大说明SYSREF的时序或者多lane同步有问题。实操心得测确定性延迟的时候要把示波器的触发设在SYSREF上然后看模拟脉冲的位置。如果模拟脉冲的位置每次都不一样先检查SYSREF的时序再检查多lane同步。5.2 误码率测试与眼图分析误码率是衡量链路质量的重要指标。我一般用PRBS31或者PRBS15图案来测误码率。FPGA的GT可以内置PRBS生成器和检查器AD9174也支持PRBS测试模式。两边都设成PRBS模式然后跑一段时间看误码计数器。如果误码率很高先看眼图。Vivado的IBERT工具可以扫眼图眼张开度越大越好。如果眼图闭合说明GT的均衡参数不对或者PCB走线损耗太大。可以尝试调整预加重和均衡或者降低线速率。我这次线速率是15Gbps眼图张开度大概在0.6UI左右误码率在1e-12以下满足要求。如果眼图张开度小于0.3UI链路会很不稳定建议降低线速率或者换更好的板材。5.3 温度与电压变化下的链路稳定性链路在常温下能通不代表在高温或者低压下也能通。我一般会在高低温箱里测一下看链路是否稳定。温度变化会影响GT的偏置点和SYSREF的延迟如果链路在高温下失锁说明裕量不够。电压变化也会影响链路。GT的电源电压如果偏低GT的驱动能力会下降眼图会变差。我一般会在电源电压的±5%范围内测一下看链路是否还能建立。如果不行就要优化电源设计。注意JESD204B链路对温度和电压的敏感度比LVDS高很多。设计的时候要留足够的裕量不要卡着极限做。6. 项目复盘与个人经验分享这个项目从开始到调通大概花了三周时间。其中大部分时间花在SYSREF的时序调整和多lane同步上。我踩过的坑包括参数填错、SYSREF走线不等长、GT均衡参数不对、电源噪声大。每个坑都让我重新审视设计也让我对JESD204B的理解更深了一层。如果让我重新做一遍我会在PCB设计阶段就特别注意SYSREF的走线保证等长和阻抗匹配。我也会在FPGA内部预留SYSREF的延迟调整接口方便后期调试。另外我会先用IBERT把GT调通再搞JESD204B这样问题定位会快很多。最后分享一个小技巧JESD204B IP核的示例工程里有一个“link status”寄存器可以读出链路的状态包括同步状态、误码状态等。我一般会把这个寄存器接到ILA上实时监控链路状态。如果链路出问题看这个寄存器就能快速定位。这个项目后续还可以扩展比如增加更多lane来提高吞吐量或者用子类2来实现更精确的同步。子类2用SYNC信号来对齐不需要SYSREF但时序要求更严。如果大家有兴趣我可以再写一篇关于子类2的调试经验。