8b/10b 编码是什么?为什么高速串行链路要做直流平衡和时钟嵌入?
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/10b25%逐字强制 DC 平衡PCIe Gen1/2、SATA、千兆/万兆 XAUI、JESD204B64b/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 时代保证串行链路可恢复、可对齐、电平不漂移的经典线路编码。