Assembling Custom PCB Components
When to Use
- Building custom PCB structures that aren't covered by catalog objects (microstripLine, coupledMicrostripLine, etc.)
- Constructing multi-layer stackups with custom metal shapes on each layer
- Combining shape primitives with Boolean operations (union, subtract, intersect)
- Creating defected ground structures (DGS) by etching patterns into ground planes
- Placing feed ports, vias, or using advanced FeedDefinitions (coaxial, edge, delta-gap)
- Assembling stripline or shielded enclosure structures
When NOT to Use
- Designing standard transmission lines — use
matlab-design-pcb-transmission-line - Importing layouts from Gerber, ODB++, or Allegro — use
matlab-read-pcb-layout - Defining dielectric or metal materials — use
matlab-manage-pcb-material - Running EM analysis after assembly — use
matlab-analyze-em - Cascading or connecting multiple pcbComponents — use
matlab-integrate-pcb-circuit
Typical Workflow
- Before:
matlab-manage-pcb-material— set up substrate and conductor - This skill: Build the custom PCB structure using pcbComponent, shapes, and feeds
- After:
matlab-analyze-em— validate S-parameters →matlab-optimize-pcb-design— tune dimensions →matlab-write-pcb-layout— export Gerber
Quick Reference
| Task | Code |
|---|---|
| Create pcbComponent | pcb = pcbComponent |
| Assign layers | pcb.Layers = {signal, substrate, ground} |
| Set board shape | pcb.BoardShape = ground |
| Set thickness | pcb.BoardThickness = 1.6e-3 |
| Place feeds | pcb.FeedLocations = [x1 y1 1 3; x2 y2 1 3] |
| Feed diameter | pcb.FeedDiameter = W/2 |
| Set conductor | pcb.Conductor = metal("Copper") |
| Add vias | pcb.ViaLocations = [x y topLayer botLayer] |
| Visualize | show(pcb) |
| Layout view | layout(pcb) |
| Boolean union | shape = s1 + s2 |
| Boolean subtract | shape = s1 - s2 |
| Boolean intersect | shape = s1 & s2 |
pcbComponent Anatomy
pcbComponent is the universal container for custom RF PCB structures.
Minimal 2-Layer Microstrip
matlabpcb = 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-Layer Stripline Structure
matlabpcb = 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);
Key Properties
| Property | Format | Description |
|---|---|---|
Layers | Cell array | Alternating: metal shape, dielectric, metal shape, ... |
BoardShape | Shape object | Outer boundary of the PCB |
BoardThickness | Scalar (m) | Must equal sum of dielectric thicknesses |
FeedLocations | N×4 matrix | [x, y, signalLayer, groundLayer] per port |
FeedDiameter | Scalar (m) | Diameter of feed via/probe |
ViaLocations | M×4 matrix | [x, y, topLayer, bottomLayer] per via |
ViaDiameter | Scalar (m) | Via barrel diameter |
FeedViaModel | String | 'strip', 'square', 'octagon', 'hexagon' |
Conductor | metal object | Conductor for all metal layers |
SolverType | String | 'MoM' or 'FEM' |
Shape Primitives
Rectangular Traces
matlabrect = traceRectangular(Length=20e-3, Width=5e-3, Center=[0 0]);
Line Traces (multi-segment with bends)
matlabtl = 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);
Point-Defined Traces
matlabtp = 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
Spiral Traces
matlabsp = traceSpiral; sp.NumTurns = 3; sp.InnerDiameter = 4e-3; sp.Spacing = 0.5e-3; sp.TraceWidth = 0.5e-3; show(sp);
Tapered Traces
matlabtt = traceTapered; tt.Length = 10e-3; tt.InputWidth = 1e-3; tt.OutputWidth = 3e-3;
Bends
Bend Width is a 2-element vector [w1 w2] for the two arms:
matlabbc = 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-Bends
U-bend Width is a 3-element vector [arm1 bottom arm2]:
matlabuc = ubendCurved; uc.Width = [2e-3 2e-3 2e-3]; uc.CurveRadius = 3e-3; um = ubendMitered; um.Width = [2e-3 2e-3 2e-3];
Other Shapes
matlabd = 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
Boolean Operations
Combine shapes using operators to build complex geometries.
Union (+)
matlableft = 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);
Subtraction (-)
Create slots, gaps, or etched patterns:
matlabbase = traceRectangular(Length=20e-3, Width=10e-3); slot = traceRectangular(Length=15e-3, Width=1e-3); slotted = base - slot; show(slotted);
Intersection (&)
matlabring = ringAnnular; ring.InnerRadius = 1e-3; ring.Width = 9e-3; rect = traceRectangular(Length=15e-3, Width=15e-3); clipped = ring & rect;
Complex Example: U-CSRR Filter
matlab% 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);
Feed Placement
FeedLocations Format
Each row: [x, y, signalLayerIndex, groundLayerIndex]
- Layer indices are odd numbers (1, 3, 5, ...) for metal layers in the
Layerscell array - Layer 1 = first metal (top), Layer 3 = second metal, etc.
matlab% 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-Port Coupled Trace
matlabpcb.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
Feed Diameter
matlabpcb.FeedDiameter = traceWidth / 2; % Must fit within the trace
Internal Ports (for lumped elements)
Define extra feed locations for internal connections to lumped components (see matlab-integrate-pcb-circuit skill for pcbElement with PortNumber/PortValue).
DGS — Defected Ground Structures
Etch patterns into the ground plane using the dgs method:
matlabms = 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 adds bandstop characteristics and can improve coupler directivity or filter rejection.
Shielded Enclosures
Add a conductive lid for shielded analysis:
matlabpcb = pcbComponent; % ... set up layers ... pcb.IsShielded = true; % Adds PEC enclosure walls and lid show(pcb);
For filter-in-enclosure problems, shielding affects resonant frequencies and coupling.
Shape Manipulation
matlabshape = 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²)
For catalog objects, extract shapes by layer with shapes():
matlabs = shapes(obj); % Struct of shapes by layer name boardArea = area(s.GroundPlane);
For pcbComponent, shapes are in Layers and BoardShape:
matlabboardArea = area(pcb.BoardShape);
Discovering Available Methods
Use methods(obj) to list all available operations on any object:
matlabmethods(pcb) % List all pcbComponent methods methods(traceRectangular) % List all shape methods
Visualization
matlabshow(pcb); % 3-D structure view layout(pcb); % Top-down layout with feeds and vias mesh(pcb); % Mesh visualization info(pcb); % Print structure summary
Advanced Feed Setup (FeedDefinitions API)
By default, pcbComponent uses FeedLocations (XY coordinates + layer) for simple probe feeds. For advanced feed types — coaxial, edge, delta-gap, finite-gap — switch to the FeedDefinitions API:
matlabpcb = pcbComponent; pcb.FeedFormat = 'FeedDefinitions'; % Enable FeedDefinitions mode
Feed Types
| Feed Type | Use When | Key Properties |
|---|---|---|
ProbeFeed | Vertical via probe (patch antennas) | SignalLocations, SignalLayers, GroundLayers, ViaDiameter, ViaModel |
CoaxialFeed | Probe with explicit pad/antipad geometry | PadShape, AntipadShape, SignalLayers, GroundLayers |
EdgeFeed | Stripline-style edge excitation | SignalLocations, SignalLayers, GroundLayers, SignalWidths |
DeltaGapFeed | Internal port with current direction | SignalLocations, SignalLayers, SignalWidths, CurrentDirection |
FiniteGapFeed | Internal gap port (signal + ground) | SignalLocations, GroundLocations, SignalLayers, SignalWidths |
ArbitraryFiniteGapFeed | Coplanar port with full control | SignalLocations, GroundLocations, SignalWidths, GroundWidths, SignalLayers, GroundLayers |
ProbeFeed (Most Common)
matlabf = ProbeFeed('SignalLocations', [-0.0187, 0], ... 'SignalLayers', 1, 'GroundLayers', 3, ... 'ViaDiameter', 1e-3, 'ViaModel', 'square'); pcb.FeedDefinitions = f;
EdgeFeed (Stripline Structures)
For 5-layer stripline structures with signal on layer 3 and ground on layers 1 and 5:
matlabf1 = 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 (Custom Pad/Antipad Geometry)
matlabpad = 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 (Internal Ports)
matlabf = DeltaGapFeed('SignalLocations', [x, y], 'SignalLayers', 1, ... 'SignalWidths', 0.5e-3, 'CurrentDirection', [0, 1]); pcb.FeedDefinitions(end+1) = f; % Append to existing feeds
Multiple Feeds
Build feed arrays by concatenation or append:
matlabpcb.FeedDefinitions = [f1, f2]; % Row array at once pcb.FeedDefinitions(end+1) = f3; % Append incrementally
Shape Primitives Reference
For the full catalog of all shape primitives (traces, bends, curves, rings, special shapes) with properties and common operations, see references/shape-primitives.md.
Pitfalls
-
Feed outside metal: The feed circle (
FeedDiameter) must fit entirely within the metal trace at the feed location. Inset at leastFeedDiameter/2from any trace edge. Failing this causes solver errors. -
BoardThickness mismatch — set before Layers:
BoardThicknessmust exactly equal the sum of all dielectric layer thicknesses inLayers. TheLayerssetter validates against the currentBoardThickness, so setBoardThicknessbeforeLayerswhen the total differs from the default (1.6 mm). SettingLayersfirst with a non-default total causes an error. -
Layer indexing: Metal layers are odd-indexed (1, 3, 5, ...) in the
Layerscell array. Dielectrics are even-indexed (2, 4, ...).FeedLocationsreferences metal layer indices only. -
Boolean operation order: Subtraction is order-dependent (
A - B ≠ B - A). The first operand defines the base; the second is removed from it. -
Shape overlap for union: Shapes must overlap or touch for
+to produce a connected geometry. Disjoint shapes create multi-body structures which may confuse the solver. -
FeedViaModel for stripline: For 5-layer (stripline) structures, set
FeedViaModelto control the feed via shape connecting the internal signal layer to the external port reference. -
Corner property is integer-valued: Set
Cornerusing integers: 1 = Miter, 2 = Smooth (default is Sharp). String values like"Miter"cause errors. -
DGS: capture return value + use cell array:
dgsdoes not modify the object in place — you must capture the output:ms = dgs(ms, {dgsShape}). Also pass shapes in a cell array, not bare:{dgsShape}, notdgsShape. -
IsShielded auto-switches to FEM: Setting
pcb.IsShielded = trueautomatically changesSolverTypeto'FEM'. This is expected but makes the solve significantly slower. -
Use rotateZ, not rotate, for z-axis rotation:
rotate(shape, angle)requires 4 arguments (angle + two 3D points defining the axis). For simple z-rotation userotateZ(shape, angle). SimilarlyrotateXandrotateYfor other axes. -
FeedFormat is exclusive. Setting
FeedFormat = 'FeedDefinitions'disablesFeedLocations. You cannot mix both modes — choose one or the other. -
GroundLayers as column vector for multi-ground. For stripline structures with ground on both sides, pass
GroundLayersas a column vector:[1; 5], not[1, 5]. -
Each dielectric in Layers must be a single-layer object: Do NOT use a multi-layer
dielectric(one with vectorThickness/EpsilonR) as a single entry in theLayerscell array. Each dielectric layer must be its own separatedielectricobject with scalar properties. For a 5-layer stack:pcb.Layers = {metal1, diel1, metal2, diel2, metal3}where eachdielhas scalarThickness.
Related Skills
matlab-manage-pcb-material— Defining dielectric and metal for layersmatlab-analyze-em— Analyzing the assembled structurematlab-design-pcb-filter— Filters using custom pcbComponent geometrymatlab-integrate-pcb-circuit— Connecting pcbComponents together
Copyright 2026 The MathWorks, Inc.


