mcpField
M
matlab-model-via

matlab-model-via

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

关于 matlab-model-via

matlab-model-via 是用于在多层 PCB 叠层中建模信号过孔的 MATLAB 技能,涵盖焊盘、反焊盘和接地回流过孔配置,并介绍可视化及信号完整性分析。

主要功能

  1. 01配置过孔层与叠层
  2. 02设置焊盘和反焊盘几何形状
  3. 03放置接地回流过孔
  4. 04可视化过孔模型
  5. 05分析 S 参数与谐振

适用场景

  1. 01建模跨 PCB 多层的信号过孔
  2. 02调整各层的间隙尺寸
  3. 03检查目标频率下的接地回流间距
  4. 04通过频率扫描识别过孔桶谐振

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-model-via

安装后在 Claude Code 中输入/matlab-model-via确认已加载。

附带文件manifest.yaml

详细介绍

建模过孔

适用场景

  • 对穿过多层 PCB 叠层的信号过孔进行建模(viaSingleEnded)
  • 按层配置焊盘和反焊盘几何形状
  • 放置接地回流过孔以保证信号完整性
  • 分析过孔 S 参数并识别孔壁谐振
  • 使用 criticalwavelength 和 gapratedistance 评估 GRV 放置情况

不适用场景

  • 设计传输线或进行阻抗控制——使用 matlab-design-pcb-transmission-line
  • 使用形状构建自定义 PCB 结构——使用 matlab-assemble-pcb-layout
  • 设置基板或导体材料——使用 matlab-manage-pcb-material
  • 对非过孔结构运行全波 EM 分析——使用 matlab-analyze-em
  • 对导入的电路板进行 PDN 分析——使用 matlab-analyze-pcb-pdn

典型工作流

  1. 之前: matlab-manage-pcb-material——为叠层设置基板和导体
  2. 此技能: 对过孔建模、放置 GRV、检查信号完整性
  3. 之后: matlab-integrate-pcb-circuit——将过孔模型与走线/连接器模型级联 → matlab-optimize-pcb-design——优化 GRV 放置或焊盘几何形状

快速参考

任务代码
创建过孔via = viaSingleEnded
设置信号层via.SignalLayer = [1 5]
设置接地层via.GroundLayer = [3 7 9]
设置基板via.Substrate = dielectric(...)
放置信号过孔via.SignalViaLocations = [x y startLayer stopLayer]
放置接地回流过孔via.GroundReturnViaLocations = [x y start stop; ...]
定义端口via.SignalTable = {viaNum layer traceWidth direction; ...}
查看焊盘padsTable(via)
查看反焊盘antipadsTable(via)
自定义焊盘pads = getpads(via); pads{k}.Radius = r; via.SignalViaPad = pads
自定义反焊盘ap = getantipads(via); ap{k}.Radius = r; via.SignalViaAntipad = ap
可视化show(via)
S 参数sp = sparameters(via, freq)
谐振风险检查cw = criticalwavelength(via, freq)
最大 GRV 距离gapratedistance(via, freq)

viaSingleEnded 对象

viaSingleEnded 对象可对穿过多层 PCB 叠层的信号过孔进行建模,并支持配置焊盘、反焊盘和接地回流过孔。

基本设置
via = viaSingleEnded;
via.SignalLayer = [1 5];
via.GroundLayer = [3 7 9];
via.Substrate = dielectric("Name","FR4","EpsilonR",4.8,...
    "LossTangent",0.026,"Thickness",1.27e-4,"Frequency",1e8);
