Skip to the content
6 layers40.8 × 17.6 mmPicoROM-32, the printed circuit board in 3D

An RP2040-based ROM emulator

Size
40.8 × 17.6 mm
Copper layers
6
Thickness
1.94 mm
Parts
67
Nets
101
Pads
413
Tracks, vias
1,044, 121
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
18 Jun 2023
Updated
25 Oct 2026

Overview

PicoROM-32 is an open-source printed circuit board by wickerwaka, from the wickerwaka/PicoROM repository on GitHub, published under the MIT licence. It is a 6-layer board of 40.8 × 17.6 mm with 67 parts on 101 nets, routed with 1,044 tracks and 121 vias.

It is built around the RP2040, 74LVC245ABQ and 74AHCT1G126GW, with the P25Q16SH-UXH-IR, NCP114AMX330TC and SN74LVC1G32DRYR(UMW) among its other parts. Its parts include 28 capacitors, 13 resistors, 11 ICs, 5 diodes and 5 connectors. It belongs with the RP2040 boards of this library.

Main components

12

README

README.md

PicoROM

PicoROM is an 8-bit ROM emulator in DIP-32 and DIP-28 form factors. Its primary use case is rapid iteration when experimenting with arcade hardware. PicoROM can emulate ROMs up to 2MBit (256KB) with access times of 70ns. Its compact size allows it to fit into almost any ROM socket regardless of how crowded the board might be.

Header Image

Features

  • DIP-32 and DIP-28 form factors
  • Up to 2MBit (256KB) storage
  • 70ns access time
  • USB control with integrated firmware updates
  • Controllable reset pin

Fully assembled versions are available from my store.

Hardware Variants

There are three hardware versions of PicoROM:

  • PicoROM Original (POG) — Original 32-pin design with a single tri-state reset pin (high, low, or high-impedance). Can be powered by USB or from the host board.
  • PicoROM 28 (P28) — 28-pin design with dual reset pins (one for high, one for low). Uses split power: the microcontroller is powered by USB or the host board, but external buffers are powered from the 5V input. This reduces power consumption when connected to an unpowered device via USB.
  • PicoROM 32 (P32) — 32-pin design with all the improvements from P28.

The abbreviated names POG, P28, and P32 identify which firmware image to use for each device.

Model Comparison

Version 2.0

Version 2.0 introduced a custom USB protocol, replacing the emulated USB serial port used in version 1.x. The 2.0+ firmware is not compatible with the 1.x picorom tool, and vice versa.

Installation

Read INSTALL.md for detailed installation instructions.

Operation

PicoROM is controlled via USB using the picorom command-line tool. The tool can list connected devices, rename them, set parameters, upload ROM data, and update firmware.

Each PicoROM has a name used to identify it in commands. Multiple devices can be connected simultaneously—arcade boards often use multiple ROMs to increase memory size or bus width. List connected devices with picorom list:

console
foo:~ $ picorom list
Available PicoROMs:
  E66138528361BB3  [/dev/cu.usbmodem101]
  E661385490CD014  [/dev/cu.usbmodem102]

By default, PicoROMs use a unique hardware ID from flash memory as their name. You can rename devices based on their function—for example, an arcade board with two CPU ROMs (one for the lower 8 bits, one for the upper) could use cpu_low and cpu_high. These names can then be referenced in makefiles or scripts.

To identify which physical device corresponds to a name, use picorom identify <name> to flash its activity LED.

Rename a device with picorom rename:

console
foo:~ $ picorom rename E66138528361BB3 cpu_low
Renamed 'E66138528361BB3' to 'cpu_low'

Most commands follow the pattern picorom <COMMAND> <NAME> <ARGUMENTS...> where <NAME> identifies the target device. The primary command is upload, which transfers a binary image to PicoROM:

