多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

高速PCB差分线等长处理:从规则设置到仿真验证的完整实战指南

高速PCB差分线等长处理:从规则设置到仿真验证的完整实战指南 这些年在高速PCB设计里最容易被低估的其实是看起来不起眼的差分线等长处理。很多工程师画板子时觉得“只要把一对线拉得差不多长就行”结果样板贴出来一测眼图USB高速信号一塌糊涂或者EMI超标回头查根因十有八九都是差分对在走线阶段埋下的雷。我最早负责一块带HDMI和USB 3.0的板子时也在这个环节吃过亏后来才慢慢把“等长”这件事从“差不多就行”变成了一套可量化的流程。这篇内容就围绕差分线走线和差分线等长处理展开结合我平时在Altium Designer和Cadence Allegro里的实际操作把从规则设置、手动布线、等长调谐到仿真验证的完整链路讲透适合正在画高速板的硬件工程师和PCB Layout新手参考。1. 差分线的底层逻辑等长不是目的保证时序和阻抗才是1.1 一对线为什么必须绑在一起看差分信号的本质是用两根线上的相反极性电压在接收端相减恢复原始信号。正因为是“相减”它对共模噪声、地弹和外部电磁干扰天然有抑制作用。这个原理大多数人都清楚但落到Layout上就容易被忽略一个关键点一对差分线只有在耦合状态良好、长度基本一致的前提下才能把这个“相减”的优势发挥出来。我习惯把差分线理解成一对双胞胎。它们在行走时必须步调一致一个人快了半拍另一个人慢了半拍接收端做减法的时候就会出现共模分量。这个共模分量不会消失它会沿着线缆辐射出去变成实打实的EMI问题。更麻烦的是如果这对线走到中途因为换层、过孔或者避让器件而失去耦合信号的回流路径就会变得不规则阻抗连续性随之恶化反射和振铃随之而来。在实际板卡上USB 2.0的D/D-、USB 3.0的TX/RX差分对、HDMI的TMDS通道、PCIe的Lane归根结底都是这个逻辑。所以一谈到差分线走线第一反应不应该是“怎么把线画出来”而是“怎么让这对线始终以一个整体出现在PCB上”。1.2 等长和阻抗是一体两面的关系很多新人在做差分线等长处理时眼里只有“长度差几mil”却忘了差分线还有一个更底层的约束特征阻抗。对内间距直接参与阻抗计算间距变了阻抗就变了。就以表层微带线结构的USB高速差分对为例通常要求90欧姆差分阻抗。在板厚、介电常数、铜厚确定的前提下线宽和线距是控制阻抗的两个核心变量。线宽越宽阻抗越低线距越大差分阻抗越高但同时耦合变弱。所以你在规则管理器里看到的“线宽/线距”并不是随便填的那是用阻抗计算工具比如Polar SI9000结合叠层参数反推出来的结果。等长处理之所以要和阻抗放在一起讨论是因为最常见的等长蛇形线本质上就是在一对耦合传输线里人为加入了一段绕线。如果绕线区域的内间距和普通走线段不一致这一段阻抗就会跳变。这就是为什么我在处理等长时会刻意保证蛇形线部分的间距与正常走线段一致宁可让蛇形幅度小一点、多绕几个弯也不要通过改变线距去凑长度。1.3 对内间距的“甜蜜点”怎么找关于“对内间距是多少”这个问题网上的说法很多但真正靠谱的做法永远是从叠层和阻抗反推。对于普通的1.6mm四层板表层90欧姆差分对常用的线宽/线距组合大约是5mil/6mil或者4.5mil/7mil具体取决于PP片厚度。但如果你问我布局阶段怎么快速估算我会先记住一个规律差分对的内间距大致取1倍线宽到2倍线宽之间耦合效果和阻抗都能得到一个不错的平衡点。间距小于线宽耦合很强但加工精度要求高稍有点偏差阻抗就飘间距大于两倍线宽耦合变弱抗干扰能力下降差分线的“整体性”就打折扣。真正的高速设计里你还会看到背板上有那种间距很大的差分对那是为了获得更低的差分阻抗、配合BGA出线或者特殊叠层这时候“间距”就不再是单纯的耦合决定量而是阻抗设计的产物。所以我的建议是不要再问“差分对内间距应该设多少”而是用阻抗计算器把线宽和线距作为一个方程组去解先满足阻抗再考虑耦合。这样出来的等长方案才有意义。2. AD16/AD20手动布差分线从建立差分对到等长调谐2.1 建立差分对的命名规则与编辑器操作Altium Designer里做差分线第一步不是打开布线工具而是先建立差分对。AD识别差分对依赖命名后缀默认是_P和_N比如USB_D_P和USB_D_N。如果你从原理图阶段就把网络名按这个规则命名PCB里只需要执行一遍Design » Differential Pairs软件会自动扫描所有成对的网络并生成差分对对象。如果原理图里网络名不规范比如已经叫DP和DN但也带上_P/_N那就需要手动在PCB面板的Differential Pairs Editor里去添加。这一步很多人会忽略结果手动布差分线的时候发现Route菜单下的Interactive Differential Pair Routing是灰色的就是因为差分对压根没有建立成功。手动布线时从菜单栏选Place » Interactive Differential Pair Routing或者用快捷键PD点击一个网络的引脚就能同时拖出两根线。布线过程中按Tab键可以呼出属性面板里面能直接改当前差分对的线宽、线距、过孔尺寸等参数。这里有个实用小技巧如果布到一半发现线宽和规则冲突无法走线先别急着改规则看一下是不是当前层和目标层的阻抗参数不一致换层后AD会自动套用对应层的规则不会一直沿用起始层的值。2.2 手动布线的流程与避让细节手动布差分线和布单端线最大的区别在于你需要时刻关注两条线是否保持平行等距并且尽量避免在走线过程中出现一长一短的错位。AD的差分布线器会自动维持你在规则里设定的间距但在拐角、过孔和从BGA扇出的时候两线长度很容易悄悄拉开差距。我的习惯是先把一对差分线从起点拉到终点布线过程中不过度纠结局部绕线优先保证整体路径顺畅。等到这对线基本连通之后再用Length Tuning工具统一做等长修正。这样比边拉线边调等长要高效得多也不会因为局部逼迫导致绕线堆积在某一小段里。在BGA区域或者狭小空间内走差分线时难免要贴着铜皮走。这个时候AD默认的推挤避让有时候会显得很傻它会尝试推开整片铜皮或者死活不让你靠近。解决方式是在PCB Editor » Interactive Routing设置里把交互式布线时的冲突处理方式选为“Push Obstacles”同时打开Automatically Remove Loops。如果走线需要从铜皮中间穿过比如电源铜皮内的信号过孔连线和走线避让可以在铺铜管理里给这块铜皮设置一个禁布区域或者使用Place » Polygon Pour Cutout预先开好窗口。这个操作也是热搜词里“ad在铜皮里面走线怎么避让了”对应的答案不是让走线算法去硬避让而是先给铜皮开窗再在窗口内布线干净利落。2.3 差分等长长度规则的设置等长规则在AD里叫Length Tuning核心参数有三个目标长度、最小长度、最大长度。在Design » Rules » High Speed下找到Matched Lengths新建规则作用范围选到你要约束的一对差分网络。目标长度可以填成实测的期望长度比如某对USB差分线预计总长约1800mil那最小和最大长度就按等长误差要求来填。对于USB 2.0通常对内等长误差可以放宽到50mil量级但USB 3.0的SuperSpeed通道对时序更敏感一般建议控制在5~10mil以内。PCIe这类高速串行协议对对内等长更苛刻通常需要控制在几个mil以内我做过的一个PCIe 3.0项目里规则就给到了5mil。设置完匹配规则后执行等长操作在交互式布线状态下按快捷键TR或者从菜单Tools » Interactive Length Tuning点选一对差分线中的任意一根软件会以当前布线路径为基准动态显示出还需要补长多少。此时按ShiftS切换单层显示再按1/2/3键可以切换调谐模式比如蛇形、表贴式用[和]调整绕线幅度,和.调整绕线间隙。走线右侧会实时显示当前长度和目标长度的差值拉到绿条变绿就完成了一根线的等长另一根线以同样的目标长度为基准继续操作即可。这里必须强调先修长线再修短线。以较长的那一根为目标基准短的往长的靠。反过来做的话长线越修越长板子空间直接紧张后续到处避让会非常痛苦。3. Allegro差分规则配置、现有走线修改与sub-drawing导入实操3.1 约束管理器中设置单端/差分线宽与线距Cadence Allegro和AD在思路上有本质区别AD的规则分散在Rules面板里而Allegro的核心是Constraint Manager约束管理器简称CM。打开方式是在菜单栏选Setup » Constraints » Constraint Manager或者直接用快捷键CM。在CM里设置差分对的线宽和线距通常走Physical规则和Spacing规则两条线。先建一个Net Class把要约束的差分网络放进去。然后在Physical规则里找到Differential Pair相关属性分别设置Line Width的Min、Preferred、Max。再回到Spacing规则里设置Differential Pair的Same Net Spacing这个值就是对内间距耦合间距也就是热搜词里“对内间距”在Allegro中的对应位置。对外间距怎么设呢在Spacing规则里把Differential Pair to Other设置成一个稍大的值比如对内间距6mil对外间距就设成12mil以上保证差分对之间或者差分对与普通信号线之间有足够的安全距离减少串扰。Allegro还有一个容易被忽略的属性叫Neck。BGA区域出线空间紧张时正常线宽可能出不来这时候可以给差分对设置一个更窄的Neck Width并在Routing » Neck相关规则里设置脖子区域长度。最常见的场景就是0.8mm pitch的BGA差分线从焊盘引出时只能用颈缩线宽出到空旷区域再恢复正常的线宽和间距组合。3.2 修改现有走线而不是推倒重画热搜词里有个问题问得很实际“怎么在allegro中设置单端、差分走线宽度与线距然后再去修改现有走线呢”这个问题分两层第一层是怎么把规则设置应用到已经布好的走线上第二层是怎么在不删除原有走线的前提下修改走线形态。第一层很简单——改完CM里的规则后执行Analyze » Analysis让规则生效然后选中已经布好的走线在Options面板里手动更改Line Width为规则允许的值。如果想全板换个线宽用Edit » Change在Find面板里选Clines同时勾上Cline Segs然后在Options里选好新的Class和Subclass以及目标线宽即可批量修改。第二层修改现有走线Allegro的滑动命令Slide比直接删线重走要高效得多。选中路径后执行Edit » Slide光标靠近线段时会高亮此时可以整体推挤这段走线保持弧度和间距不变。Shift点击可以切换推挤模式比如整段推、单段推、保角推。对于差分线用Slide来调整蛇形绕线的位置比删掉蛇形线再重新绕要稳得多因为每次重画都可能引入新的长度误差。3.3 圆弧走线的适用与操作要点Allegro的圆弧走线功能在高速差分布线里非常实用因为圆弧转弯带来的阻抗变化比45度折角更平滑尤其对10Gbps以上的超高速信号有明显帮助。开启方式是在布线状态下Option面板里的Route Type选择Arc或者用快捷键AltA。实际使用中我的经验是圆弧走线不要用在密集区域因为圆弧占用面积大在BGA底下绕圆弧会把通道空间压缩得很厉害。一般只在板边、长距离平行走线以及射频敏感线路上使用。Arc Radius可以在Options里预设比如设置成线宽的1.5倍走出来的圆弧弧度比较自然。对于差分对两条线的圆弧半径要保持一致否则内外圈长度差会进一步加大等长修正的负担也会加重。3.4 sub-drawing导入走线过孔失败的排查“allegro用sub drawing导入走线过孔不成功”是一个特别典型的问题。Sub Drawing是Allegro在不同PCB文件间复制走线、过孔、铜皮的最常用方式但很多人操作时发现导入后只出现了走线过孔是空的或者连走线都没出现。常见原因有三个一是导入的文件里包含了其他库里的Symbol比如过孔Padstack在目标板库里不存在。Allegro导入Sub Drawing时不会自动补齐PAD只会生成一个“空过孔”占位。解决方式是提前把源文件用到的Padstack、Drc、Symbol相关库文件复制到目标板工作目录下或者执行Tools » Padstack » Replace先替换成目标板里存在的过孔。二是Sub Drawing文件本身包含了Dangling Lines悬空线头或者孤立的Via导入后这些对象悬挂在空区域看不到。可以用Display » Highlight查看该Class/Subclass再执行Delete按层筛选删除。三是权限问题。Sub Drawing导入时目标板文件处于只读状态导入操作静默失败。这种情况在你从邮件、网盘直接打开PCB文件时特别多。先在本地另存为可写文件再执行File » Import » Sub Drawing选择.clp文件勾选Preserve Pitches of Elements等选项后放置即可。3.5 90°走线检查在Allegro中的实现90°直角走线在低频设计里无关痛痒但在高速差分信号上是个隐患直角外侧的寄生电容会形成阻抗突变点内侧会锁住一段回流信号形成“天线效应”。Allegro自带的DRC并不直接报“90度角”需要借助巡查和脚本辅助。比较快的方法是利用Manufacturing » Design Rule Check里的Acute Angle Constraint把这个约束值设成90度或者89度DRC就能把小于等于该角度的拐角标成Violation。不过这个检查对走线的线段不连续处也会误报所以实际项目里我更常用的是Edit » Find配合Mark把所有拐角坐标抓出来用脚本批量判定夹角大小再把真正小于90度的点筛出来逐一修改。修改直角的方法也很简单在直角处选中两段线段删掉交点附近的短段用Slide把线段端点拉到一起再用弧线或双45度走线替代。注意改完走线形态后必须重新跑一遍等长检查因为替换走线会改变路径长度。4. 等长处理的控制精度对内、对外误差与蛇形绕线的工程折中4.1 常见接口等长约束速查表很多项目在制定等长规则时会把所有差分对内误差都定成同一个值这是不对的。不同的接口协议对时序裕量的敏感度完全不同我把常见接口的经验值列成了一张表大家在定规则时可以直接参考起点再根据自己板子的实际时钟频率做调整。接口类型差分阻抗对内等长经验值对外/组间等长经验值说明USB 2.0 D/D-90Ω≤50mil单一D/D-对内无需组间低速信号裕量较大USB 3.0/3.1 TX/RX各对90Ω≤5~10mil同方向组间≤100mil注意跨层严格一致性HDMI TMDS 通道100Ω≤5mil三对时钟对内错位≤20mil时钟和数据的对外匹配很关键PCIe 3.0/4.0 Lane85Ω≤5milLane间不做严格等长协议有弹性缓冲DDR3/DDR4 数据组40/39Ω(差分)ΔL≤5mil(相对CLK)组间错位≤10mil需要结合T型/菊花链拓扑上面这些数值不是拍脑袋写的是我在多层板项目的实际约束基础上总结出来的。规模大的DDR模块里等长对象往往不只是差分线还有地址线、控制线的单端等长这时候用”对外等长误差“的概念把同一类信号约束在一起比单独追每一根线要清晰得多。4.2 蛇形绕线的形态选择与间隙控制等长处理最常见的手段就是绕蛇形线。但绕蛇形不能只关注长度补了多少还要关注蛇形线本身对信号质量的影响。第一蛇形线的弯折段间距Amplitude和Gap不能太小。我一般用“3倍线宽”作为蛇形线间隙的下限。假设线宽5mil蛇形间隙至少15mil不然弯折间的耦合电容增大导致阻抗下降同时相邻绕线之间的串扰也在加大。第二蛇形线的绕线幅度不宜过大。幅度大的蛇形线虽然补长效率高但会在绕线区形成较大的局部地平面切割导致回流路径紊乱。我习惯把蛇形线的幅度控制在200~400mil之间宁可需要在整条走线上分两三段绕也不要在一个地方堆出超长蛇身。Allegro里执行蛇形等长用的命令是Route » Length Tuning快捷键RLAD里是快捷键TR。在蛇形绕线过程中按Tab键可以切换不同的绕线样式U型、Z型、X型。X型比较少用Z型适合空间紧凑的场景U型是最通用的。4.3 空间不够绕蛇形线时的替代方案现实里总会碰到这种情况差分对的一端在BGA内部另一端在连接器旁边中间通道窄到几乎放不下一段蛇形线。这时候只能从拓补上想办法而不是硬绕。第一个思路是调整出线方向。比如BGA扇出的差分对先朝外侧走一段再折回利用双排过孔把长度差消化在扇出区域内而不是等到通道尽头才补。第二个思路是改换层走线长度补偿。如果差分对里有一根线因为避让走了更短路径可以在换层区域人为加长过孔间走线让较短的那根线在换层前后多走一截零空间的小段再用蛇形修正剩余差值。这个方法对等长空间紧张的板子特别有效。第三个思路是调节过孔位置。差分对的两根线如果分别从两排错位过孔扇出天然会形成一段长度差这时候把其中一排过孔沿轴偏移几个mil反而比绕蛇形更划算。5. ADS差分线仿真与共面波导接地间距的校准5.1 ADS里差分线建模和S参数观察在打样之前做一次ADS仿真能提前暴露很多在Layout里看不出来的问题。ADS里做差分线的仿真常规路径是建立传输线模型、设置叠层参数、跑S参数和眼图。最简单的起步方式是使用ADS的LineCalc工具。它内置了多种传输线模型包括微带线、带状线、共面波导等。把板厂的叠层参数介质厚度、介电常数、损耗角正切、铜厚填进去给定目标差分阻抗LineCalc会反算出线宽和线距。这里有个重要提醒仿真参数必须用板厂实际提供的值比如PP片压合后的厚度和介电常数不能照抄普通FR4的4.2因为不同树脂体系和玻纤布的Dk差异很大。搭建完整通道仿真时把封装模型、过孔模型、走线模型、连接器模型串起来扫频范围到信号频率的3~5倍观察S参数里的回损和插损。如果是USB 3.0这类信号重点看差分插损在5GHz频点附近是否低于某个阈值以及差分回损是否保持在-10dB以下。很多团队没有能力搭建完整的3D电磁场仿真那就退而求其次用SystemVue或者ADS的通道仿真器做时域分析观察TDR曲线里的阻抗突变位置。我见过一块板子在等长处理完全正确的情况下TDR曲线上在某个过孔位置有一个明显的阻抗下陷追查原因是对该过孔反焊盘没有做挖空处理导致寄生电容过大。这种问题如果不仿真在硬件调试台上可能要花两三天才能排查出来。5.2 共面波导表层走线与GND间距的确定“共面波导表层走线跟gnd间距”这个问题通常出现在射频前端或者对信号质量要求很高的高速单端线路上。共面波导CPW结构里的地间距不是随便设的它和阻抗直接挂钩。典型的设计是信号线两侧各留一片地铜走线与地铜之间的距离就是决定阻抗的重要参数。以单端50欧姆的共面波导为例如果叠层给定0.1mm的介质厚度、Dk为4.3走线宽度0.15mm那么两侧地与信号线之间的间隙通常在0.1~0.2mm起步。同样这个间隙也要用LineCalc反推不是猜出来的。差分共面波导的话地间距对差分阻抗的影响更明显间隙越大耦合到地平面的能量越少差分阻抗越高。实际操作中还有两个细节一是共面波导下方的地平面必须完整不能为了布线而挖掉二是走线两侧的地铜要打过孔阵列到主地平面打孔间距一般小于λ/20保证地电位均匀否则共面波导的屏蔽作用会大打折扣。5.3 开尔文走线在信号测量与精密检测中的使用开尔文Kelvin走线严格来说不算差分信号范畴但它的电流路径和反馈路径分离的思路与差分对中的“双线”逻辑异曲同工。开尔文连接通常用在精密电阻采样、电源远端反馈等场合核心目的是消除走线电阻和接触电阻带来的压降误差。在Layout上实现开尔文走线时关键就是要让采样走线尽量细、尽量短并且从采样点单独引出不要与主电流路径共用铜皮走线。采样线要走差分式对称布局因为它对地噪声和电势差敏感两条采样线靠在一起平行走比单根走线抗干扰能力好很多。我在一个数字电源模块里给Fuse采样电阻画开尔文走线时就把两根采样线当成一对低频差分线来走等长约束虽然不用做得很严但平行紧贴的原则和差分线完全一致。6. 我处理过的差分线实际故障和对几条经验细节的回顾6.1 “走线没有中心点”的坑是怎么来的热搜词里那个“ad的pcb绘制时走线没有中心点怎么开”的问题我猜大多发生在刚接触AD的工程师身上——他们在画差分线或者单端线时发现轨迹上不显示中心线只能看到两边的轮廓总觉得没法对准目标点。其实这是显示模式的问题。在AD的Preferences里找到PCB Editor » Interactive Routing确认Show Center Line选项被勾选同时在线宽较大的差分线上中心线可能被线框覆盖按F9或者执行View » Refresh刷一下就好了。如果还是看不到中心点大概率是你开了位图显示模式或者显卡驱动不兼容把菜单栏下方的“快速显示模式”拉回正常渲染即可。6.2 检查差分线等长结果的那一版我就不该只看DRC很多Layout工具都带等长检查功能但DRC报“长度匹配通过”并不代表真的万事无忧。DRC的检查逻辑是拿你设置的规则上下限去比对实际长度如果规则本身设宽了比如一个50GHz的差分对内误差设成100milDRC肯定全绿但信号就是不通。所以我的个人经验是手动打开等长报表按误差值从大到小排序用眼睛扫一遍每对线的实际长度和最差值重点关注那些数值贴近规则上限的线对。同时把某一层在单层显示模式下打开直接目视确认蛇形线的分布是否均匀。如果发现一大段蛇形全部堆在走线末端说明前面段的耦合质量不佳应该优化走线路径而不是继续拉大蛇形幅度。6.3 差分线的“最后一毫米”过孔和连接器区我最后想分享一个容易翻车的地方差分对出了连接器、进了过孔之后等长和耦合往往会在最后一毫米前功尽弃。很多人在走线中段把对内误差控制得非常漂亮但一进到连接器通道两根线为了迁就封装引脚间距骤然拉开甚至出现了10~20mil的错位。处理这类问题我的做法是在连接器扇出区域使用严格的颈缩走线让两根线在进入焊盘前恢复到一个紧耦合的间距同时给这一小段单独设置等长规则。如果连接器的封装太大引脚间距天然大于线距那就在连接器下方用地铜补一个回流路径并在相邻焊盘之间加铺地过孔把阻抗突变的影响压到最小。等长不是目的让信号在接收端能够被干净地恢复才是。理解了这句话之后再看差分线走线和差分线的等长处理很多纠结自然就解开了。
返回列表