Circuit review & bench-test guide
AXL-008 — Breadboard adapter PMOD module
Document purpose#
This document explains the axl-008-breadboard 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.
The board is a design-stage prototype. The schematic is generated and the ERC report in reports/erc.rpt (2026-07-12) shows 0 errors / 0 warnings (with the tool's standard ignored-check list), but note that the schematic file carries a later modification timestamp than that report — ERC must be re-run before release. 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. The board has no ICs; its entire correctness budget is spent on the netlist, the resistor values, and — once layout exists — the silkscreen labels that this guide treats as part of the design.
1. What the board does#
The board is a 12-pin PMOD (Type 1A expanded-GPIO footprint) to breadboard adapter: PMOD plug J1 passes all 12 positions to two labeled 1x06 pin-header rows (J2, J3) intended to straddle a solderless breadboard at 0.3" DIP row spacing. The 8 signal lines each pass a 100 Ω series resistor (survivability: a breadboard miswire burns nothing); GND and 3V3 pass straight through. Net B<n> corresponds to PMOD signal pin n, and the silkscreen label next to each breakout pin is intended to be exactly the net name, so the breadboard rows read like the PMOD specification: row A = B1 B2 B3 B4 GND 3V3, row B = B7 B8 B9 B10 GND 3V3.
It is the classroom adapter of the AruviX lab line (catalog #8, level L1); there is no active silicon, no decoupling (nothing to decouple), and no protection beyond the eight series resistors.
Functional block diagram#
PMOD J1 J2 ROW A (breadboard)
1 P1 ── R1 100R ── B1 ─────── 1 B1
2 P2 ── R2 100R ── B2 ─────── 2 B2
3 P3 ── R3 100R ── B3 ─────── 3 B3
4 P4 ── R4 100R ── B4 ─────── 4 B4
5 GND ─────────────────┬───── 5 GND
6 3V3 ─────────────────┼┬──── 6 3V3
││ J3 ROW B (breadboard)
7 P7 ── R5 100R ── B7 ─┼┼──── 1 B7
8 P8 ── R6 100R ── B8 ─┼┼──── 2 B8
9 P9 ── R7 100R ── B9 ─┼┼──── 3 B9
10 P10 ─ R8 100R ── B10 ┼┼──── 4 B10
11 GND ─────────────────┘│──── 5 GND
12 3V3 ──────────────────┘──── 6 3V3
2. Safety and scope boundaries#
- Solderless breadboards and long jumper wires are poor high-speed and high-current interconnects. Contact resistance is tens of milliohms to ohms and degrades with use; row capacitance (~2–25 pF) plus the 100 Ω series resistors and jumper inductance limit clean edges to the low-MHz region. The PMOD spec itself calls the interface "low frequency". Do not route clocks faster than a few MHz, DDR strobes, or anything whose timing you care about through this adapter, and never carry more than ~0.5 A through a single breadboard contact.
- 3V3 pin current limits. The Pmod specification says a module "should not be assumed" to draw more than approximately 100 mA from the host's power pins, and the actual limit is set by the host's 3.3 V regulator and any per-port fuse/switch (ULX3S-class boards share one rail across ports). Treat 100 mA as the budget for everything on the breadboard; power hungry circuits get their own supply, joined to the adapter only at GND.
- What must never be jumpered together: 3V3 to GND (nothing on this board limits that current — it is a dead short across the host rail); 3V3 to any B pin while the host drives that pin low (33 mA continuous through one 100 Ω resistor, ~109 mW — above the 0603's rating, see Section 5); any external supply above 3.3 V (5 V included) to 3V3 or to any B pin — the ECP5's I/O are not 5 V tolerant and 100 Ω is a survivability resistor, not level translation; and two B pins both configured as driven outputs (16.5 mA contention — survivable through 2 x 100 Ω but always a design error to fix).
- The spec allows hosts to offer switchable 5.0 V on the power pins. This adapter must only be used on hosts set to 3.3 V; at 5 V every label on the board ("3V3") becomes a lie and downstream 3.3 V breadboard parts are at risk.
- Earth-referenced oscilloscope grounds clip only to a GND pin.
- A passing continuity test is not a signal-integrity qualification; this adapter is verified for DC correctness only.
3. Power and control sequence#
There is none, honestly: the board is entirely passive. 3V3 and GND arrive on PMOD pins 6/12 and 5/11 and appear immediately and unconditionally on J2/J3 pins 5 and 6. The eight signals are live whenever the host drives them; the board adds nothing but 100 Ω per line. There is no inrush behavior worth noting (no capacitors), no reset, and no configuration. The only sequencing rule is imported from the host: configure the FPGA pins as inputs (or keep the FPGA unconfigured) while wiring the breadboard, and drive outputs only after the wiring is inspected.
4. Interfaces and pin maps#
Full PMOD-pin to labeled-breakout-pin map (the authoritative netlist, from generate_design.py):
| PMOD J1 pin | Host net | Series part | Breakout net / label | Breakout pin |
|---|---|---|---|---|
| 1 | P1 | R1 100R | B1 | J2 pin 1 |
| 2 | P2 | R2 100R | B2 | J2 pin 2 |
| 3 | P3 | R3 100R | B3 | J2 pin 3 |
| 4 | P4 | R4 100R | B4 | J2 pin 4 |
| 5 | GND | none (direct) | GND | J2 pin 5 |
| 6 | 3V3 | none (direct) | 3V3 | J2 pin 6 |
| 7 | P7 | R5 100R | B7 | J3 pin 1 |
| 8 | P8 | R6 100R | B8 | J3 pin 2 |
| 9 | P9 | R7 100R | B9 | J3 pin 3 |
| 10 | P10 | R8 100R | B10 | J3 pin 4 |
| 11 | GND | none (direct) | GND | J3 pin 5 |
| 12 | 3V3 | none (direct) | 3V3 | J3 pin 6 |
Note the deliberate naming gap: there are no B5/B6/B11/B12 — the B numbers track PMOD signal pin numbers, and pins 5/6/11/12 are GND/3V3. The two GND nets are one net; the two 3V3 nets are one net.
Label-vs-net verification (design review, pre-fabrication): silkscreen does not exist yet — layout has not started. When it does, a mandatory review step is to cross-check every label string placed on the silkscreen against the net name attached to that pad in generate_design.py (the script's own comment says the labels are the net names — hold layout to that). The corresponding bench step is Section 9.C: drive one pin from the host and confirm only the identically labeled breakout pin toggles.
Orientation caution: the spec's 2x6 pin numbering is "non-standard and mirrored between the host connector and the peripheral board connector" (spec Section 4, Figures 2 and 5). The layout review must confirm J1 pin 1 lands on host pin 1 with the module plugged in the intended orientation; this is the single most likely way for every label on the board to be wrong at once.
5. Component-by-component review#
Every reference designator in generate_design.py appears below. There are no DNP parts on this design. #FLG01 and #FLG02 are ERC power-flag pseudo-components on 3V3 and GND; they have no physical footprint and are listed only for completeness.
| Ref. | Part / value | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | 12-pin PMOD plug | All host power and signal connection; the module's only upstream interface | Nothing works | Offset or flipped insertion puts 3V3 on signal pins and mislabels every breakout pin; verify orientation against spec Figure 2 |
| J2 | 1x06 2.54 mm vertical male header (MPN TBD) | Breadboard row A: B1 B2 B3 B4 GND 3V3 | Row A signals unreachable | Swapped J2/J3 stuffing is invisible electrically until labels are checked — every row-A label then names a row-B net |
| J3 | 1x06 2.54 mm vertical male header (MPN TBD) | Breadboard row B: B7 B8 B9 B10 GND 3V3 | Row B signals unreachable | Same as J2, mirrored |
| R1, R2, R3, R4, R5, R6, R7, R8 | 100 Ω 1% 0603 (Yageo RC0603FR-07100RL), one per signal: R1=P1/B1, R2=P2/B2, R3=P3/B3, R4=P4/B4, R5=P7/B7, R6=P8/B8, R7=P9/B9, R8=P10/B10 | Series survivability: limits a dead short of a driven line to 3.3 V / 100 Ω = 33 mA and output-vs-output contention to 3.3 V / 200 Ω = 16.5 mA | That line is a direct FPGA-pin-to-breadboard connection; one miswire can source/sink beyond the I/O's rating | Wrong (larger) value degrades logic levels under load at 100 mV per mA; a solder short restores the unprotected direct connection; a swapped-position resistor is invisible (all eight are identical) |
| #FLG01, #FLG02 | ERC power flags (3V3, GND) | Schematic ERC bookkeeping only | ERC warnings | Not applicable; no physical part |
Protection-current math the 100 Ω choice implies: worst continuous fault is one line hard-shorted to the opposite rail while driven, giving 3.3 V / 100 Ω = 33 mA through the resistor and 3.3 V² / 100 Ω = 109 mW dissipation — about 9% above the RC0603FR's 100 mW rating at 70 °C. That is fine for the intended "miswire, notice, fix" transient, but a fault left in place indefinitely runs the resistor out of spec (an open risk carried to Section 12; an 0805 would add margin at layout time). Contention between two driven pins splits 3.3 V across 200 Ω: 16.5 mA, 27 mW per resistor — comfortably safe. The 33 mA fault figure is also inside what ECP5 LVCMOS33 outputs survive briefly, which is the point of the resistor.
6. Specification summary and design interpretation#
There is no silicon on this board, so there is no device datasheet to review — deliberately. The governing document is the Digilent Pmod Interface Specification 1.2.0 (revised October 5, 2017), <https://digilent.com/reference/_media/reference/pmod/pmod-interface-specification-1_2_0.pdf> (fetched and read in full for this review), plus the Yageo RC-series thick film resistor datasheet for R1–R8.
| Specification fact (Pmod spec 1.2.0) | Board-specific interpretation |
|---|---|
| 12-pin version: 8 I/O, two power, two ground; arranged as two stacked 6-pin interfaces (Section 1) | Exactly the J2/J3 row split: row A mirrors pins 1–6, row B mirrors pins 7–12 |
| Signals expected to conform to LVCMOS 3.3 V / LVTTL 3.3 V; drive strength unspecified, FPGA hosts generally ±16 to ±24 mA (Section 2) | 100 mV/mA drop across the series R: at 5 mA the breakout pin sits 0.5 V from the rail — keep breadboard loads light or budget the drop |
| Host system-board ports "generally have ESD protection diodes and 200-ohm series resistors" (Section 2) | On such hosts total series R is ~300 Ω; in-circuit resistance readings and level budgets must account for the host's share (Section 9.A) |
| Drivers should source/sink at least 5 mA to drive up to 18" cables (Section 2) | This adapter plus breadboard is a comparable or worse load; 5 mA capability is the sensible planning number |
| Type 1A (expanded GPIO): pins 1–4 and 7–10 are IO1–IO8, all bidirectional; 5/11 GND, 6/12 VCC (Section 5.1) | The B-numbering deliberately matches this table so the breadboard row "reads like the spec" |
| Host must provide 3.3 V; may optionally switch power pins between 5.0 V and 3.3 V, both pins together (Section 3) | Use only at 3.3 V — the silkscreen says 3V3 and downstream parts will trust it (Section 2) |
| Module power draw "should not be assumed to be more than approximately 100 mA" (Section 3) | The whole breadboard rides on this budget; the adapter itself draws zero |
| 100 mil spaced, 25 mil square pin headers; module boards 0.8" wide with >25 mil edge clearance for the Pmod clip; 2x6 pin numbering mirrored between host and module (Section 4) | Layout constraints to carry into the (not yet started) PCB: width, clearance, and above all connector orientation |
| Interface is "not intended for high frequency operation" (Section 1) | Reinforces the Section 2 boundary — this is a DC/low-MHz teaching adapter |
Check the current specification revision before layout; 1.2.0 is the latest known at review time.
7. Expected values before bench testing#
All are design targets derived from the netlist and the 1% resistor tolerance, not measured results. "Unplugged" means the bare adapter, out of the host and off the breadboard — the only configuration in which the resistors read true, because the board itself has no parallel paths but a host or a populated breadboard adds them (FPGA clamp diodes, host series resistors, whatever is wired on the breadboard).
| Quantity | Design target / calculated | What to measure |
|---|---|---|
| Each Pn-to-Bn path, unplugged | 100 Ω ± 1% (99–101 Ω) | DMM ohms, J1 pin to breakout pin (Section 9.A matrix) |
| Same path, module on an unconfigured host | ~100 Ω but host-dependent — clamp diodes and any host 200 Ω network can shift the reading; do not fail the board on this number, retest unplugged | DMM ohms |
| GND continuity: J1-5 to J1-11 to J2-5 to J3-5 | < 1 Ω (one net) | DMM continuity |
| 3V3 continuity: J1-6 to J1-12 to J2-6 to J3-6 | < 1 Ω (one net) | DMM continuity |
| 3V3 to GND, unplugged, both polarities | Open (no component bridges the rails on this board) | DMM ohms; investigate anything measurable |
| Any two different signal paths (e.g. B1 to B2) | Open (> 10 MΩ) | Adjacent-pair scan, Section 9.A |
| 3V3 at J2-6/J3-6, host powered | 3.30 V nominal (host rail, no drop — direct copper) | DMM vs host rail |
| Driven-high B pin, no load | ~3.3 V (no current, no drop across 100 Ω) | DMM |
| Driven-high B pin, 3.3 kΩ load to GND | ~3.20 V (divider: 3.3 V x 3300/3400) | DMM |
| Adapter idle current contribution | 0 (no parts draw current) | Any increase is the breadboard's |
| Worst-case fault current, one line to opposite rail | 33 mA, 109 mW in one resistor (Section 5) | Do not test destructively; math only |
| Edge quality through adapter + breadboard | Usable to low MHz only; expect visible RC rounding | Scope, Section 9.E (optional characterization) |
8. Manual schematic and assembly review checklist#
- Re-run ERC after any regeneration: the checked-in
reports/erc.rpt(0 errors / 0 warnings) predates the current schematic file timestamp. - Verify all eight nets: Bn connects to PMOD pin n through exactly one resistor, and to nothing else. Confirm there are no B5/B6/B11/B12 nets.
- Confirm GND ties pins J1-5, J1-11, J2-5, J3-5 and 3V3 ties J1-6, J1-12, J2-6, J3-6, with no series parts.
- Confirm R1–R8 are all 100 Ω 1% (RC0603FR-07100RL) and each sits between the correct P/B pair per the Section 5 table.
- At layout review (not yet possible): cross-check every silkscreen label string against the pad's net name in the netlist (Section 4); confirm J1 orientation against Pmod spec Figure 2 with the mirrored host numbering in mind; confirm J2/J3 land at 0.3" row-to-row spacing and the board meets the 0.8" width / 25 mil clip-clearance rules; consider 0805 resistors for fault-dissipation margin.
- Resolve the pin-header MPN (currently "TBD" in the script and README) and run the BOM availability check before release.
- On an assembled board: inspect for solder bridges between the 100 mil header pins and between adjacent 0603 pads; verify no resistor position swaps matter (they are identical values — a swap is benign, a bridge is not).
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, host identity, DMM model, and measured host 3V3. Two bench contexts are used: (a) the module on an ECP5/ULX3S-class FPGA PMOD host driving known patterns into a breadboard, and (b) the bare module standalone with a DMM. Do all of context (b) before ever plugging into a host.
A. Standalone continuity matrix and resistance tests (unplugged, DMM)#
- Complete the assembly checklist above under magnification.
- Measure 3V3-to-GND in both polarities: expect open.
- Buzz every PMOD pin to its labeled breakout pin. Use ohms mode, not the continuity beeper, for the signal rows — many beepers threshold near 30–50 Ω and will stay silent through a healthy 100 Ω resistor. Fill in:
| # | From J1 pin | To breakout pin (label) | Expected | Measured | Pass |
|---|---|---|---|---|---|
| 1 | 1 | J2-1 (B1) | 99–101 Ω | ||
| 2 | 2 | J2-2 (B2) | 99–101 Ω | ||
| 3 | 3 | J2-3 (B3) | 99–101 Ω | ||
| 4 | 4 | J2-4 (B4) | 99–101 Ω | ||
| 5 | 5 | J2-5 (GND) | < 1 Ω | ||
| 6 | 6 | J2-6 (3V3) | < 1 Ω | ||
| 7 | 7 | J3-1 (B7) | 99–101 Ω | ||
| 8 | 8 | J3-2 (B8) | 99–101 Ω | ||
| 9 | 9 | J3-3 (B9) | 99–101 Ω | ||
| 10 | 10 | J3-4 (B10) | 99–101 Ω | ||
| 11 | 11 | J3-5 (GND) | < 1 Ω | ||
| 12 | 12 | J3-6 (3V3) | < 1 Ω |
The 99–101 Ω readings are simultaneously the series-R value check: each in-circuit reading here equals the true resistor value because the bare board has no parallel path across any resistor. If a reading is low, suspect a solder bridge across the 0603; if high/open, a cracked joint or wrong part. Verify the value and 1% tolerance against the BOM line (RC0603FR-07100RL). Once the module is plugged into a host or breadboard this measurement is no longer trustworthy — host clamp diodes, host series resistors, and breadboard wiring all appear in parallel or series.
- Adjacent-pair short scan across the whole J1 header — every physically adjacent pair, along each row and across the rows. Expected: open everywhere except the two power pairs marked, which are single nets.
| Pair | Pins | Expected | Measured | Pass |
|---|---|---|---|---|
| row A | 1–2 | open | ||
| row A | 2–3 | open | ||
| row A | 3–4 | open | ||
| row A | 4–5 | open | ||
| row A | 5–6 | open | ||
| row B | 7–8 | open | ||
| row B | 8–9 | open | ||
| row B | 9–10 | open | ||
| row B | 10–11 | open | ||
| row B | 11–12 | open | ||
| across | 1–7 | open | ||
| across | 2–8 | open | ||
| across | 3–9 | open | ||
| across | 4–10 | open | ||
| across | 5–11 | < 1 Ω (both GND) | ||
| across | 6–12 | < 1 Ω (both 3V3) |
- Repeat the same adjacent-pair scan across J2's six pins and J3's six pins (all open except nothing — J2/J3 adjacent pins share no nets; GND and 3V3 are adjacent on each row, expected open to each other).
B. First power on the FPGA host, no signal traffic#
- Plug the module into a 3.3 V PMOD port on the ECP5 host (ULX3S-class) with the FPGA unconfigured (all I/O high-impedance). No breadboard yet.
- Confirm the host powers up normally and its 3V3 rail current is unchanged (the adapter draws nothing).
- Measure J2-6 and J3-6 to J2-5: expect the host's 3V3 rail value (typically 3.25–3.35 V), identical at both pins.
- Measure each B pin: undriven FPGA pins may float or sit at the host's pull-up/pull-down default; note but do not judge the values.
C. Label verification by walking-one pattern (host drives)#
This is the electrical proof of the silkscreen. Configure the FPGA to drive a walking-one: exactly one of P1–P4/P7–P10 high (or slowly toggling, ~1 Hz) and the other seven driven low.
- For each of the eight signals in turn, probe all eight B pins with the DMM (or watch eight LEDs, each 3.3 kΩ-ish series, one per breakout pin on the breadboard).
- Pass criterion: only the breakout pin whose label matches the driven host pin goes high; the other seven stay low. A wrong-but-consistent mapping (e.g. rows swapped, or the whole header mirrored) shows up here as a pattern and means the layout orientation or label placement is wrong — that is a design/layout defect, not a rework item.
- Record the 8x8 observation as a diagonal matrix in the bench record; any off-diagonal high is a fail.
- Repeat with the walking bit inverted (walking zero, others high) to catch stuck-high faults the walking-one misses.
D. Loaded-level and loopback checks (host + breadboard)#
- Load one driven-high B pin with 3.3 kΩ to GND on the breadboard: expect ~3.20 V at the breakout pin (Section 7). Significantly lower suggests extra series resistance (bad header/breadboard contact) — reseat and remeasure before blaming the board.
- Loopback: jumper B1 to B2 on the breadboard; drive P1 from the host and read P2 as an input. The path is 200 Ω total — logic levels are unaffected at input-leakage currents. Walk the loopback across pairs (B3–B4, B7–B8, B9–B10) to exercise every line in both directions.
- This loopback plus the walking-one is the full functional coverage of a passive adapter; there is nothing else to test functionally.
E. Optional signal-quality characterization (scope)#
Not a pass/fail gate — a calibration of expectations for the lab line's documentation.
- Drive a 1 MHz square wave on one line; scope at the breakout pin and at the far end of a typical breadboard run. Record rise time and overshoot.
- Increase frequency until edges are visibly unusable; record the ceiling. Expect trouble in the low-MHz region (Section 2); publish the measured number in the lab-line docs rather than the estimate.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| One matrix path open | Ohms across the corresponding R pads directly | Cracked 0603 joint, missing resistor, header pin not soldered |
| One matrix path < 90 Ω | Ohms across the R pads; inspect for bridge | Solder bridge across the resistor (restores unprotected connection — must fix) |
| Path reads ~100 Ω unplugged but odd in-circuit | Retest unplugged | Host clamp diodes / host 200 Ω network in the reading — normal, not a board fault |
| Adjacent pair shows continuity (other than 5–11, 6–12) | Inspect header solder under magnification | Bridge between 100 mil pins, or a net error (check the schematic before reworking) |
| 3V3-to-GND not open | Isolate by removing from host; inspect | Solder bridge; nothing on this netlist legitimately joins the rails |
| Walking-one lights the wrong label | Map the full 8x8 pattern | Consistent pattern: layout orientation/label placement error (design defect); single pin: bridge or wrong net on that pad |
| Walking-one lights two pins | Adjacent-pair scan on those two | Bridge between neighboring signals |
| Driven-high pin reads low under light load | Measure across the series R while loaded | Extra series resistance: breadboard contact, header seating — 100 mV per mA is the board's legitimate share |
| Board works but resistor runs hot | Find the DC fault current path | A standing miswire on the breadboard (33 mA class fault); fix the wiring — the resistor is over its rating in sustained faults |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Host context (FPGA board, PMOD port, bitstream ID) | |
| DMM model and ohms-mode verification on a known 100 Ω | |
| Measured host 3V3 rail | |
| Continuity matrix (12 rows) result | |
| Adjacent-pair scan (16 pairs) result | |
| R1–R8 measured values (unplugged) | |
| Walking-one 8x8 matrix (diagonal expected) | |
| Walking-zero repeat result | |
| Loaded-level and loopback results | |
| Optional edge-rate / frequency-ceiling capture paths | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The design does exactly what a trivial board should: one resistor per signal, straight power pass-through, and a naming scheme (Bn = PMOD pin n, labels = net names) that makes the netlist self-documenting and the bench tests almost mechanical. The README and generate_design.py agree with each other on every net, value, and reference designator. The 100 Ω choice is a sound survivability compromise: it caps miswire current at 33 mA while costing only 100 mV per mA of legitimate load.
The open risks are real, though. No PCB layout exists, and for this board the layout is most of the remaining design: silkscreen-label-to-net correctness, connector orientation against the spec's mirrored numbering, and the 0.3" DIP row spacing are all unverified and are the only ways this board can meaningfully fail. The checked-in ERC report predates the current schematic file and must be re-run. The sustained-fault dissipation (~109 mW) slightly exceeds the chosen 0603's 100 mW rating — acceptable for transient miswires, worth revisiting (0805) at layout. The pin-header MPN is still TBD, and every expected value in this guide is calculated from the netlist and the Pmod specification rather than measured on hardware, because no hardware exists.