console
foo:~ $ picorom upload cpu_low cpu_low.bin
Uploading ROM [################################################################] Done.

After upload, PicoROM immediately serves the data for any address requests. Uploaded data is stored in RAM and lost when power is removed. To persist data across power cycles, save it to flash memory using the -s flag during upload or the commit command afterward:

console
foo:~ $ picorom upload cpu_low cpu_low.bin -s
Uploading ROM [################################################################] Done.
Storing to Flash - Done.

foo:~ $ picorom commit cpu_low
Storing to Flash - Done.

PicoROM defaults to 2MBit mode. If you upload a smaller image, the remaining address space is undefined. To emulate smaller ROM sizes, specify the size during upload:

console
foo:~ $ picorom upload cpu_low cpu_low_1mbit.bin 1MBit
Uploading ROM [################################################################] Done.

You can also download the current ROM contents from a device:

console
foo:~ $ picorom download cpu_low backup.bin
Downloading ROM [##############################################################] Done.

Reset Control

PicoROM has an external reset pin for controlling the host hardware's reset signal. The pin is a tri-state output: high (+5V), low (ground), or high-impedance (z). Use this in build scripts to reset a system after uploading a new ROM:

make
# picorom makefile target to trigger reset and upload ROM image
picorom: cpu_low.bin cpu_high.bin
    picorom reset cpu_low low
    picorom upload cpu_low cpu_low.bin
    picorom upload cpu_high cpu_high.bin
    picorom reset cpu_low z

Upload example

How you interface with each system's reset hardware will vary, and it may not always be possible to override the system's reset signal. The reset pin can also serve as a general-purpose controllable output.

Standalone Operation

PicoROM draws power from either USB-C or the 5V VCC input at pin 32/28, allowing it to function as a standalone ROM without a USB connection.

At startup, ROM data must be copied from flash to RAM, which takes approximately 8ms. ROM accesses are ignored until this completes. Additional delays may occur while the RP2040 waits for stable supply voltage. Systems with reset circuitry that delays startup for longer than 8ms should work reliably.

Air Assault M107 running standalone with four PicoROMs
Air Assault M107 running standalone with four PicoROMs

The reset pin can mitigate startup timing issues. Set the initial_reset parameter to assert a reset value during the initial flash-to-RAM copy:

console
foo:~ $ picorom set cpu_low initial_reset high
initial_reset=high

Performance

Worst-case access time is 70ns, measured from address assertion to data availability on the data bus. ROM datasheets typically call this "Address to Output Delay." Since PicoROM runs a synchronous instruction loop, access time varies depending on where in the loop the address is asserted.

Access time histogram

The delay from output/chip enable assertion to data bus active (Output Enable to Output Delay) is more consistent, with a worst case of 40ns. The inverse delay (enable deasserted to high-impedance) has not been measured but is assumed to be similar.

Parts

67
QtyValueFootprintReferences
19100nCapacitor_SMD:C_0201_0603MetricC5, C11, C12, C13, C14, C15, C16, C17, C18, C19, C20, C21, C22, C23, C24, C28 +3
91kResistor_SMD:R_0201_0603MetricR1, R2, R5, R8, R9, R10, R11, R14, R29
71uCapacitor_SMD:C_0402_1005MetricC1, C4, C8, C10, C25, C26, C27
374LVC245PicoROM:V-QFN4525-20_L4.5-W2.5-P0.50-BLU4, U5, U9
227Resistor_SMD:R_0201_0603MetricR3, R4
227pCapacitor_SMD:C_0402_1005MetricC2, C3
25.1kResistor_SMD:R_0201_0603MetricR6, R7
274AHCT1G126Package_TO_SOT_SMD:SOT-353_SC-70-5U11, U12
2Conn_01x16Connector_PinHeader_2.54mm:PinHeader_1x16_P2.54mm_VerticalJ3, J4
2LOGOPicoROM:project_logoG***, G***
2NCP114AMX330TCGPackage_DFN_QFN:OnSemi_XDFN4-1EP_1.0x1.0mm_EP0.52x0.52mmU1, U8
2NSR0320MW2T1GDiode_SMD:D_SOD-323D4, D5
174LVC1G32PicoROM:USON-6_L1.5-W1.0-P0.50-BLU7
174LVC8245PicoROM:DHVQFN24_L5.5-W3.5-P0.50-BL-EPU10
1ABM3-12.000MHZ-D2Y-TCrystal:Crystal_SMD_5032-2Pin_5.0x3.2mmY1
1Conn_01x05_PinConnector_PinHeader_1.27mm:PinHeader_1x05_P1.27mm_VerticalJ5
1External ResetConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ2
1GreenLED_SMD:LED_0402_1005MetricD2
1LOGOPicoROM:project_qrcodeG***
1LOGOPicoROM:project_logo_largeG***
1RP2040PicoROM:RP2040-QFN-56U3
1RedLED_SMD:LED_0402_1005MetricD3
1USB_C_Receptacle_USB2.0Connector_USB:USB_C_Receptacle_G-Switch_GT-USB-7051xJ1
1W25Q16JVUXIQPackage_SON:Winbond_USON-8-1EP_3x2mm_P0.5mm_EP0.2x1.6mmU2
1YellowLED_SMD:LED_0402_1005MetricD1

More from wickerwaka/PicoROM

1
  • 6 layers42.2 × 17.8 mmPicoROM, the printed circuit board in 3D

    PicoROM

    wickerwaka/PicoROM

    An RP2040-based ROM emulator

    56 parts336MIT

Similar boards

  • 4 layers19.6 × 42.2 mmPicoROM, the printed circuit board in 3D

    PicoROM

    schenkmi/electronic-retro-computing-projects

    In revision 2, the PCB size has been reduced by more than 50% and TAPuino support has been ditched. It now features a Micro SD slot and a few other improvements.

    49 parts
  • 2 layers70 × 71 mmJewelled lc1, the printed circuit board in 3D

    Jewelled lc1

    matthiasnowak/jewelled

    This is a panel meant for production of the Earrings, allowing for 2 Earrings per panel.

    148 parts3
  • 4 layers74.2 × 42.7 mmRAM128, the printed circuit board in 3D

    RAM128

    garrettsworkshop/RAM128

    128 kB Saturn 128k-compatible RAM expansion card for Apple II

    57 parts22
  • 2 layers16.9 × 12.5 mmUsb b adapter, the printed circuit board in 3D

    Usb b adapter

    indrora/usb-crowbar

    The USB-Crowbar: A fix for USB-B

    4 parts12
  • 4 layers60.5 × 60 mm6-REV2b, the printed circuit board in 3D

    6-REV2b

    DangerousPrototypes/BusPirate5-hardware

    Bus Pirate Hardware and accessories for v5 and higher

    227 parts125MIT
  • 2 layersGb board, the printed circuit board in 3D

    Gb board

    anthonydotmoe/vgmplayer

    (Unfinished) Hardware YM2151 VGM Player using RP2040

    37 parts4
  • 4 layers184.3 × 131 mmPortaPi R1, the printed circuit board in 3D

    PortaPi R1

    JakeBoothy/PortaPi

    A portable Raspberry Pi Zero W2

    199 parts

Questions

How big is the PicoROM-32 PCB?

It measures 40.8 × 17.6 mm and has 6 copper layers, 1.94 mm thick.

What parts does the PicoROM-32 use?

67 parts, built around the RP2040, 74LVC245ABQ, 74AHCT1G126GW and P25Q16SH-UXH-IR. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the PicoROM-32 KiCad files?

From the wickerwaka/PicoROM repository on GitHub, at the commit this page was made from: the board is hardware/PicoROM-32/PicoROM-32.kicad_pcb and its schematic hardware/PicoROM-28/PicoROM-28.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the PicoROM-32 design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).