搞硬件设计这几年,我最怕听到的一句话就是:“这板子上的SerDes接口点不亮。”如果是低速I2C、UART,拿示波器慢慢量总能找到问题;但SerDes这种高速串行链路,一旦上去就是Gbps级别,示波器探头一碰就是loading,信号直接变形,根本没法用常规手段去量。很多做单片机或者嵌入式硬件出身的朋友,第一次接触SerDes都会有这种无力感——明明照着参考设计画的板子,为什么就是不工作?这篇文章我就从SerDes硬件设计原理出发,把串行传输的核心机制、原理图到PCB的实操要点、信号完整性和均衡补偿这些关键环节一次讲清楚。内容不搞虚的,全部以我实际调试过的项目经验为基础,适合正在做DDR4、PCIe、SGMII、XAUI这类高速接口硬件设计的工程师,也适合刚从51单片机、低速总线转型做高速硬件的朋友作为入门参考。
1. 先从根上说清楚:SerDes到底在忙什么
1.1 串行与并行,一次带宽的博弈
要理解SerDes(Serializer/Deserializer,串行器/解串器),先得理解一个最朴素的问题:为什么要费劲把并行数据转成串行再传?
早年内部总线大多数是并行的,地址总线、数据总线一大堆,频率拉不高是因为并行总线存在两个绕不开的硬伤:一是布线通道太多,板级面积和走线资源撑不住;二是并行信号之间有skew(偏斜)问题,每根线的长度、过孔数量、参考平面稍有差异,数据到达的时间就不一致。随着速率上升,这个时间差相对于一个bit周期变得越来越大,总线就没法用了。
SerDes的思路是反过来的:在发送端把N bit并行数据通过移位寄存器或者内嵌的编解码逻辑转成1 bit串行数据流,在接收端再把1 bit串行流恢复成N bit并行数据。一句话概括,就是用时间换空间——用更高的速率去换更少的引脚。因为速率快,信号本身的上升沿、下降沿极陡,整个链路就必须按传输线理论来处理。
这里有个很多初学者容易懵的点:说“串行速率低”,那是误解。串行只是线路少,不是速度慢。比如一条10Gbps的SerDes链路,单通道速率就是10Gbps,一颗芯片常有几十条这样的通道。所以SerDes硬件设计的核心矛盾,从来不是在“算不算得过来”,而是在“这么高的速率下,信号还能不能保持完整到达对端”。
1.2 SerDes内部发生了什么:从并到串再到并
打开一颗SerDes芯片的datasheet,看到的框图通常是这样的:发送端有PISO(并行输入串行输出)、编码器、驱动器;接收端有均衡器、CDR(时钟数据恢复)、解码器、SIPO(串行输入并行输出)。看起来只是几个功能块,实际每个模块都不简单。
发送端的核心动作是把并行数据加上编码,变成带有足够跳变沿的串行码流。之所以要编码,是因为接收端需要从数据里恢复出时钟——如果发送一串全0或全1,接收端根本没法判断bit边界在哪里。常见的8b/10b编码会把8 bit数据变成10 bit码流,保证连0或连1不超过一定长度,并且保持直流平衡。更高速度下还有64b/66b、64b/67b等带扰码的方案。
接收端的工作就更苛刻了。它拿到的是一路经过信道衰减、噪声叠加、码间干扰的模拟波形,要做的事情是:先通过CTLE(连续时间线性均衡)和DFE(判决反馈均衡)把波形整形,再由CDR锁定相位,从恢复的时钟边沿采样数据,最后解码成并行数据。可以说,接收端是SerDes真正的技术核心。
1.3 为何不能按DDR4的方法来设计SerDes
热词里同时有DDR4硬件设计和SerDes,这俩放到一起看很有意思。DDR4虽然频率也到2400MT/s甚至更高,但它本质还是并行总线,靠的是源同步时钟——也就是发送端额外带一根时钟信号,接收端用这根时钟去采数据,所以DDR4布线的重点在“同组等长”,让数据和时钟的飞行时间匹配上。
SerDes不一样,绝大多数协议不传独立的时钟,接收端需要靠CDR自己从数据里恢复时钟。这意味着SerDes链路压根不存在“等长”这个概念吗?也不是,差分对内还是要等长,但不同lane之间要求就宽松很多,因为每一条lane都是独立恢复时钟的。
我经常和团队里的人说,做DDR走的是“对齐哲学”,做SerDes走的是“均衡哲学”。你把DDR那套思维硬套到SerDes上,比如给所有lane做严格等长、铺一整片地铜皮,往往不仅没帮助,还会引入不必要的过孔和残桩,适得其反。理解这个本质区别,是SerDes硬件设计入门的第一步。
2. 原理图设计:SerDes链路最容易被忽视的三个细节
2.1 参考时钟:整个系统的脉搏
SerDes的参考时钟是很容易被轻视、但一出问题就要排查好几天的点。SGMII、PCIe、10GE这些协议对参考时钟的频率精度和抖动都有明确要求,常见的是100MHz、125MHz或156.25MHz。很多人画原理图时直接从主控芯片拉一个时钟出来用,结果链路上误码率时好时坏,查到最后才发现参考时钟的抖动超标。
参考时钟的关键参数包括频率容差和相位噪声。比如PCIe要求参考时钟的长期频率稳定度在±300ppm以内,同时相位抖动要满足协议规范。实际设计中,我倾向于使用专用的低抖动振荡器或者时钟缓冲器,而不是让FPGA或者主控随便分频输出来用。PCB上参考时钟走线要短、要远离其他高速信号,同时建议包地处理——虽然高速差分对不主张包地,但时钟这种单端信号走线,包地确实能显著降低耦合噪声。
抖动这一项特别要提醒:SerDes的CDR是有一定抖动容忍能力的,但不是无限容忍。参考时钟的抖动会直接叠加到发送端的输出抖动上,进而影响接收端的眼图余量。这里面的逻辑关系可以用后面第4章的公式说明白,但原理图阶段只要记住一个原则:参考时钟的安静程度,决定了你整个SerDes链路的天花板。
2.2 AC耦合电容:位置、容值都有讲究
很多SerDes协议(如PCIe、SATA、XAUI)要求串行链路上串接AC耦合电容,也就是常说的隔直电容。它的作用主要有两个:一是隔离收发两端的直流工作点,让两端可以独立选择共模电压;二是配合接收端的端接电阻形成高通滤波,防止低频噪声进入接收通道。
电容容值的选取和协议有关。PCIe 3.0/4.0要求容值在176nF~265nF之间,常见选220nF;XAUI/SGMII这类千兆级链路通常用100nF或者220nF。选大了不行——低频截止点太低,无法有效隔直;选小了更不行——低频分量衰减太厉害,导致码流的低频成分损失,接收端均衡器压力剧增。
电容位置也值得抠一下。尽量放在发送端,靠近驱动器输出引脚,这样能减少连接到发送端焊盘的stub长度。我看到不少layout工程师喜欢把电容摆在链路正中间,理由是“对称好看”,实际上对于高速链路来说,对称并不带来电气性能优势,反而是离发送端越近越能减小传输线不连续的影响。电容的封装也建议用0402或更小的0201,因为越小的封装寄生电感越小,插入损耗越可控。
2.3 端接与共模电压:100Ω差分不是一句空话
SerDes差分对的差分阻抗通常要求100Ω,有些协议(比如USB 3.0)要求90Ω。这个阻抗不是靠一两颗电阻“端接”出来的,而是靠PCB叠层结构、线宽线距、参考平面共同决定的传输线特征阻抗。很多人画板时选了一组默认的差分线宽,觉得“大家都是100Ω”,实际上叠层一变,线宽线距不变,阻抗就跑了。
原理图阶段的端接,指的是在接收端的差分对之间加上交流端接。有些SerDes芯片内置了端接电阻,芯片外就什么都不用加;有些需要外部补齐。我的经验是,先对照datasheet确认芯片是否内端接,再决定外部要不要加。盲目加电阻会导致阻抗不匹配,产生反射,劣化信号质量。
至于共模电压,许多SerDes芯片的共模电压是内部产生或者需要外部电阻分压提供的。如果收发两端的共模电压不一致,即使有AC耦合电容隔离,也可能导致信号摆幅不足。调试时如果发现眼图上下不对称,先查共模电压,再看看AC耦合电容两端有没有偏置异常。
3. 从原理图到PCB:SerDes布线的实操方法
3.1 叠层与参考平面:先有好的“路”,才有好的信号
SerDes布线最重要的不是线怎么走,而是叠层怎么定。差分信号的阻抗,本质是由走线宽度、间距、介质厚度和介质常数共同决定的。在设计叠层时,要确保每一层差分信号都有一个完整、连续的参考平面,最好紧邻信号层,形成紧密的电磁场耦合。
举个实战例子,一块四层板,常规叠层是Signal-GND-Power-Signal,两个信号层分别紧邻GND层和Power层。如果走线参考的是Power层,Power层上的噪声和分割就会直接影响信号质量。所以对SerDes,我建议要么把走线层放在GND层旁边,要么确保Power层也是完整无分割的。高速设计中,参考平面必须是连续的,一条跨越分割槽的差分线,简直就是给自己埋雷。
差分线阻抗计算可以用Polar SI9000或Saturn PCB Toolkit,输入叠层参数算出线宽线距。一般100Ω差分对,在常规FR4上,线宽约4~5mil,线距约8~10mil(边到边距离),但这只供参考,实际必须根据叠层参数重新计算。距离参考平面越远,线就要越宽;介质常数越高,线就要越细,参数是联动的。
3.2 差分对内等长与对间长度:两种不同尺度
在第1.3节我提过,SerDes不要求全局等长,但差分对内等长是要做的。差分对内不等长意味着正负信号到达接收端的时间不一致,差分信号会部分退化为共模信号,导致电磁辐射增大、接收端差模分量减小。
对内等长的匹配精度一般要求控制在5mil以内,也就是0.127mm。这个数字听起来很小,实际上在Allegro或KiCad中可以通过长度约束来管理。要注意的是,做等长补偿时,蛇形绕线的拐角处尽量使用45度角或圆弧,不要用直角。拐角越锋利,阻抗突变越严重,蛇形线段本身的长度也会变成额外的容性负载。
对间长度则完全不用太紧张。SGMII、PCIe这类基于Embedded Clock的协议,每条lane独立恢复时钟,lane之间的skew只要在协议允许范围内就没事。有些协议比如XAUI还会做lane-to-lane deskew,就更不用担心。所以千万别把DDR4那种“整组走线误差不超过50mil”的思路用在SerDes上,那纯粹是给自己增加布线难度。
3.3 换层过孔与残桩:布线的隐性杀手
SerDes走线在复杂板卡上难免要换层,每换一次层就要打两个过孔(一个离开当前层,一个进入目标层)。过孔带来的寄生电容和电感会造成阻抗不连续,在10Gbps以上的速率下,一对过孔就能把眼图干掉一大截。
换层时最要紧的是给过孔提供回流路径。差分信号从信号层穿到另一个信号层时,电流回流也需要跟着换层,如果两个参考平面之间没有足够的过孔连接,回流电流就要绕远路,造成回路面积变大,辐射和串扰一起增加。实操中我会在换层过孔旁边至少加一对地过孔,距离尽量靠近,形成“信号过孔-地过孔-信号过孔”的三明治结构。
残桩是另一个容易被忽略的点。如果你用的是通孔(Through-hole via),过孔有一截没有使用的过孔段会形成残桩,就像一个短的传输线短线,在高速率下会产生谐振,造成信号反射。处理办法有两个:一是使用背钻工艺把不用的过孔段钻掉;二是干脆用激光盲孔或埋孔设计。对于10Gbps以上的设计,背钻基本是标配。
之前调试过一个10GE光口模块的板子,信号速率10.3125Gbps,刚开始眼图质量一直在协议标准的边缘徘徊。后来检查PCB,发现有一处SerDes走线换层后,过孔残桩长度达到32mil,把残桩背钻之后,眼图张开度直接提升了15%以上。这个案例我印象特别深,从此之后凡是10Gbps以上的设计,我都强制要求对SerDes换层过孔做背钻。热词里提到的rtl8261这类芯片,通常也是通过SerDes接口连接主板上的PHY或者交换芯片,虽然速率可能没那么夸张,但布线的思路是一样的,过孔残桩越小越好。
3.4 连接器区域的布线处理:这是最容易翻车的地方
SerDes信号如果要从板内连到板外,比如PCBA板对板连接器、SFP笼子或者标准PCIe插槽,连接器区域就是整个链路中最不连续的部分。连接器引脚本身有寄生电容,相邻引脚之间的串扰也很严重。
处理连接器区域的原则是:差分对进入连接器之前,尽量保持完整的参考平面;连接器下方的所有层都要铺地铜;不要在连接器正下方走其他信号。还有一点,连接器引脚处的stub要尽可能短,也就是说差分线最好是直接接到连接器焊盘上,而不是走过一段细线再连出来。
另外,连接器选型也直接影响SerDes性能。如果是10Gbps以上的链路,建议选择经过验证的高速连接器,脚距和屏蔽结构都会影响回流。不要图便宜选通用排针当高速连接器用,那是把模拟信号往火坑里推。
4. 信号调理与均衡:FFE/CTLE/DFE怎么配合
4.1 为什么要加均衡器:信号在信道里经历了什么
信号在PCB走线、连接器、电缆中传输时,介质的损耗和导体的趋肤效应会共同作用,对高频分量造成衰减。一个非常干净的方波信号,走了几十厘米之后,上升沿变缓、幅度变小,甚至相邻bit之间产生严重重叠,这就是码间干扰(ISI)。信道越长,ISI越严重,接收端完全没法直接判决出正确的0和1。
均衡器的思路就是“缺什么补什么”:既然高频衰减得多,那就在链路中补偿高频增益;既然前一个bit拖尾影响了当前bit,那就把前一个bit的影响减去。SerDes的均衡分为发端EQ(FFE)和收端EQ(CTLE、DFE),两者配合起来,才能把千疮百孔的波形恢复成可以判决的信号。
4.2 发端调FFE,收端调CTLE和DFE
FFE(Feed-Forward Equalizer,前馈均衡器)是发送端的“预失真”技术。它会在发送时对信号做一些额外的整形——把当前bit的边沿拉得更陡,同时把前后bit的幅度做一些调整,目的是一开始就对信道损耗做反向补偿。PCIe、10GBase-KR这些协议内部都有类似CTLE和DFE的均衡机制,所以不同速率的口互相连接时,经常会遇到两个设备自动协商均衡参数的场景。
CTLE(连续时间线性均衡)是接收端的第一道工序。它是一个模拟高通滤波器,对高频分量提供额外增益,用来补偿信道的低通特性。CTLE的增益不能调太高,否则高频噪声也会被一并放大,眼图看起来是大了,信噪比反而下降。
DFE(判决反馈均衡)是接收端的关键杀招。它根据前面判决出的bit值,对当前bit的接收阈值做校正,专门对付码间干扰。DFE的tap数量越多,消除ISI的能力越强,通常SerDes接收端会有1~5个tap。DFE的优点是不会像CTLE那样放大高频噪声,缺点是需要CDR先锁定,工作状态比较复杂,调试时需要和CTLE配合调整。
很多芯片提供自动协商和自适应均衡功能,硬件工程师在原理图阶段基本上只需要保证均衡器有正确的电源和配置接口,不用自己去算每个tap的系数。但如果需要手动调优,我的经验是:先固定发端FFE,扫CTLE找到眼图最大的点;再打开DFE,看能否进一步改善;最后再微调FFE,形成一个完整闭环。调优过程中记得记录每一组配置对应的眼图张开度,这个记录是后续排查问题的宝贵一手资料。
4.3 均衡参数的物理意义:一个类比帮你彻底理解
前面说了一堆全称和缩写,可能有些朋友已经看晕了。我用一个打电话的类比来总结一下FFE、CTLE、DFE各自在做什么。
假设你在嘈杂的房间里给远方的人打电话,对方说话声音又小又模糊。CTLE相当于你调大了高音旋钮,把模糊的辅音听得更清楚,但背景的嘶嘶声也大了;DFE相当于对方每说一句话,你就结合上一句话的内容,提前预判这句话有可能被“拖尾”影响的部分,自动在脑子里修正;FFE则相当于让对方说话的时候刻意咬字更清楚、语速更均匀,从源头上减少模糊。
这个类比虽然不精确,但足以帮初学者建立直觉:发端FFE是源头治理,收端CTLE是初步整形,收端DFE是精确纠错。三者配合得当,一条10Gbps的链路才能在普通FR4板材上稳稳跑通。
5. 上板调试:眼图、误码率与常见问题排查
5.1 眼图怎么看:快速判断SerDes健康状况
SerDes链路调试最有力的工具是眼图。把大量bit的接收波形按bit周期叠加在一起,就形成了眼图。眼图的横轴是一个bit周期,纵轴是电压幅度,中间张开的“眼睛”越大,说明信号的裕量越充足。
看眼图主要看三个指标:眼高(垂直张开度)、眼宽(水平张开度)和抖动。眼高反映了信号幅度裕量,眼宽反映了采样时刻裕量,抖动反映了时序的不确定性。协议通常规定了一个最低的眼图模板,只要眼图没有被模板压到,误码率一般就能达到要求。但工程上一定要留裕量,我习惯要求眼图的张开度比协议模板至少大10%~20%,否则批量生产时板与板之间的差异一出来,就可能出现偶发误码。
眼图测试要用示波器+专用探头或者直接使用芯片内置的环回测试功能。单独拿无源探头去点差分信号,那是测不准的,很可能测出比实际还差的眼图。有条件就买专用差分探头,没条件就尽量使用芯片内部的PRBS测试和误码率统计功能。
5.2 起手排查五步法:从时钟到链路再到端接
遇到SerDes链路不工作,我一般按下面这个顺序排查,效率最高:
第一步,检查参考时钟。用示波器确认参考时钟引脚上有正确的频率和电压摆幅,再看频谱,确认没有过多抖动和杂散。很多时候问题出在时钟缓冲器配置不对,或者时钟信号被临近的开关电源干扰。
第二步,检查配置寄存器。SerDes IP通常都需要初始化配置,确定速率、编码方式、均衡参数、环回模式等。上电后先确认芯片的link training状态,尤其是PCIe这类需要协商的协议,协商失败的原因可能在两端能力不匹配。
第三步,检查AC耦合电容。确保电容在位、值正确、焊接良好。可以用万用表量电容两端是否有异常短路,但更可靠的方法是回环测试——把发送端和接收端短接,看是否自环通过。
第四步,检查差分信号通断。用示波器确认发送端和接收端焊盘处有没有信号,幅度是否正常。如果发送端有信号、接收端没有,问题就在中间链路上;如果两端都没有,问题在源端。
第五步,才是检查信号质量。如果功能通了但误码率高,就要测眼图,看是均衡不足、反射严重还是噪声太大。这五步走完,绝大多数SerDes问题都能定位到具体环节。
5.3 常见问题速查表:这些年踩过的坑
我把多年调SerDes链路时遇到过的高频问题整理成一张表,方便大家对照排查:
| 现象 | 可能原因 | 处理方向 |
|---|---|---|
| 链路完全不通 | 参考时钟缺失/频率不对 | 检查时钟源和配置寄存器 |
| 偶发误码,时好时坏 | 电源纹波偏高或耦合噪声 | 检查SerDes电源的PDN,加去耦电容 |
| 眼图高度不足 | CTLE增益不够或摆幅太低 | 提高CTLE增益,检查驱动摆幅配置 |
| 眼宽明显变窄 | 抖动偏大,可能与参考时钟有关 | 检查时钟抖动,优化PCB走线 |
| 高速率能跑通,低速率反而报错 | AC耦合电容容值选择不当 | 核对协议要求的容值范围 |
| 一块板子好,一块板子坏 | 阻抗一致性差,PCB加工偏差 | 要求板厂阻抗测试报告,调整设计余量 |
| 靠近连接器处误码高 | 连接器区域回流不连续 | 加地孔,优化连接器区域铺地 |
这里特别提醒一下电源部分。SerDes的模拟电源和数字电源如果混在一起,或者去耦不充分,电源噪声会直接调制到信号上,表现为眼图的上沿、下沿出现“毛边”。我见过不少设计,信号链路本身画得很漂亮,结果电源没处理好,整板误码率就是压不下去。SerDes电源设计的原则是:模拟电源单独LDO供电,或者至少在靠近引脚处加磁珠隔离,去耦电容要从0.1uF、1uF、10uF多级组合,布局尽量靠近电源引脚。
5.4 低功耗无线芯片的SerDes接口:一个贴近实际的话题
热词里有rtl8723du这类无线模组芯片,这类芯片现在很常用,有些版本也会带有SerDes接口来连接主机或者PHY。很多工程师拿到这类芯片的硬件设计指南,看到SerDes字样就紧张,其实不必。低速率的SerDes(比如几百Mbps到几Gbps)在设计上有很大的裕量,只要把参考时钟、AC耦合电容、阻抗匹配三件事做对,基本不会出大问题。
我个人的建议是,第一次做SerDes相关的项目时,严格按照芯片厂商的参考设计来画,不要自创一套。参考设计中每一颗电阻、电容都有它的道理,特别是那些“看起来没用”的串阻、端接、共模扼流圈,一旦去掉,后期调试可能要花十倍的时间找回来。等做熟了之后,再根据实际需求裁剪。所谓“硬件设计入门”里的SerDes部分,其实就是一个“先原样复刻,再理解消化”的过程,千万不要在第一次设计时发挥创造力。
这个思路也适用于rtl8261的设备互联等场景——先照着demo板画,把参考设计吃透,再优化布局和成本。
6. 一个完整的调试案例:从眼图惨不忍睹到稳定传输
前几章讲了不少原理和技巧,这里分享一个比较完整的实战经历,可以帮你把知识串起来。
有一回做一款带10GE光口的主板,主控是某款FPGA,PHY芯片通过SerDes连接到SFP+光模块。板子回来后,试产三块板中有两块能正常起来,第三块一直报误码,眼图测试结果惨不忍睹——眼睛几乎是闭着的。
排查第一步,确认参考时钟没问题;第二步,确认寄存器配置和别人一样;第三步,量发送端波形,发现摆幅正常,到了接收端眼图就完全塌了。这个现象说明问题出在链路的中间段,于是拿放大镜查PCB走线,发现这个板子在加工时,有一处差分走线的参考平面被一颗大尺寸电容的焊盘打断,导致回流路径被迫绕行,形成了一个长达2cm的环路。
处理办法是在电容焊盘旁边补了几颗地过孔,把回流路径缩短,再重新打样后就稳定了。这个案例最大的教训是:SerDes链路的设计不仅是“走线好看就行”,参考平面的完整性比走线本身的长度更关键。一颗电容、一个过孔、一个螺丝孔的位置,都可能改变整条链路的性能。
所以说,做SerDes硬件设计,真正的功夫是抠细节。每一段走线、每一个过孔、每一颗去耦电容的摆放位置,都在为信号完整性服务。等你把这些细节都刻进下意识里,就会发现高速串行接口其实没有那么玄妙,它的设计逻辑是完全可以被理解和掌握的。
回看这几年做过的项目,我最大的感受是:SerDes硬件设计不是一门靠“公式套用”就能搞定的学问,它需要你在原理上想清楚,在实操中抠细节,在调试中积累手感。刚开始可以照抄参考设计,但一定要边抄边想为什么;遇到问题不要慌,按着时钟、链路、电源、均衡的顺序逐步排查,绝大多数问题都能定位到具体环节。每次调试完,记得把波形截图、寄存器配置、板卡状态记录下来,这些都是以后快速定位问题的宝贵财富。希望这篇文章能帮你少走一些我曾经走过的弯路。