简介:面向电子设计自动化(EDA)工程师与PCB设计者,这份资源汇集了Cadence软件中常用的原理图符号与PCB封装,覆盖从分立器件到集成电路的多种标准元件,可无缝对接到原理图绘制与布局布线流程。资源包共2000个文件,压缩后约13.98MB,核心内容包括428个dra原理图符号、405个psm封装、373个pad焊盘文件,另含brd板级设计文件及txt、xml等辅助配置,文件结构便于按类型索引。目前已有3283人学习使用,适用于需要快速搭建元件库或补充非标封装的工程师。通过配套的库管理技巧与尺寸精度、兼容性、设计规则检查等实践提示,能帮助使用者建立可维护的私有库,减少因封装缺失或符号错误造成的返工,整体提升设计的一致性与可制造性。
1. 用别人拷来的Cadence原理图库和PCB封装库画板,为什么总在导入时翻车?
深夜两点,你按下Create Netlist,等着原理图变网表,结果Allegro里弹出一长串“footprint not found”。这不是你的电路有问题,而是你手里的Cadence原理图库和PCB封装库本身不配套。很多人以为画板最难的环节是布局布线,实际上一旦库文件混乱,原理图画得再漂亮也推进不到PCB阶段,后面的生产文件更是无从谈起。
这篇笔记不聊Cadence的全套操作,只聚焦两件事:原理图符号库(也就是OLB文件)怎么建,以及PCB封装库怎么同步配套。适合刚接手公司库的新人,也适合把个人库整理成团队资产的老手。目标只有一个:让你从新建器件到网表导入,每一步都能预判结果,而不是靠运气。
2. 原理图符号库:先定OLB文件的组织规则,再动手画引脚
2.1 库分区别拍脑袋:按功能域划分,还是按封装域划分?
在很多项目里,原理图库的混乱往往不是符号画得差,而是文件组织没有规则。Cadence Capture的原理图库以OLB文件为单元,一个OLB文件里可以放多个符号。常见的做法是按功能域划分:分立器件一个OLB、电源芯片一个OLB、逻辑芯片一个OLB、连接器一个OLB、特定项目专属器件单独一个OLB。这种划分方式匹配日常选型习惯,查找器件时路径清晰,多人协作时也不会因为都往同一个文件里写而互相冲突。
按封装域划分的方式也有团队在用,比如把0603封装的所有电阻电容放同一个OLB,把SOP-8封装的芯片放另一个OLB。这种做法的好处是批量更新封装时比较省事,但坏处也很明显:你找一个传感器芯片,得先想它是什么封装,再翻对应文件,跨封装选型时毫无效率。我见过的项目组里,按功能域划分的库维护成本明显更低,也更容易让新成员快速上手。
文件命名也要提前统一。推荐格式是“分类_厂商_器件型号”,比如POWER_TI_TPS54531,不要用中文,不要用空格,不要用-开头。OLB文件名本身建议只到分类维度,比如POWER.OLB、LOGIC.OLB,器件型号留给符号名体现。这样文件列表固定,新增器件只是往对应OLB里加符号,不需要频繁新增库文件。
2.2 创建原理图符号时,引脚编号和电源引脚最容易埋雷
用Capture创建新符号时,从File -> New -> Symbol进入,弹窗里有几个关键选项:Name填器件型号,Reference Prefix填U(电阻填R,电容填C),Part Per Package填器件拆分数量。比如一个四运放,Part Per Package填4,后面在原理图里就能放U1A、U1B、U1C、U1D四个part。
引脚编号必须是数据手册上的真实编号,不能按封装顺序重新编号。很多人在这一步图省事,画完一个16脚芯片后手动排列脚号,结果把4脚和5脚对调了,原理图能放进去,PCB导入后焊盘网络全部错位。你要养成的习惯是:先读数据手册的Pin Table,原样录入Pin Number和Pin Name,再调整引脚摆放位置,而不是摆好位置再去改编号。
电源引脚建议分成两种情况处理。普通信号芯片的电源脚,可以用隐藏引脚方式,引脚属性设为Power,Pin Name填VCC或GND,这样在原理图里不显示,但导出的网表会自动连到同名全局电源网络。但如果一个芯片有两个不同电压的电源脚,或者有的电源脚要单独滤波,就不要隐藏,直接把引脚画出来,否则两个脚同名网络会连在一起,原理图看着干净,板子回来后纹波大得你想砸键盘。
2.3 多part符号拆分规则:按功能拆,别按脚数拆
多part器件的拆分原则是“按功能块拆”。以双路运放为例,一个part放一路放大器的输入输出和反馈脚,电源脚放进其中一个part,或者两个part都放但隐藏连接。不要把16个引脚平均拆成两个8脚part却没考虑功能边界,那样画原理图时信号回路会被割裂,读图的人要来回翻part才能理解电路结构。
每个part里都要保留Reference Designator和Value属性。Value属性建议填具体规格参数,比如10K 1%,而不是只填型号。CIS数据库不参与的原理图里,Value会直接显示在图纸上,填得越具体,评审和后续BOM整理就越省心。NC脚(空脚)一定要在符号上体现,可以画显式引脚然后加网络名NC,或者在part里加文本标注。省这一步的后果是,后来接手的人不知道这个脚能不能接网络,为了稳妥只能查手册,整个项目都陪着慢。
2.4 用CIS数据库把符号、封装和物料信息收进同一个库
OLB文件解决的是“画得出符号”的问题,CIS(Component Information System)解决的是“这个符号对应什么物料、什么封装、哪份数据手册”的问题。Cadence Capture CIS可以从Place -> Database Part打开数据库浏览器,原理是Capture通过ODBC连接外部数据库,在原理图里放置器件时自动带出字段。
我一般把CIS字段设计成下面这些列:
| 字段名 | 作用 | 填写示例 |
|---|---|---|
| Part Number | 唯一物料编码 | 1003-0012 |
| Manufacturer | 厂商或供应商 | 某半导体公司 |
| Description | 简要描述 | 低噪声运放双通道 |
| Value | 原理图显示的规格值 | 10K 1% |
| Footprint | PCB封装名,与封装库严格一致 | R0603 |
| Datasheet | 文件路径或链接 | datasheet/xxx.pdf |
| PCB Footprint | 备用封装或误用的纠错字段 | 留空 |
这里最关键的字段是Footprint。CIS里配的封装名必须和Allegro封装库里的.psm文件主名完全一致,多一个空格、大小写不同都会导致导入失败。我在某项目上见过有人把封装名填成R0603,肉眼看不出来,换一台电脑Allegro严格匹配后直接报错,排查了半个下午才找到是尾部空格的问题。建议在CIS配置完成后,导出全部器件清单,用脚本统一检查Footprint列的空白字符和非法字符,这个脚本后面第4章会给。
3. PCB封装库建设:焊盘设计、Footprint制作和命名映射
3.1 焊盘选型先于封装绘制:SMD与通孔焊盘的决策依据
PCB封装库的最小单元不是封装外形,而是焊盘。Cadence环境里,焊盘由Padstack Editor创建,保存为.pad文件。SMD焊盘只需要在Begin层定义顶层焊盘尺寸,再配Soldermask_Top(阻焊开窗)和Paste_Top(钢网开窗)两层;通孔焊盘则需要Begin、Default、End三层分别定义,因为钻孔穿过整块板。
焊盘尺寸不要从小道消息或别的板子上抄,要有依据。最常见的做法是按IPC-7351的计算思路,以器件引脚宽度和长度为基础,加上制造和贴装余量。比如一个引脚宽度0.3mm的小封装,焊盘宽度通常做到0.6mm左右,长度比引脚伸出尺寸再加0.5mm以上。这里有一个简化经验:焊盘宽度 ≈ 引脚宽度 + 0.3mm,焊盘长度 ≈ 引脚在焊盘上的接触长度 + 0.4mm,然后按封装的实际间距做四舍五入取整到0.05mm。
对于有散热需求的焊盘,比如电源芯片的裸焊盘(Exposed Pad),要另外建一个大焊盘,并通过热过孔连接到内层铜皮。热过孔的数量和位置要参考数据手册的建议,一般放在焊盘中心区域均匀分布,孔径0.3mm左右,孔心间距0.8mm到1.0mm,避免密集打孔导致焊盘吸锡或起泡。
3.2 Package Editor里建Footprint:Origin位置有门道
Allegro中新建封装要打开PCB Editor,选择Package Symbol类型。画封装前第一件事是设置Drawing Options里的精度和尺寸,建议单位设为Mil,精度至少保留两位,这样后面和原理图里的Mil单位换算不会积累误差。
Origin(原点)的放置要制度化。我的建议是放在封装几何中心,理由很简单:贴片机拾放时以封装中心为参考,放在引脚1边缘会导致后续做Pick and Place文件时坐标换算多一道工序,还容易算错。对于连接器这种形状不规则的封装,可以在数据手册的推荐封装图上找到中心标记,以它为原点。
封装外框画在Silkscreen_Top层,线宽用6mil到8mil,线距焊盘边缘至少10mil,避免丝印压焊盘影响焊接。引脚1标记要明显,可以画一个小圆点或斜线,铣在丝印层靠近1脚外侧。位号文本放在Silkscreen_Top和Assembly_Top两层都放,字号60mil到80mil,内容分别是元件位号(如U5)和带位号的装配说明。Assembly_Top上的文本可以放大一些,便于产线人工核对。
每个封装必须画Place_Bound_Top层,形状覆盖全部焊盘并外扩15mil到25mil,这是Allegro布局DRC的判定依据。没有Place_Bound的封装在放置检查里过不了,板子做出来没问题,评审环节却要反复解释,很消耗信任。
3.3 封装命名规则和文件目录结构要提前锁定
封装名的规范决定了整个库能不能被自动化和重复使用。我常用的格式是:类型_主尺寸_引脚间距,例如SOP-8_1.27、QFN-32_0.5、C0603。不要用“芯片型号+封装”的方式命名,因为一个封装会被多种器件共用,名称绑死了型号,后面换料就要重做封装,库会越来越臃肿。
库的目录结构也要固定。一个推荐的做法是:库根目录下设.lib(用途就是存放CIS配置与说明)、symbols(OLB文件)、footprints(DRA和PSM文件)、pads(PAD文件)、datasheets(手册)、reports(导出检查报告)。这个结构的好处是把源文件和中间产物分开,备份时只需要打包全部目录,不会漏文件。
3.4 批量计算SMD焊盘尺寸的脚本:让初算不再靠手感
当器件型号多、引脚尺寸杂的时候,手工一个个查手册算焊盘太慢,也容易出错。我经常用一段Python脚本做焊盘初算,按引脚宽度和间距批量输出建议值。脚本里用的是经验公式,适用于常规小封装,不替代数据手册的最终确认。
def smd_pad_pitch(lead_width, lead_len, pitch, gap=0.3): """ 简化计算SMD矩形焊盘宽度和长度。 lead_width: 引脚宽度 mm lead_len: 引脚在焊盘上的接触长度 mm pitch: 相邻引脚中心距 mm gap: 焊盘间距经验余量 mm """ pad_w = lead_width + gap # 焊盘宽度略宽于引脚 if pad_w > pitch * 0.8: # 防止焊盘太宽导致桥连 pad_w = pitch * 0.8 pad_l = lead_len + gap # 焊盘长度方向同样加余量 courtyard = pitch + 0.1 # 占位区域略大于引脚间距 return round(pad_w, 3), round(pad_l, 3), round(courtyard, 3) if __name__ == "__main__": parts = [ ("SOT-23", 0.30, 0.40, 0.95), ("SOP-8", 0.25, 0.60, 1.27), ("QFN-32", 0.25, 0.40, 0.50), ] for name, width, length, pitch in parts: w, l, c = smd_pad_pitch(width, length, pitch) print(f"{name}: pad_w={w}mm pad_l={l}mm courtyard={c}mm")脚本里gap这个参数是经验余量,取值0.3mm在常规FR4工艺下基本都成立,设计到高密度板或0.4mm以下引脚间距时,要把gap调小到0.2mm,并加一项检查:如果焊盘间距小于0.15mm,钢网开窗需要单独评审。脚本输出的只是初算值,画封装前仍然要对着数据手册的推荐焊盘尺寸核对一遍,尤其是那些手册里直接给出推荐焊盘图形的器件,以手册优先。
4. 让符号和封装真正对上:网表生成、映射路径与一致性检查
4.1 Capture到Allegro的封装映射机制是怎么工作的
原理图符号不会直接变成PCB上的封装,中间靠的是Footprint属性。Capture里每个符号的Footprint属性值就是Allegro封装库里的PSM文件名。生成网表时,Capture把Footprint属性和网络连接关系写进网表文件;Allegro导入网表时,按照库路径设置去查找对应的.psm文件,找到就放置,找不到就报错。
这里面有个常见配置误区。Allegro查找封装不是自动搜全盘,而是看Setup -> User Preferences -> Design Paths里的PSMPATH,这个路径列表要把你所有放置PSM的目录都包含进去。我在公司里接手过的某台电脑,库路径里只配了C:\cadence\share\local\pcb,自己的私有库目录根本没加成,每次导入网表都全红,这是最常被忽视的“库不存在”原因。
还有一个坑是符号属性里存在多个Footprint字段。CIS配置不当或者从旧库迁移的符号,有时会有Footprint和PCB Footprint两个属性,Allegro以Footprint为准,另一个字段不生效。看起来好像设置对了,实际导入后封装对不上。解决办法是统一只保留Footprint一个字段,CIS里的备用字段全部删掉或改名为Alt_Footprint,避免命名混淆。
4.2 网表导入失败时的排查顺序:先查属性,再查路径,最后查文件
网表导入Allegro时弹出错误对话框,不要急着猛改原理图,按顺序排查更快。第一步,看原理图里这个器件符号的属性窗口,确认Footprint字段存在且值非空。很多符号创建时根本没填这个字段,尤其是从旧项目拷贝来的器件,属性里只有Value和Reference Designtor,没有Footprint。这种情况直接在属性编辑器里补值,不用改符号。
第二步,检查这个封装名在封装库里是否存在。打开Allegro的File -> Open,把封装名输进去,看能不能打开对应的DRA文件。打不开说明封装库里没有这个PSM,可能是漏建了封装,也可能是封装文件路径不对。第三步,确认PSMPATH里包含了这个DRA文件所在目录。这三步走完,90%的导入失败都能定位到具体原因。
4.3 用Python检查BOM里的Footprint属性:批量发现缺漏
当一个库里有几百个器件时,靠肉眼逐个查属性不现实。我习惯在出BOM后跑一段脚本,检查Footprint字段是否为空、是否含空格、是否与封装库中的PSM文件对应。下面这个示例读取导出的CSV格式BOM,并检查一个指定目录下是否存在对应的PSM文件。
import csv, os, re, sys csv_path = "bom.csv" # 从Capture导出的BOM,要求包含Footprint列 fp_lib_dir = "lib/footprints" # Allegro封装库目录 bad_chars = re.compile(r"[\s/-]+") # 空格、斜杠、连字符视为非法封装名 def check_bom(fp_lib): with open(csv_path, encoding="utf-8-sig") as f: reader = csv.DictReader(f) for row in reader: name = (row.get("Footprint") or "").strip() ref = (row.get("Reference") or "").strip() if not name: print(f"[MISSING] {ref}: 缺少Footprint属性") continue if bad_chars.search(name): print(f"[INVALID] {ref}: 封装名含非法字符 -> {name!r}") continue if not os.path.exists(os.path.join(fp_lib, name + ".psm")): print(f"[NOT FOUND] {ref}: 封裝 {name}.psm 不在库目录中") print("check done") if __name__ == "__main__": check_bom(fp_lib_dir)脚本里对非法字符的判断很严格,空格和斜杠在Allegro文件系统里可能会引发误匹配,宁可多报几个也不能漏。跑完脚本后,输出的三类问题分别处理:缺属性的去原理图补,名字非法的去符号属性里改规范名,封装不在库目录的去建库或拷文件。把这段脚本放进日常出BOM的流程,库的干净程度会肉眼可见地提升。
5. Cadence库建设避坑清单:现象、原因、解决方案
5.1 焊盘中心和引脚中心错位,贴片后器件整体偏移
现象:回流焊后器件不在焊盘正中间,有的焊盘一端露铜,另一端多锡,看起来像贴片机偏了,但调整贴片坐标后没有改善。
原因:封装绘制时,焊盘放置参考了错误的原点。常见情况是画封装时没把原点设在几何中心,而是随手放在了引脚1位置,导致所有焊盘相对中心都偏移。还有一种情况是直接从旧板子导出的封装,封装里的焊盘坐标本身就不对称。
解决:打开封装DRA文件,用Setup -> Change Drawing Origin重新设定原点,再把全部焊盘选中,按新原点重新放置。检查方法是在DRA里显示坐标,把鼠标移到四个角的焊盘上,看对称位置是否关于原点对称。大批量修改时可以用脚本统一处理,但最稳妥的还是新库从头规范原点,旧封装逐个修正后在库里做标记。
5.2 位号丝印压在焊盘上,成品板看不到编号
现象:PCB实物上丝印字符部分被焊盘覆盖,或者字符离焊盘太近,焊接后字符被锡膏污染,放大镜下才能勉强辨认。
原因:画封装时把Ref Des文本放在了Silkscreen_Top层,但文本外框超出了封装边界,直接压在了焊盘区域。有些封装是从其它EDA工具转过来的,文本位置继承原坐标,没有重新调整。
解决:所有丝印文本与焊盘的净距至少10mil,推荐20mil以上。整理库里每一个封装,手工移动Ref Des文本到封装空白区域,同时把文本高度统一设置为60mil到80mil,笔画线宽8mil。改完后在Allegro里跑一遍Silkscreen DRC,确认没有文本到焊盘的距离报错。
5.3 封装没有Place_Bound层,布局阶段DRC大面积报错
现象:元件可以放置,但每次跑布局DRC时同一批器件反复报Place_Bound冲突,而且报错位置在器件外围,看不出实际原因。
原因:封装的Place_Bound_Top层缺失,或者画的形状没有覆盖全部焊盘。Allegro在检测器件间距时依赖Place_Bound数据,没有它就无法正确计算占位范围,导致器件之间判断为距离不足。
解决:进入封装DRA,在Place_Bound_Top层为每个封装画一个矩形或多边形,覆盖范围是所有焊盘外扩15mil到25mil。对于有伸出引脚或异形边的连接器,要把外扩区域沿引脚方向单独加大,保证实际贴装时的吸取误差不会被误判为碰撞。保存后重新加载封装,再跑DRC。
5.4 通孔焊盘过孔上锡不足,波峰焊后虚焊
现象:插件元件在波峰焊后偶发引脚和焊盘之间没有形成完整填充,整排引脚里有一两个虚焊,补焊后恢复正常,后续批次又出现。
原因:通孔焊盘的孔径和引脚直径匹配不当。孔径太紧,引脚插入困难且助焊剂无法充分进入;孔径太松,焊料通过孔洞流走,焊盘上留不住锡。另外,封装里的通孔焊盘如果Default层设置成了非金属化(Non-Plated),焊料不会润湿孔壁,也会虚焊。
解决:核对数据手册的引脚直径,孔径一般比引脚直径大0.2mm到0.3mm,具体和板厂工艺能力相关。在Padstack Editor里检查通孔焊盘的Default层是否设置了Plated,必须选择金属化。波峰焊接的板子,焊盘外径按IPC标准再放大一点,确保焊料填充充分。
5.5 大电流焊盘只给了细热焊盘,电源芯片过流熔断
现象:某电源芯片在工作电流接近额定值时报过温,拆下芯片后看到PCB焊盘有发黄痕迹,实测焊盘到内层铜皮的连接宽度严重不足。
原因:大面积铺铜焊盘为了便于手工焊接,设计时用了热焊盘(Thermal Relief),但热连接桥的宽度按常规信号电流设计,只开了0.3mm左右,大电流通过时发热严重。
解决:对电源芯片和功率连接器,热焊盘的连接桥宽度按载流需求计算,常见做法是每A电流至少0.5mm桥宽,并在焊盘下方铺多个过孔连接内层。如果使用回流焊而不是手工焊接,可以不用热焊盘,直接全连接,散热和载流都更好。库建立时,在封装说明里标明这个焊盘是否按大电流设计,避免后续被当成普通封装复用。
6. 把库从“个人工具”变成“团队资产”:版本管理、自动检查和变更记录
库文件也是代码,必须纳入版本管理。我见过太多团队拿U盘和网盘传库文件,结果某个人改了一个焊盘尺寸,整个项目组的封装就悄悄变了,板子做出来才发现尺寸不对,这种返工代价极高。
具体做法是:在库根目录初始化版本仓库,按版本分支管理。正式发布的库打一个稳定标签,所有修改都先在实验分支进行,经过评审和检查后再合并到主分支。每次修改必须提交变更记录,至少写清楚改了哪个封装、为什么改、是否影响现有设计。我建议在库根目录放一个CHANGELOG.txt,格式固定为“日期/修改人/器件名/变更内容”。
自动化检查要成为习惯。前面第4章给的Python脚本可以在每次版本合并前跑一遍,检查所有BOM的Footprint字段和库文件是否一一对应。更进一步,还可以在修改封装后自动导出Gerber做对比,但这一步耗时较长,我一般只对关键封装做全检查,其它封装做属性级检查。
最后说一个自己踩过的坑。某次更新库,有人把某个SOP封装里的Assembly_Top层文本误删了,PR审核只看外形没注意到文本层,结果产线装配时发现位号缺失,几十片板子靠手写编号才勉强完成追溯。从那以后我给自己定了一条规矩:任何封装修改后,至少打开DRA文件把每个层逐层过一遍,并生成一份包含全部层的PDF图纸作为检查附件。这个习惯看起来笨,却救过我好几次。希望帮到你。
本文还有配套的精品资源,点击获取