2. 链路训练流程:CGS、ILAS、数据层初始化

链路训练,说白了就是发射端和接收端先“握手”再“对话”的过程。我刚开始接触 JESD204B 时,总觉得这部分太啰嗦——不就是发数据吗?后来调了三次板子才明白:没有这三级训练,高速串行链路根本跑不稳。

整个训练分为三个阶段:CGS(码组同步)、ILAS(初始通道对齐序列)、数据层初始化。每一级都有严格的时序和判定条件,任何一个环节挂了,链路就起不来。下面我一个一个拆开讲。

2.1 CGS:码组同步 —— 先让收发双方“对上眼”

CGS 是整个训练的第一步。发射端持续发送 /K28.5/ 逗号字符(即 8b/10b 编码中的 K28.5 码组),接收端则在数据流中寻找这个固定模式。一旦连续检测到 4 个无误的码组,接收端就认为同步成功,然后拉低 SYNC~ 信号告诉发射端:“我看到了,继续!”

这个逻辑听起来简单,但实际调试时我踩过不少坑。记得有一次,接收端始终不拉低 SYNC~,用示波器看眼图明明很干净。后来发现是 FPGA 的 CDR(时钟数据恢复)模块锁定时间太长,导致前几个逗号字符被当成噪声丢弃了。嗯,4 个连续检测的要求其实是个保险——防止噪声误触发。但要是 CDR 还没锁定,你发 100 个逗号也没用。

个人经验: 我一般先检查接收端的 CDR 锁定指示灯,确认后再看 CGS 计数器的状态。很多调试工具(比如 Xilinx IBERT)可以直接读出“已检测到多少个 K28.5”,非常实用。

CGS 阶段的时序要求请看下表:

