← AXA-004

Circuit review & bench-test guide

AXA-004 — Discrete H-bridge lab PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axa-004-hbridge-lab module at component level and turns the design intent into a practical manual-review and bench-test plan. It is based on the generator (generate_design.py), the module README, the actuator-line rules in ../README.md, and the AO3400A/AO3401A manufacturer datasheets.

This is an unfabricated prototype design. Status at time of writing: schematic generated, ERC clean (0/0), netlist reviewed, PCB layout not started, no board built, no bench evidence of any kind, and the mandatory deadtime_gen HDL and testbench do not exist yet. Every number below is a design target or a datasheet-derived estimate to verify — nothing here is proof that an assembled board is safe.

This is the most dangerous board in the actuator family. It is a discrete H-bridge with no driver IC, no dead-time hardware, no interlock, no fuse, no current sensing, and no protection other than resistors, body diodes, and your own logic. Shoot-through — a direct short of the motor supply through two FETs — is physically possible by design, because teaching that hazard honestly is the module's purpose. Treat every instruction in sections 4, 8, and 9 as mandatory, not advisory.

1. What the board does#

The module is a two-half-bridge (full H-bridge) motor driver built from six SOT-23 FETs on a 3.3 V PMOD interface. The FPGA fabric generates all four gate signals (HS1, LS1, HS2, LS2 — all active-high). Each half-bridge has an AO3401A P-channel high-side FET and an AO3400A N-channel low-side FET; a third small AO3400A per channel acts as a level inverter so the 3.3 V PMOD pin can control a P-FET gate that lives near VM. Motor power VM (5–12 V) enters only on the J2 screw terminal, never through the PMOD. The bridge output OUT1/OUT2 goes to the J3 screw terminal. Flyback is handled by FET body diodes only.

There is no fault output, no current sense, no thermal feedback, and no enable pin. The module is deliberately dumb; the curriculum pairs it with a sense module for closed-loop work.

Functional block diagram#

PMOD J1 (3.3 V logic only, all host-driven, all ACTIVE-HIGH)
 │
 ├─ HS1 ─100R(R1)─> Q3 AO3400A inverter ─┐            VM 5–12 V ── J2 ──┬── C1 C2 C3
 │   └10k(R5) to GND                     │ drain = HG1_PD               │   bulk+HF
 │                              10k(R4) series                          │
 │                    HG1 ──────────┴──── 10k(R3) pull-up to VM ────────┤
 │                     │                                                │
 │                     v  gate                                          │
 │                Q1 AO3401A  P-FET  (source = VM) ──────────────────---┤
 │                     │ drain                                          │
 │                     ├──────────────> OUT1 ──> J3 pin 1               │
 │                     │ drain                                          │
 ├─ LS1 ─100R(R2)─> Q2 AO3400A  N-FET  (source = GND)                   │
 │   └10k(R6) to GND                                                    │
 │                                                                      │
 ├─ HS2 ─100R(R7)─> Q6 inverter ── R10/R9 ── Q4 AO3401A ──┐             │
 │   └10k(R11) to GND                                     ├─> OUT2 ──> J3 pin 2
 ├─ LS2 ─100R(R8)─> Q5 AO3400A ───────────────────────────┘
 │   └10k(R12) to GND
 └─ 3V3 / GND (PMOD pins 5, 6, 11, 12; grounds join on the module)

HSx = LSx = 1  ==>  VM shorted to GND through Q_high + Q_low. NO INTERLOCK.

2. Safety and scope boundaries#

3. Topology and control review#

3.1 Low-side path (fast, direct)#

LSx drives the AO3400A gate directly through 100 Ω (R2/R8). The AO3400A is a logic-level FET: worst-case RDS(on) is 48 mΩ at VGS = 2.5 V and 32 mΩ at 4.5 V, so 3.3 V drive lands between those, comfortably enhanced. Gate RC is roughly 100 Ω x 630 pF Ciss ≈ 63 ns, so the low-side switches in the sub-microsecond range. LSx = 1 → low side ON.

3.2 High-side path (slow, two-stage)#

