# STRIX ### Satellite True Random Information eXtractor A portable wireless True Random Number Generator built on an Arduino MKR Vidor 4000. ## Design Entropy comes from FPGA ring oscillators whose sampled timing jitter is XOR-combined into output bits, with no pseudo-random post-processing. A SAMD21 serves the results over USB, over HTTP on its own WiFi access point (stationary mode, on a charger), or over Bluetooth LE (mobile mode, on battery). - 4 independent generators × 90 ring oscillators. Each generator XORs its rings every 120 MHz clock (spatial) and then several consecutive bits (temporal, default 5): about 24 Mbps per generator. - Separate stream per generator, plus a combined stream of all healthy generators - On-device health tests per generator: NIST SP 800-90B repetition count and adaptive proportion, plus a dead-ring monitor - Live statistics per trial: bias, z-score, random walk and lag-1 autocorrelation, with rolling and cumulative windows - Configurable random-walk / majority-vote bias amplifier on a bias path and an autocorrelation path, with sub-trial voting - Von Neumann extractor that can be toggled on the stream, statistics and amplifier paths - Per-second trials in Global Consciousness Project format (200-bit XOR-masked sums per generator, plus full-rate sums), with Stouffer Z and network variance - Raw ring captures and frequency measurement for characterization The USB, HTTP and BLE API is documented in [arduino/strix/API.md](arduino/strix/API.md). ## Layout - `fpga/rtl/`: Verilog sources; `fpga/sim/`: testbenches; `fpga/src/`: Quartus project - `arduino/strix/`: device firmware - `arduino/strix_capture/`: characterization tool firmware, used by `tools/jitter.py` - `arduino/strix_nina_passthrough/`: connects USB to the WiFi module's UART for flashing its firmware - `arduino/libraries/`: `StrixFPGA` (FPGA boot, SPI access, embedded FPGA image), `VidorBoot` (vendored subset of Arduino's VidorPeripherals), and Arduino's `WiFiNINA`, `Arduino_SpiNINA` and `ArduinoBLE`, patched to drive the WiFi module through the FPGA's pin pass-through (see `arduino/libraries/STRIX-NINA-LIBRARIES.md`) - `tools/`: FPGA image converter, jitter and statistics experiments, API check ## Development (Linux) The toolchain is managed by [devbox](https://www.jetify.com/devbox): `arduino-cli`, Intel Quartus Prime Lite (Cyclone 10 LP only, through a Nix flake in `nix/`), Icarus Verilog, Rust, and [uv](https://docs.astral.sh/uv/) for the Python tools (`pyproject.toml`, `uv.lock`). 1. `devbox run setup`: install the Arduino SAMD core (libraries are vendored in `arduino/libraries/`) 2. `devbox run sim`: run the FPGA testbenches 3. `devbox run fpga`: build the FPGA bitstream (about 10 minutes) 4. `devbox run image`: embed the bitstream in the `StrixFPGA` library 5. `devbox run build`, then `devbox run upload`: build and flash the firmware (`PORT` defaults to `/dev/ttyACM0`) 6. `devbox run api-check`: end-to-end check of the USB API Serial access requires membership in the `dialout` group. If a firmware leaves the board unable to stay on USB, enter the bootloader: hold reset while plugging in, release, then tap reset once quickly. For characterization, flash the capture tool with `devbox run upload-capture` and use `devbox run jitter `. `devbox run onod-build` builds the onod3000 test suite used by `jitter output` and `api-check`. ### WiFi module firmware BLE needs NINA firmware 3.0.0 or newer (the board shipped with 1.0.0). To flash Arduino's [nina-fw](https://github.com/arduino/nina-fw/releases) `NINA.bin`: 1. Flash the passthrough: `devbox run -- arduino-cli compile -u -p /dev/ttyACM0 --fqbn arduino:samd:mkrvidor4000 --libraries arduino/libraries arduino/strix_nina_passthrough` 2. `devbox run -- uv run esptool --chip esp32 --port /dev/ttyACM0 --baud 115200 write-flash 0 NINA.bin` 3. Flash the STRIX firmware again (`devbox run upload`); `wifi probe` reports the module firmware version. The passthrough forwards reliably at 115200 baud, not at 460800. ## TODO - WiFi credentials stored on the device instead of compile-time defaults - Battery pack - 3D case --- ## [Development Notes](NOTES.md)