← AXL-004

Circuit review & bench-test guide

AXL-004 — Protocol breakout / exerciser PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axl-004-breakout prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic, 2026-07-12), the README, and the Digilent Pmod Interface Specification 1.2.0 (via the platform's verified notes, ../../pmod-common/PMOD-SPEC-NOTES.md).

The board is a design-stage prototype. The schematic is generated and ERC clean (reports/erc.rpt, 2026-07-12: 0 errors / 0 warnings, with KiCad's single-global-label, four-way-junction, SPICE-model, and footprint-filter checks ignored) and the netlist has been reviewed, but PCB layout has not started and no board has been fabricated or assembled. There is no first-article bench result of any kind. Every expected value below is a design target to verify, not proof that an assembled board works.

1. What the board does#

The board is a 12-pin PMOD pass-through exerciser — the sacrificial first-lab board of the AruviX lab line (catalog #4, level L1). A PMOD plug (J1) faces the host; a PMOD socket (J2) receives the module under test; every one of the 8 signal lines passes through a 100 Ω series resistor (R1–R8) on the way. All 8 DUT-side signals plus GND and 3V3 also land on J3, a labeled 1x10 probe header for logic-analyzer clips (AXL-001). 3V3 and GND pass straight through with no series elements. There are no ICs, so there is no decoupling and no configuration of any kind.

It teaches nothing by itself — it makes the other module's transactions visible, and it makes the first miswired lab burn a 100 Ω resistor instead of an FPGA pin (signal lines only; see Section 2).

Functional block diagram#

Host (ECP5/ULX3S PMOD port)          Module under test
        |                                    ^
        v                                    |
   J1 PMOD plug                        J2 PMOD socket
 1-4,7-10 SIG1..SIG8 ── R1..R8 100R ── DUT1..DUT8  1-4,7-10
 5,11 GND ──────────── straight ────── GND         5,11
 6,12 3V3 ──────────── straight ────── 3V3         6,12
                                         |
                                         v
                              J3 probe header 1x10
                              1-8 DUT1..DUT8, 9 GND, 10 3V3

2. Safety and scope boundaries#

3. Power and control sequence#

There is almost none, and that is the design. The board is fully passive:

  1. 3V3 and GND arrive on J1 PMOD pins 6/12 and 5/11 and connect directly — no series resistance, no fuse, no decoupling, no regulation — to J2 pins 6/12 and 5/11 and to J3 pins 10 and 9.
  2. The 8 signal lines are live whenever the host drives them; the board adds only 100 Ω per line. There is no enable, no sequencing, and no state: the board is "on" the moment the host port is.
  3. The PMOD spec's assumption that a module draws no more than ~100 mA passes through unmodified; this board adds essentially nothing to that budget (its only loads are leakage).

4. Interfaces and pin maps#

All three connectors use PMOD logical numbering as generated by generate_design.py (the odd/even translation to physical header pins of the KiCad Conn_02x06_Odd_Even symbol is shown in the continuity matrix).

PMOD pin123456789101112
J1 (host plug)SIG1SIG2SIG3SIG4GND3V3SIG5SIG6SIG7SIG8GND3V3
J2 (DUT socket)DUT1DUT2DUT3DUT4GND3V3DUT5DUT6DUT7DUT8GND3V3
J3 pin12345678910
NetDUT1DUT2DUT3DUT4DUT5DUT6DUT7DUT8GND3V3

Pass-through continuity matrix#

Per the PMOD spec (PMOD-SPEC-NOTES.md, "Pin numbering and orientation"), a host receptacle's numbering is the mirror image of a plug's, so module pin N meets host pin N. This board's J2 is a host-style receptacle for the DUT and generate_design.py gives it the identical PMOD-logical map as J1: host pin N maps straight through to DUT-module pin N. Note this mirroring is ultimately a layout-time property (connector orientation and footprint placement); the schematic can only name the pins. Verify at layout review and again with the matrix below on the first article.

The "hdr" columns are the physical pin numbers of the 2x06 connectors (PMOD_TO_HEADER in sensor_module_lib.py: PMOD 1–6 map to odd header pins 1,3,5,7,9,11; PMOD 7–12 map to even header pins 2,4,6,8,10,12).

PMOD pos.J1 netJ1 hdrPath elementJ2 netJ2 hdrJ3 pinExpected DMM (plug pin to socket pin)
1SIG11R1 100 ΩDUT111100 Ω ± 1%
2SIG23R2 100 ΩDUT232100 Ω ± 1%
3SIG35R3 100 ΩDUT353100 Ω ± 1%
4SIG47R4 100 ΩDUT474100 Ω ± 1%
5GND9directGND99< 1 Ω (continuity)
63V311direct3V31110< 1 Ω (continuity)
7SIG52R5 100 ΩDUT525100 Ω ± 1%
8SIG64R6 100 ΩDUT646100 Ω ± 1%
9SIG76R7 100 ΩDUT767100 Ω ± 1%
10SIG88R8 100 ΩDUT888100 Ω ± 1%
11GND10directGND109< 1 Ω (same GND net as pos. 5)
123V312direct3V31210< 1 Ω (same 3V3 net as pos. 6)

Cross-position expectations (the no-short half of the check): every J1-position-M to J2-position-N pair with M ≠ N must read open, with exactly four legitimate exceptions — 5↔11 and 11↔5 (both GND, < 1 Ω) and 6↔12 and 12↔6 (both 3V3, < 1 Ω). Any SIGm-to-SIGn or DUTm-to-DUTn reading below ~1 MΩ is a fault.

5. Component-by-component review#

Every reference designator in generate_design.py appears below. #FLG01 and #FLG02 are ERC power-flag pseudo-components on 3V3 and GND; they have no physical footprint and are listed only for completeness. No component on this board is DNP.

Ref.Part / valueFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J112-pin PMOD plug, right-angle 2x06 male (MPN TBD)Host power and all 8 signalsBoard does nothingOffset or reversed insertion puts 3V3 on signal pins of the host port; verify orientation against the square-pad pin 1 convention
J212-pin PMOD socket, female 2x06 (PinSocket_2x06_P2.54mm_Vertical stock footprint; right-angle part preferred at layout, MPN TBD)Receives the module under test with host-mirrored numbering so module pin N meets host pin NNo DUT connection; J3 still probes the R outputsWrong orientation/placement at layout breaks the mirror: signals land on the wrong DUT pins, worst case 3V3 onto a DUT signal pin
J31x10 vertical 2.54 mm male header (MPN TBD)Labeled probe row: 1–8 = DUT1–DUT8, 9 = GND, 10 = 3V3, for AXL-001 clips and DMM workNo probe access; pass-through still worksProbe slip across pins 9/10 is a hard, unprotected 3V3–GND short; pins 1–8 slips are limited by the 100 Ω resistors only toward the host side
R1, R2, R3, R4, R5, R6, R7, R8100 Ω 0603 1% (Yageo RC0603FR-07100RL), one per signal: R1 SIG1–DUT1 … R8 SIG8–DUT8Series survivability: limits fault current to 33 mA when a signal is shorted to GND or 3V3 (Section 9.C) and damps edges into wiring capacitanceThat signal line is open — protocol dead on that pin (an easy first troubleshooting check)A solder short across the pads removes protection on that line only; a wrong (larger) value degrades VOL margin on open-drain lines and slows edges; 0 Ω defeats the board's purpose
#FLG01 / #FLG02ERC power flags (3V3, GND)Schematic ERC bookkeeping only — they declare the pass-through rails as driven so ERC can pass with no power source on the boardERC warningsNot applicable; no physical part

6. Specification summary and design interpretation#

There is no silicon on this board, so the governing document is the Digilent Pmod Interface Specification 1.2.0 (revised 2017-10-05), <https://digilent.com/reference/_media/reference/pmod/pmod-interface-specification-1_2_0.pdf> (overview: <https://digilent.com/reference/pmod/start>), consulted via the platform's verified snapshot ../../pmod-common/PMOD-SPEC-NOTES.md (retrieved 2026-07-12) rather than a fresh fetch.

Specification fact (Pmod 1.2.0)Board-specific interpretation
12-pin plug: pins 1–6 upper row, 7–12 lower row; pin 1 rightmost of the upper row viewed from module top; host receptacle numbering is the mirror image, so module pin N meets host pin NJ2 is a host-style receptacle: giving it the identical PMOD-logical map as J1 yields a straight-through pin-N-to-pin-N path. The physical mirror must be realized at layout (plug and socket on opposite edges, per the README) and verified per Section 4's matrix
3.3 V LVCMOS/LVTTL expected; a host may switch both power pins together to 5.0 VThe board passes whatever the rail is; it neither converts nor protects power
Module draw should not be assumed above ~100 mAThis board adds ~0 to that; the DUT's draw passes through the J1/J2 power contacts
Standard host ports already carry ESD diodes and 200 Ω series resistors; high-speed ports omit themOn a standard port the total series is ~300 Ω per line (host 200 Ω + this board's 100 Ω). Budget VOL and edge rate for 300 Ω, not 100 Ω (see Section 7). On a raw/high-speed port this board's 100 Ω is the only series element
Interface types (GPIO/SPI/UART/I2C/…) define pin conventions onlyThe board is type-agnostic: it passes any type unmodified. Type 6 (I2C) modules carry their own pull-ups per the spec, which is what makes the VOL math in Section 7 work
Single-connector modules: max 0.8" wide, connector centered, >25 mil edge clearance for the retaining clipLayout constraint to carry into the (not yet started) PCB phase — with two PMOD connectors on opposite edges this board must satisfy it at both

Check the specification revision before layout; 1.2.0 is current per the platform notes.

7. Expected values before bench testing#

All are design targets calculated from the schematic, not measured results. DMM figures assume the meter's lead resistance is nulled.

QuantityDesign target / calculatedWhat to measure
SIGn to DUTn (each of the 12 positions per Section 4 matrix)100 Ω ± 1% (signals); < 1 Ω (positions 5, 6, 11, 12)DMM plug pin to socket pin
DUTn to J3 pin n (n = 1–8)< 1 ΩDMM socket pin to probe pin
J3 pin 9 to any GND pin (J1/J2 pos. 5, 11)< 1 ΩDMM
J3 pin 10 to any 3V3 pin (J1/J2 pos. 6, 12)< 1 ΩDMM
3V3 to GND, unpowered, both polaritiesOpen (> 10 MΩ) — nothing on the board connects themDMM
Any SIGm/DUTm to SIGn/DUTn, m ≠ nOpen (> 1 MΩ)DMM, Section 9.B adjacency pass
Board's own 3V3 supply current~0 (leakage only; no active parts)Bench supply, DUT removed
Drop across one 100 Ω at a CMOS input load (~1 µA)< 0.1 mV — negligibleDMM across R while host drives
Drop across one 100 Ω at 8 mA static drive0.8 V — visible; heavy static loads distort levelsSame
I2C VOL at the DUT with a 4.7 kΩ module pull-up, host pulling low through 100 Ω (this board) + 200 Ω (standard host port)3.3 V x 300/5000 ≈ 0.20 V — well under the 0.8 V VILScope on J3 while a transaction runs
Edge time constant into ~15 pF of DUT + probe load100 Ω x 15 pF = 1.5 ns — negligible at lab I2C/SPI/UART rates, marginal above ~20–30 MHzScope rise time on J3
Deliberate signal short current (Section 9.C)3.3 V / 100 Ω = 33 mA ceiling; ~109 mW in the resistorBench DMM in series

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, host identity, DUT module identity, and measured rail voltage.

Two bench contexts are used below. Context (a): the board sits between a 3.3 V PMOD port on the ECP5 host (ULX3S-class) and a real PMOD module (any released AruviX sensor module, e.g. an I2C type). Context (b): standalone on the bench with a DMM only — no power applied except where stated.

A. Unpowered inspection#

  1. Complete the Section 8 checklist under magnification.
  2. Measure 3V3-to-GND resistance in both polarities; anything below ~1 MΩ is a fault on this board (there is no legitimate DC path).

B. Standalone continuity and isolation (context b, unpowered)#

  1. Full pass-through buzz — all 12 positions. For each row of the Section 4 matrix, measure J1 position N to J2 position N: expect 100 Ω ± 1% on the eight signal positions and < 1 Ω on 5/6/11/12. Log all 12 readings.
  2. Adjacency no-short check. On each connector, measure every physically adjacent pin pair. In PMOD numbering the adjacent pairs are the ten within-row pairs (1-2, 2-3, 3-4, 4-5, 5-6, 7-8, 8-9, 9-10, 10-11, 11-12) and the six across-row pairs (1-7, 2-8, 3-9, 4-10, 5-11, 6-12): 16 pairs per connector. Expect open everywhere except 5-11 (GND–GND) and 6-12 (3V3–3V3), which legitimately read < 1 Ω.
  3. Cross-matrix sweep. Extend to the full 12x12: spot-check every J1-M-to-J2-N pair with M ≠ N (at minimum all pairs adjacent to a correct-path pin). Only the four same-net power combinations (5↔11, 6↔12) may conduct.
  4. Probe header. Buzz J3 pins 1–8 to J2 positions 1–4/7–10 (< 1 Ω), J3 pin 9 to GND, pin 10 to 3V3, and confirm J3 pins 1–8 read 100 Ω — not 0 — back to the corresponding J1 pin (proves the probe taps the DUT side of the resistors, as designed).

C. Series-R survivability test (context a, deliberate fault)#

This is the board's reason to exist, so it is tested deliberately — on one line, briefly, with the current measured. This protection exists only on the 8 signal lines. The 3V3 and GND pins have no series resistance; never extend this test to them.

  1. Configure one host pin (SIG1) as a static LVCMOS33 output driving high, at the lowest drive-strength setting (4 mA class). No DUT inserted.
  2. The math: an ideal 3.3 V source shorted to GND through R1 gives I = 3.3 V / 100 Ω = 33 mA and P = (3.3 V)² / 100 Ω ≈ 109 mW in R1. The RC0603FR-07100RL is rated 100 mW continuous — the ideal-case dissipation exceeds the rating by ~9%, so treat this as a seconds-to-minutes fault-survival budget, not a continuous operating point. In reality the FPGA driver saturates well below 33 mA at the 4 mA drive setting, so both figures are ceilings.
  3. Through a DMM on its current range, short J3 pin 1 (DUT1) to GND (J3 pin 9). Record the current (expect well under 33 mA; the ceiling itself only applies for an ideal driver). Hold for ~10 s, remove, and confirm R1 still measures 100 Ω and the line still passes data.
  4. Repeat with the host driving SIG1 low and the short taken from J3 pin 1 to 3V3 (J3 pin 10): the same 33 mA / 109 mW ceiling applies by symmetry, with the current now sunk by the FPGA pin.
  5. Pin-safety statement: 33 mA is the absolute worst-case ceiling and only flows if the driver can source/sink it; the configured 4 mA driver limits actual current far lower. Confirm the ECP5 per-pin absolute-maximum current against the Lattice ECP5 datasheet (FPGA-DS-02012) before running this powered test — this guide does not assert that number from memory. If in doubt, run the test with the DMM current reading watched live and abort above 20 mA.
  6. Do not batch-test all 8 lines simultaneously; one line at a time keeps total fault power trivial.

D. In-system pass-through with a real module (context a)#

  1. Host FPGA unconfigured, board inserted in the PMOD port, no DUT: measure 3V3 at J3 pin 10 (expect the host rail, ~3.30 V) and confirm J3 pins 1–8 float or sit at the host's idle levels.
  2. Insert a known-good PMOD module (an I2C-type AruviX sensor module is ideal: its own pull-ups exercise the open-drain case) into J2.
  3. Run that module's own bring-up procedure through this board. First pass criterion: the transaction succeeds exactly as it does without the breakout in the path.
  4. Clip the logic analyzer (AXL-001) or scope to J3 pins 1–8 with ground on pin 9 and capture a transaction. Verify: logic levels reach the DUT with VOL ≈ 0.2 V or better on open-drain lines (Section 7 math), clean monotonic edges, and no protocol errors introduced by probing.
  5. Measure the drop across one active line's resistor during traffic and confirm it matches I x 100 Ω for the observed load.

E. Rate limits (informative)#

  1. Increase SPI clock (if the DUT supports it) and note the rate at which the 100 Ω + capacitance filtering first corrupts data; record it as the board's practical ceiling for the kit documentation. This is characterization, not pass/fail.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
One signal dead through the boardResistance J1-N to J2-NOpen R1–R8 (that line's resistor), cracked joint, connector pin
One signal reads 0 Ω plug-to-socketResistance across that R's padsSolder bridge across the resistor — protection defeated on that line
All signals dead, power OKJ1 seating, orientationPlug inserted offset/reversed; wrong port
Module works direct but not through the boardVOL on the affected line during trafficMarginal open-drain budget (300 Ω total series on a standard host port), wrong (high) R value, or a DUT that cannot tolerate 100 Ω series
Signals land on wrong DUT pinsFull Section 4 matrixJ2 mirror broken at layout/assembly — the highest-consequence fault; do not use the board
3V3-to-GND low resistanceUnpowered ohms both polaritiesSolder bridge at positions 5/6 or 11/12 of any connector, or J3 9/10; no component fault can cause this (no parts on the rails)
Rail sags when board insertedCurrent draw with and without DUTShort as above, or the DUT itself — the board draws ~nothing
Probe header disagrees with socketJ3-n to J2-n continuityJ3 solder, mislabeled silkscreen (verify against net list, not labels)
Burnt/discolored resistor after a labValue check all 8A sustained short exceeded the ~100 mW rating — the board did its job; replace the resistor and check the FPGA pin still drives

11. Bench record template#

FieldRecord
Board revision / serial
Host (ECP5/ULX3S port, drive-strength config)
DUT module identity
Measured 3V3 rail
12-position pass-through readings (Section 9.B.1)
Adjacency check result, 16 pairs x 3 connectors
Cross-matrix (12x12) exceptions found
J3 probe-side verification (100 Ω back to J1)
Short test: line, drive setting, measured current, duration, R after
In-system transaction result and capture path
VOL / edge measurements
Rate ceiling found (Section 9.E)
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The design is as simple as a board can usefully be, and the simplicity is the safety argument: eight identical, individually checkable series resistors, three connectors, no ICs, no state, and a netlist a student can verify with a DMM in ten minutes. ERC is clean and every net, value, and reference designator in this guide traces directly to generate_design.py. The README's claims match the script, with two forward-looking items to keep honest: the silkscreen-labels-equal-net-names commitment and the plug/socket mirror both live in the PCB layout, which does not exist yet — the mirror in particular is the one fault mode that could put 3V3 on a DUT signal pin, and it cannot be verified until layout. The remaining open risks: the 100 Ω / 0603 combination dissipates ~109 mW in a sustained ideal short, marginally above its 100 mW continuous rating, so protection is rated for fault survival, not indefinite shorts; the power pins are deliberately unprotected and every user document must say so; all three connector MPNs are still TBD; the ECP5 per-pin current limit is cited as a check item, not a verified number; and every expected value in this guide is calculated from the schematic rather than measured on hardware.