A 3.3 V pin cannot swing a P-FET gate referenced to VM, so HSx (through 100 Ω, R1/R7) drives a small AO3400A inverter (Q3/Q6). The inverter's drain pulls the AO3401A gate down through a 10 kΩ series resistor (R4/R10) against a 10 kΩ pull-up to VM (R3/R9):

Gate-rating math: VSG = VM/2 is 6 V at VM = 12 V (inside the AO3401A ±12 V absolute maximum with 2x margin) and 2.5 V at VM = 5 V, exactly the AO3401A's specified enhancement point (RDS(on) is rated at VGS = −2.5 V, < 85 mΩ). Below 5 V the high side barely enhances; above 12 V the divider erodes the gate-rating margin. VM range is therefore 5–12 V, hard.

3.3 The timing asymmetry — read this before choosing a dead time#

The low-side gate sees ~100 Ω; the high-side gate sees 10 kΩ networks. Using datasheet Ciss values as first-order estimates (Miller charge makes reality slower, not faster):

Consequences: the datasheet nanosecond switching times (measured at RGEN = 3 Ω) do not apply to this board; dead time must cover the slow, asymmetric high-side edges (the dangerous edge is high-side-off → low-side-on); and usable PWM frequency is low — plan on hundreds of Hz to a few kHz, not tens of kHz.

3.4 Idle and default states#

All four PMOD nets have 10 kΩ pull-downs (R5, R6, R11, R12). An unpowered, unconfigured, or tri-stated host therefore leaves the inverters off, the P-FET gates at VM, and the N-FET gates at GND: all four power FETs off. This is the module's only hardware safety feature and it protects only against inactive hosts — it does nothing against a host actively driving wrong levels.

3.5 Honest protection audit#

What exists: 10 k idle pull-downs; the VM/2 divider bounding VSG; 100 Ω gate resistors (ringing damping and PMOD pin current limiting); FET body diodes for flyback; VM kept off the PMOD with grounds joined on the module.

What does NOT exist: dead-time hardware, cross-coupled or logic interlock of any kind, gate-driver IC, undervoltage lockout, fuse, current limit, current or fault sense, temperature sense, TVS or clamp beyond body diodes, reverse input protection, and dedicated flyback diodes. If HSx and LSx are both high, nothing on this board intervenes. That is the design.

4. SHOOT-THROUGH: the physics, the numbers, and the mandatory dead-time verification#

4.1 What shoot-through is#

Each half-bridge is a totem pole from VM to GND. If the high-side and low-side FET of the same leg conduct simultaneously — even for tens of nanoseconds while one is still turning off as the other turns on — the motor supply is short-circuited through the two channels. Nothing limits the current except the two RDS(on) values and the source impedance of VM (bench supply plus C1/C2/C3, which are sitting right at the bridge precisely to deliver current fast).

4.2 The numbers for this board#

At VM = 12 V with the high side at VSG = 6 V (RDS(on) ≈ 47–60 mΩ) and the low side at VGS = 3.3 V (≈ 24–48 mΩ), the cross-conduction path is roughly 70–110 mΩ. Ignoring supply impedance, the prospective current is 12 V / ~0.09 Ω ≈ 130 A — the local ceramic capacitors alone will source a large fraction of that for the first microseconds. Compare the datasheet limits: AO3400A IDM = 30 A pulsed, AO3401A IDM = −27 A pulsed, both in SOT-23 packages rated 1.4 W.

Energy scale: a single 50 ns overlap at ~100 A and 12 V dissipates on the order of E ≈ V x I x t ≈ 60 µJ per edge, split between two dies. That sounds small, but at a 20 kHz PWM rate with overlap on both edges it is 2 x 20,000 x 60 µJ ≈ 2.4 W of continuous extra dissipation — above the 1.4 W absolute package rating before the motor draws a single milliamp. The FETs heat, RDS(on) rises roughly 1.6x by 125 °C (datasheet Fig. 4), VGS(th) falls with temperature, switching slows, overlap widens, and the failure runs away. Escalation with VM is quadratic: power in the short scales as VM²/R.

