Evaluation package
- Gate-level simulation netlists of the FPGA cores
- Self-checking SystemVerilog testbench and golden vectors
- Bit-exact Python reference model
- One-command test script for Verilator or Icarus
Streaming 3×3 to 7×7 median, percentile and Bayer defect-pixel-correction cores for FPGA and ASIC. A 5×5 median needs 52 comparators per pixel, against 63 for column sharing, the lowest published count we know of. Every comparator network is proved correct in Lean 4, and the cores run on Altera Cyclone V silicon.
A streaming filter computes a new window every clock, and neighbouring windows overlap almost completely. RankFilter's comparator networks reuse that overlap instead of recomputing it. We found them by computer search and proved each one correct, for every input, in the Lean 4 proof assistant.
The honey-coloured stages are the comparator networks: found by search, proved in Lean 4.
Any FPGA or ASIC flow that accepts Verilog-2005. Signed off on AMD Artix 7, Zynq 7000 and Zynq UltraScale+ (Vivado) and Altera Cyclone V (Quartus); measured on Lattice ECP5 and in the SkyWater 130 nm and ASAP7 ASIC flows.
Comparator count drives logic and power. RankFilter is lower than Adams' 2021 separable networks and the best single-window designs at every shipped size, apart from a tie at 3×3 and one pixel per clock.
| Window | RankFilter | Adams method | Single window | Odd-even |
|---|---|---|---|---|
| 3×3, 1 px/clk | 13 | 13† | 19 | 36 |
| 5×5, 1 px/clk | 52 | 63 | 85 | 300 |
| 5×5, 4 px/clk | 37 | 42.75† | 85 | 300 |
| 7×7, 1 px/clk | 140 | 187 | 231 | 1,176 |
| 7×7, 2 / 4 px/clk | 92 | 117† / 93.25 | 231 | 1,176 |
Adams 2021 (ACM Transactions on Graphics) is a software method that computes tiles of outputs; 187 and 93.25 are published in the paper and 63 is derived from it, and † marks our own count for his method. Single window: the smallest known networks that sort one whole window, with no sharing. Odd-even: the transposition sort that Vitis medianBlur unrolls. Only the RankFilter column is proved.
Complete filters: AXI4-Stream interface, line buffers for 2,048-pixel lines, border logic and comparator core, 8-bit pixels, 1 pixel per clock unless stated. Fmax in MHz on the slowest speed grade of each family.
| Core | Artix 7 −1, Vivado LUT / FF | Fmax | Cyclone V C8, Quartus ALM / M10K | Fmax | ECP5 −6, nextpnr LUT4 / EBR | Fmax |
|---|---|---|---|---|---|---|
| 3×3 median | 345 / 567 | 237 | 371 / 7 | 180 | 928 / 2 | 146 |
| 3×3 median, 4 px/clk | 974 / 1,526 | 237 | 939 / 8 | 180 | 2,233 / 8 | 126 |
| 5×5 median | 871 / 1,511 | 209 | 896 / 10 | 180 | 2,056 / 4 | 162 |
| 5×5 median, 4 px/clk | 2,638 / 3,766 | 225 | 2,216 / 28 | 163 | 5,184 / 15 | 154 |
| 5×5 25th percentile | 751 / 1,302 | 238 | 769 / 10 | 180 | 1,783 / 4 | 163 |
| 7×7 median | 1,969 / 3,458 | 217 | 1,941 / 20 | 167 | 4,455 / 6 | 150 |
| 7×7 median, 4 px/clk | 5,534 / 7,976 | 215 | 5,276 / 46 | 152 | 11,452 / 23 | 128 |
| Bayer DPC | 410 / 771 | 228 | 435 / 9 | 159 | 1,092 / 4 | 159 |
| Bayer DPC, 4 px/clk | 1,197 / 1,860 | 215 | 1,115 / 11 | 180 | 2,673 / 15 | 150 |
| Mono DPC with defect map | 384 / 633 | 214 | 430 / 7 | 180 | 959 / 2 | 160 |
Artix 7 xc7a35t-1: Vivado 2025.2, filter instance only, resources at 148.5 MHz. Cyclone V 5CEBA4F23C8: Quartus Prime Lite, lowest of 3 seeds; 180 MHz is the M10K block RAM's limit. ECP5 LFE5U-85F: yosys and nextpnr, lowest of 5 seeds. 1080p60 needs 148.5 MHz at 1 pixel per clock. 4K60 at 4 pixels per clock needs 4,096-pixel lines and 148.5 MHz (124.4 MHz at the active pixel rate); with 4K lines every 4 px/clk core meets 148.5 MHz on the AMD parts and on every Cyclone V seed. The datasheets list every variant, including Zynq 7000 and Zynq UltraScale+.
| Against other designs, same flow | 5×5 | 7×7 |
|---|---|---|
| AMD Vitis Vision medianBlur, Artix 7 LUTs | −75 % | −83 % |
| Same, at 4 px/clk | −64 % | Vitis does not fit |
| Strongest baseline we built, Artix 7 LUTs | −14 % | −26 % |
| Same, Cyclone V ALMs | −18 % | −22 % |
| Same, ECP5 LUT4s | −11 % | −21 % |
| Same, SkyWater 130 nm area | −16 % | −25 % |
Same harness, flow, part and line length for both designs; AMD resources at a common 148.5 MHz constraint. Vitis: Vitis_Libraries 2025.2 as shipped, the better of two HLS builds per metric, and each compared build simulated and checked for the correct median. Vitis also uses more block RAM at every size, and its 7×7 at 4 px/clk does not fit the xc7a35t. Both sign off at about the same Fmax, so speed is not the difference. The comparison brief has every size and part.
The baseline is column sharing (each column sorted once, then a selection network), built with the same generator and wrapper.
A filter that is wrong only on rare inputs can pass every demo and still fail in the field. Every claim below is backed by a repeatable script.
A simulation evaluation package is available on request. It drops into your testbench with the same module names and ports as the licensed source.
Licences per project or per company. Other window sizes, ranks, pixel widths and pixels per clock can be generated and verified to order, and integration support is available on contract.
Contract engineeringTell us your device, resolution, frame rate and pixel width, and we'll reply with the matching variant and an evaluation package.
Revision 1.0, October 2026. Product guides with the full results tables are available on request.
3×3, 5×5 and 7×7 median, 25th and 75th percentile, 1 to 4 px/clk. 2 pages.
Same-colour 3×3 correction for raw Bayer sensors, run-time threshold. 2 pages.
Thermal and SWIR sensors, threshold plus a static defect map. 2 pages.
Recovers from single-event upsets without a reset. 2 pages.
Same-flow comparison with AMD's free median filter on three AMD parts. 2 pages.
The whole family on two pages.
The flow behind these datasheets runs on other designs too. Send one block and get implementation results on AMD, Altera and Lattice parts, a same-flow comparison with the vendor's free core, verification to coverage closure and an upset campaign, with every script to rerun it. Fixed prices, all work remote, your source kept under NDA.
£2,400 fixed, about 1 week
£5,900 fixed, about 3 weeks
£2,900 add-on, about 1 week
For one block up to about 10,000 LUTs. Larger blocks are quoted. Service sheet (PDF) · contact@bumblebytes.co.uk