← AXS-033

Circuit review & bench-test guide

AXS-033 — Build-your-own sigma-delta ADC lab PMOD module

Design-stage — board not yet fabricated

Document purpose#

This document explains the axs-033-sigma-delta prototype at component level and turns the design evidence into a practical manual-review and bench-test plan. It is based on the implemented schematic generator (generate_design.py), the module README, the sensor-line conventions in ../README.md, and the verified Pmod-spec notes in ../../pmod-common/PMOD-SPEC-NOTES.md.

This board is a schematic-complete prototype only. It has not been laid out, fabricated, assembled, or bench-verified. Repository status: schematic generated, ERC clean (0 errors / 0 warnings), netlist reviewed; PCB layout not started. Every numeric value below is a design target, not a measurement. Comparator figures were verified against the fetched TI TLV3501 datasheet (SBOS321E); see Section 6.

1. What the board does#

This module is half of an ADC; the FPGA is the other half. A TI TLV3501 4.5 ns rail-to-rail comparator and an RC integrator (R2 = 10 kOhm, C1 = 10 nF, tau = 100 us) form the analog part of a first-order sigma-delta modulator whose loop closes through the FPGA fabric: the comparator's 1-bit answer (SD_CMP, PMOD pin 1) is registered by a fabric flip-flop each clock, and the registered bit (SD_FB, PMOD pin 2) drives back through R2 into the integrator node on the comparator's inverting input. With the loop running, the RC node servos to the input voltage and the density of 1s in the bit stream equals Vin/3.3. A CIC or plain-averaging decimator in fabric turns the stream into samples; oversampling ratio trades rate for ENOB. DNP pads (R3, C2) allow time-constant experiments.

The analog input arrives on J2 (AIN/GND/3V3, 0 to 3.3 V range) through R1 into the comparator's non-inverting input.

Functional block diagram#

J2 ANALOG IN                              PMOD host (AruviX ECP5 rev-A or
 1 AIN --- R1 10k --- CMP_INP --->|+ \        any 3.3 V Digilent socket)
 2 GND                            |   \ U1        |
 3 3V3                            |TLV3501>-- R4 100R --> J1 pin 1 SD_CMP
             SD_INT ------------->|- /  (CMP_OUT)         |
               |                  |                   [fabric FF, clk Fclk]
               +-- C1 10n --- GND |SHDN=GND               |
               |   (C2 22n DNP)   |V+=3V3 (C3 100n)       v
               +-- R2 10k ------------------------<-- J1 pin 2 SD_FB
                   (R3 4.7k DNP)                     (host-driven feedback)

Loop: SD_FB <= SD_CMP registered at Fclk; 1-density of SD_CMP = Vin/3.3

2. Safety and scope boundaries#

3. Signal and power sequence, and how the loop works#

  1. The host applies 3.3 V/GND at J1. C3 decouples the comparator supply.
  2. SHDN is hard-wired to GND. Per the datasheet the part is disabled when SHDN is within 0.9 V of V+ and enabled when more than 1.7 V below V+; at GND on a 3.3 V rail it is firmly enabled. (The schematic comment says the same; the polarity is verified, not assumed.)
  3. Before the host drives SD_FB, the integrator node floats toward whatever the comparator input leakage (pA) and board leakage dictate; SD_CMP then sits at a rail. This is normal pre-loop behavior.
  4. The host loads the loop fabric: a single flip-flop clocked at Fclk samples SD_CMP and drives the registered value onto SD_FB. That is the entire modulator: the flip-flop is the quantizer memory (and synchronizer), R2/C1 is the loop integrator, U1 is the quantizer.
  5. Closed-loop action, one clock at a time: if Vin (through R1, at +in) is above the integrator node (at -in), the comparator outputs 1; the fabric registers it and drives SD_FB = 1 = 3.3 V through R2, charging C1 upward. When the node crosses above Vin the comparator flips to 0, the fabric feeds back 0 V, and C1 discharges. The node therefore saws in a small ripple band around Vin, and charge balance forces the average fed-back voltage - 3.3 V times the 1-density - to equal Vin. Hence 1-density = Vin/3.3.
  6. A decimator (CIC, or a plain counter over N clocks) converts density to a code: code = (ones in N)/N x full scale. OSR = N sets the resolution/rate trade.

