还在手绘FPGA封装?PolyLibs 帮你一键生成 Xilinx FPGA 的符号与封装
原创 · 樱木花道长 · FPGAer Zone ·
由于Xilinx官方并不提供现成的库文件,仅提供pinout文件,工程师需要重头开始建库、校对;FPGA器件动辄大几百、好几千个pin,一条一条的手动绘制、核对,工作量巨大,稍有不慎就会引入设计bug,影响项目周期,这也令很多工程师对Xilinx望而却步。
PolyLibs 这个开源项目解决了这个脏活:选好型号,一键生成 KiCad / Cadence
格式的符号库和封装库,焊盘坐标精确到球号解码,缺省焊盘自动留空。内置 Xilinx 全系列(7series / UltraScale /
UltraScale+ / Versal / Zynq),实测 88 个测试用例全绿,Cadence SPB 17.2 上 2577 球的
FLGA2577 封装交互验收通过。
一、PolyLibs 是什么
PolyLibs 是一个 Xilinx FPGA 原理图符号与 PCB 封装自动生成工具。输入是官方的 pinout CSV 文件,输出是 KiCad 或 Cadence 可用的符号库和封装库。
不是那种「帮你画个框然后自己填引脚」的半自动工具。PolyLibs 自动处理:
-符号生成:按引脚功能自动分组(电源、地、IO Bank、MGT、配置),生成左右分区式符号图
-封装生成:按球号精确解码坐标,支持缺省焊盘(depopulation),输出丝印框、装配框、占地区
-多格式输出:KiCad(.kicad_sym + .kicad_mod)、Cadence(OrCAD XML + Allegro SKILL 脚本)
内置器件覆盖 Xilinx 当前主流系列:
| 厂商 | 系列 | 说明 |
|---|---|---|
| Xilinx | 7series | A7 / K7 / V7 / S7 等全系 |
| Xilinx | ultrascale | KU / VU / 系列 |
| Xilinx | ultrascale_plus | VU+ / AU+ / ZU+ 等 |
| Xilinx | versal | VC / VE / VM /以及Versal Gen2系列 |
| Xilinx | zynq7000 | Zynq-7000 全系 |
| Xilinx | zynq_us_plus | MPSoC/RFSOC |
需要新厂商或新系列,照着 manifest.yaml 模板填上就完事。框架不绑死 Xilinx。
二、为什么选择 KiCad 和 Cadence 双版本?
PolyLibs 同时支持 KiCad 和 Cadence 两种输出格式,各有各的定位:
| KiCad | Cadence | |
|---|---|---|
| 授权 | 完全开源免费 | 商业 EDA(需 License) |
| 适用场景 | 个人项目、开源硬件、教学、爱好者 | 企业级 专业EDA产品 |
| 开发程度 | 支持Python接入,适合AI自动化处理 | 相对封闭 |
| 输出格式 | .kicad_sym + .kicad_mod | OrCAD Library XML + Allegro SKILL |
| 上手难度 | 低,社区资源丰富 | 专业工具,学习曲线陡峭 |
| 验证方式 | kicad-cli 可做自动化验证 | 交互验收(无自动化 CLI 验证) |
KiCad 是推荐的默认格式——免费、开源、零门槛;
Cadence 版本面向已有 License 的专业用户,帮各位硬件大佬一键生成大型 BGA 封装,免去手动建库的体力活。
⚠️ Cadence
License 免责声明: PolyLibs 不提供 Cadence SPB / OrCAD / Allegro 的商业
License。本工具生成的仅为中间格式文件(XML / SKILL 脚本),需在已合法授权的 Cadence
环境中使用。商业用途请务必自行购买 Cadence License。 未授权使用可能导致法律风险,开发者不承担任何责任。
三、为什么手写 BGA 封装是个坑
有过建库经验的同学对下面这些坑应该不陌生:
- 引脚数量多:一个 FPGA芯片,引脚数动辄 484/676 起,更大的芯片甚至能到 2000+ 球。逐一手填,眼睛都花了。
- 球号编码容易搞错:BGA 球号字母跳过了 I、O、Q、S、X、Z,AA 之后是 AB 不是 BA。手工写脚本的人经常在这里翻车。
- 缺省焊盘:有些球位有焊盘位置但没有引出信号,CSV 里根本没有这个球号。不处理的话生成的封装要么多焊盘要么少焊盘。
PolyLibs 的解法是:一切坐标来自球号解码,不靠几何推测;缺省信息完全从原始 CSV 承载,不自己猜。
四、焊盘坐标是怎么算的(设计原理)
这部分简短聊聊底层是怎么做的,对于理解输出精度很有帮助。
球号解码
每个焊盘的物理坐标由球号直接算出:
-
数字 → 列(X 方向),字母 → 行(Y 方向)
-
以阵列中心为原点:
x = (col - col_center) × pitch,y = (row_center - row) × pitch
缺省焊盘(depopulation)
生成器只为 pinout CSV 中存在的球号放焊盘。CSV 上没有的阵列位置自然留空,不推测、不插值。缺省信息完全来自原始数据。
实例:UVBA494封装,29 列 × 18 行 = 522 个阵列位置,但只有 494 个有效焊盘,缺的 28 个集中在第 5、25 两列,与实物封装 depopulation 图一致。

