Circuit review & bench-test guide
AXL-002 — Oscilloscope front end dual-PMOD module (AD9280)
Document purpose#
This document explains the axl-002-scope prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the generated schematic (generate_design.py, rev 0.1-schematic, 2026-07-12), the README, the TI OPA356 datasheet, and the reviewer's knowledge of the ADI AD9280 datasheet (which could not be fetched during this review — see Section 6).
The board is a design-stage prototype. The schematic is generated and ERC clean (reports/erc.rpt, 2026-07-12: 0 errors / 0 warnings, with KiCad's single-global-label, four-way-junction, SPICE, and footprint-filter checks ignored) and the netlist has been reviewed, but PCB layout has not started and no board has been fabricated or assembled. There is no first-article bench result of any kind. Every expected value below is a design target to verify, not proof that an assembled board works.
1. What the board does#
The board is a dual-PMOD (two adjacent 12-pin sockets on 0.9" centers) oscilloscope front end around an ADI AD9280ARSZ 8-bit 32 MSPS parallel pipeline ADC, sampled at 25 MHz by a host-driven clock. The analog path is rev-1 DC-coupled, low-voltage only: a signal arrives on a 1x2 header (J2) or the parallel BNC (J4), passes an optional 910k/100k = 10.1:1 divider (solder jumper JP3, bridged = 1:1), is clamped to the rails by a BAT54S Schottky pair, and is buffered by an OPA356 unity follower into AIN. The ADC runs in top/bottom reference mode (MODE = AVDD) with its internal 1.25 V bandgap scaled by R3/R4 to VREF ≈ 2.02 V (JP4 selectable to 1.25 V), so the native input span is 0–2.02 V (≈0–20.4 V with the divider). Eight data bits and OTR leave through 100 Ω series resistors to PMOD A; PMOD B carries CLK in, OTR, and STBY.
There is no AC coupling, no offset generator, no negative range, and no isolation — a silkscreen warning is a release requirement. It teaches triggering, decimation, and pre-trigger ring buffers (scope_capture core), pairing with AXL-003 (wavegen) as its own test source and AXO-007 (VGA) as its display.
Functional block diagram#
J2 header ──┬── SIG_IN ──┬── R1 910k ──┬── VIN ── U2 OPA356 ── AIN ── U1 AD9280
J4 BNC ───┘ └── JP3 ──────┤ (unity) (8b, 25 MHz)
(bridged=1:1)├── R2 100k ── GND
└── D1 BAT54S (GND-0.3 .. 3V3+0.3 clamp)
VREF ── R3 6.2k ── REF_DIV ── R4 10k ── GND U1 straps: MODE = AVDD_F,
JP4: REFSENSE ── 1-2 REF_DIV (VREF≈2.02V, REFTS = VREF, REFBS = GND,
default) / 2-3 VREF (VREF=1.25V) CLAMP/CLAMPIN/THREE-STATE = GND
3V3 ── R5 10R ── AVDD_F (+C7/C8) STBY_S: R6 10k to GND, R16 100R to J3-3
U1 D0-D7/OTR ── R7-R15 100R ── J1 (PMOD A: D0-D7)
J3 (PMOD B): 1 CLK (host 25 MHz out), 2 OTR, 3 STBY
2. Safety and scope boundaries#
- The analog input is DC-coupled and unipolar. Native (JP3 bridged) safe and useful range is 0–2 V; the BAT54S clamp and the OPA356's internal diodes protect against modest overdrive only. Never connect mains-derived, floating-at-line, or high-energy sources; this is not a general scope probe input.
- In 1:1 mode the clamp is directly on the input node — an external source above ~3.6 V or below ~−0.3 V drives current into the clamp with only the source's own impedance limiting it. Keep any deliberate overdrive behind an external series resistor (Section 9.E).
- In 10:1 mode (JP3 cut) the working range is ≈0–20 V and R1 (910k) limits clamp current, but R1 is a 0603 part: keep inputs below ±30 V for bench work regardless of the clamp math.
- Never plug the module into 5 V PMOD ports; every rail and strap assumes 3.3 V.
- Standalone bench work uses a current-limited 3.3 V supply (limit ~100 mA; expected module draw is ~40 mA, Section 7).
- Earth-referenced oscilloscope grounds clip only to board GND — and the BNC shell IS board GND, so a grounded source ties the module to earth.
- A clean code readout is not a calibration: the reference chain, divider, and buffer are unverified and every accuracy number here is a design target.
3. Power and control sequence#
- 3V3 and GND arrive on both PMOD plugs (pins 5/11 and 6/12 of J1 and J3); C11 (10 µF) is the module bulk, C9 decouples DRVDD, C10 decouples U2.
- AVDD is filtered from 3V3 through R5 (10 Ω) + C7 (10 µF) + C8 (100 nF) — a documented substitution for a ferrite bead (none stock-verified in the platform BOM). Note the ~0.2–0.3 V IR drop this implies at the ADC's analog supply current (Section 7).
- The AD9280's internal 1.25 V bandgap starts; with JP4 bridged 1-2, REFSENSE sits on the R3/R4 tap and the reference amplifier servos VREF to 1.25 V × (1 + 6.2k/10k) ≈ 2.02 V. MODE = AVDD selects top/bottom reference mode; REFTS = VREF and REFBS = GND set the input span to 0 V..VREF. C3/C4 (100 nF each) and C5 (10 µF across) settle the REFTF/REFBF force nodes per the datasheet decoupling.
- R6 (10 kΩ) holds STBY_S low: the ADC runs by default. The host may drive STBY high through J3 pin 3 and R16 (100 Ω) to power down the core. THREE-STATE, CLAMP, and CLAMPIN are tied low (outputs always driven, video clamp disabled).
- U2 (OPA356) buffers VIN to AIN with unity gain; the ADC samples AIN on the host-supplied CLK (25 MHz from the ECP5 fabric; the part is rated 32 MSPS). Data appears on D0–D7 after the pipeline latency (three clock cycles per the datasheet — re-verify, Section 6) and OTR flags out-of-range samples.
- Nothing converts without a host clock: with CLK static the pipeline holds stale/undefined data. All bring-up code reads assume a running clock.
4. Interfaces and pin maps#
This is a dual-PMOD module: both connectors must plug into adjacent host sockets on 0.9" centers, and CLK must come from the clock-capable host pin tracked in boards/BACKLOG.md.
| J1 (PMOD A) pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | D0 | D1 | D2 | D3 | GND | 3V3 | D4 | D5 | D6 | D7 | GND | 3V3 |
| Direction | out | out | out | out | — | — | out | out | out | out | — | — |
| J3 (PMOD B) pin | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Net | CLK | OTR | STBY | NC | GND | 3V3 | NC | NC | NC | NC | GND | 3V3 |
| Direction | in (host 25 MHz) | out | in (optional) | — | — | — | — | — | — | — | — | — |
| J2 pin | 1 | 2 | J4 (BNC) | center | shell | |
|---|---|---|---|---|---|---|
| Net | SIG_IN | GND | Net | SIG_IN | GND |
Jumper configuration review:
| Jumper | Position | Effect |
|---|---|---|
| JP3 | Bridged (default) | 1:1 input, 0–2.02 V span, ~100 kΩ input impedance (R2) |
| JP3 | Cut | 10.1:1 divider (R1/R2), ≈0–20.4 V span, ~1.01 MΩ input impedance |
| JP4 | 1-2 (default) | REFSENSE = R3/R4 tap → VREF ≈ 2.02 V (0–2 V span) |
| JP4 | 2-3 | REFSENSE = VREF → VREF = 1.25 V (0–1.25 V span) |
Never leave JP4 fully open (REFSENSE floating selects an undefined reference configuration) and never bridge all three pads (shorts REF_DIV to VREF, collapsing the divider to VREF ≈ 1.25 V through a loaded tap).
5. Component-by-component review#
Every reference designator in generate_design.py appears below. Capacitor numbering starts at C3 (there is no C1/C2 — a cosmetic refdes gap, not a missing part). #FLG01–#FLG03 are ERC power-flag pseudo-components on 3V3, GND, and AVDD_F; they have no physical footprint and are listed only for completeness.
| Ref. | Part / value | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | 12-pin PMOD plug (PMOD A: DATA) | D0–D7 to the host, plus power | No data (and possibly no power) | Offset insertion puts 3V3 on data pins; verify both plugs seat together |
| J3 | 12-pin PMOD plug (PMOD B: CTRL) | CLK in, OTR out, STBY in, plus power | No sample clock — ADC never converts | Same offset risk; CLK on a non-clock-capable host pin degrades sampling |
| J2 | 1x2 2.54 mm header (pin 1 SIG_IN, pin 2 GND) | Breadboard signal input, parallel with J4 | BNC remains | Swapped probe puts the source on GND |
| J4 | Amphenol B6252HB-NPP3G-50 BNC | Cabled signal input, parallel with J2 (stock footprint verified; fitted) | Header remains | Shell is board GND — earths the module to a grounded source |
| U1 | ADI AD9280ARSZ, SSOP-28 (footprint assigned explicitly; the stock symbol has none) | 8-bit 32 MSPS pipeline ADC — the module's entire function | No conversions | Rotated package misapplies AVDD; 0.65 mm pitch bridges hang data lines or short the reference nodes |
| U2 | TI OPA356AIDR, SOIC-8 | 200 MHz CMOS unity buffer isolating the ~100 kΩ (or 1 MΩ) source node from the ADC's switched-capacitor input | AIN floats — undefined codes | Swapped +IN/−IN latches the output; note the input CM ceiling of V+ − 1.5 V (Section 6) |
| D1 | Nexperia BAT54S (series pair, SOT-23) | Clamps VIN between ~GND − 0.3 V and ~3V3 + 0.3 V ahead of the buffer | Overdrive reaches U2's internal diodes (±0.5 V beyond rails, 10 mA abs max) directly | Reversed part clamps the working range; leaky part loads the divider |
| R1 | 910 kΩ 0603 (RC0603FR-07910KL) | Divider top leg: 910k/100k = 10.1:1 (closest E24 to 900k) | 10:1 mode dead (input open when JP3 cut) | Wrong value silently rescales the 10:1 factor |
| R2 | 100 kΩ 0603 | Divider bottom leg and input bleed; sets the 1:1-mode 100 kΩ input impedance | Input floats in 1:1 mode with no source attached; divider becomes 1:1 follow-through in 10:1 mode | Short grounds the input; wrong value rescales the divider |
| R3 | 6.2 kΩ 0603 | REFSENSE divider top: VREF = 1.25 V × (1 + R3/R4) ≈ 2.02 V | VREF servo opens — reference undefined in JP4 1-2 mode | Wrong value moves the full-scale span directly |
| R4 | 10 kΩ 0603 | REFSENSE divider bottom | Same as R3 | Same as R3 |
| R5 | 10 Ω 0603 | AVDD filter (with C7/C8); documented ferrite-bead substitution | ADC unpowered (AVDD open) | Short removes filtering only; wrong (larger) value starves AVDD via IR drop |
| R6 | 10 kΩ 0603 | STBY pull-down strap: ADC runs by default | STBY floats — power state undefined | Short to GND is the same as the strap (benign); miswired to 3V3 holds the ADC in standby |
| R7–R14 | 100 Ω 0603 (x8) | Series protection on ADC-driven D0–D7 toward the host | That bit reads stuck/floating at the host | Wrong (large) value plus bus capacitance slows edges at 25 MHz — do not increase |
| R15 | 100 Ω 0603 | Same, on OTR | No out-of-range flag | Same as R7–R14 |
| R16 | 100 Ω 0603 | Series on the host STBY control line into the R6 strap node | Host cannot control STBY (strap still runs the ADC) | Short is benign; open is the "absent" case |
| C3 | 100 nF X7R | REFTF decoupling (datasheet reference decoupling) | Reference node ringing, degraded conversions | Short drags REFTF to GND — reference collapses |
| C4 | 100 nF X7R | REFBF decoupling | Same class as C3 | Short drags REFBF to GND (small effect — REFBS is GND anyway) |
| C5 | 10 µF X5R | Reference force-node bulk across REFTF–REFBF (datasheet: 10 µF across) | Reference droop under conversion load | Short ties REFTF to REFBF — span collapses to zero |
| C6 | 100 nF X7R | VREF decoupling | Noisier reference | Short grounds VREF — no span, R3/R4 loaded |
| C7 | 10 µF X5R | AVDD filter bulk (with R5) | Filter corner rises; supply noise reaches AVDD | Short kills AVDD through R5 (10 Ω limits fault current to ~330 mA — R5 burns) |
| C8 | 100 nF X7R | AVDD decoupling at the pin | Local transient starvation | Same fault path as C7 |
| C9 | 100 nF X7R | DRVDD decoupling | Output-driver noise couples back | Short kills the 3V3 rail (host limit should catch it) |
| C10 | 100 nF X7R | U2 op-amp decoupling | Buffer oscillation risk (200 MHz part) | Same as C9 |
| C11 | 10 µF X5R | Module bulk at the PMOD plugs | Rail droop on transients | Same as C9 |
| JP3 | 2-pad solder jumper, bridged (DNP in BOM/POS) | Bridged = 1:1, cut = 10.1:1 divider | If cut: 10:1 mode (that is the feature) | Re-bridge with solder to restore 1:1 |
| JP4 | 3-pad solder jumper, 1-2 bridged (DNP in BOM/POS) | Reference select: 1-2 = 2.02 V span, 2-3 = 1.25 V span | REFSENSE floats — reference undefined; never leave open | Three-pad bridge shorts REF_DIV to VREF (span ≈ 1.25 V, divider misloaded) |
| #FLG01–03 | ERC power flags (3V3, GND, AVDD_F) | Schematic ERC bookkeeping only | ERC warnings | Not applicable; no physical part |
6. Datasheet summary and design interpretation#
Consulted directly: TI OPA356/OPA2356 datasheet SBOS212A (November 2001), <https://www.ti.com/lit/ds/symlink/opa356.pdf>.
The AD9280 datasheet could not be fetched during this review (both <https://www.analog.com/media/en/technical-documentation/data-sheets/AD9280.pdf> and <https://www.analog.com/en/products/ad9280.html> timed out). The AD9280 rows below are written from the reviewer's knowledge of that datasheet (Rev. B era) and the design script's own annotations; every AD9280 fact must be re-verified against the actual datasheet before layout release and before trusting any bench limit derived from it. The BAT54S facts trace to the Nexperia datasheet URL recorded in the design script (<https://assets.nexperia.com/documents/data-sheet/BAT54_SER.pdf>), not to a fresh fetch.
| Manufacturer fact | Board-specific interpretation |
|---|---|
| AD9280: 8-bit, 32 MSPS pipeline ADC, single supply 2.7–5.5 V, ~95 mW class at 3 V (re-verify) | 25 MHz host clock sits inside the rating with margin; expect roughly 30 mA on the analog supply — which drops ~0.3 V across R5 (10 Ω). AVDD ≈ 3.0 V still exceeds the 2.7 V minimum, but measure it (Section 7) |
| AD9280: internal 1.25 V bandgap; REFSENSE strapping selects the reference: REFSENSE = VREF → VREF = 1.25 V; REFSENSE on an external divider tap → VREF = 1.25 V × (1 + R_top/R_bottom); REFSENSE = AVDD → external-reference mode (re-verify exact table) | JP4 1-2 (default) puts REFSENSE on the R3/R4 tap: VREF = 1.25 × (1 + 6.2/10) = 2.025 V — the datasheet's single-supply 0–2 V configuration. JP4 2-3 gives 1.25 V. The bandgap's own tolerance scales full scale directly; get the spec from the datasheet for the tolerance budget (Section 9.F) |
| AD9280: MODE pin selects the span configuration; MODE = AVDD → top/bottom mode: REFTS/REFBS set the span top and bottom; REFTF/REFBF are internal reference-buffer force nodes needing 0.1 µF each plus 10 µF across (re-verify) | This board: MODE = AVDD_F, REFTS = VREF, REFBS = GND → span 0 V..VREF. C3/C4/C5 match the decoupling recipe. At bring-up expect REFTS ≈ 2.02 V, REFBS ≈ 0 V, REFSENSE/REF_DIV ≈ 1.25 V (the servo point), REFTF ≈ REFTS and REFBF ≈ REFBS (buffered copies — verify exact expected force-node voltages from the datasheet) |
| AD9280: pipeline latency of three clock cycles; outputs are straight binary with OTR flagging over/under-range; STBY high powers down; THREE-STATE high floats the bus; CLAMP/CLAMPIN implement a video clamp (re-verify all) | Host HDL must discard the first three samples after any clock or MUX event. CLAMP/CLAMPIN/THREE-STATE are tied low (disabled/driven), STBY strapped low through R6 — the ADC free-runs whenever clocked |
| OPA356 (SBOS212A): 2.5–5.5 V single supply, unity-gain stable, 450 MHz unity-gain bandwidth, 8.3 mA typ / 11 mA max Iq, Vos ±2 mV typ / ±9 mV max, input bias 3 pA, rail-to-rail output (within 100 mV typ at 1 kΩ) | The 8.3 mA quiescent is the largest single line item in module current. Vos max (±9 mV) is ±1.1 LSB at the 7.9 mV LSB — include it in the tolerance budget |
| OPA356: input common-mode range is (V−) − 0.1 V to (V+) − 1.5 V — the input is NOT rail-to-rail | Design risk: at 3.3 V supply the CM ceiling is ≈1.8 V, but the ADC span tops at 2.02 V. The top ~0.22 V (~11% of the range, codes above ~227) drives the buffer outside its specified CM range — expect gain error or distortion near full scale. Mitigations: JP4 2-3 (1.25 V span, fully inside CM range) or a future rev with a level-shifted front end. The README's "rail-to-rail buffer" wording overstates the input side. Characterize this explicitly in Section 9.F/9.G |
| OPA356: abs max signal input (V−) − 0.5 V to (V+) + 0.5 V, 10 mA clamped input current | The BAT54S clamp (~0.3–0.4 V forward at low current) holds VIN inside the ±0.5 V window — the clamp protects the buffer, provided clamp current stays controlled (Section 9.E) |
| BAT54S: dual series Schottky, ~200 mA continuous, VF ~0.3–0.4 V at 1 mA class (per Nexperia datasheet; re-verify) | Positive clamp current is dumped into the 3V3 rail; the ~40 mA module quiescent absorbs small clamp currents, but a stiff overdrive with an unloaded rail could pump 3V3 up. Keep deliberate overdrive behind series resistance |
Check the latest datasheet revisions before procurement; the AD9280 rows in particular are unverified in this document.
7. Expected values before bench testing#
Targets assume 3V3 = 3.300 V, JP3 bridged (1:1), JP4 1-2 (VREF ≈ 2.025 V), 1% resistors, and a running 25 MHz clock unless stated. All are design targets, not measured results; the ones marked (re-verify) depend on AD9280 datasheet numbers that could not be confirmed.
| Quantity | Design target / calculated | What to measure |
|---|---|---|
| Module supply current, running | ~40 mA (≈30 mA ADC (re-verify) + 8.3 mA U2 + reference/divider ~0.2 mA) | Bench supply, standalone context |
| Module supply current, STBY high | ~9–10 mA (U2 keeps drawing 8.3 mA; ADC standby is small (re-verify)) | Same, with J3-3 driven high |
| AVDD_F (U1 AVDD pin) | 3.3 V − I_AVDD × 10 Ω ≈ 3.0 V at 30 mA; must stay > 2.7 V | DMM at C8 |
| VREF | 1.25 × (1 + 6.2k/10k) = 2.025 V ± (bandgap tol. (re-verify) + ~0.8% divider) | DMM at C6 |
| REF_DIV / REFSENSE | 1.25 V (bandgap servo point) | DMM at JP4 pad 1 |
| REFTS | = VREF ≈ 2.025 V | U1 REFTS pin |
| REFBS | 0 V (tied to GND) | U1 REFBS pin |
| REFTF / REFBF | ≈ REFTS / ≈ REFBS (buffered force nodes; exact values re-verify) | C3 / C4 |
| LSB size | 2.025 V / 256 = 7.91 mV | — (derived) |
| VIN and AIN with input grounded | 0 V ± U2 Vos (±9 mV max) | DMM at D1 COM and U1 AIN |
| Divider ratio, JP3 cut | (910k + 100k)/100k = 10.10 ± ~1.8% (two 1% parts) | Resistance per Section 9.D |
| Input impedance, 1:1 / 10:1 | 100 kΩ / 1.01 MΩ | Ohmmeter at J2, unpowered |
| Code at 1.000 V in, 1:1 | (1.000/2.025) × 255 = 126 (would be 128 on an ideal 2.000 V span) | Section 9.C |
| OTR | 0 for in-range codes; 1 with codes 0 or 255 when driven past the span | Host capture |
| CLK | 25 MHz square from the host, 3.3 V CMOS | Scope at J3-1 |
| Data pipeline latency | 3 CLK cycles (re-verify) | Host capture alignment |
Known-DC-level code math#
General formula (top/bottom mode, V_bottom = REFBS = 0 V, V_top = VREF):
code = (Vin − V_bottom) / (V_top − V_bottom) × 255
= Vin / 2.025 × 255 (JP3 bridged, JP4 1-2)
= Vin / (10.10 × 2.025) × 255 (JP3 cut, 10:1)
Worked example: with the nominal 0–2 V span, 1.0 V in reads code ~128 of 255 on an ideal 2.000 V span; with this board's exact 2.025 V VREF the nominal expectation is code 126. Tolerance bounds below use ±4% of reading ± 3 LSB — the Section 9.F budget with placeholder AD9280 terms, to be tightened once the datasheet numbers are confirmed.
| Vin (1:1 mode) | Nominal code | Acceptance band (±4% ± 3 LSB) |
|---|---|---|
| 0.100 V | 13 | 9–17 |
| 0.500 V | 63 | 58–68 |
| 1.000 V | 126 | 118–134 |
| 1.500 V | 189 | 178–200 (top of U2 CM range is near 1.8 V — watch above this) |
| 1.800 V | 227 | 215–239 (CM-limit boundary; flag deviations) |
| 2.000 V | 252 | 239–255 (may clip; OTR may assert; U2 CM exceeded) |
| Vin (10:1 mode, JP3 cut) | Nominal VIN at buffer | Nominal code |
|---|---|---|
| 5.00 V | 0.495 V | 62 |
| 10.00 V | 0.990 V | 125 |
| 15.00 V | 1.485 V | 187 |
| 20.00 V | 1.980 V | 249 |
10:1-mode bands add the ±1.8% divider-ratio tolerance to the 1:1 budget.
8. Manual schematic and assembly review checklist#
- Confirm U1 orientation and the ARSZ suffix; the SSOP-28 footprint was assigned manually (the stock symbol has none) — verify pad 1 and pitch against the physical part before ordering stencils.
- Confirm U2 orientation (SOIC-8; pins 1/5/8 are NC on the OPA356AID).
- Confirm D1 (BAT54S, SOT-23) orientation: series pair with COM on VIN, anode end to GND, cathode end to 3V3.
- Verify JP3 bridged and JP4 bridged 1-2 (pads 2-3 open, no three-pad bridge).
- Measure R3 = 6.2 k (VREF–REF_DIV), R4 = 10 k (REF_DIV–GND), R5 = 10 Ω (3V3–AVDD_F), R6 = 10 k (STBY_S–GND), R16 = 100 Ω (STBY_S–J3-3).
- Measure R1 = 910 k (SIG_IN–VIN, JP3 cut to read it), R2 = 100 k (VIN–GND).
- Buzz all nine 100 Ω series paths: U1 data pins through R7–R14 to J1 pins 1–4/7–10 in order D0–D7, and OTR through R15 to J3-2.
- Buzz J2 pin 1 to the J4 center pin (parallel inputs) and J2 pin 2 to the BNC shell (GND).
- Check C3/C4/C5 land directly at REFTF/REFBF and C8 at the AVDD pin during layout review (layout not yet started — carry forward).
- Carry forward the silkscreen warning requirement: DC-coupled, 0–2 V (0–20 V at 10:1), no isolation.
- Confirm no solder bridges on the 0.65 mm-pitch SSOP-28, especially the reference cluster (REFSENSE/VREF/REFTS/REFBS/REFTF/REFBF are adjacent).
9. Ordered bench-test procedure#
Stop at the first abnormal result. Record board serial, host identity, jumper states, measured 3V3, and the DMM used for reference checks.
Two bench contexts are used throughout: (a) PMOD host — both plugs seated in two adjacent 3.3 V PMOD ports on the ECP5 host (ULX3S-class), CLK from a clock-capable fabric pin, codes captured by a small HDL harness; (b) standalone — 3V3/GND from a current-limited bench supply (100 mA limit), CLK from a 3.3 V function/pulse generator, D0–D7/OTR captured on a logic analyzer.
A. Unpowered inspection and resistance tests#
- Complete the Section 8 checklist under magnification.
- Measure 3V3-to-GND resistance in both polarities; investigate < 1 kΩ.
- Measure AVDD_F-to-GND (through R5 it should track the 3V3 reading plus 10 Ω) and VREF-to-GND (≈16.2 kΩ, the R3+R4 string, once the internal circuits are out of the picture — record the actual value as a fingerprint).
- Jumper-position resistance checks at J2 (probe pin 1 to pin 2):
- JP3 bridged: ≈ 100 kΩ (R2), and SIG_IN-to-VIN ≈ 0 Ω.
- JP3 cut: ≈ 1.01 MΩ (R1 + R2), and SIG_IN-to-VIN ≈ 910 kΩ.
- Diode-check D1 from the VIN node: ~0.3 V drop to 3V3 (positive lead on VIN) and ~0.3 V drop from GND (positive lead on GND side); open in reverse.
B. First power, no clock#
- Power in context (b) first. Supply current ≈ 40 mA (Section 7); anything over ~60 mA or under ~10 mA is abnormal — stop.
- Measure the reference ladder: VREF ≈ 2.025 V, REF_DIV ≈ 1.25 V, REFTS ≈ 2.025 V, REFBS = 0 V, REFTF/REFBF ≈ their sense counterparts. A REF_DIV reading of 1.25 V is the single best evidence the internal reference and REFSENSE strapping work as designed. If VREF reads ≈1.25 V instead, suspect JP4 bridged 2-3 or a three-pad bridge.
- Measure AVDD_F ≈ 3.0 V (> 2.7 V required). Record the R5 drop as the measured I_AVDD.
- Ground the input (JP3 bridged, J2 shorted): VIN and AIN both 0 V ± 10 mV. Apply 1.000 V from a bench source: VIN = AIN = 1.000 V ± Vos (buffer follows).
- Drive STBY (J3-3) high: supply current drops to the standby target; release: current returns.
- Repeat step 1–3 in context (a) with the FPGA unconfigured.
C. Static DC code readout (known-DC-level test)#
Context (a) with a minimal capture harness (25 MHz clock, register D0–D7 and OTR every cycle), or context (b) with a 1–25 MHz generator clock and logic analyzer. Remember the 3-cycle pipeline latency (re-verify) when aligning.
- Input grounded: code 0–3 expected (offset + Vos), OTR may assert at code 0.
- Apply DMM-verified DC levels per the Section 7 table (0.1, 0.5, 1.0, 1.5, 1.8, 2.0 V). Compare each captured code (average ≥ 1000 samples) against the acceptance band. 1.000 V must read ~126 (128 on an ideal 2.000 V span).
- Record the 1.8–2.0 V behavior separately: deviation growing above 1.8 V is the OPA356 CM-range limitation showing (Section 6), not necessarily an ADC fault.
- Confirm OTR = 1 exactly when the code rails at 0 or 255.
D. 10:1 divider position checks#
- Power off. Cut JP3. Repeat the Section 9.A.4 resistance checks for the cut position (1.01 MΩ input, 910 kΩ across the jumper).
- Power on, apply 10.00 V (DMM-verified): VIN ≈ 0.990 V, code ≈ 125.
- Walk 5/10/15/20 V per the Section 7 10:1 table.
- Compute the measured scale factor (Vin/VIN) and record it against the 10.10 nominal ± 1.8% band.
- Re-bridge JP3 and re-verify one 1:1 point (1.000 V → ~126) to prove the rework.
E. Clamp/protection diode test (controlled overdrive)#
The clamp must conduct where expected and nowhere else. All overdrive goes through an external 10 kΩ series resistor in 1:1 mode; the module's own ~40 mA draw absorbs the injected current without pumping the rail, but monitor 3V3 anyway.
- 1:1 mode, +5.0 V source through 10 kΩ into J2-1: VIN clamps at ≈ 3.6–3.7 V (3V3 + one VF). Clamp current = (5.0 − 3.65)/10 kΩ ≈ 135 µA — measure it as the drop across the external resistor. Code reads 255, OTR = 1, 3V3 unchanged.
- −5.0 V through 10 kΩ: VIN clamps at ≈ −0.3 to −0.4 V; current ≈ (5.0 − 0.35)/10 kΩ ≈ 465 µA. Code 0, OTR = 1.
- 10:1 mode (JP3 cut), +30 V applied directly: VIN ≈ 2.97 V unclamped — below the clamp threshold, so no clamp current flows; code 255, OTR = 1. This proves R1 alone keeps 30 V safe. (The clamp would begin conducting only above ≈ 3.65 × 10.1 ≈ 37 V at the input; at 50 V the current would be (50 − 3.65)/910 kΩ ≈ 51 µA — do not test above 30 V on the bench; 0603 voltage ratings and creepage are unreviewed.)
- After each overdrive, re-run one Section 9.C point to confirm no degradation.
F. Instrument validation against a known source#
This is an instrument board: before any measurement made with it is quoted, validate it against a calibrated reference.
- Source: a calibrated voltage reference or a bench supply verified at the test point by a DMM with current calibration (record DMM ID and cal date).
- Tolerance budget for the acceptance band (all worst-case terms added):
- divider ratio (10:1 mode only): ±1.8% (two 1% resistors)
- VREF: bandgap tolerance (re-verify from datasheet) + ±0.8% (R3/R4 ratio, 1% parts)
- ADC gain + offset error: placeholder ±2% ± 2 LSB (re-verify)
- buffer Vos: ±9 mV max = ±1.1 LSB Combined placeholder budget: ±4% of reading ± 3 LSB (1:1), ±6% ± 3 LSB (10:1). Recompute both once the AD9280 datasheet numbers are confirmed, and tighten to the real budget.
- Apply 5 DMM-verified levels spanning 10–90% of each range (both JP3 positions); every averaged code must fall inside the computed band. Record the worst deviation as the module's provisional accuracy figure.
- Restrict the quoted validated range to ≤1.8 V at the buffer until the CM-limit behavior (9.C.3) is characterized.
G. Staircase/ramp linearity with AXL-003 (wavegen)#
Uses the companion AXL-003 wavegen module as the source and the FPGA host as the capture engine — the intended self-test pairing.
- Drive a slow full-scale ramp (or the R-2R staircase) from AXL-003 into J2, 1:1 mode: period ≥ 10 ms so every output code is visited many times at 25 MSPS (decimate in the capture core).
- Capture ≥ 10 full periods of codes on the host.
- Monotonicity: on the rising ramp, codes must never decrease (beyond 1-code noise). Every code 1–250 must appear (no missing codes — a DNL proxy).
- INL-style check: fit a straight line to code-vs-time over the linear ramp segment; deviation of the code-transition points from the fit should stay within ±2 LSB below code ~227, and the region above (U2 CM limit) is recorded separately.
- Cross-check the ramp endpoints against a scope on VIN so wavegen nonlinearity is not misattributed to this board.
H. Dynamic and host-integration tests#
- Scope CLK at J3-1 at the ADC pin side of the connector: clean 25 MHz, 3.3 V CMOS, no double-clocking (ringing through the un-terminated PMOD interconnect is a known risk — record the waveform).
- Scope one data line (e.g. D7 after R14) while converting a mid-scale DC level: stable levels, transitions only at clock edges.
- Slow-clock regression: repeat 9.C at 1 MHz CLK; codes must match the 25 MHz results within noise (pipeline parts have minimum clock specs — re-verify the AD9280 floor before going far below 1 MHz).
- STBY functional test under clock: assert J3-3 high mid-capture; data collapses; release; data returns after the pipeline refills.
- Sine capture from AXL-003 for the full scope demo (trigger, decimation, pre-trigger ring) — beyond bring-up scope; record results with the HDL revision.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| Supply current ~10 mA, no codes | AVDD_F voltage, STBY_S level | R5 open, STBY held high (R6/R16/J3-3), U1 unpowered |
| Supply current ≈ 0 | 3V3 at both plugs | Plug seating (dual-PMOD offset), host port power |
| VREF reads 1.25 V, not 2.02 V | JP4 pad states, REF_DIV voltage | JP4 bridged 2-3 or three-pad bridge; R3 open |
| VREF ≈ 0 or rail | REFSENSE voltage, C6 short check | JP4 open (REFSENSE floating), reference-cluster solder bridge |
| REF_DIV ≠ 1.25 V with VREF wrong | R3/R4 values | Wrong divider values — span rescaled silently |
| All codes 0 | AIN voltage, CLK presence | No clock, U2 output stuck (check C10, ±IN swap), AIN solder |
| All codes 255, OTR = 1 | VIN, AIN | Input overdriven; D1 reversed and clamping to a diode drop; AIN shorted to a reference node |
| Code ~126 expected, reads ~252 | JP3 state | Testing a 10:1 expectation with JP3 bridged (or vice versa) |
| Codes scale ~2x wrong | VREF | Span is 1.25 V, not 2.02 V (JP4) |
| Good linearity low, bends above ~1.8 V at the buffer | Code vs Vin plot | OPA356 input CM limit (design limitation, Section 6) — not an assembly fault |
| One data bit stuck | That bit at U1 pin vs J1 pin | 100 Ω series resistor open, SSOP bridge, host pin assignment |
| Codes noisy/unstable | AVDD_F ripple, CLK integrity | R5/C7/C8 filter, clock ringing over the PMOD interconnect, missing REFTF/REFBF decoupling |
| OTR never asserts | R15 path, J3-2 | Series resistor open; host reading the wrong pin |
| Rail rises during overdrive | 3V3 while clamping | Clamp current exceeding module draw — reduce source or add load |
11. Bench record template#
| Field | Record |
|---|---|
| Board revision / serial | |
| Host context (dual-PMOD FPGA / standalone) and IDs | |
| JP3 / JP4 states as inspected | |
| DMM / scope / generator IDs and cal dates | |
| Measured 3V3, AVDD_F, module current (run / STBY) | |
| Reference ladder: VREF, REF_DIV, REFTS, REFBS, REFTF, REFBF | |
| Resistance fingerprints (9.A) both JP3 positions | |
| DC code table (9.C) actual codes vs bands | |
| 10:1 scale factor measured (9.D) | |
| Clamp test currents and rail behavior (9.E) | |
| Instrument-validation worst deviation (9.F) | |
| Ramp monotonicity / missing codes / INL result (9.G) | |
| CLK waveform capture reference (9.H) | |
| Deviations, captures, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The design is a faithful implementation of the AD9280 single-supply 0–2 V application: correct top/bottom reference strapping (MODE = AVDD, REFTS = VREF, REFBS = GND) with the REFSENSE divider giving a selectable 2.02 V/1.25 V span, the full datasheet reference decoupling, a documented RC substitution for the missing ferrite bead, series protection on all nine ADC-driven lines, and a sensible default-run STBY strap. The front end is honest about being rev-1: DC-coupled, unipolar, and jumper-scaled, with the BAT54S clamp placed where it protects the buffer.
The principal open risks: (1) the OPA356 input common-mode ceiling (~1.8 V at 3.3 V) sits below the 2.02 V span top — the top ~11% of the range is outside the buffer's specified input range and must be characterized or the span dropped to 1.25 V; the README's "rail-to-rail" description holds only for the output. (2) The AD9280 datasheet could not be fetched for this review — every reference-mode, latency, power, and accuracy figure above is from memory and must be re-verified. (3) No PCB exists: reference-cluster and AVDD decoupling placement, the dual-plug 0.9" mechanical alignment, and 25 MHz clock/data integrity over un-terminated PMOD interconnect are all unverified. (4) The clamp returns overdrive current into the 3V3 rail, which is only safe while the module's own draw exceeds the injected current. (5) The ~0.3 V drop across R5 leaves AVDD ≈ 3.0 V — legal but worth a measured confirmation. (6) Every expected code and voltage in this guide is calculated, not measured on hardware.