关于 matlab-assemble-pcb-layout
面向 MATLAB 的技能,使用 `pcbComponent`、形状基元和馈电定义组装自定义多层 PCB 结构。适用于需要标准目录组件以外几何形状或馈电方式的 RF 布局。
主要功能
- 01自定义多层 PCB 堆叠
- 02形状基元与布尔运算
- 03馈电和过孔放置
- 04创建缺陷地结构图案
- 05三维与布局可视化
适用场景
- 01构建自定义带状线结构
- 02在接地层蚀刻图案
- 03为自定义 RF 几何添加端口
- 04为电磁分析准备布局
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-assemble-pcb-layout安装后在 Claude Code 中输入/matlab-assemble-pcb-layout确认已加载。
附带文件manifest.yamlreferences/shape-primitives.md
详细介绍
组装自定义 PCB 元件
适用场景
- 构建目录对象(如 microstripLine、coupledMicrostripLine 等)未涵盖的自定义 PCB 结构
- 构建多层堆叠,并在每一层上使用自定义金属形状
- 使用布尔运算(并集、差集、交集)组合基本形状
- 通过在接地平面上刻蚀图案来创建缺陷接地结构(DGS)
- 放置馈电端口、过孔,或使用高级 FeedDefinitions(同轴、边缘、间隙馈电)
- 组装带状线或屏蔽外壳结构
不适用场景
- 设计标准传输线——请使用
matlab-design-pcb-transmission-line - 从 Gerber、ODB++ 或 Allegro 导入布局——请使用
matlab-read-pcb-layout - 定义介质或金属材料——请使用
matlab-manage-pcb-material - 组装后运行 EM 分析——请使用
matlab-analyze-em - 级联或连接多个 pcbComponents——请使用
matlab-integrate-pcb-circuit
典型工作流
- 之前:
matlab-manage-pcb-material— 设置基板和导体 - 本技能: 使用 pcbComponent、形状和馈电构建自定义 PCB 结构
- 之后:
matlab-analyze-em— 验证 S 参数 →matlab-optimize-pcb-design— 调整尺寸 →matlab-write-pcb-layout— 导出 Gerber
快速参考
| 任务 | 代码 |
|---|---|
| 创建 pcbComponent | pcb = pcbComponent |
| 指定各层 | pcb.Layers = {signal, substrate, ground} |
| 设置板形状 | pcb.BoardShape = ground |
| 设置厚度 | pcb.BoardThickness = 1.6e-3 |
| 放置馈电点 | pcb.FeedLocations = [x1 y1 1 3; x2 y2 1 3] |
| 馈电直径 | pcb.FeedDiameter = W/2 |
| 设置导体 | pcb.Conductor = metal("Copper") |
| 添加过孔 | pcb.ViaLocations = [x y topLayer botLayer] |
| 可视化 | show(pcb) |
| 布局视图 | layout(pcb) |
| 布尔并集 | shape = s1 + s2 |
| 布尔差集 | shape = s1 - s2 |
| 布尔交集 | shape = s1 & s2 |
pcbComponent 结构
pcbComponent 是用于自定义 RF PCB 结构的通用容器。
最简 2 层微带线
pcb = pcbComponent;
substrate = dielectric("FR4");
substrate.Thickness = 1.6e-3;
signal = traceRectangular(Length=20e-3, Width=3e-3);
ground = traceRectangular(Length=30e-3, Width=20e-3);
pcb.Layers = {signal, substrate, ground};
pcb.BoardShape = ground;
pcb.BoardThickness = substrate.Thickness;
pcb.Conductor = metal("Copper");
pcb.FeedDiameter = 1.5e-3;
pcb.FeedLocations = [-10e-3 0 1 3; 10e-3 0 1 3];
show(pcb);
5 层带状线结构
pcb = pcbComponent;
sub = dielectric(Name="FR4", EpsilonR=4.4, LossTangent=0.02, Thickness=0.8e-3);
topGnd = traceRectangular(Length=40e-3, Width=20e-3);
signal = traceRectangular(Length=30e-3, Width=2e-3);
botGnd = traceRectangular(Length=40e-3, Width=20e-3);
pcb.BoardThickness = 2 * sub.Thickness; % Set BEFORE Layers
pcb.Layers = {topGnd, sub, signal, sub, botGnd};
pcb.BoardShape = topGnd;
pcb.Conductor = metal("Copper");
pcb.FeedLocations = [-15e-3 0 3 1; 15e-3 0 3 5];
pcb.FeedDiameter = 1e-3;
show(pcb);
关键属性
| 属性 | 格式 | 说明 |
|---|---|---|
Layers | 元胞数组 | 交替排列:金属形状、介质、金属形状…… |
BoardShape | 形状对象 | PCB 的外边界 |
BoardThickness | 标量(m) | 必须等于介质厚度之和 |
FeedLocations | N×4 矩阵 | 每个端口对应 [x, y, signalLayer, groundLayer] |
FeedDiameter | 标量(m) | 馈电过孔/探针的直径 |
ViaLocations | M×4 矩阵 | 每个过孔对应 [x, y, topLayer, bottomLayer] |
ViaDiameter | 标量(m) | 过孔桶径 |
FeedViaModel | 字符串 | 'strip'、'square'、'octagon'、'hexagon' |
Conductor | metal 对象 | 所有金属层的导体 |
SolverType | 字符串 | 'MoM' 或 'FEM' |
基本形状
矩形走线
rect = traceRectangular(Length=20e-3, Width=5e-3, Center=[0 0]);
折线走线(含多个线段和弯折)
tl = traceLine;
tl.Length = [10 5*sqrt(2) 10]*1e-3;
tl.Angle = [0 45 0];
tl.Width = 3e-3;
tl.Corner = 1; % 1 = Miter, 2 = Smooth (default: Sharp)
show(tl);
由点定义的走线
tp = tracePoint;
tp.TracePoints = [0 0; 10e-3 0; 15e-3 5e-3; 25e-3 5e-3];
tp.Width = 2e-3;
tp.Corner = 2; % 2 = Smooth
螺旋走线
sp = traceSpiral;
sp.NumTurns = 3;
sp.InnerDiameter = 4e-3;
sp.Spacing = 0.5e-3;
sp.TraceWidth = 0.5e-3;
show(sp);
渐变走线
tt = traceTapered;
tt.Length = 10e-3;
tt.InputWidth = 1e-3;
tt.OutputWidth = 3e-3;
弯折
弯折的 Width 是一个 2 元素向量 [w1 w2],分别表示两条臂的宽度:
bc = bendCurved;
bc.Width = [2e-3 2e-3];
bc.CurveRadius = 5e-3;
bm = bendMitered;
bm.Width = [2e-3 2e-3];
br = bendRightAngle;
br.Width = [2e-3 2e-3];
U 形弯折
U 形弯折的 Width 是一个 3 元素向量 [arm1 bottom arm2]:
uc = ubendCurved;
uc.Width = [2e-3 2e-3 2e-3];
uc.CurveRadius = 3e-3;
um = ubendMitered;
um.Width = [2e-3 2e-3 2e-3];
其他形状
d = delta;
d.OuterRadius = 5e-3; % Triangle/delta
db = dumbbell;
db.SideLength = 6e-3; % Head size (square Type, default)
db.ArmLength = 10e-3;
db.ArmWidth = 0.5e-3; % Dumbbell (for DGS)
% Note: Type='Square' uses SideLength; Type='Circle' uses Diameter
rt = racetrack;
rt.Length = 15e-3;
rt.Width = 5e-3; % Racetrack
rd = radial;
rd.OuterRadius = 5e-3;
rd.Angle = 60; % Radial sector
ar = ringAnnular;
ar.InnerRadius = 1e-3;
ar.Width = 4e-3; % Annular ring (InnerRadius must be > 0)
sr = splitRing;
sr.RingDiameter = 10e-3;
sr.TraceWidth = 0.5e-3;
sr.SplitGap = 0.5e-3; % Split ring resonator
布尔运算
使用运算符组合形状,以构建复杂几何结构。
并集(+)
left = traceRectangular(Length=10e-3, Width=5e-3, Center=[-5e-3 0]);
right = traceRectangular(Length=10e-3, Width=5e-3, Center=[5e-3 0]);
combined = left + right;
show(combined);
差集(-)
创建槽、间隙或刻蚀图案:
base = traceRectangular(Length=20e-3, Width=10e-3);
slot = traceRectangular(Length=15e-3, Width=1e-3);
slotted = base - slot;
show(slotted);
交集(&)
ring = ringAnnular;
ring.InnerRadius = 1e-3;
ring.Width = 9e-3;
rect = traceRectangular(Length=15e-3, Width=15e-3);
clipped = ring & rect;
复杂示例:U-CSRR 滤波器
% Create feeding microstrip
ZA = traceRectangular(Length=4e-3, Width=4e-3, Center=[-7e-3 0]);
Cell = traceRectangular(Length=5e-3, Width=5e-3, Center=[-2.5e-3 0]);
LeftSection = ZA + Cell;
% Create slots using traceLine
s1 = traceLine(StartPoint=[-2.5e-3-0.1e-3, -1.9e-3], ...
Angle=[-180 -270 0], Length=[1.75e-3 3.8e-3 1.75e-3], Width=0.2e-3);
s2 = traceLine(StartPoint=[-2.5e-3+0.1e-3, -1.9e-3], ...
Angle=[0 90 180], Length=[1.75e-3 3.8e-3 1.75e-3], Width=0.2e-3);
% Subtract slots from base
LeftSection = LeftSection - s1 - s2;
% Mirror for right section
RightSection = copy(LeftSection);
RightSection = mirrorY(RightSection);
% Complete filter
filter = LeftSection + RightSection;
show(filter);
馈电点放置
FeedLocations 格式
每行:[x, y, signalLayerIndex, groundLayerIndex]
Layers元胞数组中金属层的索引为奇数(1、3、5……)- 第 1 层 = 第一层金属(顶层),第 3 层 = 第二层金属,依此类推。
% 2-port microstrip (signal on layer 1, ground on layer 3)
pcb.FeedLocations = [-10e-3 0 1 3; % Port 1: left edge
10e-3 0 1 3]; % Port 2: right edge
4 端口耦合走线
pcb.FeedLocations = [0 0 1 3; % Port 1
40e-3 0 1 3; % Port 2
40e-3 -5e-3 1 3; % Port 3
0 -5e-3 1 3]; % Port 4
馈电直径
pcb.FeedDiameter = traceWidth / 2; % Must fit within the trace
内部端口(用于集总元件)
为集总元件的内部连接定义额外的馈电位置(有关带有 PortNumber/PortValue 的 pcbElement,请参阅 matlab-integrate-pcb-circuit 技能)。
DGS — 缺陷地结构
使用 dgs 方法在接地平面上蚀刻图案:
ms = microstripLine;
ms.Length = 20e-3;
ms.Width = 3e-3;
% Create a dumbbell DGS under the trace
dgsShape = dumbbell;
dgsShape.SideLength = 4e-3; % Head size (default Type='Square')
dgsShape.ArmLength = 8e-3;
dgsShape.ArmWidth = 0.5e-3;
ms = dgs(ms, {dgsShape}); % Must capture return value — does not modify in place
show(ms);
memoryEstimate(ms, 10e9, 'RetainMesh', true); % Check mesh before solving
sp = sparameters(ms, linspace(1e9, 10e9, 51), 'SweepOption', 'interp');
rfplot(sp);
DGS 可增加带阻特性,并提升耦合器的方向性或滤波器的抑制效果。
屏蔽外壳
为屏蔽分析添加导电盖板:
pcb = pcbComponent;
% ... set up layers ...
pcb.IsShielded = true; % Adds PEC enclosure walls and lid
show(pcb);
对于外壳内滤波器问题,屏蔽会影响谐振频率和耦合。
形状操作
shape = translate(shape, [dx, dy, 0]); % Translate
shape = rotateZ(shape, angle); % Rotate about z-axis (degrees)
shape = rotateX(shape, angle); % Rotate about x-axis
shape = mirrorX(shape); % Mirror about x-axis
shape = mirrorY(shape); % Mirror about y-axis
shapeCopy = copy(shape); % Deep copy
shape = scale(shape, factor); % Uniform scaling
a = area(shape); % Shape area (m²)
对于目录对象,使用 shapes() 按层提取形状:
s = shapes(obj); % Struct of shapes by layer name
boardArea = area(s.GroundPlane);
对于 pcbComponent,形状位于 Layers 和 BoardShape 中:
boardArea = area(pcb.BoardShape);
查找可用方法
使用 methods(obj) 列出任意对象的所有可用操作:
methods(pcb) % List all pcbComponent methods
methods(traceRectangular) % List all shape methods
可视化
show(pcb); % 3-D structure view
layout(pcb); % Top-down layout with feeds and vias
mesh(pcb); % Mesh visualization
info(pcb); % Print structure summary
高级馈电设置(FeedDefinitions API)
默认情况下,pcbComponent 使用 FeedLocations(XY 坐标 + 层)设置简单的探针馈电。对于高级馈电类型——同轴、边缘、差分间隙、有限间隙——请切换到 FeedDefinitions API:
pcb = pcbComponent;
pcb.FeedFormat = 'FeedDefinitions'; % Enable FeedDefinitions mode
馈电类型
| 馈电类型 | 使用场景 | 关键属性 |
|---|---|---|
ProbeFeed | 垂直通孔探针(贴片天线) | SignalLocations、SignalLayers、GroundLayers、ViaDiameter、ViaModel |
CoaxialFeed | 带有明确焊盘/反焊盘几何形状的探针 | PadShape、AntipadShape、SignalLayers、GroundLayers |
EdgeFeed | 带状线式边缘激励 | SignalLocations、SignalLayers、GroundLayers、SignalWidths |
DeltaGapFeed | 带有电流方向的内部端口 | SignalLocations、SignalLayers、SignalWidths、CurrentDirection |
FiniteGapFeed | 内部间隙端口(信号 + 接地) | SignalLocations、GroundLocations、SignalLayers、SignalWidths |
ArbitraryFiniteGapFeed | 完全可控的共面端口 | SignalLocations、GroundLocations、SignalWidths、GroundWidths、SignalLayers、GroundLayers |
ProbeFeed(最常见)
f = ProbeFeed('SignalLocations', [-0.0187, 0], ...
'SignalLayers', 1, 'GroundLayers', 3, ...
'ViaDiameter', 1e-3, 'ViaModel', 'square');
pcb.FeedDefinitions = f;
EdgeFeed(带状线结构)
对于信号位于第 3 层、接地位于第 1 层和第 5 层的 5 层带状线结构:
f1 = EdgeFeed('SignalLocations', feed1_xy, 'SignalLayers', 3, ...
'GroundLayers', [1; 5], 'SignalWidths', trace_width);
f2 = EdgeFeed('SignalLocations', feed2_xy, 'SignalLayers', 3, ...
'GroundLayers', [1; 5], 'SignalWidths', trace_width);
pcb.FeedDefinitions = [f1, f2];
CoaxialFeed(自定义焊盘/反焊盘几何形状)
pad = antenna.Circle('Radius', 0.5e-3);
antipad = antenna.Circle('Radius', 1e-3);
f = CoaxialFeed('PadShape', pad, 'AntipadShape', antipad, ...
'SignalLayers', 1, 'GroundLayers', 3);
pcb.FeedDefinitions = f;
DeltaGapFeed(内部端口)
f = DeltaGapFeed('SignalLocations', [x, y], 'SignalLayers', 1, ...
'SignalWidths', 0.5e-3, 'CurrentDirection', [0, 1]);
pcb.FeedDefinitions(end+1) = f; % Append to existing feeds
多个馈电
通过拼接或追加来构建馈电阵列:
pcb.FeedDefinitions = [f1, f2]; % Row array at once
pcb.FeedDefinitions(end+1) = f3; % Append incrementally
形状基元参考
有关所有形状基元(走线、弯折、曲线、环形及特殊形状)的完整目录、属性和常见操作,请参阅 references/shape-primitives.md。
注意事项
-
馈电点位于金属之外:馈电圆(
FeedDiameter)必须完全位于馈电位置的金属走线内。距离任何走线边缘至少留出FeedDiameter/2的间距,否则会导致求解器报错。 -
BoardThickness 不匹配——设置 Layers 前先设置:
BoardThickness必须与Layers中所有介质层的厚度总和完全相等。Layerssetter 会根据当前BoardThickness进行验证,因此,当总厚度与默认值(1.6 mm)不同时,请先设置BoardThickness,再设置Layers。若先设置Layers,且总厚度不是默认值,则会报错。 -
层索引:在
Layers单元格数组中,金属层的索引为奇数(1、3、5……),介质层的索引为偶数(2、4……)。FeedLocations仅引用金属层索引。 -
布尔运算顺序:减法与运算顺序有关(
A - B ≠ B - A)。第一个操作数定义基体,第二个操作数会从基体中移除。 -
并集操作中的形状重叠:形状必须重叠或接触,
+才能生成连通几何体。不相连的形状会生成多体结构,可能导致求解器无法正常处理。 -
带状线的 FeedViaModel:对于 5 层(带状线)结构,请设置
FeedViaModel,以控制连接内部信号层与外部端口参考的馈电过孔形状。 -
Corner 属性的值为整数:请使用整数设置
Corner:1 = Miter,2 = Smooth(默认值为 Sharp)。使用"Miter"等字符串值会导致报错。 -
DGS:捕获返回值并使用单元格数组:
dgs不会原地修改对象,必须捕获输出:ms = dgs(ms, {dgsShape})。此外,请使用单元格数组传入形状,而不是直接传入形状:使用{dgsShape},不要使用dgsShape。 -
IsShielded 会自动切换到 FEM:将
pcb.IsShielded = true会自动把SolverType改为'FEM'。这是预期行为,但会显著增加求解时间。 -
绕 z 轴旋转请使用 rotateZ,而不是 rotate:
rotate(shape, angle)需要 4 个参数(角度和定义旋转轴的两个 3D 点)。进行简单的 z 轴旋转时,请使用rotateZ(shape, angle)。绕其他轴旋转时,同样请分别使用rotateX和rotateY。 -
**FeedFormat 具有排他性。**设置
FeedFormat = 'FeedDefinitions'会禁用FeedLocations。不能混用这两种模式,必须二选一。 -
**多接地层的 GroundLayers 使用列向量。**对于两侧均有接地层的带状线结构,请将
GroundLayers设为列向量:[1; 5],而不是[1, 5]。 -
Layers 中的每个介质层都必须是单层对象:不要将多层
dielectric(即Thickness/EpsilonR为向量的对象)作为单个条目放入Layers单元格数组。每个介质层都必须是独立的dielectric对象,且属性值为标量。对于 5 层叠层:pcb.Layers = {metal1, diel1, metal2, diel2, metal3},其中每个diel的Thickness都是标量。
相关技能
matlab-manage-pcb-material— 定义层的介质和金属matlab-analyze-em— 分析组装后的结构matlab-design-pcb-filter— 使用自定义 pcbComponent 几何体设计滤波器matlab-integrate-pcb-circuit— 将多个 pcbComponent 连接起来
Copyright 2026 The MathWorks, Inc.