A static logic bug — both gates simply held high, the classic FPGA mistake at reset, during configuration, or in an unreached-state default — shorts VM continuously. At 130 A prospective (or even at a 5 A bench-supply limit sustained into 0.09 Ω once the caps are drained) the SOT-23s exceed their pulsed and thermal ratings within microseconds to milliseconds: instant, unrecoverable destruction, sometimes with package rupture. This board deliberately exposes raw gates to the FPGA; there is no hardware interlock of any kind (section 3.5). The only thing standing between a bitstream and a fireball is your deadtime_gen and its testbench.

4.3 Why the body diodes make dead time visible (and necessary)#

During correct dead time, the motor's inductive current cannot stop; it freewheels through a FET body diode (VSD ≈ 0.7 V typical, 1.0 V max, 2 A continuous diode rating on both parts). On a scope you will see OUTx fly one diode drop above VM or below GND during the gap. That step is the signature of healthy dead time — and also why dead time should be shortened (never eliminated) once measured: diode conduction dissipates ~0.7 V x I instead of RDS(on) x I², and the AO3401A body diode Qrr of 3.5 nC is recovered as a small extra current spike at every transition.

4.4 MANDATORY dead-time verification procedure (before VM ever carries real current)#

Do this before the motor supply is connected at full capability. Two acceptable VM configurations for this test:

Procedure, per leg (leg 1 = Q1/Q2, leg 2 = Q4/Q5):

  1. Load the testbench-proven bitstream (section 5). Configure complementary PWM on HSx/LSx with the designed dead time.
  2. Scope both gates of the same leg simultaneously: channel A on HGx (the AO3401A gate, referenced to VM — use math VM−HGx or a differential probe to display VSG), channel B on LGx (the AO3400A gate to GND). Ground-referenced probing of HGx is acceptable here because VM is current-limited.
  3. Trigger on each PWM edge in turn and measure the non-overlap gap at both edges: from VSG falling below 0.5 V (AO3401A VGS(th) minimum) to LGx rising past 0.65 V (AO3400A VGS(th) minimum), and the mirror-image gap on the other edge. Use the thresholds, not the 50% points — the high-side edges are slow ramps, not steps.
  4. Sweep duty cycle across the full commanded range, including 0%, 100%, and abrupt duty/direction changes, and confirm non-overlap never collapses. Repeat for both legs. Repeat at VM(test) corresponding to 5 V and 12 V if the resistor-fed method allows, because the VM/2 gate swing and thus effective thresholds change with VM.
  5. Record the worst-case measured gap and the measured high-side turn-off time in the bench record (section 11).

Acceptance: the measured non-overlap gap at every edge, every duty, both legs, must be at least 2x the measured high-side turn-off time (the slowest transition in the system, estimated ~15–30 µs in section 3.3, but the measurement rules). Given the estimates, a first-pass dead-time setting of 50–100 µs is the sensible starting point; shorten it later, with the scope watching, once real numbers are in hand. The datasheet ns-class switching times must not be used to justify short dead times — they were measured with a 3 Ω generator, three orders of magnitude stiffer than this board's 10 k high-side network.

Never connect an unlimited motor supply until this procedure has passed and is recorded.

5. FABRIC-TESTBENCH-FIRST RULE (hard precondition)#

No bitstream may drive this board until the gate-drive HDL has passed a self-checking testbench demonstrating, at minimum:

  1. No-overlap invariant: under any input sequence (random stimulus plus directed corner cases), HSx and LSx of the same leg are never asserted simultaneously, including for a single clock cycle.
  2. Dead-time counter: every HSx↔LSx handover inserts at least the programmed dead time, and the programmed value covers the asymmetric high-side timing with the section 4.4 margin.
  3. All-off default: all four outputs are deasserted at reset, from power-up/configuration until explicitly enabled, and on any estop or illegal-state condition; unreached FSM states trap to all-off.
  4. Glitch-free duty/direction changes: mid-period command changes never bypass the dead-time state machine.

The testbench must fail loudly (assertion, non-zero exit) on violation. Also verify the FPGA constraint file: the four PMOD pins must not have pull-ups enabled, must be driven (not tri-stated) once configured, and the configuration-time state of the chosen pins must be checked against the FPGA family's documentation. This rule exists because section 4.2 shows a single bad state is destruction, not degradation. deadtime_gen and this testbench are listed as a release gate in the README and do not exist yet — that alone blocks all powered testing.

6. Component-by-component review#

Every reference designator in the design is covered below. #FLG01–#FLG03 are ERC power-flag symbols only; they place no physical part.

6.1 Power FETs#

Ref.Part / datasheet summaryFunction and why neededIf absent/openIf shorted, wrong, or misassembled
Q1AO3401A, −30 V, −4 A P-FET, SOT-23Channel 1 high-side switch; source at VM, drain at OUT1; body diode is OUT1's flyback path above VMLeg 1 can only pull OUT1 low; forward drive of the motor in that polarity is lost; flyback above VM lostD–S short ties OUT1 to VM permanently → any LS1 assertion is a dead short; wrong orientation misplaces the body diode and gate
Q2AO3400A, 30 V, 5.7 A N-FET, SOT-23Channel 1 low-side switch; body diode is OUT1's flyback path below GNDLeg 1 cannot pull OUT1 low; flyback below GND lostD–S short ties OUT1 to GND → any HS1 assertion is a dead short
Q3AO3400A (same part)Channel 1 high-side level inverter: drain = HG1_PD pulls the Q1 gate low via R4; cancels inversion so HS1 = 1 → high side ONHigh side 1 permanently off (gate parked at VM by R3)D–S short holds Q1 permanently ON via the divider → LS1 assertion is a dead short; G–S short = high side 1 permanently off
Q4AO3401AChannel 2 high-side switch (mirror of Q1)As Q1, leg 2As Q1, leg 2
Q5AO3400AChannel 2 low-side switch (mirror of Q2)As Q2, leg 2As Q2, leg 2
Q6AO3400AChannel 2 level inverter (mirror of Q3)As Q3, leg 2As Q3, leg 2

Note the pattern: every single-FET short converts one PMOD signal into a shoot-through trigger. This is why the unpowered resistance checks in section 9.A are done before anything else, every session.

6.2 Gate network resistors (channel 1 / channel 2)#

Ref.ValueFunctionIf absent/openIf shorted or wrong value
R1 / R7100 Ω (Yageo RC0603FR-07100RL)HSx → inverter (Q3/Q6) gate: damps ringing, limits PMOD pin currentHigh side of that channel uncontrollable (inverter gate floats near GND via R5/R11 → high side off)Short: loses damping, PMOD pin sees the raw gate; large value: slows the inverter and widens the high-side asymmetry
R2 / R8100 Ω (RC0603FR-07100RL)LSx → low-side (Q2/Q5) gate directly: damping + pin protectionLow side of that channel off (gate held by R6/R12 through... open — gate floats: dangerous, Miller coupling can half-turn-on Q2/Q5)Short: raw pin drive, ringing; large value: slows the fast edge the dead-time budget assumed
R3 / R910 kΩ (RC0603FR-0710KL)HGx pull-up to VM: high side OFF by default; sole turn-off charge pathQ1/Q4 gate floats — high side state undefined, can drift on, shoot-through hazard. Absolutely mandatory partShort: gate hard-tied to VM, high side stuck off (safe direction, but dead); wrong (small) value shifts the divider and raises VSG above VM/2, eroding the ±12 V gate margin
R4 / R1010 kΩ (RC0603FR-0710KL)Series half of the divider: with R3/R9 parks the gate at VM/2, keeping VSG ≤ 6 V at VM = 12 V (inside the ±12 V rating)High side never turns on (gate stays at VM)Short: inverter-on slams the gate to ~0 V → VSG = VM = 12 V, at the AO3401A absolute-maximum gate rating with zero margin — reject the board until fixed
R5 / R1110 kΩ (RC0603FR-0710KL)HSx idle pull-down: unpowered/tri-stated host → inverter off → high side offHSx floats when host inactive; charge or leakage can enable a high side with no host in controlShort: HSx grounded, high side of that channel never operates (safe direction, but dead)
R6 / R1210 kΩ (RC0603FR-0710KL)LSx idle pull-down: unpowered host → low side offLSx floats when host inactive; a drifting low-side gate plus an active high side is shoot-throughShort: LSx grounded, low side dead (safe direction)

