← AXC-002

Circuit review & bench-test guide

AXC-002 — LAN8720A RMII Ethernet PHY dual-PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axc-002-ethernet-phy dual-PMOD module at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on generate_design.py, README.md, and the ERC report in reports/.

This board has never been fabricated. Repository status is schematic generated, ERC clean (0 errors / 0 warnings), netlist reviewed; PCB layout not started; not released. There is no PCB, no BOM export, no DRC record, and no first-article bench result. The design was cross-checked against the Microchip LAN8720A schematic checklist and the EVB8720 pattern, but every number below is a target to verify against real hardware, not a proven result.

1. What the board does#

The board is the fabric flagship of the W5500/LAN8720 paired lesson: a bare Microchip LAN8720A 10/100 PHY on RMII (50 MHz), so the MAC, ARP, ICMP, and UDP live in the FPGA. It spans two adjacent PMOD sockets on 0.9-inch centers: J1 carries the RMII data group, J3 carries MDIO/MDC-adjacent management, REF_CLK, ~INT, and ~RST. The same Hanrun HR911105A MagJack as AXC-001 carries the MDI side. A solder jumper (JP1) selects the REF_CLK topology: host-PLL-driven (default) or on-board 50 MHz oscillator (DNP).

Functional block diagram#

PMOD host (3.3 V)              Module                            Network
┌───────────────────┐   ┌───────────────────────────────┐   ┌─────────────┐
│ J1: TXD0/1, TX_EN─┼──>│ direct        U1 LAN8720A TX±─┼──>│ J2          │
│ J1: RXD0/1,CRS_DV,│<──┼─100Ω (R14–17)─ (RMII PHY) RX±<┼───│ HR911105A   │
│     RX_ER         │   │                               │   │ (center taps│
│ J1: MDC ──────────┼──>│ MDC     straps R6–R11 (10k)   │   │  → 3V3A +   │
│ J3.1 MDIO <──────>┼───│ MDIO (R12 1.5k PU)            │   │  C1/C2;     │
│ J3.2 REF_CLK ─────┼─┬>│ JP1 1-2 ──> XTAL1/CLKIN       │   │  LEDs NC)   │
│ J3.3 ~INT <──R18──┼─│─│ nINT    RBIAS: R5 12.1k 1%    │   └─────────────┘
│ J3.4 ~RST ────────┼─│>│ nRST (R13 10k PU)             │
└───────────────────┘ │ │ U2 50 MHz osc (DNP) ──JP1 2-3 │
              R19(DNP)└─│───────── OSC_OUT              │
                        │ VDDCR: C4 1µ + C5 470p        │
                        │ FB1 → 3V3A; R1–R4 49.9Ω       │
                        └───────────────────────────────┘

2. Safety and scope boundaries#

