ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

高速PCB走线长度到延时:等长、偏斜与时序余量实战

高速PCB走线长度到延时:等长、偏斜与时序余量实战 很多人第一次意识到「走线长度」和「信号质量」之间有关系都是在板子已经打样回来之后。我至今记得那块四层工控板MCU 通过并行接口读一颗 12 位 ADC采样率提到 40MHz 就开始偶发错码示波器上看波形并没有明显畸变眼图也还开着。折腾了三天最后发现问题出在时钟线和数据线差了 800mil——换算成延时也就 120ps 左右可它偏偏就落在那颗 ADC 的建立时间窗口里。这件事给我的教训是走线长度本身不是问题长度差换算出来的时间差才是问题。而时间差要和芯片手册里的建立保持时间、偏斜预算、单位间隔去比才知道到底够不够。这篇文章就把「长度怎么变成时间」「多长算长」「等长要做到什么精度」「绕线补偿放在哪里」这几件事一次讲清楚适合做硬件、PCB Layout、嵌入式驱动的朋友尤其是刚接手高速接口、还没建立起数量级概念的人。1. 走线长度不是长度是时间先把皮秒算清楚1.1 铜箔上的信号比你直觉里慢得多信号在 PCB 里跑不是光速。它在介质包围的铜线上传播速度由周围材料的等效介电常数决定v c / √εeff其中 c 约等于 30cm/ns真空/空气中的光速。FR4 板材的 εr 一般在 4.2~4.5 之间但外层微带线只有一半被介质包围另一半是空气所以它的等效介电常数 εeff 会明显低于 εr典型值在 3.0~3.5。内层带状线上下都被介质包住εeff 基本就等于 εr。代入算一下。微带线取 εeff3.3则 v 30/1.817 ≈ 16.5cm/ns换算成延时就是每厘米 60ps也就是每英寸约 150ps1mil 约 0.15ps。带状线取 εeff4.3v 30/2.074 ≈ 14.5cm/ns每英寸约 175ps1mil 约 0.175ps。走线类型典型 εeff传播速度单位延时1mil 对应延时外层微带线3.0~3.5约 16.5cm/ns约 150ps/inch约 0.15ps内层带状线4.2~4.5约 14.5cm/ns约 175ps/inch约 0.175ps这张表建议你贴在工位上。后面所有的等长容差、蛇形长度、偏斜预算都是从这几个数字推出来的记住「外层 6ps/mm、内层 7ps/mm」这个大数做设计时估算会快很多。1.2 为什么必须换成延时才能和芯片手册对话芯片手册从来不告诉你「数据线和时钟线的长度差不能超过多少 mil」它只会写 Tsu建立时间、Th保持时间、Tco时钟到输出延时、以及允许的输入偏斜。这些全是时间单位。你要做的翻译工作就是把 PCB 上的长度差乘以每单位长度的延时得到时间差再塞进时序方程里看还有多少余量。举个具体的例子。某源同步接口周期 10ns芯片给出的接收端建立时间要求 1.5ns发送端 Tco 窗口 ±0.8ns那么留给板级的余量大约是 10 - 1.5 - 1.6 - 抖动(假设 0.3ns) ≈ 6.6ns。看起来很多但如果时钟走线和数据走线差了 2000mil微带线上就是 300ps已经吃掉了 4.5%。当接口速率翻四倍、周期缩到 2.5ns 的时候同样的 2000mil 长度差占比瞬间变成 12%余量被啃掉一大块。更麻烦的是很多工程师只在布线阶段做等长却忘了过孔、连接器、芯片封装内部走线也在消耗时间。一颗 BGA 的封装内走线可能就有几百 ps 的差异这是你在 PCB 上看不见的必须在时序预算里提前扣掉。我个人的习惯是拿到手册第一件事不是打开 PCB 工具而是先在表格里把「总预算 - 封装 - 连接器 - 过孔 - 抖动」逐项减掉剩下的才是留给 PCB 走线的部分再除以 6ps/mm直接得出长度容差。这个顺序反了后面的等长就是白做。1.3 波长与电长度短线什么时候变成长线判断一段走线是「短线」还是「长线」看的不是它的绝对长度而是它相对于信号波长的比例。波长公式λ v / f还是用微带线 16.5cm/ns 来算100MHz 时 λ ≈ 165cm1GHz 时 λ ≈ 16.5cm5GHz 时 λ ≈ 3.3cm。同样的 5cm 走线在 100MHz 下只占波长的 3%完全可以当集总参数元件看到了 5GHz 就占了 1.5 个波长是彻头彻尾的分布参数网络。但这里有个特别容易踩的坑决定一段走线是不是「长线」主导因素不是时钟频率而是边沿速度。一个 1MHz 的方波如果上升时间是 200ps它的频谱能量可以一直延伸到 1.75GHz 附近用 BW ≈ 0.35/tr 估算转折频率 f_knee ≈ 0.5/tr 2.5GHz。也就是说一个低频信号照样能激发出高频的传输线效应。所以正确的心智模型是先看驱动器的上升时间算出转折频率再判断走线电长度。工程上常用的宽松判据是「走线长度小于 λ/10 时可以按集总参数处理」这里的 λ 要用转折频率对应的波长而不是时钟频率的波长。很多板子低频跑得好、一提速就出问题本质上就是边沿变快之后原本的「短线」一夜之间变成了「长线」。2. 长度开始「咬人」的三种典型方式2.1 时序窗口飞行时间差把建立保持余量一点点磨掉第一种也是最常见的一种就是时序。这里要引入一个概念叫飞行时间flight time指信号从驱动器输出端出发经过走线到达接收端所花的时间。注意它不是单纯的走线延时而是包含了驱动器输出阻抗与线阻抗相互作用、负载电容充电在内的整体时间。在一个源同步接口里数据信号和它的采样时钟分别走不同的路径。如果这两条路径的飞行时间不一致采样点就会在数据眼图上偏移。偏移量小的时候表现为误码率上升、眼图余量变小偏移量大的时候直接就是固定位置的采样错误而且往往和温度、电压有关——因为驱动器的 Tco 会随 PVT 漂移原本勉强够用的余量在某些角落条件下就崩了。我见过最典型的一种情况时钟线为了避开一个大的电解电容绕了一个大弯多走了大约 1500mil也就是 225ps。板子在常温实验室里跑得好好的一进高低温箱-20℃ 就开始丢包。原因就是余量本来只剩不到 100ps温度一变芯片内部延时漂移就把这点余量吃干净了。所以时序余量永远要按最坏角落算不能按实验室实测的那一组数。2.2 反射与振铃长线把寄生电容变成了传输线第二种是反射。短走线在驱动器眼里就是一个集总电容充电曲线是单调的指数上升。当走线变长超过了临界长度之后它就变成了一条有特征阻抗的传输线信号到达末端如果阻抗不匹配就会反射回来和入射波叠加形成过冲、下冲和振铃。反射系数用下面这个公式描述Γ (Z_L - Z_0) / (Z_L Z_0)假设线阻抗 Z_0 50Ω接收端是高阻输入近似开路那么 Γ ≈ 1几乎全反射。反射波回到源端再反射一次来回振荡直到能量被电阻耗散掉。表现在波形上就是台阶状的振铃严重的时候中间那一下会跌破接收端的门限造成一次假触发。这里有个反直觉的点走线太长会出问题走线太短有时也会出问题。如果一段线短到往返延时远小于上升时间反射波会在上升沿还没结束的时候就回来被上升沿「淹没」反而看不到振铃。这就是「短线不用端接」这条经验的物理来源——不是反射不存在而是它被时间平滑掉了。理解这一层你就知道为什么临界长度判据里会出现上升时间这个变量。2.3 差分对失配对内偏斜把差模悄悄变成共模第三种也是危害最隐蔽的一种是差分对的对内偏斜intra-pair skew。差分信号本来靠两根线电压互补来抵消共模干扰、降低辐射但前提是两根线上的信号严格同步。如果 P 和 N 之间差了哪怕几十 mil两条线上的边沿就不重合在交叉点附近会产生一个短暂的共模分量。这个共模分量的坏处是双重的一是让眼图的交叉点变糊、抖动增加接收端的共模抑制能力被消耗二是它会在电缆或连接器上形成共模电流直接变成辐射发射的来源EMI 测试很容易在这里翻车。而且对内偏斜不像组间偏斜那样有「重新对齐」的机会——它在接收端就是实打实的时间差没有任何机制能补偿回来。所以业内普遍的做法是组间等长可以放松对内等长必须死守。具体数字要看接口规范通常对内偏斜预算在几皮秒到几十皮秒量级折算到微带线上就是几十 mil 的空间稍微不注意一个过孔的位置就超了。还有一类容易被忽略的「等效长度」问题当差分对跨过参考平面的分割缝隙或者频繁换层时回流路径被迫绕行回路面积急剧增大等效回路电感上升。这种情况下你测量出来的物理长度没变但实际信号感受到的「电长度」变长了阻抗也塌陷了。所以等长做完了还要回头检查参考平面是否完整。3. 多长算长用上升时间倒推临界长度3.1 两个常用判据用途完全不同工程上有两个常用的临界长度判据很多人会混用其实它们回答的是不同的问题。第一个是传输线判据回答「这段线要不要按传输线来分析」L_crit tr / (6 × D)其中 tr 是信号上升时间D 是单位长度传播延时微带线约 150ps/inch。经验上当走线长度超过这个值就必须考虑阻抗、端接和反射。第二个是端接判据回答「这段线要不要加端接电阻」2 × TD tr 即 L tr × v / 2它的物理含义很直白如果往返延时大于上升时间反射波回来的时候入射沿已经结束了振铃就会完整地显现出来必须靠端接吸收。如果往返延时小于上升时间反射波被上升沿「包裹」住通常可以不加端接。注意这两个判据算出来的长度差了好几倍端接判据宽松得多。实际做设计时我的用法是先用传输线判据判断要不要小心对待再用端接判据判断要不要真的加电阻。如果预算紧张又想省元件就贴着端接判据走但一定要留仿真验证别凭经验拍脑袋。3.2 一张速查表把上升时间和临界长度对应起来下面这张表按微带线 150ps/inch 计算我把它做成表格是因为它真的太常用了每次换项目都会重新算一遍。上升时间 tr传输线临界长度端接临界长度典型场景5ns约 14cm / 5.6in约 42cm / 16.7in低速 GPIO、继电器驱动2ns约 5.6cm / 2.2in约 17cm / 6.7in普通 SPI、UART 提速后1ns约 2.8cm / 1.1in约 8.5cm / 3.3in100MHz 级并行总线500ps约 1.4cm / 0.6in约 4.2cm / 1.7inDDR3/DDR4、RGMII200ps约 5.6mm / 0.22in约 1.7cm / 0.67inPCIe、USB3、千兆以上 SerDes100ps约 2.8mm / 0.11in约 0.85cm / 0.33in高速 SerDes、光模块侧看到 200ps 那一行就知道为什么高速板子上「到处都是长线」了只要一段走线超过 5.6mm就已经进入需要考虑传输线效应的范围。一块 100mm×100mm 的板子上随便一根从 BGA 到连接器的走线都能轻松超过这个数。这也是为什么高速设计必须从叠层和阻抗规划开始而不是画完线再来补。3.3 接口偏斜预算怎么落地成等长容差有了延时数据就能把规范里的偏斜预算翻译成 Layout 能执行的 mil 数。换算很简单允许长度差(mil) 偏斜预算(ps) / 单位延时(ps/mil)微带线按 0.15ps/mil、带状线按 0.175ps/mil 计算。下表是一些常见接口的量级参考具体项目一定要以芯片手册和接口规范为准这里只是帮你建立数量级感觉。接口类型单位间隔量级对内/组内偏斜预算折合微带长度差DDR3/DDR4 数据组312~1250ps组内几十 mil 量级数十 milRGMII / 百兆以太网8ns数百 ps数英寸USB 2.0 高速2.08ns约 50ps 量级约 300milPCIe Gen3125ps对内几 ps 量级数十 mil通用 SerDes 差分对100~200ps对内 5ps 以内约 30mil我要特别提醒的一点表里「数十 mil」这种宽容度只在微带线和带状线混用的板子上是最容易出错的。因为同样 1000mil 的物理长度走微带是 150ps走带状线是 175ps差了 26ps。如果你的差分对中途从外层换到了内层物理等长做到了 0mil时间上却差了 26ps——这可能已经吃掉了对内偏斜预算的一大半。这也是下一节要专门讲的问题。4. 一次 LVDS 画面闪烁的完整排查链路4.1 现象静态画面没事一放视频就闪前年做一个带屏设备主控通过 LVDS 驱动一块 1280×800 的屏。样机装起来之后静态测试画面完全正常但只要播放稍快的视频内容屏幕上就会随机出现横向的彩色条纹持续一两帧。第一反应当然是怀疑信号质量。但这里有个关键的观察静态画面数据变化率低闪烁就少视频内容变化率高闪烁就频繁。这说明问题大概率不是固定位置的采样错误而与数据跳变有关。如果是采样点固定偏移静态画面也会出错如果是噪声耦合通常会跟电源负载或外部环境相关。数据相关性这么强指向时间余量不足。4.2 先排除非长度因素再怀疑走线按照我的习惯排查顺序是从「最容易改错的」排到「最难改的」。所以先做的是这几件事用示波器差分探头量了 LVDS 对上的共模电压约 1.2V稳定排除了驱动侧共模偏移问题。检查屏端供电纹波在合理范围排除了电源耦合导致的抖动。核对时钟频率和屏参数包括前后肩、极性配置确认软件配置没有问题。把接口速率降一档测试闪烁明显减少但没有完全消失说明余量确实紧张。四步做完方向和电路、软件都排除了只剩时序和走线。这时候才去翻原理图和版图。4.3 用眼图和偏斜测量把问题钉死真正的定位动作是两件事同时做眼图测量和时域反射测量。眼图测量用差分探头夹在屏端连接器上看到眼高还可以但眼宽明显不足交叉点位置上下不对称——这个不对称是很典型的对内偏斜特征P 和 N 的交叉点不重合就会形成一个「八字」形状。时域反射这边相对麻烦一点。我用的方法是拿一块同批次的半成品板从主控输出端开始逐段测量走线延时重点看差分对的两根线是否一致。测到第三对信号的时候发现P 线为了避让一个电源过孔往外拐了一下N 线走了直线两根线的物理长度差了一百多 mil。更糟的是这两根线还在中途换了一次层换层位置一前一后两个过孔延时差又叠加了上去。把两个因素加起来物理长度差加上层间延时差总的对内偏斜接近 40ps。而这条链路的单位间隔只有 300ps 出头40ps 已经是 13% 的占比边沿再受点影响眼宽就被啃掉了。4.4 验证方法不要急着改板先用飞线确认假设在动版图之前我做了个验证用两根等长的细同轴线从主控焊盘直接飞到连接器完全绕过原来的走线长度差控制在 10mil 以内。飞线之后连续播放视频条纹完全消失。这一步很关键它不是「修好了」而是「证明了我的假设是对的」。确认之后改板就简单了重新规划差分对的出线角度把换层位置对齐让 P 和 N 在同一个过孔行上换层并在绕线补偿时优先补偿 N 线。改版之后眼宽恢复到预期这个项目后面又做过几次迭代都没再出现这个问题。我在这件事里学到的经验是排查一定要有先后顺序而且每一步都要能证伪。如果一上来就去改走线即使问题消失了你也不知道是走线的原因还是顺手改掉的别的因素。飞线验证虽然土但它能把变量控制在最小范围内。5. 让长度不再成为变量的布线手法5.1 等长组怎么分组容差怎么定等长不是把所有线都做成一样长而是先分组。分组的原则是「同一组内的线必须由同一个时钟/选通信号采样」。DDR 里每个字节组的 DQ 和它的 DQS 是一组地址命令控制是一组时钟单独一组RGMII 里四根数据和时钟一组PCIe 里每一对差分对自成一组的对内关系再加上收发组之间的关系。分组定了接下来是容差。我的做法是分三级对内等长最严格通常按偏斜预算除以 2 来留余量实际布线时能压到几十 mil 以内最好。组内等长按手册给的组内偏斜直接换算注意一定要扣掉过孔和换层带来的延时差。组间等长多数接口是「相对参考时钟」的关系不要求所有组都一样长只要求每组相对时钟的关系满足要求。容差定完了要写进约束管理器让工具帮你检查而不是靠眼睛。人眼在几千根线里根本看不出哪根差了 30mil但工具能。5.2 蛇形绕线间距、段长、位置三条红线说到等长补偿就绕不开蛇形线。我见过太多为了等长而把线绕成一团麻花的板子结果长度是等上了信号质量反而更差。这里有三条红线第一间距。蛇形相邻两条平行段之间的中心间距建议不小于 4 倍线宽也就是边到边至少 3 倍线宽。间距太近两段之间的耦合会让局部特征阻抗降低延时也随之变化你补偿出来的长度和实际延时对不上。第二单段长度。每一段绕线的长度不要超过临界长度。因为每段直线上如果有并行段耦合它本身就是一段耦合传输线太长会引入局部谐振和串扰。经验上限是控制在上升时间对应临界长度的三分之一左右。第三位置。绕线补偿要放在失配源附近而不是全都堆在连接器附近。信号在传播过程中任何位置的偏斜都会被保留到末端所以最理想是在偏斜产生的地方就补回来。另外绕线区域要避开晶振、开关电源、复位、模拟小信号这些敏感区域也不要放在板边和裂缝附近。提示蛇形线绕完一定要重新跑一次阻抗仿真。看外形是等长的看延时未必等长尤其是间距压得很紧的时候。5.3 拓扑决定长度关系点对点、菊花链、Fly-by 与星型走线之间的长度关系很大程度上不由你决定而是由拓扑决定。点对点是最好处理的两端之间等长就行差分对只要管对内。菊花链适合两个以上接收端但要注意中间节点的短桩stub长度桩太长会在节点处形成反射经验上桩长控制在临界长度的三分之一以内。星型拓扑每个分支到中心等长问题在于中心点的分支点会造成阻抗下降通常需要在分支点做一些补偿处理。DDR3 之后流行的 Fly-by 拓扑是个典型例子。地址命令控制信号从控制器依次串到每颗颗粒物理长度天然递增所以引入了读写平衡leveling机制让控制器通过校准去补偿走线长度差。这也是一个思路转变当长度差没法在布线阶段消除时就用可校准的机制把它吸收掉。设计时你要问自己一句这条链路有没有校准机制如果有等长可以适当放松如果没有就必须在布线阶段死守。5.4 换层、参考平面与过孔最容易被忘记的等效长度前面反复提到换层和参考平面这里再展开说一下因为它真的决定了你的等长是不是「有效等长」。信号换层时回流路径必须从原来的参考平面跳到新的参考平面。如果两个平面之间没有就近的地过孔连接回流电流就得绕远路回路电感剧增。这种「等效加长」在物理长度上是看不出来的但会直接表现为边沿变缓、阻抗不连续、辐射增大。所以我的做法是换层过孔旁边必须配一个地过孔能配两个更好。同时跨越分割平面这件事在高速信号上基本等于自找麻烦能绕就绕实在绕不开就在跨缝处加缝合电容。至于过孔残桩超过一定速率后需要背钻尤其是 10G 以上的链路残桩带来的谐振会直接毁掉眼图。6. 几个只有踩过坑才会记住的细节6.1 长度匹配要按延时匹配不要按物理长度匹配这是我最想强调的一点。EDA 工具默认做的是物理长度匹配但真正影响信号质量的是延时匹配。同一条 1000mil 的走线在微带层是 150ps在带状线层是 175ps差了 25ps。如果你的一对差分线一半在外层、一半在内层物理长度做到 0 偏差时间上依然是偏的。解决办法是使用支持延时约束的工具功能很多主流 PCB 工具都有「延时调谐」或者可以按层设置不同的传播延时系数。如果工具不支持就手工换算把每层的长度乘以该层的单位延时得到总延时然后按延时对齐。这个动作在 DDR 和高速 SerDes 上是必须做的在低速接口上可以偷懒。另外注意板材的介电常数不是常数它会随频率和温度变化。FR4 的 Dk 在低频和高频下能差 5%~10%宽温环境下延时漂移也不小。做严格时序设计时要去查板材厂商提供的 Dk-频率曲线而不是用数据手册封面上那个标注值。6.2 补偿放在哪里比补偿多少更重要前面提过一次这里再补充一个真实场景。有次做一块差分线P 线因为要走内层比 N 线短了 300mil工程师把补偿全部加在了连接器前面 5mm 的位置。结果那段区域本来就拥挤绕出来的蛇形间距压到了 2 倍线宽局部耦合导致阻抗从 100Ω 掉到 85Ω反而引入了新的不连续点。比较稳妥的做法是把补偿拆开一小部分放在偏斜产生的位置附近剩余部分分散到链路中间比较空旷的区域每段的绕线长度不要太长。这样既能补上延时又不会在局部制造极端结构。绕线的拐角用 45 度或者圆弧过渡直角拐角会带来额外的容性突变。6.3 长度、串扰和辐射是连在一起的最后一点走线长度不只是时序和反射的问题它同时影响串扰和辐射。平行走线越长耦合到邻近线上的能量越多走线越长它作为天线的效率越高辐射发射越明显。所以当你为了等长把一根线绕得很长的时候你其实是在同时增大它的串扰耦合面积和辐射面积。这时候要做的检查是绕线区域的相邻信号间距有没有拉够一般至少 3 倍线宽高速信号建议 4 倍以上绕线是否跨过了其他敏感信号的投影区域整段绕线下方参考平面是否完整。我个人的一个习惯动作是等长做完之后打开 3D 场求解器对关键的几组线重新提取一次 S 参数看一眼插入损耗和近端串扰有没有明显恶化。这个动作花不了多少时间但能抓住不少「等长做对了、信号却变差了」的情况。注意等长是一个约束不是目标。目标是让接收端在正确的时间点采到正确的电平长度只是达成这个目标的手段之一。最后再分享一个我自己一直在用的小工具思路做一张自己的延时换算表把常用板材、常用层叠、每层的 ps/mm 全部列进去再写几行脚本把 Layout 工具导出的线长报告自动乘上对应系数直接输出每组的最大延时差。每次改板跑一遍比在约束管理器里翻半天要快得多。踩过几次坑之后就会发现把时间维度建立起来很多看起来玄学的信号问题其实都是有账可算的。
返回列表