6.3 Decoupling#

Ref.Value / partFunctionIf absent/openIf shorted or wrong
C1, C210 µF 25 V X5R 0805 (Murata GRM21BR61E106KA73L)VM bulk reservoir for bridge switching current; keeps commutation current loops localVM sags/rings at every commutation; long supply leads become the switching loop; gate divider (referenced to VM) bouncesShort: VM–GND short (supply limit trips); 25 V rating leaves margin at 12 V but X5R derating means effective C is well below 10 µF at 12 V — acceptable, but note it
C3100 nF 50 V X7R 0603 (Murata GRM188R71H104KA93D)High-frequency decoupling right at the bridgeHF ringing on VM edges, worse EMI, gate-divider noiseShort: VM–GND short

These capacitors are also what makes shoot-through instantly destructive: they are low-ESR ceramics placed to deliver current fast, and they do not care whether the load is a motor or a fault.

6.4 Connectors#

Ref.PartFunctionReview points
J1PMOD plug, Type 1 GPIO1 HS1, 2 LS1, 3 HS2, 4 LS2, 5 GND, 6 3V3, 7–10 NC, 11 GND, 12 3V3. All host-driven, all active-highA one-pin misalignment on the PMOD swaps gate signals — buzz out pin 1 to the host before first configuration. 3V3 powers nothing on this module (no ICs); grounds join here
J2Phoenix MKDS 1,5/2-5,08 screw terminal (MPN listed TBD in the generator — confirm before ordering)Motor supply input: 1 VM (5–12 V), 2 GND. Never power via PMODNo reverse protection. Torque the screws; a loose VM wire under motor current arcs and spikes. Verify polarity with a meter before every first connection
J3Phoenix MKDS 1,5/2-5,08 screw terminal (MPN TBD)Bridge output: 1 OUT1, 2 OUT2Motor leads only; never hot-plug (section 8). Swapping the two leads only reverses direction — the one harmless miswire on this board

7. Datasheet summary and design interpretation#

Sources (fetched 2026-07; check the latest revision before procurement):

ParameterAO3400A (N, low side + inverters)AO3401A (P, high side)Board interpretation
VDS max30 V−30 V2.5x margin at VM = 12 V; inductive spikes ride on body diodes, but ringing must be scoped
VGS abs max±12 V±12 VThe VM/2 divider exists exactly for this: VSG = 6 V at VM = 12 V. A shorted R4/R10 puts the P-FET at its limit
VGS(th)0.65 / 1.05 / 1.45 V (min/typ/max)−0.5 / −0.9 / −1.3 VDead-time measurement thresholds (section 4.4). The 0.5 V P-FET minimum is why "gate near VM" is not "off"
RDS(on)< 26.5 mΩ @ 10 V; < 32 mΩ @ 4.5 V; < 48 mΩ @ 2.5 V (typ 24)< 50 mΩ @ −10 V; < 60 mΩ @ −4.5 V; < 85 mΩ @ −2.5 V (typ 60)At 3.3 V / VM-2 drive expect ~25–48 mΩ (N) and ~47–85 mΩ (P); sets conduction loss and the ~130 A shoot-through prospective
ID continuous (25 °C)5.7 A−4.0 ABridge continuous rating is the P-FET's 4 A — before thermal reality on a 2-layer board; derate hard
IDM pulsed30 A−27 AAny shoot-through exceeds this; motor stall must stay far below it
PD / RθJA1.4 W; RθJA 70–90 °C/W (t ≤ 10 s), 100–125 °C/W steady-state on 1 in² 2 oz FR-4sameAt 2 A motor current: P-FET ~0.24 W → ~+30 °C rise; fine. At 4 A: ~0.96 W → junction climbs toward the limit. SOA is a single-pulse curve (datasheet note F, Fig. on later pages) — it does not bless repetitive overlap events; check the SOA figure directly before any high-current plan
Qg total6 nC typ (VGS = 4.5 V)14 nC (−10 V), 7 nC (−4.5 V); Qgs 1.5 nC, Qgd 2.5 nCSmall charges, but through 10 kΩ they still mean microseconds (section 3.3)
Switching (RGEN = 3 Ω)td(on) 3 ns, tr 2.5 ns, td(off) 25 ns, tf 4 nstd(on) 6.5 ns, tr 3.5 ns, td(off) 41 ns, tf 9 nsNot applicable to this board's 10 k gate network — cited only to show how misleading they'd be for dead-time sizing
Ciss630 pF645 pFWith 10 k networks: τ ≈ 3.2–6.5 µs high side (section 3.3)
Body diodeVSD 0.7 typ / 1.0 max V; IS 2 A cont.; trr 8.5 ns, Qrr 2.6 nC−0.7 / −1.0 V; −2 A; trr 11 ns, Qrr 3.5 nCFlyback path is 2 A continuous per diode — another reason motor current stays ≤ 2 A until measured; expect ~0.7 V steps on OUTx during dead time

