最近在调一块GSPS数据转换器的板卡,ADC和DAC采样率都在2 GSPS以上,数据接口走的JESD204B。刚开始链路怎么都建立不起来,误码计数器一直在涨,看眼图也是糊的。我一度以为是FPGA逻辑或者IP配置有问题,翻来覆去查了两天,最后用频谱仪去量板上那颗1.25 GHz时钟,才发现问题全出在时钟上。换上低抖动时钟源之后,JESD204B链路一次就跑通,转换器的SFDR直接拉升了十几个dB。
这篇东西就围绕“低抖动1.25-GSPS时钟”和“JESD204B串行接口”展开,把我踩过的坑、做过的计算、试对的配置,还有Vivado里那些报错的处理过程都记录下来。主要适合两类人看:一类是做高速数据采集板卡的硬件工程师,另一类是跟JESD204B打交道的FPGA工程师。如果你正在被链路建不起来、同步丢失、SFDR上不去这些问题折磨,这篇文章大概率能帮你少走一段弯路。
1. 项目背景与核心挑战:为什么1.25 GHz时钟卡住整个链路
1.1 GSPS转换器与JESD204B接口的基本形态
GSPS就是Giga Samples Per Second,采样率达到每秒十亿次以上。这类转换器如果继续用传统的并行LVDS接口,比如一个14 bit、2.5 GSPS的ADC,每通道大概需要35对差分线,而且还要保证所有数据线在不到400 ps的采样窗口内对齐,这几乎是不可能完成的任务。JESD204B就是为这种场景设计的,它把数据和控制信息统一串行化,一根差分线上就能跑到几Gbps甚至十几Gbps,引脚数量瞬间少了一个数量级,板子布线的压力也小很多。
以双通道14 bit、2.5 GSPS的ADC为例,每个通道的数据率大约是2.5G × 14 = 35 Gbps,如果分配到4条lane上,每lane线速率就是8.75 Gbps。为了在接收端恢复出这么高速的串行数据,需要一个高速参考时钟给FPGA内部的GT transceiver使用。这个参考时钟往往就是1.25 GHz,由PLL倍频到串行数据所需的位时钟。也就是说,1.25 GHz虽然看起来只是一个“参考”,但它最终决定了每个UI(单位间隔)的宽度和抖动预算。在8.75 Gbps下,一个UI大约是114 ps,如果参考时钟抖动超标,误码率就会急剧恶化。
很多第一次做GSPS板卡的人会忽略一件事:JESD204B不是一个单纯的串行协议,它对系统时钟的确定性要求非常高。尤其subclass 1模式下,需要SYSREF信号来对齐所有器件的本地多帧时钟(LMFC)。设备时钟的频率、相位噪声、抖动,会直接决定SYSREF能否被可靠采样。一句话,时钟是JESD204B的地基,地基不过关,上面搭建的逻辑再完美也没用。
1.2 低抖动时钟在超高速串行链路中的决定性作用
为什么非要强调“低抖动”?我做一个比较直观的换算。假设线速率是12.5 Gbps,UI = 1/12.5G = 80 ps。JESD204B接收端的CDR(时钟数据恢复)电路通常要求总抖动预算不超过0.3 UI,也就是24 ps。这个预算里面包含了发送端、通道、接收端的所有抖动贡献。分到时钟上,单独允许的RMS抖动往往只剩0.3到0.5 ps。如果你用的时钟源RMS抖动在1 ps以上,那链路基本是没法保证BER<1e-12的。
抖动有两种:随机抖动(RJ)和确定性抖动(DJ)。随机抖动主要来自时钟源的相位噪声,通过PLL倍频后还会按20logN恶化。举个例子,如果你用一个100 MHz的低噪声晶振,经过PLL倍频到1.25 GHz(N=12.5),相位噪声理论上会恶化大约22 dB。所以很多系统直接选一个本身工作在1.25 GHz的低抖动时钟芯片,避免大倍频带来的噪声恶化。我之前用某款集成PLL的时钟,在1.25 GHz输出下积分抖动只有120 fs,换上它之后,误码率从1e-9直接掉到仪器测不出来的水平。
抖动对转换器性能的影响就更直接了。GSPS ADC内部是用模拟输入信号和采样时钟比较来采集电压的。采样时钟的抖动会导致采样时刻偏移,在输入信号斜率大的地方产生电压误差,反映到频谱上就是噪声基底抬高,SFDR和ENOB下降。理论上,对于一个满摆幅的正弦输入,输入频率1 GHz,采样时钟RMS抖动0.5 ps,会引入大约6 dBc左右的相位噪声贡献,这已经是很明显的恶化。所以低抖动时钟不是玄学,是可测量的、决定系统档次的硬指标。
2. 低抖动时钟的工程实现:从器件选型到电路布局
2.1 设备时钟与SYSREF:subclass 1的确定性时延基础
JESD204B的subclass 1是目前用得最多的模式,它靠SYSREF来保证多器件之间的确定性时延。SYSREF可以是一个脉冲、一串脉冲或者周期性信号,必须在设备时钟的一个稳定窗口内变化。以ADC为例,ADC需要把SYSREF与自身的设备时钟对齐,然后内部产生LMFC边沿。FPGA侧也是一样,需要用同一个SYSREF来对齐RX/TX状态机的LMFC。两边时钟和SYSREF对齐后,数据从采样到送进FPGA的整个时延才是固定可测的。
在实际工程中,SYSREF不是简单接一根线就行。首先要保证SYSREF和设备时钟同源,否则无法满足相位关系。其次,SYSREF的上升沿必须避开设备时钟的采样亚稳态窗口,这个窗口通常只有几十皮秒。为了做到这一点,不少时钟芯片专门提供JESD204B功能,可以输出与设备时钟对齐的SYSREF,比如LMK or HMC系列。这类芯片内部有同步机制,能确保SYSREF的高电平沿落在设备时钟的已知相位上。
我在这块板卡上的做法是:用一片低抖动时钟芯片生成1.25 GHz设备时钟,同时配置一个SYSREF输出,频率为设备时钟除以帧大小。通过SPI配置内部寄存器,让SYSREF在设备时钟上升沿附近稳定。测量时用示波器高带宽通道看SYSREF和Device Clock的建立保持时间,确保SYSREF变化沿距离设备时钟采样沿至少满足转换器手册里的最小要求。这一步如果图省事,用FPGA普通GPIO生成SYSREF,很容易在极端温度或者电压波动下出现相位漂移,导致SYSREF偶尔采样错误,链路就会随机性地重新同步。
2.2 1.25 GHz时钟的抖动预算与相位噪声分析
给一个1.25 GHz时钟制定抖动指标,不能拍脑袋。我一般按照最终线速率来反推。以12.5 Gbps为例:
- UI = 80 ps
- 总抖动预算(BER<1e-12)≈ 0.3 UI = 24 ps(峰峰值)
- 接收端CDR可以容忍部分低频抖动,但高频抖动直接影响采样
- 假设通道和电路板贡献20 ps pp,留给时钟的只有4 ps pp
- 按峰峰值和RMS的关系(大约7倍σ),时钟RMS抖动需要低于0.57 ps
这还是一个比较宽松的假设。如果线速率提升到14.1 Gbps,UI只有71 ps,时钟RMS抖动就必须小于0.4 ps。所以工程上我通常要求1.25 GHz时钟RMS抖动不超过0.35 ps,最好在0.2 ps以下。实际选择器件时,相位噪声曲线在10 kHz到10 MHz范围内的积分值是最关键的,有些标称“低抖动”的时钟芯片只有积分到100 kHz的指标,那是不够的,需要看完整积分区间。
相位噪声方面,我习惯把1.25 GHz相位噪声分成三段看:近端(1 kHz以内)影响系统同步和长期漂移,中段(1 kHz到100 kHz)影响PLL环路带宽内噪声,远端(100 kHz以上)直接影响串行数据眼图的抖动。JESD204B链路最敏感的是中远端的积分噪声。比如一颗芯片在1.25 GHz输出时,100 kHz处相位噪声为-145 dBc/Hz,1 MHz处为-155 dBc/Hz,积分到10 MHz大概能得到0.17 ps RMS抖动,这就是一只比较推荐的使用状态。
2.3 异步时钟模式分频与虚拟时钟:FPGA侧必须弄明白的细节
这个词“asynchronous clock mode divide”是很多人容易忽略的。Xilinx的JESD204B IP核支持同步模式和异步模式。同步模式下,FPGA内部逻辑时钟、GT参考时钟和JESD204B设备时钟全部来自同一个时钟源,时序关系固定,调试最省心。异步模式下,FPGA的core clock可以由另一个独立时钟提供,IP核内部用异步FIFO来缓冲跨时钟域数据。这个模式的好处是灵活,坏处是如果你不知道“divide”怎么配,链路层和物理层之间的相位关系就乱了。
异步模式下经常需要配置一个分频系数,让IP核知道core clock和线速率之间是什么关系。例如线速率12.5 Gbps,GT参考时钟1.25 GHz,FPGA内部逻辑时钟125 MHz,那么串行时钟和逻辑时钟之间就是10分频。这个分频比必须在IP核配置中设置准确,否则IP内部的字节对齐和字符替换逻辑会错位,表现出来就是链路可以sync,但传出来的数据是乱的。
虚拟时钟这个概念和异步时钟模式经常搭档出现。当你用MMCM或PLL把1.25 GHz时钟分频成125 MHz,逻辑时钟在时序工具里可以由MMCM输出自动推断。但如果你在FPGA内部用组合逻辑或者BUFG去产生一个分频时钟,工具自己是找不到的,就需要手动用virtual clock来声明。我遇到过一种情况:设计里用SYSREF和一个异步信号做逻辑,生成了一个内部“同步使能”信号,若没有给这个信号掉对应的虚拟时钟,Vivado会把这条路径当成非约束路径,时序分析结果等于没做。后期温度稍高,时序余量不足,导致SYSREF周期性错位,链路频繁重同步。
因此,当你看到代码里有“divide”和“virtual clock”这两个词时,一定要花时间在XDC里补上对应的create_clock和set_clock_groups,否则后面报错或者时序不过是很正常的事。
3. Vivado JESD204B IP配置与时钟约束实战
3.1 IP核对1.25 GHz时钟的配置要求与版本陷阱
在Vivado里用JESD204B IP核,第一步是正确区分两组时钟:一组是GT参考时钟(给transceiver的PLL用),另一组是JESD204B IP核的设备时钟/链路时钟。GT参考时钟的频率必须和线速率匹配,常见的是线速率的1、2、4...分频。以12.5 Gbps线速率为例,GT参考时钟往往就是1.25 GHz(对应Q参考时钟)。在配置IP时,线速率填12500 Mb/s,参考时钟填1250 MHz,通道数和Lane速率要对应上。
这里有个大家经常踩的坑:IP核版本和Vivado版本不匹配。热词“2020版本vivado对于2022版本 rf data converter”说的就是这种例子。2022版本的RF Data Converter IP生成的接口,如果硬塞到2020.1版本里去重建工程,IP核内的端口、时钟方案和一些参数定义都变了,编译基本过不去。解决方法是统一工具链版本,或者用Vivado的IP Upgrade Wizard升级IP。我个人的习惯是至少保证主工程和IP核在同一个大版本,比如2022.1对应2022.1,不混用。
另外,IP核配置中有一个“Buffer Delay”参数,用于设置接收端的FIFO缓冲深度,以吸收SYSREF对齐后的相位差异。如果这个值设得不对,即使SYSREF已经对齐,也会出现数据在FIFO中溢出或下溢,表现为偶尔丢帧或误码。具体值需要根据LMFC周期、FIFO输出时钟和线速率计算。一般来说,先从IP的默认值开始,跑通后再通过寄存器微调。不要一开始就大改,除非你已经对确定性时延机制非常熟悉。
3.2 时钟约束与“IO clock placer failed”报错排查
在综合和布局布线阶段,最常见的一个报错就是“[Place 30-99] Placer failed with error: IO clock placer failed”。我第一次遇到时以为是代码问题,后来发现根源在XDC约束。这个报错的本质是:布局器无法为某个IO clock确定合法的时钟位置。触发原因一般有三种。
第一种,你给一个普通IO端口定义了主时钟约束,但这个端口没有连接在MRCC或SRCC时钟引脚上。Vivado需要把IO clock接入全局时钟网络,如果引脚不支持时钟输入,Placer就没法布局。检查方法是看板级设计文件,确认该引脚是不是专业时钟脚。
第二种,约束里同时存在对同一物理引脚的冲突定义。比如你已经在一个端口上create_clock,又在另一个generated clock定义里把该端口作为参考,导致Placer无法决定主从关系。这种情况排查XDC中所有create_clock和create_generated_clock的source,确保没有循环依赖。
第三种,虚拟时钟用错了地方。虚拟时钟本身没有物理引脚,但如果把它作为PLL或MMCM的输入时钟,那相当于声明了一个没有实际输入引脚的PLL。布局器找不到PLL的参考时钟输入,就会报IO clock placer failed。正确做法是:虚拟时钟只能用于约束异步路径或端口间的输入延迟,不能驱动MMCM/PLL。
我当时的具体问题是:先给一根1.25 GHz差分时钟引脚做了create_clock,但在另一个约束文件里又给分频输出重复定义了一个generated clock,并错误地指定了source。删除重复定义后,布局布线一次通过。所以看到这个报错不要慌,从XDC入手,一项项排查时钟来源,比乱改代码有效得多。
3.3 从链路建立失败到频谱干净:一个完整调试复盘
这条复盘记录的是我最近一次调试的真实流程,希望能给你一个参考。
现象:板卡上电,ADC的JESD204B RX链路始终无法拉高SYNC。用Vivado的IBERT工具测试GT通道,发现眼图开口不小,BER很低,说明通道本身没问题。但一旦切换到JESD204B IP核,状态寄存器显示经过短暂同步后又迅速失步,误差字节计数持续增加。
第一步,测时钟。我用示波器测量1.25 GHz设备时钟,发现波形虽然幅度正常,但抖动偏大。示波器上的TIE抖动RMS显示在1.2 ps左右,这和我预期的0.3 ps差距太大。进一步查频谱,时钟信号的相位噪声在100 kHz处高出了近20 dB,明显有电源噪声耦合。原因是我把时钟buffer的供电接到了开关电源输出的LDO后面,但LDO反馈环路上还有很多其他数字噪声。改成专用的低噪声LDO并用铜皮隔离后,时钟抖动降到了0.3 ps。
第二步,测SYSREF。当时SYSREF是FPGA GPIO产生的,电平标准是LVDS,理论上没问题。但发现SYSREF沿相对于1.25 GHz时钟有一定的随机漂移。原因是GPIO输出的翻转是通过FPGA内部逻辑产生的,逻辑PLL和时钟PLL的相位关系没有完全确定。后来我把SYSREF改由时钟芯片直接输出,并用芯片的SYSREF同步功能,确保它和1.25 GHz设备时钟固定对齐。测出来SYSREF的建立时间大概有45 ps的余量,稳定了很多。
第三步,重新配置IP。把GT参考时钟设为1.25 GHz,线速率设为12.5 Gbps,JESD204B核心时钟设为125 MHz,正确填写分频比。然后用ILA观察link status寄存器和lane alignment状态,确认每个lane都进入data mode。
第四步,验证性能。链路稳定之后,给ADC输入一个-1 dBFS、1 GHz正弦波,用FPGA抓数据做FFT,SFDR从之前的73 dBc提升到了86 dBc,SNR也提升了约4 dB。从“链路建立失败”到“频谱干净”,关键转折点就是换掉了那颗高抖动的时钟buffer。如果板上没有频谱仪,至少也要用示波器看时钟信号的抖动和过冲,别急着怀疑FPGA逻辑。
4. 常见问题与实测避坑指南
4.1 时钟上升时间与数据采样窗口的关系
很多人只关心时钟频率和抖动,忽略了上升时间。对于GSPS转换器,采样是边沿触发的,如果上升沿太缓,在噪声影响下过零时刻会左右漂移,等效为额外的孔径抖动。1.25 GHz时钟一个周期是800 ps,上升时间如果超过300 ps,那么过零区域可能占到一个周期的40%,这显然无法接受。
我在布局时让差分时钟尽量短,并保证差分阻抗100欧姆。终端电阻放在接收端,靠近转换器时钟引脚。另外,不要在这个网络上加过多的ESD保护器件,小容性负载会明显增加上升时间。实测中,一颗4 pF的TVS管就可以让1.25 GHz时钟的上升沿从80 ps恶化到140 ps。如果你的链路误码率在低温时特别差,可以优先怀疑上升沿太缓导致的孔径抖动增大。
4.2 竞争冒险与时钟毛刺在JESD204B中的表现
“Competition hazard”或者“clock data race”这类说法在ASIC设计中常见,但在FPGA里同样会存在。当一个异步信号和一个同源时钟的边沿接近时,经过不同的逻辑路径,可能出现一个极窄的毛刺。这个毛刺如果正好被JK触发器采样,就会导致状态机跳到一个非法状态。JESD204B里最常见的场景就是SYSREF输入后的同步逻辑。
我自己遇到过SYSREF经过两拍同步后,在边界条件下会偶尔多产生一个脉冲,导致LMFC计数器被额外复位一次。排查很耗时间,因为复现条件很苛刻,要温度、电压都处于特定范围。后来在同步路径上加了IDELAYE2,把SYSREF相位调整到距离设备时钟边沿最远的位置,再重新做时序约束,这个问题就再也不出现了。建议你项目初期就设定好SYSREF的相位偏置,不要完全依赖“打两拍”这种粗暴做法。
4.3 典型链路失败问题排查速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 链路完全无法建立 | 设备时钟无输出或频率错误 | 万用表测电压,示波器测时钟频率和幅度 | 检查时钟芯片配置和供电 |
| 链接建立后周期性失步 | SYSREF与设备时钟对齐不良 | 用示波器观察SYSREF相对时钟沿的建立/保持时间 | 改进SYSREF生成方式,使用芯片专用JESD同步输出 |
| 误码率高,眼图模糊 | 参考时钟抖动过大 | 频谱仪测相位噪声,积分抖动 | 更换低抖动时钟源,优化buffer供电 |
| 报错[Place 30-99] | XDC时钟约束冲突或非时钟引脚作为时钟 | 检查create_clock/generated_clock定义 | 修正XDC,保证时钟来自MRCC/SRCC引脚 |
| IP核报版本不兼容 | Vivado版本与IP核生成版本不同 | 查看IP版本信息 | 统一版本或升级IP |
| SFDR低于预期 | 时钟相位噪声恶化或电源噪声耦合 | 测量时钟频谱底噪,检查电源纹波 | 增加电源滤波,优化时钟网络 |
排查JESD204B问题,我的顺序永远是:电源 -> 时钟 -> 通道 -> 逻辑。电源和时钟占了至少80%的问题源。等你把时钟调到“低抖动且干净”,再去看IP配置和寄存器状态,很多问题会自动消失。
最后再分享一个个人经验:调试JESD204B链路时,别一上来就打开IBERT或者ILA抓数据。先花半小时把1.25 GHz的时钟波形、相位噪声、SYSREF对齐关系测一遍,记录好再动逻辑。这样做表面上看多花了时间,实际能省下好几天的排查时间。GSPS转换器应用里,JESD204B的成功率很大程度不取决于复杂的逻辑设计,而是取决于那颗低抖动时钟是不是真的足够干净。