3. Power, strap, and clock sequence#

  1. 3V3 arrives from the host (both plugs' pins 6/12) or the bench supply. FB1 derives 3V3A; C3/C6/C7 (100 nF) and C8/C9 (10 µF) decouple.
  2. REGOFF is strapped low (R11), so the internal 1.2 V core regulator runs; C4 (1 µF) + C5 (470 pF) on VDDCR are the datasheet values.
  3. 50 MHz reaches XTAL1/CLKIN: default JP1 1-2 from the host PLL via J3 pin 2; alternative JP1 2-3 from U2 (DNP oscillator), which also feeds the host through R19 (DNP, fit with U2) so the host can slave.
  4. Strap latch: on the rising edge of ~RST the PHY samples the strap pins: MODE[2:0] = 111 (R6/R7/R8 pull-ups on RXD0/RXD1/CRS_DV → all-capable autonegotiation), PHYAD0 = 0 (R9 pull-down on RX_ER → PHY address 0), nINTSEL = 1 (R10 → pin 14 is ~INT, not REFCLKO), REGOFF = 0 (R11). The host must not drive these lines low/high against the straps while ~RST rises — after latch they become ordinary RMII outputs.
  5. The PHY autonegotiates. Management runs over MDIO (R12 1.5 kΩ pull-up, per datasheet) clocked by MDC from J1 pin 10.
  6. RMII traffic flows: TXD0/TXD1/TX_EN host→PHY direct; RXD0/RXD1/CRS_DV/ RX_ER PHY→host through 100 Ω (R14–R17); ~INT through R18.

4. Interfaces#

ReferencePins/signalsIntended use
J1 (PMOD A)RMII data group1 TXD0, 2 TXD1, 3 TX_EN, 4 RXD0, 5/11 GND, 6/12 3V3, 7 RXD1, 8 CRS_DV, 9 RX_ER, 10 MDC
J3 (PMOD B)Management/clock/control1 MDIO, 2 REF_CLK (50 MHz — must land on a clock-capable host pin), 3 ~INT, 4 ~RST, 5/11 GND, 6/12 3V3, 7–10 NC
J2HR911105A MagJack10/100BASE-T; center taps to 3V3A; jack LEDs deliberately unconnected (see 5.1)
JP13-pad solder jumperREF_CLK source: 1-2 host (default) / 2-3 on-board U2

There are no test points defined yet (no layout exists); bench probing is at the PMOD pins, passives, and VQFN pins/pads.

5. Component-by-component review#

The board is dense (~28 nets), so components are grouped by function.

5.1 PHY, jack, and clock source#

Ref.PartFunction and why neededIf absent/openIf shorted, wrong, or misassembled
U1Microchip LAN8720A-CP-TR, VQFN-2410/100 PHY with RMII MAC interfaceNothing worksVQFN center pad unsoldered = thermal/ground failure; rotated part; strap pins bridged changes boot mode silently
J2Hanrun HR911105A MagJackRJ45 + magnetics; both center taps tied to 3V3A with C1/C2 at the taps (EVB8720 pattern) — this PHY's TX is voltage-mode via the taps, unlike AXC-001's arrangementNo networkTD/RD pair swap degrades/kills link; center tap left floating = no TX drive at all
J2 LED pinsLeft no-connect on purpose: LAN8720A LED1/LED2 double as REGOFF/nINTSEL straps; wiring jack LEDs to them would fight the chosen strap levels (the classic LAN8720 gotcha)If anyone "fixes" the dark jack LEDs by wiring them, the straps latch wrong — this is a review trap, documented on the schematic
U2Abracon ASE-class 50 MHz oscillator (DNP, MPN TBD)Alternative REF_CLK source for JP1 2-3 modeDefault build: absent by designFitting U2 while JP1 is 1-2 wastes power but is benign; fitting U2 + JP1 2-3 while the host drives J3.2 = contention through R19
JP1Solder jumper, bridged 1-2 by defaultSelects host PLL vs on-board oscillator into XTAL1/CLKINOpen (cut, nothing bridged) = no clock, PHY deadBoth sides bridged = two clock drivers fighting — never
R19100 Ω (DNP, fit with U2)Feeds OSC_OUT to J3.2 so the host can slave to the module clockJP1 2-3 without R19 = host has no reference and RMII timing is unmooredFitted in default (1-2) build it back-feeds OSC_OUT stub — leave DNP unless U2 is fitted

5.2 Straps and bias (all latch on the ~RST rising edge)#

Refs.ValueFunctionIf omitted or wrong
R6, R7, R810 kΩ to 3V3 on RXD0/RXD1/CRS_DVMODE[2:0] = 111: all-capable autonegotiationA missing strap latches a forced-mode PHY (e.g. 10BASE-T only) — link comes up "sometimes"; classic silent failure
R910 kΩ to GND on RX_ERPHYAD0 = 0: PHY answers MDIO at address 0Missing = address 1 (internal default pull varies) — MDIO reads return 0xFFFF at the expected address
R1010 kΩ to 3V3 on nINTSELPin 14 = ~INT, not REFCLKOWrong = pin 14 outputs a 50 MHz clock into the host's interrupt input
R1110 kΩ to GND on REGOFFInternal 1.2 V regulator enabledMissing/high = core expects external 1.2 V that does not exist — part dead or erratic
R121.5 kΩ to 3V3MDIO bus pull-up (datasheet value)Open = MDIO reads float/0xFFFF; 10 k substitution marginal at higher MDC rates
R1310 kΩ to 3V3~RST idle pull-upFloating ~RST = straps latch at an uncontrolled instant
R512.1 kΩ 1 % to GNDRBIAS — exact datasheet value; sets analog currentsNot a ±5 % position: wrong value skews TX amplitude; measure the fitted part

5.3 MDI termination, RMII series, and decoupling#

Refs.ValueFunctionIf omitted or wrong
R1–R449.9 Ω 1 % to 3V3ATX±/RX± line pull-ups (MDI termination)Open = dead/asymmetric pair, no or marginal link
C1, C2100 nF at the J2 TX/RX center tapsCenter-tap decoupling (EVB8720 pattern)TX common-mode noise, EMC and link margin degrade
R14–R17100 Ω seriesProtection on PHY-driven RXD0/RXD1/CRS_DV/RX_EROpen = that RMII bit stuck at host; frames CRC-fail in fabric — but note these same lines carry straps (R6–R9) on the PHY side of the series R, so strap latch still works with an open series R: distinctive signature
R18100 Ω seriesProtection on PHY-driven ~INTOpen = no interrupts; polling still works
C3, C6, C7100 nF (VDDIO, VDD1A, VDD2A)Per-pin HF decouplingRail noise, sensitivity loss
C4 + C51 µF + 470 pF on VDDCRInternal 1.2 V regulator stability — datasheet-mandated pairCore instability, resets/hangs
C8, C910 µF (3V3 / 3V3A)Bulk per railDroop at link start
FB1120 Ω @ 100 MHz bead3V3 → 3V3A splitOpen = analog bank dead (MDIO/RMII fine, no link ever — distinctive)
#FLG01–04ERC power flagsSchematic bookkeeping only

Every ref-des on the board is covered above: U1, U2, J1, J2, J3, JP1, FB1, R1–R19, C1–C9.

6. Datasheet summary and design interpretation#

DeviceKey manufacturer facts used hereBoard-specific interpretation
LAN8720A (datasheet 00002165B)RMII 1.2; straps sampled at ~RST rising edge; MDIO PHY ID registers 2/3 read 0x0007 / 0xC0Fx (OUI 0x00800F, model 0x0F; low nibble of reg 3 is the silicon revision, so accept 0xC0F0–0xC0FF); RBIAS 12.1 kΩ 1 %; VDDCR 1 µF + 470 pF; 1.5 kΩ MDIO pull-up; LED pins double as strapsThe PHY-ID read is the canonical MDIO bring-up gate, exactly analogous to AXC-001's VERSIONR. The LED/strap double-duty is why the jack LEDs are unconnected
Microchip LAN8720A schematic checklist / EVB8720Center taps to 3V3A with local 100 nF; 49.9 Ω pull-ups on all four MDI lines; strap resistor planDesign was cross-checked against these at capture (line README); review deviations as errors
HR911105A (LCSC C12074)Integrated magnetics; pin 8 Bob Smith to GND; shell to GNDSame jack as AXC-001 (shared sourcing), but the tap wiring differs — do not copy AXC-001's review results across
Abracon ASE oscillator (datasheet)3.3 V CMOS out, 3225DNP; MPN still TBD — pin at BOM review
RMII consortium spec v1.2REF_CLK 50 MHz ±50 ppm; data sampled on rising edge; CRS_DV semanticsThe host PLL (default topology) must meet ±50 ppm — a fabric-synthesized non-PLL clock does not

7. Expected values before bench testing#

All values are design targets for a board that does not yet exist.

QuantityTargetHow to measure
3V3-to-GND / 3V3A-to-GND, unpoweredHigh, both polaritiesDMM
3V3-to-3V3A~0 Ω (FB1)DMM
RBIAS pad to GND12.1 kΩ ±1 %DMM
Strap levels just before ~RST releaseRXD0/RXD1/CRS_DV ≈ 3.3 V; RX_ER ≈ 0 V; nINTSEL ≈ 3.3 V; REGOFF ≈ 0 VScope/DMM with host inputs tristated
Supply current, link up~40–60 mA classBench supply readout
REF_CLK at XTAL150 MHz, 3.3 V CMOS, monotonic edgesScope (short ground spring)
MDIO reg 2 (PHY ID1), address 00x0007MDIO read
MDIO reg 3 (PHY ID2), address 00xC0Fx (x = silicon rev)MDIO read
MDIO reg 1 with live partnerLink-status bit set within ~2 s of cable attachMDIO poll
Autonegotiation result (reg 31 special modes / reg 5 LPA)Matches forced partner in all four modesMDIO + managed switch
CRS_DV, RX activityBursts at 50 MHz data rate during partner trafficScope/logic analyzer ≥200 MS/s
RMII TX pathPartner sees valid frames (host MAC sends known pattern)Wireshark on partner
~INTHigh idle; falls on enabled PHY interrupt (e.g. link change)Scope at J3 pin 3

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record board serial, equipment, link-partner identity, JP1 state, and host clock provenance.

A. Unpowered inspection and resistance tests#

  1. Visual inspection: U1, strap bank, termination bank, J2, JP1 state.
  2. DMM: rail resistances; RBIAS 12.1 k; MDIO to 3V3 ≈ 1.5 k; each strap resistor value; J1 pin 4 to U1 RXD0 ≈ 100 Ω (R14) and likewise R15–R18 paths.

B. Standalone power-on and strap latch (bench supply, no host)#

  1. Feed current-limited 3.3 V into a PMOD 3V3/GND pair. Record current.
  2. With no clock and no host, check strap-node DC levels (section 7).
  3. Provide 50 MHz to XTAL1 (bench generator through JP1 1-2 path at J3 pin 2, or temporarily fit U2 + JP1 2-3). Verify amplitude/edges at the pin.
  4. Strap-latch check at reset: scope RXD0 (any strap line) and ~RST. Pull ~RST low ≥100 µs and release; confirm the strap line sits at its strap level while ~RST rises, then switches to RMII output behavior. Repeat with the intended host attached later — a host that drives these lines during reset corrupts the latch.

C. MDIO bring-up (bench master or FPGA, low risk first)#

  1. Bit-bang MDC/MDIO (any 3.3 V GPIO pair; MDC ≤2.5 MHz to start).
  2. Read registers 2 and 3 at PHY address 0: expect 0x0007 and 0xC0Fx. Repeat 100×. Reads of 0xFFFF mean address/pull-up/wiring problems; this gate must be bulletproof before anything else.
  3. Read register 1 twice (link status is latch-low): no cable → link down.
  4. Attach a cable to a live switch: register 1 link bit within ~2 s; read register 5 (LPA) and record the partner's advertised abilities.
  5. Autonegotiation matrix: force the partner to 10/half, 10/full, 100/half, 100/full; confirm the resolved mode each time (reg 31 special-modes / vendor status register).

D. RMII signal capture (still hostless or with passive host)#

  1. With link up and the partner sending traffic (e.g. broadcast-rich network or a ping flood at the PHY's MAC-less carcass — frames will die in fabric later, the PHY still forwards them), capture CRS_DV and RXD[1:0] with a ≥200 MS/s logic analyzer against REF_CLK.
  2. Expected: CRS_DV asserts per frame; preamble 0x55… nibble pattern on RXD; data changes on REF_CLK edges with usable setup/hold at 50 MHz. Record eye/timing margins — this is the calibration data the rmii_mac core's constraints will be checked against.
  3. RX_ER should stay low on a clean link; note any assertions.

E. Hosted bring-up (FPGA host, both sockets)#

  1. Confirm host PLL provides 50 MHz ±50 ppm on J3.2 (JP1 1-2) before plugging in, and that gateware tristates strap lines through reset.
  2. Plug into both sockets. Re-run the MDIO PHY-ID gate through fabric.
  3. Bring up rmii_mac RX: capture real frames into a fabric FIFO; verify CRC32 against Wireshark on the partner, byte-for-byte.
  4. Bring up TX: send a fixed UDP/ARP frame; verify on the partner.
  5. Link partner test: repeat against at least two different switches and one direct-to-NIC connection (auto-MDIX); record negotiation results and error counters over a 30-minute soak.
  6. If the oscillator topology is wanted: power down, fit U2 + R19, cut JP1 1-2, bridge 2-3, reconfigure the host to receive REF_CLK, and repeat steps 2–5. Never run with both topologies half-configured.

F. Release-only tests#

EMC, ESD to the jack, chassis-split decision, long-cable/interop sweeps, and 50 MHz clock-quality characterization across temperature are controlled-lab work.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
MDIO reads 0xFFFFMDIO pull-up level, MDC edges at U1, PHY addressR12 open, wrong PHY address (R9 strap), MDC/MDIO swapped, U1 solder
PHY ID reads wrong/unstableVDDCR node, REF_CLK qualityC4/C5, missing 50 MHz, marginal MDC timing
No link ever, MDIO fine3V3A at C9; center taps; MDI continuityFB1 open, tap not at 3V3A, pair swap, R1–R4, R5 value
Link only in some forced modesAutoneg matrix resultsMODE strap missing (R6–R8) — check latched mode in reg 31
Link but fabric sees garbageRMII capture vs REF_CLKClock not PLL-clean/±50 ppm, series-R + long route, setup/hold in fabric
Pin 14 outputs 50 MHznINTSEL strap level at resetR10 missing → REFCLKO mode latched
Part dead, cool, current ~0REGOFF level, VDDCR voltageR11 missing (regulator off), center pad unsoldered
Works standalone, fails hostedStrap lines during host resetHost driving RXD/CRS_DV around ~RST rise — fix gateware reset sequencing
Two-clock contention suspectedCurrent draw, REF_CLK waveform distortionJP1 both sides bridged, or U2 fitted + host driving J3.2

11. Bench record template#

FieldRecord
Board revision / serial
JP1 topology; U2/R19 fitted?
Host clock provenance (PLL settings, measured ppm)
Supply / generator / LA / scope IDs and calibration
Unpowered resistance and strap-value results (9.A)
Strap levels at reset; latch capture reference
PHY ID reads (reg 2/3, 100×)
Autonegotiation matrix results
RMII capture margins (setup/hold at 50 MHz)
Frame CRC verification result (fabric vs Wireshark)
Link partner list and soak error counts
Deviations, photos, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic is a faithful implementation of the Microchip checklist: correct strap plan (with the LED/strap conflict consciously resolved by leaving the jack LEDs dark), datasheet RBIAS/VDDCR/MDIO values, EVB8720 center-tap termination, and a defensible answer to the line's REF_CLK open decision via JP1. The design's sharp edges are all dynamic: strap levels must survive the ~RST rising edge against whatever the host drives, the 50 MHz clock must be PLL-clean in the default topology, and JP1 must never be double-bridged. The PHY-ID read (0x0007/0xC0Fx) is the bring-up gate; the RMII capture in 9.D is what turns this board from "links up" into usable calibration data for the rmii_mac core. No PCB exists, the dual-plug mechanics and 50 MHz routing are unverified, and both oscillator MPNs are still TBD.