物理层基础:SerDes收发器、差分信号、电气空闲状态
各位好,这是系列课程的第2讲。今天咱们聊聊PCIe物理层最底层的三样东西:SerDes收发器、差分信号和电气空闲状态。
说真的,这三样是PCIe能跑起来的基础。我当年刚接触PCIe时,总以为上层协议才是重点,直到被一块板卡来回折腾,才意识到物理层才是根基。你想想看,如果SerDes根本锁不住时钟,再好的链路训练协议也没用。
好,我们一个个来。
SerDes收发器:串行化的核心引擎
SerDes,全称Serializer/Deserializer,说白了就是串化器/解串器。PCIe是串行总线,但这个串行跟传统UART那种慢速串行可不一样。
我习惯这么理解:
- 发送端(TX):把并行数据(比如8bit、10bit、128bit)变成一串bit流,通过一对差分线发出去。
- 接收端(RX):把接收到的串行bit流再还原成并行数据。
这里的核心挑战是什么?
是时钟提取。PCIe不像SPI那样有单独的时钟线,它把时钟信息嵌在数据流里。接收端的SerDes内部有个PLL(锁相环),它得从数据流里恢复出时钟。这就是我们下一章要讲的
关键指标:SerDes的速率直接决定了PCIe的吞吐量。Gen1是2.5GT/s,Gen2是5GT/s,Gen3是8GT/s。数字越高,SerDes对信号质量的要求也越严格。
我记得我负责的第一块PCIe Gen3板卡,就吃了SerDes配置的亏。信号损耗模型没算准,眼图只开了不到40%。嗯,那种焦虑我现在还记得。
差分信号:抗干扰的秘密武器
为什么PCIe要用差分信号?而不是像早期PCI那样用单端信号?
原因很简单:噪声抑制。
差分信号由一对线构成:D+和D-。发送端让这两根线幅度相等、极性相反。接收端呢,只看它们的差值,不看值。
这样一来,共模噪声——比如电源纹波、地弹、外界电磁干扰——会在两根线上同时出现,接收端一相减,噪声就抵消了。
| 特性 | 差分信号 | 单端信号 |
|---|---|---|
| 噪声抑制 | 优秀(共模抵消) | 较差 |
| EMI | 低(近场相互抵消) | 高 |
| 电压摆幅 | 小(约200mV~400mV) | 大(3.3V或1.8V) |
| 功耗 | 更低 | 更高 |
| 抗干扰 | 强 | 弱 |
你看这个表格,几乎每个维度都是差分占优。这也是为什么高速串行接口几乎都用差分——SATA、USB、以太网、PCIe全是。
经验提示:做PCB布线时,差分对的两条线要等长、等宽、间距恒定。我见过太多因为差分线长度差了50mil导致眼图不合格的案例。严格控制在5mil以内比较稳妥。
我以前遇到过一个怪问题——板卡在实验室跑得好好的,一到客户现场就频繁掉链路。查了好多天,最后发现是差分线上的共模扼流圈型号不对,在低频时共模抑制比不够。你想想看,一个被动元件也能让链路训练失败。
电气空闲状态:Link的休息模式
如果说SerDes是心脏,差分信号是血管,那电气空闲状态就是——心跳暂停的瞬间。
嗯,这个比喻可能有点吓人。但确实如此。
电气空闲状态(Electrical Idle,简称EI)是PCIe链路的一种低功耗模式。当链路没有数据传输时,发送端的TX差分电压被拉到接近0V,VDIFFp-p小于10mV。接收端检测到这个电压,就知道发送端进入了空闲状态。
关键注意:电气空闲和逻辑Idle是两码事。逻辑Idle只是没有数据包,但信号还在跳变。电气空闲是物理上不跳了。接收端的EI检测电路必须非常灵敏,差之分毫,后果可能就是链路误判。
我来说说电气空闲的实际用途:
- 省电:链路不活动时,自动进入EI状态,功耗大幅下降。
- 链路复位:当发送端想启动链路训练时,会先退出EI状态,发一个电气闲退出序列(EIEOS)。接收端看到EIEOS,就知道“嗯,准备干活了”。
- 热插拔支持:设备拔掉后,链路自然落入EI状态,不会干扰其他设备。
我曾经调试过一个复杂的bug:设备在高温条件下偶尔会自动重启。看波形才发现,接收端的EI检测阈值在高温下漂移了,把正常的信号幅度误判成了空闲状态。这就是物理层硅片工艺的坑。
这里我们画一张SVG图,把三者的关系串起来。
图里的逻辑线很清楚:发送端SerDes把并行数据转成差分信号,经差分对传给接收端SerDes。没有数据传输时,链路进入电气空闲状态。需要重新通信时,发送端发一个EIEOS序列,把链路唤醒。
避坑指南:检查PCIe链路是否正常时,先看信号幅度。如果V_DIFFp-p只有几十毫伏,很可能是卡在EI状态没出来。我曾经在这个问题上浪费了一周时间。
好,这一章的内容就是这些。SerDes是起点,差分信号是通路,电气空闲是守门员。三者配合,PCIe链路才能正常工作。