第4章:传输层:数据映射与样本封装

传输层这个东西,说白了就是把ADC或者DAC的原始数据,包装成链路层能传输的“包裹”。你想想看,转换器出来的数据是一堆二进制数,怎么变成JESD204B链路上一帧一帧的信号?全靠传输层来干活。我记得第一次调JESD204B的时候,光是理解传输层就花了两天——后来发现,其实搞清楚数据怎么放的,后面就顺了。

4.1 传输层的职责

传输层夹在应用层和链路层中间。它不关心你的转换器是16位还是12位,也不管链路速率跑多快。它的任务很单纯:
把来自各转换器的样本,按照协议规定的规则,填入帧结构里,再交给链路层。同时,还能插入控制位、尾位这些玩意儿。

我的经验:调试初期,最容易忽略的是传输层和链路层的对齐。有一次波形不对,花了大半天查硬件,最后发现是传输层填充顺序搞反了。

4.2 样本封装结构

每个样本有多少位?由参数N决定。但JESD204B链路层传输是以8位字节为单位的。所以传输层要先对样本进行“字节对齐”。

怎么对齐呢?
如果N正好是8的倍数,直接拆分就行。如果N=14、16、12这些,就要补位。补的位叫“样本尾位”(Tail bits),由T参数控制。T通常是0,表示不补。但有的场景需要补到8的倍数,以便打包成整数个字节。

样本位宽N实际传输位宽是否需要补位常用T值
1212否(可非整数字节)0
1414否0
1616否0
2020否0
2424否0
3232否0

说白了,现在绝大多数转换器都是16位或14位,N=16时一个样本正好占2个字节,最省事。我有个项目用到AD9680,N=16,传输层几乎不用操心。

4.3 帧与多帧的关系

一帧里放几个样本?由参数F决定(每帧字节数)。但注意,F说的是字节数,不是样本数。样本数等于F * 8 / N(考虑字节对齐后)。
举个典型:F=2,N=16,那么每帧就是2个样本(每个样本2字节,共4字节,但F=2表示每帧2个字节?等等,这里容易混淆)。

澄清一下:参数F是“每帧的字节数”,不是样本数。之前我自己也搞反过。
如果N=16,每个样本占2字节,那么F=2时,每帧能放1个样本(因为2字节)。如果F=4,每帧能放2个样本。
所以帧频率就是采样率除以每帧样本数。这个在链路速率计算里很关键。

核心公式:
每帧样本数 = (F * 8) / (N + T) (向下取整,因为样本不能跨帧)
链路数据速率 = 采样率 × 每帧总位数(包括控制位) / 每帧样本数 × 链路数

4.4 数据映射规则

如果你的系统有4个ADC通道,通过1条链路传输,怎么分配?
传输层需要把每个通道的样本,排好序,放进链路帧里。这个顺序由参数S(每通道每帧的样本数)和L(链路数)共同决定。

固定映射:所有通道的样本从左到右排。比如通道0、1、2、3的样本依次放入帧字节。

动态映射:个别通道的数据可以交换顺序,或者合并。一般不用,芯片配置复杂。

我记得有次项目里ADC有8个通道,但只有4条JESD链路。当时照着数据手册配了M=8, L=4, S=1, F=4,结果波形错位。后来才发现S=1意味着每帧每个通道只放1个样本,但F=4放不下8个样本,算下来少了。最后调整了F才搞定。

曾经踩过的坑:参数S和M/L的关系很容易算错。建议用表格仔细核对:M = L × (每帧样本数) × S。每帧样本数由F、N算出来。

4.5 控制位与尾位

除了样本数据,传输层还能在样本后面附加控制位(CS)和尾位(T)。
CS位由参数CS控制,可以是0~3。每个样本后面跟CS个控制位,用于传一些状态信息。
T位呢,就是前面说的补位,让样本对齐到字节边界。

控制位实际用途:我见过有人用它传ADC的过压标志或温采模式。但大多数项目CS=0,省事。

4.6 一个实际案例

假设我们有:
- 2个ADC通道(M=2)
- 单链路(L=1)
- 每帧字节数F=4
- 样本位宽N=16, T=0,CS=0
- 采样率100MSPS
那么:
每个样本2字节。F=4,所以每帧能放2个样本(4字节)。
因为M=2,每个通道每帧只能放1个样本(S=1)。
心跳帧多帧数K取32。
链路速率:每帧32位(4字节 × 8),帧频率 = 100MHz / 2 = 50MHz,因此链路速率 = 50M × 32 = 1.6 Gbps。

怎么映射?
帧字节[0..1]放通道0样本,字节[2..3]放通道1样本。简单直接。

下面我用一张图来展示从ADC样本到链路的完整映射流程。

传输层数据映射流程(M=2, L=1, F=4, N=16) ADC 通道 0 ADC 通道 1 16位样本0 16位样本1 传输层映射 每帧放2个样本 字节对齐后 顺序排入帧 帧 (F=4, 共4字节) B0 B1 B2 B3 B0~B1: 通道0样本(高字节在B0?) B2~B3: 通道1样本 无控制位 (CS=0) 无尾位 (T=0) 注意:传输层不改变数据内容,只做封装。最终帧数据进入链路层进行8B/10B编码。 字节顺序(Big-Endian还是Little-Endian)由芯片厂商规定,建议查阅具体数据手册。

上面这张图展示了最简场景下的正向映射。实际项目里如果有多链路(L>1),传输层还要把样本轮流分到不同链路上。我习惯先画一个类似上面的数据流图,跟芯片手册一对,不然容易配错。

个人建议:调试阶段,先用最简配置(M=1, L=1, N=16, F=2)跑通数据通路,再逐步增加通道数和链路数。这样出现问题好定位是传输层的问题还是链路层的问题。