Values not extracted here (SOA curve coordinates, transient thermal impedance curves) must be checked against the datasheet pages directly before any test that depends on them.

8. Actuator-specific safety (mandatory)#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record everything in the section 11 template. Prerequisites for anything past step B: section 5 testbench proof recorded; section 4.4 dead-time plan ready.

Bench contexts#

A. Unpowered inspection and resistance tests (every session, before anything)#

  1. Nothing connected. Inspect under magnification: Q1–Q6 orientation (SOT-23 pin 1), no solder bridges on the FET pads, resistor values against section 6.2, C1–C3 present, screw terminals tight.
  2. Diode-mode meter, both polarities, record values:
  1. Ohmmeter: HS1, LS1, HS2, LS2 each to GND ≈ 10 kΩ (pull-downs present). HG1/HG2 to VM ≈ 10 kΩ. Anything wildly off means a wrong or open resistor in the gate network — the most safety-critical passives on the board.
  2. PMOD pinout buzz-out from J1 pin 1 through to the host connector.

B. Logic-only functional test (VM absent or resistor-fed)#

  1. Context (a): host powered, testbench-proven bitstream loaded, VM disconnected. Scope HS1/LS1/HS2/LS2 at the PMOD: clean 3.3 V levels, correct complementary pattern, dead-time gaps visible, all-off at reset and on estop input.
  2. Feed VM through 1 kΩ from 5 V (or 5 V at 100 mA limit). Verify HG1/HG2 sit at VM when the high side is commanded off and at ~VM/2 when commanded on. Verify IG1/IG2 (inverter gates) follow HSx.
  3. Run the full section 4.4 dead-time verification now. Record the worst-case gaps and the measured high-side turn-off time. Do not proceed until the 2x acceptance margin holds everywhere.

C. First power ladder, no motor#

  1. VM = 5.0 V, supply current limit 100 mA, J3 empty. Idle (all-off): input current should be ≈ VM leakage only, well under 1 mA (the 10 k pull-ups carry no DC when the inverters are off). More than a few mA at idle is a fault — stop.
  2. Run complementary PWM at low frequency (≤ 1 kHz). Supply current should stay in the low-mA range (gate divider draws VM/20k ≈ 0.25 mA per active high side, plus switching charge). Scope OUT1/OUT2: clean rail-to-rail swings.
  3. Watch for the shoot-through signature: current-limit LED flicker or supply current spikes synchronized to PWM edges. Any sign → stop, re-measure dead time.
  4. Raise VM to 12.0 V, limit still 100 mA. Repeat 1–3. Verify VSG ≈ 6 V on an active high side (differential or VM-referenced measurement).
  5. Only after clean captures at both voltages: raise the limit to 500 mA and re-run. Nothing should change — there is no load yet.

