搞GSPS数据转换器(高速ADC/DAC)的板卡,十有八九都被JESD204B接口坑过。而掉进这个坑里出不来的人,最后十有八九会发现,问题的根子不在FPGA逻辑,而在那颗1.25-GSPS的JESD204B设备时钟上。我自己的第一块2.5GSPS采集板就是活生生的例子:逻辑翻来覆去查了三天,IP配置对着参考手册一行行对,最后用示波器戳时钟输出端才发现,1.25GHz时钟的上升沿已经糊成了一团,整个链路的误码率能好才怪。
这篇内容算是个人复盘,把低抖动1.25-GSPS时钟和GSPS数据转换器里JESD204B接口之间的利害关系掰开揉碎讲一遍,包括硬件选型、时钟树设计、FPGA侧IP配置,以及我从“链路建立失败”到“频谱干净”的完整调试过程。适合正在做GSPS ADC/DAC高速采集板、或者调JESD204B IP一直调不通的工程师参考,也适合刚接触JESD204B的硬件工程师对整套时钟架构建立一个整体概念。
1. 为什么1.25GHz时钟决定JESD204B的生死
1.1 数据流路径里的三把时钟
在GSPS ADC/DAC应用中,整个高速数据链路里其实有三把时钟在同时跑,很多人只盯着采样时钟,把另外两把扔在一边,这是最大的误区。
第一把是采样时钟,也就是ADC/DAC的采样率,比如2.5GSPS。第二把是设备时钟(device clock),它是JESD204B接口的数据参考时钟,在常见的GSPS转换器里,这个频率经常就是1.25GHz,恰好是2.5GSPS采样率的一半。第三把是系统参考脉冲SYSREF,用于多芯片、多通道之间的对齐。
JESD204B Subclass 1协议要求SYSREF必须与device clock边沿保持确定的相位关系,而device clock又要驱动SerDes的位时钟合成逻辑。换句话说,这把1.25GHz的设备时钟一路通到协议物理层,它要是抖了,后面的8b/10b编码、多帧对齐、确定性延迟全部跟着崩。
器件内部的具体机制各有不同,但大方向几乎一致:ADC内部将采样时钟分频或倍频后产生device clock,FPGA端也以同一个时钟源作为JESD204B core的参考,再经过GT收发器的内部PLL合成串行时钟。以常见的4通道、12bit、2.5GSPS配置为例,JESD204B使用8b/10b编码,有效数据率高达30Gbps,分割到4条lane之后,每条lane的串行速率大约在9.375Gbps附近;而1.25GHz的device clock配合适当的倍频比,正好落在这一类典型线速率区间。任何器件的数据手册里给出的配置表,前提都是这颗时钟的相位噪声足够低。
1.2 抖动怎么一口一口吃掉SNR
时钟抖动对系统的影响是双份的,很多人只算ADC那一份,忽略了JESD204B接口本身那一份。
先说ADC采样这一份。数据转换器有一个“孔径抖动”的概念,指的是实际采样时刻相对于理想采样时刻的偏差。外部输入时钟的抖动会直接叠加到孔径抖动上,最终反映为采样噪声。最经典的公式是:
SNR = 20·log10(1 / (2π · fin · tj))
其中fin是输入信号频率,tj是总抖动(单位秒)。代入一个例子:输入信号1GHz,总抖动500fs(0.5ps),那么SNR上限大概只有50dB。你注意,这里说的是“上限”,也就是说即使ADC芯片本身标称的SNR是65dB,只要时钟抖动不够低,实测SNR就会被压低到50dB附近,芯片的性能根本发挥不出来。GSPS数据转换器都是宽带应用,输入频率轻松上GHz,对抖动的敏感程度远高于低速系统。
再说JESD204B接口这一份。JESD204B的串行线速率通常在6.25Gbps到12.5Gbps之间,一个UI(单位间隔)只有80到160ps。GT参考时钟的抖动会直接影响SerDes的时钟恢复能力,抖动一大,眼图闭合,误码率指数级上升。JESD204B规范一般要求误码率低于1e-15,换算成抖动预算,参考时钟路径能分到的抖动余量非常薄。很多链路“间歇性掉链”的问题,表面看是同步失败,实际是时钟抖动导致MGT恢复时钟相位发生瞬态跳变。
所以结论很直接:低抖动1.25GHz时钟不是“加分项”,而是GSPS应用中JESD204B能正常工作的前提。
1.3 抖动到底是从哪来的
调过几块板子之后,我对抖动来源的观察是:大多数情况下,时钟芯片本身的底噪并不是主要问题,问题出在周边环境。
开关电源纹波是头号嫌疑。DC-DC的开关频率通常在几百kHz到几MHz,这个频段的纹波如果渗进时钟芯片的供电引脚,会直接调制VCO,形成靠近载波的杂散。其次是参考源质量。外部TCXO或OCXO的相位噪声决定了PLL带内的本底,用一个性能很烂的参考源,再好的时钟芯片也白搭。第三是布局布线串扰。数字总线、SPI控制线、甚至FPGA内部逻辑翻转的噪声,都能通过PCB耦合到时钟走线上。
这些噪声源的作用路径各有不同,但最终的体现就是时钟抖动指标恶化。这个认知引出一个重要的调试原则:当链路出问题时,第一步不是查逻辑,而是用频谱仪看时钟的相位噪声和杂散。
2. 硬件侧的低抖动时钟方案与设计要点
2.1 时钟芯片选型的四个硬指标
GSPS数据转换器的JESD204B时钟,选型时我只看四个指标:输出频率覆盖范围、集成RMS抖动、SYSREF支持能力、以及供电敏感性。
频率覆盖是基础,必须能输出1.25GHz甚至更高,因为有些器件的设备时钟会到2.5GHz。集成RMS抖动要盯住“12kHz到20MHz”或者“10kHz到80MHz”积分区间,目标做到100fs RMS以内,越低越好。SYSREF支持能力决定了Subclass 1能不能做,如果芯片没有专用的SYSREF输出引脚和同步机制,后面多芯片同步就会非常痛苦。
市面上常用的几颗芯片我列一个表格:
| 芯片型号 | 典型输出频率 | 积分抖动(典型) | SYSREF支持 | 适用场景 |
|---|---|---|---|---|
| LMK04828 | 最高约3GHz | 1.25GHz时约60fs RMS | 支持,可编程 | JESD204B类应用的最佳选择之一 |
| AD9528 | 最高约2.5GHz | 1.25GHz时约100fs RMS | 支持 | ADI配套GSPS转换器常用 |
| LMX2594 | 最高约15GHz | 1.25GHz时约50fs RMS | 支持 | 需要更高频率或宽带扫频时用 |
| ADF4355 | 最高约6.8GHz | 1.25GHz时约100fs RMS | 需外部配合 | 常规锁相环,性价比高 |
LMK04828这类双PLL架构特别适合JESD204B:第一级PLL用于清洁参考源的相位噪声,第二级PLL用高性能VCO输出1.25GHz低抖动时钟,同时SYSREF通过内部同步逻辑与device clock精确对齐。单环PLL虽然便宜,但在需要SYSREF和device clock严格对齐时,实现起来要费不少功夫。
2.2 供电滤波与布线的实战细节
时钟芯片选好了,供电和布线才是真正拉开差距的地方。时钟芯片的VCO对电源噪声极其敏感,我用LMK04828时的经验是:电源必须用低噪声LDO,不要直接从DC-DC输出拉一条线过来。如果非要用DC-DC,至少隔两级LDO,并且LDO输出端的滤波电容要选好。
我在时钟芯片电源引脚处习惯用“10uF钽电容+0.1uF陶瓷电容+100pF高频电容”的组合。10uF管低频瞬态,0.1uF管中频去耦,100pF管高频滤波。这个组合实测下来,对开关电源残余纹波的抑制效果比单颗大电容好得多。注意陶瓷电容的直流偏压特性,小封装电容在额定电压附近实际容值会大幅下降,所以选型时耐压至少留两倍裕量。
布线层面,1.25GHz的差分时钟走线要遵守高速信号规则:50欧姆单端/100欧姆差分阻抗控制,参考地层必须连续,走线尽量短、尽量直,不打过孔。SYSREF和device clock的走线长度误差我控制在10mil以内,因为两者的相位关系直接决定Subclass 1对齐的确定性。
SPI控制线和时钟输出走线必须分开走,中间最好有地隔离。我踩过一次坑,SPI时钟线贴着时钟输出走了两厘米,结果每次配置寄存器的时候,频谱上就多出一串杂散。后来重新布局才解决,这个教训很昂贵。
2.3 SYSREF与Device Clock的对齐操作
在硬件层面,SYSREF和device clock的对齐由时钟芯片内部的同步机制完成。以LMK04828为例,配置完分频比和延迟值后,通过SYNC引脚或者SPI触发内部同步信号,让所有输出被同步到同一个时刻。这个操作必须在系统初始化的时候执行,并且要和FPGA侧的复位时序配合好。
实测验证对齐效果时,用示波器看1.25GHz时钟的上升沿和SYSREF脉冲的上升沿是否对齐。这里有个细节:示波器探头带宽至少要4GHz以上,普通500MHz探头测1.25GHz信号本身就自带衰减和相移,会让你误判对齐关系。我后来直接改用高速差分探头接在测试点上,配合示波器的PLL触发模式,一次性看清稳定后的相位关系。
3. FPGA里JESD204B IP配置与链路建立
3.1 关键配置:从IP核到XDC约束
硬件时钟到位之后,FPGA侧的工作同样有一堆坑。Xilinx Vivado里的JESD204B IP核,配置时最关键的几个参数是:线速率(Lane Rate)、参考时钟频率、SYSREF模式、Subclass类型。
我用的典型配置:线速率6.25Gbps,MGT参考时钟250MHz,SYSREF模式选择“periodic”或“one-shot”取决于上游时钟芯片的SYSREF输出类型,Subclass选1。这里的250MHz MGT参考时钟是GT收发器专用的,通常由板上同一颗时钟芯片的另一个输出提供,而不一定和1.25GHz device clock同频。两者可以不同频,但必须同源,否则异步关系会破坏确定性延迟。
如果你的设计里用的是RF Data Converter IP(比如Vivado 2020/2022版本里的RFDC),配置逻辑更集成化,但底层依然是JESD204B。RFDC IP里有一个asynchronous clock mode divide选项,允许发送和接收方向使用不同的时钟分频关系,这在FMC板卡上很常见:ADC和FPGA各自的时钟来源不同,频率存在小偏差,通过分频模式把两侧的LMFC对齐到近似频率。千万不要忽略这个选项,配置错了会导致ILAS阶段反复失败。
XDC约束里,GT参考时钟必须约束到MRCC/SRCC管脚:
set_property PACKAGE_PIN AF14 [get_ports gt_refclk_p] set_property PACKAGE_PIN AG14 [get_ports gt_refclk_n] create_clock -name gt_refclk -period 4.000 [get_ports gt_refclk_p]这里的period 4.000对应250MHz。如果看到“IO Clock Placer failed”之类的报错,多半是参考时钟没有绑定到专用的时钟输入管脚,或者把普通IO当成参考时钟输入用了。
3.2 Subclass 1的确定性延迟是怎么实现的
Subclass 1的核心是用SYSREF采样建立LMFC(本地多帧时钟),从而让多条lane、多个芯片的数据对齐。
SYSREF必须在device clock的建立保持时间窗口内被稳定采样,否则就会进入亚稳态,导致每次上电链路建立后的延迟都不一样。FPGA内部JESD204B IP核会用一个采样窗口去捕获SYSREF,如果SYSREF相对device clock的边际刚好卡在窗口边缘,就会出现偶发性对齐失败。
这种情况的排查思路是:先用频率计测量SYSREF和device clock的实际相位关系,再在IP核内调整SYSREF采样延迟,或者用FPGA内部的IDELAY对SYSREF做精细调整。我遇到过一次比较诡异的现象:链路十次里有八次正常,两次失败,最后抓到是SYSREF上升沿刚好落在device clock采样窗口的建立时间边界上。把SYSREF走线加长了30mil,问题就消失了。
如果外部没有SYSREF,Xilinx IP核还支持配置一个“virtual clock”模式,用内部生成的虚拟SYSREF去做对齐。这个模式在纯逻辑调试阶段非常有用,可以先把内部数据通路跑通,再接真正的SYSREF验证确定性。
3.3 链路状态机:CGS、ILAS、Data
JESD204B链路建立大致分三个阶段:CGS(码组同步)、ILAS(初始通道对齐序列)、Data(正常数据)。调试时观察这几个阶段的跳转,能快速定位问题所在。
CGS阶段,接收端(FPGA)拉低SYNC信号,发送端(ADC/DAC)连续发送K28.5字符,直到接收端检测到连续的K28.5组合后,SYNC拉高。很多“链路建立失败”就卡在这一步,原因基本是:SYSREF没到、device clock没到、或者线速率和参考时钟不匹配。
ILAS阶段,发送端发送多帧参数,包括L、M、F、S、N、N’等配置,接收端校验后进入Data阶段。ILAS校验失败的原因,多数时候是FPGA侧IP的链路参数和ADC侧配置不一致,比如lane数、每帧字节数、样本分辨率有出入。我建议把两侧的寄存器配置表打印出来逐项对照,不要凭感觉。
4. 实操复盘:从建链失败到频谱干净
4.1 现象一:IO Clock Placer Failed
第一次遇到“IO Clock Placer Failed”时,我以为是XDC约束漏了什么,后来发现是时钟资源分配的问题。Vivado里,GT参考时钟、用户逻辑时钟、恢复时钟在同一个时钟区域内互相抢资源,导致布局器找不到合法位置。
具体报错信息里会提示是哪个时钟没办法放置在合法的时钟区域。解决办法有两条路:一是给不同的时钟分配不同的物理区域,通过set_property CLOCK_DEDICATED_ROUTE FALSE先临时绕过,但这不是长久之计;二是检查设计中是不是把多路GT参考时钟放在了同一个GPU bank,或者用了过多的BUFGCE_DIV导致全局时钟树拥塞。我最后是把一路GT参考时钟从MRCC挪到SRCC,再把用户逻辑时钟约束到另一个时钟区域,一次通过。
4.2 现象二:链路间歇性掉链,每次上电延迟不一致
这块板子用的是外购时钟模块,SYSREF和device clock分别来自两颗芯片,频率虽然相同,但相位关系每次上电后是随机的。这就违反了Subclass 1“SYSREF与device clock相位确定”的前提,导致链路虽然能建立,但每次建立后的确定性延迟完全不同,多通道数据错位。
解决办法是把SYSREF和device clock统一到同一颗时钟芯片的同一同步机制下。我换了LMK04828之后,SYSREF和1.25GHz设备时钟从同一组PLL输出,通过SYNC触发对齐,问题彻底消失。这是一个典型的“时钟架构决定协议可实现性”的场景,硬件改一处,软件不用动。
4.3 现象三:频谱里冒出一堆杂散,SNR上不去
链路稳定之后,真正考验时钟质量的是频谱。投一个1GHz单音信号,FFT结果里在信号旁边出现了一串间隔规则的杂散,SFDR只有70dBc左右,和芯片手册标称的85dBc差了整整15dB。
排查思路一层层来:先换信号源,确认不是信号源本身的问题;再检查电源,用频谱仪探针在时钟芯片供电引脚附近测试,果然发现在开关电源的开关频率上有一组高次谐波。这组谐波通过供电引脚调制到了VCO上,最终落在了时钟信号的近端杂散上。
解决方法是给时钟芯片单独增加一级低噪声LDO,并在LDO之前加一个LC滤波器,把开关纹波压到mV级以下。改完再测,1.25GHz时钟的近端杂散降低了20dB以上,整个系统SFDR从70dBc提升到86dBc。换成低抖动脉冲源之后,SNR也提升了约4dB,和前面理论推导的抖动公式基本吻合。
5. JESD204B调试常见问题速查
| 现象 | 可能原因 | 排查方法 | 解决办法 |
|---|---|---|---|
| CGS阶段一直不通过 | SYSREF没达到有效电平 | 示波器测SYSREF波形 | 检查时钟芯片SYSREF配置,确认输出使能 |
| CGS通过但ILAS失败 | 链路参数配置不一致 | 比对FPGA和ADC寄存器配置表 | 修正L、M、F、S、N等参数 |
| 链路建立但偶发失步 | SYSREF和device clock相位漂移 | 用频率计长时间监测相位 | 统一SYSREF和device clock到同一芯片 |
| 高输入频率时SNR明显下降 | 时钟抖动超出预算 | 用频谱仪看时钟相位噪声 | 调整时钟芯片供电,增加滤波,降低抖动 |
| 出现等间隔杂散 | 开关电源纹波调制VCO | 频谱仪探针测电源噪声 | 增加LC滤波器,单独LDO供电 |
| IO Clock Placer Failed | 时钟区域资源冲突 | 查看布局报告 | 调整时钟管脚位置,约束时钟区域 |
| 每次上电确定性延迟不一致 | SYSREF采样处于亚稳态 | 检查建立保持时间余量 | 调整SYSREF走线长度或内部延迟 |
| 多片ADC不同步 | SYSREF未同时到达各芯片 | 测量各SYSREF走线延迟 | SYSREF走线等长,或用时钟芯片多路SYSREF |
这套问题排查的记录我后来整理成了一个速查文档,每次调试新板卡都先对着过一遍。说实话,十个问题里有八个最后都能追溯到时钟相关环节。
最后再分享一个个人体会:JESD204B的调试,本质上是在和时钟打交道。逻辑配置错了,最多是花时间对文档;时钟设计错了,是硬件改板级别的灾难。GSPS数据转换器这类系统,时钟树的设计一定要前置,从选型到布局到供电,每一环都别想着“先跑起来再说”。我自己吃过亏之后,现在画板的第一件事就是把时钟树画完整,确认SYSREF、device clock、GT参考时钟三者同源且相位可控,再开始别的模块。这个习惯,省下来的时间远比看起来多。