← AXL-002

Circuit review & bench-test guide

AXL-002 — Oscilloscope front end dual-PMOD module (AD9280)

Design-stage — board not yet fabricated

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#

3. Power and control sequence#

  1. 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.
  2. 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).
  3. 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.
  4. 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).
  5. 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.
  6. 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) pin123456789101112
NetD0D1D2D3GND3V3D4D5D6D7GND3V3
Directionoutoutoutoutoutoutoutout
J3 (PMOD B) pin123456789101112
NetCLKOTRSTBYNCGND3V3NCNCNCNCGND3V3
Directionin (host 25 MHz)outin (optional)
J2 pin12J4 (BNC)centershell
NetSIG_INGNDNetSIG_INGND

Jumper configuration review:

JumperPositionEffect
JP3Bridged (default)1:1 input, 0–2.02 V span, ~100 kΩ input impedance (R2)
JP3Cut10.1:1 divider (R1/R2), ≈0–20.4 V span, ~1.01 MΩ input impedance
JP41-2 (default)REFSENSE = R3/R4 tap → VREF ≈ 2.02 V (0–2 V span)
JP42-3REFSENSE = 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 / valueFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J112-pin PMOD plug (PMOD A: DATA)D0–D7 to the host, plus powerNo data (and possibly no power)Offset insertion puts 3V3 on data pins; verify both plugs seat together
J312-pin PMOD plug (PMOD B: CTRL)CLK in, OTR out, STBY in, plus powerNo sample clock — ADC never convertsSame offset risk; CLK on a non-clock-capable host pin degrades sampling
J21x2 2.54 mm header (pin 1 SIG_IN, pin 2 GND)Breadboard signal input, parallel with J4BNC remainsSwapped probe puts the source on GND
J4Amphenol B6252HB-NPP3G-50 BNCCabled signal input, parallel with J2 (stock footprint verified; fitted)Header remainsShell is board GND — earths the module to a grounded source
U1ADI AD9280ARSZ, SSOP-28 (footprint assigned explicitly; the stock symbol has none)8-bit 32 MSPS pipeline ADC — the module's entire functionNo conversionsRotated package misapplies AVDD; 0.65 mm pitch bridges hang data lines or short the reference nodes
U2TI OPA356AIDR, SOIC-8200 MHz CMOS unity buffer isolating the ~100 kΩ (or 1 MΩ) source node from the ADC's switched-capacitor inputAIN floats — undefined codesSwapped +IN/−IN latches the output; note the input CM ceiling of V+ − 1.5 V (Section 6)
D1Nexperia BAT54S (series pair, SOT-23)Clamps VIN between ~GND − 0.3 V and ~3V3 + 0.3 V ahead of the bufferOverdrive reaches U2's internal diodes (±0.5 V beyond rails, 10 mA abs max) directlyReversed part clamps the working range; leaky part loads the divider
R1910 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
R2100 kΩ 0603Divider bottom leg and input bleed; sets the 1:1-mode 100 kΩ input impedanceInput floats in 1:1 mode with no source attached; divider becomes 1:1 follow-through in 10:1 modeShort grounds the input; wrong value rescales the divider
R36.2 kΩ 0603REFSENSE divider top: VREF = 1.25 V × (1 + R3/R4) ≈ 2.02 VVREF servo opens — reference undefined in JP4 1-2 modeWrong value moves the full-scale span directly
R410 kΩ 0603REFSENSE divider bottomSame as R3Same as R3
R510 Ω 0603AVDD filter (with C7/C8); documented ferrite-bead substitutionADC unpowered (AVDD open)Short removes filtering only; wrong (larger) value starves AVDD via IR drop
R610 kΩ 0603STBY pull-down strap: ADC runs by defaultSTBY floats — power state undefinedShort to GND is the same as the strap (benign); miswired to 3V3 holds the ADC in standby
R7–R14100 Ω 0603 (x8)Series protection on ADC-driven D0–D7 toward the hostThat bit reads stuck/floating at the hostWrong (large) value plus bus capacitance slows edges at 25 MHz — do not increase
R15100 Ω 0603Same, on OTRNo out-of-range flagSame as R7–R14
R16100 Ω 0603Series on the host STBY control line into the R6 strap nodeHost cannot control STBY (strap still runs the ADC)Short is benign; open is the "absent" case
C3100 nF X7RREFTF decoupling (datasheet reference decoupling)Reference node ringing, degraded conversionsShort drags REFTF to GND — reference collapses
C4100 nF X7RREFBF decouplingSame class as C3Short drags REFBF to GND (small effect — REFBS is GND anyway)
C510 µF X5RReference force-node bulk across REFTF–REFBF (datasheet: 10 µF across)Reference droop under conversion loadShort ties REFTF to REFBF — span collapses to zero
C6100 nF X7RVREF decouplingNoisier referenceShort grounds VREF — no span, R3/R4 loaded
C710 µF X5RAVDD filter bulk (with R5)Filter corner rises; supply noise reaches AVDDShort kills AVDD through R5 (10 Ω limits fault current to ~330 mA — R5 burns)
C8100 nF X7RAVDD decoupling at the pinLocal transient starvationSame fault path as C7
C9100 nF X7RDRVDD decouplingOutput-driver noise couples backShort kills the 3V3 rail (host limit should catch it)
C10100 nF X7RU2 op-amp decouplingBuffer oscillation risk (200 MHz part)Same as C9
C1110 µF X5RModule bulk at the PMOD plugsRail droop on transientsSame as C9
JP32-pad solder jumper, bridged (DNP in BOM/POS)Bridged = 1:1, cut = 10.1:1 dividerIf cut: 10:1 mode (that is the feature)Re-bridge with solder to restore 1:1
JP43-pad solder jumper, 1-2 bridged (DNP in BOM/POS)Reference select: 1-2 = 2.02 V span, 2-3 = 1.25 V spanREFSENSE floats — reference undefined; never leave openThree-pad bridge shorts REF_DIV to VREF (span ≈ 1.25 V, divider misloaded)
#FLG01–03ERC power flags (3V3, GND, AVDD_F)Schematic ERC bookkeeping onlyERC warningsNot 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 factBoard-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-railDesign 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 currentThe 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.

