fpgacapZero (fcapz)
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.
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
- 📖 User Manual — the complete guide
- 📝 CHANGELOG — releases, with breaking changes called out
- 🤝 CONTRIBUTING — dev setup, testing, adding a board
- 🐛 Troubleshooting — common errors and fixes
Author
Leonardo Capossio — bard0 design — hello@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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fpgacapzero-0.4.8.tar.gz.
File metadata
- Download URL: fpgacapzero-0.4.8.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c35051099c156408ee832da072b22e0efdc9d72108d6d679f0c4fcf30b4c08f
|
|
| MD5 |
ea7f850689972d76fed72d36c5a435f7
|
|
| BLAKE2b-256 |
16e96d3d96e4445680b2bc601d743df130f5804c15eca5b06174f754cf9c212b
|
Provenance
The following attestation bundles were made for fpgacapzero-0.4.8.tar.gz:
Publisher:
release.yml on lcapossio/fpgacapZero
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fpgacapzero-0.4.8.tar.gz -
Subject digest:
2c35051099c156408ee832da072b22e0efdc9d72108d6d679f0c4fcf30b4c08f - Sigstore transparency entry: 2406658568
- Sigstore integration time:
-
Permalink:
lcapossio/fpgacapZero@93b7d33d65aa1c9ab18bf58a01f7c54ea1ae4bff -
Branch / Tag:
refs/tags/v0.4.8 - Owner: https://github.com/lcapossio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@93b7d33d65aa1c9ab18bf58a01f7c54ea1ae4bff -
Trigger Event:
push
-
Statement type:
File details
Details for the file fpgacapzero-0.4.8-py3-none-any.whl.
File metadata
- Download URL: fpgacapzero-0.4.8-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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3917f66433e3dc53623fa83e946509ae0a4948e7a2ce13c85bab95026ca69d7c
|
|
| MD5 |
46008fa1b92046ba02596f1df5a02fcb
|
|
| BLAKE2b-256 |
697cad9cdd586d5784a8e75360ad65e3127864c3ec7a298d488ca8188a7c0f88
|
Provenance
The following attestation bundles were made for fpgacapzero-0.4.8-py3-none-any.whl:
Publisher:
release.yml on lcapossio/fpgacapZero
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fpgacapzero-0.4.8-py3-none-any.whl -
Subject digest:
3917f66433e3dc53623fa83e946509ae0a4948e7a2ce13c85bab95026ca69d7c - Sigstore transparency entry: 2406658715
- Sigstore integration time:
-
Permalink:
lcapossio/fpgacapZero@93b7d33d65aa1c9ab18bf58a01f7c54ea1ae4bff -
Branch / Tag:
refs/tags/v0.4.8 - Owner: https://github.com/lcapossio
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@93b7d33d65aa1c9ab18bf58a01f7c54ea1ae4bff -
Trigger Event:
push
-
Statement type: