Circuit review & bench-test guide
AXS-050 — OV7670 camera carrier dual-PMOD module (flagship)
Document purpose#
This document explains the axs-050-camera carrier at component level and turns the design evidence into a manual-review and bench-test plan. It is based on generate_design.py, the generated schematic, the README, and the OmniVision OV7670 datasheet. This is the flagship (L5) module and the most complex carrier in the line: two PMOD plugs, fifteen resistors, a camera-driven clock domain, and an I2C-compatible control bus.
The board is an unfabricated prototype: schematic generated, ERC clean (0/0), netlist reviewed, no PCB layout, no fabricated board, no BOM export, no bench results. Three connector MPNs are TBD:. The plug-in is the generic 18-pin no-FIFO OV7670 breakout, an uncontrolled commodity part — carrier validation is only meaningful against a specific purchased unit.
1. What the board does#
The carrier hosts an 18-pin OV7670 breakout (VGA CMOS sensor, no FIFO) on a 2×9 socket and fans it out to two adjacent PMOD sockets on the ECP5 host:
- J1 (PMOD A) carries the 8-bit pixel bus D0–D7, all camera-driven, each through 100 Ω series resistors (R1–R8).
- J3 (PMOD B) carries the timing and control set: PCLK (camera-driven, R9), XCLK (host-driven 24 MHz from a fabric PLL, direct), HREF (R10), VSYNC (R11), the SCCB bus SIOC/SIOD with 4.7 k pull-ups (R12/R13), RESET_N with a 10 k pull-up (R14), and PWDN with a 10 k pull-down (R15).
Data flow: the host feeds XCLK, configures the sensor over SCCB (I2C- compatible, 7-bit address 0x21 = write 0x42 / read 0x43), then samples D0–D7 on PCLK edges while HREF is high, framed by VSYNC.
Functional block diagram#
PMOD A (J1) OV7670 breakout (J2, 2x9)
1..4,7..10 D0–D7 <── R1–R8 100 Ω ──── D0–D7 (camera outputs)
PMOD B (J3)
1 PCLK <── R9 100 Ω ───────────────── PCLK (camera output, up to 24 MHz)
2 XCLK ───────────────────────────────> XCLK (host 24 MHz, direct)
3 HREF <── R10 100 Ω ───────────────── HREF
4 VSYNC <── R11 100 Ω ───────────────── VSYNC
7 SIOC ──┬── R12 4.7 k ── 3V3 SIOC (SCCB clock)
8 SIOD ──┴── R13 4.7 k ── 3V3 SIOD (SCCB data, bidirectional)
9 RESET_N ──┬─ R14 10 k ── 3V3 RESET (active low)
10 PWDN ────┬─ R15 10 k ── GND PWDN (active high)
3V3 ── C1 100 nF ── C2 10 µF ── GND VCC / GND
2. Safety and scope boundaries#
- Single 3.3 V domain, no external supply: electrical risk is low. The real hazards are orientation errors across three unkeyed connectors (two PMOD plugs and a 2×9 socket) and out-of-spec I/O levels (section 6).
- The dual-PMOD plug pair mechanically locks the carrier's orientation if the layout pitch matches the host's paired-socket spacing exactly — until layout is verified, treat plugging as a checked step, not a given.
- Camera modules are ESD-sensitive bare-lens assemblies; handle by the PCB, keep the lens capped when not testing.
- Nothing here is imaging-quality qualification. VGA color fidelity, lens focus, and exposure behavior are commodity-breakout properties, not carrier properties.
3. Power and control sequence (design intent)#
The OV7670 has documented power-up ordering requirements at the rail level; on the 18-pin breakout those rails come from the breakout itself, so the carrier-level sequence reduces to control-line ordering:
- Host powers both PMODs (same 3V3 rail); R14 releases RESET high, R15 holds PWDN low — the camera is powered and out of reset by default.
- Start XCLK before talking SCCB. The sensor's logic is clocked from XCLK; without a running clock the SCCB interface does not respond dependably. Bring the 24 MHz PLL output up first.
- Apply a clean reset with the clock running: RESET_N low ≥1 ms, release, then wait ≥1 ms (datasheet t_S:RESET ≤1 ms settling after reset) before the first SCCB transaction.
- Configure registers over SCCB at ≤400 kHz (datasheet SCCB f_SIO_C max; 100 kHz per the design note). Register changes settle within 300 ms / 10 frames (t_S:REG) — allow it before grading images.
- Capture: sample D0–D7 on the documented PCLK edge while HREF is high; VSYNC pulses 3×t_LINE at frame start; t_LINE = 784 t_P (VGA); for RGB565/YUV output two bytes per pixel (t_P = 2×t_PCLK).
4. Plug-in module verification (read before first power)#
Mandatory section. 18-pin OV7670 breakouts are mostly-but-not-always identical, three connectors here are orientation-sensitive, and the module's I/O supply question (4.3) affects whether 3.3 V operation is even in spec.
4.1 Pin-order check against the breakout silkscreen#
The carrier assumes the common 18-pin order (odd/even numbering matching the KiCad 2×9 footprint):
| Odd (left) | 1 3V3 | 3 SIOC | 5 VSYNC | 7 PCLK | 9 D7 | 11 D5 | 13 D3 | 15 D1 | 17 RESET |
|---|---|---|---|---|---|---|---|---|---|
| Even (right) | 2 GND | 4 SIOD | 6 HREF | 8 XCLK | 10 D6 | 12 D4 | 14 D2 | 16 D0 | 18 PWDN |
Procedure, breakout unplugged and carrier unpowered:
- Read the breakout silkscreen for all 18 positions; write them down. Common variants differ in RESET/PWDN placement and in D-bus direction (D0 vs D7 at the connector end).
- Buzz the breakout's 3V3 pin to its own LDO input/output and GND to its ground pour to confirm which corner is pin 1/2.
- On the carrier, buzz J2 position 1 to the PMOD 3V3 pins and position 2 to GND; then verify the breakout's power pair lands there in the actual insertion orientation. A 2×9 socket accepts a 180°-rotated module: rotation puts 3V3 on PWDN and GND on RESET, and reverses the whole data bus — mark the correct orientation on both boards.
- Spot-check three signal pins end-to-end: SIOC to J3 pin 7 (through the R12 node), PCLK to J3 pin 1 (through R9), D0 to J1 pin 1 (through R1).
- Only then power up.
4.2 Plug-in key specifications (OmniVision OV7670/OV7171 datasheet v1.4)#
| Item | Manufacturer value | Bench relevance |
|---|---|---|
| Array / formats | 640×480, up to 30 fps; YUV/RGB565/555/444/raw, 8-bit port | Capture pipeline sizing |
| Supplies (sensor die) | Analog 2.45–3.0 V; core 1.8 V (internal regulator usable); I/O 1.7–3.0 V | See 4.3 — 3.3 V is above the DC-spec I/O range |
| Active power / standby | 60 mW typ; <20 µA standby (PWDN) | Rail budget is easy; PWDN test target |
| XCLK | 10–48 MHz, typical 24 MHz, 45–55 % duty | The 24 MHz fabric PLL choice is exactly typical |
| PCLK | Output; equals XCLK by default (up to 24 MHz here), divisible via CLKRC | Real clock domain — constrain it in the FPGA |
| SCCB | ≤400 kHz; write address 0x42, read 0x43 (7-bit 0x21) | Probe target, section 9.C |
| ID registers | PID 0x0A = 0x76, VER 0x0B = 0x73; MIDH/MIDL 0x1C/0x1D = 0x7F/0xA2 | First-contact test |
| RESET# | Active low, clears all registers to defaults; ≤1 ms settling | R14 default high; host pulse for clean state |
| PWDN | Active high, internal pull-down; standby <20 µA | R15 mirrors the internal pull-down |
| Timing | t_LINE = 784 t_P; VSYNC pulse 3 t_LINE; 510 t_LINE per frame; D setup 15 ns / hold 8 ns around PCLK | Capture-FSM constants and timing constraints |
| Register settling | 300 ms / 10 frames after register changes | Wait before grading output |
4.3 The I/O-voltage honesty note#
The OV7670's DC-characteristics table caps DOVDD (I/O) at 3.0 V (absolute max on I/O pins is DOVDD + 0.5 V). The common 18-pin breakout takes 3.3 V in and regulates some rails down — but breakouts differ in whether DOVDD is regulated (often to 2.8/3.0 V) or tied straight to the 3.3 V input. Two consequences to verify on the purchased unit:
- If the breakout regulates DOVDD (measure a regulator output feeding the sensor's F1/DOVDD ball region, or simply measure a data pin's high level): camera outputs will swing to ~2.8–3.0 V — comfortably above the ECP5's VIH for a 3.3 V bank — and host-driven 3.3 V inputs (XCLK, SIOC/SIOD, RESET, PWDN) exceed the sensor's DOVDD by ~0.3–0.5 V, at or beyond the absolute-max window. The 100 Ω/4.7 k series impedances limit the injected current, and hobby practice runs this way for years, but it is out of spec and must be recorded as such.
- If the breakout ties DOVDD to 3.3 V: levels match the PMOD perfectly but the sensor die itself runs its I/O rail above the 3.0 V DC-spec maximum — again common hobby practice, again out of spec.
Either way the carrier works in practice; the honest statement is that no combination of this commodity breakout and a 3.3 V PMOD is fully inside OmniVision's DC table. Measure the actual DOVDD and output-high levels during bring-up (section 9.B) and record them.
5. Component-by-component review#
#FLG01/#FLG02 are ERC power flags, not physical parts.
5.1 Connectors#
| Ref. | Part / value | Function and why needed | Failure/review points |
|---|---|---|---|
| J1 | 2×6 right-angle PMOD plug "PMOD A: DATA" (MPN TBD:) | D0–D7 to the host, GND/3V3 | Mirrored assembly puts rails on data pins; after layout the J1↔J3 spacing must match the host's paired-socket pitch exactly (README release item) |
| J3 | 2×6 right-angle PMOD plug "PMOD B: CTRL" (MPN TBD:) | PCLK/XCLK/HREF/VSYNC + SCCB + RESET_N/PWDN | Same orientation and pitch concerns; PCLK on pin 1 should land on a clock-capable FPGA input — a host-side constraint to verify |
| J2 | 2×9 socket 2.54 mm (MPN TBD:) | Camera breakout socket | Unkeyed; 180° rotation reverses power onto PWDN/RESET and flips the bus — see 4.1 |
5.2 Series resistors on camera-driven lines#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R1–R8 | 100 Ω, Yageo RC0603FR-07100RL | Series termination/protection on D0–D7 | An open bit shows as a stuck bit-plane in images (distinctive banding); grossly larger values + bus capacitance eat into the 15 ns setup margin at 24 MHz PCLK |
| R9 | 100 Ω | Series on PCLK — the most timing-critical line on the board | Open: no capture clock, total failure. Excess RC skews PCLK against D0–D7; keep the layout length short and matched to the data bus |
| R10, R11 | 100 Ω | Series on HREF and VSYNC | Open HREF: capture FSM never qualifies pixels; open VSYNC: no frame alignment |
5.3 Pull resistors, straps, and decoupling#
| Refs. | Value | Function | If omitted or wrong |
|---|---|---|---|
| R12, R13 | 4.7 kΩ, RC0603FR-074K7L | SCCB (I2C-compatible) pull-ups on SIOC/SIOD; dedicated bus, no jumpers by design | Missing: SCCB dead (SIOD never rises). Note SCCB is single-master here and never chained — 4.7 k at 100–400 kHz is comfortable |
| R14 | 10 kΩ, RC0603FR-0710KL | RESET_N pull-up: camera out of reset by default; host can pulse low | Missing: reset level depends on the FPGA pin state at boot — undefined startups. Bridge to GND: camera never boots |
| R15 | 10 kΩ, RC0603FR-0710KL | PWDN pull-down, mirroring the sensor's internal pull-down; host can drive high for <20 µA standby | Missing: still weakly held by the internal pull-down — works, but the carrier-level default becomes part-dependent; fit it. Bridge to 3V3: camera permanently powered down |
| C1 | 100 nF 16 V X7R, GRM188R71C104KA01D | High-frequency decoupling at the socket | Pixel-bus SSO noise couples into the breakout's rails |
| C2 | 10 µF 10 V X5R, GRM21BR61A106KE19L | Bulk at the socket (sensor core/analog through the breakout's LDOs) | Rail droop at frame starts; image artifacts under load |
Host-driven XCLK is direct (no series R) — consistent with the family convention of protecting only module-driven lines; after layout, review whether a source-termination resistor on XCLK is warranted by trace length.
6. Datasheet summary and design interpretation#
| Device | Key manufacturer facts | Board-specific interpretation |
|---|---|---|
| OV7670 | VGA 30 fps, 8-bit DVP, XCLK 10–48 MHz (24 typ), SCCB ≤400 kHz at 0x42/0x43, PID/VER = 0x76/0x73, RESET# low / PWDN high, I/O rail 1.7–3.0 V, D setup/hold 15/8 ns, t_LINE = 784 t_P, VSYNC = 3 t_LINE | 24 MHz XCLK and 100 kHz SCCB are inside spec; the 3.3 V interface is not fully inside the DC table (section 4.3); timing constants above feed the HDL and the bench pass/fail limits |
| 18-pin breakout | Uncontrolled commodity: LDO arrangement, pull-ups, and pin order vary | Per-unit verification (4.1, 4.3) is part of the design, not optional |
| Yageo RC0603 / Murata GRM | Thick film 1 %; X7R/X5R ceramics | Uncritical |
Official references: OV7670/OV7171 datasheet v1.4, 2006 (MIT mirror). The SCCB protocol details are in OmniVision's separate "Serial Camera Control Bus (SCCB) Functional Specification"; the register map (PID/VER/MIDH/MIDL, CLKRC, COM7, etc.) is in the datasheet's register tables. OmniVision documents are distributed under NDA-era mirrors — record the exact revision used.
7. Expected values before bench testing#
| Quantity | Design target / manufacturer value | What to measure |
|---|---|---|
| 3V3 at J2 pin 1 | 3.3 V | DMM |
| Breakout DOVDD / output-high level | 2.8–3.3 V depending on breakout (section 4.3) | DMM on a data pin during HREF-high |
| Supply current | tens of mA (60 mW class sensor + breakout LDO overhead) | Host rail delta |
| XCLK at the socket | 24 MHz, 45–55 % duty, monotonic edges | Scope at J2 pin 8 side of the socket |
| SCCB probe | ACK at write 0x42 / read 0x43 (7-bit 0x21) | Analyzer, section 9.C |
| PID / VER | 0x0A = 0x76; 0x0B = 0x73 (clones may return 0x76/0x73 variants — record) | SCCB reads |
| PCLK | = XCLK (24 MHz) by default; /2^n via CLKRC when configured | Frequency counter/scope at J3 pin 1 |
| VSYNC rate | ~30 fps at 24 MHz VGA defaults (frame = 510 t_LINE) | Scope |
| HREF | 480 pulses per frame, 640 t_P active each | Logic analyzer |
| PWDN standby | Sensor <20 µA (breakout LDO quiescent will dominate the measured number) | Rail delta with PWDN high |
8. Manual schematic and assembly review checklist#
- Complete section 4.1 (18-pin order) and 4.3 (DOVDD arrangement) against the purchased breakout before layout; record both in the repository.
- Close the three
TBD:connector MPNs; export and availability-check the BOM. - After layout, verify: J1↔J3 spacing against the ECP5 host's paired-PMOD pitch (the README release item); D0–D7 loosely length-matched with R1–R8 placed near the socket; PCLK routed away from XCLK (README) and landing on a clock-capable host pin; SCCB pull-ups near the socket; C1/C2 at the socket power pins.
- Confirm R14 pulls up and R15 pulls down — a swapped pair leaves the camera in reset/power-down by default and is invisible to ERC.
- Verify both PMOD plugs' pin-1 orientation against Pmod spec 1.2 Figure 2 (the family's placement recipe exists in
pmod-common/PMOD-SPEC-NOTES.md). - Plan FPGA constraints: PCLK as a clock (its own domain + CDC FIFO), input delay constraints derived from the 15/8 ns setup/hold numbers.
9. Ordered bench-test procedure#
Stop at the first abnormal result. This is the full-treatment sequence — each stage proves one layer before the next depends on it.
A. Unpowered checks#
- Complete section 4.1 buzz-out and orientation marking (three connectors).
- Resistance 3V3-to-GND at each PMOD plug, socket empty, then fitted.
- Buzz all 11 series resistors end-to-end (D0–D7, PCLK, HREF, VSYNC) from J2 pad to PMOD pin; buzz SIOC/SIOD to J3 pins 7/8 and confirm ~4.7 k to 3V3 on each; confirm RESET_N ~10 k to 3V3 and PWDN ~10 k to GND.
B. Power, straps, and XCLK — no SCCB yet#
- Plug into both host PMODs (verify seating across the pair). Power on.
- Measure 3V3, supply current, RESET_N (3.3 V), PWDN (0 V).
- Measure the breakout's DOVDD/regulator situation (section 4.3): probe a data pin's high level once the camera free-runs, and any visible LDO outputs. Record the numbers.
- Enable the 24 MHz PLL output. Scope XCLK at the socket: frequency, duty 45–55 %, clean edges. XCLK must be verified before any SCCB attempt — the sensor needs a running clock to respond.
- With XCLK running and default straps, the camera free-runs: confirm PCLK appears at J3 pin 1 (≈24 MHz) and VSYNC pulses at ≈30 Hz... if either is missing, resolve here before touching registers.
C. SCCB probe and ID read#
- Pulse RESET_N low ≥1 ms with XCLK running; wait ≥1 ms.
- Probe address 0x21 (write byte 0x42): expect ACK on the analyzer. No ACK → recheck XCLK first (the classic failure), then pull-ups, then pin order. Note SCCB read transactions differ slightly from pure I2C (some implementations don't ACK the read address byte identically) — judge by the returned data, not only the ACK bit.
- Read PID (0x0A) expecting 0x76 and VER (0x0B) expecting 0x73; read MIDH/MIDL (0x1C/0x1D = 0x7F/0xA2). Record exact values — clones and relabeled sensors surface here.
- Write/readback: set CLKRC (0x11) to divide PCLK by 2, verify PCLK halves; restore. This proves write, read, and a visible hardware effect in one step.
- Reset again and confirm defaults return (RESET# clears all registers).
D. PCLK capture expectations and bus integrity#
- Configure a known format (e.g., QVGA RGB565 via COM7 and the standard register set); wait 10 frames / 300 ms.
- With a logic analyzer on PCLK/HREF/VSYNC/D0–D7 (short leads, ground at the socket): verify the frame skeleton against the datasheet — VSYNC pulse 3 t_LINE; 480 (VGA) or 240 (QVGA) HREF lines per frame; t_LINE = 784 t_P; two PCLK bytes per pixel in RGB565.
- In the FPGA, capture on the documented PCLK edge and count: pixels per line, lines per frame, frames per second. These counters are the pass/fail gate before any image is judged.
- Bit-plane sanity: enable the sensor's test-pattern output (color bars) and check each of D0–D7 toggles; a stuck bit means R1–R8/socket trouble and shows as banding.
- CDC discipline: PCLK domain → line buffer/FIFO → system domain; verify no overflow/underflow counters increment over 1000 frames.
E. Live image and controls#
- Stream frames to the host-side sink (VGA out, UART dump, or framebuffer readback). Color bars first; then live scene; check color channel order against the RGB565 byte-order figure (datasheet Fig. 11) rather than guessing.
- RESET_N and PWDN line tests: PWDN high mid-stream — outputs stop, rail current drops (sensor <20 µA; LDO quiescent dominates); PWDN low — streaming resumes; full RESET_N cycle requires reconfiguration (registers cleared) — confirm your init code handles it.
- 30-minute soak: frame counter continuity, CDC error counters, supply current, and socket temperature.
10. Troubleshooting map#
| Symptom | First measurements | Likely areas |
|---|---|---|
| No PCLK, no VSYNC | XCLK at socket, RESET_N/PWDN levels | PLL not running, R9 open, rotated breakout, camera in reset/power-down |
| SCCB no ACK | XCLK running? SIOC/SIOD idle-high? | XCLK-before-SCCB violation (most common), pull-ups, pin order, address ≠ 0x42 |
| PID/VER wrong values | Repeat read, log exact bytes | Clone sensor — record and proceed with caution |
| Frame geometry wrong | HREF/VSYNC counts vs format | Register set incomplete, <300 ms settling, CLKRC/COM7 mismatch |
| Stuck bit-plane / banding | Test-pattern capture per bit | R1–R8 open, socket contact, solder |
| Colors wrong/swapped | Byte pairing against Fig. 11 | RGB565 byte order, capture edge, U/V order in YUV |
| Random pixel noise at 24 MHz | Analyzer at socket vs at FPGA | Setup/hold at 15/8 ns violated: lead length, PCLK/XCLK coupling, missing constraints |
| Works at PCLK/2, fails full rate | CLKRC divided vs undivided | Timing closure and signal integrity, not configuration |
| Dies mid-frame occasionally | 3V3 droop at C2 during capture | Decoupling, host rail budget across two PMODs |
11. Bench record template#
| Field | Record |
|---|---|
| Board serial / assembly variant | |
| Breakout source, 18-pin silkscreen map, orientation photos | |
| DOVDD arrangement and measured output-high level (section 4.3) | |
| XCLK frequency/duty measurement | |
| SCCB probe result; PID/VER/MIDH/MIDL bytes | |
| CLKRC write/readback and PCLK-divide confirmation | |
| Frame-geometry counters (pixels/line, lines/frame, fps) | |
| Test-pattern bit-plane result | |
| Live-image and color-order result | |
| PWDN/RESET line-test results | |
| 30-minute soak counters | |
| Deviations, raw-file paths | |
| Reviewer / date / disposition |
12. Review conclusion#
The architecture is a faithful DVP capture design: every camera-driven line (all eleven of them) passes a series resistor, the dedicated SCCB bus gets fixed pull-ups, both control straps have defined defaults that the host can override, and the two-PMOD split puts the entire pixel bus on one connector. The datasheet-anchored constants (24 MHz XCLK, 0x42/0x43 SCCB, 0x76/0x73 ID, 784 t_P lines, 15/8 ns setup/hold) give the bench plan objective pass/fail gates. The principal risks are (1) three unkeyed/orientation-sensitive connectors, with the 2×9 rotation putting power onto PWDN/RESET; (2) the honest 3.3 V-versus-3.0 V I/O-rail gap on commodity breakouts, which must be measured and recorded rather than assumed away; (3) everything layout-dependent — paired-PMOD pitch, PCLK routing and clock-capable pin assignment, data-bus matching — which exists only as intent today; and (4) the absence of any fabrication or bench evidence at this revision.