via.Conductor = metal("Copper");
show(via);
关键属性
属性格式说明
SignalLayer向量信号走线连接的层索引(奇数)
GroundLayer向量接地/回流平面的层索引
Substratedielectric层间介质
Conductormetal过孔孔壁和焊盘导体
SignalViaLocationsN×4 矩阵每个过孔的 [x, y, startLayer, stopLayer]
SignalViaDiameter标量(m)过孔孔壁直径
SignalViaFinishedDiameter标量(m)成品孔径(电镀后)
SignalViaPad形状或单元格信号过孔上的焊盘形状
SignalViaAntipad形状或单元格反焊盘(间隙)形状
RemoveUnusedPads逻辑值移除非信号层上的焊盘(默认值:true)
GroundReturnViaLocationsM×4 矩阵每个 GRV 的 [x, y, startLayer, stopLayer]
GroundReturnViaDiameter标量或向量GRV 孔壁直径
GroundReturnViaFinishedDiameter标量或向量GRV 成品孔径
SignalTable单元格数组端口定义:{viaNum, layer, traceWidth, direction}

信号过孔配置

放置信号过孔
via = viaSingleEnded;
via.SignalLayer = [1 5];
via.GroundLayer = [3 7 9];

X = 0; Y = 0;
startLayer = 1;
stopLayer = 7;
via.SignalViaLocations = [X Y startLayer stopLayer];

过孔孔壁从 startLayer 延伸至 stopLayer。位于此范围内且列在 SignalLayer 中的层会建立信号连接。

过孔直径
via.SignalViaDiameter = 0.25e-3;          % Drill diameter
via.SignalViaFinishedDiameter = 0.20e-3;  % After copper plating
单位换算辅助函数

此对象提供内置的 mil 转米换算功能:

via.SignalViaDiameter = 10 * via.mils2meters;   % 10 mils

端口定义(SignalTable)

SignalTable 属性用于定义哪些层将成为 S 参数提取的端口。

格式

每行:{signalViaNumber, layerIndex, traceWidth, direction}

  • signalViaNumber:信号过孔编号(在 SignalViaLocations 中的 1 起始索引)
  • layerIndex:放置端口的层
  • traceWidth:连接走线的宽度(米)
  • direction:角度(度,0 = +x 方向,90 = +y 方向,依此类推)
示例:双端口过孔
via.SignalTable = {1, 1, 3e-4, 45;   % Port 1: via 1, layer 1, 0.3mm trace, 45 deg
                   1, 5, 3e-4, 0};    % Port 2: via 1, layer 5, 0.3mm trace, 0 deg
使用表格语法以提高清晰度
vPorts = table('Size', [2 4], ...
    'VariableTypes', ["cell","cell","cell","cell"], ...
    'VariableNames', ["Signal Via Num","Layer","Trace Width","Direction"]);
vPorts(1,:) = {{1} {1} {3e-4} {45}};
vPorts(2,:) = {{1} {5} {3e-4} {0}};
via.SignalTable = vPorts.Variables;

接地回流过孔

接地回流过孔在信号过孔附近提供低阻抗回流路径,这对信号完整性至关重要。

放置
via.GroundReturnViaLocations = [
    1.0015  2.001  1  9;
    1.0015  1.999  1  9;
    0.999   1.999  1  9;
    1.000   2.0015 1  9;
    0.999   2.001  1  9;
    1.0001  1.9987 1  9];

每行:[x, y, startLayer, stopLayer]。接地回流过孔通常从最顶层接地层延伸至最底层接地层。

GRV 直径
via.GroundReturnViaDiameter = 0.25e-3;
via.GroundReturnViaFinishedDiameter = 0.20e-3;

直径可以是标量(所有 GRV 使用相同直径)或向量(每个 GRV 一个直径)。

焊盘和反焊盘自定义

查看焊盘/反焊盘表
padsTable(via)       % Rows = signal vias, Columns = conductive layers; cells are pad shape objects (e.g. antenna.Circle) or []. Scalar SignalViaPad is expanded across all positions.
antipadsTable(via)            % Signal via antipads: rows = signal vias, columns = connected layers
antipadsTable(via, "ground")  % Ground return via antipads: rows = GRVs, columns = power planes
默认焊盘形状

默认情况下,SignalViaPad 是圆形:

via.SignalViaPad.Radius = 3e-4;    % Set pad radius
按层自定义焊盘

使用 getpads 获取焊盘形状的元胞数组(每层一个),修改单个条目,然后重新赋值:

