搞高速数据采集的人,几乎都绕不开JESD204B这个接口。它带宽高、接口省、集成度好,但代价是同步机制比传统并行LVDS接口复杂得多。很多项目卡在“上电不通”“误码率居高不下”,仔细查下来,多半不是数据链路本身的问题,而是SYSREF和同步参数没搞对。这篇文章就把JESD204B的同步机制拆开讲清楚,重点放在SYSREF信号的处理和调试上,分享一些我踩过的坑和总结出的排查方法。
适合正在做FPGA+高速ADC/DAC联调、或者在评估JESD204B方案的朋友。无论你用的是Xilinx、Intel还是国产FPGA,同步机制的基本原理是通用的,SYSREF的调试思路也能直接迁移。
1. JESD204B同步到底在同步什么
1.1 三层握手机制:CGS、ILAS、Data
JESD204B的链路建立过程分为三个阶段:代码组同步(CGS)、初始通道对齐序列(ILAS)和用户数据传输阶段。很多人只记得“先同步再传数据”,实际调试时却分不清卡在哪一步,导致排查方向错误。
CGS阶段做的事情是确认物理通道能收到正确的8B/10B码型。接收端会通过SYNC~信号拉低,告诉发送端“我需要同步”,发送端随即在每条通道上连续发送K28.5码组。接收端检测到连续的K28.5后,确认通道绑定成功,再释放SYNC~。此时所有通道的8B/10B字边界已经对齐,但还没有完成多通道对齐。
ILAS阶段则是发送端在SYNC~被释放后,发送4个多帧的特定序列。这4个多帧里有R字(多帧起始)、配置数据(包含L、F、K、M、N等参数)和Q字(多帧结束)。接收端通过ILAS不仅能自动识别发送端的参数配置,还能完成多通道之间的对齐,让所有通道的帧边界对齐到同一个时刻。
最后一个阶段就是正常的数据传输,接收端持续把串行bit流还原成并行帧数据。也就是从这一步开始,用户才真正拿到有效数据。
1.2 多设备同步与确定性延迟的本质
单芯片单链路的情况下,JESD204B本身也能跑起来,因为接收端只需要把每一条lane的数据按时钟恢复对齐即可。但实际系统往往是多通道、多芯片、多板卡互联。要求所有通道的数据在同一个时钟沿被采样,同时转换结果到达FPGA内部时还能保持相同的时延,这就引出了JESD204B的核心概念:确定性延迟。
确定性延迟的意思是,每次上电后的链路传输延迟都是一致的,都是固定的周期数。这样系统才能在下游对数据做精确对齐。如果每次上电延迟都不一样,采集系统就无法稳定工作。
那延迟为什么会不确定?因为接收端每个通道的时钟恢复电路上电锁定相位不同,多帧计数器的启动时刻也不一致。单靠SYNC~握手只能保证链路建立,无法保证每一条链路在同一时刻开始数据映射。这就需要一个外部的“校准脉冲”来把所有设备的多帧计数器对齐到同一个参考点。这个脉冲就是SYSREF。
1.3 SYSREF为什么能解决对齐问题
SYSREF本质上是一个与设备时钟同源的低速周期信号。它进入ADC和FPGA后,会被用来复位或校准内部的本地多帧时钟(LMFC)计数器,使所有器件的LMFC边沿对齐到同一个时间点。每个器件都在同一个LMFC边沿开始ILAS和后续的数据映射,采样延迟才能做到确定。
这里的关键点是SYSREF必须同源。它不能是一个自由运行的信号,一定要由同一个时钟源分频产生,并通过等长、同属性的路径分发给所有设备。如果SYSREF和device clock不同源,或者路径上产生了额外的相位偏差,那么“对齐”就无从谈起,SYSREF的作用也就失效了。
2. SYSREF信号的硬件设计细节
2.1 SYSREF的产生、布线、分发
SYSREF设计的重要性再怎么强调都不过分,因为很多问题在原理图设计阶段就已经埋下伏笔。JESD204B标准中并没有规定SYSREF必须是单端还是差分,但目前绝大多数高速转换器和FPGA方案都采用差分信号,也就是SYSREF±。原因很简单,差分信号抗共模噪声能力强,而且能和旁边的device clock在PCB上保持更好的等长匹配。
常见的设计方案是使用LMK04828这类带SYSREF分频输出的时钟芯片。它既可以产生高质量的device clock,也能通过内部分频器输出SYSREF。需要注意的是SYSREF的频率不是随便定的。它必须是LMFC频率的整数分频关系,比如正好等于LMFC频率,或者是LMFC频率的1/2、1/4甚至更低。分频系数会写进转换器的寄存器,也会影响FPGA侧JESD204 IP的配置,两边参数必须完全对齐。
布线方面,SYSREF走线要尽量和device clock走线保持一样的长度。虽然SYSREF本身是一个慢速信号,但它对绝对延时的敏感度远高于普通控制信号。如果SYSREF比device clock晚到了半个周期,计数器复位的时刻就会错开,导致所有设备并没有真正对齐。
实际项目中如果条件受限,没办法做到严格等长,可以通过FPGA内部的相位调整逻辑来补偿。但前提是你得把SYSREF和device clock引到FPGA上可独立观察的引脚,否则出了问题很难定位。
2.2 FPGA内部对SYSREF的处理电路
FPGA内部收到SYSREF之后,通常不是简单打个两拍进逻辑。因为SYSREF需要和device clock之间有确定的相位关系,如果直接用普通寄存器采样,很容易落入亚稳态。正确做法是借助FPGA提供的专用时钟资源或者高速收发器内部的SYSREF处理逻辑。
Xilinx的JESD204 PHY IP和收发器原语中,有专门处理SYSREF的输入路径。它在GT参考时钟域内采样SYSREF,并产生一个本地多帧时钟对齐脉冲。关键点是SYSREF必须先经过IBUFDS进入时钟资源,再连接到GT参考时钟相关的缓冲器,而不是接到普通的PL逻辑引脚上。有些工程师图省事,把SYSREF接到普通GPIO,采样后再去三个周期同步到GT时钟域,这样做的后果就是边沿位置不确定,同步结果时好时坏。
Intel FPGA的处理方式类似,Native PHY中也包含SYSREF同步逻辑。国产FPGA的JESD204IP相对封闭,驱动方式可能不同,但本质上都需要把SYSREF接入到serdes的参考时钟域内处理,而不是当作一个慢速控制信号异步打拍。
2.3 常见SYSREF设计错误
我在审图和调试过程中见过几种典型的设计问题。第一种是SYSREF只接了转换器端,FPGA端完全没接。这种情况如果只回读转换器的数据还好,一旦需要FPGA参与多芯片对齐,或者需要复现确定性延迟,就发现链路延迟始终跳变。
第二种是SYSREF和device clock来自不同的时钟芯片,或者路径上经过了不同的分频器。这样的SYSREF即使频率正确,边沿也无法与device clock保持固定的相位差,JESD204B IP报“SYSREF alignment failure”几乎是必然的。
第三种是SYSREF无法自由关闭。JESD204B标准允许SYSREF用一次性脉冲模式,也可以用连续脉冲模式。如果系统设计里没有控制器去控制SYSREF的发出时刻,而是让时钟芯片持续输出,那么FPGA就必须在每次SYSREF到来时重新对齐LMFC,这在数据采集过程中会造成数据中断,而且不容易察觉。
后续调试时,我会优先确认板子上有没有加这两个测试点:一个测量SYSREF与device clock相对相位的测试点,一个能通过软件控制SYSREF分频/开关的寄存器接口。这两个点没有,后面做同步调试会非常被动。
3. SYSREF调试实战:以ADC+Kintex UltraScale为例
3.1 明确参数与线速率计算
从项目调试角度出发,第一步永远是计算和确认参数。这里用一个实际配置举例:某项目用到一片双通道16位ADC,采样率1GSPS,输出JESD204B接口配置为L=4、F=1、S=1、K=32,串行线速率为10Gbps。
线速率的计算要基于JESD204B的字节映射关系。对于这个配置,每个转换器每个帧周期产生1个采样点,每帧中4条lane总共传输8字节,而两个转换器一共需要传输4字节采样数据加上映射开销,F=1意味着每条lane每帧传1字节,4条lane总共4字节,实际上和16bit双通道的输出流量是对应的。线速率可以按公式估算:数据总速率除以通道数,再乘上8B/10B的编码开销。
总数据速率 = 采样率 × 转换位数 × 通道数 = 1GSPS × 16bit × 2 = 32Gbps。由于编码开销,物理层链路的速率理论上是32Gbps × 10 / 8 = 40Gbps。这40Gbps由4条lane分担,每条lane就是10Gbps,对应GT参考时钟应为10GHz / 40 = 250MHz。
但这里容易出错的是参数协商过程中ADC端的S参数。JESD204B配置里还包含S参数,表示每个转换器在每个帧周期内输出多少个采样点。S=1时,帧速率就是采样率,也就是1GHz;K=32时,LMFC频率就是1GHz/32 = 31.25MHz。SYSREF脉冲频率可以取31.25MHz,也可以取它的1/2、1/4,但必须由同一时钟源分频得到。
拿到这一组参数后,再去对照ADC寄存器手册和FPGA JESD204 IP配置,逐项核对L、F、K、N'、S以及线速率,能避免后面很多莫名其妙的问题。
3.2 完整配置流程与关键寄存器操作
硬件上电后,我习惯按照下面的顺序配置:
- 配置时钟芯片,输出device clock和SYSREF。先把SYSREF输出关闭,等FPGA配置完成后需要同步时再打开。
- 初始化FPGA工程,先把JESD204 IP核配置为与ADC端一致的参数,注意LMFC频率要一致,K值要一致,设备时钟频率要落到参考时钟范围内。
- 配置ADC端的JESD204B寄存器。这一步最关键的是写入和FPGA侧一致的L、F、K、N'等参数,并且使能SYSREF检测功能。多数ADC芯片里都有SYSREF状态寄存器,比如AD9680的寄存器0x0121就包含了SYSREF检测和同步使能位。
- 打开SYSREF输出,观察SYSREF接收状态。如果ADC内配置正确,其寄存器状态位会显示SYSREF received,FPGA侧的状态寄存器也应该能看到类似rx_sync_done的标志。
- 最后发布配置命令,启动链路。很多ADC在JESD204B参数配置完成后,需要写一个地址来触发重新同步。不要遗漏这一步,否则参数没有生效,链路依然跑在旧状态。
实际调试中我还会额外做一件事,就是把复位时序拉长。JESD204B的通电顺序和复位顺序有讲究,尤其是FPGA和ADC分别在两个独立电源轨上的时候。上电时如果FPGA先完成配置、ADC还没有完成初始化,SYNC~信号早就拉高了,那么ADC端就会错过最初的同步请求。此时必须给整条链路一个统一的复位信号,或者手动把SYNC~信号拉低一定时间,再释放重试。
3.3 用示波器和ILA验证同步结果
配置完成之后,不要急着看数据对不对,先确认链路同步状态。我用示波器同时测量SYSREF和FPGA输出的LMFC标志信号。正常的情况下,SYSREF的上升沿应该落在LMFC低电平时段内,并且每次SYSREF边沿与LMFC边沿的相位差固定不变。
然后打开ILA,观察FPGA内部JESD204 IP输出的通道对齐状态寄存器。Xilinx IP会给出多通道对齐指示,以及ILAS阶段收到的配置字节。让我特别关注的是收到的参数是否和ADC端写入的一致。如果K值或L值不一致,往往ILAS的配置数据里能直接看出来。
验证收到有效数据之后,再检查一个细节:每次重新上电或者复位后,从SYSREF触发到ILAS完成的时间间隔是否相同。如果相同,说明确定性延迟已经建立;如果每次都不一样,回过去查SYSREF的相位和分频关系,不要急着调别的参数。
4. 常见故障现象与排查技巧汇总
4.1 高频故障速查表
以下是出现频率比较高的几类问题,按现象、可能原因、排查手段整理:
| 现象 | 可能原因 | 排查手段 |
|---|---|---|
| SYNC~一直拉低,链路无法进入CGS | 线速率不匹配、参考时钟错误、收发器未锁定 | 示波器测量GT参考时钟频率,确认发送端线速率配置 |
| CGS能完成,但ILAS一直不结束 | K值或帧参数不一致 | 回读ILAS中的配置参数,核对K值 |
| ILAS完成,但数据误码率高 | 8B/10B错误、通道间偏斜超标 | 查看收发器误码计数器,检查PCB走线等长 |
| SYNC~能释放,但数据顺序错乱 | 多芯片SYSREF未对齐 | 检查各芯片SYSREF是否同源,测量相位差 |
| 上电正常,复位后延迟变化 | SYSREF脉冲丢失或相位漂移 | 观察SYSREF是否被噪声干扰,改用一次性脉冲模式 |
4.2 三类高频问题的深度排查思路
如果SYNC~一直拉低,先不要怀疑FPGA逻辑,先拿示波器看GT参考时钟。这个问题我遇到过一次,最终原因是ADC端参考时钟被配置成了内部VCO的1/2,而FPGA端以为参考时钟是250MHz,两边实际线速率差了一倍。参考时钟频率的测量是第一步,别看寄存器里写了多少,要实测。
如果ILAS完成后数据错误率超高,排查方向应该是物理层偏斜。JESD204B的四条lane如果PCB长度差得太离谱,会造成通道间偏斜超过容限。此时FPGA的JESD204 IP里通常能看到通道间偏斜值的寄存器,Xilinx IP会给出每个通道的相位偏移量。如果偏斜值很大且超过预算,就要回到PCB设计去修改等长。
如果上电正常、数据正常,但每次复位后进入数据阶段的时间不同,那就是SYSREF没有起到固定相位的作用。用示波器观察SYSREF与LMFC的相对相位,如果每次复位后的相位漂移超过一个UI,就基本可以判断SYSREF没有正确触发LMFC复位逻辑。重点检查FPGA内部SYSREF是否进入了正确的时钟域,以及SYSREF分频系数是否写对。
4.3 容易忽略的边界情况
调试过程中有几个边界情况很容易踩坑,这里单独拎出来说。
第一是SYSREF脉冲宽度。JESD204B对SYSREF的脉冲宽度有最低要求,通常要求达到一定数量的device clock周期才能被可靠捕获。如果时钟芯片输出的SYSREF脉冲宽度过窄,FPGA或ADC可能偶然捕捉成功,但抗干扰能力很差。上电时能同步,温度一变化就失效。
第二是SYSREF的建立保持时间。SYSREF的边沿要满足器件要求的建立保持时间,才能在LMFC计数器中稳定捕获。LMK04828这类时钟芯片提供SYSREF的相位调整功能,可以通过配置输出延迟来微调SYSREF相对device clock的相位。调试时如果状态时好时坏,小步调整SYSREF的相位延迟,观察是否有一个稳定窗口。
第三是逻辑分析仪无法直接测量SYSREF差分离线。很多板级调试时,工程师习惯把逻辑分析仪接到FPGA逻辑引脚的SYSREF状态位上观察,这个做法只能说明逻辑采到了信号,无法反映SYSREF真实的质量。务必在PCB上预留SYSREF的差分测试点,用示波器实测边沿、幅度和与device clock的相位关系。
5. 从芯片到系统:JESD204B同步的工程化要点
5.1 时钟树设计是同步的地基
JESD204B的同步性能,百分之八十在时钟树设计阶段就决定了。SYSREF和device clock必须同源,这句话看起来简单,实际设计中经常被破坏。比如有些系统为了节省资源,让ADC的device clock和FPGA的GT参考时钟由不同的PLL分别产生,频率都对外宣称都是250MHz,但两个PLL之间的相位关系是随机漂移的。这种情况下JESD204B链路也能同步,但无法保证确定性延迟。
正确的时钟树做法是,用主时钟芯片(比如LMK04828)同时输出device clock和SYSREF,SYSREF由该芯片内部分频器产生,并且分频器初始状态由同一个同步事件复位。这样JESD204B设备之间才能获得稳定相位关系的SYSREF。
如果系统中存在多片ADC和一片FPGA,所有ADC的SYSREF必须等长分发,FPGA接收到的SYSREF也应当与ADC在信号传播时间上尽量一致。工程上通常要求SYSREF路径与device clock路径做同样的延迟补偿,必要时在时钟芯片的配置中增加输出延迟微调。
5.2 不同厂商FPGA的调试差异
Xilinx的JESD204解决方案相对成熟,一般会使用JESD204 PHY IP和JESD204 RX/TX IP,SYSREF处理逻辑已经封装在IP内部。调试时重点看IP的状态寄存器,配合VIO在线调整比较方便。
Intel FPGA用的是JESD204B IP with Native PHY。这套方案也有SYSREF同步逻辑,但它的时序约束文件比Xilinx更严,对input delay的约束要求比较高。如果综合实现时出现时序违规,很多情况下不是频率跑不过去,而是SYSREF的input delay约束没有写对。
国产FPGA的不同厂商方案差异较大。有些只提供物理层PHY,链路层需要自己写逻辑,SYSREF处理也要自己写。这种方案的调试难度明显高出一截,需要自己设计LMFC计数器和SYSREF同步电路。写这种逻辑时,关键点是让SYSREF采样后产生的对齐脉冲与GT参考时钟对齐,最好使用专门的时钟复位同步单元,不要用简单的两级触发器。
5.3 多板同步场景下的SYSREF处理
当系统扩展到多块板卡时,SYSREF的调试复杂度会再上一个台阶。多板场景下,每块板上的FPGA和ADC不是由同一个时钟芯片驱动,而是由背板分发参考时钟,然后在板上各自生成SYSREF。这种情况下,板上时钟芯片的SYSREF分频相位必须由背板提供统一的同步脉冲来复位,否则每块板的LMFC相位互相之间是随机的。
我曾经调试过一个8通道采集系统,单板测试一切正常,组合成系统后通道间数据错位达到好几帧。排查下来就是背板分发的同步脉冲到达两块板的时刻不同,而板上的时钟芯片被配置成普通模式,没有用该同步脉冲复位SYSREF分频器。后来把所有时钟芯片配置为外部同步模式,并用同一根等长的同步线驱动,问题才真正解决。
多板调试的经验是,先确认单板确定性延迟正常,再组装系统。组装后不要急着找FPGA逻辑的问题,先用示波器同时测两块板输出的LMFC脉冲,看相位是否对齐。相位差应该为0,如果能看到几百ps以上的固定差值,就需要调整SYSREF分频相位或延长同步线做补偿。
6. 调试工具与信号实测经验
6.1 示波器采样率其实不用太高
很多人一听说SYSREF调试,下意识认为需要几十GHz带宽的示波器,其实不然。SYSREF本身是慢速信号,真正需要高频示波器测量的是device clock和串行高速lane的波形质量。SYSREF调试的实测重点是边沿相对device clock的位置,这个用2GHz左右的示波器就能测得很清楚。
实际操作时,我习惯用一个双通道示波器,一路接SYSREF,一路接device clock或LMFC输出。触发方式设置为SYSREF上升沿,然后观察device clock的过零点相对位置。连续触发几百次,看相位差是否稳定。如果相位差不固定,测量一下SYSREF是否为自由运行,或者被别的信号干扰。
6.2 用VIO在线调整SYSREF相位
在FPGA联调阶段,VIO是个很实用的工具。Xilinx的VIO可以动态读写寄存器,也可以输出一些控制信号。如果JESD204 IP的状态寄存器里能看到SYSREF采样窗口的指示信号,就可以把该信号连到VIO,实时观察SYSREF是否落在有效窗口内。
更加进阶的用法是,把SYSREF的延迟线配置寄存器映射到VIO,在运行中微调SYSREF的相位,通过观察状态寄存器的变化来寻找最佳采样点。这和在高速并行接口里做眼图扫描的思路一样,只不过调的是异步时钟信号。我在一个验证板上就靠这种方法把SYSREF的稳定窗口找出来了,最后把相位延迟固定到窗口正中间,系统可靠性明显提升。
6.3 记录每次调试变量的习惯
SYSREF调试过程中变量非常多:线速率、K值、SYSREF分频、时钟相位、复位时序、寄存器配置。任何一个变量变化都可能影响同步结果,所以记录调试变量特别重要。
我习惯用表格记录每一次改动:时间、改了什么寄存器、当前现象、是否成功。这样即使调试过程持续一周,也能随时回溯到之前一个正常状态。很多时候发现正常状态和异常状态之间其实只有一个寄存器位的差异,但如果没有记录,只能从头再试一遍。
7. 关于JESD204B同步的一点个人体会
调JESD204B同步机制的时间久了,我有一个很深的体会:这个接口的难点其实不在于高速串行收发器本身,而在于整个系统的协同。JESD204B把同步从芯片级上升到了系统级,SYSREF就是系统级同步的那根“指挥棒”。任何一环对它处理不当,最后反馈出来的问题却都是数据错误、误码率高这种表象,容易让人误判方向。
所以现在我做新项目的原则很简单:原理图阶段就规划好SYSREF的走线、测试点和时钟分配方案;布线阶段严格按等长要求处理;FPGA内部一定用厂商IP自带的SYSREF同步路径;联调阶段先验证时钟相位再验证数据内容。把基础打好之后,JESD204B同步只是几个寄存器和一次示波器测量的功夫,并没有想象中那么神秘。