3、信号编码与调制:PAM3调制原理、3B2T编码、MLT-3编码、扰码器原理
各位好,欢迎来到第三章。这一章我们聊聊信号在物理线上到底是怎么“跑”起来的。说白了,就是数字比特怎么变成模拟信号,再通过一对差分线传出去。
100BASE-T1 用的不是咱们常见的 NRZ 或者 4B5B 编码。它有一套自己的组合拳:扰码器 → 3B2T 编码 → MLT-3 调制 → PAM3 信号。我当年第一次看到这个链路时,心里也犯嘀咕:为什么搞这么复杂?后来踩了几个坑才明白——每一级都有它存在的理由。
核心链路速览
发送端:原始数据 → 扰码器 → 3B2T 编码 → MLT-3 调制 → PAM3 差分信号 → 线缆
接收端:线缆信号 → 均衡器 → 时钟恢复 → PAM3 解码 → MLT-3 逆映射 → 3B2T 解码 → 解扰 → 原始数据
3.1 为什么是 PAM3?
PAM3,全称是 3-Level Pulse Amplitude Modulation。它用三个电平来传输信息:+1、0、-1。每个符号携带 log₂(3) ≈ 1.58 比特。
你可能会问:为什么不用更简单的 PAM2(也就是 NRZ)?或者用 PAM4 不是效率更高吗?
我解释一下。100BASE-T1 的目标是在单对差分线上实现 100 Mbps 全双工。如果用 NRZ,符号率就得跑到 100 MBaud。这个频率在非屏蔽双绞线上,EMI 和串扰会非常严重。PAM4 虽然符号率能降到 50 MBaud,但它的信噪比要求更高,接收端的设计成本会翻倍。
PAM3 是个折中方案。它的符号率是 66.67 MBaud,比 NRZ 低了三分之一。三个电平的判决距离也足够大,普通 ADC 和均衡器就能搞定。我记得第一次用示波器看 PAM3 眼图时,三个“眼睛”张开得挺漂亮,心里踏实了不少。
| 调制方式 | 电平数 | 每符号比特数 | 符号率 (Mbaud) | 抗噪能力 | 实现复杂度 |
|---|---|---|---|---|---|
| NRZ (PAM2) | 2 | 1 | 100 | 中 | 低 |
| PAM3 | 3 | 1.58 | 66.67 | 高 | 中 |
| PAM4 | 4 | 2 | 50 | 低 | 高 |
个人经验:PAM3 的接收端需要三个判决阈值:+0.5V、0V、-0.5V。我在做样机调试时发现,阈值偏移 50mV 以上就会开始出现误码。所以建议在 PCB 布局时,把 ADC 的参考电压走线加粗、包地,远离开关电源。
3.2 3B2T 编码:把比特变成三进制符号
3B2T 编码,名字就说明了它的功能:每 3 个二进制比特(3 bits)映射成 2 个三进制符号(2 Trits)。
为什么要做这个映射?直接原因是为了匹配 PAM3 的传输格式。PAM3 每个符号有 3 种状态,两个符号就有 3² = 9 种组合。3 个二进制比特有 2³ = 8 种组合。8 种输入映射到 9 种输出中的 8 种,刚好够用。
编码表如下:
| 二进制输入 (3 bits) | 三进制输出 (2 Trits) | MLT-3 电平序列 |
|---|---|---|
| 000 | +1, +1 | +1V → +1V |
| 001 | +1, 0 | +1V → 0V |
| 010 | +1, -1 | +1V → -1V |
| 011 | 0, +1 | 0V → +1V |
| 100 | 0, 0 | 0V → 0V |
| 101 | 0, -1 | 0V → -1V |
| 110 | -1, +1 | -1V → +1V |
| 111 | -1, 0 | -1V → 0V |
注意看,编码表里没有出现 -1, -1 这个组合。为什么?因为 MLT-3 调制有一个约束:相邻符号之间不允许出现 -1 到 -1 的跳变。这个约束是为了控制信号的频谱形状,减少直流分量。我当初看标准文档时,对这个设计拍案叫绝——用 8/9 的编码效率,换来了更好的电磁兼容特性。
避坑指南:我曾经在 FPGA 里实现 3B2T 编码时,直接用了一个 8×2 的查找表。结果综合后资源占用比预期大。后来改成组合逻辑 + 多路选择器,面积缩小了 40%。对于量产芯片,建议用硬连线逻辑实现编码表,别偷懒用 ROM。
3.3 MLT-3 调制:三电平的“舞蹈”
MLT-3(Multi-Level Transmit,3 levels)是一种三电平的线路编码方式。它的核心规则是:
- 电平状态在 +1、0、-1 之间循环跳变
- 遇到输入符号 0 时,保持当前电平不变
- 遇到输入符号 +1 时,电平向正方向跳变一级
- 遇到输入符号 -1 时,电平向负方向跳变一级
- 跳变方向是循环的:+1 → 0 → -1 → 0 → +1
举个例子。假设输入的三进制符号序列是:+1, 0, -1, +1, 0, 0, -1。MLT-3 的输出电平变化如下:
初始电平: 0V
符号 +1 → 电平跳变到 +1V
符号 0 → 电平保持 +1V
符号 -1 → 电平跳变到 0V
符号 +1 → 电平跳变到 -1V
符号 0 → 电平保持 -1V
符号 0 → 电平保持 -1V
符号 -1 → 电平跳变到 0V
你发现没有?MLT-3 的输出电平变化频率比输入符号率低。因为遇到“0”符号时,电平不变。这就意味着信号的基频分量被压低了。100BASE-T1 的信号能量主要集中在 30 MHz 以下,这对 EMC 测试非常友好。
关键指标:MLT-3 的最大电平跳变频率是符号率的一半。对于 66.67 MBaud 的符号率,最大跳变频率约为 33.33 MHz。这比 NRZ 的 100 MHz 基频低了整整三分之二。
3.4 扰码器:让数据“白噪声化”
扰码器是信号链的第一级。它的作用很简单:把原始数据中的长连“0”或长连“1”打散。
为什么需要打散?因为如果发送端连续发送相同的比特(比如全 0 或全 1),PAM3 信号就会长时间停留在同一个电平上。这会导致两个问题:
- 时钟恢复困难:接收端的 CDR(时钟数据恢复)电路需要靠信号跳变来锁定相位。长时间无跳变,CDR 就会失锁。
- 频谱能量集中:低频分量过大,会干扰同一线束中的其他信号。
100BASE-T1 使用的扰码器是一个自同步扰码器,生成多项式为:
G(x) = x¹¹ + x⁹ + 1
这个多项式是什么意思?简单说,它是一个 11 级的线性反馈移位寄存器(LFSR)。当前输出比特等于输入比特与寄存器第 9 位、第 11 位的异或结果。
我画个简化的结构图:
输入数据 ──→ ⊕ ──────────────────────────→ 输出数据
↑ │
│ ↓
└── [R1]→[R2]→...→[R9]→...→[R11]
↑ ↑
└──── 反馈 ┘
实际工作时,发送端和接收端使用相同的多项式。接收端收到数据后,用同样的 LFSR 结构做逆运算,就能恢复出原始数据。
调试技巧:我建议在 FPGA 验证阶段,把扰码器的中间寄存器值通过调试接口引出来。如果发现接收端解扰后的数据全是乱码,先检查两端的 LFSR 初始值是否一致。100BASE-T1 标准规定初始值全为 1,但有些 PHY 芯片的实现可能有差异。
3.5 完整的发送链路示例
咱们走一个完整的例子,从原始数据到 PAM3 信号:
- 原始数据:
101 110 001 010(每 3 比特一组) - 扰码后:
011 100 111 001(假设扰码器输出) - 3B2T 编码:
0,+1 | -1,0 | -1,0 | +1,0(查表得到三进制符号) - MLT-3 调制:
0V → +1V → 0V → -1V → 0V → -1V → 0V → +1V → 0V - PAM3 信号:差分线上呈现对应的三电平波形
接收端做逆操作:PAM3 解码 → MLT-3 逆映射 → 3B2T 解码 → 解扰 → 原始数据。
注意:MLT-3 的逆映射不是简单的查表。因为 MLT-3 是有状态的——当前输出电平取决于上一个电平。接收端必须维护一个状态机,跟踪当前电平位置,才能正确还原三进制符号。我见过有工程师把 MLT-3 解码当成组合逻辑来做,结果误码率居高不下。
3.6 本章小结
100BASE-T1 的信号编码与调制,是一套精心设计的组合方案:
- 扰码器:消除长连 0/1,保证时钟恢复和频谱平坦
- 3B2T 编码:将二进制转为三进制,降低符号率
- MLT-3 调制:进一步压低信号带宽,改善 EMC
- PAM3:在单对差分线上实现 100 Mbps 传输
这套方案不是拍脑袋想出来的。它是在成本、性能、EMC 三者之间反复权衡的结果。我个人觉得,理解这四级处理链路的设计动机,比死记硬背编码表更重要。下次你拿到一块 100BASE-T1 PHY 芯片的数据手册,看到那些寄存器配置项时,就能明白每一级在做什么、为什么这么做。