2. 链路训练流程:CGS、ILAS、数据层初始化
链路训练,说白了就是发射端和接收端先“握手”再“对话”的过程。我刚开始接触 JESD204B 时,总觉得这部分太啰嗦——不就是发数据吗?后来调了三次板子才明白:没有这三级训练,高速串行链路根本跑不稳。
整个训练分为三个阶段:CGS(码组同步)、ILAS(初始通道对齐序列)、数据层初始化。每一级都有严格的时序和判定条件,任何一个环节挂了,链路就起不来。下面我一个一个拆开讲。
2.1 CGS:码组同步 —— 先让收发双方“对上眼”
CGS 是整个训练的第一步。发射端持续发送 /K28.5/ 逗号字符(即 8b/10b 编码中的 K28.5 码组),接收端则在数据流中寻找这个固定模式。一旦连续检测到 4 个无误的码组,接收端就认为同步成功,然后拉低 SYNC~ 信号告诉发射端:“我看到了,继续!”
这个逻辑听起来简单,但实际调试时我踩过不少坑。记得有一次,接收端始终不拉低 SYNC~,用示波器看眼图明明很干净。后来发现是 FPGA 的 CDR(时钟数据恢复)模块锁定时间太长,导致前几个逗号字符被当成噪声丢弃了。嗯,4 个连续检测的要求其实是个保险——防止噪声误触发。但要是 CDR 还没锁定,你发 100 个逗号也没用。
CGS 阶段的时序要求请看下表:
| 参数 | 最小值 | 典型值 | 说明 |
|---|---|---|---|
| SYNC~ 拉低前的逗号数 | 4 | 8~12(建议) | 连续无误码组 |
| SYNC~ 维持低电平时间 | 1 个多帧周期 | — | 给发射端准备 ILAS |
| 最大检测时间 | — | 50 μs(典型 | 取决于参考时钟精度 |
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 阶段的典型流程可以写成这么一段伪代码(实际调试时我会在 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;
}
}
2.3 数据层初始化 —— 最后的确认握手
ILAS 成功后,接收端会拉高 SYNC~ 信号(从低变高),告诉发射端:“配置收到,通道对齐完成,可以发正式数据了!” 发射端检测到 SYNC~ 变高后,开始发送正常的用户数据。
这一阶段最容易出问题的地方是 SYNC~ 信号时序。JESD204B 标准规定:接收端必须在 ILAS 最后一个多帧完成后,等待至少一个多帧周期才能拉高 SYNC~。而发射端收到高电平后,也要等 两个多帧周期 才能开始发数据。这个“握手延迟”如果没算对,双方就会错位,导致第一帧数据全是乱码。
我之前调一个 12.5 Gbps 的链路时,数据层初始化一直失败。用逻辑分析仪抓 SYNC~ 电平,发现接收端拉高后,发射端竟然 延迟了 3 个多帧 才发数据。查手册才发现发射端内部有个“同步窗口”寄存器,我默认填了 0,实际必须填 2。唉,多读两页数据手册能省一天调试时间。
SYNC~ 信号和 DATA 放在同一个示波器窗口里捕获。正常情况下,SYNC~ 上升沿之后,数据会先有一段安静期(全是 /L/ 填充字符),然后才出现用户数据。如果安静期太长或太短,说明握手延迟有问题。
下面这张图展示了整个链路训练的流程,我建议你调试时把它贴在工作站旁边:
图中紫色路径是成功流程:初始→CGS(检测到4个K28.5后SYNC~拉低)→ILAS(4个多帧对齐后SYNC~拉高)→数据层初始化(开始传用户数据)。橙色虚线是失败回退路径——任何阶段检测到错误,链路都会回到初始状态重新训练。
小结:三阶段环环相扣
拿我自己调过的几款 ADC 来说,大约 80% 的链路训练失败都集中在 CGS 阶段(CDR 没锁定或逗号检测不稳定),剩下 15% 在 ILAS(配置参数不匹配),只有 5% 是数据层初始化时的握手延迟问题。所以排查时我建议按这个顺序检查:
- 先确认物理层:时钟频率、眼图、CDR 锁定。
- 再看 CGS 状态:接收端是否连续收到了 4 个以上无误码的 K28.5。
- 然后验证 ILAS:用逻辑分析仪抓 /R/ 和 /A/ 的边界,核对 K 值。
- 最后查 SYNC~ 时序:上升沿之后的延迟是否符合标准。
只要你把这三个阶段的黑盒打开,链路训练失败就不再神秘了。说白了,就是发射端和接收端在“对暗号”——暗号对了,数据就通了。