Lab modules
AXL-009 — GPIO expander lab PMOD module (MCP23017)
Catalog #9 in the AruviX lab line, level L3. The I2C register-map lesson with instantly visible results — and pin multiplication for big projects (16 IO for 2 PMOD data pins).
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 | U1 decoupling | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C2 |
10uF 10V X5R | Module bulk (8 LEDs switching) | GRM21BR61A106KE19LMurata |
C_0805_2012Metric |
D1 |
GREEN | GPA0 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D2 |
GREEN | GPA1 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D3 |
GREEN | GPA2 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D4 |
GREEN | GPA3 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D5 |
GREEN | GPA4 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D6 |
GREEN | GPA5 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D7 |
GREEN | GPA6 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
D8 |
GREEN | GPA7 indicator LED | APT1608SGCKingbright Datasheet ↗ |
LED_0603_1608Metric |
J1 |
PMOD PLUG 2x6 | PMOD peripheral plug (Digilent spec 1.2) | not selected generic |
PinHeader_2x06_P2.54mm_Horizontal |
JP1 |
SDA PULL-UP | Cut to remove the SDA pull-up when chaining modules | — | SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm |
JP2 |
SCL PULL-UP | Cut to remove the SCL pull-up when chaining modules | — | SolderJumper-2_P1.3mm_Bridged_RoundedPad1.0x1.5mm |
JP3 |
ADDR 0x20/0x21 | I2C address: 1-2 A0 low 0x20 (default), 2-3 A0 high 0x21 (A1/A2 fixed low) | — | SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mm |
R1 |
330R | Ballast for the GPA0 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R2 |
330R | Ballast for the GPA1 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R3 |
330R | Ballast for the GPA2 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R4 |
330R | Ballast for the GPA3 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R5 |
330R | Ballast for the GPA4 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R6 |
330R | Ballast for the GPA5 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R7 |
330R | Ballast for the GPA6 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R8 |
330R | Ballast for the GPA7 LED (~5 mA at 3.3 V) | RC0603FR-07330RLYageo Datasheet ↗ |
R_0603_1608Metric |
R9 |
4.7k | I2C SDA pull-up | RC0603FR-074K7LYageo Datasheet ↗ |
R_0603_1608Metric |
R10 |
4.7k | I2C SCL pull-up | RC0603FR-074K7LYageo Datasheet ↗ |
R_0603_1608Metric |
R11 |
10k | INTA pull-up (configure IOCON open-drain; line rule for open-drain outputs) | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R12 |
100R | Series protection on the module-driven INTA line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R13 |
10k | INTB pull-up | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R14 |
100R | Series protection on the module-driven INTB line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R15 |
10k | ~RESET pull-up: expander always out of reset (no host reset line) | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
SW1 |
SKQG 5.2mm | GPB0 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW2 |
SKQG 5.2mm | GPB1 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW3 |
SKQG 5.2mm | GPB2 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW4 |
SKQG 5.2mm | GPB3 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW5 |
SKQG 5.2mm | GPB4 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW6 |
SKQG 5.2mm | GPB5 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW7 |
SKQG 5.2mm | GPB6 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
SW8 |
SKQG 5.2mm | GPB7 tactile button (active low, internal pull-up) | SKQGABE010Alps Alpine Datasheet ↗ |
SW_SPST_SKQG_WithoutStem |
U1 |
MCP23017-E/SS | 16-bit I2C GPIO expander with interrupts, SSOP-28 | MCP23017-E/SSMicrochip Datasheet ↗ |
SSOP-28_5.3x10.2mm_P0.65mm |
Signals#
Net labels used in the schematic, which are also the names the HDL top level should use.
3V3 ADDR0 EXP_INTA EXP_INTB GND GPA0 GPA1 GPA2 GPA3 GPA4 GPA5 GPA6 GPA7 GPB0 GPB1 GPB2 GPB3 GPB4 GPB5 GPB6 GPB7 INTA INTB LED0_A LED1_A LED2_A LED3_A LED4_A LED5_A LED6_A LED7_A RESET_N SCL SCL_PU SDA SDA_PU
Production status#
| Schematic ERC | 0 violations |
|---|---|
| PCB layout | not started |
| DRC | not run |
| Fab package | not exported |
| Fabricated | no — design stage only |
Source: boards/lab-modules/axl-009-gpio-expander
Catalog #9 in the AruviX lab line (../README.md), level L3. The I2C register-map lesson with instantly visible results — and pin multiplication for big projects (16 IO for 2 PMOD data pins).
Status: schematic generated, ERC clean (0/0), netlist reviewed. PCB layout not started. Not released.
What it teaches#
The canonical register-map pattern: IODIR (direction), GPPU (internal ~100 kΩ pull-ups), GPIO (read), OLAT (write) — twice, once per port. Write IODIRA=0x00, walk OLATA, watch the LED bar; write GPPUB=0xFF, read GPIOB, see buttons active-low with no external resistors (the internal-pull-up lesson). Then IOCON/INTCON/GPINTEN for interrupt-on-change out of INTA/INTB.
Design#
- MCP23017-E/SS (
Interface_Expansion:MCP23017x-x-SS, SSOP-28 stock footprint). - GPA0–7 → 330 Ω → green LED (0603, APT1608SGC) → GND: ~5 mA each.
- GPB0–7 → tactile button (Alps SKQGABE010, proven MPN) directly to GND; the chip's internal pull-ups replace external resistors (enable
GPPUB— documented on the schematic). - INTA → PMOD 1, INTB → PMOD 2, each with 10 kΩ pull-up + 100 Ω series: configure IOCON for open-drain (or active-low push-pull); the pull-up satisfies the line's open-drain rule either way.
- I2C on PMOD 3/4 (repeat 9/10), standard 4.7 kΩ pull-ups behind JP1/JP2.
- Address: A0 on solder jumper JP3 (GND/VDD → 0x20/0x21 default 0x20), A1/A2 tied to GND.
- ~RESET: 10 kΩ pull-up only (no host reset line).
| PMOD pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | INTA | INTB | SCL | SDA | GND | 3V3 | NC | NC | SCL | SDA | GND | 3V3 |
Regenerate#
python3 generate_design.py
Remaining for release#
- [ ] PCB layout (LED bar and button row on the outline edges), DRC, fab
- [ ]
hdl/: I2C master + register-map lab, testbench - [ ] BOM export and availability check, design-review checklist