1. 为什么我要认真聊聊FreeRouting这个开源布线工具画PCB这件事说到底是电子工程师的日常。但凡是做过板子的人都知道布局布线是整个流程里最磨人的环节——尤其是当你面对一块几百个网络的板子手动一根根拉线眼睛都快看花了。我最早接触自动布线是在十几年前那时候商用工具的自动布线器要么贵得离谱要么效果差强人意布出来的线跟蜘蛛网似的根本没法用。后来接触到FreeRouting说实话一开始没抱太大期望毕竟它是开源免费的但实际用下来发现在某些场景下它确实能省不少事。FreeRouting是一个基于Java开发的开源PCB自动布线工具它的核心能力是读取Specctra DSN格式的板子描述文件然后通过内置的布线算法自动完成走线最后导出Specctra SES会话文件再导回你的PCB设计软件里。它不依赖任何商业授权跨平台运行Windows、Linux、macOS都能跑。对于中小规模的板子、对布线美观度要求不是极端苛刻的项目或者你想快速验证一个布局方案是否可行FreeRouting都是一个值得放进工具箱的选择。这篇文章适合谁看如果你是用KiCad、Eagle、立创EDA或者Altium Designer画板子的工程师想找一个免费的自动布线方案来加速你的工作流那这篇内容就是写给你的。如果你是完全没接触过PCB自动布线的新手我也会从最基础的概念讲起保证你能跟着操作下来。我不会只告诉你“点这个按钮”而是会把背后的逻辑、参数的含义、踩过的坑都讲清楚让你真正理解这个工具该怎么用、什么时候该用、什么时候不该用。2. FreeRouting的核心机制与适用边界2.1 它到底是怎么工作的FreeRouting的工作流程可以用一句话概括吃进去DSN吐出来SES。DSN是Specctra设计文件格式里面包含了板子的层叠信息、元件封装、引脚位置、网络连接关系、设计规则约束等。SES是Specctra会话文件里面记录了布线器计算出来的走线路径。你的PCB设计软件负责导出DSN和导入SESFreeRouting只负责中间那一步——计算走线。这个设计思路其实很聪明。它把布线器和PCB编辑器解耦了只要你的软件支持Specctra DSN/SES格式就能用FreeRouting来布线。KiCad原生支持这个格式Altium Designer也支持导出DSN立创EDA专业版同样可以。这就意味着你不需要换掉现有的设计工具只需要在布线这一步把文件导出来、处理完再导回去。FreeRouting内部使用的是基于形状的布线算法结合了迷宫搜索和推挤策略。简单来说它会先把板子上的可用空间栅格化然后对每一条网络寻找一条不与其他网络冲突的路径。如果遇到障碍它会尝试推开已有的走线来腾出空间——这就是所谓的“推挤布线”。这个策略在小规模板子上效果不错但网络一多计算量会指数级上升。2.2 什么场景适合用它不是所有板子都适合丢给自动布线器。根据我这些年的使用经验以下几类场景用FreeRouting比较合适中小规模的数字电路板比如STM32最小系统板、传感器模块、简单的接口转换板。这类板子网络数量通常在几十到一两百之间走线以信号线为主没有太多特殊的阻抗要求。布局验证阶段的快速原型当你刚摆完元件不确定布局是否合理可以用自动布线快速跑一遍看看能不能布通。如果自动布线都布不通说明布局需要调整。对走线美观度要求不高的内部项目有些内部使用的板子只要电气连通、功能正常就行不需要追求等长、阻抗匹配这些。教学和学习用途想理解自动布线的基本原理FreeRouting的源码和日志输出是很好的学习材料。反过来说以下场景我不建议用FreeRouting高速信号板DDR、PCIe、USB 3.0这类需要严格阻抗控制和等长匹配的接口自动布线器目前还处理不好。射频和模拟板对走线形状、接地、屏蔽有特殊要求的必须手动布线。高密度多层板层数越多、网络越密FreeRouting的推挤算法越容易陷入局部最优布出来的结果可能很乱。电源板大电流走线需要根据电流计算线宽自动布线器不会帮你做这个计算。2.3 和商用工具的差距在哪里说实话FreeRouting和Cadence Allegro、Mentor Xpedition这些商用工具的自动布线器比起来差距是明显的。商用布线器有更成熟的算法、更好的约束管理、更智能的推挤策略而且支持差分对、等长组、阻抗控制等高级功能。但FreeRouting的优势在于免费、开源、跨平台、轻量。对于预算有限的学生、爱好者、小团队来说它是一个零成本的入门选择。而且它的DSN/SES接口是标准格式你完全可以在FreeRouting里布一部分再导回商用工具里微调这种混合工作流在实际项目中很常见。3. 从零开始搭建FreeRouting工作环境3.1 安装Java运行环境FreeRouting是用Java写的所以第一步是确保你的电脑上有Java运行环境。它需要Java 8或更高版本我建议用Java 11或17的LTS版本稳定性更好。Windows用户可以去Oracle官网或者Adoptium下载安装包安装完成后在命令行里输入java -version确认版本。Linux用户可以用包管理器安装比如Ubuntu下sudo apt install openjdk-17-jre。macOS用户如果装了Homebrew直接brew install openjdk17就行。注意有些Linux发行版默认没有安装Java或者安装的是JRE的精简版缺少某些图形界面相关的库。如果启动FreeRouting时遇到NoClassDefFoundError或者界面显示异常先检查Java版本和完整性。3.2 获取FreeRoutingFreeRouting的官方发布在GitHub上你可以直接下载最新的jar包。截至我写这篇文章的时候最新稳定版本是1.9.0。下载下来是一个单独的jar文件不需要安装双击就能运行或者在命令行里用java -jar freerouting-1.9.0.jar启动。如果你习惯用包管理器也可以从一些开源镜像站获取。不过要注意版本有些镜像站更新不及时可能还是老版本。老版本对新版KiCad导出的DSN文件兼容性可能有问题所以尽量用最新版。3.3 配置PCB设计软件的DSN导出不同的PCB软件导出DSN的方式不一样我分别说一下常见的几个KiCad在PCB编辑器里点击“文件”-“导出”-“Specctra DSN”。KiCad会生成一个.dsn文件里面包含了当前板子的所有信息。注意导出之前要确保你的设计规则已经设置好因为DSN文件里会包含这些规则。Altium Designer在PCB界面点击“文件”-“导出”-“Specctra DSN”。AD的导出选项比较多建议勾选“Include Design Rules”和“Include Net Classes”这样FreeRouting才能知道你的线宽、间距要求。立创EDA专业版在PCB界面点击“文件”-“导出”-“Specctra DSN”。立创EDA的导出功能比较直接基本上默认选项就行。实操心得导出DSN之前先把板子的原点设置好最好放在板子的左下角。FreeRouting对坐标原点比较敏感如果原点在板子中间有时候会出现走线偏移的问题。3.4 启动FreeRouting并加载DSN打开FreeRouting之后界面比较朴素左边是层列表右边是绘图区上面是菜单栏。点击“File”-“Open”选择你导出的DSN文件。加载成功后你会看到板子的轮廓、元件封装、焊盘和飞线ratsnest。飞线表示还没有布线的连接关系自动布线的目标就是把这些飞线变成实际的走线。加载之后先别急着点“Autoroute”花几分钟检查一下层叠设置对不对FreeRouting会读取DSN里的层信息确认信号层、电源层、丝印层都正确识别了。设计规则有没有加载在“Rules”菜单里可以看到线宽、间距、过孔尺寸等参数。如果这些是空的或者明显不对说明DSN导出时没包含规则需要重新导出。元件位置对不对有时候封装的原点设置不同导入后元件会偏移。如果偏移严重建议回到PCB软件里调整封装原点重新导出。4. 自动布线的参数配置与实操流程4.1 理解FreeRouting的布线参数FreeRouting的布线行为受一组参数控制这些参数在“Parameters”对话框里设置。我挑几个最关键的讲线宽Trace Width默认走线的宽度。这个值应该根据你的工艺能力和电流要求来定。一般信号线用6-10mil电源线根据电流计算。比如1A电流1oz铜厚温升10度大概需要20mil左右的线宽。间距Clearance走线之间、走线与焊盘之间的最小距离。这个值不能小于PCB厂家的最小间距能力。常见的工艺能力是6mil但为了良率建议设8mil以上。过孔尺寸Via Diameter过孔的外径和内径。外径一般是内径的两倍左右。比如内径0.3mm外径0.6mm。过孔太小会增加加工难度和成本。布线层Active Layers哪些层参与布线。如果你只想在顶层和底层走线就把内层关掉。多层板的话可以指定哪些层走信号、哪些层走电源。推挤策略Ripup StrategyFreeRouting提供了几种推挤模式从保守到激进。保守模式不会动已经布好的线适合最后微调激进模式会大量推挤和重布适合初期探索。4.2 分步实操从导入到导出下面是我常用的一个完整流程以KiCad为例第一步准备DSN文件。在KiCad的PCB编辑器里确保所有元件已经布局完毕飞线显示正常。然后导出DSN。第二步加载并检查。打开FreeRouting加载DSN检查层叠、规则、元件位置。第三步设置参数。根据板子的实际情况设置线宽、间距、过孔尺寸。如果是第一次用可以先保持默认跑一遍看看效果。第四步选择布线层。在左侧层列表里勾选你希望参与布线的层。一般先选顶层和底层如果布不通再考虑加内层。第五步启动自动布线。点击“Autoroute”按钮FreeRouting开始计算。这个过程可能需要几秒到几分钟取决于板子的复杂度。你可以在日志窗口看到进度。第六步检查结果。布线完成后飞线应该全部消失或者只剩少数布不通的。仔细检查走线是否合理有没有奇怪的绕路、过孔是否太多、有没有违反设计规则的地方。第七步导出SES。点击“File”-“Export”-“Specctra SES”保存会话文件。第八步导回PCB软件。在KiCad里点击“文件”-“导入”-“Specctra SES”选择刚才导出的文件。KiCad会把走线合并到当前板子上。注意导回SES之前建议先备份一下你的PCB文件。虽然SES导入通常是安全的但万一出问题有备份心里不慌。4.3 参数计算实例线宽与过孔假设你要布一块STM32F103的板子电源是3.3V最大电流500mA。铜厚1oz约35μm允许温升10℃。根据IPC-2221标准外部走线的载流能力可以用公式估算I k * ΔT^0.44 * A^0.725其中k是常数外部走线取0.048ΔT是温升℃A是走线截面积mil²。反推截面积A (I / (k * ΔT^0.44))^(1/0.725)代入I0.5AΔT10℃k0.048A (0.5 / (0.048 * 10^0.44))^(1/0.725) ≈ (0.5 / (0.048 * 2.754))^(1.379) ≈ (0.5 / 0.132)^1.379 ≈ 3.78^1.379 ≈ 6.2 mil²走线宽度 A / 铜厚 6.2 / 1.378 ≈ 4.5mil。这是最小宽度实际取10mil留足余量。过孔的话假设用0.3mm内径0.6mm外径载流能力大概1A左右对于500mA足够了。这些计算看起来麻烦但做多了就有直觉了。FreeRouting不会帮你算这些你得自己心里有数。5. 常见问题排查与避坑指南5.1 布线布不通怎么办这是最常见的问题。FreeRouting跑完之后飞线还剩一堆说明它找不到合法路径。原因通常有几个布局太密元件之间没有足够的通道让走线通过。解决办法是调整布局给关键网络留出通道。规则太严线宽和间距设得太大导致可用空间不足。可以适当放宽规则或者增加布线层。层数不够两层板布不通很正常考虑改成四层板加一个内层专门走电源和地。禁布区太多如果板子上有很多禁布区比如天线区域、安装孔周围会压缩布线空间。我的经验是先用手动布线把关键网络电源、时钟、差分对布好剩下的信号线再交给FreeRouting。这样成功率会高很多。5.2 走线绕路严重FreeRouting有时候会布出很奇怪的走线绕一大圈才连上。这通常是因为推挤算法陷入了局部最优。可以尝试调整推挤策略用更激进的模式重新跑一遍。手动布几条关键线给自动布线器“指个方向”。在DSN里增加一些“引导线”guide traces告诉布线器你希望走线经过哪些区域。5.3 过孔太多自动布线器倾向于用大量过孔来换层因为这样更容易找到路径。但过孔太多会影响信号完整性增加成本。可以在参数里限制过孔数量或者手动优化。5.4 导回SES后走线错位这个问题通常是因为DSN和SES的坐标原点不一致。解决办法是在导出DSN之前把PCB软件的原点设置在板子的左下角并且确保FreeRouting里没有移动过板子。5.5 常见问题速查表问题现象可能原因解决办法布线布不通布局太密、规则太严、层数不够调整布局、放宽规则、增加层数走线绕路推挤策略保守、缺少引导改用激进模式、手动布关键线过孔太多布线器倾向换层限制过孔数量、手动优化导回后错位坐标原点不一致统一原点设置界面卡顿板子太大、Java内存不足增加JVM内存参数规则不生效DSN未包含规则导出时勾选包含规则实操心得FreeRouting的日志窗口会输出很多有用的信息包括布线失败的网表、推挤次数、耗时等。遇到问题时先看日志往往能找到线索。6. 进阶技巧让FreeRouting更好用6.1 混合布线策略纯自动布线很难达到生产级的要求但“手动自动”的混合策略就很实用。我的做法是先手动布电源和地确保电流路径合理。手动布时钟、差分对、敏感信号。把剩下的普通信号线交给FreeRouting。导回后手动优化自动布线的结果修掉明显的绕路和多余过孔。这样既利用了自动布线的速度又保证了关键信号的质量。6.2 利用设计规则引导布线在DSN文件里你可以为不同的网络类设置不同的规则。比如电源网络用更宽的线时钟网络用更严格的间距。FreeRouting会读取这些规则并遵守。所以花时间在PCB软件里把网络类分好比在FreeRouting里反复调参数更有效。6.3 多轮迭代自动布线不是一次就能完美的。我的习惯是跑三轮第一轮默认参数看整体布通率。第二轮根据第一轮的结果调整参数比如放宽间距、增加层数。第三轮手动干预后用保守模式做最后优化。每轮之间记得保存SES文件方便对比。6.4 性能调优如果板子比较大FreeRouting可能会跑得很慢甚至卡死。可以尝试增加Java堆内存启动时加-Xmx4g参数。关闭不必要的层减少计算量。分区域布线把板子切成几块分别处理。7. 我对FreeRouting的真实使用体会说实话FreeRouting不是那种能让你“一键搞定”的神器。它更像是一个辅助工具在合适的场景下能帮你省时间在不合适的场景下会给你添乱。我用了这么多年最大的体会是布局决定布线。如果布局合理自动布线器随便跑跑都能布通如果布局一塌糊涂再好的布线器也救不回来。另外不要指望自动布线的结果能直接拿去打样。它布出来的线你至少得手动过一遍检查有没有违反规则、有没有奇怪的走线、过孔是不是太多。把它当成一个“初稿生成器”而不是“终稿生成器”心态就对了。最后分享一个小技巧如果你用的是KiCad可以在导出DSN之前先把板子的设计规则导出成一个文本文件备份。这样万一FreeRouting把规则改乱了你还能恢复。这个习惯帮我省过好几次事。
