PCB自动布线这件事,我前后折腾过不少工具。商业方案里,Altium Designer、Cadence Allegro、PADS这些各有各的强项,但授权成本摆在那里,个人玩家和小团队很难长期负担。开源阵营里能打的选手不多,KiCad自带的布线器这几年进步明显,但真正让我愿意单独写一篇完整教程的,是FreeRouting——一个用Java写的、基于Specctra DSN格式的自动布线引擎。它不绑定任何EDA软件,只要你的设计能导出DSN文件,它就能接手布线,跑完再导回原来的工具里。这个特性让它在开源硬件圈子里一直有稳定的使用群体。
这篇内容面向的是刚接触FreeRouting、或者之前尝试过但被环境配置和文件格式卡住的人。我会从它到底解决什么问题讲起,把安装、DSN导出、参数配置、布线执行、结果回导这条完整链路拆开讲清楚,中间穿插我自己踩过的坑和参数调优的经验。读完你应该能独立完成一块中等复杂度双层板的自动布线,并且知道哪些情况下不该指望自动布线、该手动介入。
1. FreeRouting到底解决的是谁的痛点
1.1 自动布线工具的真实定位
很多人对自动布线有个误解,觉得它是"一键搞定所有走线"的魔法按钮。实际用过就知道,自动布线器最擅长的是处理规则明确、约束清晰、密度适中的连线任务,比如大量分散的阻容网络、总线扇出、电源和地的初步铺线。它不擅长的是高速差分对、阻抗敏感走线、需要精确等长的时序总线,以及那些需要靠经验判断"往哪边走更顺"的模糊场景。
FreeRouting的定位很明确:它是一个基于几何和规则驱动的布线引擎,输入是Specctra DSN文件,输出是Specctra SES(Session)文件。DSN里包含了板框、层叠、元件封装、网络连接关系、设计规则;SES里则是它算出来的走线路径。整个过程不依赖图形界面做交互式编辑,你给它什么约束,它就在约束空间里找解。
这意味着两件事。第一,你的设计规则写得越清楚,它布出来的结果越可用。第二,它不会替你做"这个网络应该走内层还是外层"这种策略性决策,这些得你在导出DSN之前就想好。
1.2 和KiCad自带布线器的关系
KiCad从5.x开始内置了交互式布线器,6.x之后又集成了自己的自动布线能力。那为什么还要用FreeRouting?我自己的体会是:KiCad自带的自动布线在简单板上够用,但一旦网络数量上去、层数增加,它的收敛速度和结果质量就不太稳定。FreeRouting的算法经过多年迭代,在处理中等规模双层板时,完成率和走线整洁度往往更好。
另一个原因是FreeRouting可以脱离KiCad使用。如果你用的是Eagle、立创EDA、甚至某些老版本的Protel,只要能导出DSN,就能接FreeRouting。这种解耦设计让它在工具链里像个"通用布线后端"。
1.3 适合和不适合的场景
适合的场景我列一下:
- 双层板,网络数在100到500之间,元件以0805/0603封装为主
- 数字电路为主,没有严格的阻抗控制要求
- 电源网络已经手动铺了粗线或铜皮,剩下信号线交给自动布线
- 原型验证阶段,先跑通功能,后续再优化走线
不适合的场景同样要说清楚:
- 四层以上、有完整地平面和电源平面的板子,自动布线容易破坏平面完整性
- 高速信号(USB、HDMI、DDR等),需要手动控制参考平面和回流路径
- 射频和模拟小信号,走线长度和寄生参数敏感
- 高密度BGA扇出,需要盘中孔和特殊过孔工艺
提示:自动布线不是替代手动布线,而是把重复性高的连线工作批量化。策略性走线永远需要人来判断。
2. 环境搭建:Java运行时和FreeRouting的安装
2.1 Java版本的选择逻辑
FreeRouting是Java应用,所以第一步是装JRE或JDK。这里有个坑:不同版本的FreeRouting对Java版本要求不一样。老版本(1.4.x系列)在Java 8上跑得最稳,新版本(1.8.x之后)开始要求Java 11甚至17。
我的建议是直接装Java 17 LTS,然后下载最新的FreeRouting发行版。Java 17的长期支持周期长,兼容性好,而且新版本FreeRouting对它的适配最完整。如果你系统里已经有其他Java版本,注意配置好JAVA_HOME,避免版本冲突。
验证Java是否就绪:
java -version输出里应该能看到类似openjdk version "17.0.x"的字样。如果提示找不到命令,说明PATH没配好,需要手动把Java的bin目录加进去。
2.2 获取FreeRouting的几种途径
FreeRouting的官方发布在GitHub上,提供两种形式:可执行JAR包和带启动脚本的压缩包。我推荐下载带启动脚本的压缩包,因为脚本里已经帮你配好了内存参数和模块路径,省得自己写命令行。
下载后解压到一个路径里不含中文和空格的目录。这一点很重要,Java对非ASCII路径的处理在某些版本上会出问题,我见过因为路径里有中文导致启动直接报错的案例。
解压后的目录结构大致是这样:
freerouting/ ├── freerouting-executable.jar ├── freerouting.sh ├── freerouting.bat └── ...Linux和macOS用.sh,Windows用.bat。
2.3 启动参数里的内存配置
默认启动脚本给的内存可能偏小,跑大板子会卡甚至OOM。打开启动脚本,找到类似-Xmx的参数,把它调大。我的经验值是:
| 板子规模 | 建议堆内存 |
|---|---|
| 网络数 < 200 | 1G |
| 网络数 200-500 | 2G |
| 网络数 > 500 | 4G |
修改方式是在启动脚本的Java命令里加上或修改-Xmx2g这样的参数。注意不要超过你机器的物理内存,否则系统会开始换页,反而更慢。
2.4 首次启动的界面认识
FreeRouting的界面很朴素,甚至有点"上个时代"的感觉。主窗口分几个区域:菜单栏、工具栏、左侧的层和网络列表、中间的画布、底部的状态栏。第一次打开是空的,需要导入DSN文件才会显示内容。
工具栏上最常用的几个按钮:打开文件、保存SES、开始自动布线、停止布线、缩放适应。记住这几个就够了,其他功能在初学阶段用不上。
注意:FreeRouting的界面不会自动保存你的操作。布线跑到一半想调整参数,最好先停止、保存当前SES,再重新导入DSN改规则。直接关窗口会丢失进度。
3. 从EDA工具导出Specctra DSN文件
3.1 DSN格式为什么是关键
Specctra DSN是Cadence提出的一种布线交换格式,后来成了事实上的行业标准。它用文本描述整个设计:板框坐标、每一层的用途、每个元件的封装和位置、每个网络的连接关系、设计规则。FreeRouting读的就是这个文件。
DSN的好处是工具无关。不管你是从KiCad、Eagle还是立创EDA导出,只要格式正确,FreeRouting都能处理。坏处是不同EDA工具导出的DSN质量参差不齐,有些会漏掉规则,有些封装定义不完整,导致FreeRouting读进去之后布线结果很奇怪。
3.2 KiCad导出DSN的完整步骤
以KiCad 7为例,流程是这样的:
- 打开PCB编辑器,确认板框已经画好,元件已经布局完成
- 菜单栏选择
文件->导出->Specctra DSN - 在弹出的对话框里选择保存路径,文件名建议用英文
- 点击保存,KiCad会生成一个
.dsn文件
导出前有几件事必须确认:
- 设计规则已经设置好。KiCad的
板设置->设计规则里的线宽、间距、过孔尺寸,会写进DSN。如果这里没设,FreeRouting会用默认值,布出来的线可能太细或间距不够。 - 网络类已经分配。电源网络、差分对、普通信号,最好在KiCad里分好类,导出后FreeRouting能识别这些分类。
- 元件封装完整。如果有封装缺少焊盘定义,DSN里对应元件就是空的,FreeRouting会跳过它。
3.3 立创EDA和其他工具的导出差异
立创EDA专业版支持导出DSN,路径在文件->导出->Specctra DSN。但它的导出有个特点:默认只导出当前可见的层。如果你隐藏了某些层,导出的DSN会缺层定义。导出前把所有层都打开。
Eagle的DSN导出需要通过ULP脚本,稍微麻烦一点。老版本Protel和Altium可以通过File->Export->Specctra Design导出,但Altium的DSN有时会把内层平面也写进去,导致FreeRouting误判层用途,需要在导入后手动检查。
3.4 导出后先做一次自检
拿到DSN文件后,别急着丢给FreeRouting。先用文本编辑器打开,快速扫几眼:
- 搜索
(structure,看层定义是否完整 - 搜索
(placement,看元件数量和位置是否对得上 - 搜索
(network,看网络数量和连接关系是否正常
如果发现层定义缺失或者网络明显不对,回到EDA工具重新导出,别在FreeRouting里硬改。
提示:DSN是纯文本,出问题时可以直接看内容定位。我遇到过导出后网络名变成乱码的情况,就是EDA工具编码设置的问题,改回UTF-8重新导出就好了。
4. FreeRouting的布线参数怎么调
4.1 导入DSN后的第一件事:检查层和规则
导入DSN后,FreeRouting左侧会列出所有层和网络。先点开层列表,确认每一层的类型(信号层、电源层)和方向(水平、垂直)是否正确。双层板通常是顶层水平、底层垂直,这样过孔最少。
然后看规则。FreeRouting的规则菜单里可以设置全局线宽、间距、过孔尺寸。这些值应该和你在EDA工具里设的一致。如果DSD里已经带了规则,这里会显示出来,你只需要确认;如果没带,就得手动补。
4.2 自动布线器的核心参数
FreeRouting的自动布线有几个关键参数,理解它们才能调出好结果:
布线通道宽度(Trace Clearance):这是走线之间、走线和焊盘之间的最小距离。设太小会导致短路风险,设太大会让布线器找不到路径。一般取EDA工具里设计规则的最小间距值。
过孔类型和尺寸:FreeRouting支持通孔和盲埋孔。双层板只用通孔。过孔外径和内径要匹配你的工艺能力,常见的是外径0.6mm、内径0.3mm。
布线层顺序:可以指定优先用哪层。比如让信号优先走顶层,底层留给地。这个设置影响布线的整洁度。
优化迭代次数:FreeRouting会反复尝试优化走线,次数越多结果越好,但时间越长。原型阶段设个中等值就行,比如10到20次。
4.3 参数配置的实操建议
我一般这样配:
| 参数 | 双层数字板建议值 | 说明 |
|---|---|---|
| 最小线宽 | 0.25mm | 普通信号 |
| 最小间距 | 0.2mm | 匹配多数PCB厂工艺 |
| 过孔外径 | 0.6mm | 常规工艺 |
| 过孔内径 | 0.3mm | 常规工艺 |
| 优化次数 | 15 | 平衡质量和时间 |
| 布线层 | 顶层优先 | 底层留地 |
这些值不是绝对的,要根据你的板子密度和工艺能力调整。密度高的板子线宽和间距都要往下压,但别低于PCB厂的最小能力。
4.4 规则冲突时的处理顺序
有时候DSN里带的规则和FreeRouting的默认规则冲突,比如DSN说最小间距0.15mm,FreeRouting默认0.2mm。这时候FreeRouting会取更严格的值,也就是0.2mm。如果你确实需要0.15mm,得在FreeRouting里手动改。
还有一种情况是某些网络需要特殊规则,比如电源网络要更粗的线。FreeRouting支持按网络类设置规则,在网络列表里选中对应网络,右键设置线宽。这个功能很实用,能把电源和信号分开处理。
注意:改规则之后一定要重新跑一次布线,不要指望改完规则旧结果会自动更新。FreeRouting不会增量更新,每次都是从头算。
5. 执行自动布线并解读结果
5.1 启动布线的正确姿势
参数配好后,点工具栏的自动布线按钮,或者菜单里的Autoroute。FreeRouting会开始计算,画布上会实时显示走线过程。状态栏会显示完成百分比和已布通的网络数。
这个过程可能从几十秒到几十分钟不等,取决于板子复杂度和优化次数。期间界面可能会卡顿,这是正常的,Java在做大量几何计算。别频繁点界面,容易触发重绘导致更卡。
如果跑到一半发现结果明显不对,比如大量网络布不通,可以点停止,调整参数重来。不要让它一直跑到结束,浪费时间。
5.2 怎么看布线结果好不好
布线完成后,从几个维度评估:
完成率:状态栏会显示还有多少网络没布通。理想情况是100%,但实际中80%以上就算不错,剩下的手动补。
走线整洁度:看有没有大量绕远路的线、有没有不必要的过孔。FreeRouting有时会为了布通某个网络而绕大圈,这种线手动优化一下更好。
层间平衡:顶层和底层的走线量应该大致均衡。如果一层特别密一层特别空,说明层顺序设置需要调整。
和板框的关系:走线不能超出板框,也不能压到安装孔和禁布区。FreeRouting一般会遵守,但边界情况要人工检查。
5.3 常见布线失败的原因
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 大量网络布不通 | 间距设太大或板子太密 | 减小间距,或增加层数 |
| 走线绕远 | 优化次数不够 | 增加优化迭代 |
| 过孔过多 | 层顺序不合理 | 调整优先层 |
| 电源线太细 | 网络类规则没设 | 单独给电源网络设线宽 |
| 布线超出板框 | 板框定义不完整 | 检查DSN里的板框坐标 |
5.4 手动补线的时机
自动布线跑完后,剩下的未布通网络通常分两类:一类是确实被其他线挡住了,需要挪线腾空间;另一类是本身连接关系复杂,自动算法处理不好。这两类都建议手动补。
手动补线在FreeRouting里也能做,但它的交互编辑能力很弱,不如导回EDA工具里补。我的习惯是:自动布线跑完,导出SES,导回KiCad,然后在KiCad里手动补剩下的线和优化关键走线。
提示:不要追求100%自动布通。80%自动加20%手动,往往比强行100%自动的结果更好,因为手动部分能针对性地优化。
6. 导出SES并回导到EDA工具
6.1 SES文件是什么
SES是Specctra Session文件,记录的是布线结果:每一段走线的起点、终点、所在层、线宽,每一个过孔的位置和尺寸。它和DSN配合使用,DSN描述"要连什么",SES描述"怎么连的"。
FreeRouting布线完成后,通过文件->导出->Specctra Session生成SES文件。这个文件同样是纯文本,可以用编辑器查看。
6.2 回导到KiCad的步骤
- 回到KiCad的PCB编辑器
- 菜单栏选择
文件->导入->Specctra Session - 选择刚才导出的SES文件
- KiCad会把走线合并到当前设计里
导入前建议先备份当前PCB文件,因为导入是覆盖式的,如果SES有问题,原来的走线可能被破坏。
导入后检查几件事:走线是否都在正确的位置、过孔是否正常、有没有网络连接错误。KiCad的DRC(设计规则检查)跑一遍,看有没有违规。
6.3 回导到其他工具的注意事项
立创EDA导入SES的路径在文件->导入->Specctra Session。Eagle需要用ULP脚本导入。Altium的导入在File->Import->Specctra Session。
不同工具对SES的解析有差异,常见问题是过孔尺寸被重置、线宽被改成默认值。导入后一定要检查这些参数,必要时手动修正。
6.4 导入后的收尾工作
SES导入后,板子基本成型,但还有几件事要做:
- 铺铜:自动布线不管铺铜,需要手动在顶层和底层铺地铜,并连接到地网络
- DRC检查:跑一遍完整的设计规则检查,修掉所有违规
- 丝印调整:自动布线可能压到丝印,需要挪动位号
- 泪滴和加固:对焊盘连接处加泪滴,提高可靠性
这些做完,一块板子的布线才算真正完成。
7. 我踩过的坑和参数调优心得
7.1 路径和编码的坑
前面提过路径不能有中文,这里再强调一次。我最早在Windows上把FreeRouting解压到D:\工具\freerouting,启动直接报ClassNotFoundException,换成纯英文路径就好了。Java的类加载器对非ASCII路径的处理确实有问题。
编码问题也遇到过。有次从立创EDA导出的DSN,网络名里的中文注释变成乱码,FreeRouting读进去后网络识别错误。解决办法是在EDA工具里把导出编码设成UTF-8,或者干脆把网络名里的中文去掉。
7.2 内存不足导致的中断
跑一块400多网络的板子时,默认1G内存跑到70%就卡死了,日志里报OutOfMemoryError。把-Xmx调到3G后顺利跑完。这个坑的教训是:板子规模上去之前,先把内存给够,别等跑到一半才发现。
7.3 规则设置过严导致布不通
有次我把最小间距设成0.25mm,结果一块密度稍高的板子大量网络布不通。降到0.2mm后完成率从60%跳到95%。这说明规则要匹配板子的实际密度,不能一味求保守。当然,降规则之前要确认PCB厂能做得到。
7.4 优化次数和时间的权衡
优化次数设太高,时间成倍增长,但质量提升有限。我实测下来,15次是个甜点值,再往上加,走线整洁度的改善就不明显了。原型阶段甚至可以设5到10次,先看能不能布通,再决定要不要精细优化。
7.5 层顺序对结果的影响
双层板默认是顶层水平、底层垂直。有次我改成顶层优先,结果顶层走线特别密,底层很空,过孔数量反而增加了。后来改回默认的水平和垂直交替,过孔数明显下降。这个参数要根据板子的实际布局来调,没有万能值。
7.6 自动布线后的手动优化重点
自动布线的结果,我一般重点优化这几处:
- 电源和地:自动布的电源线往往偏细,手动加粗或改成铺铜
- 晶振和时钟线:这些线要短、要远离干扰源,自动布线不管这些
- 差分对:如果板上有,必须手动走,自动布线处理不好等长和间距
- 连接器附近:走线要整齐,方便后续焊接和维修
这些优化做完,板子的电气性能和可制造性都会好很多。
8. 什么情况下该放弃自动布线
自动布线不是万能的,有些板子从一开始就不该指望它。我的判断标准是:
层数超过两层:四层板有完整地平面,自动布线会打乱平面,得不偿失。四层以上基本全手动。
有高速信号:USB、以太网、DDR这些,需要控制阻抗和等长,自动布线做不到。
模拟和射频:小信号对走线长度和寄生电容敏感,必须手动控制。
高密度BGA:扇出需要盘中孔和特殊工艺,自动布线处理不了。
板子特别小:空间紧张时,每一根线的走向都需要仔细规划,自动布线容易布死。
遇到这些情况,FreeRouting可以帮你处理一些边角的低速信号,但核心走线还是得手动。把它当成一个"辅助工具"而不是"替代方案",心态就对了。
9. 把FreeRouting放进日常工作流
我现在的工作流是这样的:布局在KiCad里完成,设计规则设好,导出DSN,FreeRouting跑自动布线,导出SES,回导KiCad,手动补线和优化,最后铺铜和DRC。整个过程里,FreeRouting承担的是"把大量低速信号连起来"这个重复劳动,省下来的时间用在关键走线的优化上。
这套流程跑顺之后,一块中等复杂度的双层板,从布局完成到布线结束,能比纯手动快不少。当然,前提是布局本身合理,如果布局阶段就一团糟,自动布线只会把问题放大。
最后分享一个小技巧:跑自动布线之前,先把电源和地的粗线手动布好,或者用铜皮连上。这样FreeRouting只需要处理信号线,完成率会高很多,结果也更整洁。这个习惯我坚持了很久,效果一直很稳。