Circuit review & bench-test guide
AXC-002 — LAN8720A RMII Ethernet PHY dual-PMOD module
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#
- Everything is 3.3 V; hazard to people is negligible. The real risks are strap-latch mistakes (the PHY silently boots into the wrong mode), clock-topology confusion at JP1 (two drivers on one net if both jumper sides are bridged), and VQFN-24 assembly quality.
- Never bridge both JP1 positions. JP1 2-3 with U2 fitted while the host also drives J3 pin 2 puts two push-pull drivers on REF_CLK — R19 limits but does not remove the contention. Decide the topology before plugging into a host, and make the host gateware match.
- The module needs both adjacent host PMOD sockets on exact 0.9 in centers; forcing it into one socket bends pins and cross-powers nets.
- RMII is sampled at 50 MHz: use the host's high-speed (no series-R) PMOD socket if fitted, and expect marginal behavior on long-lead probing.
- Ethernet is transformer-isolated at J2; a live switch is safe. No PoE until the chassis arrangement is reviewed.
- Standalone bench work uses a current-limited 3.3 V supply (150 mA limit; the PHY draws ~40–60 mA class with link up).
- ERC-clean is a schematic check only; no PCB exists. The 50 MHz route, MDI matching, and dual-plug mechanics are unbuilt and unverified.
3. Power, strap, and clock sequence#
- 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.
- 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.
- 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.
- 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.
- The PHY autonegotiates. Management runs over MDIO (R12 1.5 kΩ pull-up, per datasheet) clocked by MDC from J1 pin 10.
- 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#
| Reference | Pins/signals | Intended use |
|---|---|---|
| J1 (PMOD A) | RMII data group | 1 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/control | 1 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 |
| J2 | HR911105A MagJack | 10/100BASE-T; center taps to 3V3A; jack LEDs deliberately unconnected (see 5.1) |
| JP1 | 3-pad solder jumper | REF_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. | Part | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| U1 | Microchip LAN8720A-CP-TR, VQFN-24 | 10/100 PHY with RMII MAC interface | Nothing works | VQFN center pad unsoldered = thermal/ground failure; rotated part; strap pins bridged changes boot mode silently |
| J2 | Hanrun HR911105A MagJack | RJ45 + 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 arrangement | No network | TD/RD pair swap degrades/kills link; center tap left floating = no TX drive at all |
| J2 LED pins | — | Left 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 |
| U2 | Abracon ASE-class 50 MHz oscillator (DNP, MPN TBD) | Alternative REF_CLK source for JP1 2-3 mode | Default build: absent by design | Fitting 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 |
| JP1 | Solder jumper, bridged 1-2 by default | Selects host PLL vs on-board oscillator into XTAL1/CLKIN | Open (cut, nothing bridged) = no clock, PHY dead | Both sides bridged = two clock drivers fighting — never |
| R19 | 100 Ω (DNP, fit with U2) | Feeds OSC_OUT to J3.2 so the host can slave to the module clock | JP1 2-3 without R19 = host has no reference and RMII timing is unmoored | Fitted 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. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R6, R7, R8 | 10 kΩ to 3V3 on RXD0/RXD1/CRS_DV | MODE[2:0] = 111: all-capable autonegotiation | A missing strap latches a forced-mode PHY (e.g. 10BASE-T only) — link comes up "sometimes"; classic silent failure |
| R9 | 10 kΩ to GND on RX_ER | PHYAD0 = 0: PHY answers MDIO at address 0 | Missing = address 1 (internal default pull varies) — MDIO reads return 0xFFFF at the expected address |
| R10 | 10 kΩ to 3V3 on nINTSEL | Pin 14 = ~INT, not REFCLKO | Wrong = pin 14 outputs a 50 MHz clock into the host's interrupt input |
| R11 | 10 kΩ to GND on REGOFF | Internal 1.2 V regulator enabled | Missing/high = core expects external 1.2 V that does not exist — part dead or erratic |
| R12 | 1.5 kΩ to 3V3 | MDIO bus pull-up (datasheet value) | Open = MDIO reads float/0xFFFF; 10 k substitution marginal at higher MDC rates |
| R13 | 10 kΩ to 3V3 | ~RST idle pull-up | Floating ~RST = straps latch at an uncontrolled instant |
| R5 | 12.1 kΩ 1 % to GND | RBIAS — exact datasheet value; sets analog currents | Not a ±5 % position: wrong value skews TX amplitude; measure the fitted part |
5.3 MDI termination, RMII series, and decoupling#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R1–R4 | 49.9 Ω 1 % to 3V3A | TX±/RX± line pull-ups (MDI termination) | Open = dead/asymmetric pair, no or marginal link |
| C1, C2 | 100 nF at the J2 TX/RX center taps | Center-tap decoupling (EVB8720 pattern) | TX common-mode noise, EMC and link margin degrade |
| R14–R17 | 100 Ω series | Protection on PHY-driven RXD0/RXD1/CRS_DV/RX_ER | Open = 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 |
| R18 | 100 Ω series | Protection on PHY-driven ~INT | Open = no interrupts; polling still works |
| C3, C6, C7 | 100 nF (VDDIO, VDD1A, VDD2A) | Per-pin HF decoupling | Rail noise, sensitivity loss |
| C4 + C5 | 1 µF + 470 pF on VDDCR | Internal 1.2 V regulator stability — datasheet-mandated pair | Core instability, resets/hangs |
| C8, C9 | 10 µF (3V3 / 3V3A) | Bulk per rail | Droop at link start |
| FB1 | 120 Ω @ 100 MHz bead | 3V3 → 3V3A split | Open = analog bank dead (MDIO/RMII fine, no link ever — distinctive) |
| #FLG01–04 | ERC power flags | Schematic 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#
| Device | Key manufacturer facts used here | Board-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 straps | The 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 / EVB8720 | Center taps to 3V3A with local 100 nF; 49.9 Ω pull-ups on all four MDI lines; strap resistor plan | Design 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 GND | Same 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, 3225 | DNP; MPN still TBD — pin at BOM review |
| RMII consortium spec v1.2 | REF_CLK 50 MHz ±50 ppm; data sampled on rising edge; CRS_DV semantics | The 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.
| Quantity | Target | How to measure |
|---|---|---|
| 3V3-to-GND / 3V3A-to-GND, unpowered | High, both polarities | DMM |
| 3V3-to-3V3A | ~0 Ω (FB1) | DMM |
| RBIAS pad to GND | 12.1 kΩ ±1 % | DMM |
| Strap levels just before ~RST release | RXD0/RXD1/CRS_DV ≈ 3.3 V; RX_ER ≈ 0 V; nINTSEL ≈ 3.3 V; REGOFF ≈ 0 V | Scope/DMM with host inputs tristated |
| Supply current, link up | ~40–60 mA class | Bench supply readout |
| REF_CLK at XTAL1 | 50 MHz, 3.3 V CMOS, monotonic edges | Scope (short ground spring) |
| MDIO reg 2 (PHY ID1), address 0 | 0x0007 | MDIO read |
| MDIO reg 3 (PHY ID2), address 0 | 0xC0Fx (x = silicon rev) | MDIO read |
| MDIO reg 1 with live partner | Link-status bit set within ~2 s of cable attach | MDIO poll |
| Autonegotiation result (reg 31 special modes / reg 5 LPA) | Matches forced partner in all four modes | MDIO + managed switch |
| CRS_DV, RX activity | Bursts at 50 MHz data rate during partner traffic | Scope/logic analyzer ≥200 MS/s |
| RMII TX path | Partner sees valid frames (host MAC sends known pattern) | Wireshark on partner |
| ~INT | High idle; falls on enabled PHY interrupt (e.g. link change) | Scope at J3 pin 3 |
8. Manual schematic and assembly review checklist#
- Verify U1 orientation and the VQFN-24 exposed pad soldering (X-ray if available).
- Buzz every strap resistor to its exact pin: R6→RXD0, R7→RXD1, R8→CRS_DV, R9→RX_ER(GND), R10→nINTSEL, R11→REGOFF(GND). A swapped pull direction is a silent mode change.
- Measure R5 = 12.1 kΩ 1 % and R12 = 1.5 kΩ before power.
- Confirm the jack LED pins are unconnected and stay that way.
- Confirm both J2 center taps reach 3V3A and C1/C2 sit at the taps.
- Buzz TXP/TXN/RXP/RXN U1↔J2 for pair swaps.
- Verify JP1 state matches the intended topology and that U2/R19 are DNP in the default build.
- Verify the two PMOD plugs land on exact 0.9 in centers at layout, and that J3 pin 2 is documented as requiring a clock-capable host pin.
- Confirm host gateware: TXD0/TXD1/TX_EN outputs, everything else on J1 inputs, MDIO bidirectional open-drain, and no host drive on RXD0/RXD1/ CRS_DV/RX_ER around reset (strap latch).
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#
- Visual inspection: U1, strap bank, termination bank, J2, JP1 state.
- 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)#
- Feed current-limited 3.3 V into a PMOD 3V3/GND pair. Record current.
- With no clock and no host, check strap-node DC levels (section 7).
- 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.
- 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)#
- Bit-bang MDC/MDIO (any 3.3 V GPIO pair; MDC ≤2.5 MHz to start).
- 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.
- Read register 1 twice (link status is latch-low): no cable → link down.
- 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.
- 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)#
- 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.
- 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_maccore's constraints will be checked against. - RX_ER should stay low on a clean link; note any assertions.
E. Hosted bring-up (FPGA host, both sockets)#
- 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.
- Plug into both sockets. Re-run the MDIO PHY-ID gate through fabric.
- Bring up
rmii_macRX: capture real frames into a fabric FIFO; verify CRC32 against Wireshark on the partner, byte-for-byte. - Bring up TX: send a fixed UDP/ARP frame; verify on the partner.
- 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.
- 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#
| Symptom | First measurements | Likely areas |
|---|---|---|
| MDIO reads 0xFFFF | MDIO pull-up level, MDC edges at U1, PHY address | R12 open, wrong PHY address (R9 strap), MDC/MDIO swapped, U1 solder |
| PHY ID reads wrong/unstable | VDDCR node, REF_CLK quality | C4/C5, missing 50 MHz, marginal MDC timing |
| No link ever, MDIO fine | 3V3A at C9; center taps; MDI continuity | FB1 open, tap not at 3V3A, pair swap, R1–R4, R5 value |
| Link only in some forced modes | Autoneg matrix results | MODE strap missing (R6–R8) — check latched mode in reg 31 |
| Link but fabric sees garbage | RMII capture vs REF_CLK | Clock not PLL-clean/±50 ppm, series-R + long route, setup/hold in fabric |
| Pin 14 outputs 50 MHz | nINTSEL strap level at reset | R10 missing → REFCLKO mode latched |
| Part dead, cool, current ~0 | REGOFF level, VDDCR voltage | R11 missing (regulator off), center pad unsoldered |
| Works standalone, fails hosted | Strap lines during host reset | Host driving RXD/CRS_DV around ~RST rise — fix gateware reset sequencing |
| Two-clock contention suspected | Current draw, REF_CLK waveform distortion | JP1 both sides bridged, or U2 fitted + host driving J3.2 |
11. Bench record template#
| Field | Record |
|---|---|
| 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.