mcpField
M
matlab-read-pcb-layout

matlab-read-pcb-layout

github.com/matlab其他1.2k76 次安装1 天前更新
代码仓库

关于 matlab-read-pcb-layout

这项 MATLAB 技能用于导入和检查 Gerber、ODB++ 与 Cadence Allegro 格式的 PCB 及 IC/SiP 封装布局。它涵盖几何图形和层级数据的提取,并将导入设计用于后续分析。

主要功能

  1. 01导入 Gerber、ODB++ 和 Allegro
  2. 02检查层与叠层结构
  3. 03查询网络、元件和引脚
  4. 04提取并显示多边形
  5. 05转换为 pcbComponent

适用场景

  1. 01检查电路板或封装的层与网络
  2. 02提取 Gerber 金属图形用于自定义设计
  3. 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

典型工作流

  1. **本技能:**从 Gerber、ODB++ 或 Allegro 导入 PCB 布局
  2. 之后: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)
转换为 pcbComponentpcb = pcbComponent(p)
导入 ODB++pfile = pcbFileRead('design.zip')
导入 Allegro .brdpfile = pcbFileRead('design.brd')
列出 cadnettbl = cadnetList(pfile)
打开 cadnetcnet = 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) 等效——两者都会返回包含以下字段的结构体:

字段类型内容
.Surfacesantenna.Polygon 数组铜箔覆铜区和填充区
.Pinsantenna.Polygon 数组焊盘形状
.Viasantenna.Polygon 数组过孔桶形结构
.Tracesantenna.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 数组。每个元素包含:

属性类型描述
Center1x2 double引脚中心的 XY 位置(板级单位)
PinNumberchar/string引脚编号/名称
CadnetNamechar/string引脚连接的网络
PinShapechar形状类型(例如,'Rect'、'Circle')
StartLayerdouble引脚跨越的第一层
StopLayerdouble引脚跨越的最后一层
Lengthdouble焊盘长度
Widthdouble焊盘宽度
Diameterdouble焊盘直径(用于圆形焊盘)
VerticesNx3 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 工具中打开电路板,验证是否存在布线

注意事项

  1. 坐标对齐:不同 CAD 工具生成的 Gerber 文件可能使用不同的原点。合并图层或添加馈线前,务必检查并将坐标平移到中心。

  2. 单位不匹配:Gerber 文件的单位可能是 mil 或 mm。RF PCB Toolbox 内部使用米。如果导入的几何图形看起来过大或过小,请检查源文件的单位设置。

  3. gerberRead 返回的是 PCBReader,而不是形状:gerberRead 返回一个 PCBReader 对象。调用 shapes(P) 提取金属层多边形。不要尝试直接对该读取器使用 P.Vertices 或 show(P)。

  4. stackUp 构造函数中的图层顺序:stackUp 构造函数中的图层编号从顶部开始。Layer1 通常是电路板上方的空气层,Layer2 是顶层铜层。物理金属层的奇数编号映射到偶数 stackUp 图层(因为 Layer1 是空气层)。

  5. layer() 仅接受金属层索引。 layer(pfile, idx) 要求 idx 是金属层编号。使用 pfile.MetalLayer 获取有效索引。传入介质层索引(例如,层 1 是介质层时调用 layer(pfile, 1))会报错:"Value must be a member of this set: ..."

  6. componentData 属于 part,而不是 component。 若要获取使用某种零件类型的组件列表,请调用 componentData(p),其中 p = part(pfile, partName)。component 对象具有 componentPinData 和 shapes,但没有 componentData。

  7. stackUp 名称冲突。 S = stackUp(无参数)会创建一个用于定义 Gerber 导入图层结构的构造对象。su = stackUp(pfile) 是 pcbFileRead 上的对象函数,会返回材料详情的表格。两者类型完全不同,用途也不同。请勿混淆。

  8. 大型导入几何图形:完整电路板的 Gerber 导入内容可能非常庞大。进行 EM 分析时,请仅提取感兴趣的区域,而不要分析整块电路板。

  9. 导入 .brd 文件前,务必先询问 extracta 路径。 用户提供 .brd 文件时,先运行 extractaSetup()(不带参数)检查是否已配置。如果返回 [],请向用户询问其 Cadence extracta.exe 的路径,并运行 extractaSetup(path)。典型路径:C:/Cadence/SPB_<version>/tools/bin/extracta.exe。未完成此操作,.brd 文件导入会失败。

  10. 封装与电路板——工作流相同。 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.

评论

支持 Markdown