Skip to main content

fpgacapZero logo

fpgacapZero (fcapz)

CI License Sponsor

Open-source FPGA debug cores — in native Verilog and VHDL — that you drop into any design to see and control what's happening inside your FPGA over JTAG: no extra board pins, no soft CPU, no vendor lock-in.

Think of it as an open, vendor-neutral alternative to ChipScope / SignalTap / Reveal that works the same way across Xilinx, Intel/Altera, Lattice, Gowin, and Microchip parts, with a Python / CLI / GUI host stack on top.

📖 New here? Start with the User Manual — especially First capture in 10 minutes. This page is just the quick tour.

What's in the box

Four small RTL cores, all driven over JTAG:

  • ELA — Embedded Logic Analyzer — capture internal signals into a waveform with flexible triggers, and export to VCD / CSV / JSON.
  • EIO — Embedded I/O — read and drive fabric signals live at runtime.
  • EJTAG-AXI — a JTAG-to-AXI4 master bridge for memory-mapped bus access.
  • EJTAG-UART — a JTAG-to-UART console bridge.

Plus a host stack: a browser-based web interface (fcapz-web) with an embedded Surfer waveform viewer that you can reach from the local machine or across the network, a Python API, the fcapz command-line tool, a JSON-RPC server, and an optional PySide6 desktop GUI (fcapz-gui).

Why fpgacapZero

  • Vendor-agnostic — one portable core with thin TAP wrappers for Xilinx 7-series, Xilinx UltraScale / UltraScale+, Lattice ECP5, Intel / Altera, Gowin, and Microchip PolarFire-family devices.
  • Small, and only as big as you need — a usable 8-bit / 1024-sample ELA fits in about 600 LUTs + 0.5 BRAM. Extra triggers, timestamps, decimation, segmenting, and more are compile-time options you enable only when a design needs them.
  • Verilog and VHDL — the portable core ships as native Verilog and native VHDL, with shared regression coverage for both.
  • Apache-2.0 — usable in proprietary designs.

Will it work on my board?

Any board with JTAG access works. You drive it through OpenOCD (any FTDI adapter) or the Xilinx hw_server (Vivado). The full per-vendor matrix and JTAG-chain rules are in the manual's RTL integration chapter; see also Support status below.

Quick start

You need Python 3.10+, a JTAG-capable FPGA board, and either OpenOCD or Vivado hw_server. Full setup is in Installation.

git clone https://github.com/lcapossio/fpgacapZero.git
cd fpgacapZero
pip install -e ".[web]"      # core host stack + web interface
fcapz-web                    # the easiest way to take your first capture

Then open http://127.0.0.1:7373 in your browser: connect to the board, arm an ELA capture with the run controls, set triggers, and inspect the result in the embedded Surfer waveform viewer — EIO and JTAG-AXI live there too. It runs over the same JSON-RPC API as the rest of the stack and can be exposed across the network with a bearer token. See Web interface.

fcapz-web browser interface showing connection, ELA capture controls, and the embedded Surfer waveform viewer

Prefer a native desktop app? A PySide6 GUI with a built-in waveform preview ships alongside it:

pip install -e ".[gui]"     # core host stack + desktop GUI
fcapz-gui

Prefer the command line? Build the Arty A7 reference bitstream (see Build from source — or use your own), then capture:

fcapz --backend hw_server --port 3121 \
  --program examples/arty_a7/arty_a7_top.bit \
  capture --trigger-value 0 --trigger-mask 0xFF --out capture.vcd --format vcd

The end-to-end walkthrough lives in First capture in 10 minutes. For every command and flag, see the CLI reference; for scripting, the Python API and JSON-RPC server.

Add it to your design

One instantiation per core — swap the wrapper suffix to match your FPGA vendor:

wire [127:0] my_signals;

// Embedded Logic Analyzer (all JTAG plumbing bundled inside the wrapper)
fcapz_ela_xilinx7 #(.SAMPLE_W(128), .DEPTH(4096)) u_ela (
    .sample_clk (sys_clk),
    .sample_rst (reset),
    .probe_in   (my_signals)
);

