链路层帧结构:帧、多帧、超帧概念
说实话,刚接触 JESD204B 的工程师,很少有人一开始就把帧、多帧、超帧这三层搞清楚。我当年调第一块 ADC 板子的时候,链路死活锁不上,翻着标准文档看了半天,最后发现是把多帧长度设错了。从那以后,我每做一个项目都会先把这三层的关系画在纸上。
帧(Frame)、多帧(Multiframe)、超帧(Superframe),是 JESD204B 链路层定义的三种数据单元。它们的关系很简单,就是层层嵌套——比如你想想看,帧是最小的可分割单元,多帧由若干帧组成,超帧又由若干个多帧组成。但每一层在调试中的角色完全不同。
基本帧结构
一个帧(Frame)是链路层数据传输的基本单位。JESD204B 的每个帧包含的数据量由参数 F 决定:一个帧里有 F 个八位字节(Byte),每个八位字节在串行链路上占用 10 个比特(8B/10B 编码后)。
这里要注意:你看到的 ADC/DAC 分辨率并不直接等于帧内的有效位数。比如一个 16 位转换器,可能会用 2 个字节来传输采样值,加上控制位或 padding。所以 F 是实际八位字节数,不是有效数据位数。
关键点:帧长度 = F × 1 字节(8b/10b 后 10 个 UI)。每个帧还包含一个帧时钟边界,解码器就是靠这个边界来对齐字节流的。
我在项目中见过最经典的错法:把 F 设成 1,但 ADC 输出 32 位数据,结果链路报错。因为 32 位需要 4 个字节,F 至少是 4。
多帧(Multiframe)
多帧是比帧高一级的逻辑单元。它的长度由参数 K 指定:一个多帧包含 K 个连续的帧。多帧最重要的作用是提供 多帧对齐 机制。在每个多帧的结尾,发送端会插入特定的对齐字符——比如 /A/、/C/、/S/ 等。接收端通过这些字符来识别多帧边界,从而完成 Lane 之间的同步。
嗯,这里有个坑:K 不能随便选。标准规定 K 的取值范围是 1 到 32,而且必须保证 K × F 不超过链路层能处理的最大八位字节数(具体与具体实现有关)。我调过一个 8-lane 的接收器,把 K 设成 30,结果多帧太长,接收端的 RAM 溢出。后来改成 16,问题就解决了。
避坑提醒:多帧的对齐字符只在多帧边界出现。如果你的 K 值过大,多帧内部的错误检测会变慢;过小又会导致频繁的对齐字符开销增加。我一般建议先从 K=8 或 K=16 开始调试。
超帧概念
超帧是最高一级的逻辑分组。它由若干个多帧组成,用于更高阶的同步,比如跨链路的一致性检查。JESD204B 标准中,超帧主要用于支持数据重传(Retransmission)或链路校准(Subclass 1/2)。
超帧的数量并不是固定的。在 Subclass 1 的确定性延迟场景中,超帧的长度往往跟本地多帧时钟(LMFC)对齐。说白了,超帧就是给整个系统一个“大的同步周期”,让所有 Lane 都能在这个周期内完成数据对齐。
我记得有次调试 Subclass 1,接收端的超帧边界没对上发射端,所有 Lane 的初始延迟一致,但每次上电都差几百皮秒。后来发现超帧的触发边沿没校准——其实不复杂,查一下 LMFC 计数器就知道了。
三者关系与参数配置
| 层次 | 组成 | 关键参数 | 调试作用 |
|---|---|---|---|
| 帧(Frame) | F 个字节 |
F(1~256) |
最小传输单元,字节对齐 |
| 多帧(Multiframe) | K 个连续帧 |
K(1~32) |
插入对齐字符,完成 Lane 同步 |
| 超帧(Superframe) | 若干个多帧 | 由系统时钟 / LMFC 定义 | 确定性延迟与跨链路一致性 |
实际配置时,你需要同时确定 F、K,以及其他参数(如 L、M、S)。它们之间有一个基本约束:每个转换器(Converter)在每个帧周期内输出 S 个采样点,每个采样点需要的字节数由分辨率决定。所以 F × L = M × S × (每个采样的字节数)。嗯,这个公式我写在笔记本第一页。
下面这张图清晰了展示三层嵌套关系,我每次培训都会拿它出来讲:
调试小技巧:如果你在逻辑分析仪上抓数据,先找 8b/10b 的逗号字(K28.5 或类似序列)来确定帧边界,然后数帧数找到多帧对齐字(/A/或/C/)。等你会用示波器稳定触发到超帧边界,那就算正式入门了。
最后再说一个我在现场遇到的怪事:A 公司的 FPGA IP 里超帧长度居然是固定的,根本不看你配的 K。我花了三周才查到是 IP 版本 bug。所以,别完全相信文档,动手量一下波形最可靠。
掌握了这三层结构,后续在看 Lane 同步、码组同步、帧对齐时,你就有一个清晰的坐标系了。