2. 系统架构分层:物理层、链路层、传输层职责与交互
JESD204B 的协议栈分成了三层。说白了,就是把数据从一个芯片搬到另一个芯片这件事,拆成了三个不同专业的人来干。我刚开始接触的时候也觉得分层有点多,等你调试多了就会明白——不分不行,每一层都有它自己的麻烦事。
核心一句话:物理层管“连接”,链路层管“安全”,传输层管“格式”。搞清楚这三层,你就能看懂绝大多数眼图、CGS、ILAS 的测试结果。
2.1 三层总览
我们先看一张整体框架图,把三个层的角色和接口摆清楚。
数据流是从上往下走的。ADC 那边,传输层先把采样值打包成帧,链路层加扰和编码,物理层才把比特推出去。接收端正好反过来,物理层恢复时钟和数据,链路层做解码和解扰,传输层再把帧拆成采样值交给 DAC。
我个人习惯是,调试时从下往上查。大部分问题其实出在物理层,但如果你没搞清楚链路层的状态机,看到误码会一头雾水。
调试口诀:物理层不行改 PCB,链路层不行改配置,传输层不行改映射表。
2.2 物理层(Physical Layer)
物理层负责最底层的信号传输。它不管你的数据是哪个通道的样本,只管0和1能不能正确送到对面。物理层的核心就是一对差分线上的 CML 信号,加上时钟恢复。
物理层的关键职责:
- CML 驱动:电流模式逻辑,差分摆幅典型值 200~800 mV
- CDR:时钟与数据恢复,从数据边沿提取时钟
- 阻抗匹配:50Ω 单端对地(100Ω 差分),避免反射
- AC 耦合:串接电容,隔离收发器的直流电平
⚠ 常见坑:AC 耦合电容的容值不要取太小。我记得曾经遇到一个客户,用了 10 nF 的电容,结果低频分量被衰减,链路层初始化一直失败。建议用 100 nF 到 1 μF。
物理层的调试手段很有限,主要就是看眼图和测误码率。眼图张开度不够,八成是 PCB 走线有问题或参考时钟抖动太大。
2.3 链路层(Link Layer)
链路层是三层里最复杂的一层,也是调试时接触最多的部分。它负责初始化、对齐、编解码。
链路层的三大功能:
- 初始化序列:CGS(代码组同步) + ILAS(初始通道对齐序列),让所有 Lane 就绪并对齐
- 8B/10B 编解码:把 8 位数据变成 10 位码,保证直流平衡和足够的跳变沿
- 加扰/解扰:可选的自同步加扰,防止长串相同比特导致 CDR 失锁
为什么要加 8B/10B 编码?你想想看,如果 ADC 输出是固定的直流电平,长时间没有跳变,CDR 会漂走。8B/10B 保证任何情况都有足够的边沿。这个编码本身有 20% 的开销,8 Gbps 的 Lane 实际数据率只有 6.4 Gbps。
链路层的关键状态机:
| 状态 | 名称 | 收发双方的行为 |
|---|---|---|
| CGS | 代码组同步 | 发送端连续发 /K28.5/;接收端在连续 4 个帧时钟后锁定 |
| ILAS | 初始通道对齐序列 | 发送端发 4 个多帧的对齐数据;接收端完成 Lane 对齐和参数协商 |
| Data | 正常数据模式 | 传输用户数据,携带帧对齐和通道对齐字符 |
我建议你把链路层的调试重点放在 ILAS 阶段。ILAS 不出错,后面基本没问题。ILAS 里如果丢了对齐字符,传输层的帧解析肯定乱掉。
2.4 传输层(Transport Layer)
传输层是离用户最近的一层。你不用关心物理线上怎么传,也不管 8B/10B 怎么编码,你只需要告诉传输层:我有几个 ADC 通道(M),用几条 Lane(L),每个样本多少位(N),样本怎么排到帧里。
传输层的核心映射参数:
- M:转换器个数(每个转换器对应一个样本流)
- L:物理 Lane 数
- F:每帧包含的八位字节数
- K:每多帧包含的帧数
- N:样本分辨率(如 12、14、16 位)
- N':样本在帧内占用的总位数(包含填充位)
举个常见的例子:14 位 ADC,双通道(M=2),用 1 条 Lane(L=1),每帧 4 个字节(F=4)。这时 N' 可能是 16 位,多出来的 2 位是填充位。
个人经验:我在调试一个 4 通道 16 位 ADC 时,发现 Lane 数配错了(L 设成了 2,但 ADC 实际只支持 L=4 的映射表)。传输层一直报帧错误。后来仔细看手册,才知道还有 N'%8 为 0 这样的对齐约束。传输层不是你想怎么映射就怎么映射,得看器件支持的选项。
2.4 三层之间的交互关系
三层之间不是独立工作的。我直接说它们交互的要点:
- 物理层给链路层提供“时钟+数据”恢复后的比特流。链路层拿到比特流后,首先找 /K28.5/ 的边界。如果物理层的 CDR 不干净,链路层永远找不到对齐字符。
- 链路层给传输层提供“解码后的八位字节流”。传输层不管编码的事,它只拿到没有码型错误的数据。如果链路层的 8B/10B 解码出错,传输层收到的就是乱码。
- 传输层给用户提供“样本数据”。用户只看有没有帧错误、有没有样本丢点。如果传输层的映射表没配对,链路层和物理层跑得再好也没用。
⚠ 让我再次强调:三层之间有一个隐藏依赖——参数一致性。例如链路层的多帧长度 K,必须在传输层的 ILAS 参数里一致。发送端配 K=32,接收端配 K=64,ILAS 永远过不了。
最后附一张我在白板上常用的三层交互检查清单,回头排查问题时对着看:
| 问题现象 | 先查哪层 | 检查点 |
|---|---|---|
| Lane 始终不同步 | 物理层 | 时钟、眼图、AC 耦合电容 |
| CGS 通过但 ILAS 失败 | 链路层 | /K28.5/ 检测、帧时钟边界、对齐窗口 |
| ILAS 通过但持续报帧错误 | 传输层 | M/F/L/K 匹配、N'/N 映射、多帧对齐 |
| 数据有误码但链路层正常 | 传输层 | 样本顺序、填充位处理、CS 位状态 |