ESP32 OSD and loading
On-screen display and ROM/disk loading driven by the ULX3S ESP32 over SPI.
| Core | Repository | Language | License | FPGA | Used by |
|---|---|---|---|---|---|
| ESP32 SPI OSD + spirw_slave ROM/disk loading stack ★ | lawrie__ulx3s_sms | Verilog, MicroPython | osd.v and spi_osd.v: none found; | any | 31 |
| esp32_spi_gamepad minimal ESP32 SPI state receiver | dan-rodrigues__ulx3s-bluetooth-gamepad | Verilog | MIT (SPDX header, Copyright 2020 Dan Rodrigues) | any | 1 |
| esp32ecp5 MicroPython FPGA loader package | emard__esp32ecp5 | MicroPython | MIT (pypi/LICENSE.txt, “AUTHOR=EMARD LICENSE=MIT”) | any | 1 |
| SPI RAM slave (ESP32 <-> FPGA memory-mapped link) | emard__uk101onfpga | VHDL | BSD (“AUTHOR=EMARD LICENSE=BSD”) | any | 1 |
Cores
ESP32 SPI OSD + spirw_slave ROM/disk loading stack (best)
Intercepts the video stream to draw a text OSD window (osd.v) driven by an SPI slave register interface (spi_osd.v) that the ESP32 writes into; a generic SPI RW slave (spirw_slave_v.v) is what the ESP32-side MicroPython (osd.py) uses to browse/select ROMs on SD and push them into FPGA BRAM.
| Repository | lawrie__ulx3s_sms: Sega Master System / SG-1000: TV80, VDP, SN76489, SDRAM carts, ESP32 OSD |
| Files | src/osd/osd.v, src/osd/spi_osd.v, src/osd/spirw_slave_v.v, esp32/osd/osd.py |
| Top module | osd |
| Language | Verilog, MicroPython |
| License | osd.v and spi_osd.v: none found; spirw_slave_v.v: BSD (“AUTHOR=EMARD”) |
| FPGA / primitives | any: none (portable) |
| Tests | none found |
On ULX3S: The de-facto ESP32<->FPGA OSD/loader stack, reused nearly verbatim across nes_ecp5, trs_80, apple2fpga, msx, sega-sms, sg_1000, ql, gamegear, vic_20; wire spi_osd into the video pipeline and spirw_slave_v to a SPI-mapped BRAM/register block.
Full review: lawrie__ulx3s_sms.
Used by 31 other catalogued repos (file copies or module instances found by scan_core_usage.py; heuristic):
- cheyao__icepi-zero (instantiates
gateware/third-party/dvi_osd/hdl/spi_osd_v.v) - cheyao__nes_ecp5 (instantiates
osd/spi_osd.v) - cheyao__sega-sms (instantiates
src/osd/spi_osd.v) - danodus__ulx3s_68k (instantiates
src/osd/spi_osd.v) - danodus__ulx3s_sms (instantiates
src/osd/spi_osd.v) - emard__apple2fpga (instantiates
rtl_emard/lattice/top/ulx3s_v20_apple2.vhd) - emard__nes_ecp5 (instantiates
osd/spi_osd.v) - emard__snes_mister_ulx3s (instantiates
ulx3s/osd/spi_osd.v) - emard__uk101onfpga (instantiates
rtl_emard/osd/spi_osd.v) - emard__ulx3s-misc (instantiates
examples/adxl355/projbig/top/top_adxl355log.v) - emard__ulx3s_c64 (instantiates
rtl/osd/spi_osd_v.v) - emard__ulx3s_vic_20 (instantiates
src/osd/spi_osd.v) - ironsteel__nes_ecp5 (instantiates
osd/spi_osd.v) - lawrie__ulx3s_68k (instantiates
src/osd/spi_osd.v) - lawrie__ulx3s_altair_8800 (instantiates
src/osd/spi_osd.v) - … and 16 more (see
data/core_usage.json)
esp32_spi_gamepad minimal ESP32 SPI state receiver
Minimal SPI receiver decoding ESP32-side Bluetooth-gamepad button/axis state into FPGA registers; a smaller alternative pattern to the full OSD stack for simple ESP32->FPGA control-word links (no video overlay).
| Repository | dan-rodrigues__ulx3s-bluetooth-gamepad: Bluetooth gamepad-to-LED demo: ESP32 |
| Files | esp32_spi_gamepad.v |
| Top module | esp32_spi_gamepad |
| Language | Verilog |
| License | MIT (SPDX header, Copyright 2020 Dan Rodrigues) |
| FPGA / primitives | any: none (portable) |
| Tests | none found |
On ULX3S: Good template for any small ESP32->FPGA state link that doesn’t need the OSD video overlay machinery.
Used by 1 other catalogued repo (file copies or module instances found by scan_core_usage.py; heuristic):
- dan-rodrigues__icestation-32 (instantiates
hardware/ulx3s/ulx3s_gamepad_state.v)
esp32ecp5 MicroPython FPGA loader package
ESP32-side MicroPython package for loading ECP5 bitstreams over SPI (ecp5.py), a micro-FTP server for pushing files to ESP32 flash/SD (uftpd.py), and raw SD block read/write (sdraw.py) — the ESP32 half of the ULX3S ESP32<->FPGA loading path.
| Repository | emard__esp32ecp5: esp32ecp5: MicroPython JTAG programmer for ECP5 from onboard ESP32, FTP/SD/DFU |
| Files | pypi/ecp5.py, pypi/uftpd.py, pypi/sdraw.py |
| Top module | n/a |
| Language | MicroPython |
| License | MIT (pypi/LICENSE.txt, “AUTHOR=EMARD LICENSE=MIT”) |
| FPGA / primitives | any: none (portable) |
| Tests | none found |
On ULX3S: Runs on the ULX3S’s onboard ESP32; pairs with an FPGA-side SPI slave (e.g. spirw_slave_v.v) to receive the loaded data.
Used by 1 other catalogued repo (file copies or module instances found by scan_core_usage.py; heuristic):
SPI RAM slave (ESP32 <-> FPGA memory-mapped link)
Presents FPGA BRAM as a Microchip-23K-style SPI RAM device to the ESP32 — an alternative transport (memory-mapped SPI RAM rather than the OSD register protocol) for ESP32-driven data/ROM loading.
| Repository | emard__uk101onfpga: UK101 + ORAO |
| Files | rtl_emard/spi_ram/spi_ram_slave.vhd |
| Top module | spi_ram_slave |
| Language | VHDL |
| License | BSD (“AUTHOR=EMARD LICENSE=BSD”) |
| FPGA / primitives | any: none (portable) |
| Tests | none found |
On ULX3S: Simpler than spirw_slave_v.v when the ESP32 only needs to fill/read a block of FPGA memory without an OSD protocol layer on top.
Used by 1 other catalogued repo (file copies or module instances found by scan_core_usage.py; heuristic):
- emard__ulx3s-misc (instantiates
examples/spi_ram/hdl/top/ulx3s_spi_ram_oled.vhd)
Other catalogued projects
Catalogued repos tagged esp32 (54) are listed in the full catalogue.