Comms modules
AXC-002 — LAN8720A RMII Ethernet PHY dual-PMOD module
Catalog #2 in the AruviX comms line, level L5 (RMII, 50 MHz). The fabric flagship of the W5500/LAN8720 paired lesson: a bare 10/100 PHY, so the MAC, ARP, ICMP, and UDP live in the FPGA — then a real network stack in AruviOS. Same Hanrun HR911105A MagJack as AXC-001 to amortize RJ45 sourcing.
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 | TX center-tap decoupling (place at J2 TCT) | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C2 |
100nF 16V X7R | RX center-tap decoupling (place at J2 RCT) | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C3 |
100nF 16V X7R | VDDIO decoupling | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C4 |
1uF 10V X7R | VDDCR (internal 1.2V regulator) 1uF per datasheet | GRM188R71A105KA61DMurata |
C_0603_1608Metric |
C5 |
470pF 50V C0G | VDDCR 470pF per datasheet | GRM1885C1H471JA01DMurata |
C_0603_1608Metric |
C6 |
100nF 16V X7R | VDD1A decoupling | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C7 |
100nF 16V X7R | VDD2A decoupling | GRM188R71C104KA01DMurata |
C_0603_1608Metric |
C8 |
10uF 10V X5R | Digital rail bulk | GRM21BR61A106KE19LMurata |
C_0805_2012Metric |
C9 |
10uF 10V X5R | Analog rail bulk | GRM21BR61A106KE19LMurata |
C_0805_2012Metric |
FB1 |
120R@100MHz | 3V3 -> 3V3A analog-rail isolation bead | BLM18AG121SN1DMurata |
L_0603_1608Metric |
J1 |
PMOD A: RMII DATA | PMOD peripheral plug (Digilent spec 1.2) | not selected generic |
PinHeader_2x06_P2.54mm_Horizontal |
J2 |
HR911105A | RJ45 MagJack, integrated 10/100 magnetics + LEDs (LEDs unused here) | HR911105AHanrun Datasheet ↗ |
RJ45_Hanrun_HR911105A_Horizontal |
J3 |
PMOD B: MGMT/CLK | PMOD peripheral plug (Digilent spec 1.2) | not selected generic |
PinHeader_2x06_P2.54mm_Horizontal |
JP1 |
REF_CLK SOURCE | 1-2 (default): host 50 MHz from J3.2 -> XTAL1/CLKIN; 2-3: on-board oscillator | — | SolderJumper-3_P1.3mm_Bridged12_RoundedPad1.0x1.5mm |
R1 |
49.9R 1% | TX+ 49.9R 1% line pull-up (current-mode MDI termination) | RC0603FR-0749R9LYageo Datasheet ↗ |
R_0603_1608Metric |
R2 |
49.9R 1% | TX- 49.9R 1% line pull-up | RC0603FR-0749R9LYageo Datasheet ↗ |
R_0603_1608Metric |
R3 |
49.9R 1% | RX+ 49.9R 1% line pull-up | RC0603FR-0749R9LYageo Datasheet ↗ |
R_0603_1608Metric |
R4 |
49.9R 1% | RX- 49.9R 1% line pull-up | RC0603FR-0749R9LYageo Datasheet ↗ |
R_0603_1608Metric |
R5 |
12.1k 1% | RBIAS: exact 12.1k 1% to GND per datasheet | RC0603FR-0712K1LYageo Datasheet ↗ |
R_0603_1608Metric |
R6 |
10k | MODE0 strap high (with R7/R8: MODE=111, all-capable autoneg) | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R7 |
10k | MODE1 strap high | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R8 |
10k | MODE2 strap high | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R9 |
10k | PHYAD0 strap low: PHY address 0 | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R10 |
10k | nINTSEL strap high: pin 14 is ~INT (not REFCLKO) | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R11 |
10k | REGOFF strap low: internal 1.2V regulator enabled | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R12 |
1.5k | MDIO bus pull-up (1.5k per LAN8720A datasheet) | RC0603FR-071K5LYageo Datasheet ↗ |
R_0603_1608Metric |
R13 |
10k | ~RST idle pull-up | RC0603FR-0710KLYageo Datasheet ↗ |
R_0603_1608Metric |
R14 |
100R | Series protection on the PHY-driven RXD0 line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R15 |
100R | Series protection on the PHY-driven RXD1 line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R16 |
100R | Series protection on the PHY-driven CRS_DV line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R17 |
100R | Series protection on the PHY-driven RXER line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R18 |
100R | Series protection on the PHY-driven ~INT line | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
R19 |
100R DNP | Oscillator-to-host feed for JP1 2-3 mode; fit together with U2 | RC0603FR-07100RLYageo Datasheet ↗ |
R_0603_1608Metric |
U1 |
LAN8720A | 10/100 Ethernet PHY, RMII, VQFN-24 | LAN8720A-CP-TRMicrochip Datasheet ↗ |
VQFN-24-1EP_4x4mm_P0.5mm_EP2.5x2.5mm_ThermalVias |
U2 |
50MHz OSC (DNP) DNP | 50 MHz 3.3 V CMOS oscillator, 3.2x2.5 mm; fit only for JP1 2-3 mode | not selected Abracon Datasheet ↗ |
Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mm |
Signals#
Net labels used in the schematic, which are also the names the HDL top level should use.
3V3 3V3A CRS_DV GND INT_N MDC MDIO NINTSEL OSC_OUT PHY_CLKIN PHY_CRS_DV PHY_INT_N PHY_RXD0 PHY_RXD1 PHY_RXER RBIAS REF_CLK REGOFF RST_N RXD0 RXD1 RXN RXP RX_ER TXD0 TXD1 TXN TXP TX_EN VDDCR
Production status#
| Schematic ERC | 0 violations |
|---|---|
| PCB layout | complete |
| DRC | not run |
| Fab package | not exported |
| Fabricated | no — design stage only |
Source: boards/comms-modules/axc-002-ethernet-phy
Catalog #2 in the AruviX comms line (../README.md), level L5 (RMII, 50 MHz). The fabric flagship of the W5500/LAN8720 paired lesson: a bare 10/100 PHY, so the MAC, ARP, ICMP, and UDP live in the FPGA — then a real network stack in AruviOS. Same Hanrun HR911105A MagJack as AXC-001 to amortize RJ45 sourcing.
Status: schematic generated, ERC clean (0/0), netlist reviewed. PCB layout not started. Not released.
What it teaches#
rmii_mac (tx/rx + CRC32) in fabric, MDIO management frames, clocking discipline at 50 MHz, and the fabric-ping graduation exercise (answer ICMP echo entirely in Verilog). Uses the same upper-layer interfaces as AXC-001 so students can swap controllers.
Design#
- Dual PMOD on 0.9 in centers (Digilent spec 1.2.0): J1 = RMII data (TXD0/TXD1/TX_EN host→PHY direct; RXD0/RXD1/CRS_DV/RX_ER PHY→host via 100 Ω), J3 = MDIO (1.5 kΩ pull-up per datasheet), REF_CLK, ~INT (100 Ω), ~RST (10 k pull-up).
- REF_CLK topology (line README open decision, resolved as the solder jumper): JP1 1-2 (default) = host FPGA PLL drives 50 MHz on J3 pin 2 into XTAL1/CLKIN; JP1 2-3 = on-board 50 MHz oscillator (Abracon ASE 3225, DNP) drives XTAL1 and, through R19 (100 Ω, DNP, fit with U2), J3 pin 2 so the host can slave. J3 pin 2 must be a clock-capable host pin.
- Straps, all 10 k per the LAN8720A datasheet/schematic checklist: MODE[2:0] high (all-capable auto-negotiation), PHYAD0 low (address 0), nINTSEL high (pin 14 = ~INT, not REFCLKO), REGOFF low (internal 1.2 V regulator on). Strap levels latch on the ~RST rising edge.
- RBIAS 12.1 kΩ 1 % to GND; VDDCR 1 µF + 470 pF (datasheet values).
- MDI: 49.9 Ω 1 % pull-ups to 3V3A on all four lines; both MagJack center taps tied to 3V3A with 100 nF decoupling at the taps (EVB8720 pattern).
- Jack LEDs left unconnected: LAN8720A LED1/LED2 double as REGOFF/nINTSEL straps and LED wiring would fight the chosen strap levels (classic LAN8720 gotcha, documented on the schematic).
- 3V3 → 3V3A ferrite bead; RMII sampled at 50 MHz — prefer the host's high-speed (no series-R) PMOD socket if fitted.
| J1 (PMOD A) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | TXD0 | TXD1 | TX_EN | RXD0 | GND | 3V3 | RXD1 | CRS_DV | RX_ER | MDC | GND | 3V3 |
| J3 (PMOD B) | 1 | 2 | 3 | 4 | 5 | 6 | 7–10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|
| Net | MDIO | REF_CLK | ~INT | ~RST | GND | 3V3 | NC | GND | 3V3 |
Regenerate#
python3 generate_design.py
Remaining for release#
- [ ] PCB layout (dual plugs on exact 0.9 in centers, 50 MHz clock route, MDI pairs matched), DRC, fab outputs
- [ ] Pin the DNP oscillator MPN (ASE-50.000MHZ class)
- [ ]
hdl/:rmii_mac+arp_icmp_udpcores, packet-level golden-model testbenches, ECP5 fabric-ping demo - [ ] BOM export and availability check, design-review checklist