从Allegro到PCB工厂:如何正确导出Gerber文件并实现无缝制造对接
在高速、高密度PCB设计日益普及的今天,一个看似简单的动作——“导出Gerber”,往往成为决定项目成败的关键节点。你有没有遇到过这样的情况?
- 打样回来的板子焊盘被绿油盖住,贴片无法进行;
- 钻孔偏移导致插件引脚装不进去;
- 工厂反馈“缺层”,反复沟通耽误一周进度……
这些问题,90%都源于Gerber输出环节的疏忽或配置错误。
作为使用Cadence Allegro多年的一线硬件工程师,我想告诉你:导出Gerber不是流程终点,而是设计与制造协同的起点。它不只是点几下菜单生成几个文件,而是一次对设计完整性的最终检验。
本文将带你深入Allegro内部机制,拆解从PCB数据库到标准制造文件的全过程,结合实战经验,手把手教你避开那些“踩了就返工”的坑。
为什么你的Gerber总出问题?先搞懂背后的技术逻辑
很多人把“导出Gerber”当成一键操作,但实际上,这是一个涉及数据映射、格式规范、制造工艺理解的系统工程。
Gerber到底是什么?
简单说,Gerber是一种二维矢量图形描述语言(RS-274X标准),用来告诉PCB厂家:“这一层哪些地方要保留铜皮,哪些要蚀刻掉”。每一个.gbr文件对应PCB的一层物理结构:
| 文件名 | 对应层 | 作用 |
|---|---|---|
GTL.gbr | Top Layer | 顶层走线和焊盘 |
GBL.gbr | Bottom Layer | 底层走线和焊盘 |
GTS.gbr | Top Solder Mask | 顶层阻焊开窗(不上绿油) |
GBS.gbr | Bottom Solder Mask | 底层阻焊开窗 |
GTP.gbr | Top Paste Mask | 顶层钢网开口(用于锡膏印刷) |
GTO.gbr | Board Outline | 板框轮廓 |
此外还有钻孔文件.drl(Excellon格式)、钻孔图.pdf等辅助文件。
这些文件加起来,才构成完整的“制板说明书”。
⚠️ 注意:Gerber本身不包含网络连接信息!它只是“形状图”。所以即使Gerber看起来连着,实际可能断路——这也是为什么必须配合DRC检查。
Allegro怎么把PCB变成Gerber?核心模块解析
在Allegro中,这个转换过程由两个关键工具完成:
- Artwork Format Generator→ 生成各层Gerber
- Excellon Format Generator→ 生成NC Drill钻孔文件
我们一个个来看。
一、Artwork 输出:别再盲目“Add All Visible”了!
进入Manufacture > Artwork后,你会看到一个叫Film Control的界面。这里每一行代表一个输出层。
常见误区:
很多新手直接点击“Add All Visible”,以为屏幕上显示的就是要输出的。但这样会带来严重风险:
- 把调试用的Measure Line也导出去了;
- 忘记关闭DRC标记层,造成干扰;
- 没有为负片层启用Negative模式,导致内电层反了。
正确做法:手动逐层添加 + 显式命名
建议按以下顺序添加层,并设置正确的subclass组合:
Layer: top → Film Name: GTL tSignal → (自动包含) tComponent → (器件边框) pin → (焊盘) Layer: bottom → Film Name: GBL bSignal bComponent pin Layer: tsolder → Film Name: GTS tSoldMask → Expansion: 0 mil shape → (避免多边形重叠) Layer: bsolder → Film Name: GBS bSoldMask shape Layer: top_assy → Film Name: GTO silkscreen_top → 字体清晰、避开焊盘 Layer: outline → Film Name: GKO board_geometry > package geometry board_geometry > route_keepin关键参数设置(Parameters tab)
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Format | RS-274X | 行业标准,支持嵌入Aperture表 |
| Units | Inches | 国内多数厂仍以inch为主 |
| Coordinate Format | 2:5 | 整数2位,小数5位(精度达0.001mm) |
| Zero Suppression | Leading | 去除前导零,兼容性强 |
| Decimal Places | 5 | 必须与格式匹配 |
| Aperture Mode | Flash and Vector | 自动处理焊盘与走线 |
🔍 小技巧:如果你的设计用了负片内层(如VCC/GND平面层),记得勾选该film下的“Negative Image”选项。否则工厂看到的是实心铜皮,而不是你要的“挖空区域”。
二、NC Drill 文件:孔打歪了谁背锅?
钻孔文件.drl是数控钻床的“施工图纸”。一旦出错,轻则报废,重则整批返工。
如何正确生成?
路径:Manufacture > NC > NC Parameters
关键设置如下:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| Unit | Inches | 统一单位,避免混淆 |
| Number Format | 2:5 | 同Gerber保持一致 |
| Zero Suppression | Leading | 标准做法 |
| Output Format | Enhanced Excellon | 支持槽孔、盲埋孔等高级特性 |
| Origin | Absolute (from design) | 使用设计原点,防止偏移 |
| Route Slot | ✔️ Enable | 若有异形孔必须开启 |
然后执行Manufacture > NC > NC Drill,生成主钻孔文件。
别忘了这两个附加输出:
Drill Drawing(钻孔图)
路径:Manufacture > NC > Drill Legend Plot
输出一张PDF,标明每种孔径的数量、位置符号(如A、B、C),方便工厂快速识别。Drill Table(钻孔表)
可在Drawing中插入表格,列出所有Tool ID对应的直径、数量、 plated/non-plated 类型。
✅ 实战建议:将
.drl、.dwg.pdf、.rpt三者打包提交,缺一不可。
一套真正可靠的输出流程(附Checklist)
以下是我在多个通信设备项目中验证过的标准化流程,可大幅降低出错率。
Step 1:输出前自检清单
✅ DRC无报错(特别是Unconnected Pin)
✅ 所有元件已锁定(Prevent Voiding)
✅ 层叠结构确认无误(Stackup Manager)
✅ 添加版本标识:如“Rev 1.2 | Date: 2025-04-05”
✅ 在板角放置“GERBER_OK”文字标记(防误用旧版)
Step 2:启动Artwork输出
- 新建
.art文件,命名为ProjectX_Gerber.art - 逐层添加Film,禁用“Add All Visible”
- 设置全局参数(Units, Format, Origin)
- 负片层启用 Negative 模式
- 阻焊层 Expansion 设为0 mil
- Paste Mask一般只输出Top层(除非双面SMT)
Step 3:生成Drill文件
- 进入NC Parameters,设置Enhanced Excellon格式
- 勾选“Route Slot”支持槽孔
- 生成.drl主文件
- 单独输出Drill Drawing PDF
Step 4:本地验证(至关重要!)
使用Ucamco Viewer或GC-Prevue打开所有文件:
- 检查是否有层缺失(比如忘了导出Bottom Silkscreen)
- 查看阻焊层是否覆盖了不该盖的焊盘
- 叠加Gerber与Drill文件,观察孔环(Annular Ring)是否完整
- 确认丝印字体方向正确,无镜像
💡 经验之谈:我曾因丝印镜像未发现,导致量产时正负极标反,损失十几万。从此养成习惯:每次必看Top和Bottom层的Logo方向是否一致。
Step 5:打包交付
推荐目录结构:
PCB_Delivery_ProjectX/ ├── Gerber/ │ ├── GTL.gbr # Top Layer │ ├── GBL.gbr # Bottom Layer │ ├── GTS.gbr # Top Solder Mask │ ├── GBS.gbr # Bottom Solder Mask │ ├── GTP.gbr # Top Paste Mask │ ├── GBO.gbr # Bottom Silkscreen │ └── GKO.gbr # Keepout/Outline ├── Drill/ │ ├── nc_drill.drl │ └── drill_drawing.pdf ├── Docs/ │ └── PCB_Specification.xlsx └── README.txt其中PCB_Specification.xlsx应包含:
| 项目 | 要求 |
|---|---|
| 板材 | FR-4 TG150 |
| 板厚 | 1.6mm ±0.1mm |
| 铜厚 | 1oz (35μm) |
| 表面处理 | ENIG (Ni/Au) |
| 阻焊颜色 | Green |
| 字符颜色 | White |
| 最小线宽/间距 | 4/4 mil |
| 是否需要阻抗控制 | 是(单端50Ω,差分90Ω) |
那些年我们一起踩过的坑(附解决方案)
❌ 问题1:阻焊盖住了焊盘,SMT贴不了
现象:回流焊后发现某些0402电阻虚焊。
排查结果:打开Gerber发现tSoldMask层在焊盘上有额外Shape覆盖。
根本原因:
设计师手动在tSoldMask层画了Shape做“补油”,但忘记删除;或Expansion设为负值(如-2mil),导致开窗缩小。
解决方法:
- 设置Expansion为0 mil
- 不要在阻焊层手动绘制任何图形
- 让工厂根据钢网尺寸自行优化
🛠️ 快速修复命令:
在Allegro中运行:skill axlSetFindFilter(?enabled '("shapes") ?onScreen nil) axlSelectAll() axlDeleteSelected()
删除当前subclass所有shape。
❌ 问题2:Gerber打开是空白
常见原因:
- Boundary范围设成了“None”或“Window”,而非“Active Area”
- 只选了Partially Visible层,而实际内容在边界外
- Film Control中未添加任何subclass
解决步骤:
1. 回到Artwork Setup
2. 点击“Film Control” → “Boundary”
3. 选择“Active Area”或手动框选Board Outline区域
提示:可以在
Display > Color/Visibility中打开“Package Geometry”查看板框是否存在。
❌ 问题3:槽孔没导出,工厂说“只有圆孔”
背景:电源模块中有长条形安装孔(Slot Hole)。
问题根源:默认情况下,Allegro不会自动识别Padstack中的Slot部分,除非显式启用。
解决方案:
1. 在NC Parameters中勾选“Route Slot”
2. 确保Padstack定义中包含Slot几何(可通过Pad Designer查看)
3. 导出后用Cam350检查是否出现“R”类型指令(代表Routing)
高阶技巧:用Skill脚本自动化输出(提升效率50%)
虽然Allegro主要是GUI操作,但我们可以通过Skill脚本实现一键批量输出,特别适合频繁改版的项目。
以下是一个经过生产验证的简化脚本模板:
; allegro_gerber_export.il axlCmdWatch('on) ; === 用户可配置区 === outputDir = "D:/Projects/Output/Gerber_v1.2" projectName = "NETCOM_8L" ; 创建输出路径 system(strcat("mkdir -p \"" outputDir "\"")) ; 清除旧Artwork配置 axlClearArtwork() ; 创建新Artwork对象 art = axlCreateArtwork() axlSetDatabasePath(outputDir) ; 设置通用参数 axlSetArtworkParam(art ?format 'rs274x) axlSetArtworkParam(art ?units 'inch) axlSetArtworkParam(art ?coordFormat '(2 5)) axlSetArtworkParam(art ?suppress 'leading) axlSetArtworkParam(art ?apertureMode 'auto) ; 添加各层 axlAddLayer(art ?layer "top" ?filmName strcat(projectName "_GTL")) axlAddLayer(art ?layer "bottom" ?filmName strcat(projectName "_GBL")) axlAddLayer(art ?layer "tsolder" ?filmName strcat(projectName "_GTS") ?expansion 0) axlAddLayer(art ?layer "bsolder" ?filmName strcat(projectName "_GBS") ?expansion 0) axlAddLayer(art ?layer "top_assy" ?filmName strcat(projectName "_GTO")) axlAddLayer(art ?layer "outline" ?filmName strcat(projectName "_GKO")) ; 设置输出范围为Active Area axlSetArtworkParam(art ?boundary 'active) ; 生成文件 axlGenerateArtwork(art) println("✅ Gerber files generated.") ; ==== 输出Drill文件 ==== drill = axlCreateDrillPlot() axlSetDrillPlotParam(drill ?unit 'inch) axlSetDrillPlotParam(drill ?format 'enhanced) axlSetDrillPlotParam(drill ?zeros 'leading) axlSetDrillPlotParam(drill ?origin 'absolute) axlSetDrillPlotParam(drill ?routeSlot t) ; 支持槽孔 axlGenerateDrillPlot(drill) println("✅ NC Drill file generated.") ; 完成提示 println("🎉 All manufacturing files exported to: %s" outputDir)📌 使用方式:
1. 保存为.il文件
2. 在Allegro中执行Tools > Execute Script
3. 修改顶部变量即可复用
建议:将此脚本纳入公司模板库,配合Git管理,确保团队一致性。
更进一步:考虑转向ODB++?
尽管Gerber仍是主流,但它本质上是“图形+独立钻孔”的分离式数据模型,存在固有缺陷:
- 层间对齐依赖人工判断
- 缺乏电气属性
- 无法表达组件层级关系
相比之下,ODB++是一种集成化数据库格式,包含了:
- 所有层图形
- 钻孔信息
- 元件位置(含旋转角度)
- 网络表
- 测试点定义
- 材料堆叠
许多高端PCB厂(如捷普、伟创力)已全面支持ODB++,导入效率提升70%以上。
如何在Allegro中输出ODB++?
路径:File > Export > ODB++
只需几步即可生成一个压缩包,内含完整制造数据。
✅ 推荐策略:
- 普通项目继续使用Gerber(兼容性好)
- 复杂HDI板、多层背板优先提供ODB++
写在最后:让每一次输出都值得信赖
当你按下“Generate”按钮那一刻,其实是在签署一份无形的承诺:
“这份设计已完成,可以投入制造。”
因此,与其等到工厂退回修改,不如在输出前多花10分钟做好这三件事:
- 建立企业级.art模板—— 统一标准,杜绝随意性
- 强制本地预览验证—— 用专业工具看一遍
- 撰写清晰加工说明—— 减少沟通成本
记住,优秀的PCB工程师,不仅会画板子,更能确保它被准确地造出来。
未来,随着智能制造、数字孪生的发展,或许有一天我们会告别Gerber。但在当下,掌握“Allegro导出Gerber文件”的每一个细节,依然是每一位高速电路设计者的基本功中的基本功。
如果你正在带团队,不妨把这篇文章转给他们——因为一次成功的输出,胜过十次漂亮的布线。
如果你在实际操作中遇到具体问题,欢迎在评论区留言交流。我可以帮你分析日志、检查配置,甚至一起远程调试。