参数最小值典型值说明
SYNC~ 拉低前的逗号数48~12(建议)连续无误码组
SYNC~ 维持低电平时间1 个多帧周期—给发射端准备 ILAS
最大检测时间—50 μs(典型取决于参考时钟精度
避坑指南: 我曾经遇到一个奇怪问题——发射端连续发 K28.5,接收端却始终报“码组错误”。排查了两天,最终发现是 PCB 上 AC 耦合电容焊反了!CGS 阶段对低频成分敏感,耦合电容极性搞错会严重衰减逗号字符的直流平衡特性。所以,板子回来先量一下电容两端的直流电平。

2.2 ILAS:初始通道对齐序列 —— 把多条 lane 拧成一股绳

CGS 成功之后,链路进入 ILAS 阶段。发射端开始发送 4 个多帧(multi-frame)的特定序列,每个多帧以 /R/(K28.0)开始,以 /A/(K28.3)结束。第一个多帧还包含完整的 JESD204B 配置参数(比如 O、F、K、S 等)。

你想想看,如果有多条 lane,接收端怎么知道每条 lane 上数据的起始对齐位置?ILAS 就是干这个的。通过检测 /R/ 和 /A/ 的边界,接收端可以确定帧和多帧的起点,进而将多条 lane 上的数据在 帧时钟 上对齐。

我见过最典型的 ILAS 失败场景是:多帧长度 K 值不匹配。发射端设 K=32,接收端却按 K=16 来解析。结果 /A/ 字符永远对不上,ILAS 永远超时。所以我的习惯是——先固化一套最简单的参数(比如 K=4,F=1),等链路跑通了再改复杂配置。

关键参数:
  • K:一个多帧包含的帧数(JESD204B 标准规定 K∈[4, 32])
  • F:每帧的字节数(通常 1、2、4)
  • L:通道数(lane 数)
  • N / N':样本位数 / 封装位数
这些参数必须在 ILAS 的第一个多帧中广播给接收端,接收端会解析并检查是否与自身配置一致。不一致则上报错误。

ILAS 阶段的典型流程可以写成这么一段伪代码(实际调试时我会在 FPGA 内部抓波形确认):

// ILAS 接收状态机(简化版)
enum {WAIT_R, WAIT_A, FRAME_ALIGN, DONE} state;
if (state == WAIT_R) {
    if (data == K28.0) state = WAIT_A;
} else if (state == WAIT_A) {
    if (data == K28.3) {
        // 完成一个多帧对齐
        frame_count++;
        if (frame_count == 4) state = DONE;
        else state = WAIT_R;
    }
}
注意: ILAS 阶段不允许出现任何位错误或定界符误码。只要有一个 /R/ 或 /A/ 被错误识别,接收端就会重新触发 CGS。我遇到过因为电源纹波导致误码,ILAS 反复失败,最后在电源输出加了个磁珠才解决。检查 ILAS 时先看误码率,如果 BER 超过 10⁻¹²,多半是硬件问题。

2.3 数据层初始化 —— 最后的确认握手

ILAS 成功后,接收端会拉高 SYNC~ 信号(从低变高),告诉发射端:“配置收到,通道对齐完成,可以发正式数据了!” 发射端检测到 SYNC~ 变高后,开始发送正常的用户数据。

这一阶段最容易出问题的地方是 SYNC~ 信号时序。JESD204B 标准规定:接收端必须在 ILAS 最后一个多帧完成后,等待至少一个多帧周期才能拉高 SYNC~。而发射端收到高电平后,也要等 两个多帧周期 才能开始发数据。这个“握手延迟”如果没算对,双方就会错位,导致第一帧数据全是乱码。

我之前调一个 12.5 Gbps 的链路时,数据层初始化一直失败。用逻辑分析仪抓 SYNC~ 电平,发现接收端拉高后,发射端竟然 延迟了 3 个多帧 才发数据。查手册才发现发射端内部有个“同步窗口”寄存器,我默认填了 0,实际必须填 2。唉,多读两页数据手册能省一天调试时间。

调试小技巧: 在 ILAS 完成的那一刻,把 SYNC~ 信号和 DATA 放在同一个示波器窗口里捕获。正常情况下,SYNC~ 上升沿之后,数据会先有一段安静期(全是 /L/ 填充字符),然后才出现用户数据。如果安静期太长或太短,说明握手延迟有问题。

下面这张图展示了整个链路训练的流程,我建议你调试时把它贴在工作站旁边:

JESD204B 链路训练流程图 初始状态 CGS 阶段 检测 4 个连续 /K28.5/ ILAS 阶段 4 多帧对齐+参数广播 数据层初始化 SYNC~ 拉高,开始传数据 SYNC~ 拉低 SYNC~ 拉高 失败则重新回到初始状态 ⚠ 关键检查点 1. CDR 锁定 2. 误码率

图中紫色路径是成功流程:初始→CGS(检测到4个K28.5后SYNC~拉低)→ILAS(4个多帧对齐后SYNC~拉高)→数据层初始化(开始传用户数据)。橙色虚线是失败回退路径——任何阶段检测到错误,链路都会回到初始状态重新训练。

小结:三阶段环环相扣

拿我自己调过的几款 ADC 来说,大约 80% 的链路训练失败都集中在 CGS 阶段(CDR 没锁定或逗号检测不稳定),剩下 15% 在 ILAS(配置参数不匹配),只有 5% 是数据层初始化时的握手延迟问题。所以排查时我建议按这个顺序检查:

  1. 先确认物理层:时钟频率、眼图、CDR 锁定。
  2. 再看 CGS 状态:接收端是否连续收到了 4 个以上无误码的 K28.5。
  3. 然后验证 ILAS:用逻辑分析仪抓 /R/ 和 /A/ 的边界,核对 K 值。
  4. 最后查 SYNC~ 时序:上升沿之后的延迟是否符合标准。

只要你把这三个阶段的黑盒打开,链路训练失败就不再神秘了。说白了,就是发射端和接收端在“对暗号”——暗号对了,数据就通了。