在PCB Layout这行待久了,你会发现最耗体力的往往不是那些复杂的射频走线,反而是大量重复性的“打孔工作”。比如板边要放一圈接地缝合孔,铺铜区要铺满散热过孔,以前我都是复制粘贴一个、再复制粘贴一个,排间距还得拿尺子量,改一次位置整个区域重新来过,一天下来手都酸了。Allegro 17.4里其实有个专门干这事的工具——Via Array,一次性生成几十上百个过孔,位置、间距、网络都能控制,配合快捷键5分钟就能搞定一片区域的过孔阵列。这篇文章就围绕这个功能,把板边和铺铜区的两种典型场景完整过一遍,操作步骤、参数设置、避坑技巧都会讲到,给正在被手动打孔折磨的朋友做个参考。
1. 先用懂这个需求:哪些地方非过孔阵列不可
1.1 板边过孔阵列到底解决什么问题
做过高速板或者多层电源板的人都知道,板边那一圈过孔不是装饰,而是实实在在的功能孔。它们一般被称为“缝合地孔”或“边缘地孔”。主要作用有三个:第一,把板内多个地层在板边位置连接起来,给回流电流提供低阻抗路径;第二,在板边形成一圈金属围栏,减少边缘电磁辐射,这个对EMC测试很关键;第三,某些结构强度要求高的板子,板边地孔还能增强板边缘的机械强度,防止分层。
很多人有个误区,以为板边孔随便打几颗意思意思就行,其实密密麻麻一排孔和稀稀拉拉几个孔,效果差距非常大。尤其在高频电路里,地孔间距最好小于最高次谐波波长的1/20,才能起到屏蔽效果。举个例子,2.4GHz的板子,板边地孔间距如果能控制在50mil以内,效果就会好很多。这意味着一块10厘米长的板边,可能要打出80颗以上的过孔。这种数量,手动一个个摆,不但效率低,间距也很难保持一致,后期DRC报错都够你查半天。
1.2 铺铜区里的过孔阵列又是干什么的
铺铜区的过孔阵列按用途可以分成几类。最常见的是散热过孔,比如电源芯片下方的大面积铺铜,为了把芯片底部的热量导到背面散热铜皮,需要在焊盘区域打满过孔阵列。这种孔通常很密,几十上百颗都很正常,如果分布不均匀,散热效果会打折扣,有些位置热累积严重,芯片功耗一高就会降频。
第二类是缝合地孔,用来连接不同层的地铜皮。多层板里如果地平面之间只有零星几个连通点,回流电流就需要绕路,回路面积变大,噪声和辐射都跟着涨。所以在铺铜区的关键位置,特别是信号换层区域附近,需要打阵列地孔把上下地层钉在一起。
第三类是隔离屏蔽孔,沿敏感信号区域、电源模块边界或板边铺铜区打一排地孔,把干扰信号包围起来。这种孔不必覆盖很大面积,但要求排列整齐、间距均匀,手动摆放很难做到。
不管哪种用途,本质上都是“大量、规律、重复”的过孔放置需求。手动操作的问题在于:费时、易错、难修改。尤其当板子改了一版,过孔间距要从100mil改成80mil,如果之前是手动摆的,那几乎等于全部重来;而用Via Array只需改一个参数。
2. Allegro 17.4 Via Array功能在哪、原理是什么
2.1 入口与界面
在Allegro 17.4版本中,Via Array功能通常在菜单栏Manufacture下面,路径是Manufacture -> Via Array。如果你的菜单里没有这一项,可能是License没有解锁相关Feature,需要检查一下;客户端版本不同,菜单位置也可能有细微差别,但都不会离这个太远。
打开之后是一个对话框,核心区域大致分为四块:阵列类型、起点和方向、阵列参数、过孔类型及网络。对话框右侧有预览窗口,参数填完,生成结果会实时刷新,方便确认孔位是否落在预期区域。这个预览非常实用,比旧版本靠想象靠谱得多。
如果你习惯于命令行操作,也可以在Command窗口输入“via array”或“create via array”相关命令快速调出,不同补丁版本的命令名稍有差异,可以在命令窗口敲“alias”查看当前用户定义的命令别名。
2.2 阵列类型与参数逻辑
Via Array最常用的是Rectangular矩形阵列,适用于板边、矩形铺铜区这类规整区域。参数主要是:起始坐标(X/Y Offset)、行数(X Count)、列数(Y Count)、行间距(X Spacing)、列间距(Y Spacing)、整体旋转角度、所选过孔名称、网络名称。
理解这些参数的关键在于“以中心到中心计算间距”。比如你设置X Spacing=50mil,那么相邻两个过孔中心之间的距离就是50mil。如果你的约束管理器里Via-to-Via最小间距是30mil,孔径是8mil,那50mil是安全的;但如果你填了25mil,DRC就会报错。所以填参数之前,先打开约束管理器确认一下最小间距,别等到生成完再哭着清错误。
除了矩形阵列,部分版本还支持圆形/极坐标阵列,适合比如圆形板、圆形铺铜区域。圆形阵列需要设置圆心坐标、半径、起始角度、孔数和角度增量。不过实际工作中,圆形的孔阵列用Via Array并不一定要用圆形模式,也可以先生成矩形阵列,再用区域删除把圆外的孔干掉,后面我详细讲。
3. 板边过孔阵列实操:从参数到落孔
3.1 布板前的准备:过孔、规则、网络
别一上来就生成阵列,先把准备工作做足,不然很容易翻车。首先要确认使用的过孔类型已经在物理库中定义好,并且和板厚相匹配。比如板厚1.6mm,孔径一般用8mil或10mil,盘环18mil左右,背钻工艺还要检查是否允许盲埋孔。
然后是规则检查。打开Constraint Manager,找到Spacing规则表,看两个关键值:一是Via to Board Edge,就是过孔中心到板边的距离,一般建议至少10-15mil,避免破盘;二是Via to Via,同网络过孔之间的间距,跟制造工艺有关,常规不小于8mil,实际建议留足20-30mil,不然生产良率会下降。
网络分配也要提前想好。板边缝合孔一般连接到GND网络。如果板边区域有铜皮,且铜皮网络不是GND,那过孔放上去后,铜皮会自动避让,结果就是过孔周围形成一圈禁止区,既起不到连接作用,还会把铜皮割得支离破碎。所以生成前最好确认这块区域的地铜网络是GND,或者暂时先把非GND铜皮停用。
3.2 创建板边过孔阵列的完整步骤
我以一块宽2000mil、高1500mil的矩形板为例,要在板边打一圈间距50mil的GND缝合孔,实际操作步骤是这样的:
- 在PCB Editor中,确保Outline层已经画好板框。
- 执行Manufacture -> Via Array,打开对话框。
- 阵列类型选择Rectangular,旋转角度填0。
- 设置起点坐标。比如从板左下角开始,距离板边X=25mil、Y=25mil的位置作为第一个孔中心,那起始坐标就填X=25、Y=25。
- 计算行列数。如果沿底边打一排孔,板宽2000mil,减去左右两边到板的距离(各25mil),可布置范围是1950mil;间距50mil,那么孔数约等于1950/50+1,也就是40颗。所以X Count填40,Y Count填1。
- 设置X Spacing=50,Y Spacing=50(虽然Y向只有1行,这个值不影响)。
- 选择过孔类型,比如VIA10D8,网络选择GND。
- 点击Preview或确认,生成阵列。
注意,如果孔数算出来带小数,要向上取整还是向下取整取决于你的边界要求。比如1950/50=39,加1就是40颗,最后一个孔中心离板边还是25mil,完美。但如果可布置范围是1948mil,1948/50=38.96,这时候你放39颗,最后间距会变成49.1mil,略小于50;放40颗,末端间距可能不够。这种时候我一般选择放39颗,让边缘孔稍微靠近板边一点,再通过DRC检查来兜底。
3.3 阵列后处理与DRC检查
阵列生成后,别急着欢呼,先做一次后处理。第一步是视觉检查,缩小视图看整体过孔是否整齐,有没有孔骑在板框线上。如果发现外圈孔贴着板边太近,选中阵列最外侧一行过孔,整体向内拖拽合适距离,或者在原生成前就调整起点坐标重新生成。
第二步是DRC检查,执行Update DRC,重点看Via to Board Edge和Via to Via错误。如果之前规则没设好,这里会集中爆一堆错误,不要慌,回到约束管理器修正规则后重新DRC即可。
第三步是注意盲埋孔情况。如果板子用了埋孔或盲孔,阵列生成时默认使用当前孔类型,但有些孔可能在指定层组合里并不存在,DRC会报“No matching via”。此时要检查孔类型选择,确保该过孔覆盖了所有需要的层对。
还有一个小技巧:如果板边是不规则的,比如有圆角或斜边,一个矩形阵列不可能完美贴合边界。我的做法是把矩形阵列的覆盖范围做得比实际板边稍大一些,生成后选中在板外的过孔,再整体删除,或者用“Temp Group”框选多余孔后删除。删孔的时候注意不要误删内部孔,可以先把板内区域用Z-Copy临时围起来,筛掉外部的孔。
4. 铺铜区过孔阵列:结合动态铜皮的正确姿势
4.1 铺铜区阵列的独特难点
铺铜区内打过孔阵列,跟你单独在板边打孔完全不是一个套路。因为过孔放在铜皮上,会触发Allegro的动态铜皮自动避让和连接逻辑。难点主要有三个。
第一是网络匹配问题。过孔的网络必须和铺铜网络一致,否则铜皮会把过孔隔离成一个孤岛,孔和铜之间完全不通,白打了。有些人生成阵列后没检查网络,后期测试发现这块铜皮和地孔不通,排查半天才知道是过孔网络错了。
第二是连接方式问题。过孔和铺铜之间的连接有几种形式:正交全连接、斜交热焊盘、无连接等。如果是散热过孔,我通常设成全连接,因为热阻小、散热效率高;但如果过孔太密,全连接会导致大面积铜皮热量被焊盘吸走,回流焊接时可能出现“冷焊”或者虚焊,所以有时必须用热焊盘连接。这个要根据工艺和芯片功率去平衡。
第三是动态铜皮重构卡顿。在铺铜区一次性生成个几百颗过孔,动态Shape会反复避让,电脑差一点的,每刷新一次卡几秒。尤其你用的是动态铜皮且“Void”方式开了很多孔洞,刷新时间蹭蹭往上涨。
4.2 在铺铜区里创建过孔阵列的流程
以一块GND网络的大面积铺铜区域为例,要在里面打一组80mil间距的GND过孔阵列,步骤如下:
- 先用Shape或动态铜皮完成铺铜,确保网络是GND。
- 调出Via Array对话框。
- 选择起点,这个起点最好放在铺铜区域的一个已知角点,比如铜皮左下角内侧偏移40mil的位置。
- 设置行列数。比如要覆盖一片1000mil×800mil的区域,间距80mil,X方向大约13列,Y方向大约11行,X Count=13,Y Count=11。
- X Spacing=80,Y Spacing=80。
- 选择过孔VIA10D8,网络GND。
- 点击Generate生成。
生成之后,如果当前是动态铜皮,过孔会自动与铜皮连接,不需要手动更新;但如果你是静态铜皮Static Shape,必须选中Shape,执行Update Shape或者右键“Update”一下,否则过孔区域会保留一个避让空白,DRC也会报错。
这里还要特别注意“禁止铺铜区”的影响。如果铺铜区域内有禁布区(比如螺丝孔周围的Route Keepout),阵列生成时不会自动绕开,而是会直接覆盖在区域上。所以要在放置阵列之前,先用Shape Void或者Keepout把禁布区画出来,再生成数组。生成后,禁布区内的过孔需要手动删除,否则等于白打还可能造成短路风险。
4.3 热焊盘、连接方式与隔离
关于连接方式,我分享一个经验:过孔阵列用于大电流通路时,一定要检查Shape->Global Shape Params中的“Pins”设置。如果你选了Thermal Relief,过孔与铜皮的接触面积只有几条细筋,大电流情况下载流不够,可能发热严重。我通常在铺铜区阵列里选择“Orthogonal”或“Full Contact”,确保每个过孔盘四周都接触铜皮。
但全连接也不是万能的。如果板上同时有电源过孔和地过孔在铜皮上密集交错,全连接可能导致焊接时热量传导过快,尤其是手工补焊的时候,很难上锡。所以有些工厂会要求在电源过孔区域用热焊盘连接,便于焊接。我一般会在设计阶段跟PCB厂沟通工艺能力,再决定用哪种连接方式。
隔离问题也要重视。铺铜区的过孔阵列如果靠近模拟电路区域,可能会把数字地噪声通过铜皮带过来。这种场景下,建议在敏感区域外单独打一圈地孔隔离阵列,而不是全区域均匀分布。由于Via Array默认是矩形覆盖,打这种隔离带时可以先沿区域边缘生成一个宽一行的长条阵列,形成“围墙”。
5. 常见问题与排查技巧
5.1 阵列生成了却连不上铺铜/网络不对
最常见的现象是:过孔阵列明明放在了GND铺铜里,但过孔周围出现一圈圆圈,看起来像被铜皮“挖空”了。原因基本是过孔网络不是GND,或者Shape的避让规则把不同网络的孔都避让了。
解决方法很简单,选中所有阵列过孔,打开Edit -> Change Net,把网络改成GND,然后选中铜皮,右键Update Shape。如果过孔网络已经是对的,那就要看一下Shape里是否设置了“Void All Different Net”,改成“Void”或者“Isolate”即可。
还有一个隐藏坑:如果使用了动态铜皮,且铜皮图层有多个“Cutout”或“Void”元素,阵列生成后新过孔触发避让,可能会导致铜皮被“咬掉”一大块,看起来像网络错误。这时不要直接删孔,先放大检查铜皮避让边界,如果只是避让异常,可以选中Shape重新生成一次。
5.2 DRC报间距错误、阵列偏移
这类问题多半出在参数设置阶段。比如你设X Spacing=50mil,但约束管理器里Via-to-Via是60mil,生成立刻报几十个错误。解决方法是去调整Spacing规则或重新填更大的阵列间距。注意,Allegro的同网络Via间距和异网络Via间距是分开定义的,要根据实际过孔网络去查对应的规则对。
阵列偏移则是起点坐标算错了。经常有人把起点坐标理解成“阵列中心”而不是“第一个孔中心”,导致整列偏了一大截。实际上起点坐标是第一个孔的位置,不是中心点。如果是沿板边打孔,记得加上离边距离,并且要注意Overflow的孔是否超出边界。
另外,如果板框有圆角,矩形阵列的四个角可能会让外侧孔看起来“凸出去”。这时候不要直接改所有孔坐标,我建议检查外侧孔离板边距离,如果只是个别孔离得太近,可以单独删除外侧孔,或者用“Coordinate”命令微调。
5.3 快捷键设置与效率优化
Allegro 17.4里,“Via Array”这种高频命令完全值得绑一个快捷键。方法很简单:找到环境变量目录下的env文件,比如%HOME%\pcbenv\env,用文本编辑器打开,在末尾添加一行:
funckey va 'manufacture via_array'保存后重启PCB Editor,按va就能直接调出Via Array对话框。注意不同版本命令名有差异,可以先在Command窗口输入“alias”,看当前用户环境里是否已有批量阵列命令的别名,借鉴一下命名习惯。
除了Via Array本身,建议把更新动态铜皮的命令也绑定快捷键,比如:
funckey fs 'shape fill' funckey fd 'update drc'这样生成阵列后,按一下更新铜皮,再按一下跑DRC,操作节奏会顺很多。实际工作流里,我一般是va打开阵列,参数调好点确认,然后fs刷新铜皮,再fd检查DRC,整套动作十秒钟完成。
6. 实测经验与扩展技巧
6.1 我的个人习惯
用这个功能几年,我总结了一套自己的操作习惯。首先,凡是超过20个孔的规则阵列,一律用Via Array,不手动。哪怕只是临时测试板,手动打完也浪费时间。其次,每次生成之前都会先算一遍“起点+数量+间距”是否落在目标范围内,而不是盲目点生成。特别是距离单位,Allegro默认可能用mil也可能用mm,填数值之前看一眼单位,真是吃过亏,曾经把50mil填成50mm,整板孔距变成一个天文数字,撤销都卡了半天。
第二点,我很少一次性用一个超大阵列覆盖整个板子。更大面积的需求,我一般切成几个小阵列分别生成。比如板边的底边一条、顶边一条,两侧各一条,分开打。这样后期如果需要调整某一边的孔密度,只要重新生成那一条就行,不会殃及其他区域。如果一开始全板一个大阵列,改一处等于全部重来,非常被动。
6.2 后续扩展:脚本和复用
Via Array本身参数化、批量化地做阵列已经够了,但如果你的公司经常做类似结构的板子,还可以用Allegro Skill脚本把这套流程录下来。写一个简单的Skill函数,把板宽、孔间距、孔径、GND网络作为输入参数,自动计算行列数并调用Via Array命令,真正做到“一键铺孔”。这个进阶玩法适合量大、周期紧的项目,前提是你了解基本的Skill语法。
另一个利用率很高的扩展是结合“禁止铺铜区”快速做圆形孔阵。比如螺丝孔周围一圈地孔,用Via Array的矩形阵列先生成一个Rectangular矩阵,覆盖住圆形区域,然后用坐标公式筛选圆内过孔,删除圆外过孔,再将剩余孔旋转对齐。这个过程虽然有点绕,但比手动一个个放还是快得多。
最后再分享一个小技巧:生成阵列后,如果发现间距或者大小不理想,千万别一颗颗去拖。正确做法是选中整个阵列过孔(可以用右键按属性选择,或者先框选再过滤),删除后重新调参数生成一次。Allegro的过孔对象本身没有“动态阵列关联”的概念,改一个不会自动联动整列,所以“重来一遍”往往比“手动校正”快得多。我自己用这个功能几年,最大的感受是——花几分钟把参数想清楚,比后期修修改改重要得多。