pad_temp = getpads(via);
pad_temp{3}.Radius = 4.5e-4;   % Customize pad on the 3rd layer
via.SignalViaPad = pad_temp;
反焊盘自定义
via.SignalViaAntipad.Radius = 5e-4;   % Clearance radius on ground layers

% Per-layer antipad customization (cell array: SignalViaLocations × GroundLayer)
antipad_temp = getantipads(via);
antipad_temp{1,2}.Radius = 6e-4;   % Customize antipad on 2nd ground layer
via.SignalViaAntipad = antipad_temp;
RemoveUnusedPads

当 RemoveUnusedPads = true(默认值)时,只会在 SignalLayer 中的层上放置焊盘。将其设为 false,即可在过孔经过的所有层上放置焊盘:

via.RemoveUnusedPads = false;
padsTable(via)   % Now shows pads on all layers

过孔阵列

用于对多个信号过孔建模(例如,BGA 扇出或总线布线):

基于网格的过孔阵列
obj = viaSingleEnded;
obj.SignalLayer = [1 3];
obj.GroundLayer = [1 3];   % Mixed signal/ground layers
obj.Conductor = metal('Name','Copper','Thickness',3*obj.mils2meters,'Conductivity',10e9);
obj.Substrate = dielectric('EpsilonR',3.7,'LossTangent',0.03,'Thickness',12*obj.mils2meters);
obj.SignalViaDiameter = 10 * obj.mils2meters;
obj.SignalViaPad.Radius = 1.00001 * obj.SignalViaDiameter/2;
obj.SignalViaAntipad.Radius = 15 * obj.mils2meters;

% Create grid of all via positions
[X,Y] = meshgrid(1:8, 1:8);
allXYs = [X(:) Y(:)];

% Signal via subset
[X,Y] = meshgrid([1 3 5 8], [1 2 4 6 8]);
SVXYs = [X(:) Y(:)];

% Ground via locations = everything else
GRVXYs = setdiff(allXYs, SVXYs, 'rows');
分配多个信号过孔
startLayer = 1; stopLayer = 3;
obj.SignalViaLocations = [SVXYs, repmat([startLayer stopLayer], size(SVXYs,1), 1)];
obj.GroundReturnViaLocations = [GRVXYs, repmat([startLayer stopLayer], size(GRVXYs,1), 1)];
开路信号过孔(无端口)

若要对未分配端口的信号过孔(开路)建模,请将 SignalTable 留空,或仅将端口分配给特定过孔:

% Only port via #1 on layers 1 and 3
obj.SignalTable = {1, 1, 5*obj.mils2meters, 0;
                   1, 3, 5*obj.mils2meters, 0};

其余信号过孔将保持为开路(无端口)支节,适用于研究密集过孔区域中的耦合。

多层叠层

层编号约定

金属层和介电层交替排列,并按顺序编号:

Layer 1:  Metal (signal or ground)
Layer 2:  Dielectric
Layer 3:  Metal (signal or ground)
Layer 4:  Dielectric
Layer 5:  Metal (signal or ground)
...

只有奇数编号的层是金属层。SignalLayer 和 GroundLayer 使用这些奇数索引。

示例:10 层电路板
via = viaSingleEnded;
via.SignalLayer = [1 7];         % Signal on layers 1 and 7
via.GroundLayer = [3 5 9];      % Ground on layers 3, 5, and 9
via.Substrate = dielectric("Name","FR4","EpsilonR",4.4,...
    "LossTangent",0.02,"Thickness",0.1e-3);

基板 Thickness 是每个介电层的厚度(均匀)。对于不均匀叠层,请使用多元素介电材料。

分析

S 参数
freq = linspace(1e9, 20e9, 51);
sp = sparameters(via, freq, 'Behavioral', true);
rfplot(sp);

% Verify insertion loss meets threshold across band
S21_dB = 20*log10(abs(squeeze(sp.Parameters(2,1,:))));
idx = find(S21_dB <= -1, 1);
if isempty(idx), fprintf('PASS: IL < 1 dB across band\n');
else, fprintf('FAIL: IL exceeds 1 dB at %.1f GHz\n', sp.Frequencies(idx)/1e9); end
TDR(时域反射测量)

