is the dragonfly’s visual interception reflex — a neural circuit that has computed predictive motion since the Carboniferous period. Its medium is synthesizable Verilog RTL. The work has two parts. The first is a motion-prediction core: given a stream of events, it produces a coordinate where a moving object will be, five clock cycles after the event that triggered it. The second, built on the same blocks, is the dragonfly’s actual task: a detector for tiny moving targets against a quiet background, measured on public event-camera recordings of drones.
Neither part interprets. Neither learns. They measure, delay, correlate, inhibit and predict through fixed pipelines. Determinism is the work’s central property.
The biological model — the Hassenstein-Reichardt correlator, the T4/T5 dendritic mechanism, the small-target motion detector neurons of the dragonfly lobula — is not metaphor. It is the specification. The distance between the dragonfly’s optic lobe and this RTL is a translation, not an interpretation.
The work exists in three simultaneous registers. As engineering: a verified hardware core and a detector that exists, bit for bit, as Python, as fixed-point C, and as Verilog. As biology: a named circuit carried into logic without a learned weight anywhere in it.
The dragonfly’s aerial hunting strategy is predictive. It computes an intercept. Flight paths recorded in laboratory conditions are consistent with a constant-bearing, decreasing-range pursuit geometry — the geometry of prediction rather than reaction. The neural substrate responsible, target-selective descending neurons (TSDNs), projects from the optic lobe directly to flight motor circuits. Observation, computation, and action are one continuous process. Before pursuit comes detection: small-target motion detector (STMD) neurons in the lobula respond to a tiny dark object moving against clutter and to little else, and they do it from a perch, with the eye still.
Hassenstein and Reichardt derived a model of directional motion detection from purely behavioural experiments on walking beetles. No electrophysiology. A logical argument from stimulus to response. The model specifies: delay the signal from one photoreceptor, multiply it with the instantaneous output of an adjacent one, subtract the mirror-symmetric subunit. The result is direction-selective. Confirmed without modification in electrophysiology decades later. It remains the governing framework.
T4 neurons (ON edges) and T5 neurons (OFF edges) in the Drosophila optic lobe each come in four subtypes tuned to one of four cardinal directions. Directional sharpness arises from a dual mechanism on the same dendritic tree: preferred-direction enhancement via GluCl-α receptors at the dendritic tips, null-direction suppression via GABA-A receptors at the base. Mi9, Mi1, and Mi4 provide excitatory and inhibitory inputs at mapped spatial locations. The geometry of the dendrite performs the computation. No learning. No weights. Fixed physics.
Wiederman, O’Carroll and Shoemaker (2008) proposed a model for STMD neurons that needs no explicit size template: adapt each photoreceptor, split the signal into ON and OFF channels, delay one and correlate it with the other at the same location (a dark target passing a point produces OFF then ON), and inhibit each channel with its spatial surround. Small moving targets survive this chain; wide-field motion and static texture do not. The detector in §2 is a per-event implementation of that chain for an event camera, with a tracker and two adaptive stages added for real recordings.
The detector takes the event stream of a fixed DVS camera and labels, event by event, which events belong to a small moving target. It is causal and per-event: no frames, no batching, no learned weights. It exists in three forms that agree with one another: a Python reference model, a fixed-point C port with documented bit widths, and two Verilog-2001 modules. Chained, the Verilog reproduces the C model on 88 000 replayed events with zero mismatches on the candidate flag, zero on the label, and the same count of confirmed-track records on every scene.
An event passes if enough of its eight neighbours fired within a window (80 ms in the selected configuration). The same idea as the core’s LIF filter, kept as per-pixel timestamps.
A leaky per-pixel count of polarity reversals. Pixels that keep reversing (foliage, water, flicker) are suppressed. Insect lamina adaptation, in integer arithmetic.
A slow per-region event-rate estimate mutes regions that stay hot (sun glare on the sensor). A global background-rate estimate shortens the activity-filter window, demands two supporting neighbours and raises the candidate threshold when the sensor is noisy. Removing glare adaptation drops held-out IoU from 0.76 to 0.55.
The Wiederman OFF-then-ON signature: an event is weighted up if the opposite polarity fired at the same pixel 3–100 ms earlier. Implemented and verified; in every configuration searched it contributes under one percent to the result, and switching it off saves a third of the state memory. A finding, not a design choice.
Responses accumulate in 3 px cells. A candidate is declared when the 3×3 centre exceeds the inhibited 9×9 ring of responses and of raw activity. This stage and the tracker carry the result.
Eight gated tracks with an α–β position/velocity update, confirmation by hits, time and displacement, and a stationarity check that stops a track from labelling once it has stopped moving. The core’s predictor, re-used.
An event is a target event if it lies within a velocity-extended radius of a confirmed, moving track. The output is the per-event label and a record for every update of a confirmed track.
EV-UAV is a public dataset of tiny drones recorded with a static DAVIS346 event camera, with per-event labels (arXiv 2506.23575). Scores use a port of the dataset authors’ own evaluator. The held-out split is twenty train sequences never used for tuning, scored once per variant; brackets are 95 % bootstrap intervals over sequences. The dataset’s test split has been untouched since v25.
| Variant | IoU | Pd (per 50 ms) | Targets detected | Window coverage | False tracks / min |
|---|---|---|---|---|---|
| v26 segmentation point | 0.764 [0.68–0.84] | 0.888 [0.84–0.94] | 0.94 | 0.80 | 20.6 |
| v27 segmentation + false-track penalty | 0.807 [0.73–0.88] | 0.837 [0.75–0.92] | 0.88 | 0.74 | 4.5 |
| v26 alarm point (2/min budget) | 0.664 [0.55–0.79] | 0.745 [0.62–0.87] | 0.80 | 0.65 | 3.0 |
| v27 point, ESTMD stage off | 0.809 | 0.834 | 0.92 | 0.72 | 4.1 |
EV-UAV test split, scored once (v25) | IoU | Recall | Pd |
|---|---|---|---|
| LIBELLULA-STMD v25 (tuned on train + val) | 0.813 | 0.934 | 0.902 |
| EV-SpSegNet, the dataset authors’ trained network (4 M weights, whole-clip, GPU) | 0.552 | 0.650 | 0.775 |
What holds up: centre-surround inhibition, the tracker, and glare adaptation. What does not: dense low-light sensor noise, where no configuration keeps both a low false-track rate and useful coverage. The v27 point trades 0.05 Pd for four and a half times fewer false tracks; only the false-track change is outside the intervals.
Out-of-context implementation was completed on Xilinx UltraScale+ VU9P at 200 MHz for both the bare core and an AXI-integrated evaluation shell. Both builds achieved positive setup and hold slack with zero routing errors. These are out-of-context results: materially stronger than simulation-only evidence, but not equivalent to full board-level timing closure. The reports are in the evaluator package; the public repository holds the simulation suite only.
| Claim | Specification | Result | Testbench |
|---|---|---|---|
| Latency | ≤ 5 cycles @ 200 MHz, every emitted prediction | 5 cycles · 25 ns | tb_latency · tb_latency_default |
| Output cadence | Characterisation, not asserted | first prediction after 32 events; ~1 per 17 events for one slow target | tb_latency_default |
| Accuracy | ±2 px, constant velocity 1 px/event | mean 0.73 px, max 2 px; beats echo | tb_px_bound |
| Accuracy outside the claim | 2–3 px/event; 300 events/s | max 3–4 px; within ±2 but no better than echo | make pxbound-char |
| Throughput | 1 Meps, zero drops | 2000 / 2000 ACK (ACK=REQ by construction) | tb_aer_throughput_1meps |
| Power scaling | Activity-proportional toggle count | Low/high confirmed | tb_power_lo · tb_power_hi |
| 8-direction motion | Cardinal + diagonal | All 8 axes exercised | tb_reichardt_ds |
| Determinism | Two identically stimulated cores bit-exact | Zero divergence | tb_deterministic_replay |
| Hostile conditions | Reset mid-stream, stuck REQ, 50 000-event random stress | No leaks, no X, deterministic re-entry | tb_hostile/ |
| Full suite | 42 benches + lint | all PASS, 0 Verilator warnings, CI on every push | make test axi lint |
A harness runs the core against three software baselines (Kalman, event-motion heuristic, normalised-LMS velocity regressor) on six synthetic scenarios. The software baselines are more accurate on clean scenes (0.5–1 px against 2.4–4.5 px); the core is ahead on the distractor-crossing and noise-burst scenes. Baseline latencies are nominal constants, all stimulus is synthetic, and the harness is not gated in CI. An earlier version of this harness paired predictions with the wrong events and reported the core as failing; v23 corrected it.
AER → LIF tile → 8-direction delay lattice → Reichardt direction selector → burst gate → α–β predictor → confidence gate. Fixed feed-forward architecture, unchanged since v22. Click any stage to expand.
Level-sensitive, combinational receiver: every clock cycle with REQ high is one event and ACK mirrors REQ. It is not a 4-phase handshake; a bridge is required for a 4-phase source. Sensor-agnostic at the address-event level (Prophesee, iniVation, Samsung formats via the AXI4-Stream bridge).
Time-multiplexed, 14-bit. Filters incoherent events. Analogue to temporal filtering in medulla intrinsic neurons Mi1, Mi4, Mi9.
Ring-buffer delay lattice across cardinal (E, W, N, S) and diagonal (NE, NW, SE, SW) axes. Diagonal contributions scaled for geometric equivalence approximation.
Implements both preferred-direction enhancement and null-direction suppression — direct analogue of T4/T5 dendritic computation. All eight axes exercised in tb_reichardt_ds.
Hysteretic density thresholding. TH_OPEN=3, TH_CLOSE=1. Only sustained coherent activity propagates to the predictor.
Q8.8 fixed-point. Forward extrapolation: p̂ = p + v·Δt. Outlier rejection above OUTLIER_TH=128; predictor coasts on current velocity estimate. Velocity is zeroed on direction reversal.
Reliability score from event rate and direction magnitude across all eight axes. Gates output with pred_valid strobe. Downstream: (x̂, ŷ, conf).
ACK mirrors REQ within the same cycle; one event per cycle with REQ high. Validated at ≥106 events/s with zero drops. Behavioural shell for FPGA bring-up.
Single accumulator shared across spatial array via time-multiplexing. 14-bit precision. Configurable leak rate. Filters sparse or incoherent events.
Ring-buffer delay lattice, cardinal and diagonal axes. Diagonal contributions scaled for geometric equivalence. Provides temporal gradient structure for reichardt_ds.
Preferred-direction enhancement and null-direction suppression. Direct computational analogue of T4/T5 dendritic physics. All eight axes in tb_reichardt_ds.
TH_OPEN=3, TH_CLOSE=1. Reduces chatter at threshold boundary. Only sustained activity propagates to the predictor.
L1-distance routing of measurements to tracks, coast counter for missed updates.
Trajectory extrapolation in continuous time. Outlier rejection: residuals above OUTLIER_TH=128 cause the predictor to coast on current velocity. ≤ ±2 px at 1 px/event verified against the next position, not the current one.
Reliability score across all eight axes. Downstream receives (x̂, ŷ, conf) only on pred_valid strobe.
200 MHz AXI4-Stream on both event input and prediction output, 48-bit TDATA packing, back-pressure handled; four benches, 111 assertions.
Per-pixel front end and cell/tracker back end, bit-exact against the fixed-point C reference. Verified by replay of C-generated vectors, lint, and a negative test for the stale sweeps.
| Parameter | Default | Description |
|---|---|---|
| XW / YW | 10 | Coordinate width, bits |
| AW | 8 | LIF address width |
| DW | 6 | Delay lattice depth, bits |
| PW | 16 | Predictor output width, bits |
| WINDOW | 16 | Burst gate counting window |
| TH_OPEN | 3 | Events to open burst gate |
| TH_CLOSE | 1 | Events to hold gate open |
| OUTLIER_TH | 128 | Residual threshold; predictor coasts above this |
LIBELLULA requires DVS cameras. It operates on asynchronous events — one per pixel per polarity change, timestamped to the microsecond. Frame-based cameras cannot provide the temporal precision required by the delay lattice, the Reichardt correlator, or the ESTMD correlation. This is a property of the architecture, not a limitation of the implementation. The detector further assumes a fixed camera: a moving platform floods the stream with background events and the static-scene assumptions fail together. Ego-motion compensation is a separate module and does not exist here.
Neural networks operating on event-camera streams batch or accumulate events before inference. Even purpose-built SNN inference takes on the order of 100 µs to several milliseconds to produce a position estimate. LIBELLULA produces a forward-extrapolated coordinate 25 ns after the event that triggers it, and the detector labels each event as it arrives. These are complementary operations: a direction-confirmed, cheap, always-on signal that tells a heavier system where to look, rather than raw accumulated events.
Published system-level figures for the comparison rows, as reported by their authors; the LIBELLULA row is from simulation and out-of-context implementation. The core’s latency is per emitted prediction; output cadence depends on scene event density. No power measurement exists for LIBELLULA.
| System | Core latency | Forward forecast | Power |
|---|---|---|---|
| DJI / Skydio commercialFrame CNN on ARM + GPU | 20–40 ms | Reactive only | 3–8 W |
| ETH-UZH event-camera avoidanceScience Robotics, 2020 | 3.5 ms | None | ~10 W |
| FPGA event-vision acceleratorBonazzi et al., arXiv 2024 | ~2 ms | None | 3–5 W |
| EV-SpSegNetEV-UAV authors’ network, 2025 | whole clip, GPU | None | GPU |
| LIBELLULA — core logicSynthesizable RTL · 200 MHz · UltraScale+ VU9P (OOC) | 25 ns (5 cycles) | Δt selectable; ±2 px shown at 1 px/event | not measured |
The public repository (GPL v3; commercial licence by arrangement) holds the RTL, the simulation suite, the comparative benchmark harness, the detector in all three forms, its configurations, held-out split, scored results with intervals, search records, and the CI that re-checks all of it on every push. The EV-UAV data is not included; it comes from the dataset authors.
Technical engagement, a licence, or a camera to run it on can be arranged directly. The next step the work needs is a DVS on a bench; the repository is ready for it.
Oliver Hockenhull · Sooke, BC, Canada
oliver.hockenhull@gmail.com