Loop design numbers#

4. Interfaces and pin map#

Bench contexts: either a PMOD host (AruviX ECP5 rev-A or any 3.3 V Digilent-compatible PMOD socket) running the loop flip-flop, or a bench 3.3 V current-limited supply plus DMM/oscilloscope/logic analyzer for open-loop checks (the full ADC only exists with a host closing the loop).

J1 pinNetDirectionRole
1SD_CMPmodule to hostComparator bit stream (via R4)
2SD_FBhost to moduleRegistered feedback bit into R2
3, 4, 7-10NC-Unused
5, 11GND-Ground
6, 123V3-3.3 V supply
J2 pinNetRole
1AINAnalog input, 0 to 3.3 V
2GNDInput return
33V3Excitation for potentiometers/sensors (module rail)

No test points exist yet. The essential probe nodes are SD_INT (the R2/C1 junction at U1 -in), CMP_INP (after R1), CMP_OUT (before R4), and the two J1 signal pins; layout should promote SD_INT and CMP_OUT to test points.

5. Component-by-component review#

Ref.Part / datasheet summaryFunction and why neededIf absent/openIf shorted, wrong, or misassembled
J112-pin right-angle PMOD plugPower plus the two loop signalsNo functionSwapped pin-1/pin-2 host constraints create contention through R4
J21x3 pin header, 2.54 mmAnalog input plus GND/3V3 for the sourceNo input; loop servos to leakageMiswiring AIN to the 3V3 pin just reads full scale; shorting 3V3 to GND at the header is a rail short
U1TI TLV3501AIDBVR, 4.5 ns rail-to-rail push-pull comparator, SOT-23-6The quantizer: compares Vin (+in) against the integrator node (-in) at loop speedNo bit stream; SD_CMP floats (R4 only)Rotated part miswires the supply; +in/-in swap inverts loop polarity so feedback becomes positive - output rails or oscillates uselessly
R110 kOhm 0603 (Yageo RC0603FR-0710KL)Series isolation on the analog input: limits fault current into the diode-clamped input, decouples cable capacitance from the pinInput pin exposed directly to whatever J2 carriesWith pA bias currents its voltage drop is negligible, so a moderate value error is harmless; open leaves +in floating (stream becomes leakage-driven garbage)
R210 kOhm 0603Integrator resistor: converts the fed-back bit voltage into C1 charging current; sets tau with C1Loop broken: no feedback path, comparator saturates at a railWrong value shifts tau and ripple; short makes SD_FB drive C1/-in directly (host pad slams the node, no integration - loop nonfunctional)
C110 nF 50 V C0G 0603 (Murata GRM1885C1H103JA01D)Integrator capacitor; C0G because the integrator must be linear and low-hysteresis-in follows SD_FB through R2 with only parasitic filtering: wild ripple, no useful loopLeaky/wrong dielectric (X7R-class) adds voltage-coefficient distortion measurable in the sweep; short grounds -in (stream pegs to comparator offset around 0 V)
R34.7 kOhm 0603, DNPOptional parallel integrator resistor: tau = 32 us experimentsNothing (it is DNP by design)Populating it unknowingly changes tau by 3x - audit DNP status before correlating measurements
C222 nF C0G 0603, DNPOptional parallel integrator capacitor: tau = 320 us experimentsNothing (DNP)Same audit note as R3
R4100 Ohm 0603Series protection on the module-driven SD_CMP line, per the sensor-line rule; damps the fast comparator edge into the cable/hostHost miswiring couples full contention current into the comparator output stageLarge wrong value plus bus capacitance slows the 1.5 ns-class edges and can violate host setup at high Fclk; short only removes margin
C3100 nF 16 V X7R 0603Comparator supply decoupling; the TLV3501 draws fast current spikes on every toggleSupply bounce couples into the comparator thresholds: spurious toggles, degraded effective hysteresisShorted part is a rail short
#FLG01/#FLG02ERC power flagsSchematic-only artifacts marking 3V3/GND drivenNo physical effectNot applicable

TLV3501 key datasheet parameters (verified from TI SBOS321E)#