封装数据库 pkg_db.json
只提供几何参数(pitch、本体尺寸、焊盘/阻焊/钢网直径),不含阵列规模或缺省表。新封装只需补一条 JSON:
”fgg484”: {
”body_size_x”: 23.0,
”body_size_y”: 23.0,
”pitch_mm”: 1.0,
”pad_diameter_mm”: 0.45,
”mask_opening_mm”: 0.5,
”paste_diameter_mm”: 0.4
}
五、安装与运行
系统要求
- Windows 10/11
- Python 3.10+
- 可选:kicad-cli(用于 KiCad 导出验证)/Cadence
三步跑起来
第一步:克隆
git clone https://github.com//PolyLibs.gitcd PolyLibs
第二步:双击polylibs.bat
首次运行自动创建虚拟环境、安装依赖,然后启动 GUI。什么都不用管。
第三步:选型号,点生成
GUI 选厂商 → 系列 → 型号 → 封装 → 勾选 KiCad / Cadence → 生成。
输出在 output/ 目录下,自动按型号组织。
不想捣腾源码的,推荐直接使用单 exe的版本,依赖库和Xilinx Pin文件都集成一体化,可以直接分发Polylibs.exe分享给身边的同事:

六、使用示例
-
启动
polylibs.bat或Polylibs_Vxx.exe -
选:Xilinx → ultrascale_plus → xczu1eg → ubva494
-
勾选 KiCad + Cadence
-
点生成
几秒钟后 output/xczu1egubva494/ 下就有完整的符号和封装文件。

Cadence 输出怎么用
生成后,cadence/ 目录下有:
<PACKAGE>.il — Allegro 封装构建脚本
\_load.txt il脚本加载说明(复制文本内的Skill命令到Allegro粘贴即可,免去手动敲)
<DEVICE>\_library.xml — OrCAD Capture 符号库。
Allegro 封装(.il → .dra)
-
打开 Allegro PCB Editor,
File > New > Package Symbol,名称任意,进入编辑界面 -
在下方 SKILL 命令行输入:粘贴
\_load.txt里的Skill命令 -
脚本自动创建 padstack、全部焊盘、外形框与 A1 标记;
File > Save得.dra -
若提示 padstack 已存在的 WARN,属正常(复用已有盘)
OrCAD 符号(.xml → .olb)
-
打开 Capture,
File > Import > Library XML,选择
<DEVICE>\_library.xml -
导入后得到
.olb,打开核对引脚数量与名称
目前是基于 Cadence SPB 17.2手动验证了多个系列的多个型号,但是没有覆盖全部型号, 建议在不低于17.2的版本上运行,有bug欢迎反馈。
KiCad 输出
生成后在 KiCad 中直接使用:符号添加到原理图库,封装添加到PCB 库目录。

七、验证情况
这是真跑过的,不是「理论上没问题」。
以大型器件XCVU13P-FLGA2577为例:

原理图封装分页太多,就以KiCAD为例展示个列表:

