一、链路基础:高速串行链路架构
各位工程师朋友,咱们今天聊聊高速串行链路的基础。说实话,我做了十几年FPGA设计,最头疼的就是高速链路出问题。信号上不去,眼图睁不开,那叫一个抓狂。但基础打牢了,很多问题其实都能提前规避。
1.1 串行链路的基本构成
一条完整的高速串行链路,说白了就是三个部分:发送端(TX)、传输通道、接收端(RX)。我习惯把TX看成是"说话的人",RX是"听话的人",通道就是"空气"。你说话声音太小,或者环境太吵,对方就听不清——高速链路也是这个道理。
核心要点:高速串行链路的关键在于"恢复时钟"和"恢复数据"。发送端把时钟嵌入数据流,接收端再从数据流里把时钟"挖"出来。
1.2 TX(发送端)
TX负责把并行数据转成串行,然后通过差分对送出去。我见过不少新手,以为TX就是简单地把数据往外推。其实没那么简单。
- 预加重(Pre-emphasis): 高频信号在传输中衰减大,TX会提前把高频分量"加重"一点。我在一个10Gbps的项目里,预加重参数调了整整两天,眼图才打开。
- 输出摆幅(Output Swing): 信号幅度不是越大越好。太大了功耗高,太小了抗噪差。一般控制在800mV到1200mV之间。
- 阻抗匹配: TX的输出阻抗必须和传输线匹配。不匹配就会反射,反射多了眼图就塌了。
1.3 RX(接收端)
RX的任务更重。它要从被噪声污染的信号里,把原始数据恢复出来。我常说,RX是个"逆天改命"的角色。
- 均衡器(Equalizer): 补偿通道的衰减。CTLE(连续时间线性均衡器)和DFE(判决反馈均衡器)是两大主力。
- 判决电路: 把模拟信号转成数字的0和1。阈值设高了或低了,都会误码。
- CDR(时钟数据恢复): 这是RX的心脏,后面细说。
1.4 PLL(锁相环)
PLL是高速链路的"时钟源"。它负责产生稳定的高频时钟。我遇到过最坑的一次,就是PLL抖动太大,导致整个链路误码率飙升。
我的经验: 选PLL时,重点关注两个指标:抖动(Jitter)和锁定时间(Lock Time)。抖动要小于0.1UI(单位间隔),锁定时间最好在100μs以内。
1.5 CDR(时钟数据恢复)
CDR是接收端最核心的模块。它从数据流里提取时钟,然后用这个时钟去采样数据。说白了,CDR要解决两个问题:时钟频率对不对和时钟相位准不准。
CDR有两种主流架构:
| 架构类型 | 原理 | 适用场景 |
|---|---|---|
| 基于PLL的CDR | 用鉴相器比较数据边沿和本地时钟,调整VCO | 中低速链路(≤10Gbps) |
| 基于相位插值的CDR | 用多相位时钟,通过插值找到最佳采样点 | 高速链路(≥10Gbps) |
我个人更偏爱相位插值型的CDR。为什么?因为它锁定快,而且对工艺偏差不敏感。但代价是功耗大一些,面积也大。
避坑指南: 我曾经在一个25Gbps的项目里,CDR一直锁不住。查了三天,发现是参考时钟的抖动太大。记住:CDR的参考时钟必须干净,抖动要小于1ps RMS。
二、SerDes工作原理
SerDes是Serializer/Deserializer的缩写。它把并行数据转成串行发送,再把串行数据转回并行接收。你想想看,为什么非要这么折腾?因为并行传输在高速下根本跑不远——线间串扰、时钟偏斜,这些问题会让你崩溃。
2.1 发送路径
发送路径的工作流程:
- 并行数据输入: 一般是8位、16位或32位宽。
- 编码: 常用8B/10B或64B/66B编码。编码的目的是保证DC平衡,同时提供足够的跳变沿给CDR。
- 串行化: 用高速时钟把并行数据逐位串行输出。
- 驱动: 通过差分驱动器送到传输线上。
这里有个细节:编码后的数据速率会变高。比如8B/10B编码,每8位数据变成10位,速率增加了25%。所以你的PLL频率要算准。
2.2 接收路径
接收路径是发送路径的逆过程:
- 均衡: 补偿通道损耗。
- CDR恢复时钟: 从数据里提取采样时钟。
- 数据采样: 用恢复的时钟采样串行数据。
- 解码: 把编码后的数据还原成原始数据。
- 并串转换: 把串行数据转回并行。
关键点: SerDes的误码率(BER)通常要求小于10^-12。也就是说,每传输1万亿位数据,最多只能错1位。这个指标很苛刻,所以每个环节都不能马虎。
2.3 编码方式对比
| 编码方式 | 效率 | DC平衡 | 跳变密度 | 典型应用 |
|---|---|---|---|---|
| 8B/10B | 80% | 好 | 高 | PCIe Gen1/2, SATA |
| 64B/66B | 97% | 较好 | 中 | PCIe Gen3, 10G Ethernet |
| 128B/130B | 98.5% | 较好 | 低 | PCIe Gen4/5 |
效率越高,带宽利用率越好。但代价是电路更复杂,锁定时间更长。我一般建议:速率低于10Gbps用8B/10B,高于10Gbps用64B/66B或128B/130B。
三、眼图与浴盆曲线
眼图和浴盆曲线,是衡量高速链路质量的"金标准"。我每次调试链路,第一件事就是看眼图。眼图不好,后面什么都别谈。
3.1 眼图基础
眼图怎么来的?把接收到的信号波形,按位周期叠加起来。因为每个位的波形会重叠,看起来就像一只睁开的眼睛。所以叫"眼图"。
眼图能告诉我们什么?
- 眼高(Eye Height): 信号幅度的裕量。眼高越大,抗噪能力越强。
- 眼宽(Eye Width): 采样时间的裕量。眼宽越大,对时钟抖动的容忍度越高。
- 抖动(Jitter): 眼图交叉点的模糊程度。抖动越大,眼图越"毛"。
- 上升/下降时间: 信号边沿的陡峭程度。太慢会导致码间干扰。
我的习惯: 眼高至少要达到200mV,眼宽要大于0.6UI。低于这个值,我就会开始排查问题。曾经有个项目,眼高只有150mV,我加了均衡器后提到350mV,误码率直接降了三个数量级。
3.2 浴盆曲线
浴盆曲线,说白了就是误码率(BER)随采样位置变化的曲线。因为形状像浴盆,所以叫这个名字。
浴盆曲线有两个关键区域:
- 浴盆底部: 误码率最低的区域,也就是最佳采样点。
- 浴盆边缘: 误码率急剧上升的区域。采样点稍微偏移,误码率就飙升。
浴盆曲线的"开口"越大,说明链路的时序裕量越大。我一般要求浴盆底部宽度至少0.4UI,这样即使有温度漂移或老化,链路也能稳定工作。
3.3 眼图与浴盆曲线的关系
眼图和浴盆曲线是同一个事物的两个侧面。眼图看的是"形状",浴盆曲线看的是"误码率"。眼图好,浴盆曲线不一定好——因为眼图只反映信号质量,而浴盆曲线还包含了接收端判决电路的影响。
举个例子:眼图看起来很大,但接收端的阈值设偏了,浴盆曲线就会很窄。所以我的调试流程是:先调眼图,再测浴盆曲线,最后跑误码率测试。
避坑指南: 我曾经遇到一个案例,眼图看着不错,但误码率就是降不下来。后来发现是CDR的相位跟踪有问题,导致采样点一直在漂。浴盆曲线一测,底部宽度只有0.15UI。所以记住:眼图好≠链路好,一定要结合浴盆曲线和误码率综合判断。
四、本章知识体系
下面这张图,是我梳理的本章知识结构。你可以把它当成一个"地图",以后遇到高速链路问题,按图索骥就行。
嗯,这张图把本章的核心内容串起来了。链路架构是"骨架",SerDes是"血肉",眼图和浴盆曲线是"体检报告"。三者缺一不可。
好了,这一章就到这里。基础打牢了,后面讲故障排查时你才能游刃有余。记住:高速链路的问题,80%都出在基础上——时钟不干净、阻抗不匹配、均衡没调好。把这些搞明白了,你已经能解决大部分问题了。
公众号:蓝海资料掘金营,微信deep3321