Circuit review & bench-test guide
AXS-033 — Build-your-own sigma-delta ADC lab PMOD module
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#
- This is an unfabricated design; no bench evidence exists yet. All loop behavior below is predicted from the schematic and datasheet.
- 3.3 V domain only. The TLV3501 absolute maximum supply is 5.5 V and its inputs are diode-clamped to the rails (signals beyond the rails must be limited to 10 mA); keep J2 AIN within 0 to 3.3 V. R1 gives roughly 10 kOhm of accidental-overdrive limiting, which covers modest mistakes, not connecting a lab supply set to 12 V.
- J2 pin 3 exposes the module's 3.3 V rail for sensor excitation. It is the host's PMOD rail: never back-drive it from an external supply and keep total draw within the ~100 mA PMOD guidance.
- SD_FB is a host-driven pin into a module that also drives SD_CMP. Do not configure both PMOD pins as outputs on the host; pin 1 is module-driven (via R4), pin 2 is host-driven, and swapping them in the constraint file creates driver-versus-driver contention through only R4.
- The TLV3501 toggles in nanoseconds; probe with short grounds and expect to see (and dismiss) probe-artifact ringing before blaming the board.
- An earth-referenced scope ground goes only to module GND.
3. Signal and power sequence, and how the loop works#
- The host applies 3.3 V/GND at J1. C3 decouples the comparator supply.
- 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.)
- 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.
- 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.
- 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.
- 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#
- tau = R2 x C1 = 10 kOhm x 10 nF = 100 us; the schematic note requires Fclk >> 1/tau = 10 kHz. At Fclk = 1 MHz each clock moves the node by at most about Vdd x Tclk/tau = 3.3 x (1 us/100 us) = 33 mV of ripple; at 10 MHz, about 3.3 mV. Higher Fclk means smaller ripple and better ENOB at the same output rate.
- The DNP pads change tau: R3 (4.7 kOhm) in parallel with R2 gives about 3.2 kOhm (tau = 32 us, more ripple, faster tracking); C2 (22 nF) in parallel with C1 gives 32 nF (tau = 320 us, less ripple, slower).
- The feedback levels are the FPGA pad's VOL/VOH, not ideal 0/3.3 V, and the comparator sees Vin through R1 with pA-class bias current (no meaningful drop). Driver drop appears directly as gain error in the transfer function - one of the things the DC sweep measures.
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 pin | Net | Direction | Role |
|---|---|---|---|
| 1 | SD_CMP | module to host | Comparator bit stream (via R4) |
| 2 | SD_FB | host to module | Registered feedback bit into R2 |
| 3, 4, 7-10 | NC | - | Unused |
| 5, 11 | GND | - | Ground |
| 6, 12 | 3V3 | - | 3.3 V supply |
| J2 pin | Net | Role |
|---|---|---|
| 1 | AIN | Analog input, 0 to 3.3 V |
| 2 | GND | Input return |
| 3 | 3V3 | Excitation 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 summary | Function and why needed | If absent/open | If shorted, wrong, or misassembled |
|---|---|---|---|---|
| J1 | 12-pin right-angle PMOD plug | Power plus the two loop signals | No function | Swapped pin-1/pin-2 host constraints create contention through R4 |
| J2 | 1x3 pin header, 2.54 mm | Analog input plus GND/3V3 for the source | No input; loop servos to leakage | Miswiring AIN to the 3V3 pin just reads full scale; shorting 3V3 to GND at the header is a rail short |
| U1 | TI TLV3501AIDBVR, 4.5 ns rail-to-rail push-pull comparator, SOT-23-6 | The quantizer: compares Vin (+in) against the integrator node (-in) at loop speed | No 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 |
| R1 | 10 kOhm 0603 (Yageo RC0603FR-0710KL) | Series isolation on the analog input: limits fault current into the diode-clamped input, decouples cable capacitance from the pin | Input pin exposed directly to whatever J2 carries | With pA bias currents its voltage drop is negligible, so a moderate value error is harmless; open leaves +in floating (stream becomes leakage-driven garbage) |
| R2 | 10 kOhm 0603 | Integrator resistor: converts the fed-back bit voltage into C1 charging current; sets tau with C1 | Loop broken: no feedback path, comparator saturates at a rail | Wrong value shifts tau and ripple; short makes SD_FB drive C1/-in directly (host pad slams the node, no integration - loop nonfunctional) |
| C1 | 10 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 loop | Leaky/wrong dielectric (X7R-class) adds voltage-coefficient distortion measurable in the sweep; short grounds -in (stream pegs to comparator offset around 0 V) |
| R3 | 4.7 kOhm 0603, DNP | Optional parallel integrator resistor: tau = 32 us experiments | Nothing (it is DNP by design) | Populating it unknowingly changes tau by 3x - audit DNP status before correlating measurements |
| C2 | 22 nF C0G 0603, DNP | Optional parallel integrator capacitor: tau = 320 us experiments | Nothing (DNP) | Same audit note as R3 |
| R4 | 100 Ohm 0603 | Series protection on the module-driven SD_CMP line, per the sensor-line rule; damps the fast comparator edge into the cable/host | Host miswiring couples full contention current into the comparator output stage | Large wrong value plus bus capacitance slows the 1.5 ns-class edges and can violate host setup at high Fclk; short only removes margin |
| C3 | 100 nF 16 V X7R 0603 | Comparator supply decoupling; the TLV3501 draws fast current spikes on every toggle | Supply bounce couples into the comparator thresholds: spurious toggles, degraded effective hysteresis | Shorted part is a rail short |
| #FLG01/#FLG02 | ERC power flags | Schematic-only artifacts marking 3V3/GND driven | No physical effect | Not applicable |
TLV3501 key datasheet parameters (verified from TI SBOS321E)#
| Parameter | Value | Bench relevance |
|---|---|---|
| Propagation delay | 4.5 ns typ, 6.4 ns max (100 mV step, 20 mV overdrive); 7.5 ns typ at 5 mV overdrive | Negligible against a 1-10 MHz loop clock |
| Toggle frequency | 80 MHz max | The comparator is never the loop-speed limit here |
| Rise/fall time | 1.5 ns typ | Why R4 damping and probing technique matter |
| Supply | 2.7 to 5.5 V specified (operating down to 2.2 V); abs max 5.5 V | 3.3 V rail is in the specified range |
| Supply current | 3.2 mA typ, 5 mA max | Dominates the module's power budget |
| Input offset voltage | +/-1 mV typ, +/-6.5 mV max | Direct code offset: 6.5 mV is 0.20% of FS, about 8 LSB at 12 bits |
| Input hysteresis | 6 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 |
| Output | Push-pull rail-to-rail; within 30 mV typ / 50 mV max of the rails at +/-1 mA | SD_CMP swings essentially 0/3.3 into the light R4 load |
| SHDN thresholds | Disabled within 0.9 V of V+; enabled more than 1.7 V below V+ | Grounded SHDN = enabled, as wired |
| Input clamp limit | Inputs beyond a rail must be current-limited to 10 mA | R1 provides the limiting for modest overdrive |
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts used here | Board-specific interpretation |
|---|---|---|
| TLV3501 | Verified 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 polarity | Offset (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) |
| Passives | Yageo 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).
| Quantity | Design target / calculated value | What to measure |
|---|---|---|
| 3V3 rail | 3.30 V nominal | DMM |
| Module current | about 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 us | Scope, 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 MHz | Scope on the R2/C1 junction |
| Closed-loop 1-density vs input | density = Vin/3.3 (e.g. 0.500 at 1.650 V) | Fabric ones-counter over N clocks |
| Idle-tone signature at mid-scale | Near-alternating 1010 pattern at Fclk/2 on SD_CMP/SD_FB | Scope/logic analyzer |
| Offset error target | Within about +/-6.5 mV-equivalent (comparator Vos max) plus feedback-level asymmetry; typically a few mV | DC sweep intercept |
| Gain error target | Set by FPGA pad VOL/VOH vs true 0/3.3 V; expect tenths of a percent, board-specific | DC sweep slope |
| Linearity (INL) target | First-order loop with C0G integrator: sub-0.1% class mid-range is a reasonable first target - unverified, no bench data exists | DC sweep residuals |
| Ends of range | Density saturates at exactly 0.000/1.000 slightly inside the rails; offset+hysteresis effects visible in the last few mV | DC sweep extremes |
8. Manual schematic and assembly review checklist#
- Verify J1 pin-1 orientation against
PMOD-SPEC-NOTES.mdbefore power. - Verify U1 orientation on the SOT-23-6 (pin 1 = -IN to SD_INT, pin 3 = +IN to CMP_INP, pin 4 = V+, pin 2 = V-, pin 5 = OUT, pin 6 = SHDN to GND). An input swap is invisible to an ohmmeter and fatal to the loop.
- Audit DNP status: R3 and C2 pads must be empty in the baseline build; record it, because tau silently changes if they are populated.
- Measure R1, R2, R4 values; buzz SD_FB (J1 pin 2) through R2 to SD_INT, SD_INT to C1 to GND, CMP_OUT through R4 to J1 pin 1, AIN (J2 pin 1) through R1 to +in.
- Confirm C3 sits against U1's V+ (layout review) and the R2/C1 node is tight against U1 -in (the README's explicit layout note).
- Confirm J1 pins 3, 4, 7-10 are NC and J2 pin 3 really is the rail.
- Measure 3V3-GND resistance for shorts before power.
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#
- Complete the Section 8 checklist under magnification.
- Measure 3V3-to-GND in both polarities; investigate hard shorts.
- 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)#
- 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.
- 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.
- 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#
- 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.)
- 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.
- 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.
- 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.
- 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#
- 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).
- 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).
- 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.
- At each point record the DMM voltage and the averaged density (or filtered output code). Plot code vs voltage.
- 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.
- 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#
- 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.
- 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.
- 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.
- 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#
| Symptom | First measurements | Likely areas |
|---|---|---|
| SD_CMP stuck at a rail, loop running | SD_INT waveform, SD_FB activity at the pin | Loop not actually closed (constraints/pin swap), R2 open, U1 input swap (positive feedback) |
| SD_CMP toggles but density ignores AIN | CMP_INP vs J2, R1 continuity | AIN not reaching +in; source impedance too high; J2 miswired |
| Density = Vin/3.3 grossly wrong slope | Host pad VOL/VOH under load, R3/C2 DNP audit | Feedback 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 J2 | Supply-noise coupling, ground loop in the measurement, not plain Vos |
| Ripple much larger than predicted | Fclk actually reaching the FF, SD_FB edge quality | Wrong Fclk, double-driving SD_FB, C1 wrong value/dielectric |
| Oscillation bursts / chaotic stream | SD_CMP edges at U1 vs at host, C3 | Supply bounce (decoupling), reflections on a long unterminated hookup, metastability (add the second FF) |
| Idle tones dominate the spectrum | Pattern at fixed densities, N used | Expected first-order behavior: raise OSR, dither the input slightly, or note-and-move-on |
| Hot module / current far above 5 mA | Supply current, U1 orientation | Rotated U1, contention on SD_CMP/SD_FB pin swap |
| Nothing works and SD_CMP floats | SHDN level at U1 pin 6 | SHDN solder open (pin floats near V+ = disabled), U1 unpowered |
11. Bench record template#
| Field | Record |
|---|---|
| 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.