最近一段时间,关于"AI 直接生成 PCB"的讨论热度很高,各种演示图在群聊和技术社区里反复流传:一句自然语言描述,几秒钟之后一张排版漂亮、走线规整的双层板就出现在屏幕上。看起来确实惊艳,但做过实际硬件项目的人第一反应通常是——这张图能过 DRC 吗?封装和实物对得上吗?导出 Gerber 之后工厂能直接生产吗?
本文不讨论某个具体模型是否真实存在、版本号是多少、官方演示用了多少张显卡,这些信息在没有可靠来源的情况下没有工程价值。本文要做的事情更实在:假设你手上真的拿到了一份"AI 生成的 PCB 方案",如何用嘉立创 EDA 把它一步步落到可打样的程度,中间需要做哪些校验,哪些地方最容易翻车,以及怎样用一个相对客观的标准去判断一张演示图到底是"看着漂亮"还是"真的能造"。
文章面向三类读者:刚接触 PCB 设计的电子相关专业学生、需要快速做验证板但硬件经验不多的软件工程师、以及想了解 AI 辅助 EDA 当前边界的技术负责人。读完之后你至少能掌握:嘉立创 EDA 的完整出板流程、AI 产出物的落地方法、一套可复用的板级检查清单,以及几个能直接跑起来的 Python 校验脚本。
1. AI 辅助 PCB 设计的背景与能力边界
1.1 从一句描述到一块能打的板子,中间隔着什么
很多人对 AI 画板的期待,来源于对"画图"这件事的误解。PCB 设计表面上是在画线和摆元件,实际上它是一连串强约束下的工程决策:电气连接必须与原理图一致,元件封装必须与实物引脚一一对应,走线宽度要满足载流和阻抗要求,间距要满足工厂的工艺能力,丝印不能压在焊盘上,过孔不能打在焊盘中心造成漏锡,板框必须闭合且与结构件匹配。任何一环出错,板子回来就是一块昂贵的镇纸。
所以真正决定一块板能不能用的,不是布线好不好看,而是"网表—封装—规则—制造文件"这条链条是否完整闭合。AI 在这些环节上的能力差异极大:它在文本层面(生成网表、生成 BOM、写设计规则说明)表现通常不错,因为这些都是结构化文本;而在几何层面(精确的封装尺寸、精确的阻抗控制、精确的拼板与工艺边)则很容易出现看似合理但数值错误的输出。
理解这一点之后,你就不会再把注意力放在"AI 画的线好不好看"上,而是会先去检查它给出的元件清单和封装库。这是硬件工程师和围观群众看待同一张演示图时的根本区别。
1.2 AI 在 PCB 流程中能介入的三类产物
把整个流程拆开看,AI 目前能比较稳定地介入的是三类产物,它们的可信度依次递减。
第一类是结构化文本,包括元件清单(BOM)、网表(Netlist)、引脚连接表、简单的设计说明。这类内容的正确性可以被程序自动验证,比如用脚本比对网表和 BOM 的位号集合是否一致。只要验证脚本写得对,AI 的输出质量就是可度量的。
第二类是规则与参数建议,比如"这块板用 1.6mm 板厚、1oz 铜厚,USB 差分对按 90Ω 控制,线宽 0.2mm、间距 0.2mm"。这类建议本身在教科书里就有,AI 只是帮你查表,但它在代入具体叠层参数时经常算错,必须人工复核。
第三类是几何布局布线,也就是最吸引眼球的那部分。这一类的输出必须经过 DRC(Design Rule Check,设计规则检查)和人工目视双重校验,绝不能直接下单。任何跳过 DRC 直接导 Gerber 的操作,都属于把风险转移给钱包。
1.3 演示图和可制造文件之间的距离
演示图通常有几个共同特征:视角选得很好、层叠颜色搭配漂亮、走线走的是"艺术线"、板子上元件密度低。而真实的可制造文件需要满足的是一堆枯燥的条件:丝印字符高度不小于工厂最小值、阻焊开窗有足够的余量、Mark 点位置对称、板框在机械层是闭合多段线、钻孔文件与 Gerber 层对齐。
把这两者放在一起对比就会发现,演示图证明的是"模型能生成符合视觉审美的几何图形",而可制造文件证明的是"这些几何图形满足一整套工艺约束"。前者是美学问题,后者是工程问题,两者之间没有必然联系。这也是为什么很多演示看起来惊艳,但真拿去跑 DRC 会报出几十条错误的原因。
2. 环境准备与工具版本说明
2.1 硬件与操作系统环境
PCB 设计对硬件的要求不算高,但也不是随便一台机器都能顺畅跑。本文示例使用的环境是一台 16GB 内存的笔记本,独立显卡并非必需,集成显卡完全够用。如果你的板子层数较多、铺铜面积大,内存建议上到 16GB 以上,8GB 在铺铜重算时会明显卡顿。
操作系统方面,嘉立创 EDA 支持 Windows、macOS 和 Linux 桌面环境,另外还有网页版。本文示例以 Windows 桌面客户端为主,macOS 的操作路径基本一致,Linux 下需要注意字体渲染和依赖库的差异。网页版适合快速查看和轻量修改,但涉及大批量铺铜和 DRC 时,客户端更稳定。
版本方面,嘉立创 EDA 有标准版和专业版两条产品线。标准版上手快、约束少,适合教学和简单双层板;专业版在层叠管理、规则约束、差分对、等长绕线等方面更完整,适合有工程要求的项目。本文的实操部分以专业版的操作逻辑为主,如果你用的是标准版,部分约束设置的入口和名称会有差异,需要按实际界面调整。版本迭代较快,本文不写死具体版本号,请以你安装时的最新稳定版为准。
2.2 辅助工具链
单靠一个 EDA 工具是不够的,实际项目里还需要几个辅助工具配合。
| 工具 | 用途 | 是否必需 |
|---|---|---|
| 嘉立创 EDA | 原理图绘制、PCB 布局布线、DRC、Gerber 导出 | 必需 |
| Python 3.8+ | 运行 BOM/网表校验脚本 | 强烈建议 |
| Gerber 查看器 | 独立复核导出的 Gerber 是否正确 | 强烈建议 |
| KiCad(可选) | 用 kicad-cli 做交叉校验,验证网表一致性 | 可选 |
| 文本对比工具 | 对比两版 BOM 的差异 | 可选 |
这里特别说明一下 Python 环境的准备。校验脚本用到的是标准库xml.etree.ElementTree、csv、re,不需要额外安装第三方包,Python 3.8 及以上都能直接跑。如果你的机器上没有 Python,装一个官方安装包即可,注意安装时勾选"Add Python to PATH"。
# 检查 Python 版本,确认在 3.8 以上 python --version # 或者在部分 Linux / macOS 环境下 python3 --version至于 KiCad,它在 7.0 版本之后提供了命令行工具kicad-cli,可以脚本化执行 DRC 和导出。如果你的板子是在 KiCad 里画的,这个工具非常好用;如果全程在嘉立创 EDA 里做,它就只是一个可选的交叉验证手段。
2.3 示例项目结构
为了让后面的脚本有明确的输入输出,这里约定一个简单的项目目录结构。实际项目中你可以按团队习惯调整,但建议把"设计文件"和"校验脚本"分开存放,避免误删。
my-board/ ├── design/ │ ├── my-board.epro # 嘉立创 EDA 工程文件 │ ├── my-board.net # 导出的网表 │ └── my-board-bom.csv # 导出的 BOM ├── scripts/ │ ├── check_bom.py # BOM 完整性校验 │ ├── check_netlist.py # 网表与 BOM 交叉校验 │ └── trace_width.py # 走线载流能力估算 ├── output/ │ ├── gerber/ # Gerber 与钻孔文件 │ └── report/ # DRC 报告、校验结果 └── README.md这个结构看起来有点小题大做,但只要做过一次改版就会明白它的价值:当下单前发现某个位号缺失时,你能立刻定位到是 BOM 导出问题还是原理图本身漏了元件,而不是在两个软件之间来回翻。
3. AI 产出物落地到嘉立创 EDA 的正确姿势
3.1 明确你要 AI 交付什么格式
很多人拿到 AI 输出的第一反应是"给我画个板子",这是最容易踩坑的提问方式。正确的做法是把需求拆成可校验的交付物,明确要求它输出:元件清单表格(含位号、型号、封装、数量)、连接关系表(网络名 + 引脚列表)、以及一段设计约束说明(板厚、铜厚、线宽、间距、层数)。
这样做的原因很直接:表格和列表是可以被程序读取和比对的,而一张图片不能。你没办法写脚本去校验 PNG 里的走线是否短路,但你可以写脚本去校验 CSV 里的位号是否重复、封装字段是否为空。
如果对方只能给图,那就把它当作"设计意图示意",所有的电气信息必须由你重新录入原理图。这一点没有捷径。
3.2 网表与 BOM 的字段规范
无论 AI 用什么格式输出,最终导入 EDA 之前都要统一成一套字段规范。建议至少包含下面几个字段,字段名保持英文,避免中文逗号和编码问题。
| 字段名 | 含义 | 示例 | 是否必填 |
|---|---|---|---|
| Designator | 位号 | R1、C12、U3 | 是 |
| Value | 参数值 | 10k、100nF、STM32F103C8T6 | 是 |
| Footprint | 封装名 | 0402、SOP-8、LQFP-48 | 是 |
| Quantity | 数量 | 1 | 是 |
| Description | 描述 | 上拉电阻 | 否 |
| Manufacturer | 厂商 | 通用 | 否 |
这里最容易出问题的是Footprint字段。AI 常常给出"0402"这种只有尺寸没有类型的值,而实际封装名应该是"R0402"或"C0402"这种带器件类型的写法。如果 BOM 里电阻和电容的封装都写成"0402",导入 EDA 之后就会因为封装库匹配不上而全部报错。所以这个字段必须人工过一遍。
3.3 从网表到 PCB 的导入检查点
把网表导入 EDA 生成初始 PCB 之后,不要急着布线,先做三个检查点。
第一,元件数量核对。原理图里有多少个元件,PCB 上就应该出现多少个封装,数量对不上说明网表导出不完整或者封装缺失。
第二,封装外形核对。重点看引脚数多的器件,比如 LQFP-48 的芯片,封装上必须是 48 个焊盘。曾经出现过封装库里同名封装引脚数不同的情况,导入后芯片的某几个引脚悬空,布线时完全看不出来,直到调试阶段才发现。
第三,网络连接核对。随机抽取三到五个关键网络(比如电源、地、复位、晶振),在原理图和 PCB 上分别看它们的连接点数量是否一致。这一步花不了几分钟,但能拦住大部分网表层面的严重错误。
4. 完整实战:从零做一块可打样的最小系统板
这一节用一个 STM32 最小系统板作为实战案例,把整个流程走一遍。选择这个案例的原因是它足够典型:有 MCU、有晶振、有复位电路、有电源滤波、有下载接口,覆盖了新手 90% 会遇到的问题,同时又足够简单,双层板就能搞定。
4.1 需求定义与元件选型
先明确这块板要做什么:一颗 STM32F103C8T6 主控,8MHz 外部晶振,复位按键,SWD 下载口,5V 转 3.3V 的 LDO 供电,以及把所有 GPIO 引到两侧排针上方便飞线。
选型上有几个原则值得说。第一,尽量选嘉立创商城有现货的基础库元件,这样贴片成本低、交期短;第二,LDO 选 SOT-23 封装的通用型号,比如 AMS1117-3.3,虽然效率不高但足够简单;第三,晶振选 5032 贴片封装,负载电容按晶振手册给的数值配;第四,排针用 2.54mm 间距,方便插杜邦线。
整理成 BOM 大致是下面这样。这里只列关键元件,实际项目里还要加 decoupling 电容、LED 指示灯等。
Designator,Value,Footprint,Quantity,Description U1,STM32F103C8T6,LQFP-48,1,主控MCU U2,AMS1117-3.3,SOT-223,1,3.3V线性稳压器 Y1,8MHz,5032-4P,1,无源晶振 C1,10uF,C0805,1,输入端滤波 C2,10uF,C0805,1,输出端滤波 C3,100nF,C0603,4,去耦电容 C4,22pF,C0603,2,晶振负载电容 R1,10k,R0603,1,复位上拉 R2,1k,R0603,1,LED限流 SW1,轻触开关,SW-SMD-4P,1,复位按键 J1,SWD-4P,HDR-1X4,1,下载调试口 J2,排针,HDR-1X20,2,GPIO引出需要提醒的是,上表里的封装字段都是带类型前缀的完整写法,这样导入 EDA 时才能和封装库精确匹配。如果 AI 给你的表里只有"0805"三个字,一定要补全。
4.2 原理图绘制的关键点
原理图阶段最容易被忽视但影响最大的,是电源和地的处理。很多新手把所有地都画成一个网络,原理图上看起来没问题,但到了 PCB 阶段就会发现模拟地和数字地混在一起,去耦电容的回路拉得很长。
实操建议是:数字地统一用 GND,模拟部分如果确实有(比如 ADC 采样),单独用 AGND,最后在 LDO 附近单点连接。对于这个最小系统板来说,全部用 GND 就够了,不需要拆分。
另一个关键是去耦电容的位置标注。原理图上无法体现物理位置,但你应该在绘制时就在心里规划好:每个电源引脚旁边必须有一颗 100nF 电容,距离不超过 2mm。这条规则在 PCB 阶段必须落实,否则 MCU 在高频运行时会出现莫名其妙的复位。
还有一个细节是晶振电路。8MHz 晶振的两端各接一颗负载电容到地,电容值按晶振手册的 CL 值反推。走线要尽量短、尽量对称,下方铺地但不走其他信号。这些在原理图上体现不出来,但必须在设计说明里写清楚,否则后面布线的人(或者你自己过两天)很容易忘。
4.3 网表与封装核对脚本
导完网表之后,先跑一遍脚本做交叉校验。下面这个脚本用标准库解析 CSV 格式的 BOM,检查位号是否重复、封装字段是否为空、数量是否为正整数。代码可以直接复制运行。
# 文件路径:scripts/check_bom.py # 用途:校验 BOM 文件的完整性,拦截常见的低级错误 import csv import sys from collections import Counter REQUIRED_FIELDS = ["Designator", "Value", "Footprint", "Quantity"] def load_bom(path): """读取 BOM 文件,返回字典列表,同时保留原始行号便于定位问题""" rows = [] with open(path, "r", encoding="utf-8-sig", newline="") as f: # utf-8-sig 用于兼容 Excel 导出的带 BOM 头的文件 reader = csv.DictReader(f) if reader.fieldnames is None: raise ValueError("BOM 文件为空或没有表头") missing = [f for f in REQUIRED_FIELDS if f not in reader.fieldnames] if missing: raise ValueError(f"缺少必需字段: {missing}") for idx, row in enumerate(reader, start=2): row["_line"] = idx rows.append(row) return rows def check_duplicate_designator(rows): """检查位号是否重复""" errors = [] counter = Counter(r["Designator"].strip() for r in rows) for designator, count in counter.items(): if count > 1: errors.append(f"位号重复: {designator} 出现 {count} 次") return errors def check_empty_footprint(rows): """检查封装字段是否为空或过于笼统""" errors = [] vague = {"0402", "0603", "0805", "1206", "SOP", "QFN"} for r in rows: fp = r["Footprint"].strip() if not fp: errors.append(f"第 {r['_line']} 行 {r['Designator']} 封装为空") elif fp.upper() in vague: errors.append( f"第 {r['_line']} 行 {r['Designator']} 封装 '{fp}' 过于笼统," f"建议写成带类型前缀的形式,如 R{fp} 或 C{fp}" ) return errors def check_quantity(rows): """检查数量是否为正整数""" errors = [] for r in rows: qty = r["Quantity"].strip() if not qty.isdigit() or int(qty) <= 0: errors.append(f"第 {r['_line']} 行 {r['Designator']} 数量非法: '{qty}'") return errors def main(): if len(sys.argv) < 2: print("用法: python check_bom.py <bom.csv>") sys.exit(1) path = sys.argv[1] rows = load_bom(path) print(f"共读取 {len(rows)} 行 BOM 记录") all_errors = [] all_errors.extend(check_duplicate_designator(rows)) all_errors.extend(check_empty_footprint(rows)) all_errors.extend(check_quantity(rows)) if not all_errors: print("校验通过,未发现问题") return print(f"发现 {len(all_errors)} 个问题:") for e in all_errors: print(" - " + e) sys.exit(2) if __name__ == "__main__": main()运行方式很简单,把 BOM 导出成 CSV 之后执行:
python scripts/check_bom.py design/my-board-bom.csv预期输出是读取行数加上校验结论。如果发现问题会打印具体行号,方便回到表格里修改。这个脚本看起来简陋,但在实际项目里拦住过不少问题,尤其是从 AI 或者别人手里接过一份 BOM 的时候。
4.4 布局阶段的关键决策
布局决定了这块板子 70% 的命运。布线可以在布局之后调整,但布局一旦定下来,改动成本非常高。
这块最小系统板的布局顺序建议是:先放 MCU,再放晶振和去耦电容,然后放 LDO 和电源滤波,最后放接插件。这个顺序的逻辑是"从核心到外围",核心器件的放置位置决定了走线的整体走向。
MCU 放在板子中央偏上,四周留出走线空间。晶振紧贴 MCU 的 OSC_IN 和 OSC_OUT 引脚,两颗负载电容对称布置在晶振两侧,这三者构成一个紧凑的小区域,下方铺地。去耦电容紧贴 VDD 引脚,每一颗对应一个电源脚,不要为了整齐把它们排成一排放在板边。
LDO 放在板子一角,输入端接 5V,输出端接 3.3V 平面。LDO 的输入输出电容要紧贴引脚,尤其是输出端的 10uF,距离越远稳压效果越差。
接插件放在板子两侧边缘,SWD 接口放在方便插拔的一侧。排针的间距是 2.54mm,注意相邻排针之间的走线空间会被压缩,如果要从两个排针中间穿线,线宽最好控制在 0.2mm 以内。
4.5 布线阶段的约束设置
布线之前一定要先设置设计规则,否则你会发现布完之后到处都是违规,返工量巨大。
对于这块板子,规则可以这样定:普通信号线宽 0.25mm,电源线宽 0.5mm,地线通过铺铜实现不单独走线。最小间距 0.2mm,最小过孔孔径 0.3mm、外径 0.6mm。丝印最小线宽 0.15mm,字符高度不小于 0.8mm。
如果涉及稍大电流的场合,线宽不能凭感觉定。工程上常用的近似公式来自 IPC-2221,用于估算给定温升下导线能承载的电流:
I = k * (ΔT^0.44) * (A^0.725)其中 I 是电流(A),ΔT 是允许温升(℃),A 是导线截面积(单位 mil²),k 是系数,外层走线取 0.048,内层取 0.024。这个公式是经验近似,实际设计还要留足余量。
下面这个脚本可以根据电流反推所需线宽,方便你在定规则时有个参考值。
# 文件路径:scripts/trace_width.py # 用途:基于 IPC-2221 近似公式估算走线宽度 import math # 铜厚与对应厚度(单位 mil) COPPER_THICKNESS_MIL = { "1oz": 1.378, "2oz": 2.756, } def required_area(current, delta_t, k=0.048): """根据电流和温升反推所需截面积,单位 mil^2""" return (current / (k * (delta_t ** 0.44))) ** (1 / 0.725) def width_mil(area, thickness_mil): """由截面积和铜厚计算线宽,单位 mil""" return area / thickness_mil def main(): current = 2.0 # 预期电流,单位 A delta_t = 10.0 # 允许温升,单位 ℃ copper = "1oz" thickness = COPPER_THICKNESS_MIL[copper] area = required_area(current, delta_t) w_mil = width_mil(area, thickness) w_mm = w_mil * 0.0254 print(f"电流 {current}A,允许温升 {delta_t}℃,铜厚 {copper}") print(f"所需截面积: {area:.1f} mil^2") print(f"所需线宽: {w_mil:.1f} mil ≈ {w_mm:.2f} mm") print("建议在此基础上再放大 1.5 到 2 倍作为工程余量") if __name__ == "__main__": main()跑出来的结果可以作为下限参考,实际布线时在这个数值上再放大 1.5 到 2 倍比较稳妥。需要注意的是这个公式只考虑直流载流和自然散热,没有考虑多根线并排、环境温度高、板上其他热源等因素,所以它给出的是"乐观下限"而不是"安全值"。
4.6 DRC 与 Gerber 导出
布线完成之后跑 DRC。这一步不要偷懒,也不要看到一堆报错就关掉。DRC 的每一条报错都值得看一眼,如果确认是误报,可以在规则里加例外并写注释说明原因;如果是真问题,改。
常见的 DRC 报错和处理方式:间距不足(调线或者调整规则)、丝印压焊盘(移动丝印位置)、未连接网络(检查是否有飞线漏布)、过孔离焊盘太近(移过孔)。跑完 DRC 之后,建议再打开 3D 预览看一眼整体效果,很多奇怪的问题在 3D 视图下一眼就能看出来。
导出 Gerber 时,层数要齐全。双层板至少包含:顶层走线、底层走线、顶层阻焊、底层阻焊、顶层丝印、底层丝印、顶层钢网、底层钢网、板框、钻孔文件。少任何一层工厂都会打回来问。
| 文件类型 | 常见命名 | 说明 |
|---|---|---|
| 顶层走线 | GTL | Top Layer |
| 底层走线 | GBL | Bottom Layer |
| 顶层阻焊 | GTS | Top Solder Mask |
| 底层阻焊 | GBS | Bottom Solder Mask |
| 顶层丝印 | GTO | Top Overlay |
| 底层丝印 | GBO | Bottom Overlay |
| 顶层钢网 | GTP | Top Paste |
| 底层钢网 | GBP | Bottom Paste |
| 板框 | GKO / GML | Keepout / Mechanical |
| 钻孔 | DRL / TXT | Excellon 格式 |
导出之后一定要用独立的 Gerber 查看器打开复核一遍,不要只在 EDA 里看。独立查看器能暴露 EDA 内部预览看不到的问题,比如层对齐偏移、钻孔与焊盘错位。这一步花五分钟,能省下一周的交期。
5. 如何客观评估一份"AI 生成的 PCB"
5.1 一份可执行的检查清单
面对任何一份来路不明的 PCB 设计(不管是 AI 生成的还是外包画的),都可以用下面这张清单快速判断它的成熟度。每一项都是可以动手验证的,不依赖主观感受。
| 检查项 | 验证方法 | 不通过的后果 |
|---|---|---|
| 位号唯一性 | 脚本校验 BOM | 贴片错位、漏贴 |
| 封装完整性 | 核对引脚数与手册 | 器件无法焊接或引脚悬空 |
| 网表一致性 | 原理图与 PCB 网络比对 | 电路功能完全错误 |
| 去耦电容位置 | 目视 + 测量距离 | 高频不稳定、随机复位 |
| 晶振走线长度 | 目视测量 | 起振困难 |
| 电源线宽度 | 公式估算 | 大电流下发烫甚至烧断 |
| 丝印可读性 | 3D 预览 | 装配困难 |
| DRC 零错误 | 跑 DRC | 工厂拒单或良率低 |
| 板框闭合 | Gerber 查看器 | 无法铣边 |
| 钻孔与焊盘对齐 | Gerber 查看器 | 孔偏、焊盘破损 |
这张表的价值在于它把"感觉不错"变成了"逐项打勾"。当你拿它去检验一张演示图时,很快就会发现大部分演示连前三项都过不了——它们根本没有提供 BOM 和网表。
5.2 用脚本做网表与 BOM 的交叉校验
如果对方提供了网表文件,可以做更进一步的校验。下面这个脚本解析 KiCad 风格的 XML 网表,提取所有元件位号,再和 BOM 里的位号做集合比对,快速找出"BOM 里有但网表里没有"或者"网表里有但 BOM 里没有"的元件。
# 文件路径:scripts/check_netlist.py # 用途:交叉校验网表与 BOM 的位号集合 import csv import sys import xml.etree.ElementTree as ET def load_designators_from_netlist(path): """从 XML 网表中提取所有元件位号""" tree = ET.parse(path) root = tree.getroot() designators = set() # 常见结构: <components><comp ref="R1">...</comp></components> for comp in root.iter("comp"): ref = comp.get("ref") if ref: designators.add(ref.strip()) return designators def load_designators_from_bom(path): """从 CSV BOM 中提取所有位号,支持 R1,R2 这种合并写法""" designators = set() with open(path, "r", encoding="utf-8-sig", newline="") as f: reader = csv.DictReader(f) for row in reader: raw = row.get("Designator", "") # 按逗号或空格拆分,兼容 R1,R2 和 R1 R2 两种写法 for token in raw.replace(" ", ",").split(","): token = token.strip() if token: designators.add(token) return designators def main(): if len(sys.argv) < 3: print("用法: python check_netlist.py <netlist.xml> <bom.csv>") sys.exit(1) net_des = load_designators_from_netlist(sys.argv[1]) bom_des = load_designators_from_bom(sys.argv[2]) print(f"网表元件数: {len(net_des)}") print(f"BOM 元件数: {len(bom_des)}") only_in_net = sorted(net_des - bom_des) only_in_bom = sorted(bom_des - net_des) if not only_in_net and not only_in_bom: print("位号集合完全一致") return if only_in_net: print(f"仅在网表中出现(BOM 漏了 {len(only_in_net)} 个): {only_in_net}") if only_in_bom: print(f"仅在 BOM 中出现(网表里没有 {len(only_in_bom)} 个): {only_in_bom}") sys.exit(2) if __name__ == "__main__": main()需要说明的是,不同 EDA 导出的网表格式不一样,上面的解析逻辑针对的是 XML 结构的网表。如果你的网表是 Protel 风格的纯文本格式,需要改成正则匹配。这一点在脚本里留了扩展空间,实际使用时按你的导出格式调整。
5.3 AI 生成 PCB 的典型错误模式
从公开可见的案例来看,AI 生成的 PCB 有几个高频错误模式,识别它们能帮你快速判断一份设计的可信度。
第一个是封装数量与引脚数不匹配。尤其是多引脚芯片,生成结果经常出现引脚数对不上、焊盘间距不标准的情况。这类错误在图上很难看出来,必须对照器件手册数引脚。
第二个是走线穿过了不该穿过的地方,比如电源线直接从晶振下方穿过,或者差分对中间硬插了一根信号线。这类问题在视觉上不明显,但对信号完整性影响很大。
第三个是去耦电容缺失或者位置离谱。AI 往往只关心"连上了",不关心"连得对不对"。电容连上电源和地了,但放在了板子另一头,等于没放。
第四个是丝印字符重叠。为了美观把丝印排得很密,结果字符互相压住,实际板子上根本看不清。这个在 3D 预览里一目了然。
第五个是板框不闭合或者有自相交。这类问题在 EDA 里可能不报错,但导出 Gerber 之后工厂的 CAM 软件会直接拒绝。
6. 常见问题与排查思路
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 网表导入后元件数量不对 | 封装库缺件、封装名不匹配 | 核对 BOM 封装字段,统一命名规则 |
| DRC 报大量间距错误 | 布线前未设置规则、默认规则过严 | 按工厂工艺能力重新配置规则 |
| 芯片引脚全部悬空 | 封装引脚编号与网表不一致 | 打开封装编辑器核对焊盘编号 |
| 铺铜后 DRC 出现孤岛 | 铺铜未连接任何网络 | 检查铺铜网络设置,删除孤岛 |
| Gerber 打不开 | 导出时选错格式或压缩包损坏 | 重新导出,用独立查看器验证 |
| 板子回来后无法起振 | 晶振走线过长、负载电容不匹配 | 缩短走线,按手册重算电容值 |
| MCU 随机复位 | 去耦电容缺失或位置过远 | 每个电源脚配 100nF,距离小于 2mm |
| 3.3V 电压偏低 | LDO 压差不足或负载过大 | 检查输入电压与负载电流 |
| 焊接时芯片引脚连锡 | 焊盘间距过小、钢网开孔过大 | 调整钢网开孔比例 |
| 工厂反馈板框不规范 | 板框层不闭合或存在多余线条 | 用闭合多段线重画板框 |
排查这类问题的通用思路是"从上游往下游查":先确认原理图对不对,再确认网表对不对,再确认封装对不对,最后才看布线。很多人一上来就怀疑布线,结果查了半天发现是原理图里少了一颗电容。顺序搞反了会浪费大量时间。
另外提醒一句,涉及生产环境变更、批量下单、修改已发布的 Gerber 文件时,一定要做好版本备份,把每一版的 Gerber、BOM、坐标文件打包存档并标注日期。打样阶段出错成本可控,量产阶段出错就是真金白银。
7. 最佳实践与工程建议
7.1 命名与版本管理
位号命名遵循"类型前缀 + 序号"的规则,R 电阻、C 电容、L 电感、U 芯片、Y 晶振、J 连接器、SW 开关、D 二极管、Q 三极管。这个约定不是形式主义,它能让 BOM 排序、脚本校验、人工核对都变得高效。
工程文件建议用 Git 管理,但要注意 EDA 的工程文件通常是二进制或者压缩包,直接提交会导致仓库迅速膨胀。可行的做法是把导出的网表、BOM、Gerber 这些文本产物纳入版本控制,工程文件本身定期打包归档。每次改版在 README 里写清楚改了什么、为什么改。
7.2 规则先行的设计习惯
新手最容易犯的错误是"先画后改",布完线才发现规则不对,然后大面积返工。正确的顺序是:拿到工厂的工艺能力表 → 在 EDA 里配好规则 → 再开始布局布线。嘉立创的工艺能力页面上有明确的最小线宽、最小间距、最小孔径等参数,按那个表配就够用。
规则配置好之后不要随意放宽。如果 DRC 报错,优先考虑改设计,而不是改规则。频繁放宽规则是设计质量下降的开始。
7.3 电源与地的处理原则
电源完整性和地平面是硬件设计里最容易被低估的部分。对于双层板,建议底层尽量保留完整的地平面,不要为了走几根线把地平面割得七零八落。如果确实需要分割,也要保证关键信号的回流路径连续。
去耦电容的选型上,100nF 覆盖高频,10uF 覆盖低频,两者配合使用。大电容不要省略,它在负载突变时提供电荷支撑。
7.4 AI 辅助的合理定位
回到文章的主题。AI 在 PCB 设计中的合理定位,目前来看是"加速前期工作"而不是"替代设计决策"。它可以帮你快速生成 BOM 草稿、整理引脚连接表、写设计说明文档、甚至生成一些标准电路模板,这些工作省下来的时间是可观的。
但它不能替你做元件选型判断(现货、成本、替代料),不能替你判断工艺可行性(工厂能不能做这么小的孔),也不能替你承担设计责任。把 AI 的输出当作"初稿"而不是"终稿",是使用这类工具时最基本的姿态。
具体到工作流上,可以这样安排:让 AI 生成元件清单和连接表 → 你用脚本校验 → 人工核对关键器件封装 → 在 EDA 里画原理图 → 布局布线 → DRC → 导出复核。AI 在最前面那一段发挥作用,后面全部由人把控。这个分工在相当长一段时间内都是合理的。
7.5 打样前最后五分钟的检查
下单之前花五分钟做这几件事:打开 Gerber 查看器逐层看一眼、确认板框闭合、确认钻孔文件层数正确、确认丝印没有压焊盘、确认板厚和铜厚选对了、确认表面处理工艺(有铅喷锡还是无铅沉金)。这几项里任何一项出错,都会导致板子回来不能用。
8. 写在最后
从演示图到能打样的板子,中间隔着的不是"再多生成几次",而是一整套工程校验流程。这套流程里最核心的东西——网表一致性、封装正确性、规则合规性、制造文件完整性——每一条都可以被脚本和清单验证,跟生成它的是人还是模型没有关系。
所以面对任何一份看起来很惊艳的 PCB 设计,最有效的态度不是惊叹也不是否定,而是打开检查清单,从第一项开始逐条打勾。过得了这张清单的设计,不管出自谁手都值得信任;过不了的,再漂亮也只是图。
如果你想继续深入,接下来可以按这个顺序推进:先把双层板的布局布线练熟,理解回流路径和去耦电容的物理意义;然后学习四层板的叠层设计,掌握电源平面和地平面的处理;再往后是信号完整性,从 USB、以太网这类常见接口的差分对设计入手。每一步都建议配合实际打样,因为硬件这件事,只有在板子回来上电的那一刻,你才会真正知道自己哪里想错了。收藏这篇的检查清单和脚本,下次拿到新设计时直接拿去用,比凭感觉判断靠谱得多。