关于 matlab-read-pcb-layout
这项 MATLAB 技能用于导入和检查 Gerber、ODB++ 与 Cadence Allegro 格式的 PCB 及 IC/SiP 封装布局。它涵盖几何图形和层级数据的提取,并将导入设计用于后续分析。
主要功能
- 01导入 Gerber、ODB++ 和 Allegro
- 02检查层与叠层结构
- 03查询网络、元件和引脚
- 04提取并显示多边形
- 05转换为 pcbComponent
适用场景
- 01检查电路板或封装的层与网络
- 02提取 Gerber 金属图形用于自定义设计
- 03准备导入几何以进行 S 参数分析
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-read-pcb-layout安装后在 Claude Code 中输入/matlab-read-pcb-layout确认已加载。
附带文件manifest.yaml
详细介绍
读取 PCB 和封装布局
范围:pcbFileRead 可处理 PCB 板和 IC/SiP 封装。ODB++ 和 Allegro 文件可能包含封装级设计(BGA 基板、中介层、嵌入式无源器件)。工作流相同——格式决定了文件包含的内容,而非函数名称。
适用场景
- 将 Gerber 文件(
.gtl、.gbl、.gbr等)导入 MATLAB,以便可视化或进行 EM 分析 - 读取 ODB++ 归档文件(压缩或未压缩),检查板级或封装布局
- 导入 Cadence Allegro
.brd文件 - 检查导入布局中的 cadnet、组件、层、引脚或形状
- 从 Gerber 文件提取金属层多边形,以用于自定义设计
- 根据外部设计的布局构建
pcbComponent,用于 S 参数分析
不适用场景
- 将设计导出为 Gerber 文件——请使用
matlab-write-pcb-layout - 使用形状基元从头构建 PCB 结构——请使用
matlab-assemble-pcb-layout - 导入后运行 EM 分析——请使用
matlab-analyze-em - 定义基板或叠层材料——请使用
matlab-manage-pcb-material
典型工作流
- **本技能:**从 Gerber、ODB++ 或 Allegro 导入 PCB 布局
- 之后:
matlab-analyze-pcb-pdn——对导入的板进行 PDN 直流分析;或matlab-analyze-em——从导入的几何结构提取 S 参数;或matlab-model-via——对导入的叠层进行过孔分析
快速参考
| 任务 | 代码 |
|---|---|
| 导入 Gerber 文件 | P = gerberRead('file.gtl') |
| 提取形状 | shp = shapes(P) |
| 定义叠层 | S = stackUp |
| 导入多层布局 | p = PCBReader('StackUp', S) |
| 转换为 pcbComponent | pcb = pcbComponent(p) |
| 导入 ODB++ | pfile = pcbFileRead('design.zip') |
| 导入 Allegro .brd | pfile = pcbFileRead('design.brd') |
| 列出 cadnet | tbl = cadnetList(pfile) |
| 打开 cadnet | cnet = cadnet(pfile, "NET_NAME") |
| 查询层叠层 | su = stackUp(pfile) |
| 列出组件 | tbl = componentList(pfile) |
| 列出焊盘堆叠 | tbl = padStackList(pfile) |
gerberRead — 简易导入
gerberRead 函数导入 Gerber 文件并返回一个 PCBReader 对象。使用 shapes() 将金属层提取为多边形形状。
基本用法
P = gerberRead('interdigital_Capacitor.gtl');
shp = shapes(P); % Extract metal layer shapes
show(shp(1)); % Show top layer polygon
将导入的几何结构居中
导入的形状通常相对于 CAD 原点存在非零偏移。提取形状后将其居中:
P = gerberRead('myDesign.gtl');
shp = shapes(P);
layer1 = shp(1);
% Get bounding box to compute center offset
verts = layer1.Vertices;
cx = (max(verts(:,1)) + min(verts(:,1))) / 2;
cy = (max(verts(:,2)) + min(verts(:,2))) / 2;
% Center using translate
layer1 = translate(layer1, [-cx -cy 0]);
show(layer1);
支持的 Gerber 文件扩展名
| 扩展名 | 层类型 |
|---|---|
.gtl | 顶层铜 |
.gbl | 底层铜 |
.gts | 顶层阻焊层 |
.gbs | 底层阻焊层 |
.gto | 顶层丝印层 |
.gbo | 底层丝印层 |
.drl | 钻孔文件 |
.gbr | 通用 Gerber |
stackUp — 多层定义
stackUp 对象定义完整的 PCB 层结构,用于导入多层板。
默认 stackUp
S = stackUp;
默认叠层包含编号层。奇数层为导体(金属层或 Gerber 文件),偶数层为介质层。
将 Gerber 文件分配到各层
S = stackUp;
S.Layer1.Thickness = 0.1e-3; % Air layer above board
S.Layer2 = 'interdigital_Capacitor.gtl'; % Top copper from Gerber
多层叠层
S = stackUp;
S.Layer1.Thickness = 0.1e-3; % Air
S.Layer2 = 'top_copper.gtl'; % Top copper
S.Layer3.Thickness = 0.2e-3; % Dielectric
S.Layer3.EpsilonR = 4.4;
S.Layer4 = 'inner_layer.g2'; % Inner copper
S.Layer5.Thickness = 1.0e-3; % Core dielectric
S.Layer5.EpsilonR = 4.4;
S.Layer6 = 'bottom_copper.gbl'; % Bottom copper
PCBReader — 完整板级导入
PCBReader 将包含 Gerber 文件的叠层封装为读取器对象,可将其转换为 pcbComponent。
基本工作流
S = stackUp;
S.Layer1.Thickness = 0.1e-3;
S.Layer2 = 'interdigital_Capacitor.gtl';
p = PCBReader('StackUp', S);
pcb = pcbComponent(p);
pcb.FeedDiameter = 0.001;
show(pcb);
导入后添加馈电点
转换为 pcbComponent 后,添加馈电位置以进行 EM 分析:
pcb = pcbComponent(p);
pcb.FeedDiameter = 1e-3;
pcb.FeedLocations = [-5e-3 0 1 3; % Port 1
5e-3 0 1 3]; % Port 2
sp = sparameters(pcb, linspace(1e9, 10e9, 51), 'SweepOption', 'interp');
rfplot(sp);
根据导入的几何结构确定馈电位置
馈电位置必须位于金属走线上。将 Gerber 导入结果转换为 pcbComponent 后,检查几何结构以找到有效的馈电点:
pcb = pcbComponent(p);
show(pcb); % Visual inspection — identify trace endpoints
layout(pcb); % Top-down layout view with dimensions
如需以编程方式放置馈电点,可提取导入层的网格顶点并计算边的中点:
m = mesh(pcb); % Get mesh structure for coordinate reference
如果无法确定馈电位置,请将馈电点放在主传输线走线可视端点处,并使其距走线边缘至少 FeedDiameter/2。
FeedLocations 列语义
FeedLocations = [x, y, col3, col4] — 第 3 列是信号层(馈电探针/球体出现的位置)。第 4 列是接地参考层。探针连接第 3 列和第 4 列所指定的层。如果交换两者,馈电球体会显示在错误的层上。
边缘馈电(带状线模型)
对于在板边缘馈电的结构(例如终止于 PCB 边界的微带线),请使用带状线馈电模型:
pcb.FeedViaModel = 'strip';
pcb.FeedDiameter = traceWidth / 2; % Must be half the trace width for edge feeds
'strip' 模型会在板边缘创建平面馈电,而非垂直过孔探针。请将馈电点放置在走线终止处的 BoardShape 精确边缘。
PCBReader 层结构
调用 pcbComponent(PCBReader) 后,Layers 元胞数组遵循标准的交替模式:{金属层,介电层,金属层,...}。金属层包含导入的 Gerber 形状。FeedLocations 的层索引遵循与手动组装的 pcbComponent 对象相同的奇数编号约定(1、3、5、...)。
将 PCBReader 转换为 pcbComponent
pcbComponent 构造函数可以直接接受 PCBReader 对象。
Cadence Allegro .brd 导入
当用户提到要导入或分析 .brd 文件时,请务必先询问其 Cadence extracta.exe 路径,再尝试导入。 必须先配置所需的 extracta 实用程序。不要假设它已完成设置。
% Step 1: Check if extracta is already configured
extractaSetup() % Displays current path, or [] if not set
% Step 2: If [], ask user for path and configure (persists across sessions)
extractaSetup('C:/Cadence/SPB_17.4/tools/bin/extracta.exe')
% Step 3: Import
pcb = pcbFileRead('design.brd');
extractaSetup(path) 接受 Cadence extracta.exe 可执行文件的完整路径。该路径会在 MATLAB 会话间保留——只需运行一次。若未配置此路径,.brd 导入会因 extracta 错误而失败。
不带参数调用 extractaSetup() 会显示当前配置的路径(如果尚未设置,则显示 [])。可用此方法检查是否已完成设置。
ODB++ 导入
pcb = pcbFileRead('design.zip'); % Zipped ODB++
pcb = pcbFileRead('odb_directory'); % Unzipped ODB++
电路板与封装检查
pcbFileRead 可打开 ODB++、Allegro 或原生 PCB 文件,以便进行分层检查——包括层、cadnet、电路组件、部件、引脚和形状。此功能对 PCB 板和 IC/SiP 封装的工作方式相同。
打开文件
pfile = pcbFileRead('ExampleBoard.odb');
返回的对象会公开以下属性:NumLayers、NumCadnets、NumPadStacks、NumComponents、NumParts、LayerHeight。
查询层叠结构
stackUp(pfile) 会返回一个表格,列出导入电路板中每一层的材料详情:
su = stackUp(pfile); % Full stackup table
su = stackUp(pfile, [2 3 4]); % Specific layers only
表格包含以下列:LayerNumber、LayerName、LayerType、Material、Thickness(inch)、EpsilonR、LossTangent、Conductivity(S/m)。
**注意:**这是 pcbFileRead 的对象函数,会返回表格——与 Gerber 导入中使用的 stackUp 构造函数无关(请参阅“易错点”部分)。
浏览层级结构
% List cadnets (electrical nets)
tbl = cadnetList(pfile); % Returns table with net names
% Open a specific cadnet and get its shapes
cnet = cadnet(pfile, "VDD_CORE");
data = cadnetData(cnet); % Struct with .Surfaces, .Pins, .Vias, .Traces
s = shapes(cnet); % Same struct as cadnetData (equivalent call)
% List and inspect components
tbl = componentList(pfile);
comp = component(pfile, "U1");
pins = componentPinData(comp); % Returns pinsData array (see below)
% List and inspect parts (component types)
tbl = partList(pfile);
p = part(pfile, "IC6ANT");
cdata = componentData(p); % Components that use this part type
% List padstacks
tbl = padStackList(pfile);
% Layer-level inspection (metal layers only — use pfile.MetalLayer for valid indices)
lyr = layer(pfile, pfile.MetalLayer(1));
ldata = layerData(lyr);
% Search for components in a cadnet
results = findComponents(cnet);
results = findComponents(cnet, 'ComponentType', 'IC');
形状数据结构
shapes(cnet) 和 cadnetData(cnet) 等效——两者都会返回包含以下字段的结构体:
| 字段 | 类型 | 内容 |
|---|---|---|
.Surfaces | antenna.Polygon 数组 | 铜箔覆铜区和填充区 |
.Pins | antenna.Polygon 数组 | 焊盘形状 |
.Vias | antenna.Polygon 数组 | 过孔桶形结构 |
.Traces | antenna.Polygon 数组 | 布线走线段 |
s = shapes(cnet);
s.Traces(1).Vertices % Vertices of first trace segment
numel(s.Surfaces) % Number of copper pours
layerData(lyr) 会返回相同格式的结构体。每个 antenna.Polygon 都有一个 .Vertices 属性(Nx3 double)。
componentPinData — 引脚位置和属性
componentPinData(comp) 返回一个 pinsData 数组。每个元素包含:
| 属性 | 类型 | 描述 |
|---|---|---|
Center | 1x2 double | 引脚中心的 XY 位置(板级单位) |
PinNumber | char/string | 引脚编号/名称 |
CadnetName | char/string | 引脚连接的网络 |
PinShape | char | 形状类型(例如,'Rect'、'Circle') |
StartLayer | double | 引脚跨越的第一层 |
StopLayer | double | 引脚跨越的最后一层 |
Length | double | 焊盘长度 |
Width | double | 焊盘宽度 |
Diameter | double | 焊盘直径(用于圆形焊盘) |
Vertices | Nx3 double | 完整的焊盘轮廓顶点 |
comp = component(pfile, "U1");
pins = componentPinData(comp);
pins(1).Center % [x, y] in board units (inches for ODB++)
pins(1).CadnetName % Which net this pin connects to
pins(1).PinNumber % Pin identifier
坐标单位: 对于 ODB++ 导入,引脚位置(.Center)和形状顶点使用电路板的原生单位,通常为英寸。在 pcbComponent 中使用时,请转换为米:乘以 25.4e-3。
跨网络追踪电路路径
使用 findComponents + componentPinData,通过共享组件跨网络跳转:
pwr_net = cadnet(pfile, "+PWR");
pwr_comps = findComponents(pwr_net); % Table: ComponentIndex, Refdes, PinList, ComponentType, Part
% Open a component and discover its other nets
q4 = component(pfile, string(pwr_comps.Refdes(9)));
q4_pins = componentPinData(q4);
for i = 1:numel(q4_pins)
fprintf('%s.%s -> %s at [%.3f, %.3f]\n', "Q4", ...
string(q4_pins(i).PinNumber), string(q4_pins(i).CadnetName), ...
q4_pins(i).Center(1), q4_pins(i).Center(2));
end
% Follow Q4's output net to find the next component
next_net = cadnet(pfile, string(q4_pins(1).CadnetName));
next_comps = findComponents(next_net);
在自定义设计中使用导入的形状
导入 Gerber 几何图形,并通过布尔运算与其他形状组合:
% Import a CSRR pattern from Gerber
reader = gerberRead('csrr_pattern.gbr');
shp = shapes(reader);
csrr = shp(1);
verts = csrr.Vertices;
cx = (max(verts(:,1)) + min(verts(:,1))) / 2;
cy = (max(verts(:,2)) + min(verts(:,2))) / 2;
csrr = translate(csrr, [-cx -cy 0]);
% Use as DGS or combine with other geometry
ground = traceRectangular(Length=30e-3, Width=20e-3);
groundWithSlots = ground - csrr;
pcb = pcbComponent;
signal = traceRectangular(Length=25e-3, Width=3e-3);
sub = dielectric("FR4");
sub.Thickness = 1.6e-3;
pcb.Layers = {signal, sub, groundWithSlots};
pcb.BoardShape = ground;
pcb.BoardThickness = sub.Thickness;
show(pcb);
导入到分析的工作流
%% Import
S = stackUp;
S.Layer1.Thickness = 0.1e-3;
S.Layer2 = 'myFilter.gtl';
p = PCBReader('StackUp', S);
pcb = pcbComponent(p);
%% Configure for analysis
pcb.FeedDiameter = 0.5e-3;
pcb.FeedLocations = [-10e-3 0 1 3; 10e-3 0 1 3];
pcb.Conductor = metal("Copper");
show(pcb);
%% Analyze
freq = linspace(1e9, 10e9, 51);
sp = sparameters(pcb, freq, 'SweepOption', 'interp');
rfplot(sp);
常见错误诊断
| 错误 | 原因 | 解决方法 |
|---|---|---|
| "File not found" | 路径错误或格式不受支持 | 验证路径;使用 fullfile() 创建跨平台路径 |
| "Unrecognized file format" | 文件扩展名与内容不匹配 | 显式指定格式:pcbFileRead(file, 'FileType', 'ODB++') |
| 导入后叠层不匹配 | 层数/材料与设计不同 | 对于 pcbFileRead 导入:调用 stackUp(pfile) 检查导入的层表。对于 Gerber 导入:确认你的 stackUp 构造函数与源设计匹配 |
导入 .brd 时出现 extracta 错误 | 未配置 Cadence Allegro extracta | 先运行 extractaSetup(),然后重试 |
cadnetList 结果为空 | 电路板没有布线网络,或格式版本错误 | 在原生 EDA 工具中打开电路板,验证是否存在布线 |
注意事项
-
坐标对齐:不同 CAD 工具生成的 Gerber 文件可能使用不同的原点。合并图层或添加馈线前,务必检查并将坐标平移到中心。
-
单位不匹配:Gerber 文件的单位可能是 mil 或 mm。RF PCB Toolbox 内部使用米。如果导入的几何图形看起来过大或过小,请检查源文件的单位设置。
-
gerberRead 返回的是 PCBReader,而不是形状:
gerberRead返回一个PCBReader对象。调用shapes(P)提取金属层多边形。不要尝试直接对该读取器使用P.Vertices或show(P)。 -
stackUp 构造函数中的图层顺序:
stackUp构造函数中的图层编号从顶部开始。Layer1通常是电路板上方的空气层,Layer2是顶层铜层。物理金属层的奇数编号映射到偶数stackUp图层(因为Layer1是空气层)。 -
layer()仅接受金属层索引。layer(pfile, idx)要求idx是金属层编号。使用pfile.MetalLayer获取有效索引。传入介质层索引(例如,层 1 是介质层时调用layer(pfile, 1))会报错:"Value must be a member of this set: ..." -
componentData属于part,而不是component。 若要获取使用某种零件类型的组件列表,请调用componentData(p),其中p = part(pfile, partName)。component对象具有componentPinData和shapes,但没有componentData。 -
stackUp名称冲突。S = stackUp(无参数)会创建一个用于定义 Gerber 导入图层结构的构造对象。su = stackUp(pfile)是pcbFileRead上的对象函数,会返回材料详情的表格。两者类型完全不同,用途也不同。请勿混淆。 -
大型导入几何图形:完整电路板的 Gerber 导入内容可能非常庞大。进行 EM 分析时,请仅提取感兴趣的区域,而不要分析整块电路板。
-
导入 .brd 文件前,务必先询问 extracta 路径。 用户提供
.brd文件时,先运行extractaSetup()(不带参数)检查是否已配置。如果返回[],请向用户询问其 Cadenceextracta.exe的路径,并运行extractaSetup(path)。典型路径:C:/Cadence/SPB_<version>/tools/bin/extracta.exe。未完成此操作,.brd文件导入会失败。 -
封装与电路板——工作流相同。 ODB++ 和 Allegro 文件可能包含 IC 封装,而不仅仅是 PCB。
pcbFileRead对两者的处理方式相同。内容由格式决定,而不是由函数名称决定。
相关技能
matlab-write-pcb-layout— 将设计导出为 Gerber 制造文件matlab-assemble-pcb-layout— 根据形状构建自定义 PCB 结构matlab-analyze-em— 对导入的电路板运行 EM 分析matlab-manage-pcb-material— 为导入的层叠结构设置基板matlab-analyze-pcb-pdn— 对导入的电路板进行 PDN 分析
版权所有 2026 The MathWorks, Inc.