Signal Integrity
Signal integrity (SI) is the discipline of ensuring that electrical signals arrive at their destination undistorted. At low frequencies, wires are just wires. At high frequencies or with fast edges, every trace is a transmission line, every via is a discontinuity, and every ground plane gap is an antenna.
Why It Matters
A 100MHz clock signal with 1ns rise time has frequency content up to 350MHz. USB 2.0 runs at 480Mbps. SPI at 50MHz. Even a “slow” UART at 115200 baud is fine, but the MCU driving it may have 5ns edge rates containing harmonics above 100MHz. SI problems cause bit errors, EMI failures, and circuits that work on the bench but fail in production.
How It Works
Rise Time vs Bandwidth
The usable bandwidth of a digital signal is determined by its rise time, not its clock frequency:
BW = 0.35 / t_rise
A signal with 1ns rise time has 350MHz bandwidth. A 10ns rise time has 35MHz bandwidth. This is why slow protocols can still have SI issues if the driver has fast edges.
When to Worry About SI
The critical length rule: a trace acts as a transmission line when its length exceeds 1/10 of the signal wavelength.
Critical length = (propagation speed x rise time) / 10
For FR4 PCB: propagation ~ 15 cm/ns (roughly half speed of light)
| Rise time | Critical length | Worry if trace longer than |
|---|---|---|
| 10ns | 150mm | 15mm (most board traces!) |
| 5ns | 75mm | 7.5mm |
| 1ns | 15mm | 1.5mm |
| 0.3ns | 4.5mm | 0.45mm |
Rule of thumb: if your signal has rise times below 5ns (most modern CMOS), any trace longer than ~50mm needs attention.
Transmission Line Effects
When a trace is electrically long, it has a characteristic impedance:
Z0 = sqrt(L_per_length / C_per_length)
For a microstrip trace over a ground plane, Z0 depends on trace width, dielectric height, and dielectric constant. Typical targets: 50 ohm single-ended, 90-100 ohm differential.
Impedance mismatch causes reflections. A signal hitting a mismatch bounces back, creating ringing and overshoot. The reflection coefficient:
rho = (Z_load - Z0) / (Z_load + Z0)
An open circuit (Z_load = infinity) reflects 100% of the signal. A matched load (Z_load = Z0) absorbs it all.
Impedance Matching and Termination
Series termination (most common for point-to-point):
Driver ──[Rs]──── trace (Z0 = 50 ohm) ────── Receiver
Rs = Z0 - Z_driver_output
Typically 22-33 ohm for CMOS drivers
The signal leaves the driver at half amplitude, reaches the receiver at full amplitude (reflected wave adds constructively at the open receiver input). Simple, low power.
Parallel termination (for buses or when receiver must see full swing immediately):
Driver ──── trace ────── Receiver
|
[Rt] = Z0
|
GND (or Vtt)
Consumes DC power (V^2/Rt) but ensures clean signal at the receiver.
Ground Bounce
When many outputs switch simultaneously, the current spike through the ground pin inductance creates a voltage bounce on the internal ground:
V_bounce = L_ground x dI/dt
With 1nH of ground pin inductance and 16 outputs switching 10mA each in 1ns:
V_bounce = 1e-9 x (16 x 10e-3 / 1e-9) = 0.16V
That is 160mV of noise on a 3.3V logic level — significant. Mitigations:
- Multiple ground pins/vias (reduces inductance)
- Decouple close to power pins (Capacitors and Inductors)
- Stagger output switching (not all at once)
- Use ICs with dedicated power/ground pin pairs
Crosstalk
Coupling between adjacent traces. Two mechanisms:
Capacitive crosstalk: electric field coupling between parallel traces. Dominant for high-impedance circuits and fast edges.
Inductive crosstalk: magnetic field coupling from current loops. Dominant for low-impedance, high-current circuits.
Aggressor trace ═══════════════════
↕ coupling region
Victim trace ═══════════════════
Reduce crosstalk:
- Increase trace spacing (3x trace width minimum for sensitive signals)
- Reduce parallel run length
- Use ground plane (provides nearby return path, reduces loop area)
- Route sensitive signals on adjacent layers with perpendicular orientation
Practical: When to Worry
| Situation | SI concern? | Action |
|---|---|---|
| UART at 115200 baud | No | Just route it |
| I2C at 400kHz | No | Pull-up resistors per spec, that’s it |
| SPI at 1MHz | No | Short traces, bypass caps, done |
| SPI at 50MHz | Yes | Series termination, short traces, ground plane |
| USB 2.0 (480Mbps) | Yes | 90 ohm differential, controlled impedance, length matching |
| Ethernet (100BASE-TX) | Yes | Differential pairs, magnetics, follow reference layout |
| DDR3/4 memory | Very yes | 4-layer minimum, impedance control, length matching, simulation |
| HDMI / PCIe | Very yes | Controlled impedance, via stitching, S-parameter modeling |
Calculation Example
import math
# Rise time to bandwidth
t_rise = 2e-9 # 2ns (typical for 3.3V CMOS)
bw = 0.35 / t_rise # 175 MHz
# Critical trace length (FR4)
v_prop = 0.15 # m/ns (half speed of light in FR4)
critical_length_m = v_prop * t_rise * 1e9 / 10 # 0.03m = 30mm
# Traces longer than 30mm need controlled impedance at 2ns rise time
# Microstrip impedance (approximate formula)
# Z0 = 87 / sqrt(er+1.41) * ln(5.98*h / (0.8*w + t))
# where h=dielectric height, w=trace width, t=copper thickness, er=dielectric const
er = 4.4 # FR4
h = 0.2 # mm (distance to ground plane, typical 4-layer)
w = 0.3 # mm (trace width)
t = 0.035 # mm (1oz copper)
z0 = (87 / math.sqrt(er + 1.41)) * math.log(5.98 * h / (0.8 * w + t))
# ~50 ohm (adjust w to hit your target)
# Ground bounce
l_pin = 1e-9 # 1 nH ground pin inductance
n_outputs = 8
i_per_output = 10e-3 # 10 mA
t_switch = 2e-9 # 2 ns
v_bounce = l_pin * (n_outputs * i_per_output) / t_switch # 40 mVRelated
- PCB Design Basics — layout determines SI outcomes
- UART SPI I2C — protocol speeds and when SI matters
- Capacitors and Inductors — decoupling for high-frequency noise
- Digital Logic — fast edge rates come from CMOS gate outputs