3. 物理层基础:差分信号对(Tx/Rx)、PIPE接口、SerDes与时钟恢复(CDR)

各位同学,咱们今天聊点物理层的东西。很多人觉得PCIe物理层就是一堆模拟电路,数字工程师不用太关心。我当年也这么想,直到有一次板子调不通,示波器一抓,眼图烂得像一坨浆糊……嗯,从那以后我再也不敢小看物理层了。

说白了,PCIe能跑多快、多稳,物理层是地基。地基不稳,上层协议再牛也白搭。今天咱们就掰开揉碎,把差分信号、PIPE接口、SerDes和CDR这几个核心概念讲透。

3.1 差分信号对:Tx/Rx 的物理本质

PCIe用差分信号传输,这个大家都知道。但为什么非得用差分?我简单解释一下。

单端信号,比如传统的TTL/CMOS,一根线对地传信号。问题是地平面有噪声,信号一长,噪声就耦合进来了。差分信号呢?用两根线,一根传正相,一根传反相。接收端只看两根线的差值。你想想看,如果外部噪声同时耦合到两根线上,差值一减,噪声就抵消了。这就是共模抑制。

我在项目中遇到过一块板子,PCIe链路死活训练不过。查了半天,发现是Tx差分对的两根线走线长度差了200mil。嗯,就差了这么一点,时序就乱了。所以记住:

差分对等长布线是铁律。 一般要求长度差控制在5mil以内,阻抗控制在85Ω±15%(具体看协议版本)。

Tx是发送端,Rx是接收端。每个PCIe Lane包含一对Tx和一对Rx。注意,Tx和Rx是独立的,全双工工作。也就是说,数据可以同时双向传输。

信号 方向 说明
Tx+ / Tx- 发送 差分对,从本端发往对端
Rx+ / Rx- 接收 差分对,从对端接收

这里有个坑:有些新手会把Tx和Rx搞反,或者把差分对的正负极性接反。我曾经见过一块板子,Tx+接到了对端的Tx+,结果链路完全不通。记住,Tx接对端的Rx,Rx接对端的Tx。交叉连接,这是常识。

3.2 PIPE接口:数字与模拟的桥梁

PIPE接口,全称是PHY Interface for PCI Express。说白了,它是MAC层(数字逻辑)和PHY层(模拟电路)之间的标准接口。

为什么需要这个接口?因为PCIe的物理层实现很复杂,不同厂商的SerDes IP核接口可能不一样。PIPE接口标准化了MAC和PHY之间的通信协议,让数字工程师不用关心PHY内部怎么实现的。

我个人习惯把PIPE接口理解成「数字世界和模拟世界之间的翻译官」。MAC层发数据给PIPE,PIPE告诉PHY:该发数据了、速率是多少、要不要做电气空闲等等。

PIPE接口的主要信号包括:

  • TxData / RxData:数据总线,宽度一般是8位、16位或32位
  • TxValid / RxValid:数据有效指示
  • TxDetectRx / RxDetectTx:接收检测信号,用于链路训练时的接收器检测
  • PowerDown:功耗管理状态控制
  • Elastic Buffer:弹性缓冲,用于跨时钟域处理

这里我提一个实际经验。PIPE接口的时钟域处理非常关键。MAC和PHY可能工作在不同的时钟域,PIPE接口内部有弹性缓冲来处理这个问题。如果弹性缓冲配置不当,会出现数据溢出或空洞,导致链路不稳定。

避坑指南: 我曾经调试过一个PCIe Gen3的板子,链路偶尔会掉。查了三天,最后发现是PIPE接口的弹性缓冲深度配置小了,导致在连续大数据包时溢出。把深度从8改成16,问题解决。

3.3 SerDes:串行化与解串行化

SerDes是Serializer/Deserializer的缩写。它的工作很简单:把并行数据转成串行数据发送出去,再把接收到的串行数据转回并行数据。

为什么需要SerDes?因为PCIe是串行总线,但芯片内部处理的是并行数据。比如PCIe Gen3,内部数据总线可能是32位宽,但物理链路上只有一对差分线。SerDes负责这个转换。

