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):

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):

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):

Other catalogued projects

Catalogued repos tagged esp32 (54) are listed in the full catalogue.


Back to top

Generated from the JSON in data/ by the scripts in .claude/skills. Facts cite the upstream file at the reviewed commit; verify before reuse.

This site uses Just the Docs, a documentation theme for Jekyll.