
在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 Spacing50mil那么相邻两个过孔中心之间的距离就是50mil。如果你的约束管理器里Via-to-Via最小间距是30mil孔径是8mil那50mil是安全的但如果你填了25milDRC就会报错。所以填参数之前先打开约束管理器确认一下最小间距别等到生成完再哭着清错误。除了矩形阵列部分版本还支持圆形/极坐标阵列适合比如圆形板、圆形铺铜区域。圆形阵列需要设置圆心坐标、半径、起始角度、孔数和角度增量。不过实际工作中圆形的孔阵列用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。设置起点坐标。比如从板左下角开始距离板边X25mil、Y25mil的位置作为第一个孔中心那起始坐标就填X25、Y25。计算行列数。如果沿底边打一排孔板宽2000mil减去左右两边到板的距离各25mil可布置范围是1950mil间距50mil那么孔数约等于1950/501也就是40颗。所以X Count填40Y Count填1。设置X Spacing50Y Spacing50虽然Y向只有1行这个值不影响。选择过孔类型比如VIA10D8网络选择GND。点击Preview或确认生成阵列。注意如果孔数算出来带小数要向上取整还是向下取整取决于你的边界要求。比如1950/5039加1就是40颗最后一个孔中心离板边还是25mil完美。但如果可布置范围是1948mil1948/5038.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的区域间距80milX方向大约13列Y方向大约11行X Count13Y Count11。X Spacing80Y Spacing80。选择过孔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 Spacing50mil但约束管理器里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的过孔对象本身没有“动态阵列关联”的概念改一个不会自动联动整列所以“重来一遍”往往比“手动校正”快得多。我自己用这个功能几年最大的感受是——花几分钟把参数想清楚比后期修修改改重要得多。