1. 为什么JESD204会成为高速数据采集的必经之路如果你做过高速ADC或者DAC的FPGA接口设计大概率绕不开JESD204这个协议。早些年大家用的是LVDS并行接口一个14位、250MSPS的ADC光是数据线就要14对差分再加上时钟、帧同步PCB走线密度直接爆炸。通道数一多板层数、等长匹配、时序收敛全都变成噩梦。JESD204的出现本质上就是来解决这个问题的——把并行总线换成高速串行链路用SerDes把数据打包成帧一根lane就能顶过去好几对LVDS。我第一次接触JESD204是在一个四通道收发项目上ADC采样率500MSPS如果走LVDSFPGA的IO根本不够用而且走线根本布不开。换成JESD204B之后每个ADC只用一对差分线四个通道加起来才四对PCB瞬间清爽了。但清爽的代价是协议复杂度上来了链路建立、码组同步、帧对齐、多通道确定性延迟每一步都有坑。JESD204协议本身分几个版本A版基本已经淘汰B版是目前工业界的主流C版在往更高速率走。B版最核心的改进是引入了SYSREF信号来实现子类1的确定性延迟这对多通道同步采集至关重要。你如果做相控阵、雷达、医疗成像这类需要多通道严格对齐的应用子类1是必须的。从协议层次看JESD204的链路建立分三个阶段码组同步、初始通道对齐、用户数据阶段。码组同步靠的是K28.5字符接收端在收到连续四个K28.5之后认为同步完成。初始通道对齐阶段会发送ILA序列里面包含了多帧对齐信息。用户数据阶段就是正常的采样数据了。整个过程听起来不复杂但实际调试的时候光是码组同步就可能卡你半天。注意JESD204B的链路参数L、M、F、K、S等必须和ADC端的配置完全一致任何一个参数对不上链路都建不起来。这些参数通常在ADC的寄存器配置里设定FPGA侧的IP核也要同步配置。2. Xilinx JESD204 IP核的配置逻辑与参数推导Xilinx的JESD204 IP核分两个部分物理层用的是JESD204 PHY协议层用的是JESD204 core。PHY层实际上就是GTX/GTH/GTY收发器加一些胶合逻辑协议层负责链路建立和数据处理。很多人第一次用的时候会搞混这两个IP的关系其实你可以这么理解PHY是高速公路Core是交通规则两者配合才能跑起来。配置IP核的第一步是确定链路参数。这些参数不是随便填的它们之间有严格的数学关系。以我做过的一个项目为例ADC是双通道、14位、500MSPSJESD204B子类1L2两条laneM2两个转换器F2每帧2个字节K32每多帧32帧。这些参数怎么来的首先M就是ADC的通道数L取决于你愿意用几条lane来传F和K则和采样率、线速率有关。线速率的计算公式是这样的Lane Rate (M × S × N × 10/8 × FC) / L。其中S是每帧每转换器的采样数通常取1N是打包后的位数14位数据通常打包成16位FC是帧时钟频率。代入数值M2S1N16FC500MHz/3215.625MHzL2。算下来Lane Rate (2×1×16×1.25×15.625M)/2 312.5Mbps。但实际上GTX的线速率不能这么低通常要跑到Gbps级别所以实际项目中我会把FC设高一些或者调整K值。这里有个经验Xilinx的JESD204 IP核在Vivado里的配置界面会实时校验参数合法性如果参数组合不合法它会直接报错。我建议你先在IP核的配置界面里试参数确认没有红色报错之后再生成。另外IP核的时钟架构也要注意core_clk和glbl_clk的关系要搞清楚core_clk通常是线速率除以40glbl_clk是core_clk除以40。配置完IP核之后Vivado会生成一个example design这个example design非常重要它包含了完整的收发回环逻辑。我强烈建议你先跑通example design的仿真确认链路能建立起来再往自己的工程里集成。很多人跳过这一步直接集成结果出了问题根本不知道是IP核配置的问题还是自己逻辑的问题。2.1 共享逻辑与时钟方案的选择JESD204 IP核有一个“共享逻辑”的概念指的是多个JESD204 core可以共享同一个PHY和时钟资源。如果你的系统里有多个ADC或者多个JESD204链路共享逻辑能省不少GT资源。但共享逻辑的配置有个坑共享逻辑的时钟必须由其中一个core来提供这个core叫master其他的叫slave。Master的时钟方案如果配错了整个共享逻辑都不工作。我在一个八通道项目里用过共享逻辑四个JESD204 core共享一个PHY。当时遇到的问题是slave core的链路总是建不起来查了很久才发现是master core的时钟没有正确输出到slave。Vivado里共享逻辑的时钟连接是自动的但前提是你的master core配置正确。后来我的做法是先单独配置一个core确认它能正常工作再把它设为master添加slave core。时钟方案上JESD204B子类1需要SYSREF信号。SYSREF的时序非常关键它必须在core_clk的上升沿之前稳定建立时间不够就会导致确定性延迟不确定。Xilinx的IP核里有一个SYSREF捕获逻辑它会用core_clk去采样SYSREF所以SYSREF和core_clk的相位关系要调好。我通常会用MMCM把SYSREF和core_clk对齐确保捕获稳定。2.2 参数不匹配时的典型报错与排查参数不匹配是JESD204调试中最常见的问题。症状通常是链路能到码组同步阶段但进不了用户数据阶段或者干脆连码组同步都完不成。Xilinx的IP核提供了AXI-Lite寄存器接口你可以通过读取状态寄存器来判断链路卡在哪一步。我整理了一个排查表基本上覆盖了80%的参数不匹配问题症状可能原因排查方法码组同步失败K28.5字符不匹配检查ADC的K码配置和IP核是否一致码组同步成功但ILA失败F或K参数不匹配核对ADC寄存器里的F、K值与IP核配置ILA成功但数据错乱M或L参数不匹配检查通道映射关系确认M和L对应链路间歇性断开SYSREF时序问题用示波器测SYSREF和core_clk的相位数据有规律性错误字节序或位序问题检查ADC的输出格式和IP核的字节序设置这个表是我踩了无数次坑之后总结出来的基本上照着查能省很多时间。特别是最后一条字节序问题非常隐蔽数据看起来是对的但就是数值不对查半天才发现是高低字节反了。3. MicroBlaze嵌入式初始化让配置不再依赖外部主机JESD204链路建立之前ADC需要先配置一堆寄存器包括链路参数、时钟设置、增益校准等等。传统做法是用外部MCU或者PC通过SPI/I2C来配置但在很多嵌入式场景里你希望FPGA自己就能完成初始化不需要外部主机干预。这时候MicroBlaze就派上用场了。MicroBlaze是Xilinx的软核处理器你可以把它理解成一个用FPGA逻辑资源搭出来的CPU。它的优势是灵活——你需要什么外设就加什么外设不需要的可以全部砍掉。在JESD204项目里我通常会用MicroBlaze来做三件事配置ADC寄存器、配置JESD204 IP核、监控链路状态。用MicroBlaze做初始化的好处是显而易见的。首先整个系统上电之后可以自启动不需要外部主机发指令。其次MicroBlaze可以通过AXI-Lite总线直接访问JESD204 IP核的寄存器读取链路状态非常方便。第三如果链路断了MicroBlaze可以自动重新初始化提高系统的鲁棒性。但MicroBlaze也有代价它会消耗FPGA的逻辑资源和BRAM。一个最小配置的MicroBlaze大概占1000个LUT和几个BRAM对于资源紧张的项目需要权衡。我的经验是如果FPGA资源利用率在70%以下加一个MicroBlaze问题不大如果已经超过80%就要慎重考虑了。3.1 MicroBlaze最小系统的搭建步骤搭建MicroBlaze最小系统其实不复杂Vivado的Block Design里直接加MicroBlaze IP然后运行自动连接向导它会帮你把时钟、复位、调试接口都连好。但有几个地方需要手动调整。第一步是配置MicroBlaze本身。在IP配置界面里我通常会关掉不需要的功能比如浮点单元、指令缓存、数据缓存这些都会消耗额外资源。调试接口选AXI Debug或者JTAG Debug取决于你的调试方式。中断控制器如果不用可以关掉但JESD204项目里我建议保留因为链路状态变化可以通过中断来通知。第二步是添加外设。最基本的是AXI GPIO、AXI UART、AXI Timer。AXI GPIO用来控制ADC的复位和使能信号AXI UART用来打印调试信息AXI Timer用来做延时和超时判断。如果ADC是SPI接口还需要加AXI SPI。这些外设在Block Design里直接添加然后运行自动连接。第三步是地址分配。Vivado会自动分配地址但你要检查一下JESD204 IP核的AXI-Lite接口地址是否在MicroBlaze的地址空间内。如果不在需要手动调整。地址分配好之后生成Block Design然后创建HDL Wrapper。第四步是写软件。Vivado的SDK或者Vitis里创建一个新的Application Project选择Hello World模板然后改成你自己的初始化代码。初始化代码的结构通常是先初始化UART和GPIO然后配置ADC寄存器接着配置JESD204 IP核最后启动链路并轮询状态。3.2 ADC寄存器配置的时序陷阱ADC的寄存器配置看起来简单就是通过SPI写几个值但实际做的时候有几个时序陷阱。第一个陷阱是上电时序ADC上电之后需要等待一段时间才能配置这个时间在数据手册里叫Power-Up Time通常是几毫秒到几十毫秒。如果你上电就立刻配置ADC可能还没准备好配置会失败。第二个陷阱是SPI时钟频率。ADC的SPI接口通常支持的最高时钟频率是有限制的比如10MHz或者20MHz。如果你把SPI时钟设得太高配置数据会出错。我一般会先用一个较低的时钟频率比如1MHz来配置确认配置成功后再提高频率。第三个陷阱是寄存器写入顺序。有些ADC的寄存器有依赖关系比如必须先配置时钟相关寄存器再配置链路相关寄存器。如果你顺序搞反了链路参数可能不生效。这个在数据手册里通常有说明但很容易被忽略。第四个陷阱是配置完成后的等待时间。ADC配置完成之后需要等待内部PLL锁定这个时间可能长达几百毫秒。如果你配置完就立刻启动JESD204链路链路会建不起来。我的做法是在配置完成后加一个延时或者轮询ADC的状态寄存器确认PLL锁定后再启动链路。提示ADC的配置寄存器值通常由厂商提供的配置工具生成比如ADI的ACE软件或者TI的配置工具。这些工具会生成一个寄存器序列你直接把这个序列移植到MicroBlaze代码里就行。但要注意工具生成的序列可能包含一些不需要的寄存器你可以根据数据手册精简。3.3 用MicroBlaze监控JESD204链路状态JESD204 IP核提供了一组状态寄存器包括码组同步状态、ILA状态、链路错误计数等等。MicroBlaze可以通过AXI-Lite总线周期性地读取这些寄存器判断链路是否正常。我通常会在MicroBlaze里实现一个状态机分几个状态初始化、配置ADC、配置JESD204、等待链路建立、正常运行、错误处理。在正常运行状态下MicroBlaze每隔一段时间读一次链路状态寄存器如果发现错误计数增加或者链路断开就进入错误处理状态重新初始化。错误处理策略取决于具体应用。如果是偶尔的链路错误可以只记录错误计数不重新初始化。如果是链路完全断开就需要重新初始化。重新初始化的过程就是回到配置ADC的状态重新走一遍流程。这里要注意重新初始化之前要先复位JESD204 IP核和ADC确保状态干净。还有一个实用技巧用MicroBlaze的UART打印链路状态信息。调试阶段这个非常有用你可以实时看到链路建立到了哪一步错误计数是多少。正式产品里可以把UART打印关掉节省资源。4. 从仿真到上板的完整调试链路JESD204项目的调试链路比较长从仿真到上板每一步都可能出问题。我一般会分四步走IP核example design仿真、自己工程的仿真、上板回环测试、上板接ADC测试。每一步都有明确的验证目标不要跳步。第一步IP核example design仿真。Vivado生成JESD204 IP核的时候会同时生成一个example design这个example design包含了完整的收发回环逻辑。你直接跑仿真应该能看到链路建立起来数据从发送端传到接收端。如果example design的仿真都跑不通那说明IP核配置有问题先解决配置问题。第二步自己工程的仿真。把IP核集成到自己的工程里写一个简单的测试激励模拟ADC的数据发送。这一步主要验证你的逻辑和IP核的接口是否正确。我通常会用一个简单的计数器作为测试数据通过JESD204发送出去然后在接收端检查数据是否正确。第三步上板回环测试。把FPGA的GT收发器配置成回环模式自己发自己收。这一步验证的是硬件链路包括GT的参考时钟、电源、PCB走线。回环测试通过之后说明硬件没问题可以接ADC了。第四步上板接ADC测试。这是最后一步也是最容易出问题的一步。ADC的配置、SYSREF时序、链路参数匹配任何一个环节出错都会导致链路建不起来。我的建议是先用一个简单的配置比如低采样率、单通道跑通再逐步提高复杂度。4.1 回环测试中GT复位序列的处理GT收发器的复位序列是回环测试中最容易出问题的地方。Xilinx的GT有两种复位GT复位和IP核复位。GT复位是硬复位会复位整个GT通道IP核复位是软复位只复位IP核的逻辑部分。两者的顺序和时序都有要求。正确的复位顺序是先复位GT等GT复位完成后再复位IP核。GT复位完成有一个信号叫gt_powergood这个信号拉高之后才能进行后续操作。如果你在gt_powergood拉高之前就复位IP核IP核会进入异常状态。GT的复位时间比较长通常是几百个时钟周期。我一般会在MicroBlaze里加一个延时或者用状态机等待gt_powergood信号。另外GT的参考时钟必须在复位之前就稳定如果参考时钟不稳定GT复位会失败。还有一个坑是GT的DRP时钟。有些配置下GT需要DRP时钟才能完成复位如果DRP时钟没有接或者频率不对GT复位会卡住。这个在Xilinx的文档里有说明但很容易被忽略。4.2 SYSREF捕获的实测波形分析SYSREF是JESD204B子类1实现确定性延迟的关键信号。它的时序要求非常严格SYSREF必须在core_clk的上升沿之前稳定一段时间建立时间并且在上升沿之后保持一段时间保持时间。如果建立时间或保持时间不够SYSREF捕获会失败确定性延迟就不确定了。我实测过SYSREF的波形用示波器同时抓SYSREF和core_clk。理想情况下SYSREF的跳变沿应该在core_clk的低电平期间这样建立时间和保持时间都足够。但实际上由于PCB走线延迟和时钟树延迟SYSREF和core_clk的相位关系可能不理想。调整的方法是用MMCM或者PLL来调整core_clk的相位或者调整SYSREF的输出延迟。Xilinx的IP核里有一个SYSREF延迟调整寄存器你可以通过AXI-Lite接口来调整。我一般会从中间值开始调然后往两边扫找到最稳定的相位点。还有一个经验SYSREF的频率通常是帧时钟频率的整数分之一比如FC/4或者FC/8。SYSREF的频率不能太高否则捕获逻辑可能跟不上。另外SYSREF的抖动要小如果SYSREF抖动太大捕获也会不稳定。4.3 链路间歇性断开的排查思路链路间歇性断开是最难排查的问题之一因为它不是每次都出现可能跑几个小时才断一次。我遇到过几次这种情况总结下来大概有几个原因。第一个原因是电源噪声。GT收发器对电源噪声非常敏感如果电源纹波太大GT的误码率会升高导致链路断开。排查方法是测GT电源的纹波如果超过规格需要加滤波电容或者换电源方案。第二个原因是参考时钟抖动。GT的参考时钟抖动如果太大链路裕量会降低在温度变化或者电压波动的时候就容易断。排查方法是用相位噪声分析仪测参考时钟的相位噪声确认在规格范围内。第三个原因是SYSREF时序裕量不足。如果SYSREF的建立时间或保持时间刚好在临界值温度变化或者电压波动就会导致捕获失败。排查方法是测SYSREF和core_clk的时序裕量如果裕量小于100ps就需要调整相位。第四个原因是GT的均衡设置不合适。GT的接收端有均衡器如果均衡设置和信道的频率响应不匹配误码率会偏高。排查方法是用IBERT工具扫描信道的眼图根据眼图调整均衡设置。5. 资源优化与工程化落地的几个关键决策JESD204项目从原型到产品中间还有一段路要走。原型阶段可以怎么方便怎么来但产品阶段要考虑资源、功耗、可靠性。我分享几个我在工程化落地时做的关键决策。第一个决策是MicroBlaze的取舍。原型阶段我用MicroBlaze做初始化方便调试。但产品阶段如果FPGA资源紧张我会把MicroBlaze去掉用一个简单的状态机来代替。状态机实现初始化流程虽然灵活性差一些但资源消耗小很多。具体怎么选取决于你的资源余量和功能需求。第二个决策是JESD204 IP核的共享逻辑。如果系统里有多个JESD204链路共享逻辑能省GT资源但会增加时钟方案的复杂度。我的经验是如果链路数量超过两个用共享逻辑如果只有一两个单独配置更简单。第三个决策是错误处理策略。原型阶段链路断了就断了重新上电就行。产品阶段需要自动恢复所以MicroBlaze或者状态机里要有错误检测和恢复逻辑。恢复策略要平衡恢复速度和误触发太敏感会导致频繁重初始化太迟钝会导致链路断了很久才发现。第四个决策是调试接口的保留。产品阶段通常会把调试接口关掉节省资源。但我建议至少保留一个UART或者LED指示用于现场排查问题。完全关掉调试接口出了问题就只能返厂成本很高。5.1 资源占用实测数据与优化方向我实测过一个双通道JESD204B子类1的工程FPGA是Kintex-7系列资源占用大概是这样JESD204 PHY占4个GT通道和大约2000个LUTJESD204 Core占大约3000个LUT和几个BRAMMicroBlaze最小系统占大约1500个LUT和4个BRAM。加起来大概6500个LUT对于Kintex-7来说不算多。如果要优化资源有几个方向。第一关掉IP核里不需要的功能比如错误注入、调试计数器。第二MicroBlaze换成状态机省1500个LUT。第三共享逻辑多个链路共享PHY。第四降低数据位宽如果不需要全精度可以截位。功耗方面GT收发器的功耗占大头。一个GT通道在3.125Gbps下的功耗大概是100mW左右四个通道就是400mW。如果降低线速率功耗会相应降低。另外GT的均衡器和预加重如果不需要可以关掉也能省一些功耗。5.2 多通道确定性延迟的验证方法多通道确定性延迟是JESD204B子类1的核心价值验证方法是在多个通道上同时发送相同的测试数据然后在接收端比较各通道数据的到达时间。如果确定性延迟正确各通道的数据应该在同一时刻到达。验证的时候要注意几点。第一测试数据要有明显的特征比如用递增的计数器或者伪随机序列方便识别。第二SYSREF必须正确捕获否则确定性延迟不成立。第三各通道的GT复位必须同步如果复位不同步延迟也会不一致。我通常会用ChipScope或者ILA来抓多通道的数据比较各通道的到达时间。如果发现延迟不一致先检查SYSREF捕获状态再检查GT复位是否同步最后检查各通道的链路参数是否一致。5.3 从原型到产品的 checklist最后分享一个我从原型到产品用的checklist覆盖了JESD204项目的主要检查点链路参数核对L、M、F、K、S、N与ADC配置一致SYSREF时序建立时间和保持时间裕量大于100psGT复位序列GT复位在IP核复位之前完成参考时钟频率、抖动在规格范围内电源GT电源纹波小于规格值错误处理链路断开后能自动恢复调试接口至少保留UART或LED指示资源余量LUT利用率低于80%BRAM利用率低于80%温度测试高低温下链路稳定长时间测试连续跑24小时无链路断开这个checklist是我踩了无数坑之后总结出来的每次新项目我都会过一遍。特别是SYSREF时序和GT复位序列这两项出问题的概率最高。注意JESD204的调试工具链比较长Vivado的ILA、IBERT、SDK/Vitis的调试器都要熟练使用。建议在项目初期就搭好调试环境不要等到出了问题再搭那样会浪费很多时间。我在实际项目中的体会是JESD204的难点不在协议本身而在细节。协议文档看一遍就能理解大概但真正调通链路需要把每一个细节都抠到位。SYSREF的相位、GT的复位、ADC的配置时序任何一个细节出问题链路都建不起来。所以我的建议是不要急于上板先在仿真里把链路跑通再上板回环最后接ADC。每一步都确认无误再走下一步这样反而最快。