SerDes的核心模块包括:

  • PLL(锁相环):产生高速串行时钟
  • Serializer:并转串,把并行数据按位串行输出
  • Deserializer:串转并,把接收到的串行数据恢复成并行数据
  • Driver:驱动差分对,输出合适的电压摆幅
  • Receiver:接收差分信号,放大并恢复数据

SerDes的速率直接决定了PCIe链路的带宽。比如PCIe Gen3,单 Lane 速率是8 GT/s(Giga Transfers per second),也就是每秒传输80亿个符号。SerDes必须能在这个速率下稳定工作。

我建议大家在选型SerDes IP时,重点关注以下几点:

  1. 抖动性能:总抖动(TJ)和随机抖动(RJ)要满足协议要求
  2. 功耗:高速SerDes功耗不小,注意散热
  3. 工艺节点:不同工艺的SerDes性能差异很大
  4. 预加重/均衡能力:高速信号在PCB上衰减严重,需要均衡补偿
注意: SerDes的预加重和均衡参数不是随便设的。我见过有人把预加重开到最大,结果信号过冲严重,反而导致误码率上升。正确的做法是通过眼图测试来调整参数,找到最优值。

3.4 时钟恢复(CDR):从数据中提取时钟

CDR,全称Clock Data Recovery,时钟数据恢复。这是物理层最神奇的部分之一。

PCIe是嵌入式时钟架构。什么意思?就是发送端不单独传时钟信号,时钟信息是嵌入在数据流里的。接收端必须从接收到的数据中恢复出时钟。

你想想看,没有单独的时钟线,接收端怎么知道什么时候该采样数据?这就是CDR的工作。

CDR的基本原理:

  • 接收到的数据流中有边沿跳变(0→1或1→0)
  • CDR检测这些边沿,与本地PLL产生的时钟进行相位比较
  • 通过反馈环路调整本地时钟的相位,使其与数据边沿对齐
  • 最终恢复出与发送端同步的时钟,并用这个时钟来采样数据

CDR的关键指标是锁定时间和抖动容限。锁定时间决定了链路训练的速度,抖动容限决定了CDR能容忍多大的时钟抖动。

我在项目中遇到过CDR锁不上的情况。查了半天,发现是发送端的数据流中连续相同的bit太多,导致数据边沿太少,CDR无法锁定。PCIe协议中用了8b/10b编码(Gen1/2)或128b/130b编码(Gen3+)来保证数据流中有足够的跳变,就是为了解决这个问题。

核心要点: CDR的锁定过程是链路训练的第一步。如果CDR锁不上,后面的所有训练步骤都无法进行。所以物理层调试时,第一件事就是确认CDR是否锁定。

CDR的常见问题:

  • 锁定失败:数据质量太差,或者参考时钟偏差太大
  • 锁定后失锁:数据流中出现长连0或长连1,或者电源噪声干扰
  • 锁定时间过长:PLL带宽设置不当,或者初始相位差太大

嗯,这里要注意。CDR的PLL带宽设计是个权衡。带宽宽,锁定快,但对抖动敏感;带宽窄,锁定慢,但抗抖动能力强。一般PCIe Gen3的CDR带宽在几MHz到十几MHz之间,具体看实现。

3.5 实战经验总结

讲了这么多理论,最后给大家总结几条实战经验:

  1. 差分对布线:等长、等宽、等间距,远离其他高速信号
  2. PIPE接口调试:先确认时钟域正确,再检查弹性缓冲配置
  3. SerDes参数:不要盲目加大预加重,用眼图说话
  4. CDR锁定:链路训练的第一步,锁定失败先查数据质量和参考时钟
  5. 电源完整性:SerDes对电源噪声极其敏感,去耦电容不能省

我记得有一次,一个同事调了半个月的PCIe链路,各种寄存器配置都试过了,就是不稳定。最后我让他用示波器抓一下电源纹波,发现SerDes供电的纹波有100mV。换了更好的LDO,纹波降到20mV,问题立刻解决。所以,物理层的问题,很多时候是电源的问题。

好了,这一章的内容就到这里。物理层是PCIe的根基,理解透了,后面的链路训练和初始化才能学得轻松。下一章咱们正式进入链路训练状态机,那才是真正精彩的部分。