4、编码与解码技术:8B/10B编码原理、64B/66B编码原理、前向纠错(FEC)基础

各位做高速收发器的朋友,咱们今天聊聊编码解码。说白了,这就是给数据“穿衣服”的过程。你想想看,原始数据在高速链路上裸奔,肯定不行——没有时钟信息,没有直流平衡,跑着跑着就丢了。我这些年调试过不少链路,有一半的坑都出在编码选择上。

4.1 8B/10B编码:经典中的经典

8B/10B编码,说白了就是把8位数据映射成10位码字。为什么要多出2位?为了保证DC平衡和足够的跳变沿。

核心原理:

  • 将8位数据拆成3位和5位两部分
  • 分别用5B/6B和3B/4B编码表映射
  • 引入“运行差异度”(RD)控制极性

我记得第一次调PCIe Gen2的时候,链路就是起不来。后来发现是8B/10B编码的RD极性搞反了。嗯,这里要注意:RD初始值必须收发双方一致,否则解码全错。

关键特性:
  • 最大游程长度:5位(保证有足够跳变)
  • DC平衡:长期来看0和1数量相等
  • 编码效率:80%(10Gbps链路实际数据只有8Gbps)

特殊码字(K码):

8B/10B预留了12个K码用于控制。我习惯用K28.5做逗号码,因为它有独特的“0011111010”模式,便于字节对齐。曾经有个项目,接收端对齐逻辑写错了,结果每128个字节就错位一次,查了整整两天。

// 8B/10B编码示例(Verilog)
// 数据:0x5A (01011010)
// 编码后:10'b1010101010 (假设RD=-1)
// 注意:实际编码需要查表,这里只是示意

4.2 64B/66B编码:更高效率的选择

8B/10B效率只有80%,对于100Gbps以上的链路来说太浪费了。64B/66B应运而生,效率提升到97%。

编码结构:

  • 每64位数据块前加2位同步头
  • 同步头“01”表示数据块,“10”表示控制块
  • “00”和“11”为非法模式,用于错误检测

你可能会问:为什么不用8B/10B了?说白了,在25Gbps以上的速率,每浪费1%的带宽就是几百兆的损失。64B/66B用2位开销换64位有效数据,这笔账很划算。

我的经验:64B/66B的同步头检测一定要做“滑动窗口”匹配。我曾经遇到过连续3个错误同步头导致链路失锁的情况,后来加了容错机制才稳定。

加扰技术:

64B/66B通常配合加扰使用。我建议用自同步加扰(如X^58 + X^39 + 1多项式),这样接收端不需要额外同步。但要注意:加扰后的数据不能全0或全1,否则锁相环会失锁。

4.3 前向纠错(FEC)基础

FEC,说白了就是给数据加冗余,让接收端能自己纠错。我刚开始做光通信时觉得FEC可有可无,直到有一次在实验室看到误码率10^-12的链路加上FEC后直接降到10^-15……嗯,从那以后我再也不敢小看FEC了。

常见FEC类型:

类型 纠错能力 开销 应用场景
汉明码 单比特纠错 低 片内互连
RS码 多字节纠错 中 光模块
LDPC码 接近香农极限 高 400G以太网

FEC带来的代价:

  • 延迟增加:编码和解码需要时间
  • 带宽开销:冗余位占用有效带宽
  • 复杂度:解码器面积和功耗增加
注意:FEC不是万能的。我曾经在一个项目中,误码率高达10^-6,以为加上FEC就能解决。结果FEC纠错能力饱和,反而引入了更多错误。记住:FEC只能处理随机错误,对突发错误效果有限。

4.4 三种编码的对比与选择

我整理了一张对比表,方便大家选型:

特性 8B/10B 64B/66B FEC
效率 80% 97% 视开销而定
DC平衡 优秀 需加扰 不保证
时钟恢复 容易 较容易 需配合编码
纠错能力 无 无 有
典型应用 PCIe, SATA 10G/25G以太网 光通信, 无线

我的选型建议:

  • 速率低于10Gbps:用8B/10B,简单可靠
  • 10Gbps~100Gbps:用64B/66B+FEC
  • 100Gbps以上:必须用LDPC等强FEC

最后说一句:编码选择没有银弹。我见过有人非要在低速链路上用64B/66B,结果资源消耗大、延迟高,得不偿失。合适的才是最好的。

编码解码技术知识体系 8B/10B编码 5B/6B+3B/4B RD极性控制 K码对齐 效率80% 64B/66B编码 2位同步头 加扰技术 效率97% 滑动窗口检测 前向纠错FEC 汉明码 RS码 LDPC码 纠错能力 选型原则:速率匹配 + 效率权衡 + 纠错需求

可可精品资料库