做高速数据采集板卡的这几年,JESD204这个协议基本是绕不开的坎。无论是ADC还是DAC,只要是中高速的数据转换器,十有八九都会把接口定在JESD204B或者JESD204C上。FPGA这边想要和这些转换器对接,就得在芯片里实现一套完整的JESD204物理层,而这块活儿在Xilinx平台上通常就落在JESD204 PHY IP核上。很多人觉得把IP拖出来、配置一下线速率就能跑通,实际折腾过就会发现,从参考时钟选择到多通道共享设计,每一步都有讲究,稍不留神就是你调链路三天、最后发现是PHY层配置的问题。
今天我就围绕“JESD204 PHY IP核”,从它对整个链路的定位说起,把配置过程中的关键参数逻辑、多通道共享设计思路、以及上板调试中容易踩的坑,一次性讲透。无论你是刚开始接触JESD204的新人,还是已经调试过一轮链路准备做多通道同步的老手,这篇文章应该都能给你一些参考。
1. JESD204与PHY IP核:先把链路分层搞清楚
1.1 JESD204B/C链路架构速览
JESD204从A版本走到B版本,再到现在的C版本,核心目标一直没变:用尽量少的差分高速串行线,把ADC/DAC和FPGA之间的数据搬运完。过去那种几十对LVDS并行总线的方式,在1GSPS以上采样率、16bit分辨率面前已经完全走不通了,所以大家都转投JESD204。
整个JESD204链路可以简单分成三层:应用层、传输层和物理层。应用层就是你FPGA里的用户逻辑,负责处理采样数据;传输层负责把数据映射到帧结构里,做加扰、对齐、错误检测;物理层则负责真正的串行收发。在Xilinx FPGA里,这两个逻辑层通常由JESD204 RX/TX IP核完成,物理层则由JESD204 PHY IP核承担。
链路里那一堆M、L、F、S、N、N’之类的参数,决定了数据怎么编排、怎么传输:
| 参数 | 含义 | 典型值 |
|---|---|---|
| M | 转换器个数 | 取决于ADC/DAC通道数 |
| L | 物理通道(lane)数 | 1/2/4/8 |
| F | 每帧字节数 | 1/2/4等 |
| S | 每转换器每帧的样本数 | 通常是1 |
| N | 转换器分辨率 | 12/14/16 |
| N’ | 实际传输位数(含对齐位) | 通常等于N或者N+1 |
| K | 每个多帧包含的帧数 | 默认32 |
| CS | 控制位数量 | 0/1/2/3 |
如果你只是调PHY IP核,这些参数并不会全部出现在界面里,但你必须心里有数,因为后续和JESD204 RX/TX IP核联动时,两边的参数必须完全一致,否则ILAS阶段就会出问题。
1.2 PHY IP核在整条链路中的实际职责
JESD204 PHY IP核在FPGA内部并不神秘,它的本质就是对高速收发器GT进行再封装,把那些繁杂的原语配置、PLL设置、复位时序封装成一个对外接口统一的IP。GT收发器内部已经包含了并串转换、串并转换、时钟恢复CDR、8B/10B编解码、RX均衡、TX预加重等一系列模拟前端功能。JESD204 PHY IP核要做的,就是把这些功能按JESD204协议的需求配置好,并且提供SYSREF采样、确定性延迟处理这些链路同步需要用到的辅助机制。
很多初学者会有一个误解,以为PHY IP核也参与ILAS、CGS这些协议状态机处理。实际上PHY层不解析帧数据,它只负责把高速串行比特流变成可用的并行数据,或者反向操作。CGS(代码组同步)状态机的判断、ILAS多帧对齐这些活儿,由上层JESD204核完成。但PHY层如果做得不好,上层再正确也没用,因为它决定了CDR能不能锁定、数据眼图够不够干净。
1.3 为什么强烈建议用IP核而不是手撕GT
有人会问:我直接用GT原语,自己写配置不行吗?行,但代价很大。GT原语里涉及到的配置项非常多,从PLL的VCO频率到TX/RX端接电阻、RXCDR的带宽控制、DFE抽头系数,动辄上百个寄存器和端口信号。而且不同系列器件(7系列、Ultrascale、Ultrascale+)GT的细节还有差异。
用厂商提供的JESD204 PHY IP核,最大的好处是它把这些复杂逻辑固化成了经过验证的方案,你只需要关注几个关键参数:线速率、参考时钟频率、lane数、SYSREF模式、模拟前端选项。当然IP核不是万能的,它只解决“合法配置”的问题,不解决“错误设计”的问题,比如你参考时钟给脏了、PCB走线阻抗不对,IP核配置再正确也白搭。所以理解PHY层的工作原理,仍然是调试时最重要的基本功。
2. 关键配置项深度拆解:线速率、参考时钟与模拟前端参数
2.1 线速率计算:先算对了再配置,不然全盘皆输
JESD204 PHY IP核的线速率是最核心的参数,没有之一。线速率算错或者设计时没有留出余量,后面链路同步大概率失败。线速率计算公式如下:
Line Rate = (M × S × N’ × 10/8 × F_sample) / (L × F)
这个公式里乘以10/8,是因为JESD204B用了8B/10B编码,每8个用户bit要变成10个线bit。如果你用的是JESD204C并且关闭了扰码,可能会用64B/66B或者64B/80B编码,系数又不一样。不过目前主流ADC/DAC还是以JESD204B为主,所以10/8这个系数最常见。
举一个我实际做过的例子:ADC是4通道、16bit、1GSPS采样率,按JESD204B输出,如果用8条lane,那么线速率是:
Line Rate = (4 × 1 × 16 × 1.25 × 1GHz) / (8 × 1) = 10Gbps
JESD204B标准在线速率超过12.5Gbps时需要谨慎处理,10Gbps还在安全范围内。但如果4条lane,线速率就会到20Gbps,这就需要在JESD204C下才能实现,或者必须增加lane数量。所以配置PHY之前,先把这个算式写清楚,同时也顺带检验一下F参数是否满足整数约束。
2.2 参考时钟频率怎么选
线速率确定后,参考时钟就跟着定了。GT收发器需要外部提供一个干净的参考时钟,通过内部PLL(QPLL或CPLL)倍频到线速率。对于Xilinx FPGA,参考时钟频率常见的是线速率的1/40、1/66.7、1/80这一类的整数分频值。
以10Gbps线速率为例,工程上最常用的参考时钟是125MHz,因为10Gbps除以125MHz等于80,PLL的VCO倍频系数正好是一个合理值。也有人用100MHz,但10Gbps对100MHz是100倍频,实现上不是不行,但在某些GT里PLL的约束可能不满足,到时候IP核会直接报错。
这里要特别提醒:参考时钟的质量直接决定CDR的抖动预算。我见过有人为了方便,直接用了板上的普通时钟芯片输出接GT参考时钟,结果链路误码率居高不下。后来测了一下抖动,发现时钟源本身的随机抖动已经超了GT输入要求。Xilinx的手册(比如PG066、UG476)对参考时钟的抖动、边沿速率都有明确规格,设计时一定要选低抖动晶振或时钟buffer,最好是专用的HCSL或者LVDS差分时钟源。
2.3 摆幅、预加重与均衡的设置逻辑
PHY IP核配置界面里通常会有一排模拟前端参数,比如TX差分输出电压摆幅(TX Swing)、TX预加重(Tx Pre-Emphasis)、RX均衡模式(RX Equalization)等等。这些参数的设置逻辑和PCB走线长度、连接器损耗、对方芯片能力直接相关。
本身线速率越高,信号在PCB上损耗越大,眼图闭合越厉害。如果你的板内走线比较长,或者经过了连接器、电缆,通常要把TX摆幅适当调大、预加重打开,同时RX端开均衡。Xilinx的GT支持LPM(线性均衡)和DFE(判决反馈均衡)两种模式,低速时用LPM就能解决问题,10Gbps以上且链路有明显ISI失真时,DFE会更有效。
我的经验是:拿到一块新板子,先用默认参数跑一遍回环测试,看误码率。如果误码率下不来,再用IBERT工具测眼图,根据眼图形态去决定加大预加重还是调整均衡档位,不要一拍脑袋乱调。参数这东西,和电路板息息相关,照抄别人方案的参数往往不灵。
2.4 共享逻辑(Shared Logic)选项到底怎么选
Xilinx的JESD204 PHY IP核在例化向导界面里有一栏“Shared Logic”,通常有三个选项:Include in core、Include in example design、As external。这个选项决定了GT参考时钟buffer、PLL、复位逻辑这些共享资源是放在IP核内部,还是由你在顶层统一例化。
如果你只用一个PHY IP核,选Include in core最省事。但如果你有多个PHY IP核,比如多片ADC、多片DAC同时工作,我强烈建议把Shared Logic选为As external,在顶层只例化一份GT的参考时钟管理逻辑,再分给多个PHY。这样既省资源,又能保证多路通道的时钟来源完全一致,避免不同IP核内部各自生成时钟导致相位偏差。这一点对于后面多通道共享设计非常重要。
3. 多通道共享设计的架构与同步机制
3.1 单PHY多Lane的物理层共享
多通道共享设计有两种典型场景:一是一个JESD204链路本身就有多条lane,比如8条lane跑10Gbps,这些lane天然应该在同一个PHY IP核里共享资源;二是同一个FPGA里有多条JESD204链路,例如4片ADC,每片4条lane,这就有多个PHY IP核共同存在。
对于第一种场景,IP核配置界面里直接把Number of Lanes设成8即可,8条lane共享一个参考时钟、共享一组PLL,物理上位于相邻的GT Bank里,走线结构最为简洁。有些设计会在外部通过一个参考时钟fanout给多个GT Bank,但这属于时钟树设计,不是IP核本身能解决的。
多通道共享的核心思路是:让所有相关lane的物理层配置、时钟来源、复位行为尽量一致,这样才能保证各条lane之间的数据传输延迟一致,后续链路层做通道对齐才有基础。
3.2 多IP核之间的时钟树规划
同一个FPGA里有多个JESD204 PHY IP核时,参考时钟怎么分配给各个GT Bank就是一门学问。FPGA里有专门的GT参考时钟布线资源,一个GT参考时钟引脚可以经过内部的时钟mux分发给相邻的多个Bank,也可以通过南北两侧的时钟路径跨越一定距离。
我的建议是在PCB设计阶段就要明确参考时钟拓扑:一片高精度低抖动的时钟芯片输出一路参考时钟,经过扇出芯片(例如一个1:4的时钟buffer)送给多个GT Bank的参考时钟引脚。这样各路参考时钟的相位一致性比较容易保证。SYSREF信号如果也要同步到多个PHY,也同样用专门的SYSREF分布方案,保证到达各片FPGA或者各片的时延差在要求范围内。
如果是在FPGA内部多个IP核之间共享,需要在顶层把同一个GTREFCLK引脚接到各个核的参考时钟输入上,并在每个核里通过GT_REFCLK_MUX把物理引脚映射对上。这一步做错了,IP核会报“No valid reference clock path”之类的错误。
3.3 复位时序与控制信号(gt_reset、reset、power_down)
多通道共享设计的另一个难点是复位时序。JESD204 PHY IP核通常有一堆复位相关信号,比如gt_reset、core_reset、reset、power_down,以及反馈状态的tx_reset_done、rx_reset_done等。这些信号的控制顺序有讲究,不对的话GT会一直处于复位或者不完全上电状态。
典型复位顺序是:先给GT参考时钟,等待PLL锁定,再释放整个GT的复位。具体到信号层面,大致是:
- 先拉低power_down,让GT进入工作模式
- 等待参考时钟稳定后,释放gt_reset
- 观察tx_reset_done/rx_reset_done,都拉高后再往下走
- 之后再释放core_reset或者配置相关逻辑的复位
这里的核心是“先时钟后复位、先PLL后通道”。你如果在参考时钟还没稳定的情况下就释放了GT复位,大概率会遇到CDR锁不住、同步一直失败的毛病。而且这个问题有时是你重新触发一次复位就能恢复的间歇性故障,非常隐蔽。
多IP核场景下,多个PHY的复位逻辑可以共用,但一定要注意释放次序的一致性,不能出现有些PHY已经run起来、有些PHY还在复位。你可以在顶层用一个统一状态机来管理所有PHY的复位释放,这样后续做多链路同步时才不会出现“都同步了,但复位先后不一致导致延迟偏差”的问题。
3.4 多设备SYSREF同步与确定性延迟
如果系统里有多个ADC/DAC,并且要求各通道之间的数据采样时刻严格对齐,那就必须用JESD204B的Subclass 1模式,配合SYSREF信号实现确定性延迟。所谓确定性延迟,就是每次上电之后,链路从发送端到接收端的传输延迟都是固定的,而不是随机的几个UI变化。
PHY IP核在这个环节的作用是采样SYSREF,产生对应的事件给上层链路逻辑,同时处理本地多帧时钟(LMFC)边沿和SYSREF的相位关系。Xilinx的JESD204 PHY IP核在配置界面会有一项SYSREF相关的选项,比如SYSREF可采样模式、在GT内部做SYSREF同步还是在外部逻辑里做,这些要根据你的系统结构选择。
实际调试时,SYSREF和GT参考时钟的建立保持时间非常关键。SYSREF到达PHY的时间必须稳定落在GT参考时钟的某个窗口里,如果SYSREF存在抖动或者到达时间不满足,那么确定性延迟就会被破坏,表现出来的症状就是同一套代码,上电十次有八九次数据对齐正常,偶发一两次全部错位。排查这类问题,一定要在示波器上测量SYSREF与参考时钟的时序抖动,而不要只盯着FPGA内部寄存器看。
4. Vivado中从IP例化到上板调试的完整流程
4.1 在IP Catalog里一步步配置JESD204 PHY
以Xilinx Vivado为例,在IP Catalog里搜索“JESD204”,能找到JESD204 RX、JESD204 TX和JESD204 PHY三个IP核。选择JESD204 PHY,打开配置界面。
第一页通常先选lane数量和线速率。先确认你的应用需要多少条lane,以及线速率是否在IP核支持范围内。然后填参考时钟频率,此时如果填的参考时钟频率和线速率不匹配,界面上会直接提示Non-integer ratio之类的警告。这个警告一定要重视,不要忽略过去。
第二页会有物理层的详细选项,包括TX预加重、RX均衡、差分摆幅、SYSREF相关配置,以及前文说的Shared Logic选项。我一般会先把Shared Logic设为Include in example design,等仿真或者初步上板验证没问题后,再改成As external做多核共享设计。这样调试时能省心一些。
4.2 顶层模块例化与端口连接
IP配置完成后,Vivado会生成一个example design模板,可以先看它自带的顶层连接方式。下面是一个简化版的JESD204 PHY顶层例化片段,展示了关键端口怎么接:
jesd204_phy_0 u_jesd204_phy_0 ( .core_clk (axi_aclk), .core_reset (~axi_aresetn), .s_axi_aclk (axi_aclk), .s_axi_aresetn (axi_aresetn), .tx_p (tx_p), .tx_n (tx_n), .rx_p (rx_p), .rx_n (rx_n), .tx_refclk_p (refclk_p), .tx_refclk_n (refclk_n), .sysref (sysref), .gt_tx_reset (gt_tx_reset), .gt_rx_reset (gt_rx_reset), .tx_reset_done (tx_reset_done), .rx_reset_done (rx_reset_done), .gt_rx_cdr_locked(gt_rx_cdr_locked), .tx_data (tx_data), .tx_sob (tx_sob), .rx_data (rx_data), .rx_sob (rx_sob) );重点看几个信号:tx_refclk_p/n接的是GT参考时钟输入;tx_data宽度和lane数、内部分频配置有关,是从上层JESD204 TX核送过来的并行数据;rx_data则是给上层RX核的并行数据;tx_sob/rx_sob是块同步起始信号,标记多帧边界。
这里最容易忽略的是复位逻辑。IP核输出不会自动帮你管理复位顺序,你需要在顶层用状态机控制gt_tx_reset、gt_rx_reset,等待tx_reset_done和rx_reset_done都拉高后再开始操作AXI4-Lite寄存器配置。
4.3 与JESD204 RX/TX IP核的握手关系
JESD204 PHY IP核的下游,通常接一个JESD204 RX或TX IP核。两者之间的数据接口是并行总线,时钟信号由PHY核对应的GT恢复或者发送时钟提供。举个例子,如果PHY配置的线速率是10Gbps,GT内部分频后可能得到线速率/40的并行时钟,也就是250MHz,那么PHY输出的rx_data位宽就是32bit(8B/10B解码后的有效数据),一次送32bit给上层JESD204 RX核处理。
当链路层进入ILAS阶段时,JESD204 RX核会对rx_data里的K字符进行扫描,找到多帧边界。这个阶段不需要用户逻辑干预,但你需要确保PHY核输出的rx_sob标记信号正确。如果PHY配置错误,或者CDR没有锁定,rx_data会一直是乱码,ILAS根本不可能通过。
上层JESD204 RX核通过AXI4-Lite接口提供状态寄存器,比如同步状态、错误计数等。上板调试时,不要光靠看数据对不对来判断PHY好坏,先读这些状态寄存器,能快速缩小问题范围。
4.4 上板观测:从CGS到ILAS再到用户数据
上板后我习惯按以下顺序检查:
- 第一,看GT参考时钟是否进入,测gt_refclk相关寄存器,确认PLL锁定;
- 第二,看tx_reset_done、rx_reset_done是否都拉高;
- 第三,看gt_rx_cdr_locked信号,锁不定就去查线速率、参考时钟;
- 第四,看JESD204 RX核的同步状态寄存器,确认CGS完成、ILAS已经收到;
- 第五,抓数据和ILAS参数,确认与发送端配置一致。
有条件的话,在ILA里同时抓rx_sob、同步状态、典型数据帧,能直观看到链路是否进入了正常数据阶段。如果一切正常,你会看到rx_sob按多帧周期稳定产生,rx数据按预期规律变化。这个过程跑通,PHY层的配置就算是过关了。
5. 高频坑点排查实录与调试心得
5.1 链路始终无法同步
这是最常见的故障,现象是JESD204 RX核状态机一直停留在CGS阶段,sync信号一直拉低。排查顺序别乱:
- 先确认PHY的rx_reset_done和gt_rx_cdr_locked状态,如果CDR没有锁定,多半是线速率、参考时钟不匹配,或者线速率超出了GT的能力范围;
- 再查参考时钟信号质量,用示波器测一下参考时钟的波形、频率是否稳定,很多偶发失败都是参考时钟频率漂移引起的;
- 最后才查上层协议参数配置,看K、F、L这些值是否两端一致。
我遇到过最诡异的一次,是参考时钟过孔位置在PCB上离参考地层太近,导致阻抗不连续,只有链路长时间跑高低温的时候才会间歇性失锁。排查这种问题,光靠逻辑分析仪看不出名堂,必须返回去做信号完整性和时序分析。
5.2 ILAS数据错误与参数不一致
同步完成了,但ILAS阶段抓到的参数不对,或者数据一直报错。这种情况多半是JESD204链路层的配置问题,比如发送端和接收端的L/F/K参数不一致。
但有一种情况容易忽略:PHY IP核的线速率虽然是10Gbps,但GT内部的参考时钟分频配置导致并行时钟频率实际上不是整数关系,从而造成字节边界错位,最终ILAS里的参数被错误解析。这时你需要回IP核配置界面,确认线速率与参考时钟比例是严格整数。非整数倍频的情况下,8B/10B的码边界会漂移,表现出来就是上层看到的K字符不对齐。
5.3 误码率居高不下
链路能同步,但跑一段时间出现比特错误,或者IBERT测试误码率下不来。这种情况基本指向物理通道的信号完整性问题。
先做背靠背测试:如果板上有两个GT,可以把TX通过短走线直接连到RX,检查是不是链路本身就有问题。没有条件的话,用Xilinx IBERT核,把所有lane都跑一遍眼图扫描,看每个lane的眼图张开程度和浴盆曲线。如果你发现某条lane眼图特别差,大概率是PCB走线有问题,或者对应的RX均衡参数没调好。另外看一下TX摆幅设置是否过小,有些设计中摆幅调大到800mV以上,误码率能降一个数量级。
还有一种容易忽略的地方是电源噪声。GT收发器对供电纹波很敏感,尤其是PLL供电。如果误码问题只在某些频率点恶化,试着测一下FPGA模拟电源的纹波,有时候更换一个去耦电容布局都能改善不少。
5.4 多板/多芯片同步不稳定
多芯片同步失败,十次有九次出在SYSREF时序上。SYSREF需要满足相对于GT参考时钟的建立保持时间,而且这个关系要稳定可重复。如果每次上电同步结果都不一样,优先怀疑SYSREF的到达时刻是否在参考时钟边沿附近,导致亚稳态。
排查方法很简单:用示波器同时测SYSREF和GT参考时钟,观察相对相位。如果SYSREF边沿在参考时钟的上升沿附近抖动,那你就需要调整SYSREF的PCB走线长度,或者在FPGA内部用可编程延迟单元把SYSREF整体移相。Xilinx也有动态调整GT参考时钟相位的方案,但那个比较复杂,一般先通过硬件延迟解决。
多片ADC同步时,要注意每片ADC的SYSREF路径延迟是否一致。如果四片ADC到FPGA的SYSREF走线长度差别很大,那你需要给每条SYSREF在FPGA内部做不同的延迟补偿。切记在PHY核配置界面里,把SYSREF相关选项打开,并保证所有PHY核采用同一套SYSREF处理逻辑。
5.5 几个调试顺序的独家建议
调试JESD204链路,我个人的经验是“分层验证、先简后繁”。别一上来就接真实的ADC/DAC,先用FPGA内部的PCS回环模式,让TX数据不经过外部走线直接回到RX,验证PHY和上层协议逻辑是否正确。回环通了,再切换成外部回环,把TX/RX短接,验证PCB走线和差分连接器。
这样一步步把范围缩小,能省下大量排错时间。我最初调试一块四通道ADC板子时,上来就直接连着真实ADC调,结果链路同步失败,我排查了整整两天,换过无数配置,最后发现是ADC输出synchronizer配置有问题,和FPGA侧PHY毫无关系。从那以后,我坚持先用回环验证FPGA侧,再接真实器件,问题定位效率高了很多。
另外,上板前一定要用IBERT把每条lane的眼图和误码率跑一遍,这一步等于给整个高速通道做个“体检”。如果IBERT都跑不过,那JESD204 PHY IP核配置得再漂亮也没有意义。IBERT测出来的裕量数据,也能直接指导你调整预加重和均衡参数。
JESD204 PHY IP核的调试,说到底就是三个字:时钟、复位、参数一致性。时钟要干净、频率要对;复位时序要按GT的要求严格管理;协议参数要两端完全一致。把这三点做到位,JESD204链路基本就稳了。我自己在做多通道板卡时,最深的体会是“PHY层是地基”,地基不稳,上面的链路层和应用层再努力也是白搭。所以如果读者朋友正在被JESD204同步问题折磨,不妨先回去把PHY核的配置逐项过一遍,也许真正的问题就在你最早忽略的那个参考时钟信号上。