D. Resistive load#

  1. VM = 5 V, limit 500 mA. Power a ~22 Ω / 5 W resistor across J3. Verify OUT1−OUT2 waveform polarity matches the commanded direction table (HS1+LS2 = OUT1 positive; HS2+LS1 = negative).
  2. Step VM to 12 V, limit 1 A, load sized for ≤ 1 A. Capture OUTx edges; confirm no ringing beyond ±30 V absolute on any FET drain.
  3. Measure FET package temperatures after 10 minutes. Compare with the RθJA-based estimate for the measured current.

E. First motor test (small motor first)#

  1. Motor: N20-class first, never JGA25-class for first spin. Measure its winding resistance; compute stall current; set the supply limit below it and at or below 1 A.
  2. Motor secured, hands clear, safety glasses on. VM = 5 V. Command low duty (~20%). Observe rotation, listen, watch supply current.
  3. Scope OUT1/OUT2 during running PWM: confirm body-diode conduction steps during dead time, no rail excursions beyond one diode drop, VM stable (no pump-up) on start, stop, and direction reversal at low duty.
  4. Step through duty range, then direction reversals, then VM = 12 V with the limit raised only as far as the measured running current requires (≤ 2 A until a thermal soak has passed).
  5. Deliberate stall test (optional, instrumented): only with the supply limit set to a value the section 7 thermal math supports (≤ 2 A recommended), for seconds not minutes, with FET temperature watched.
  6. 30-minute soak at the intended operating point; record FET, terminal, and motor temperatures.

F. Not covered by this plan#

Repetitive-avalanche characterization, EMC, long-term reliability, JGA25 stall-level (4 A) operation, and any operation without the testbench gate remain out of scope. The module has no release claim until the README's release checklist (layout, DRC, fab outputs, HDL deliverable) is complete.

10. Expected values#

QuantityDesign target / estimateHow to measure
Idle VM current (all gates low)≪ 1 mA (leakage only)Bench supply readout, step C.1
Per-channel divider current, high side onVM/20 kΩ: 0.25 mA @ 5 V, 0.6 mA @ 12 VSupply delta when commanding HSx
VSG of an ON high sideVM/2: 2.5 V @ 5 V, 6.0 V @ 12 VVM−HGx, differential or math
Low-side gate rise/fall~0.1–0.3 µs (100 Ω x Ciss + margin)Scope LGx
High-side turn-on (VSG 0 → plateau)~5–15 µs estimate (τ ≈ 3.2 µs + Miller) — measureScope HGx vs. VM
High-side turn-off to non-conduction~15–30 µs estimate (τ ≈ 6.5 µs, several τ + Miller) — measureScope VSG through 0.5 V threshold
Dead-time gap, every edge≥ 2x measured high-side turn-off; first pass 50–100 µsSection 4.4, both gates simultaneously
PWM frequency≤ ~1 kHz initial; raise only per measured edgesScope
OUTx during dead timeOne VSD step (~0.7 V) beyond the rail toward freewheel directionScope OUTx
OUTx ringingNever beyond ±30 V (VDS abs max); flag anything past ±20 VScope, single-shot on commutation
High-side drop at 1 A~47–85 mΩ x 1 A ≈ 50–85 mV (VSG-dependent)DMM VM to OUTx, FET on, DC test
Low-side drop at 1 A~25–48 mΩ x 1 A ≈ 25–48 mVDMM OUTx to GND
FET temperature rise at 2 A continuousRough estimate ~+25–45 °C (P ≈ I²R, RθJA 100–125 °C/W steady-state) — verifyIR camera / thermocouple, 30-min soak
N20 stall current~0.36–1.6 A typical estimate — measure winding RDMM on the actual motor, cold
JGA25 stall currentUp to ~4 A typical estimate — out of scope for first testsDMM on the actual motor

11. Troubleshooting map#