使用 Signal Integrity Toolbox 中的 tdr 函数。参数经验法则:RiseTime = 1/fmax、SampleTime = 1/(100*fmax)、EndTime = 0.1e-9,其中 fmax 是 S 参数扫描的最高频率:

fmax = 20e9;
tdrObj = tdr(sp, RiseTime=1/fmax, SampleTime=1/(100*fmax), EndTime=0.1e-9);
plot(tdrObj)
SI 分析函数

有两个函数可用于评估接地回流过孔与信号过孔的距离在目标频率下是否足够近:

函数语法返回值
criticalwavelengthcw = criticalwavelength(via, freq)在 freq 下,信号过孔与最近接地回流过孔之间的波长数。数值接近 0.25 或 0.5 时表示存在谐振风险。
gapratedistancegapratedistance(via, freq)在默认临界波长阈值为 0.25 时,信号过孔与最近接地回流过孔之间允许的最大中心距。
% Check resonance risk at 28 GHz
cw = criticalwavelength(via, 28e9);

% Plot max allowable GRV distance vs frequency
freq = linspace(1e9, 56e9, 200);
gapratedistance(via, freq);

% Stricter threshold (0.125 instead of default 0.25)
gapratedistance(via, freq, 0.125);

使用 criticalwavelength 对特定关注频率进行抽查。使用 gapratedistance 生成曲线,显示在某个频率范围内 GRV 必须放置得多近。两者都要求至少定义一个接地回流过孔。

注意事项: criticalwavelength(via) 需要频率参数。省略该参数会报错。

通过谐振识别

过孔桶谐振会在宽带扫描的 S21(插入损耗)中表现为尖锐的凹陷。查找方法如下:

  1. 扫描范围要远超信号带宽(至少为奈奎斯特频率的 2-3 倍)。
  2. 使用精细的频率分辨率(300-500 个点),避免遗漏狭窄的凹陷。
  3. 绘制 S21 并查找陷波;其频率对应由接地平面限定的过孔桶谐振模式。
% Wideband sweep to identify resonances
via = viaSingleEnded;
freq = linspace(1e9, 50e9, 500);
s = sparameters(via, freq);

% Insertion loss — dips indicate barrel resonances
figure;
rfplot(s, 2, 1);
title('Via Insertion Loss — Check for Resonance Dips');

% Return loss — peaks correspond to the same resonances
figure;
rfplot(s, 1, 1);
title('Via Return Loss');

将接地回流过孔移近信号过孔,可将谐振推至更高频率。使用凹陷频率处的 criticalwavelength 确认其机制,并使用 gapratedistance 确定 GRV 必须靠得多近,才能使谐振高于关注频段。

可视化
show(via);          % 3-D view with pads, antipads, and vias
layout(via);        % Top-down layout view

注意:viaSingleEnded 使用行为级(电路)模型,而非全波 MoM 网格。此对象不支持 mesh、memoryEstimate 和 getZ0 等函数。要提取特性阻抗,请在求解后根据 S 参数或 ABCD 参数进行计算。

高速过孔设计(40+ Gbps)

对于高速信号,接地回流过孔(GRV)的布局对控制回流路径电感和串扰至关重要。

GRV 布局策略

扫描不同的 GRV 配置,找出满足插入损耗目标所需的最少接地过孔数量:

via = viaSingleEnded;
via.Substrate = dielectric('Name', {'FR4','FR4','FR4','FR4'}, ...
    'EpsilonR', [4.4, 4.4, 4.4, 4.4], ...
    'LossTangent', [0.02, 0.02, 0.02, 0.02], ...
    'Thickness', [0.5e-3, 0.5e-3, 0.5e-3, 0.5e-3], ...
    'Frequency', [1e9, 1e9, 1e9, 1e9], ...
    'FrequencyModel', {'DjordjevicSarkar','DjordjevicSarkar','DjordjevicSarkar','DjordjevicSarkar'});

