I/O modules
AXO-012 — 4×4 matrix keypad interface PMOD module
Catalog #12 in the AruviX output line, level L2. Interface board for the ubiquitous 8-pin 4×4 membrane keypad (its ribbon plugs into J2).
Circuit review & bench-test guide →
Components#
Every placed component, with the reason it is on the board. Extracted directly from the schematic, so this cannot drift from the design.
| Ref | Value | What it does on this board | Part number | Footprint |
|---|---|---|---|---|
C1 |
100nF 16V X7R | Rail decoupling for the pull-ups / TVS rail clamp | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
D1 |
CDSOT236-0504C DNP | 4-channel ESD/TVS array on the keypad-side ROW lines (fit for harsh ESD) | CDSOT236-0504CBourns Datasheet ↗ |
SOT-23-6 |
D2 |
CDSOT236-0504C DNP | 4-channel ESD/TVS array on the keypad-side COL lines (fit for harsh ESD) | CDSOT236-0504CBourns Datasheet ↗ |
SOT-23-6 |
J1 |
PMOD PLUG 2x6 | PMOD peripheral plug (Digilent spec 1.2) | not selected generic |
PinHeader_2x06_P2.54mm_Horizontal |
J2 |
KEYPAD 1x8 SOCKET | Socket for the common 8-pin 4x4 membrane keypad ribbon | not selected generic |
PinSocket_1x08_P2.54mm_Vertical |
R1 |
100R | Row 1 series resistor (host-driven; miswire current bound) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R2 |
100R | Row 2 series resistor (host-driven; miswire current bound) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R3 |
100R | Row 3 series resistor (host-driven; miswire current bound) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R4 |
100R | Row 4 series resistor (host-driven; miswire current bound) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R5 |
100R | Column 1 series resistor (keypad-driven read line) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R6 |
100R | Column 2 series resistor (keypad-driven read line) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R7 |
100R | Column 3 series resistor (keypad-driven read line) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R8 |
100R | Column 4 series resistor (keypad-driven read line) | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R9 |
10k | Column 1 pull-up: idle high, pressed key pulls low via the row | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R10 |
10k | Column 2 pull-up: idle high, pressed key pulls low via the row | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R11 |
10k | Column 3 pull-up: idle high, pressed key pulls low via the row | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R12 |
10k | Column 4 pull-up: idle high, pressed key pulls low via the row | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
Signals#
Net labels used in the schematic, which are also the names the HDL top level should use.
3V3 COL1 COL1_K COL2 COL2_K COL3 COL3_K COL4 COL4_K GND ROW1 ROW1_K ROW2 ROW2_K ROW3 ROW3_K ROW4 ROW4_K
Production status#
| Schematic ERC | 0 violations |
|---|---|
| PCB layout | complete |
| DRC | 0 violations |
| Fab package | exported (24 gerbers + drill + CPL + BOM) |
| Fabricated | no — design stage only |
Source: boards/io-modules/axo-012-keypad
Catalog #12 in the AruviX output line (../README.md), level L2. Interface board for the ubiquitous 8-pin 4×4 membrane keypad (its ribbon plugs into J2).
Status: schematic generated, ERC clean (0/0), netlist reviewed. PCB layout not started. Not released.
What it teaches#
Matrix scanning (keypad_scan HDL core): drive one row low at a time, read the four pulled-up columns — a low column identifies the key at (row, col). Rotate at ~1 kHz; debounce in fabric by reusing the sensor-line debounce core (membrane domes bounce for milliseconds; the line rule is HDL debounce, not RC-only). Ghosting/rollover limits of a diode-less matrix are part of the lesson.
Design#
- J2 = 1×08 pin socket, common membrane pinout: pins 1–4 = ROW1–4, 5–8 = COL1–4 (pin 1 leftmost with the keypad face up).
- 100 Ω series resistors on ALL 8 lines, not just the module-driven columns: the ribbon is unkeyed, so a shifted or reversed plug-in can connect a host-driven row output to another driven line — 100 Ω both ways bounds any miswire current (documented on the schematic).
- 10 k pull-ups on the four column (read) lines, keypad side.
- ESD arrays, DNP: the catalog allowed a skip, but a stock 4-channel TVS array does exist —
Power_Protection:CDSOT236-0504C(Bourns, SRV05-4 family, SOT-23-6, stock footprint). Two are placed DNP (D1 rows, D2 columns) on the keypad side; fit them for a harsh-ESD classroom build.
PMOD pin map (Type 1 GPIO)#
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | ROW1 | ROW2 | ROW3 | ROW4 | GND | 3V3 | COL1 | COL2 | COL3 | COL4 | GND | 3V3 |
Rows = host outputs (one low at a time); columns = host inputs (idle high).
Regenerate#
python3 generate_design.py
Remaining for release#
- [ ] PCB layout (J2 at the board edge for the ribbon, silkscreen ROW/COL map), DRC, fab outputs
- [ ]
hdl/: instantiatekeypad_scan+debounce, keycode demo - [ ] BOM export and availability check, design-review checklist