← AXO-012

Circuit review & bench-test guide

AXO-012 — 4×4 matrix keypad interface PMOD module

Design-stage — board not yet fabricated

Document purpose#

Component-level explanation and bench-test plan for the axo-012-keypad interface, from generate_design.py, the module README.md, and the CDSOT236-0504C (SRV05-4 family) TVS-array datasheet. Never fabricated; all values are targets. The 4×4 membrane keypad plugs into J2 — its ribbon order is verified before use (Section 4a).

1. What the board does#

An interface for the ubiquitous 8-pin 4×4 membrane keypad: 4 row drives + 4 column reads brought to the PMOD, each with a 100 Ω series resistor, columns pulled up, and DNP TVS arrays for optional ESD hardening. Scanning happens in FPGA fabric (keypad_scan core).

PMOD J1 ROW1-4 ──> 100R ──> J2 rows ── [membrane] ── J2 cols ──> 100R ──> J1 COL1-4
                                              cols also <── 10k pull-ups to 3V3
                        D1 (rows) / D2 (cols): CDSOT236 TVS arrays, DNP

2. Safety and scope boundaries#

4. Interfaces#

4a. PLUG-IN VERIFICATION#

The 8-pin membrane ribbon is unkeyed and its row/column order varies by supplier. A shifted or reversed plug maps keys wrongly (harmless, just confusing) but can also tie a driven row to a column. Before relying on the map:

  1. With the keypad unplugged, ohm out the keypad itself: pressing key "1" shorts its row-1 pin to its col-1 pin. Build the actual pin→(row,col) table.
  2. Compare to J2's silkscreen labels; note any offset in your HDL constants rather than forcing the ribbon.

5. Component-by-component review#

6. Datasheet summary (CDSOT236-0504C / SRV05-4)#

7. Expected values before bench testing#

8. Manual review checklist#

9. Ordered bench-test procedure#

A. Unpowered: ohm the keypad to build its true map (Section 4a). Buzz J2 → 100 Ω → J1 for all 8 lines. Confirm 10 k from each column net to 3V3.

B. Power, idle: 3.3 V. All four column PMOD pins read high; rows follow whatever the host drives.

C. Static scan by hand: drive one row low (others high/hi-Z per your scan scheme), press each key in that row, confirm exactly the expected column drops. Repeat for all four rows → full 16-key map.

D. Scope the scan (with HDL): run keypad_scan at ~1 kHz; scope a row line and a column line. Confirm the row pulses low in sequence and a pressed key pulls its column low only during that row's active window.

E. Ghosting demo: press three keys forming an "L" (same row + same column overlap); observe the phantom fourth key — the diode-less-matrix limitation the lesson teaches. (Populating per-key diodes would remove it; membrane keypads can't.)

F. Debounce check: scope a column on a single press; confirm several ms of bounce — motivating the fabric debounce core.

10. Troubleshooting map#

11. Bench record template#

Board: axo-012  Keypad P/N:____  True map built: [ ]
Idle columns high: [ ]   16-key map correct: [ ]
Bounce duration observed: ____ ms
TVS populated: [ ]
Notes:

12. Review conclusion#

A deliberately minimal board whose engineering content is the "100 Ω on every line because the ribbon is unkeyed" decision and the honest ghosting limitation. No power hazards. Bench work is mostly building the true key map and confirming the scan waveform before it becomes the keypad_scan reference.