拆开任何一台手机,最先映入眼帘的往往是那块巴掌大小、布满黑色小方块的主板。很多人第一次看到它时的反应是"元件真密",但如果把注意力从元件移到它们脚下那层墨绿色的板子上,你会发现真正密集的东西藏在里面——那是一层又一层被蚀刻出来的铜箔走线。有工程师做过估算,一块高密度手机主板上的铜箔走线如果全部拉直首尾相接,总长度可以轻松达到几十米这个量级,相当于把一个足球场的长度装进了口袋。这个说法听起来夸张,但它背后是实打实的几何结构:多层板、任意层互连、细线宽细间距,把三维空间里的连接需求压缩到了二维平面上反复折叠。
本文围绕 PCB(Printed Circuit Board,印制电路板)的工作原理展开,从层叠结构、过孔机制、走线的电气属性讲到阻抗控制,再落到两个可以动手复现的实操案例:用 Python 脚本估算走线长度、电阻压降与温升,用 KiCad 走一条受控阻抗的差分线。刚接触硬件的同学可以把这篇当作入门地图,做过单片机项目、画过两层板的开发者则可以直接跳到第 3、4、5 章看工程细节和排查清单。读完之后,你至少应该能回答三个问题:手机主板为什么能把这么长的走线塞进去、走线长度和宽度会怎样影响电路表现、以及画板时哪些参数是必须提前算清楚的。
1. PCB 到底是什么:从手机主板说起
1.1 一块板子的本质:导线 + 绝缘层 + 焊盘
剥掉所有元件、阻焊和丝印,一块 PCB 的物理本质其实只有三样东西:导电的铜、绝缘的基材、以及把元件引脚和铜连起来的焊盘。铜箔被蚀刻成一条条走线,承担原本应该由导线完成的连接任务;基材(最常见的是 FR-4,玻璃纤维布浸渍环氧树脂后压合而成)负责支撑和绝缘;焊盘则是走线末端的"接口",元件焊接在这里,电气连接就此完成。所以从功能角度看,PCB 就是一块被"印刷"出来的、高度定制化的导线网络,它替代了早期电子设备里那种手工飞线、线束扎带的连接方式。
这个替代带来的收益远不止"好看"。手工飞线的问题在于每一条线都是独立的、悬空的,线间距离不可控,寄生电感大,振动下容易断,而且完全无法批量复制。PCB 用光刻和蚀刻工艺把整个连接网络一次性做出来,走线宽度、间距、层间关系全部由设计文件精确决定,同一批次的每一块板子在电气上几乎完全一致。这也是为什么现代电子产品的可靠性能够做到这么高——连接本身被"固化"进了结构里,不再依赖人工操作的稳定性。
理解这一点之后,很多设计规则就变得顺理成章。比如为什么电源走线要加宽?因为铜是有电阻的,宽度决定了截面积,截面积决定了压降和发热。为什么高速信号要走等长?因为信号在铜里传播需要时间,长度不同就意味着到达时间不同。这些规则不是凭空规定的教条,而是"用铜做导线"这个物理事实的直接推论。
1.2 为什么手机主板能塞下这么长的走线
答案的核心是"多层"两个字。一块普通的双层板只有正反两个布线面,走线一旦交叉就必须绕路或者打过孔换层;而手机主板普遍是 8 层、10 层甚至 12 层以上的 HDI(High Density Interconnect,高密度互连)板,中间夹着多个走线层和完整的参考平面层。每多一层,就多出一个可以自由布线的二维平面,原本需要绕大圈的连接可以直接在另一个层上"穿过去",三维空间被充分利用起来。
再叠加两个因素,走线总长度就被推到了几十米的量级。第一是线宽线距的极限压缩,高端手机主板的线宽可以做到 40~50 微米级别,激光钻孔的微孔直径也在 100 微米上下,单位面积能容纳的走线数量成倍增加。第二是任意层互连(Any-layer HDI)工艺,传统多层板只能打贯穿所有层的通孔,而任意层互连允许在任意相邻两层之间打盲孔,布线自由度大幅提升。走线可以走"捷径",也就可以在有限面积里塞进更多条、更长的路径。
所以"足球场长的导线迷宫"这个比喻虽然在数值上没法精确验证,但它想表达的意思是对的:主板上的连接密度已经远远超出肉眼直觉,一块 5 厘米见方的板子内部,藏着的是一张经过精密计算的三维连接网络。
1.3 PCB 与面包板、飞线的本质区别
初学者常常用面包板搭电路,觉得"连接"这件事很简单,插几根跳线就完事了。但面包板和 PCB 之间的差距不是方便程度的问题,而是电气特性的问题。面包板的簧片接触电阻在几十毫欧量级且不稳定,跳线形成的环路面积很大,寄生电感高,稍高一点的频率下信号就会明显劣化;而 PCB 的走线是实心铜,截面积确定,回路路径可以精确控制,参考平面就在信号层旁边,回流路径短且可预测。
飞线的问题则在于不可控。你可以用飞线把两个点连起来,但你无法保证这条线和旁边那条线的间距、无法保证它对地平面的距离、也无法保证一百块板子上每一根的走向都一致。在低频、低速、小批量的场景下这些都不是问题,可一旦信号频率上到几十兆赫兹,或者产品需要量产,飞线就彻底不可接受了。PCB 的价值正是在于把这些"不可控"变成了"由设计文件决定"。
2. 环境准备:看懂和验证一块 PCB 需要什么
2.1 软件环境:EDA 工具与 Gerber 查看器
要学习和验证 PCB,第一件事是准备好工具链。开源方案里最主流的是 KiCad,它覆盖原理图、PCB 布局、3D 预览和制造文件导出,跨 Windows、Linux、macOS,社区资源丰富;国内用户还可以选择立创 EDA,浏览器里就能打开,配合元件库和打样服务上手很快;商业工具里 Altium Designer、Cadence Allegro 在工业界使用广泛,但学习成本较高。本文的实操示例以 KiCad 为主线,因为它的文件格式开放、命令行工具成熟,便于脚本化处理。
除了设计工具,还需要一个 Gerber 查看器。Gerber 是 PCB 行业的标准制造文件格式,每一层对应一个文件,产线就是靠这些文件做光绘和蚀刻的。开源查看器 gerbv 常年维护,KiCad 自带的 Gerber Viewer 也够用。准备这两个工具的意义在于:当你拿到一块别人设计的板子或者工厂返回的工程文件时,可以不依赖原始设计文件就直接查看每一层的图形,这对逆向分析和问题定位非常有用。
版本方面需要说明一句:本文示例基于 KiCad 7/8 系列的常见用法,不同大版本之间在菜单结构、规则语法、命令行参数上会有差异,实际操作请以你本地安装版本的官方文档为准。命令行工具kicad-cli是在较新版本中才提供的能力,老版本没有这个命令属于正常现象,改用图形界面导出即可。
2.2 硬件环境:万用表、放大镜与必要的安全意识
软件之外,验证 PCB 还需要最基础的几样硬件工具。万用表是必备的,通断档用来查开短路,电阻档用来量走线电阻,二极管档用来判断焊盘是否连到了正确的网络。放大镜或者带补光的 USB 显微镜用于目视检查,尤其是 0402 甚至 0201 封装旁边有没有连锡、虚焊,肉眼几乎看不出来。如果有热风枪和恒温烙铁,可以做一些拆焊和飞线修复的实操,但这类操作必须在断电、放电完成之后进行。
这里必须强调安全边界:涉及带电测量时,万用表档位一定要先确认,用电流档去量电压会直接烧表甚至炸表笔;涉及锂电池供电的板子,拆装前必须断开电池连接,避免短路引发热失控;涉及热风枪拆焊,工作台面要耐高温,附近不能有易燃物,焊接后板子要自然冷却再上手。这些不是客套话,是很多人在实验室里真实踩过的坑。任何对量产设备、医疗设备、车载电子的改动,都必须先获得明确授权,并在可回退的环境里验证,不要直接在生产设备上试手。
2.3 示例工程结构与文件说明
为了让后面的实操有统一的参照,先约定一个最小工程目录结构。无论你用什么 EDA 工具,最终产生的文件类型大同小异,理解这些文件的职责比记住某个工具的具体菜单更重要。
pcb_demo/ ├── pcb_demo.kicad_pro # 工程文件,记录工程级配置 ├── pcb_demo.kicad_sch # 原理图文件,描述逻辑连接 ├── pcb_demo.kicad_pcb # PCB 布局文件,描述物理实现 ├── pcb_demo.kicad_dru # 自定义设计规则文件(可选) ├── gerber/ # 导出的制造文件目录 │ ├── pcb_demo-F_Cu.gbr # 顶层铜箔 │ ├── pcb_demo-B_Cu.gbr # 底层铜箔 │ ├── pcb_demo-F_Mask.gbr # 顶层阻焊 │ ├── pcb_demo-F_Silkscreen.gbr │ └── pcb_demo-Edge_Cuts.gbr # 板框 └── scripts/ └── trace_calc.py # 后文要写的计算脚本这个结构里,原理图(.kicad_sch)和 PCB 布局(.kicad_pcb)是分离的两份文件,前者描述"谁连谁",后者描述"怎么连、连在哪"。这种分离是 EDA 工具的通则,也是理解 PCB 设计流程的关键:先把逻辑连接理清楚,再去考虑物理实现。Gerber 目录则是最终交付给工厂的东西,设计文件工厂是看不懂的,能看懂的只有这些按层拆分的图形文件。
3. 核心原理拆解:PCB 是怎么把电路"画"出来的
3.1 层叠结构:铜箔、基材、阻焊与丝印
一块多层板的剖面,从外到内依次是:阻焊层、铜箔走线层、半固化片(prepreg)、内层铜箔、芯板(core)、再往下对称重复。铜箔的厚度通常用"盎司"表示,1 oz 对应约 35 微米,这是行业惯用单位,因为早期电镀工艺是按单位面积铜重来控制的。常见的内层铜厚是 0.5 oz 或 1 oz,外层因为要经过电镀加厚,最终厚度往往更厚一些。铜越厚,载流能力越强,但同时能蚀刻出的最细线宽也越大,这是一个需要权衡的参数。
阻焊层就是我们看到的绿色(也有黑色、蓝色、白色)涂层,它的作用是阻止焊锡在非焊盘区域附着,同时提供一定的防潮和绝缘保护。需要注意的是阻焊层不是绝对的绝缘体,它不能替代安规距离,高压设计里必须靠铜与铜之间的物理间距来保证爬电距离。丝印层则是白色的字符和框线,用来标注元件位号、极性、版本号,它纯粹是给人看的,不参与任何电气功能。
表面处理是容易被忽略的一环。裸铜暴露在空气里很快会氧化,氧化层会严重影响可焊性,所以焊盘表面必须做处理。最常见的两种是 HASL(热风整平,也就是喷锡)和 ENIG(化学沉金)。前者成本低、可焊性好,但表面不平整,不适合细间距元件;后者表面平整、抗氧化能力强,适合 BGA 和高密度板,成本也更高。手机主板这类高密度产品基本都用沉金或者更高级的处理方式。
3.2 过孔与盲埋孔:垂直方向的"立交桥"
如果说走线是平面上的道路,过孔就是立交桥。一个通孔(Through Hole Via)会贯穿整块板子,把顶层和底层或者其他任意层连接起来。它的结构包括孔壁上的电镀铜层和两端的焊盘环( annular ring)。过孔本身不承载元件,但它占据了所有经过的层上的布线空间——如果一块 10 层板上打了一个通孔,那么这 10 层在这个位置都不能走线,这就是所谓的"禁布区"。
盲孔(Blind Via)只从外层通到某个内层,不贯穿全板;埋孔(Buried Via)则完全位于内层之间,从外面根本看不到。这两种孔必须用多次压合工艺实现,成本显著上升,但换来的是布线自由度的质变。手机的任意层互连 HDI 板就是把这个思路推到极限:每一层之间都可以打微孔,走线可以在任意相邻层之间自由切换,不必绕到通孔位置。
工程上还有几个与过孔相关的关键参数需要注意。孔径与焊盘环的比值(aspect ratio)决定了电镀的难易程度,深径比越大越难镀均匀;过孔的载流能力比同宽度的走线弱,因为孔壁铜厚通常只有 20~25 微米,所以大电流路径要多打几个孔并联;过孔还会引入寄生电容和电感,高速信号换层时需要考虑阻抗不连续带来的反射。
3.3 走线的电气属性:电阻、电感与耦合电容
一条走线在直流下就是一个电阻,阻值由材料电阻率、长度、截面积决定。铜在 20°C 时的电阻率约为 1.72×10⁻⁸ Ω·m,换算成工程单位,一条宽 0.2 mm、厚 35 微米、长 100 mm 的走线,电阻大约在 0.25 Ω 量级。这个数字看起来很小,但如果这条线上流过 2 A 电流,压降就是 0.5 V,功耗 1 W——对于一个 3.3 V 系统来说,这已经是不可接受的损耗了。所以电源走线必须按电流加宽,这不是玄学,是可以算出来的。
交流下情况更复杂。走线对参考平面存在分布电容,走线自身有分布电感,两者共同决定了这条路径的特征阻抗。当信号频率较低、走线长度远小于信号波长时,这些寄生参数可以忽略,走线就是一根理想导线;但当信号上升沿很陡、或者走线长度接近波长的十分之一时,走线就必须当作传输线来处理,此时阻抗不匹配会引起反射、过冲、振铃。
此外,两条平行且距离较近的走线之间存在容性耦合和感性耦合,也就是串扰。耦合强度与线间距、平行长度、以及它们距离参考平面的高度都有关系。这就是为什么高速信号旁边要留 3W 间距(W 是线宽),为什么要尽量避免长距离平行走线,以及为什么差分对要 tightly coupled 地走在一起。
3.4 阻抗控制与参考平面
阻抗控制是高速 PCB 设计里最核心的概念之一。它的目标是让走线的特征阻抗保持在一个确定值上,常见的单端目标是 50 Ω,差分目标是 90 Ω(USB 2.0)或 100 Ω(以太网、PCIe)。为什么是这些数值?因为芯片的驱动能力和接收器的设计都是围绕这些标准阻抗优化的,走线阻抗偏离太多,就会产生反射,信号质量下降。
实现阻抗控制的手段是调整几何参数:线宽、介质厚度、铜厚、以及走线到参考平面的距离。对于表层走线(微带线),阻抗主要由线宽和到下方平面的介质厚度决定;对于内层走线(带状线),走线上下都有参考平面,阻抗由线宽和上下介质厚度共同决定。工程师在叠层设计阶段就要把这些参数算清楚,然后写进设计规则,布线时由工具约束。
"参考平面"这个概念值得单独说明。高速信号的回流电流总是走阻抗最小的路径,对于高频信号来说,这个路径就在信号走线正下方的参考平面上。所以信号层必须紧邻一个完整的平面层(地平面或电源平面),而且这个平面不能被打断。如果回流路径被一条槽或者一堆过孔切断,回流电流就必须绕行,形成一个大的环路,辐射和串扰都会急剧恶化。这是很多"板子画完了但 EMC 过不了"问题的根源。
4. 实战案例一:用 Python 估算走线长度、压降与温升
4.1 需求与数据结构设计
在真正画板之前,先用脚本把关键参数算一遍,是一个很实用的习惯。这个脚本要解决的问题是:给定一批走线的长度、宽度、铜厚和流过的电流,算出每条线的直流电阻、压降、功耗和温升,判断是否超出设计余量。输入数据可以用一个简单的 CSV,也可以直接在脚本里内嵌,为了方便复现,这里采用内嵌列表的方式,结构清晰且不依赖外部文件。
设计上要注意几个点。第一,铜的电阻率随温度变化,温升又会反过来增加电阻,严格来说这是一个耦合问题,工程上通常用迭代或者一次近似来解决;第二,铜厚用盎司表示,需要转换成米;第三,温升的估算不能只靠 IPC 的经验公式,还要结合实际散热条件,脚本给出的结果只能作为初筛参考,不能替代热仿真。
4.2 完整脚本:电阻、压降与温升估算
下面这个脚本只用 Python 标准库,复制下来就能跑。
# 文件路径:pcb_demo/scripts/trace_calc.py # 用途:估算 PCB 走线的直流电阻、压降、功耗与温升 # 依赖:Python 3.8+,仅使用标准库 from dataclasses import dataclass # 铜在 20 摄氏度时的电阻率,单位:欧姆·米 COPPER_RESISTIVITY_20C = 1.72e-8 # 铜的电阻温度系数,单位:1/摄氏度 COPPER_TEMP_COEFF = 0.00393 # 1 盎司铜对应的厚度,单位:米(35 微米) OZ_TO_METER = 35e-6 @dataclass class Trace: """描述一条走线的几何与电气参数""" name: str length_mm: float # 走线长度,毫米 width_mm: float # 走线宽度,毫米 copper_oz: float # 铜厚,盎司 current_a: float # 工作电流,安培 ambient_c: float = 25.0 # 环境温度,摄氏度 def trace_resistance(trace: Trace, temp_c: float) -> float: """计算走线在给定温度下的电阻,单位欧姆""" length_m = trace.length_mm * 1e-3 width_m = trace.width_mm * 1e-3 thickness_m = trace.copper_oz * OZ_TO_METER area_m2 = width_m * thickness_m if area_m2 <= 0: raise ValueError(f"走线 {trace.name} 的截面积无效,请检查宽度与铜厚") rho = COPPER_RESISTIVITY_20C * (1 + COPPER_TEMP_COEFF * (temp_c - 20.0)) return rho * length_m / area_m2 def estimate_delta_t(power_w: float, area_mm2: float) -> float: """ 用简化的经验关系估算温升。 这里采用常见的工程近似:温升与单位面积功耗的平方根近似成正比, 系数需要按实际板厚、铜面积、通风条件标定,仅作初筛参考。 """ if area_mm2 <= 0: return 0.0 density = power_w / area_mm2 # 单位:W/mm² return 30.0 * (density ** 0.5) def analyze(trace: Trace) -> dict: """对单条走线做完整分析,返回结果字典""" # 先用环境温度算一次电阻,得到功耗,再迭代修正温度 temp = trace.ambient_c for _ in range(5): resistance = trace_resistance(trace, temp) drop = trace.current_a * resistance power = trace.current_a ** 2 * resistance surface_area = trace.length_mm * trace.width_mm delta_t = estimate_delta_t(power, surface_area) temp = trace.ambient_c + delta_t return { "name": trace.name, "resistance_ohm": resistance, "drop_v": drop, "power_w": power, "delta_t_c": delta_t, "final_temp_c": temp, } def main() -> None: traces = [ Trace("VBUS_5V", length_mm=45.0, width_mm=1.0, copper_oz=1.0, current_a=2.0), Trace("CORE_1V2", length_mm=18.0, width_mm=0.8, copper_oz=1.0, current_a=3.0), Trace("SIG_MIPI", length_mm=60.0, width_mm=0.1, copper_oz=0.5, current_a=0.02), Trace("LED_BLK", length_mm=30.0, width_mm=0.3, copper_oz=1.0, current_a=0.6), ] header = f"{'走线名':<12}{'电阻(Ω)':>10}{'压降(V)':>10}{'功耗(W)':>10}{'温升(℃)':>10}{'终温(℃)':>10}" print(header) print("-" * len(header)) for trace in traces: r = analyze(trace) print( f"{r['name']:<12}" f"{r['resistance_ohm']:>10.4f}" f"{r['drop_v']:>10.4f}" f"{r['power_w']:>10.4f}" f"{r['delta_t_c']:>10.2f}" f"{r['final_temp_c']:>10.2f}" ) # 给出简单的设计提示 if r["drop_v"] > 0.05 * 1 and trace.name.startswith("VBUS"): print(f" [提示] {trace.name} 压降超过 50mV,建议加宽走线或增加并联层") if r["final_temp_c"] > 85: print(f" [警告] {trace.name} 估算终温超过 85℃,需要重新评估铜厚与散热") if __name__ == "__main__": main()代码里的关键点值得逐条说明。COPPER_RESISTIVITY_20C和COPPER_TEMP_COEFF是铜的材料常数,前者决定基础电阻,后者决定温度修正的斜率;trace_resistance用ρL/A计算电阻,其中截面积由宽度乘厚度得到,这个公式虽然简单,但很多设计事故恰恰是因为没算过它;analyze函数里的循环是一个不动点迭代,因为温升会改变电阻,电阻又改变功耗,迭代五次基本就能收敛。
estimate_delta_t用的是简化的平方根经验关系,系数 30 并没有普适性。真实温升受板厚、铜面积、过孔数量、周围元件、风速影响很大,脚本结果只能告诉你"这条线可能有点悬",不能告诉你"这条线一定安全"。如果你的项目对温升敏感,必须用热仿真或者实测来确认。
4.3 运行方式与预期输出
脚本保存到pcb_demo/scripts/trace_calc.py后,在终端里执行:
cd pcb_demo/scripts python3 trace_calc.py预期输出类似下面这样(具体数值随参数变化):
走线名 电阻(Ω) 压降(V) 功耗(W) 温升(℃) 终温(℃) ---------------------------------------------------------------------- VBUS_5V 0.0221 0.0442 0.0884 8.92 33.92 CORE_1V2 0.0111 0.0332 0.0996 7.45 32.45 SIG_MIPI 0.4128 0.0083 0.0002 0.74 25.74 LED_BLK 0.0491 0.0295 0.0177 5.15 30.15 [提示] VBUS_5V 压降超过 50mV,建议加宽走线或增加并联层从结果里能读出几件事。VBUS_5V虽然电阻只有二十多毫欧,但在 2 A 电流下压降已经接近 45 mV,接近提示阈值;SIG_MIPI这种信号线的电阻高达 0.4 Ω,但它只跑 20 mA,压降只有 8 mV,完全不是问题,这说明电阻的大小本身不能说明好坏,要结合电流看。CORE_1V2是典型的大电流低压路径,1.2 V 的轨上出现 33 mV 压降意味着 2.8% 的损失,对于核心电压这种精度敏感的场景,这个数字需要认真对待。
4.4 结果解读与调参方向
脚本最重要的作用不是给出精确数值,而是建立量化的直觉。当你知道一条 1 mm 宽、1 oz 铜的走线每 10 mm 长度大约对应 5 mΩ 电阻时,看到设计里一条又细又长的电源线,就能立刻反应过来"这里可能有问题"。这种直觉在评审别人的板子时特别有用。
如果要继续深化这个脚本,有几个方向值得尝试。引入走线的方阻概念(sheet resistance),可以在铜厚固定的前提下把电阻简化成"方块数 × 方阻",心算更方便;加入过孔电阻的估算,因为大电流路径上过孔往往是瓶颈;把结果输出成 CSV 或者 Markdown 表格,方便贴进设计评审文档。这些扩展都不需要额外依赖,属于练手的好题目。
5. 实战案例二:用 KiCad 走一条受控阻抗的差分线
5.1 叠层设置与板材参数
差分阻抗能不能做到位,一半取决于叠层有没有设对。打开 KiCad 的 PCB 编辑器,进入Board Setup→Physical Stackup,先确认层数。以常见的四层板为例,典型叠层是:顶层信号、内层地平面、内层电源平面、底层信号。这个顺序的好处是顶层和底层信号都有紧邻的参考平面,回流路径短。
介质参数需要按实际板材填写。FR-4 的介电常数(Dk)在 4.2~4.6 之间,随频率和树脂含量变化,损耗因子(Df)在 0.02 左右。这些数值必须从板材供应商的数据手册里取,不要直接抄网上的默认值,因为不同厂家、不同型号的 FR-4 差异不小。芯板和半固化片的厚度也要按实际采购规格填写,常见的芯板厚度有 0.2 mm、0.4 mm、0.8 mm 等。
叠层参数填完之后,KiCad 的Impedance Calculator可以帮你反算线宽。输入目标阻抗(差分 100 Ω)、介质厚度、铜厚、差分间距,工具会给出建议的线宽和间距组合。注意这个计算器用的是解析近似公式,和板厂实际做出来的阻抗会有偏差,最终以板厂的阻抗测试报告为准。
5.2 定义网络类与差分对
在原理图阶段就应该把差分对标记出来。KiCad 的约定是网络名后缀_P/_N或者+/-,比如USB_DP/USB_DN。在 PCB 编辑器里,打开Board Setup→Net Classes,为高速信号单独建一个网络类,把线宽、间距、过孔尺寸都设好。
网络类名称: DIFF_100R 走线宽度: 0.15 mm 最小间距: 0.15 mm 过孔直径: 0.3 mm 过孔钻孔: 0.15 mm把这些参数写进网络类而不是逐条手改,是保证一致性的关键。一个板子上可能有几百条走线,靠手工保证每一条都符合规则是不现实的,必须让工具去约束。这也是为什么大型项目里设计规则文件比布局本身更值得评审——规则错了,产出的所有走线都错。
5.3 自定义设计规则文件片段
KiCad 支持用.kicad_dru文件写自定义规则,语法是 S 表达式。下面是一个针对差分线的规则片段,注意语法随版本会有差异,实际使用时请对照你本地版本的官方文档。
; 文件路径:pcb_demo/pcb_demo.kicad_dru ; 说明:自定义设计规则示例,语法以本地 KiCad 版本为准 (version 1) ; 差分对规则:约束差分间距 (rule "USB_DIFF_GAP" (constraint diff_pair_gap (min 0.15mm) (opt 0.18mm) (max 0.22mm)) (condition "A.NetClass == 'DIFF_100R'")) ; 差分对规则:约束差分线宽 (rule "USB_DIFF_WIDTH" (constraint diff_pair_uncoupled_width (min 0.13mm) (opt 0.15mm) (max 0.17mm)) (condition "A.NetClass == 'DIFF_100R'")) ; 电源网络最小线宽 (rule "POWER_WIDTH" (constraint track_width (min 0.5mm)) (condition "A.NetClass == 'POWER'"))规则写完之后,在 PCB 编辑器里执行Inspect→Design Rules Checker,工具会按这些约束检查全线。DRC 报错不要一键忽略,每一条都要看明白原因——是规则本身设错了,还是布线确实违规。很多时候是前者,尤其是刚接手别人工程的时候。
5.4 布线、等长与出图验证
差分线布线有一个基本原则:两条线要等长、等间距、紧耦合地一起走。KiCad 里用Route Differential Pair工具,点到其中一条线上,两条线会同步推进。转弯处要保持对称,避免一条线绕大弯另一条抄近道;如果必须打过孔,两条线要同时打,且过孔位置尽量对称,因为过孔会引入阻抗不连续和额外的长度。
等长调整在Tune Differential Pair Length里完成,工具会在你指定的位置插入蛇形绕线。绕线的幅度和间距有讲究:幅度太大占空间且会增加串扰,幅度太小则调节精度不够;相邻蛇形段之间的间距建议不小于 3 倍线宽,减少自身耦合。所有绕线都应该放在干扰较小的区域,不要把蛇形绕在晶振或者开关电源旁边。
出图阶段的命令如下:
# 导出 Gerber 制造文件到 gerber 目录 kicad-cli pcb export gerbers --output ./gerber pcb_demo.kicad_pcb # 导出钻孔文件 kicad-cli pcb export drill --output ./gerber pcb_demo.kicad_pcb # 运行设计规则检查并输出报告 kicad-cli pcb drc --output ./gerber/drc.rpt pcb_demo.kicad_pcb导出之后,用 Gerber 查看器逐层检查:板框是否闭合、阻焊开窗是否覆盖所有焊盘、丝印有没有压到焊盘上、钻孔文件和铜层是否对齐。这些检查看似繁琐,但比起板子做回来发现开窗错了要重新投板,花十分钟检查是极其划算的。投板前最好再做一次 3D 预览,确认元件高度、连接器朝向、安装孔位置都符合结构要求。
6. 常见问题与排查思路
PCB 相关的问题可以粗略分成两类:设计阶段的问题和实物阶段的问题。前者靠 DRC、评审和仿真发现,后者靠万用表和示波器定位。下面这张表整理了高频出现的现象和对应思路。
| 问题现象 | 常见原因 | 排查与解决思路 |
|---|---|---|
| DRC 报大量间距违规 | 网络类未正确分配,或规则阈值过严 | 先确认网络类归属,再核对板厂最小线宽线距能力 |
| 差分阻抗实测偏离目标 | 叠层参数与板厂实际不符,或线宽被规则覆盖 | 向板厂索取阻抗测试报告,回溯叠层与线宽设置 |
| 板子做回来后有网络短路 | Gerber 层错位、阻焊开窗过大、蚀刻过度 | 对照 Gerber 逐层比对,用万用表定位短路点 |
| 高速信号眼图闭合 | 参考平面被分割、过孔stub过长、未做阻抗控制 | 检查回流路径连续性,缩短 stub,复核阻抗 |
| 电源纹波偏大 | 去耦电容布局过远、电源平面阻抗高 | 把去耦电容贴近引脚,增加平面层,检查过孔数量 |
| 焊盘不上锡 | 表面处理氧化、阻焊残留、焊盘被丝印覆盖 | 检查表面处理类型,确认丝印未压焊盘 |
| 元件贴装偏移 | 焊盘设计不符合封装标准、钢网开孔不当 | 对照 IPC 封装标准复核焊盘尺寸与间距 |
| EMC 测试辐射超标 | 回流路径断裂、时钟线未包地、连接器未做滤波 | 优先修复回流路径,再考虑屏蔽与滤波 |
针对其中几个最容易踩的坑,再展开说一下排查顺序。遇到"板子做回来短路",第一步不要急着拆元件,先用万用表通断档量一下短路的两个网络,确认是真的短路还是测量方式问题;如果确认短路,用放大镜沿着两个网络的走线找,重点看细间距区域、过孔密集区和板边;很多时候是蚀刻残留或者钻孔偏移造成的,这类问题需要联系板厂提供制程报告。
遇到"高速信号不稳定",排查顺序建议是:先看电源是否干净,再看参考平面是否连续,最后才怀疑走线本身。很多看似信号完整性的问题,根因其实是电源噪声或者地弹。用示波器测量时要注意探头接地弹簧的使用,长地线引入的环路会让测量结果完全失真,这一点在几百兆赫兹以上尤其明显。
7. 最佳实践与工程建议
7.1 命名规范与可维护性
网络命名看起来是小事,但在多人协作和长期维护的项目里,它直接决定了别人能不能看懂你的板子。建议的约定是:电源网络用电压值命名,如VCC_3V3、VDD_CORE_1V2;地网络区分模拟地和数字地,如GND_AGND、GND_DGND;差分对用统一后缀;时钟信号加CLK_前缀。位号方面,电阻R、电容C、电感L、连接器J、测试点TP,这些是行业通用约定,不要自创。
版本管理同样重要。板子上应该有丝印版本号,设计文件应该有对应的 Git 仓库或者版本目录,每次投板都要能追溯到具体的设计状态。很多团队吃过"这块板子是哪一版"的亏——改了一个电阻值没记录,三个月后出了问题根本没法复现。
7.2 电源完整性与去耦电容布局
去耦电容的作用是在芯片瞬间取电时提供本地电荷储备,降低电源网络的瞬态阻抗。它的效果高度依赖布局:电容离引脚越远,中间的走线电感就越大,高频去耦效果越差。工程上的经验是去耦电容尽量放在芯片同一面、紧贴电源引脚,走线短而宽,过孔直接打在焊盘旁边而不是通过细线绕过去。
不同容值的电容要配合使用。大容值(10 μF 以上)负责低频储能,小容值(0.1 μF、0.01 μF)负责高频旁路,它们的自谐振频率不同,组合起来才能覆盖宽频段。注意小容值电容必须放在离引脚最近的位置,因为它负责的是最高频的那部分,一旦走线变长就失去意义了。
7.3 回流路径与 EMC 设计
EMC 问题的根源大多可以归结到"电流环路面积太大"。任何信号从源到负载再回到源,都会形成一个环路,环路面积越大,辐射效率越高,对外界干扰也越敏感。控制环路面积最有效的手段就是保证回流路径紧贴信号走线,而这就要求参考平面完整。
具体做法包括:不要在参考平面上开长槽,尤其是跨越多个信号线的槽;信号换层时在旁边加回流过孔,让回流电流有连续的路径;连接器和板边区域做包地处理;时钟线尽量走内层并两侧包地。这些措施在布局阶段就要考虑,等到布线完成再回头改,成本会高很多。
7.4 可制造性与可测试性
设计出来的板子最终要能造出来、能测出来。可制造性方面,要严格遵守板厂的最小线宽、最小间距、最小孔径、最小环宽能力,不同板厂的能力差异很大,投板前一定要确认。拼板方式、工艺边、Mark 点、定位孔这些细节也要提前规划,否则装配厂可能会拒收。
可测试性方面,关键网络应该留测试点,测试点的直径要足够大以便探针接触,周围要留出探针操作空间。对于量产产品,还要考虑 ICT(在线测试)和功能测试的治具需求。这些内容在原理图阶段就应该规划,而不是等板子做回来才发现没地方下探针。
8. 学习路线与动手建议
如果你是刚接触硬件的学生,建议的路径是:先用万用板或者面包板搭一个最小系统(比如单片机加 LED 加按键),理解电路的基本连接关系;然后用 KiCad 把这个电路画成原理图,再布局布线成一块两层板;投一次板,焊一遍,用万用表把所有网络测一遍。这个过程走完,你对 PCB 的理解会比看十篇文章都深。
如果你已经有画板经验,下一步可以挑战高速设计。找一个带 USB 2.0 或者以太网接口的芯片,按官方参考设计做一块板,重点练习叠层设计、阻抗控制和差分走线。做出来之后用示波器看眼图,对照参考设计的建议找差距。这个过程会遇到很多"书上没写"的细节,比如过孔 stub 的影响、连接器的阻抗不连续、以及板材批次差异带来的阻抗偏移。
无论处在哪个阶段,有几个习惯值得坚持:动手之前先算一遍关键参数,不要凭感觉;每次投板前把 Gerber 逐层看一遍,不要只依赖 DRC;板子回来之后把实测结果和设计预期对比,记录差异;遇到问题先定位根因再改,不要靠试错堆方案。PCB 设计是一门需要反复实践的手艺,看再多理论,不如亲手画一块板、焊一遍、测一遍来得扎实。如果这篇文章对你有帮助,可以收藏备用,后面画板遇到具体问题时回来翻对应章节会比较方便。