2. 高速串行链路基础:差分信号、编码方式(8b/10b、128b/130b)、预加重与均衡

各位做链路设计的同行,今天咱们聊聊高速串行链路最底层的几个核心概念。差分信号、编码方式、预加重和均衡——听起来都是基础知识,但我在项目里见过太多工程师在这上面栽跟头。说白了,这几个东西是链路能否稳定工作的地基,地基歪了,上层啥高级算法都救不回来。

2.1 差分信号:为什么非得拧成一股绳?

我记得刚入行时,有个老工程师跟我说:“你记住,高速信号永远别跑单端。” 当时我还不信,觉得差分就是多两根线、多耗点功耗。直到有一次我调试一块10Gbps背板,单端信号眼图完全是闭的,换成差分立马打开——那才真正明白差分的价值。

差分信号说白了就是用一对等长、等阻抗的线,传两个反相的信号。接收端看的是差值,不是对地电压。好处很明显:

  • 抗共模噪声:外界干扰同时耦合到两条线上,差分相减后噪声抵消。你想想看,PCB上那么多开关电源、数字总线,共模噪声到处都是,差分对就像穿了防弹衣。
  • 抑制EMI:两条线上电流方向相反,产生的电磁场互相抵消,往外辐射的噪声小很多。
  • 更好的噪声容限:差分摆幅可以做得很小(比如200mV),但抗噪能力依然很强。这有助于降低功耗。
个人经验: 差分对的等长和等阻抗是命根子。我曾经在12.5Gbps链路上只差了3mm的走线长度,结果眼图高度掉了15%。所以布局时宁绕远也要等长,同时严格控制差分阻抗(常见100Ω或90Ω)。

2.2 编码方式:8b/10b 和 128b/130b 怎么选?

原始数据直接扔到差分线上是不行的——没有足够的跳变沿,时钟恢复电路就无法锁定。所以我们需要编码,让信号本身“自带时钟信息”。

2.2.1 8b/10b 编码

8b/10b 把每8位数据映射成10位码字。多出的两位用来保证:

  • DC平衡:长期来看,0和1的个数差不超过2。这样信号不会积累直流分量,能通过交流耦合。
  • 足够跳变:最长连续相同位(run length)不超过5个。这保证了时钟恢复电路至少每5个UI能见到一次跳变。

8b/10b的编码效率只有80%,但实现简单、查找表成熟。我在PCIe Gen1/2、USB 3.0、SATA等接口上都见过它。它的开销是每传100个有效数据比特,实际线路上要传125个比特。

2.2.2 128b/130b 编码

随着速率越来越高,8b/10b那20%的带宽浪费让人心疼。于是有了128b/130b——每128位数据只加2位同步头,编码效率高达98.46%。同步头不是用来做DC平衡的,而是靠加扰器来避免长连0和长连1。128b/130b用在PCIe Gen3/4/5、USB 3.2、Thunderbolt等高速链路。

避坑: 128b/130b对加扰器的初始种子非常敏感。我曾经调试一条PCIe Gen4链路,发现某些数据模式下链路会周期性地失锁。后来排查两天,发现是加扰器种子没按规范同步,导致遇到特定位模式时run length超标。记住:128b/130b的链路必须保证加扰器在训练阶段正确初始化。
特性 8b/10b 128b/130b
编码效率 80% ~98.5%
最大run length 5 取决于加扰器,通常远小于5
DC平衡方式 有专用码表保证 加扰器+同步头
典型应用 PCIe Gen1/2, USB 3.0, SATA PCIe Gen3~5, USB 3.2, 100G以太网
实现复杂度 低(查找表) 中(需要加扰/解扰器)

2.3 预加重与均衡:跟信道损耗死磕

高速信号在PCB走线、电缆、背板上传输时,高频分量衰减比低频严重得多。结果就是眼图闭合、符号间干扰(ISI)严重。嗯,这时候就需要在发送端做预加重,在接收端做均衡来补偿。

2.3.1 预加重(Pre-Emphasis)

预加重说白了就是:发送端在信号跳变时故意“推一把”。比如从0变1时,在第一个UI灌一个大电流,然后维持阶段用正常电流。这相当于给信号的高频分量加了增益,提前补偿信道的低通特性。

常见的预加重配置有2-tap(前一个UI加上当前UI)或3-tap(再加一个后光标)。预加重的幅度和持续时间需要根据信道特性精细调节。我调试过一款25Gbps NRZ的SerDes,预加重系数写错了0.5dB,结果接收端眼图余量从15%掉到了3%。

2.3.2 均衡(Equalization)

接收端的均衡器负责把已经扭曲的信号恢复回来。主要有三种:

  • CTLE(连续时间线性均衡):模拟高通滤波器,补偿信道衰减。优点是功耗低、带宽高,但只能做固定形状的补偿。
  • FFE(前馈均衡):数字域或模拟域的多抽头滤波器,能灵活补偿信道响应。预加重其实就是发送端FFE。
  • DFE(判决反馈均衡):利用已判决的符号来消除后续符号的ISI。它对后光标ISI效果很好,但容易误码传播。

实际链路中,CTLE + DFE是最常见的组合。CTLE先把眼图打开到一定程度,DFE再消除残余的尾巴。

我的实践建议: 在AUX链路训练阶段,首先把预加重调到使CTLE输出眼图最优,然后再慢慢开启DFE。顺序不要搞反,不然DFE可能锁定到错误的方向,导致均衡器发散。我以前就是这样翻过车,后来改成先调CTLE再开DFE,链路训练成功率从92%提升到了99.8%。
高速串行链路基础结构图 高速串行链路基础结构图 发送端 (TX) 8b/10b 或 128b/130b 编码 预加重 (Pre-Emphasis) 差分驱动 传输通道 PCB走线/电缆/背板 损耗 + ISI + 噪声 差分对 (100Ω) 接收端 (RX) CTLE + DFE 均衡 时钟恢复 (CDR) 解码 (8b/10b或加扰解扰) 关键概念对应关系 • 差分信号:抗共模、低EMI、适合高速 • 编码方式:保证DC平衡和足够跳变沿 • 预加重:发送端补偿高频衰减 • 均衡 (CTLE/DFE):接收端恢复信号 链路训练协商 (AUX)

2.4 差分信号+编码+预加重/均衡:一个完整链条

你看上面的结构图,整个链路从发送端编码开始,经过差分传输,到接收端均衡恢复。每个环节都是环环相扣的。我做过一个项目,初期只关注了差分信号的阻抗匹配,忽略了编码的DC平衡特性,结果链路训练时CDR老是失锁。后来发现是因为数据直流分量漂移,导致耦合电容两端电压偏移——换用8b/10b编码后问题消失。

还有一次,信道损耗很严重,我单方面加大预加重幅度,结果发现接收端DFE饱和了,反而误码率升高。后来调整策略:降低一点预加重,增大CTLE的增益,让DFE只处理残留的短回声。这种组合优化,才是链路设计真正考验经验的地方。

一个小技巧: 在调试时,先固定编码方式(比如128b/130b),然后遍历预加重系数(比如-2dB到-8dB),记录每个系数下接收端CTLE+DFE收敛后的眼图高度和水平开度。选择使这两者都大于20%裕量的预加重区间。如果找不到,就要检查通道是否超出了SerDes的均衡能力极限。