QuantityDesign target / calculatedWhat 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 VDMM at C8
VREF1.25 × (1 + 6.2k/10k) = 2.025 V ± (bandgap tol. (re-verify) + ~0.8% divider)DMM at C6
REF_DIV / REFSENSE1.25 V (bandgap servo point)DMM at JP4 pad 1
REFTS= VREF ≈ 2.025 VU1 REFTS pin
REFBS0 V (tied to GND)U1 REFBS pin
REFTF / REFBF≈ REFTS / ≈ REFBS (buffered force nodes; exact values re-verify)C3 / C4
LSB size2.025 V / 256 = 7.91 mV— (derived)
VIN and AIN with input grounded0 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:1100 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
OTR0 for in-range codes; 1 with codes 0 or 255 when driven past the spanHost capture
CLK25 MHz square from the host, 3.3 V CMOSScope at J3-1
Data pipeline latency3 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 codeAcceptance band (±4% ± 3 LSB)
0.100 V139–17
0.500 V6358–68
1.000 V126118–134
1.500 V189178–200 (top of U2 CM range is near 1.8 V — watch above this)
1.800 V227215–239 (CM-limit boundary; flag deviations)
2.000 V252239–255 (may clip; OTR may assert; U2 CM exceeded)
Vin (10:1 mode, JP3 cut)Nominal VIN at bufferNominal code
5.00 V0.495 V62
10.00 V0.990 V125
15.00 V1.485 V187
20.00 V1.980 V249

10:1-mode bands add the ±1.8% divider-ratio tolerance to the 1:1 budget.

8. Manual schematic and assembly review checklist#

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#

  1. Complete the Section 8 checklist under magnification.
  2. Measure 3V3-to-GND resistance in both polarities; investigate < 1 kΩ.
  3. 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).
  4. Jumper-position resistance checks at J2 (probe pin 1 to pin 2):
  1. 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#

  1. Power in context (b) first. Supply current ≈ 40 mA (Section 7); anything over ~60 mA or under ~10 mA is abnormal — stop.
  2. 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.
  3. Measure AVDD_F ≈ 3.0 V (> 2.7 V required). Record the R5 drop as the measured I_AVDD.
  4. 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).
  5. Drive STBY (J3-3) high: supply current drops to the standby target; release: current returns.
  6. 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.

  1. Input grounded: code 0–3 expected (offset + Vos), OTR may assert at code 0.
  2. 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).
  3. 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.
  4. Confirm OTR = 1 exactly when the code rails at 0 or 255.

D. 10:1 divider position checks#

  1. 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).
  2. Power on, apply 10.00 V (DMM-verified): VIN ≈ 0.990 V, code ≈ 125.
  3. Walk 5/10/15/20 V per the Section 7 10:1 table.
  4. Compute the measured scale factor (Vin/VIN) and record it against the 10.10 nominal ± 1.8% band.
  5. 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: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.
  2. −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.
  3. 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.)
  4. 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.

  1. 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).
  2. Tolerance budget for the acceptance band (all worst-case terms added):
  1. 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.
  2. 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.

  1. 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).
  2. Capture ≥ 10 full periods of codes on the host.
  3. 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).
  4. 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.
  5. 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#

  1. 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).
  2. Scope one data line (e.g. D7 after R14) while converting a mid-scale DC level: stable levels, transitions only at clock edges.
  3. 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).
  4. STBY functional test under clock: assert J3-3 high mid-capture; data collapses; release; data returns after the pipeline refills.
  5. 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#

SymptomFirst measurementsLikely areas
Supply current ~10 mA, no codesAVDD_F voltage, STBY_S levelR5 open, STBY held high (R6/R16/J3-3), U1 unpowered
Supply current ≈ 03V3 at both plugsPlug seating (dual-PMOD offset), host port power
VREF reads 1.25 V, not 2.02 VJP4 pad states, REF_DIV voltageJP4 bridged 2-3 or three-pad bridge; R3 open
VREF ≈ 0 or railREFSENSE voltage, C6 short checkJP4 open (REFSENSE floating), reference-cluster solder bridge
REF_DIV ≠ 1.25 V with VREF wrongR3/R4 valuesWrong divider values — span rescaled silently
All codes 0AIN voltage, CLK presenceNo clock, U2 output stuck (check C10, ±IN swap), AIN solder
All codes 255, OTR = 1VIN, AINInput overdriven; D1 reversed and clamping to a diode drop; AIN shorted to a reference node
Code ~126 expected, reads ~252JP3 stateTesting a 10:1 expectation with JP3 bridged (or vice versa)
Codes scale ~2x wrongVREFSpan is 1.25 V, not 2.02 V (JP4)
Good linearity low, bends above ~1.8 V at the bufferCode vs Vin plotOPA356 input CM limit (design limitation, Section 6) — not an assembly fault
One data bit stuckThat bit at U1 pin vs J1 pin100 Ω series resistor open, SSOP bridge, host pin assignment
Codes noisy/unstableAVDD_F ripple, CLK integrityR5/C7/C8 filter, clock ringing over the PMOD interconnect, missing REFTF/REFBF decoupling
OTR never assertsR15 path, J3-2Series resistor open; host reading the wrong pin
Rail rises during overdrive3V3 while clampingClamp current exceeding module draw — reduce source or add load

11. Bench record template#

FieldRecord
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.