% Parametric GRV placement — compare 1, 2, 4, 8 ground vias
for nGRV = [1, 2, 4, 8]
    via.GroundReturnViaLocations = generateGRVPositions(nGRV, pitch);
    S = sparameters(via, freq, 50);
    rfplot(S);
    hold on;
end
差分过孔对

没有 viaDifferential 类——使用 viaSingleEnded 和 SignalViaLocations 中的两个条目对差分过孔对进行建模。对于 40 Gbps 差分对,可通过控制过孔间距和 GRV 围栏布局来管理串扰:

via = viaSingleEnded;
via.SignalViaLocations = [0, -pitch/2; 0, pitch/2];   % Differential pair
via.GroundReturnViaLocations = [                        % GRV fence
    -pitch, -pitch; -pitch, 0; -pitch, pitch;
     pitch, -pitch;  pitch, 0;  pitch, pitch];

接口标准的频率范围指南

分析特定接口的过孔时,S 参数扫描范围至少应达到奈奎斯特频率。检查谐振时,扫描范围应达到奈奎斯特频率的 2-3 倍。

接口标准数据速率奈奎斯特频率建议的扫描范围
PCIe Gen38 GT/s4 GHz1-12 GHz
PCIe Gen416 GT/s8 GHz1-24 GHz
PCIe Gen532 GT/s16 GHz1-48 GHz
PCIe Gen664 GT/s (PAM4)16 GHz1-48 GHz
USB 3.2 Gen15 GT/s2.5 GHz1-8 GHz
USB 3.2 Gen210 GT/s5 GHz1-15 GHz
USB4 / Thunderbolt 320 GT/s10 GHz1-30 GHz
DDR4-32003.2 GT/s1.6 GHz1-5 GHz
DDR5-48004.8 GT/s2.4 GHz1-8 GHz
DDR5-64006.4 GT/s3.2 GHz1-10 GHz
100GBASE-KR425.78 GT/s12.89 GHz1-40 GHz
400GBASE-KR4 (PAM4)53.125 GT/s26.56 GHz1-56 GHz

设置 sparameters(via, freq) 扫描时,请使用这些范围。识别谐振时,应将上限扩展至上方所示奈奎斯特频率的 2-3 倍以上。

