简介:这份文档面向使用 Altium Designer 与 Cadence Allegro 的 PCB 设计工程师,聚焦跨平台封装复用这一常见痛点,讲解如何把 AD 中的封装完整迁移到 Allegro 环境中,适合具备一定 EDA 操作基础、需要减少重复建库工作的中高级设计人员参考。资源包为单个 docx 文档,压缩后约 63KB,内容围绕封装导入的完整链路展开,涵盖在 AD 中新建 PCB 并放置目标封装、另存为 PCB ASCII 格式、在 Allegro 中通过 CAD Translators 导入 Altium PCB、导出 Library 后分类整理 symbol、shape 与焊盘文件,以及最终在库路径中加载并核对封装尺寸与连接一致性等关键环节。文中还提示了路径避免中文字符等易被忽略的细节,可帮助读者快速复用已有封装、降低重复建库成本。目前已有 1471 人学习下载,适合需要打通 AD 与 Allegro 封装流转的读者参考。
1. AD 封装导入 Allegro:跨工具链迁移到底卡在哪
很多做硬件的朋友都遇到过这种局面:原理图和一部分封装在 Altium Designer 里已经画好了,但项目后期因为仿真、约束管理或者团队协作的原因,PCB 要转到 Allegro 里做。这时候最直接的想法就是——能不能把 AD 的封装直接搬过去,省得在 Allegro 里一个个重建。答案是能,但过程远没有想象中那么顺滑。
这个标题讲的核心,就是 AD 封装如何导入 Allegro 并生成可用的 Allegro 封装。它解决的是跨 EDA 工具链的封装复用问题,适合那些手头有现成 AD 封装库、又必须在 Allegro 里完成后续设计的工程师。难点不在于“能不能导”,而在于导过去之后焊盘丢了、层映射错了、丝印跑偏了这些玄学问题。下面我按实际操作的顺序,把这条路走通。
2. 先搞清楚两条工具链的封装模型差异
2.1 AD 的封装是“焊盘 + 图元”的扁平结构
Altium Designer 的 PCB 封装(PCB Library 里的 Footprint)本质上是一个扁平容器:里面放了一堆 Pad、Track、Arc、Fill、Region 和 Text,每个元素有自己的 Layer 属性。它没有强制的“引脚编号到焊盘”的映射表,焊盘编号(Designator)直接写在 Pad 属性里,丝印和阻焊也是普通图元,靠 Layer 区分。
这种结构的好处是灵活,坏处是缺少语义约束。比如一个焊盘的顶层阻焊开窗,在 AD 里可能就是一个放在 Top Solder 层的 Fill,它和焊盘之间没有绑定关系,只是位置重叠。导出的时候如果只导焊盘不导图元,阻焊就丢了。
2.2 Allegro 的封装是“Padstack + Symbol”的分层结构
Allegro 的封装(Package Symbol,后缀 .dra)建立在 Padstack 之上。每个焊盘是一个独立的 Padstack 文件(.pad),定义了顶层焊盘、阻焊、钢网、内层焊盘等各层的形状和尺寸。Symbol 里放置的是 Pin,每个 Pin 引用一个 Padstack,并带有引脚编号。丝印、装配、禁布区分别放在 Package Geometry 的 Silkscreen、Assembly、Place_Bound 等子类里。
关键差异在于:Allegro 的焊盘是“先定义 Padstack,再实例化到 Symbol”,而 AD 的焊盘是“直接画在封装里”。这意味着导入过程必须做一次结构转换——把 AD 的 Pad 提取成独立的 Padstack,再把图元按层映射到 Allegro 的 Class/Subclass 体系里。
2.3 为什么不能直接复制粘贴
有人会想,能不能在 AD 里全选复制,到 Allegro 里粘贴?不行。两个工具的底层数据格式完全不同,AD 用的是二进制 OLE 复合文档,Allegro 用的是文本化的 .dra/.pad 格式,剪贴板协议也不互通。必须走中间格式或者专用转换路径。
常见的可行路径有三条:一是通过 AD 导出 STEP 或 DXF 再在 Allegro 里重建,但这样只保留了外形,焊盘和网络信息全丢;二是用 AD 的 PCB 导出功能生成 Allegro 可读的网表加封装库,但 AD 原生不支持直接导出 .dra;三是借助中间格式如 IPC-7351 的 .txt 或者第三方转换脚本。实际项目中,最稳的是走“AD 导出 → 中间格式 → Allegro 导入 → 手工修正”这条路。
3. 用中间格式把 AD 封装转成 Allegro 能吃的数据
3.1 从 AD 导出焊盘和图元信息
AD 本身没有“导出 Allegro 封装”的菜单,但可以通过脚本或者导出报表的方式把封装信息提取出来。我一般会先用 AD 的 PCB Library 面板,把目标封装单独打开,然后用 Report 功能导出焊盘列表。
# 在 AD 的 PCB Library 中,对目标封装执行: # Reports -> Component Rule Check 可以检查焊盘编号重复等问题 # 更直接的方式是用 AD 的脚本系统导出焊盘坐标和尺寸AD 支持用 DelphiScript 或 VBScript 写导出脚本。下面是一个简化的 VBScript 片段,遍历当前封装的所有焊盘并输出编号、坐标、尺寸和层信息:
' AD 导出焊盘信息脚本片段 Dim Pad As IPad For Each Pad In CurrentFootprint.Pads ' 输出焊盘编号、X/Y 坐标、尺寸 ' 单位统一转换为 mil,Allegro 默认用 mil ReportLine = Pad.Name & "," & _ Pad.XLocation & "," & _ Pad.YLocation & "," & _ Pad.TopShapeSizeX & "," & _ Pad.TopShapeSizeY ' 写入文本文件供后续处理 WriteToFile ReportLine Next这段脚本的逻辑是遍历封装内的所有焊盘对象,把编号、坐标和顶层尺寸导出成 CSV。参数说明:Pad.Name是焊盘编号,Pad.XLocation和Pad.YLocation是相对于封装原点的坐标,TopShapeSizeX/Y是顶层焊盘尺寸。注意 AD 内部单位可能是 mil 也可能是 mm,导出前要确认当前库的单位设置,不然后面 Allegro 里尺寸会差 25.4 倍。
3.2 生成 Allegro 可读的 Padstack 描述文件
Allegro 的 Padstack 可以用文本格式描述,然后通过 Skill 脚本或者手动在 Padstack Editor 里创建。更高效的方式是写一个转换脚本,把上一步的 CSV 转成 Allegro 的 Padstack 定义。
# 将 AD 导出的焊盘 CSV 转换为 Allegro Padstack 参数表 import csv # Allegro Padstack 常用参数:单位 mil,焊盘形状分圆形和矩形 # 顶层焊盘、阻焊开窗、钢网层分别定义 def convert_to_allegro_padstack(csv_path, output_path): with open(csv_path, 'r') as f: reader = csv.reader(f) with open(output_path, 'w') as out: for row in reader: designator = row[0] x = float(row[1]) y = float(row[2]) size_x = float(row[3]) size_y = float(row[4]) # 判断形状:长宽相等为圆形,否则为矩形 if abs(size_x - size_y) < 0.01: shape = "CIRCLE" diameter = size_x out.write(f"PAD {designator} {shape} {diameter} " f"AT {x} {y}\n") else: shape = "RECTANGLE" out.write(f"PAD {designator} {shape} {size_x} {size_y} " f"AT {x} {y}\n") # 阻焊开窗通常比焊盘大 4 mil out.write(f"SOLDERMASK {designator} +4mil\n") # 钢网层与焊盘等大 out.write(f"PASTEMASK {designator} +0mil\n")这段代码的核心逻辑是读取 CSV,按长宽是否相等判断焊盘形状,然后输出 Allegro Padstack 的参数行。参数说明:+4mil是阻焊开窗的典型余量,实际项目中要根据板厂工艺调整,常见范围是 2 到 6 mil。钢网层一般与焊盘等大,但如果是 BGA 或者细间距器件,可能需要开窗缩小到 80% 到 90%。
3.3 在 Allegro 里批量生成 Padstack 和 Symbol
有了 Padstack 参数表之后,可以在 Allegro 里用 Skill 脚本批量创建 .pad 文件,然后再创建 .dra 符号。Skill 是 Allegro 的脚本语言,下面是一个创建 Padstack 的简化示例:
; Allegro Skill 脚本:批量创建 Padstack ; 假设参数表已经读入为列表 pad_list foreach(pad pad_list let((padName shape sizeX sizeY) padName = nth(0 pad) shape = nth(1 pad) sizeX = nth(2 pad) sizeY = nth(3 pad) ; 调用 axlPadstackEdit 创建新 Padstack axlPadstackEdit(padName ?units "mils" ?shape shape ?width sizeX ?height sizeY ?drillSize 0 ; 表贴焊盘钻孔为 0 ) ) )这段 Skill 脚本遍历参数列表,对每个焊盘调用axlPadstackEdit创建 Padstack。参数说明:?units "mils"指定单位,?shape是形状,?width和?height是尺寸,?drillSize 0表示表贴焊盘。如果是通孔焊盘,需要额外指定钻孔尺寸和钻孔符号。
创建完 Padstack 后,再在 Allegro 的 Package Symbol 编辑器里放置 Pin,每个 Pin 引用对应的 Padstack,并设置引脚编号。丝印和装配层的信息需要从 AD 导出的图元坐标重新绘制,这一步目前没有完美的自动化方案,通常需要手工调整。
4. 层映射和丝印重建:最容易翻车的地方
4.1 AD 层名到 Allegro Class/Subclass 的对应关系
AD 的层命名和 Allegro 的 Class/Subclass 体系不是一一对应的。AD 的 Top Layer 对应 Allegro 的 ETCH/Top,Top Overlay 对应 PACKAGE GEOMETRY/SILKSCREEN_TOP,Top Solder 对应 PACKAGE GEOMETRY/SOLDERMASK_TOP。如果映射错了,丝印会跑到阻焊层上,或者焊盘开窗消失。
下面是一张常用层的映射表,建议在转换脚本里硬编码这套对应关系:
| AD 层名 | Allegro Class | Allegro Subclass |
|---|---|---|
| Top Layer | ETCH | TOP |
| Bottom Layer | ETCH | BOTTOM |
| Top Overlay | PACKAGE GEOMETRY | SILKSCREEN_TOP |
| Bottom Overlay | PACKAGE GEOMETRY | SILKSCREEN_BOTTOM |
| Top Solder | PACKAGE GEOMETRY | SOLDERMASK_TOP |
| Bottom Solder | PACKAGE GEOMETRY | SOLDERMASK_BOTTOM |
| Top Paste | PACKAGE GEOMETRY | PASTEMASK_TOP |
| Keep-Out Layer | PACKAGE GEOMETRY | PLACE_BOUND_TOP |
这张表是血泪经验总结出来的,尤其是 Keep-Out 层,AD 里可能画了禁布区,但 Allegro 里对应的 Place_Bound 需要单独设置。如果漏了,后续布局时器件会重叠。
4.2 丝印线宽和字体差异
AD 的丝印默认线宽通常是 6 mil 或 8 mil,Allegro 里默认可能是 5 mil。更麻烦的是字体:AD 用的是矢量字体,Allegro 有自己的 Stroke 字体和 TrueType 字体。导入后如果直接沿用 AD 的文本图元,在 Allegro 里可能显示为乱码或者位置偏移。
我一般会在转换后统一做两件事:一是把所有丝印线宽改成 6 mil,二是把文本重新用 Allegro 的 Stroke 字体写一遍。Allegro 的 Skill 里可以用axlTextCreate重新生成文本,指定字体和高度。
; 重新创建丝印文本,使用 Allegro Stroke 字体 axlTextCreate( ?layer "PACKAGE GEOMETRY/SILKSCREEN_TOP" ?text "U1" ?xy list(0.0 50.0) ; 文本位置,单位 mil ?textHeight 40.0 ; 文本高度 40 mil ?lineWidth 6.0 ; 线宽 6 mil ?font "Stroke" ; 使用 Stroke 字体 )参数说明:?textHeight 40.0是字符高度,常见范围 30 到 50 mil;?lineWidth 6.0是笔画宽度;?font "Stroke"指定字体类型。如果器件密度高,文本高度可以降到 25 mil,但不要低于 20 mil,否则丝印看不清。
4.3 焊盘编号和引脚映射的校验
导入完成后,必须逐个检查焊盘编号是否和原理图符号的引脚编号一致。AD 里焊盘编号可能是数字,Allegro 里如果 Padstack 命名不规范,Pin 的编号可能变成默认的 1、2、3,导致网表导入时对不上。
校验方法是:在 Allegro 里打开 Package Symbol,用Tools -> Reports -> Pin Report导出引脚列表,然后和 AD 的焊盘列表做 diff。如果发现编号错位,需要回到 Padstack 创建那一步,检查axlPadstackEdit时是否把编号写进了 Padstack 名称里。
5. 避坑与常见问题排查
5.1 导入后焊盘尺寸整体偏大或偏小
现象:Allegro 里看到的焊盘比 AD 里大了一圈或者小了一圈。原因:单位换算错误。AD 内部可能用 mm,导出时没转成 mil,Allegro 按 mil 解析,导致尺寸差 25.4 倍。解决:在导出脚本里强制做单位转换,或者在 Allegro 导入前用文本编辑器批量检查数值范围,表贴焊盘通常在 20 到 80 mil 之间,超出这个范围基本就是单位错了。
5.2 阻焊开窗丢失或覆盖焊盘
现象:Allegro 里焊盘上没有阻焊开窗,或者阻焊层把焊盘盖住了。原因:AD 的阻焊层图元没有正确映射到 Allegro 的 SOLDERMASK 子类,或者映射到了但尺寸没加余量。解决:检查层映射表,确认 Top Solder 映射到 PACKAGE GEOMETRY/SOLDERMASK_TOP,并且在 Padstack 里显式定义了阻焊开窗尺寸,通常比焊盘大 4 mil。
5.3 丝印跑到焊盘上导致可焊性下降
现象:Allegro 里丝印线压在了焊盘上。原因:AD 的丝印图元坐标直接搬过来,没有做 DRC 检查。解决:在 Allegro 里运行 Package Symbol 的 DRC,检查 Silkscreen 到 Pad 的间距,一般要求至少 4 mil。如果超了,手动挪丝印线或者删掉压焊盘的部分。
5.4 引脚编号重复或缺失
现象:网表导入时报错,提示引脚编号重复或找不到。原因:AD 封装里存在多个焊盘共用同一个编号,或者 Padstack 创建时编号没写对。解决:在 AD 里先用 Component Rule Check 检查焊盘编号,确保唯一;在 Allegro 里用 Pin Report 核对,发现重复就回到 Padstack 重新生成。
5.5 导入后封装原点偏移
现象:Allegro 里封装的原点不在器件中心,布局时坐标对不上。原因:AD 封装的原点可能设在某个引脚上,而 Allegro 默认原点在 Symbol 的 (0,0)。解决:在 Allegro 里用Edit -> Move把封装整体移动到以中心为原点的位置,或者在建 Symbol 时就把原点设在中心。
6. 批量转换的进阶技巧与验证方法
如果手头有几十上百个 AD 封装要转,一个个手工搞肯定不现实。我一般会写一个批处理脚本,把 AD 的 PCB Library 整个导出成中间格式,然后用 Skill 脚本在 Allegro 里批量生成 Padstack 和 Symbol。具体做法是:先用 AD 的脚本遍历库中所有封装,每个封装导出一个 CSV;然后用 Python 脚本把 CSV 转成 Allegro 的 Padstack 参数表和 Symbol 放置脚本;最后在 Allegro 里用 Skill 一次性执行。
验证环节不能省。批量转换后,我会随机抽 10% 的封装做交叉检查:在 AD 里截图,在 Allegro 里截图,叠在一起看焊盘位置和丝印轮廓是否一致。另外用 Allegro 的Tools -> Quick Reports -> Symbol Report导出每个 Symbol 的引脚数和 Padstack 使用情况,和 AD 的焊盘数做对比。如果数量对不上,说明有焊盘在转换过程中丢了。
还有一个技巧是善用 Allegro 的Export -> Symbol功能。如果某个封装在 Allegro 里已经手工修好了,可以导出成 .dra 作为模板,后续类似的封装直接改 Padstack 名称和引脚编号就行,不用从头建。这样能把重复劳动降到最低。
最后说一个我自己的习惯:每次转换完,先拿一个 0603 电阻或者 SOT-23 三极管这种简单封装做验证,确认 Padstack 尺寸、阻焊开窗、丝印位置都对了,再批量处理复杂器件。这个习惯帮我省过好几次大返工。希望帮到你。
本文还有配套的精品资源,点击获取