自动化测试:88 passed
cd PolyLibs.venv/Scripts/python -m pytest -q
88 passed in 0.52s
覆盖了 12 个测试文件,从引脚分类到端到端生成:
Manifest 库验证
.venv/Scripts/python -m polylibs library validate --root ..
OK: library\xilinx\7series\manifest.yaml
OK: library\xilinx\ultrascale\manifest.yaml
OK: library\xilinx\ultrascale_plus\manifest.yaml
OK: library\xilinx\versal\manifest.yaml
OK: library\xilinx\zynq7000\manifest.yaml
OK: library\xilinx\zynq_us_plus\manifest.yaml
7 个 manifest(含 example 示例)全部验证通过。
Cadence SPB 17.2 实测(重点)
针对XCZU1EG-UBVA494(494 球,29×18 阵列,0.5mm pitch)做了完整的交互验收:
- OrCAD 符号(Library XML → .olb)——通过
- 生成 XCZU1EGUBVA494_library.xml(494 引脚)
- Capture 交互 GUI → File → Import → Library XML → 导入成功
- 得 XCZU1EGUBVA494_LIBRARY.OLB(45 KB),画布目视确认器件本体、左右引脚列、引脚名与球号均正确
- Allegro 封装(.il → .dra)——通过
过程中发现并修复了 3 个问题(SKILL 语法适配、图形创建判空、图纸类型前置检查),修复后:
- 脚本零报错执行,DRC 干净
- axlPinExport 导出 494 pin,编号、坐标与预期零偏差
- Padstack 报表确认:TOP/SOLDERMASK/PASTEMASK 三层圆形焊盘 0.2500/0.3000/0.2000 mm,与 pkg_db.json 规格一致
- 图形验证:PLACE_BOUND/SILKSCREEN/ASSEMBLY 三个矩形框、REF* 文字、A1 圆圈经代码验证与画布目视确认
生成器输出一致性验证
以 KiCad 封装为例,使用 verify_footprint.py 比对:
python verify_footprint.py <封装>.kicad_mod
检查:焊盘跨度 ≤ 本体尺寸,且四边留白大致对称。
Xilinx所有器件的pin_out file可通过以下路径下载,下载完后可与PolyLibs生成的库文件进行核对:
https://www.amd.com/en/developer/resources/adaptive-socs-and-fpgas/package-pinout-files.html
八、技术边界(当前版本的限制)
诚实地说一下现在还处理不了的场景:
- 焊盘阵列中心相对本体中心有偏移(整行/整列缺省导致中心偏移半个 pitch)
- X/Y 方向不等 pitch(当前 schema 仅支持单一 pitch_mm)
- 非矩形本体(开槽、切角、裸焊盘 EPAD)
- 非 BGA 编号(QFN/QFP 纯数字引脚)
需要这些特性的同学可以提 issue 或 PR,框架支持扩展。也可以自己从github/gitee下载研究交流。
九、新增器件教程(60 秒版)
想加一个新系列?三步:
- 放原始 CSV
pinout_file/<Vendor>/<Series>/<daughter_series>/part_name.csv
- 写 manifest
```bash
```javascript
vendor:
id: xilinx
name: Xilinx
series:
id: my_new_series
name: MyNewSeries
classification: classification_rules.yaml
column_map:
pin_name: Pin
ball: Ball
pin_function: ”IO Type”
data_dirs:
- pinout_file/xilinx/my_new_series/data
- 验证
.venv/Scripts/python -m polylibs library validate --root ..
OK 后 GUI 里就能看到新系列。
十、总结
PolyLibs 解决的是一个具体而高频的痛点:FPGA 库文件建库。
不搞大而全,只做 BGA 符号与封装生成这一件事。
几个亮点:
- 一键生成:双击运行,选型号,点生成。没有复杂的命令行配置
- 坐标精确:球号解码方案,不依靠启发式猜
- 实测验证:88 测试全绿,Cadence SPB 17.2 交互验收通过
- 双工具输出:KiCad + Cadence,一套配置同时出两套库
- 开源可扩展:Apache 2.0 协议,代码在 GitHub,欢迎 PR
项目地址:
关注公众号,发送 Polylibs 或 01;获取项目链接。
如果你也受够了手填几百个 BGA 焊盘的体力活,可以试试看。

被折叠的 条评论
为什么被折叠?