注意事项

  1. 层编号在金属层和介质层之间交替:使用默认的 viaSingleEnded 构造函数(无参数)时,金属层为奇数(1、3、5……),介质层为偶数。使用 viaSingleEnded(N) 时,会添加阻焊层,金属层采用偶数编号(2、4、6……)。请始终检查对象的 SignalLayer 和 GroundLayer 属性,以确认哪些索引对应金属层。

  2. SignalViaLocations 和 GroundReturnViaLocations 需要 4 列:每行必须为 [x y startLayer stopLayer]。不要使用 2 列的 [x y],否则会报错或生成无效几何结构。例如:via.SignalViaLocations = [0 0 1 9](而不是 [0 0])。

  3. SignalTable 的 viaNum 必须与 SignalViaLocations 匹配:SignalTable 的第一列用于索引 SignalViaLocations 中的行。如果有 3 个信号过孔,有效的过孔编号为 1、2、3。

  4. 焊盘半径必须大于过孔半径:SignalViaPad.Radius 必须大于 SignalViaDiameter/2。如果二者相等或焊盘更小,几何结构将无效。

  5. 反焊盘与焊盘间距:反焊盘是接地平面中的避让孔。它必须大于焊盘,以提供绝缘。典型规则:反焊盘半径 >= 焊盘半径 + 0.1mm。

  6. GRV 跨度:接地回流过孔的跨度至少应从信号入口层延伸到信号出口层。较短的 GRV 会降低高频下的回流路径质量。目前,接地回流过孔必须始终为 PTH(贯穿整个叠层),且不能进行背钻。

  7. mils2meters 单位:所有几何属性的单位都是米。使用 via.mils2meters(= 2.54e-5)将 mil 转换为米:10*via.mils2meters = 0.254mm。

  8. 仅限行为模型:viaSingleEnded 使用行为(电路)模型,而非 MoM。mesh(via)、memoryEstimate(via, freq) 和 getZ0(via, freq) 不可用。使用 sparameters(via, freq, 'Behavioral', true) 可抑制“Switching to behavioral model”警告。

  9. SignalTable 中的方向:方向角决定走线从焊盘离开的方向。确保相邻端口的走线不会重叠——使用 show(via) 检查。

  10. 默认 GRV 跨度可能超出叠层范围:默认的 GroundReturnViaLocations 跨度延伸至第 9 层,无论实际叠层尺寸如何。务必显式设置 GroundReturnViaLocations,使其与叠层的层范围一致。

  11. 在调用 getpads() 前设置几何属性:getpads() 会在内部触发 checkDimensions()。所有属性(包括 GroundReturnViaLocations)在调用前都必须有效,否则会报错。

  12. 仅顶层/底层可混合(信号层和接地层):只有叠层的顶层和底层金属层可以同时出现在 SignalLayer 和 GroundLayer 中。中间层不能混合,否则 MATLAB 会报错:“必须指定为接地层或信号层,但不能同时指定为两者。”混合的顶层/底层可启用垂直端口,同时为行为模型提供接地参考。

  13. 背钻过孔必须终止于接地(连接)层:对背钻(非 PTH)信号过孔进行建模时,行为模型要求过孔的起始层/终止层为接地(连接)层,或叠层中的任意底层/顶层。如果过孔终止于仅信号层,sparameters 会报错:“信号过孔必须终止于连接层。”

  14. SignalTable 中 "Vertical" 是有效方向:除了数值角度(0、90、180 等)外,SignalTable 中的方向字段也接受 "Vertical"。它会通过过孔孔筒创建垂直端口连接。限制:垂直端口仅在完整叠层顶部或底部的信号层上有效。

  15. show(via, "View", "metal"):使用 "View","metal" 名称-值对,仅显示金属层(焊盘、反焊盘、孔筒),不显示介质填充。

  16. 介质数组的大小必须一致:指定多层基板时,Name、EpsilonR、LossTangent、Thickness 和 Frequency 的元素数量必须相同。如果 Name 是包含 K 个条目的元胞数组,其他所有属性也必须包含 K 个条目,否则 MATLAB 会报错:“'Thickness'(或 'Frequency')的大小与 'Name' 中指定的层数不匹配。”默认的 FrequencyModel 为 'DjordjevicSarkar'(而非 'Constant')。

  17. viaSingleEnded(N) 的介质层数:使用 viaSingleEnded(N)(N = 导电层数)时,基板至少需要 N 个介质层。N-1 个介质层会报错:“基板数量不正确:预期为 N。”超过 N 个的额外层会作为阻焊层添加到顶部/底部。默认构造函数会创建 N+1 个介质层(N-1 个芯板/半固化片层 + 2 个薄阻焊层)。使用此构造函数时,金属层采用偶数编号(2、4、6……)。

  18. S 参数分析至少需要 2 个接地层:行为模型需要在 GroundLayer 中至少有 2 个接地(已连接)层,sparameters 才能正常工作。如果只有 1 个接地层,MATLAB 会报错:“At least 2 connected layers must be present for analysis.” 对于专用接地层较少的电路板,可使用顶部和底部混合层(陷阱 #12)来满足此要求。此外,如果存在电源层,则每个电源层的上方和下方都必须至少有一个接地层。

相关技能

  • matlab-manage-pcb-material — 过孔叠层的基板和导体设置
  • matlab-analyze-pcb-pdn — 电源分配网络分析
  • matlab-analyze-em — S 参数提取和网格控制
  • matlab-integrate-pcb-circuit — 使用 serialLinkDesigner 进行眼图分析
  • matlab-assemble-pcb-layout — 在 pcbComponent 中使用 ViaLocations

版权所有 2026 The MathWorks, Inc.

评论

支持 Markdown