SymptomFirst measurementsLikely areas
Supply current-limits instantly at VM apply, gates idleUnpowered diode checks of section 9.AShorted FET, solder bridge, reversed VM at J2, shorted C1–C3
Supply current spikes at PWM edgesDead-time gap per section 4.4; supply current probe vs. gate edgesShoot-through: dead time too short for measured high-side turn-off; HDL overlap bug; wrong R3/R4 values
One high side never turns onIGx follows HSx? HGx drops to VM/2?R1/R7 open, Q3/Q6 dead or misoriented, R4/R10 open
One high side never turns OFFHGx stuck below VM with HSx lowQ3/Q6 D–S short, R3/R9 open (floating gate), HSx stuck high from host
High side on but VSG wrong (not VM/2)HGx voltage; R3/R4 values in-circuitWrong divider resistor, partially soldered joint
Low side never turns onLGx level vs. LSxR2/R8 open, Q2/Q5 dead, host pin misassigned
OUTx stuck at a rail regardless of commandsDiode checks on that FET pairFET D–S short — remove VM immediately; that leg is one gate assertion away from shoot-through
Motor runs one direction onlyGate patterns on all four signalsHost pin swap at J1, one dead FET, HDL direction bug
VM rises above supply setting on reversal/brakingVM waveform on scope at direction changeRegeneration pumping C1/C2; supply cannot sink — add controlled ramp-down in HDL or a dump load; reduce reversal aggressiveness
Excessive OUTx ringingSingle-shot on commutation edge, probe grounded shortLong motor leads, missing/failed C3, layout loop (once laid out)
FETs hot at modest currentIndividual FET drops at DCUnder-enhanced gate (low VM on high side), raised RDS(on) from prior overstress — a survived shoot-through often leaves degraded FETs; replace, do not trust
Board behaves after a known overlap eventFull 9.A resistance checks + RDS(on) dropsAssume FET damage until measurements prove otherwise

12. Bench record template#

FieldRecord
Board revision / serial
Testbench evidence (repo commit, sim log path, pass output)
Bitstream / HDL version, dead-time setting
Bench context: (a) FPGA host ID or (b) generator model + mode
Supply IDs, current-limit settings per step
Scope/probes (diff probe for VSG?), calibration date
Unpowered diode/resistance check results (9.A)
Measured high-side turn-off time, per leg, per VM
Measured worst-case dead-time gap, both edges, both legs (4.4)
First-power idle current @ 5 V / 12 V
No-load PWM captures (file paths)
Resistive-load results, OUTx ringing extremes
Motor type, measured winding R, computed stall current
First-spin result, reversal/VM-pump observation
Thermal soak temperatures
Any overlap/current-limit event (treat as suspected FET damage)
Deviations, photos, raw-file paths
Reviewer / date / disposition

13. Review conclusion#

The design is internally consistent and does what it claims: a minimal discrete H-bridge whose only safety features are passive defaults (10 k pull-downs, VM/2 gate divider) and whose active safety is delegated entirely to FPGA fabric. The gate-rating math checks out against the AO3401A datasheet (VSG = 6 V max at VM = 12 V against a ±12 V rating; 2.5 V at VM = 5 V matching the specified enhancement point), and the AO3400A is genuinely logic-level at 3.3 V. The 10 k high-side gate network makes switching slow and asymmetric by three to four orders of magnitude relative to the datasheet's 3 Ω test conditions — that is the pedagogical point, and it dictates dead times in the tens of microseconds and PWM in the low-kHz range, both of which must be established by measurement, not by this document's estimates.

The principal risks, in order: (1) any bitstream reaching the board without the not-yet-written self-checking deadtime_gen testbench — this is the single gate that prevents instant destruction; (2) dead time sized from datasheet nanosecond switching numbers instead of the measured slow high-side turn-off; (3) unlimited or high-limit supplies — the bench current limit is the only fuse; (4) motor stall current versus the 4 A / 2 A-body-diode / 1.4 W SOT-23 envelope, especially JGA25-class motors at 12 V; (5) no reverse protection at J2; (6) PCB layout does not exist yet — the bridge commutation loop, gate-network placement, and thermal copper will materially change every switching and thermal number above and this guide must be revisited after layout. Nothing in this document substitutes for the release checklist in the README.