第三章:串行与并行——为什么SerDes能“以一当十”
做高速接口设计这些年,我经常被问到同一个问题:“为什么现在大家都在搞串行,并行不是更快吗?一次传8位、16位,不比一次传1位快?”
这个问题,其实问到了点子上。今天我就结合自己的项目经验,跟你聊聊并行总线的瓶颈、串行通信的优势,以及SerDes到底是怎么实现“数据压缩”的。
3.1 并行总线的“甜蜜陷阱”
我刚入行那会儿,做的第一个项目就是并行DDR接口。那时候觉得并行总线真香——一个时钟沿下去,64位数据同时到位,带宽杠杠的。
但后来我发现,事情没那么简单。
并行总线的三大瓶颈:
- 时钟偏斜(Clock Skew):时钟信号到达每个接收端的路径不同,导致采样时刻不一致。频率越高,问题越严重。
- 数据偏斜(Data Skew):每根数据线的走线长度、负载电容不同,数据到达时间有差异。我遇到过最夸张的一次,同一组8位数据中,最早和最晚到达的差了将近500ps。
- 串扰(Crosstalk):并行总线通常有几十根线紧挨着走,相邻信号线之间的耦合电容和互感会让信号互相干扰。频率一高,波形直接“糊”掉。
你想想看,当频率从100MHz提升到1GHz,一个时钟周期只有1ns。如果数据偏斜占了0.5ns,留给有效采样的窗口就只剩0.5ns了。这还没算上时钟抖动、电源噪声……
说白了,并行总线在高速场景下,就像一群人挤着过独木桥——人越多,越容易出乱子。
3.2 串行通信:化繁为简的智慧
串行通信的思路其实很简单:既然一群人一起走容易乱,那就排成一队,一个一个过。
但你别小看这个“排成一队”。它带来的好处是革命性的:
| 对比项 | 并行总线 | 串行通信 |
|---|---|---|
| 数据线数量 | 8/16/32根 + 时钟线 | 1对差分线(2根) |
| 时钟偏斜问题 | 严重,需精确匹配 | 内嵌时钟,无偏斜 |
| 数据偏斜问题 | 严重,需等长布线 | 单通道,无偏斜 |
| 串扰 | 严重,需屏蔽/间距 | 差分对自身抗干扰 |
| 最高频率 | 通常< 1GHz | 可达几十GHz |
| PCB布线难度 | 高(等长、阻抗匹配) | 相对简单 |
我记得有个项目,客户要求把DDR3接口改成SerDes接口。改完之后,PCB层数从12层降到了8层,布线时间缩短了60%。这就是串行通信的魅力——用更少的资源,跑更高的速度。
3.3 SerDes如何实现“数据压缩”?
这里说的“数据压缩”,不是像zip那样把文件变小,而是指用更少的物理通道传输更多的数据。
SerDes的核心思想就四个字:串并转换。
打个比方:
并行总线就像8条车道同时跑车,但每条车道限速低(频率低)。
SerDes就像把8条车道合并成1条超级车道,限速提高8倍(频率提高8倍)。
最终的总吞吐量是一样的,但超级车道只需要管理一条路,简单多了。
具体怎么实现的?我画了一张图,你看完就明白了:
从图上你能看到:
- 发送端:并行数据进入串行器(Serializer),通过PISO(并行输入串行输出)结构,把N位并行数据转换成1位串行数据,以N倍于原时钟的频率发送出去。
- 接收端:串行数据进入解串器(Deserializer),通过CDR(时钟数据恢复)提取出时钟,再用SIPO(串行输入并行输出)结构还原成并行数据。
⚠️ 注意:
串行器的频率是并行时钟的N倍。比如8位并行数据,时钟100MHz,串行后的数据率就是800Mbps。
我曾经在项目里遇到过一个问题:串行器频率上去了,但功耗也跟着飙升。后来发现是PISO结构里的触发器尺寸没选对,换了一版低功耗库才搞定。
3.4 数据压缩的“魔法”到底在哪?
说白了,SerDes的“数据压缩”体现在三个层面:
- 通道压缩:N根数据线 → 1对差分线。PCB面积、连接器引脚数、线缆数量都大幅减少。
- 时钟压缩:不再需要独立的时钟线。时钟信息通过编码嵌入到数据流中,接收端用CDR自己提取。
- 带宽压缩:用更高的频率换取更少的通道。8根线各跑1Gbps,和1根线跑8Gbps,总带宽一样,但后者只需要处理一对差分线。
我做过一个对比测试:同样的8Gbps总带宽,并行方案用了8对差分线(16根线),SerDes方案只用了1对差分线(2根线)。布线密度降低了87.5%,信号完整性指标反而更好。
我的个人习惯:
在做系统架构选型时,如果总带宽需求超过10Gbps,我基本会直接选SerDes方案。低于这个阈值,并行总线在成本和功耗上还有优势。
当然,这只是经验值,具体还要看应用场景。
3.5 避坑指南
最后分享几个我在项目中踩过的坑:
- 别以为串行就不需要等长:差分对内的P/N线还是要等长,否则共模噪声会变成差模噪声。
- CDR的锁定时间要留够:有些CDR需要几微秒才能锁定,如果系统要求快速唤醒,这个时间可能成为瓶颈。
- 串行器的PLL相位噪声:我吃过一次亏,PLL的抖动太大,导致误码率超标。后来换了低抖动PLL才解决。
嗯,关于串行与并行的对比,今天就聊到这儿。记住一句话:并行是空间换时间,串行是时间换空间。SerDes就是用更高的频率,换来了更简洁的物理层实现。