A modern oscilloscope platform, built in three phases: our own software on scopes you can already buy, then the FPGA, then an instrument of our own, shaped by what engineers ask for.

Our Linux software stack on the DHO800/900 and MHO900. Two units in daily use.
Phase 2The FPGAstudyingWhere the waveform rate is lost, and what a design of our own could reach.
Phase 3Our own instrumentin designA headless, agent-driven scope and bring-up bench. Your feedback sets the spec and the price.
These scopes pair a Rockchip RK3399 with a Xilinx-class FPGA over PCIe, the same recipe as the LED video processors we work with every day. Stock, they run Android 7.1 on a Linux 4.4 kernel with a Java app on top. NovaOS replaces all of it: the Rockchip 6.12 BSP kernel (Linux 6.12.112, a long-term kernel supported until December 2028, and the newest with Rockchip's Mali GPU driver; why not 7.2), a minimal Yocto and systemd system, and a scope stack written from scratch in Rust: the acquisition engine, a GPU-drawn UI, SCPI, Webcontrol, VXI-11 and LXI.
It is our own engine talking to the FPGA directly, so everything the hardware can do is available. The stock firmware stays on the scope, one menu item away.
There is no Android, no Java, no X server and no compositor: the UI draws with OpenGL ES on the Mali GPU straight to the display through DRM/KMS, samples arrive by PCIe DMA into a shared-memory ring the UI reads without copying, and remote view uses the SoC's hardware H.264 encoder. A running scope uses about 217 MB of RAM. How the stack fits together.
| What | NovaOS | Notes |
|---|---|---|
| Operating system | Linux 6.12.112 | Rockchip BSP, Yocto, systemd, Rust userspace. Stock: Android 7.1 on Linux 4.4. |
| Boot to a live trace | 12.5 s DHO924S · 11.9 s MHO934 | From kernel start, later boots, median. Stock figure being measured the same way. |
| DHO FPGA bring-up | 2.0 s | Stock waits fixed timers totalling about 15 s; we probe for readiness and verify the image loaded. |
| Density display coverage | 100 % | Every acquired waveform is counted into the per-pixel map, on worker threads. |
| Remote view latency | ~0.1 s | A change on the scope, hardware H.264, to another display's glass. |
| MHO ADC interleave spurs | 0.5 to 1.2 mVpk | After self-calibration, 2 GSa/s. Stock without a self-calibration: 2.3 to 8.1 mVpk, varying from boot to boot (four boots measured). |
| Under NovaOS | DHO924S | MHO934 |
|---|---|---|
| Analog channels | 4, 12-bit | 4, 12-bit |
| Maximum sample rate | 1.25 GSa/s | 4 GSa/s |
| Input impedance | 1 MΩ | 1 MΩ or 50 Ω |
| Signal generators | 1 | 2 |
| Logic channels | 16 | 16, at 1 GSa/s |
| Eye diagram data rate | to 625 Mb/s | to 2 Gb/s |
| Bode sweep | to 78 MHz | to 100 MHz, on G1 or G2 |
Rigol's FPGA design is solid: it fills most of the chip with triggers, filters and interleave correction. What it leaves on the table is getting data out: capture and read-out take turns, read-out runs at about one sample per clock, and there is no density map in the FPGA. On a DHO at 20 ns/div we reach about 30k waveforms a second, a quarter of what the record length allows.
| Idea | Today | Target, an estimate |
|---|---|---|
| Overlapped capture and read-out | ~10k wfm/s at 2 µs/div | ~28 to 30k wfm/s |
| Density map built in the FPGA | ~30k wfm/s at fast timebases | 0.5 to 1M wfm/s |
| Segmented memory | ~40k segments/s | ~1M segments/s at 1 kpts |
First we are squeezing the driver side, since part of the per-trigger cost may come from how the image is driven. A rewrite only makes sense where the community wants the speed.
Everything learned in phases 1 and 2 goes into our own design: no screen, no knobs, no phone operating system. Plug it in over Ethernet with PoE or USB, and an AI agent, or any program, connects and drives it. It is also an FPGA bring-up bench: logic inputs, JTAG, a console, two supplies and a generator, all on one timebase.
| Call | What it does |
|---|---|
describe | Channels, limits, calibration state and age, and what the inputs see right now. |
configure | Takes the state you want and returns what was actually set, rounded to the hardware's steps. |
capture | One acquisition: statistics, measurements, clipping flags, a thumbnail and an evidence id. |
measure · decode | Measurements and bus decodes on a capture. |
watch | Arms on an edge, a glitch or a decoded frame, and notifies when it happens. |
generate | Drives the generator, inside limits a person has set. |
run_suite | Runs the connected board's own test list against its description. |
A built-in MCP server (Model Context Protocol) serves these calls; the same calls work as JSON over HTTP and WebSocket, and SCPI stays for existing tools. We are prototyping the same agent interface on the phase 1 scopes first.
| Card | Target |
|---|---|
| General acquisition | 4 channels; 1 GS/s 8-bit on 1 channel (250 MS/s on 4), 640 MS/s 12-bit; 350 MHz |
| High speed | 2 × 5.2 GS/s or 1 × 10.4 GS/s, 12-bit; 3 GHz at 50 Ω |
| Link probe | 4 transceiver lanes, 0.5 to 10.3 Gb/s: lock, 2-D eye scan, bit-error rate |
| Bring-up | A keyed board port: JTAG, console, logic, two supplies, a generator behind a physical switch |
Safety lives in hardware. A physical generator-output switch means an agent cannot drive a circuit until a person turns it on. Updates are signed, FPGA images are signed and checked before they load, and nothing listens without a token.
Every figure in this section is a design target until a measurement replaces it.
Phase 3's spec and price come from you. We would like to hear:
Email [email protected].