ParameterValueBench relevance
Propagation delay4.5 ns typ, 6.4 ns max (100 mV step, 20 mV overdrive); 7.5 ns typ at 5 mV overdriveNegligible against a 1-10 MHz loop clock
Toggle frequency80 MHz maxThe comparator is never the loop-speed limit here
Rise/fall time1.5 ns typWhy R4 damping and probing technique matter
Supply2.7 to 5.5 V specified (operating down to 2.2 V); abs max 5.5 V3.3 V rail is in the specified range
Supply current3.2 mA typ, 5 mA maxDominates the module's power budget
Input offset voltage+/-1 mV typ, +/-6.5 mV maxDirect code offset: 6.5 mV is 0.20% of FS, about 8 LSB at 12 bits
Input hysteresis6 mV typ (built in)Shapes the limit cycle; see Section 7 notes
Input bias current+/-2 pA typ (+/-10 pA max)No meaningful drop across R1/R2 networks
Common-mode range(V-) - 0.2 V to (V+) + 0.2 V (beyond the rails)The full 0-3.3 V input range is legal
OutputPush-pull rail-to-rail; within 30 mV typ / 50 mV max of the rails at +/-1 mASD_CMP swings essentially 0/3.3 into the light R4 load
SHDN thresholdsDisabled within 0.9 V of V+; enabled more than 1.7 V below V+Grounded SHDN = enabled, as wired
Input clamp limitInputs beyond a rail must be current-limited to 10 mAR1 provides the limiting for modest overdrive

6. Datasheet summary and design interpretation#

DeviceKey manufacturer facts used hereBoard-specific interpretation
TLV3501Verified from the fetched TLV3501 datasheet PDF (SBOS321E): the electrical table above, SOT-23-6 pinout (1 = -IN, 2 = V-, 3 = +IN, 4 = V+, 5 = OUT, 6 = SHDN), and SHDN polarityOffset (up to +/-6.5 mV) and 6 mV typical hysteresis together bound the achievable absolute accuracy near the ends of the sweep; the loop's speed margins are enormous (4.5 ns / 80 MHz against a 1-10 MHz clock)
PassivesYageo RC series, Murata GRM1885 C0G / GRM188 X7R (generic series data)C0G on the integrator is deliberate: dielectric linearity is a measurement-chain property here, not a nicety

Note the repository convention check: the module is labeled PMOD Type 1 (GPIO, custom two-pin map), which PMOD-SPEC-NOTES.md sanctions since spec types are conventions; the pin-1-module-driven / pin-2-host-driven asymmetry is the item to keep prominent in the HDL constraints.

7. Expected values before bench testing#

Example loop plan: Fclk = 1 MHz flip-flop clock, tau = 100 us (R2/C1), decimation N = 1024 (output about 977 Sa/s).

QuantityDesign target / calculated valueWhat to measure
3V3 rail3.30 V nominalDMM
Module currentabout 3.2 mA typ, 5 mA max (essentially all U1)Bench supply / series DMM
Open-loop SD_CMP (SD_FB held 0, AIN = 1 V)Logic 1 (node discharges below Vin)Scope
Open-loop SD_CMP (SD_FB held 1, AIN = 1 V)Falls as the node charges past Vin with tau = 100 usScope, exponential visible
Closed-loop integrator node (SD_INT)Small sawtooth centered on Vin; ripple about 33 mV p-p at Fclk = 1 MHz, about 3.3 mV at 10 MHzScope on the R2/C1 junction
Closed-loop 1-density vs inputdensity = Vin/3.3 (e.g. 0.500 at 1.650 V)Fabric ones-counter over N clocks
Idle-tone signature at mid-scaleNear-alternating 1010 pattern at Fclk/2 on SD_CMP/SD_FBScope/logic analyzer
Offset error targetWithin about +/-6.5 mV-equivalent (comparator Vos max) plus feedback-level asymmetry; typically a few mVDC sweep intercept
Gain error targetSet by FPGA pad VOL/VOH vs true 0/3.3 V; expect tenths of a percent, board-specificDC sweep slope
Linearity (INL) targetFirst-order loop with C0G integrator: sub-0.1% class mid-range is a reasonable first target - unverified, no bench data existsDC sweep residuals
Ends of rangeDensity saturates at exactly 0.000/1.000 slightly inside the rails; offset+hysteresis effects visible in the last few mVDC sweep extremes

8. Manual schematic and assembly review checklist#

9. Ordered bench-test procedure#

Stop at the first abnormal result. Record captures with board serial, equipment IDs, Fclk, decimation N, DNP audit, and operator.

A. Unpowered inspection and resistance tests#

  1. Complete the Section 8 checklist under magnification.
  2. Measure 3V3-to-GND in both polarities; investigate hard shorts.
  3. Verify: J1 pin 2 to SD_INT about 10 kOhm (R2); J1 pin 1 to U1 pin 5 about 100 Ohm (R4); J2 pin 1 to U1 pin 3 about 10 kOhm (R1).

B. Static power-up and open-loop comparator checks (bench supply)#

  1. Feed 3.3 V, current-limited to about 20 mA, into J1 pins 6/12 vs 5/11. Expect about 3.2 mA (5 mA max) - the TLV3501 idles hot by sensor-module standards; that is normal.
  2. Drive AIN from a calibrated source at 1.000 V. Manually hold SD_FB (J1 pin 2) at GND through a jumper: SD_INT discharges to 0 V and SD_CMP must read high (about 3.3 V). Hold SD_FB at 3.3 V: SD_INT charges toward 3.3 V with a visible tau = 100 us exponential and SD_CMP must fall once the node passes about 1 V.
  3. This validates polarity (+in vs -in), the integrator path, and the output stage before any HDL is trusted.

C. Closed-loop test with the FPGA feedback bit#

  1. Attach the PMOD host. Load the minimal loop fabric: one flip-flop clocked at Fclk = 1 MHz sampling SD_CMP, its Q driving SD_FB; a ones-counter over N = 1024 clocks publishing the density code. (Two flip-flops in series on SD_CMP before the feedback tap is the more robust variant - it costs one clock of loop delay and removes metastability from the fed-back bit; note which variant ran.)
  2. With AIN at 1.650 V (mid-scale), scope SD_CMP and SD_FB together: SD_FB must be SD_CMP delayed by one clock (or two, per the variant), and the pattern near mid-scale approaches an alternating 1010 idle tone at Fclk/2.
  3. Scope SD_INT: a small sawtooth centered on 1.65 V, about 33 mV p-p at 1 MHz, each segment an exponential piece of the tau = 100 us curve. The node visibly "servos" - move AIN slowly and the sawtooth's center tracks it. This is the loop working.
  4. Read the density code: expect 0.500 x N counts within offset/gain error. Sweep Fclk (250 kHz, 1 MHz, 4 MHz, 10 MHz) and confirm ripple shrinks proportionally while density stays put; check R4/cable edges still give clean levels at the top rate.
  5. Stop-clock behavior: freeze Fclk with SD_FB stuck at 1 - SD_INT rails to 3.3 V and SD_CMP parks low; resume and the loop reacquires within a few tau. No state is retained anywhere but C1 - a feature to show, not a bug.