That's the minimal ELA. Wrapper names follow fcapz_<core>_<vendor> (e.g. fcapz_ela_ecp5, fcapz_eio_intel). Every parameter, the EIO / AXI / UART cores, LiteX integration, VHDL sources under rtl/vhdl/, and the per-vendor JTAG-chain rules are covered in RTL integration. The canonical register / shift maps live in docs/specs/register_map.md.

Support status

Area Status
Xilinx hw_server backend ✅ Hardware-validated on Arty A7
OpenOCD backend ✅ Hardware-validated on Gowin BRS-100; Xilinx/OpenOCD path still less exercised than hw_server
Xilinx 7-series wrappers ✅ Hardware-validated on Arty A7-100T
Gowin wrapper ✅ Hardware-validated on BRS-100-GW1NR9
UltraScale / ECP5 / Intel / PolarFire wrappers RTL complete; host / hardware validation still limited
ELA / EIO / EJTAG-AXI / EJTAG-UART ✅ Validated on Arty A7 (details in the manual)

The full, always-current matrix is in Overview and RTL integration.

Build from source

# Build the Arty A7 reference bitstream (Vivado)
python examples/arty_a7/build.py

# Run the host test suite — no hardware needed
pip install -e ".[dev,hdl]"
pytest tests/ -v

RTL simulation (Icarus / Verilator / cocotb / GHDL), the VHDL parity gates, the CI jobs, and the hardware-in-the-loop tests are all documented in CONTRIBUTING.md. Live CI status is the badge at the top.

Project layout

rtl/        Portable Verilog cores + vendor TAP wrappers (VHDL in rtl/vhdl/)
host/fcapz/ Python host stack: Analyzer, transports, CLI, RPC, GUI
examples/   Reference designs (Arty A7, Gowin BRS-100, and more)
docs/       User manual (start at docs/README.md) + canonical specs
tb/, sim/   Testbenches and simulation runners

Project links

Author

Leonardo Capossio — bard0 designhello@bard0.com

Contributors

Sponsoring

If fpgacapZero helps your FPGA debug flow, you can support continued development through GitHub Sponsors.

License

Apache License 2.0 — see LICENSE for details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fpgacapzero-0.4.6.tar.gz (5.8 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fpgacapzero-0.4.6-py3-none-any.whl (5.8 MB view details)

Uploaded Python 3

File details

Details for the file fpgacapzero-0.4.6.tar.gz.

File metadata

  • Download URL: fpgacapzero-0.4.6.tar.gz
  • Upload date:
  • Size: 5.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fpgacapzero-0.4.6.tar.gz
Algorithm Hash digest
SHA256 f8c61992496d514c05c5edb0be5888e59c5ec247fccd81fcc8b6869718a42288
MD5 227bb6692ce178d10331e4c218db64fc
BLAKE2b-256 8e45bd8b3efe14c3c555bcb4aeb7048d1eed1181003e49f57a8dfd41cd312b4c

See more details on using hashes here.

Provenance

The following attestation bundles were made for fpgacapzero-0.4.6.tar.gz:

Publisher: release.yml on lcapossio/fpgacapZero

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fpgacapzero-0.4.6-py3-none-any.whl.

File metadata

  • Download URL: fpgacapzero-0.4.6-py3-none-any.whl
  • Upload date:
  • Size: 5.8 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fpgacapzero-0.4.6-py3-none-any.whl
Algorithm Hash digest
SHA256 e647fc868d5ca7643dd19effd82396addb9b41f27d2e98e8ae79c8b1a618a72b
MD5 32d7ca110acc5bea2e59b2724a20dfe3
BLAKE2b-256 cb04af679a38c31806a9b4e9a636f95b4126dd146372873cd6ce1d23d83c36a4

See more details on using hashes here.

Provenance

The following attestation bundles were made for fpgacapzero-0.4.6-py3-none-any.whl:

Publisher: release.yml on lcapossio/fpgacapZero

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page