Circuit review & bench-test guide
AXS-001 — Button & switch pack PMOD module
Document purpose#
This document explains the axs-001-buttons PMOD module at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the authoritative generator script (generate_design.py), the generated schematic, the README, and the ERC report in this directory.
This board has never been fabricated. Its status is schematic-only: ERC clean (0 errors, 0 warnings), netlist reviewed, PCB layout not started, not released. Every voltage, current, and timing number below is a design target to verify on a future first article, not a proven measurement.
1. What the board does#
The board is a passive input pack for the AruviX sensor line (catalog #1, level L1, GPIO). Four tactile buttons drive PMOD pins 1–4 active low (10 kΩ pull-up to 3V3, button shorts the node to GND), and one SPDT slide switch drives PMOD pin 7 with a rail level (3V3 or GND) selected by its position. There is deliberately no hardware debouncing: observing and debouncing contact bounce in FPGA fabric is the point of the module. Every module-driven line leaves through a 100 Ω series resistor (the line-wide miswire-tolerance rule).
There are no active devices, no regulators, and no protection diodes. The module consumes essentially zero current until a button is held.
Functional block diagram#
3V3 (PMOD 6/12)
│
├── R1 10k ──┬── BTN1_N ── R5 100R ──> BTN1 (PMOD 1)
│ SW1 (to GND)
├── R2 10k ──┬── BTN2_N ── R6 100R ──> BTN2 (PMOD 2)
│ SW2 (to GND)
├── R3 10k ──┬── BTN3_N ── R7 100R ──> BTN3 (PMOD 3)
│ SW3 (to GND)
├── R4 10k ──┬── BTN4_N ── R8 100R ──> BTN4 (PMOD 4)
│ SW4 (to GND)
│
└──(throw A)─┐
SW5 SPDT ── SLIDE_C ── R9 100R ──> SLIDE (PMOD 7)
GND ─(throw B)─┘
GND (PMOD 5/11)
2. Safety and scope boundaries#
- The module is 3.3 V logic only. Never connect it to a 5 V PMOD-shaped host or a 5 V bench supply; nothing on the board limits rail voltage.
- In standalone testing, use a current-limited bench supply (3.3 V, limit 50 mA or less). A wiring mistake into VCC/GND pins is otherwise unlimited.
- The host FPGA pins connected to BTN1–BTN4 and SLIDE must be configured as inputs. If a host output fights a pressed button or the slide switch, only the 100 Ω series resistor (about 33 mA at 3.3 V) limits the contention current. That resistor is a miswire mitigation, not an invitation.
- SW5 is assumed non-shorting (break-before-make). Do not treat the brief mid-travel float on SLIDE as a valid logic level.
- This is a prototype for learning. Passing these bench tests is not EMC, ESD, safety, or environmental qualification.
3. Signal and power sequence#
- 3V3 and GND arrive on PMOD pins 6/12 and 5/11 (or the bench supply). There is no local regulation or bulk capacitance; the host rail is used directly.
- With no button pressed, R1–R4 pull BTN1_N–BTN4_N to 3V3. The PMOD lines BTN1–BTN4 read logic 1 through R5–R8 (no DC load, so no drop).
- Pressing SWx shorts BTNx_N to GND. The line falls to about 0 V; the only static current is 3.3 V / 10 kΩ ≈ 0.33 mA through the pull-up.
- On press and release the mechanical contacts bounce for a device- and press-dependent time (typically a few ms; Alps does not publish a bounce spec for this part). The host sees multiple edges — this is expected and is the debouncing lesson.
- SW5's common (SLIDE_C) is tied to 3V3 in one position and GND in the other, so SLIDE always carries a defined level except during the brief non-shorting transition, when the line floats (no pull resistor on SLIDE_C — position, not level, defines the state).
4. Interfaces#
One connector only. PMOD Type 1 (GPIO), Digilent spec 1.2, 2×6 right-angle male plug.
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | BTN1 | BTN2 | BTN3 | BTN4 | GND | 3V3 | SLIDE | NC | NC | NC | GND | 3V3 |
Buttons read 0 when pressed. SLIDE reads the switch position. Pins 8–10 are unconnected. There are no test points in the current schematic; probe the PMOD pins and the resistor pads directly.
5. Component-by-component review#
5.1 Connector#
| Ref. | Part | Function and why needed | If absent/open | If wrong or misassembled |
|---|---|---|---|---|
| J1 | Generic 2×6 right-angle 2.54 mm male header (PMOD plug, MPN TBD) | Sole power and signal interface to the host | No board function | Mirrored/mispinned assembly can put 3V3 on a signal pin or swap GND and 3V3 at the host — buzz the pinout before first plug-in; a cold joint on pin 5/11 (GND) makes all levels float or read high |
5.2 Buttons and slide switch#
| Ref. | Part / datasheet summary | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| SW1–SW4 | Alps Alpine SKQGABE010, 5.2 × 5.2 × 1.5 mm SMD tactile, 50 mA/12 V DC max, 10 µA/1 V DC min, ≤100 mΩ contact, 1.57 N force, 0.25 mm travel, 1M cycles, −40…+90 °C | Shorts BTNx_N to GND when pressed; the active-low input source | Channel is stuck at logic 1 (pull-up wins); press has no effect | A stuck-closed or solder-bridged switch holds the line at 0 permanently; a rotated part may connect the wrong pin pair (verify the footprint's pin pairing — many 4-pad tactiles have internally paired pins) |
| SW5 | C&K JS102011SAQN, JS-series subminiature SPDT slide, 0.3 A/6 V DC rating, ≤70 mΩ contact, 5k cycles at full rating, positive detent, SMD reflow-capable | Selects whether SLIDE_C is tied to 3V3 or GND, giving a static level input | SLIDE floats and reads an undefined level (no pull resistor on this net by design) | Pins 1/3 swapped inverts the position-to-level mapping (annoying, not damaging); a bridge across the throws shorts 3V3 to GND through ≤70 mΩ — this is the one solder defect on this board that directly shorts the rail |
5.3 Resistors#
| Refs. | Value / part | Function and why needed | If absent/open | If wrong value or shorted |
|---|---|---|---|---|
| R1–R4 | 10 kΩ 0603, Yageo RC0603FR-0710KL | Pull-up making each button channel active-low with a defined idle level; sets the 0.33 mA pressed current | BTNx_N floats when the button is up: the line reads erratic/EMI-driven levels and the host sees phantom presses | Too small (e.g. 100 Ω by reel mix-up) burns 33 mA per pressed button and may exceed the switch's 50 mA rating margin under transients; too large (1 MΩ) makes the node slow and noise-prone; a shorted pull-up ties the line hard to 3V3 so presses drive 3.3 V across 10 k∥switch — line never reads low |
| R5–R8 | 100 Ω 0603, Yageo RC0603FR-07100RL | Series protection between BTNx_N and the PMOD line; limits contention current to ~33 mA if the host mistakenly drives the line | Channel is open: line floats at the host regardless of button state (reads stuck or erratic) | A wrong high value (10 k by mix-up) forms a divider with the host input and slows edges but usually still works — measure to catch it; shorted (0 Ω) removes miswire protection only, normal function unchanged |
| R9 | 100 Ω 0603, Yageo RC0603FR-07100RL | Same series-protection rule on the slide line; limits host-vs-switch contention to ~33 mA | SLIDE floats at the host in both switch positions | Same failure modes as R5–R8; note a host output fighting SW5 sees a hard rail through 100 Ω, so sustained contention dissipates ~0.11 W in a resistor rated for less — do not leave a misconfigured host connected |
(#FLG01/#FLG02 in the schematic are ERC power flags, not physical parts.)
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts | Board-specific interpretation |
|---|---|---|
| Alps SKQGABE010 | 50 mA/12 V DC max, 10 µA/1 V DC minimum rating, ≤100 mΩ initial contact resistance, 1.57 N operating force, 0.25 mm travel, 1,000,000 cycles, −40…+90 °C, 250 V AC dielectric | The 0.33 mA/3.3 V switched load sits comfortably between the min and max contact ratings, which matters for long-term contact reliability. Alps publishes no bounce-time figure: capture actual bounce on a scope per unit rather than assuming a number. 100 mΩ contact resistance is negligible against 10 kΩ (pressed level within microvolts of GND) |
| C&K JS102011SAQN | SPDT on-on, 0.3 A/6 V DC contact rating, ≤70 mΩ contact resistance, 5,000 cycles at full rating, positive detent, reflow to 260 °C | Static load is zero (the common only feeds a high-impedance input through R9), so the switch operates far below rating and life should exceed the 5k-cycle full-load figure. Slide switches also bounce and can scrub between contacts — expect a messier transition than the buttons, plus a genuine floating interval (non-shorting) |
| Yageo RC0603 series | General-purpose thick film, 1%, 0.1 W at 70 °C | 10 k pull-ups dissipate ~1 mW pressed. The 100 Ω parts dissipate ~0.11 W in a sustained 33 mA contention fault — slightly above the 0.1 W rating, acceptable as short-term miswire protection but not as a permanent operating mode |
Official references: Alps SKQGABE010 product page, C&K JS-series datasheet (C&K is now Littelfuse; the URL redirects to the current hosting), Yageo RC thick-film series. Check the latest revision before procurement.
7. Expected values before bench testing#
All values are calculated targets — no board has ever been built or measured.
| Quantity | Design target | What to measure |
|---|---|---|
| Idle current, nothing pressed | ≈ 0 (leakage only) | Bench supply current readout |
| Current per held button | 3.3 V / 10 kΩ ≈ 0.33 mA | Supply current step when pressing |
| All four buttons held | ≈ 1.32 mA | Supply current |
| BTNx released (idle level) | 3.30 V (within mV of rail; no DC load) | DMM on PMOD pin 1–4 |
| BTNx pressed | < 5 mV above GND (contact ≤100 mΩ vs 10 kΩ) | DMM on PMOD pin, button held |
| SLIDE, position "3V3" | 3.30 V | DMM on PMOD pin 7 |
| SLIDE, position "GND" | < 5 mV | DMM on PMOD pin 7 |
| SLIDE mid-travel | floating (undefined; brief) | Scope, slow sweep during actuation |
| Contact bounce duration | not specified by Alps; typically ≤ ~5 ms, unit-dependent | Scope single-shot on press and release edges |
| Resistance PMOD pin to 3V3, button up | ≈ 10.1 kΩ (R pull-up + R series) | Ohmmeter, board unpowered |
| Resistance PMOD pin to GND, button held | ≈ 100 Ω (R series + contact) | Ohmmeter, board unpowered |
| 3V3-to-GND resistance | open (> MΩ), both SW5 positions | Ohmmeter before first power |
8. Manual schematic and assembly review checklist#
- Verify J1 pin 1 location and that the plug orientation matches the PMOD spec (pin 1 top-left when mated); buzz all 12 pins from pad to host socket.
- Confirm 3V3 is not shorted to GND with SW5 in both positions before first power (a throw-side bridge only shows in one position).
- Confirm the tactile footprint pin pairing: SKQG parts have two pins per side internally connected — a wrong library pairing makes the switch a permanent short or a permanent open. Buzz each SWx pad pair pressed and released.
- Measure R1–R4 = 10 kΩ and R5–R9 = 100 Ω in circuit (values are distinct enough to catch a reel swap).
- Confirm no pull resistor was "helpfully" added to SLIDE_C and no debounce capacitor was added anywhere — both would defeat the module's purpose.
- Inspect SW5 throws for solder bridging (rail-to-rail risk) and SW1–SW4 for skewed placement that could jam the actuator.
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, equipment, and operator. Phases A–C are standalone (bench supply); phase D repeats the functional checks on a real PMOD host.
A. Unpowered inspection and resistance tests#
- Complete the section 8 checklist under magnification.
- Ohmmeter 3V3-to-GND: expect open. Repeat with SW5 in the other position.
- For each button channel: PMOD pin to 3V3 ≈ 10.1 kΩ released; PMOD pin to GND ≈ 100 Ω held. Verify pin N responds to switch N only (no crosstalk from solder bridges between adjacent channels).
- PMOD pin 7 to 3V3 ≈ 100 Ω in one SW5 position, pin 7 to GND ≈ 100 Ω in the other, never both.
B. Standalone power-up (current-limited bench supply)#
- Set a bench supply to 3.30 V with the current limit at 50 mA. Connect + to PMOD pins 6/12 and − to pins 5/11 (use both pin pairs if the harness allows; they are commoned on the module).
- Power on with nothing pressed: supply current should read ≈ 0 mA (below the resolution of most bench supplies). Any mA-scale idle current means a short or wrong resistor — power down and investigate.
- DMM each line: BTN1–BTN4 = 3.30 V, SLIDE = rail level matching position.
- Press each button in turn: its line falls to < 5 mV and supply current steps up by ≈ 0.33 mA. Hold all four: ≈ 1.32 mA total. Release: levels and current return.
- Toggle SW5 both ways several times; pin 7 alternates cleanly between 3.30 V and < 5 mV.
C. Standalone dynamic tests (scope)#
- Scope on a BTNx PMOD pin, 1 V/div, single-shot trigger on falling edge, 1 ms/div. Press the button: capture the press bounce burst. Measure the time from first falling edge to the last transition — this is the number your fabric debouncer must exceed. Repeat on the rising (release) edge, which often bounces differently.
- Repeat for all four buttons and several press speeds/angles; record the worst-case bounce duration per switch. Expect unit-to-unit and press-to-press variation; Alps specifies no maximum.
- Scope SLIDE during slow actuation: expect a defined level, a brief noisy /floating interval (non-shorting transition), then the opposite level. Confirm no simultaneous-rails behavior (that would be a shorting or bridged switch).
- Optional miswire-rule check (bench supply still current-limited): with a button held, source 3.3 V through an ammeter into that BTN pin. Expect ≈ 33 mA limited by the 100 Ω series resistor. Keep it brief — this dissipates ~0.11 W in an 0.1 W part.
D. PMOD host context (host provides 3.3 V)#
- Plug into the FPGA host PMOD socket. Confirm host pins for BTN1–BTN4 and SLIDE are constrained as inputs (with host pull-ups disabled, so the module's 10 k pull-ups are the only ones — a host pull-down would form a divider) before configuring the bitstream.
- Repeat the section B functional sweep reading levels at the host socket pins (or via a simple fabric design that mirrors inputs to LEDs).
- Run the raw-input demo: confirm each button and the slide maps to the expected PMOD pin per the section 4 table.
- Run the edge-detection exercise without a debouncer and count events per press — multiple counts per press confirm bounce reaches the fabric. Then enable the debouncer sized from the phase C measurement and confirm exactly one event per press and one per release.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Line stuck high, press ignored | Ohm PMOD pin to GND while held | SWx open/cold joint, R5–R8 open, wrong footprint pin pairing |
| Line stuck low | Ohm BTNx_N to GND released | SWx stuck/bridged, R1–R4 open (floats can read low at some hosts) |
| Idle current mA-scale | 3V3–GND resistance, per-channel isolation | SW5 throw bridge, wrong (low) pull-up value, solder bridge |
| Pressed level not near 0 V | Voltage across R5–R8 while held | Host driving the line (should be input), unexpected host pull-down |
| Two lines respond to one button | Ohm adjacent BTNx_N nodes | Solder bridge between channels |
| SLIDE erratic in a detent | Scope pin 7, wiggle switch | SW5 joint cracked, R9 open (floating line) |
| SLIDE inverted vs. legend | Ohm SLIDE_C to each rail per position | SW5 rotated/throws swapped — document or rework |
| Works standalone, not in host | Host constraints, host pull settings | Pin mapping error, host pull-down fighting pull-up, host pin driven as output |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Assembly checklist result (section 8) | |
| Bench supply / DMM / scope IDs and calibration | |
| Unpowered resistance results (A) | |
| Idle and per-button current (B) | |
| Static levels, all channels and both SW5 positions (B) | |
| Worst-case bounce per switch, press and release (C) | |
| SLIDE transition capture (C) | |
| Miswire-current check result, if run (C) | |
| Host used, constraint file hash, host-context results (D) | |
| Deviations, photos, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The design is intentionally minimal and internally consistent: active-low buttons with defined idle levels, a rail-tied slide switch so SLIDE is never statically floating, and a uniform 100 Ω series-resistor rule that bounds host-miswire current at ~33 mA. Deliberate omissions — no debounce network, no pull on SLIDE_C, no rail protection — are documented lessons, not oversights, but they define the board's limits: it must only ever meet a 3.3 V input-configured host. The principal open risks are that nothing has ever been fabricated or measured, that switch footprint pin-pairing errors are the most likely silent build fault, and that a solder bridge across SW5's throws is the only single defect that directly shorts the host rail. Bounce duration is unspecified by the switch vendor and must be characterized per unit on the bench before the fabric debouncer constant is declared adequate.