4. 链路建立流程
好,咱们进入正题。JESD204B 链路能不能跑起来,全看这三步走得稳不稳:Code Group Synchronization(CGS,码组同步)、Initial Lane Alignment Sequence(ILA,初始通道对齐序列)、数据模式。说白了,这就是 JESD204B 物理链路从“死”到“活”的完整过程。我当年第一次调通这个流程的时候,对着示波器看了整整两天,后来发现是中间一个时序没卡对……嗯,这些坑我后面会一个个拆开讲。
4.1 三步走:链路建立的宏观图谱
链路建立不是一蹴而就的。它分三个阶段,每个阶段都有明确的目标和退出条件。我建议你把这个流程刻在脑子里:
- CGS(码组同步):接收端找“逗号”(K28.5),告诉发送端“我准备好了”。
- ILA(初始通道对齐序列):发送一连串特定数据帧,同步所有通道的帧边界和链路参数。
- 数据模式:正常用户数据或测试模式开始传输。
任何一个阶段卡住,后面都白搭。量产测试时你根本没时间慢慢查,所以必须提前吃透每一步的信号长什么样。
4.2 CGS(码组同步):让接收端找到节拍
CGS 是整个流程的起点。它的目标很简单:接收端找到发送端的“逗号”字符,从而确定字符边界。这里说的逗号,就是 /K28.5/(8b/10b 编码里的一个特殊控制字符)。
CGS 的完整步骤:
- 发送端:在未接收到 SYNC~ 信号有效之前,连续发送
/K28.5/字符。 - 接收端:拉低 SYNC~ 信号,表示请求同步。然后开始检测串行数据流中的
/K28.5/模式。 - 同步成功:连续检测到 4 个正确的
/K28.5/字符(没有错误),接收端认为字符边界对齐,拉高 SYNC~ 信号。 - 看门狗超时:量产测试中我会给这个阶段设置个硬超时,比如 5 毫秒。超时未同步,直接报错。
量产测试要点: CGS 失败最常见的原因不是芯片坏了,而是参考时钟抖动过大或差分信号幅度不够。我建议你在测试程序中加入一个状态机,实时监测 SYNC~ 信号的上升沿——如果超过 2 毫秒还没起来,大概率是物理层问题,而不是协议问题。
为什么是 4 个 /K28.5/?这是 JESD204B 标准规定的,太少容易误同步。接收端在检测到 4 个正确的逗号后,就知道每个字符的起始位置了。举个例子,如果你在示波器上看到 SYNC~ 信号在 200ns 内被拉高,说明硬件和时钟都没问题;如果反复拉低拉高,那叫“抖动同步”,多半是信号完整性灾难。
4.3 ILA(初始通道对齐序列):对齐所有通道的边界
CGS 成功后,接收端拉高了 SYNC~,这时候发送端就知道可以开始 ILA 了。ILA 的核心目标是让所有通道(Lane)在帧边界上对齐。多通道设计中,如果 ILA 失败,各通道之间会差一个或几个字节,数据就全乱了。
ILA 的帧结构:
ILA 序列由 4 个多帧组成,每个多帧内部包含特定的控制字符。我用表格给你拆解一下:
| 多帧序号 | 包含的控制字符 | 含义 |
|---|---|---|
| 多帧 0 | /K/ /R/ /A/ ... /A/ /R/ /A/ /A/ |
初始帧边界同步,/K/ 标记帧开始 |
| 多帧 1 | /Q/ + 链路配置参数 |
/Q/ 启动链路配置信息传输 |
| 多帧 2 | 链路配置参数(续) | 传递 K、F、L、N 等关键参数 |
| 多帧 3 | 链路配置参数(续) | 用于冗余校验(可选) |
个人技巧: 我在项目中遇到过 ILA 里的 /Q/ 字符丢失的情况,导致接收端链路参数没更新。后来我建议在测试程序里直接读一次 ILA 完成后的链路配置寄存器,和预期值做对比。这样能避免“以为同步了,其实配置是错的”这种隐形 bug。
ILA 过程中,接收端要检测到 4 个完整的多帧才能确认对齐。如果丢帧或者控制字符顺序乱了,接收端会再次拉低 SYNC~,回到 CGS 阶段。量产测试时,我建议你测量 ILA 的持续时间——通常在几微秒到几十微秒之间。时间太短可能是误同步,时间太长说明通信不畅。
另外,多通道情况下,所有通道的 ILA 必须同步完成。如果一个通道先完成,其他通道还没跟上,这没关系,但最终所有通道的帧边界必须一致。我用示波器量过,不同通道之间的帧对齐误差不能超过一个 UI(单位间隔),否则数据交叉时必然出错。
4.4 数据模式:正常工作的开始
ILA 完成后,链路进入数据模式。这时候发送端开始发送用户数据载荷,接收端按帧结构解析,输出采样后的数据。数据模式下的传输特性:
- 非同步字符:不再使用控制字符(
/K/、/R/等),全部是 8b/10b 编码的普通数据。 - 帧时钟连续运行:帧时钟和本地多帧时钟由 SYSREF 和参考时钟建立,数据模式期间保持稳定。
- 同步维持:接收端持续检测数据流中的帧差错(8b/10b 解码错误、字符边界错误等)。
- 失步处理:如果连续检测到 4 个错误(字符错误或帧失序),接收端会拉低 SYNC~,强制链路回到 CGS 阶段。
量产测试中,数据模式不仅仅是传用户数据。我们还会在数据模式里嵌入测试模式,比如:
- PRBS 模式:用伪随机码测试误码率。
- 交替模式:用交替 0/1 序列检测高频衰减。
- 低频模式:用长串相同 bit 检测直流漂移。
注意避坑: 有些 ADC 芯片在数据模式中会插入额外的同步字节(用于验证),这不是标准 JESD204B 规定的,但一些厂商会这么干。我经历过一个项目,测试程序按标准流写,结果 ADC 丢了一个同步字节,导致整个测试 batch 废了。后来我在 ILA 完成后等待 100 微秒再开始测试模式,问题解决。宁可在时序上多等一等等,也别急着发数据。
4.5 量产测试中的链路建立检查清单
好了,理论讲完了,我给你列个检查清单,直接抄到你的测试程序里:
- CGS 同步时间:从 SYNC~ 拉低到拉高,< 2 ms -> PASS。
- ILA 完成标志:读寄存器或测量差分线上的控制字符序列 -> 确认
/K/ /R/ /A/ /Q/完整出现。 - 链路配置参数:对比接收端寄存器和预期值(K、F、L、N、CS、CF 等)-> 必须完全一致。
- 测试模式误码率:PRBS 模式下,误码率 < 1e-12 -> PASS。
- 失步检测:强制插入错误,验证接收端能在 4 个错误后拉低 SYNC~。
我个人习惯把这 5 步做成一个自动化序列,跑一遍大概需要 3 毫秒。量产测试里每一毫秒都是钱,但这个流程省不了。链路没建好就测数据,那是浪费时间。
最后说一句:JESD204B 的链路建立不是玄学。只要参考时钟干净、差分信号幅度够、SYSREF 时序符合要求,CGS 和 ILA 应该一次通过。如果发现反复失败,先别急着改代码,拿示波器量一下波形——八成是物理层的问题。