8b/10b 编码是什么?为什么要直流平衡?
更新时间:2026-09-21。问题驱动短答页。SerDes 编码基础见 SerDes 8b/10b,时钟恢复见 SerDes CDR 与均衡。
一句话回答
8b/10b 把每个 8 位字节编码成 10 位再串行发送,代价是 25% 开销,换来两个关键性质:一是“直流平衡”——通过运行不一致(running disparity)机制,让链路上 0 和 1 的数量长期相等、平均电平不漂移,从而支持 AC 耦合和简单的判决;二是“保证有足够跳变”——数据流里频繁的边沿让接收端能用时钟数据恢复(CDR)PLL 从数据本身恢复出采样时钟,不必单独传一路时钟。它还定义了特殊的控制字符(K 字符),其中的逗号图案(如 K28.5)用来做字节边界对齐。更高速的标准(10G 以上)多用开销更小的 64b/66b 加扰码。
为什么需要它
高速串行链路有两个物理约束:
- 常传一条线、没有独立时钟:接收端必须从数据边沿里恢复时钟(CDR)。长时间连 0 或连 1 没有边沿,恢复时钟会漂移。8b/10b 限制连续相同比特数(最多 5 个),保证跳变密度。
- 常用 AC 耦合(串电容):电容隔离直流,要求数据的长期平均占空比为 50%,否则基线漂移、判决点偏移。8b/10b 用 running disparity 精确控制 0/1 数量平衡。
运行不一致(RD)怎么平衡
- 跟踪当前累计差:1 多为正、0 多为负。
- 很多 8b 值给了两个 10b 候选(一个 +2、一个 −2),发送时选能把 RD 拉回 0 的那个;中性码字则不改变 RD。
- 结果长期 0/1 数量相等,且相邻接收电路可直接检测 RD 错误辅助判错。
控制符与对齐
- K 字符(如 K28.5 = 0011111010)含独特“逗号”比特图案,正常数据不会连续出现,接收端用它锁定 10 位边界(comma detect),再做字节定界。
- 还可编码 idle、帧起始/结束、错误传播等带外含义。
与 64b/66b 对比
| 编码 | 开销 | 平衡方式 | 典型速率/接口 |
|---|---|---|---|
| 8b/10b | 25% | 逐字强制 DC 平衡 | PCIe Gen1/2、SATA、千兆/万兆 XAUI、JESD204B |
| 64b/66b | ~3% | 加扰(概率平衡)+ 2 位同步头 | 10GbE、PCIe Gen3+、Interlaken |
速率越高,25% 开销越肉痛,因此高代标准改用加扰,让 0/1 在统计意义上平衡并靠同步头定界。
常见坑
- 忘记 8b/10b 的 25% 带宽开销,按 10G 线速直接当有效数据率。
- comma 对齐没做或极性/位序弄反,解出乱码。
- disparity 错误被忽略,错失链路质量信号。
- 把 8b/10b 和加扰混为一谈:前者逐字强平衡,后者概率平衡。
总结
8b/10b 用 25% 编码开销把 8 位变 10 位,通过 running disparity 让 0/1 长期均衡以支持 AC 耦合直流平衡,并限制连 0 连 1 长度提供足够边沿让 CDR 从数据里恢复时钟,同时用 K28.5 等含逗号图案的 K 字符做字节定界和控制;更高速率为降低开销转向 64b/66b 加扰方案,它是 PCIe/SATA/SerDes 时代保证串行链路可恢复、可对齐、电平不漂移的经典线路编码。