D. DC sweep linearity procedure#

  1. Drive AIN from a calibrated, low-noise source (a good DAC or a 10-turn pot from J2's own 3V3 with a DMM monitoring the actual voltage; log the DMM value, not the setpoint).
  2. Fix Fclk (recommend 4 MHz or more so ripple, about 8 mV, is small against the target resolution) and a decimation long enough to average idle tones (N of 65536 or average many N = 1024 frames).
  3. Step AIN from 0 to 3.300 V in 33 mV steps (101 points, 1% of FS), plus fine 3 mV steps over the bottom 30 mV and top 30 mV where offset and hysteresis effects concentrate.
  4. At each point record the DMM voltage and the averaged density (or filtered output code). Plot code vs voltage.
  5. Fit a line to the central 10-90% of the sweep. Report offset error (intercept, in mV of input), gain error (slope vs the ideal density = Vin/3.3), and INL (max residual from the fit, in mV and in equivalent LSB at the chosen resolution). Targets: offset within the comparator's +/-6.5 mV max Vos budget (typically a few mV), gain error consistent with the host pad's VOL/VOH, INL smooth and sub-0.1%-class mid-range - all first-article discoveries, not guarantees.
  6. Repeat one sweep at a second Fclk and, if experimenting, with R3 or C2 populated (record the DNP change); linearity should be Fclk-insensitive once ripple is small.

E. TLV3501 offset and hysteresis characterization notes#

  1. The comparator's input offset (up to +/-6.5 mV max per the datasheet, +/-1 mV typical) adds directly to the loop's null: the integrator servos to Vin + Vos, so the whole transfer curve shifts horizontally by Vos. It appears as the intercept in the Section D fit and cannot be distinguished from source error without a better reference - hence the calibrated-source requirement.
  2. The TLV3501's built-in hysteresis (6 mV typical per the datasheet) does not simply add to offset: within the loop it makes the comparator hold its previous decision until the integrator moves about 6 mV past the crossing, which lengthens limit cycles (consecutive identical bits), raises ripple slightly above the pure RC prediction, and strengthens idle tones. On average it cancels mid-range, but near the ends of the sweep the asymmetry stops canceling: within roughly (Vos + hysteresis/2) of 0 V and 3.3 V, about 4-10 mV, expect the code to reach hard 0/1 density early or flatten - a visible foot/shoulder on the plot.
  3. Measure it: at a few fine points near each end, record the density deviation from the fit line and the run-length statistics of SD_CMP (longer runs = hysteresis at work). Compare the observed foot width against the 4-10 mV expectation; a much larger foot suggests supply noise coupling into the threshold (check C3) rather than the part.
  4. Temperature note: Vos drifts about +/-5 uV/C per the datasheet - negligible at bench temperatures; do not chase mV-level drift there.

10. Troubleshooting map#

SymptomFirst measurementsLikely areas
SD_CMP stuck at a rail, loop runningSD_INT waveform, SD_FB activity at the pinLoop not actually closed (constraints/pin swap), R2 open, U1 input swap (positive feedback)
SD_CMP toggles but density ignores AINCMP_INP vs J2, R1 continuityAIN not reaching +in; source impedance too high; J2 miswired
Density = Vin/3.3 grossly wrong slopeHost pad VOL/VOH under load, R3/C2 DNP auditFeedback levels not 0/3.3, tau changed by populated DNP pads
Large offset (tens of mV)Section E notes, C3 presence, ground drop between source and J2Supply-noise coupling, ground loop in the measurement, not plain Vos
Ripple much larger than predictedFclk actually reaching the FF, SD_FB edge qualityWrong Fclk, double-driving SD_FB, C1 wrong value/dielectric
Oscillation bursts / chaotic streamSD_CMP edges at U1 vs at host, C3Supply bounce (decoupling), reflections on a long unterminated hookup, metastability (add the second FF)
Idle tones dominate the spectrumPattern at fixed densities, N usedExpected first-order behavior: raise OSR, dither the input slightly, or note-and-move-on
Hot module / current far above 5 mASupply current, U1 orientationRotated U1, contention on SD_CMP/SD_FB pin swap
Nothing works and SD_CMP floatsSHDN level at U1 pin 6SHDN solder open (pin floats near V+ = disabled), U1 unpowered

11. Bench record template#

FieldRecord
Board revision / serial
DNP audit (R3, C2 empty or populated)
Host / equipment IDs, probe setup
Fclk values used; FF variant (1 or 2 stages)
Supply current
Open-loop check results (Section B)
SD_INT ripple at each Fclk
Mid-scale density and idle-tone note
DC sweep raw-data reference (voltage, density pairs)
Fitted offset / gain error / INL
End-of-range foot width vs 4-10 mV expectation
Deviations, raw-file paths
Reviewer / date / disposition

12. Review conclusion#

The schematic is a textbook first-order sigma-delta front end split honestly across the connector: the only analog state is C1, the only quantizer is U1, and the flip-flop that makes it an ADC deliberately lives in the student's fabric. Component choices back the lesson - C0G integrator parts, a verified-polarity SHDN strap, series protection on the one module-driven pin, and DNP pads that turn tau into an experiment rather than a constant. The comparator datasheet numbers bound what the lab can teach: +/-6.5 mV max offset and 6 mV typical hysteresis put a floor of a few mV on absolute accuracy at the range ends, while 4.5 ns and 80 MHz mean the loop clock, not the comparator, always limits speed. The principal open risks are the unstarted layout (the R2/C1 node must be tight against -in, and fast edges need a solid return path), the unverified linearity targets, host-pad VOL/VOH gain error, and the pin-1/pin-2 direction asymmetry as a standing constraints-file hazard. Until a fabricated board passes Sections 9.A-9.D, every number here remains a target.