
做高速板卡USB 3.0、PCIe、HDMI、LVDS这些接口几乎都是差分信号AD20里跑差分对走线是家常便饭。我以前带过的不少工程师单端走线很溜一到差分对就卡在几个地方差分对定义不出来、规则设了不生效、走线时两根线不跟着一起动、等长又不会调。这篇文章我打算把AD20差分对走线设置的完整流程从头捋一遍从底层概念到实操细节再到我踩过的坑尽量给真正在画板子的人一些能直接用的东西。1. 差分对走线前的底层逻辑搞懂这几个概念再动手1.1 为什么两根线非得成对出现差分信号的本质是用两根物理走线传输一对幅度相等、相位相反的信号接收端直接做减法得到有用的电平。正是因为接收端用的是减法两根线上的共模噪声在理论上会相互抵消所以差分传输天然对地噪声和电源干扰不敏感。我把这个原理类比成两个人抬水两个人都用一样的力气、一样的步调桶里的水就不容易晃出来如果一个人走快、一个人走慢桶就会倾斜水会洒。差分走线也是这个道理AD20里做差分对走线时最核心的目标就是让两根线尽量等长、等距、共同换层保持“步调一致”。如果两根线长度差太多正负信号到达接收端的时间就不一致180度相位差被破坏原本被抵消的共模分量就会冒出来EMI和信号完整性问题跟着就来了。所以差分对走线不是随便拉两根线就行而是有一套专门的工具和规则在保护这个“步调一致”。1.2 AD20是怎么把一对信号“认”出来的很多新手栽的第一个跟头是在PCB里找不到差分对。原因很简单AD20默认不是靠你手动框选两根线来组对的而是靠网络名的命名规则自动识别。AD20默认的差分对命名规则是正负网络以固定的后缀区分比如USB_P和USB_N、PCIe_TX_P和PCIe_TX_N。你可以在Project - Project Options - Options里找到差分对命名设置一般支持“后缀式”和“前缀式”两种常用的是_P/_N后缀。在原理图里正确命名网络之后再执行Place - Differential Pair给这对网络放一个差分对指示符导入PCB时AD20就会自动把它们识别为一对差分信号。如果原理图没放指示符也可以在PCB里手动添加。另一个常见入口是PCB界面的Design - Differential Pairs Editor打开后能看到当前工程里所有自动识别出来的差分对也可以在右边列表里手动Add。提示命名规则不一致是差分对识别不出来的第一大原因。比如一会儿用USB_P/N一会儿用USB_DP/DNAD20的自动匹配就会失灵。建议整个工程统一用一个命名规范从头到尾别乱改。1.3 线宽、间距与阻抗之间的三角关系差分对走线里最常碰到的三个参数是线宽、线距和目标阻抗。线宽越宽阻抗越低两根线的间距越近耦合越强差分阻抗也会明显下降。换句话说差分阻抗不是一个独立参数它是由线宽、线距、介质厚度、介电常数共同决定的。实际操作中我一般先定目标阻抗常见的USB、PCIe、SATA多为100Ω差分也有90Ω的场合比如某些SerDes链路。然后用板厂给的叠层参数在AD20的层叠管理器里设置好各层厚度和介电常数再用内置阻抗计算器或者板厂提供的阻抗模板反推线宽和线距。举个常见例子常规FR4、板厚1.6mm的四层板表层100Ω差分对线宽和间距经常落在6mil/6mil附近但在内层走线因为介质厚度和参考平面距离不一样同样的100Ω差分对线宽线距要重新算。我见过很多人直接拿网上的模板硬套结果板子做回来阻抗完全不对这种情况基本都是没跟板厂确认叠层导致的。2. AD20差分对定义与规则设置从0到1配置好基础2.1 在原理图和PCB里正确添加差分对先讲原理图这边的常规做法。以AD20为例网络标号命名成Ethernet_TX_P和Ethernet_TX_N之后执行Place - Differential Pair这时光标会带一个差分对标记把它放到这对网络中的任意一根线上AD20会自动匹配另一根然后在属性里可以给这一对差分信号起个名字比如Ethernet_TX。导入PCB网表时这个差分对就自动出现了。如果原理图因为历史原因没有放差分对指示符PCB阶段也能补救。打开Design - Differential Pairs Editor面板左下角有添加按钮手动选择两个网络指定差分对名称再点加入一样能生成一个差分对。这里有一个细节AD20是依赖网络名来匹配的手动添加时也建议把网络名按_P/_N的规范去命名。如果乱起名字比如A_P和B_N就算你在面板里强行组合成一对后面的规则约束和DRC检查也很容易出问题。2.2 设置差分对布线规则Width/Gap/Clearance差分对定义好之后就要设置布线的核心规则。在PCB里打开Design - Rules - Routing - Differential Pairs Routing这里是差分对线宽和线距的主战场。配置项主要有三组线宽最小线宽、首选线宽、最大线宽线距最小间距、首选间距、最大间距适用层勾选哪些信号层用这套参数规则的目标范围可以选择具体的差分对、差分对类也可以用Query表达式去匹配比如InDifferentialPair(Ethernet_TX)。填写的首选线宽和首选间距就是后面交互式走线时默认采用的宽度和间距。很多人的问题是“规则明明填了为什么走线不按这个来”。原因通常是规则优先级冲突或者目标范围选得太大。比如你有个Net Class全选了里面既有差分对又有普通单端信号那普通Width规则可能会覆盖差分对规则。更好的做法是在规则表里把差分对规则放在前面目标范围精确到差分对类避免作用范围重叠。2.3 Net Class和差分对类的创建技巧工程一复杂差分对就不是两三对可能有十几对甚至几十对一对一条规则会改到手软。这时候建议用类来管理。差分对类在Differential Pairs Editor面板里直接创建右键选择添加类把相关的差分对拖进去。之后在规则里目标范围选择Differential Pair Class即可。如果你是直接使用Net Class也可以从Design - Classes里新建一个Net Class把差分对的正负网络全部归进去。把同类差分对归到一起的好处很明显比如有8对HDMI差分线目标阻抗都是100Ω间距要求也一样那我只需要在规则里选一次类统一设置线宽线距后面板厂反馈说要微调我改一个地方8对线全部生效。类管理配合规则优先级是AD20里比较正规的做法前期多花两分钟后期省半天。还有一个容易被忽略的点差分对和普通单端信号、地网络之间的间距规则Clearance也要单独设置。很多新手只设了Differential Pairs Routing却忘了设Clearance导致差分对和旁边的单端线、地铜皮间距完全失控板厂回来DRC一大堆错。我的习惯是给差分对建一个Scheme在Clearance规则里把“差分对到其他网络”的间距单独拉出来比如跟随差分对内部Gap的1.5到2倍。3. 交互式差分对走线实操从调用到完成3.1 别用单线走“假差分”先说一个最常见的坏习惯。有些工程师偷懒直接把两条网络用普通的Interactive Routing一根一根地拉拉完再调整对齐这就是“假差分”。假差分的问题很要命两根线之间没有约束关系走到拐弯或者换层的地方线距会忽大忽小差分阻抗随位置变化信号反射变多而且两根线很难做到真正等长正负信号的相位差无法保证EMI也压不住。AD20的差分对布线工具会实时维持规则里设定的Gap两根线像绑定一样一起走这才叫真差分。在AD20里调出差分对走线工具的方法是Route - Interactive Differential Pair Routing快捷键是连续按两次I。启动之后鼠标靠近差分对的任意一个网络点时整个差分对会被高亮点击即可开始布线。3.2 差分对交互布线的完整步骤我按自己平时的习惯把差分对走线流程拆成下面几步先确认当前层信号层是正确的层要是选错了拉出来的全是内层规则。连续按两次I进入差分对布线模式鼠标靠近起点两根线会同时被吸附。点击起点后拖动鼠标两根线自动按规则中的Preferred Gap张开。需要拐弯时用ShiftSpace循环切换拐角模式我一般切到45度或圆弧模式。走线过程中可以用逗号键,和句号键.来切换不同的宽度/间距组合这个适用于同一对线在不同区域需要动态调整线距的场景。要换到另一层按小键盘*放置过孔并切换层。遇到障碍也可以按ShiftR切换避障模式但我更推荐在规则有空隙时直接绕开不要全靠避障“挤”过去。完成一段走线后左键单击确认结束整条线时右键或Esc退出。说到走线时看不到中心引导线的问题我碰过好几次。解决办法是去Preferences - PCB Editor - Interactive Routing里确认勾选了Show route planning path这个选项。如果只是网络节点不显示那就是连接线显示的问题用View - Connections - Show All就能把飞线调出来。3.3 拐角模式、圆弧走线与共面波导地间距高速差分对走线我一般不允许出现90度直角更不允许出现小于90度的锐角。走线时按ShiftSpace循环切换拐角模式可以切到45度、90度、任意角度和圆弧模式。很多用Allegro的同行习惯圆弧走线在AD20里同样能切出来关键就是在这个循环模式里切到“Arc”相关模式。圆弧走线的好处是拐角处阻抗突变更缓和适合PCIe这类极高速信号。但也不是说所有差分对都用圆弧普通USB 2.0用45度就完全够了圆弧反而占空间。过孔附近的拐角越少越好这是共识。如果你做的是射频或者对阻抗敏感的表层差分走线还涉及到共面波导结构。表层差分对周围需要包地铜时差分对到GND铜皮的间距不能乱设通常要大于差分对内部的线距具体值根据阻抗要求来。这个间距在AD20里通过Clearance规则控制目标范围选差分对到地网络填好所需间距即可。至于表层的铺铜还用得着Polygon Pour Cutout来挖空引脚焊盘附近的地铜防止铺铜离焊盘太近造成焊接困难或者局部阻抗突变。4. 差分对等长调节让相位差不再超标4.1 为什么非要等长目标长度怎么定差分对等长的本质是让正负两根线上的信号传播时间一致保证接收端看到的相位差接近180度。如果长度差太大差分信号会转化成共模信号辐射变强接收端误码率升高这在PCIe、USB 3.x这类高速协议上尤其致命。目标长度怎么定两种思路。第一种是看芯片手册很多FPGA、SerDes芯片会直接给出TX±内部等长的误差范围比如±5mil第二种是根据时序预算来算如果主控没有明确要求就以整组信号里最长的那一对为基准其他对向它看齐。DDR之类的总线喜欢用长度匹配组而差分对这里我一般更关注“对内等长”也就是同一对的正负两根线要尽量一样长。另外提醒一点表层和内层的信号传播速率不同因为介质常数不一样所以等长不是只看物理长度就行的。如果线走在外层又有一部分走内层那要先换算成延时再对比。AD20里可以在长度面板看到每根线的物理长度但真正的信号延时最好结合叠层参数估算。4.2 AD20自动长度调整功能的实际玩法很多朋友以为“自动长度调整”是按一下按钮就全部搞定其实AD20里的功能名字叫Interactive Length Tuning字面意思是交互式长度调谐它并不会完全替你思考而是帮你快速生成蛇形补偿并实时反馈长度数值。我的常规步骤是这样设置目标长度规则Design - Rules - High Speed - Matched Lengths选择对应的差分对类填写目标长度和容差。走完差分对后执行Route - Interactive Length Tuning。点击需要调整的差分对鼠标往一个方向拖动AD20会自动生成长度补偿的蛇形线。拖动过程中按Tab键打开属性面板可以切换补偿样式和参数比如振幅、间距。边拖边看长度显示当长度落在目标值范围内点击确认。属性面板里常见的补偿样式有三种Accordion手风琴蛇形、Trombone鼓包形、Sawtooth锯齿形。我自己的习惯是普通差分对用Accordion空间充足时用Trombone锯齿形基本只用来微调几mil以内的小差值。幅度不要一下子拉太大否则蛇形线会吃掉过多空间还可能带来额外的串扰。4.3 蛇形线的间距和振幅必须控制好蛇形线不是拉得越长越好。相邻蛇形分支如果靠得太近蛇形线之间会产生额外的耦合这时候补偿长度的作用没体现反而把信号质量搞坏了。我一般会在属性面板里把蛇形振幅控制在50到100mil级别具体看线宽和叠层相邻蛇形分支中心距至少保持在3倍线宽以上。如果需要补偿的长度实在太大与其硬堆蛇形不如考虑换层绕一小段或者调整布线拓扑让两根线的物理路径更均衡。等长调节做完后记得用测量工具或者PCB面板里的长度列表复核一遍。我习惯把差分对两根线的长度同时显示出来人眼确认差值在容差范围内再跑一遍DRC。不要只看视觉上“蛇形挺漂亮”长度值才是硬指标。5. 差分对走线的避坑经验DRC、平面、铺铜与性能优化5.1 铺铜与参考平面为什么你的差分对阻抗老是飘差分信号的回流路径同样依赖参考平面。如果差分对跨过分割的空隙回流电流就得绕一个大圈阻抗突变非常明显。所以差分对布线之前先看参考平面完不完整尽量让差分对在一整片连续地平面的区域走线。如果表层有铺铜比如做共面波导结构注意铺铜到差分对边缘的距离要一致否则差分对两侧的寄生参数不对称阻抗也会偏。很多人在表层铺了一圈地铜结果距离忽远忽近最后测出来阻抗飘得厉害问题就在这。必要时用Place - Polygon Pour Cutout挖空局部铺铜。比如晶振下方、天线净空区、连接器焊盘附近都可能需要挖掉铜皮。但记住挖空铺铜一定要避开差分线正下方的参考平面位置不能把回流路径给挖断。还有同行问Guard Ring怎么加我一般在敏感模拟输入或者时钟电路周围用Keepout属性画一圈保护环铺铜后自然形成一个隔离带再在环上均匀打过孔效果比单纯拉地线好很多。5.2 DRC检查与90度走线的检查方法AD20的DRC检查我用得最多的是Tools - DRC...跑完之后重点看Clearance、Differential Pairs Routing、Un-Routed这几类错误。差分对走线完成后如果规则里设了线宽线距DRC应该能报出不符合规则的线段点错误条目就能跳到具体位置。关于90度走线和锐角检查AD20在Design - Rules - Manufacturing - Acute Angle这条规则里可以设置最小角度。如果担心板厂蚀刻时锐角处残留药水可以把最小角度设成90度以上DRC就会把小于该角度的拐角报出来。不过实际项目中45度走线是允许的只要没有小于45度的尖角就行。我最常用的是设置最小角度为45度既能查出锐角尖角又不会把正常的45度走线误判成违规。5.3 AD20用的时间长了卡顿试试清理缓存工程大了之后AD20走线会变卡尤其是开了在线DRC和实时高亮的时候。这里有两个优化方向。第一走线阶段把不必要的在线DRC检查项关掉只保留关键规则等走完线再统一跑批量DRC。第二AD20的临时缓存会越积越多清理方法很简单关闭软件到%APPDATA%\Altium\Altium Designer 20\Temp目录下删掉旧的临时文件重启后AD20会重新生成缓存。如果你改过临时目录就去Preferences - Data Management - System里查看当前路径。我一般布线一两周清一次缓存实测打开大板卡的速度会明显回来。注意删缓存前先保存工程别把当前会话的临时文件删到一半导致工程损坏最好在完全退出AD20后再清理。6. 常见问题与排查技巧实录6.1 高频问题速查表下面这张表是我平时被问得最多的几类差分对问题整理成一个速查表问题现象可能原因解决办法PCB里识别不出差分对网络命名不满足_P/_N规则原理图未放差分对指示符统一命名规则重新导入网表在Differential Pairs Editor里手动添加规则设了但走线不按线宽线距走规则优先级冲突目标范围选错把Differential Pairs Routing规则优先级提前目标范围精确到差分对类走线时只有一根线动没有进入差分对布线模式在用普通布线按两次I确认状态栏显示Differential Pair Routing看不到中心引导线Preferences里相关显示选项被关勾选Show route planning path用View - Connections - Show All显示飞线差分对之间DRC报间距错Clearance规则没有单独设置在Clearance里增加差分对到其他网络的间距规则PCIe发送差分对间到底要不要等长TX±内部必须等长lane与lane之间按芯片手册要求优先保证同一差分对内部等长误差控制到±5mil内再按手册要求处理lane间等长蛇形等长后眼图反而变差蛇形线振幅过大、分支间距太小降低振幅增大相邻分支间距改用Trombone模式6.2 几个实战提醒第一叠层和阻抗参数一定要跟板厂提前确认。你按网上的6mil/6mil模板设置100Ω差分板厂那边却换了PP片厚度结果完全对不上。现在越来越多的板厂会提供阻抗叠层参考AD20的层叠管理器里也能填材料参数我建议在布线前就把这些数字定死后面线宽线距才有依据。第二差分对走线尽量少换层。每过一个过孔阻抗连续性都会变差一点。如果非要换层过孔旁边加一个地过孔给回流信号提供一个就近的参考路径能明显改善这个区域的阻抗连续。第三学会看长度面板和批量DRC的报告不要靠肉眼。我自己带人的时候要求每个差分对在布线完成后都要把长度差值显示出来确认在容差内再去做等长修饰。很多看起来光鲜的PCB一查长度其实根本不合格最后板子回来问题一大堆。6.3 我遇到的一次PCIe差分等长问题最后分享一个真实教训。之前处理一块PCIe板卡TX差分对内长度只差了10mil左右我一开始以为这个数值在容差内但高速仿真时眼图一直有异常后来把过孔延时加进去重新算发现过孔带来的长度贡献其实不小实际等效长度差已经超了。后来我调整策略把目标长度计算时把过孔、连接器和器件引脚的部分都折算进去再做等长调节眼图马上恢复正常。虽然AD20里没法完全自动考虑过孔延时的精确长度但你在定目标长度时可以把补偿余量留出来不要卡在刚好压线的边界值。那次之后我养成了个习惯每对差分做等长不只看PCB走线的物理长度还会把过孔数量统计一遍两边的过孔数量尽量一致。这就是经验带来的差别规则书里不会写但实际项目里非常管用。我也建议你在AD20里做差分对时把这些维度都考虑进去出来的板子才更稳。