← All IP cores Open source · GPL-3.0

IronKernel 64

A SID music machine with a C64-style shell, on an AMD Artix-7 FPGA.

Two MicroBlaze V cores, the SID chip in gateware, 720p HDMI and a disk drive that serves tunes over the network. Free to use, study and build on.

Brief: PDF, 3 pages. Specification: PDF, 35 pages. Revision 11-10-2026.

See it play

Recorded on the board with a phone. Sound on.

Overview

IronKernel 64 plays SID music the way a Commodore 64 does, on a Digilent Nexys Video board. Type LOAD"$",9, LIST, LOAD"CANON*",9 and RUN on a USB keyboard or a UART terminal, and the tune plays through the board's audio codec while the HDMI screen shows the now-playing view.

Core 0 runs the screen editor, a 6502 interpreter and a PSID player, and sends every SID register write with its clock cycle to the open-source reDIP-SID core in the fabric. Core 1 emulates a 1541-style disk drive: device 8 reads an SMB network share through IronKernel's network core, and device 9 is a built-in tune bank that works without a network. The firmware is C. The gateware and firmware are open source, apart from the network core.

We built it to show the kind of FPGA design work we do for clients, from RTL and clock-domain crossings to board bring-up, firmware and verification, in something you can see and hear.

What this shows

The FPGA and embedded skills behind it, all in one small design you can build yourself.

Cycle-exact SIDa 6581 in gateware at its own 985,248 Hz clock, fed by a 512-entry timestamped write FIFO
2 × MicroBlaze VRISC-V cores sharing a 128 KiB BRAM with a mailbox doorbell, no RTOS
Board bring-upDDR3, 720p60 HDMI, ADAU1761 audio, Gigabit RGMII, QSPI boot and OLED
WNS 0.083 nstiming closed on the release build; 33 of 33 RTL checks pass, each with a forced-failure control

Highlights

  • SID in gateware. reDIP-SID, one 6581, fed at its own 985,248 Hz clock with cycle-exact register writes.
  • Two MicroBlaze V cores. A "C64" core with the shell and the 6502, a "1541" core with CBM DOS and the network.
  • C64-style commands. LOAD, LIST, RUN, NEW, the @ wedge, wildcards and cursor-editing of directory lines.
  • Two drives. Device 8 is an SMB share over Gigabit Ethernet; device 9 is a built-in bank that works without a network.
  • Now-playing screen with song select, voice level bars and two piano keyboards, plus a 128 × 32 OLED marquee.
  • PSID v1 to v4, vertical-blank and CIA-timer tunes, PAL and NTSC.
  • UART mirrors the screen; Ctrl-B opens an engineering command line.
  • Stand-alone boot from one QSPI flash image: READY. about 4 s after power-up.

At a glance

BoardDigilent Nexys Video, AMD Artix-7 XC7A200T, 512 MiB DDR3
Processors2 × MicroBlaze V RV32IMC, 100 MHz
SIDreDIP-SID 6581 at 50 MHz, 48 kHz out
Video720p60 HDMI, 384 × 240 drawn 3×
AudioADAU1761, 16 bit, 48 kHz
InputUSB keyboard (J15), USB-UART 115200
FPGA useLUT 29.3 %, BRAM 78.5 %, DSP 1.6 %
Core 0 image89,686 B text, 96.0 % of 256 KiB LMB
LicenceGPL-3.0-or-later; gateware also CERN-OHL-S-2.0

How it works

A key typed on the keyboard or the UART reaches core 0. LOAD becomes a request in a shared 128 KiB BRAM, and a mailbox doorbell wakes core 1, which reads the file from the share or from the bank and answers. RUN parses the PSID header and runs the tune's init and play routines on the 6502 interpreter. Each SID write is queued with its cycle and replayed by the fabric SID, whose 48 kHz output reaches the codec without CPU time.

AreaFeatures
Shell40 × 25 screen editor, RETURN reads the logical line, C64 error messages, boot banner with the probed RAM size
CommandsLOAD"name",8 or ,9, LOAD"$", LIST, RUN, NEW, @, @$pattern, CBM wildcards
PlayerPSID v1 to v4, VBI and CIA speed, PAL and NTSC, 6502 with documented and stable illegal opcodes
SIDreDIP-SID 6581 in fabric, 512-entry timestamped write FIFO, OSC3 and ENV3 read-back
Video720p60 CEA-861, 3× pixel scaling, Colodore palette, MEGA65 Open ROMs font
DriveCBM DOS channels, byte-exact directory program, status codes, device 8 SMB 2/3 client, device 9 bank
NetworkGigabit RGMII, DHCP in IronKernel's closed network core, lwIP and libsmb2 without an RTOS
ToolsHost tests, RTL regression with negative controls, bank packer, siddump-style SID dump over the UART
Block diagram: on the Nexys Video, core 0 (shell, 6502, PSID player) and core 1 (1541 drive, network) share a BRAM mailbox. Core 0 drives the reDIP-SID core, HDMI video, OLED and keyboard; the SID feeds the ADAU1761 codec. Core 1 reaches an SMB share over Gigabit Ethernet and a tune bank in DDR3.
Figure 1. IronKernel 64 and what it connects to, from the product brief.

Verification

Numbers from the release build of 11-10-2026.

EvidenceResult
RTL regression (reset-policy scan, 16 benches each with a forced-failure control)33 passed, 0 failed
Timing of the release buildWNS 0.083 ns, WHS 0.012 ns, 0 failing endpoints
Host tests: drive bank, CBM DOS, CLI, piano, OLED, PSID, SID, screen12 of 12 pass
Public bank: 9 tunes through the real PSID loader, 6502 and memory mapAll pass; worst play call 3,266 of 20,000 cycles
Board: boot, DDR3, codec, Gigabit link, SMB 3.1.1, LOAD and RUN from the shareDemonstrated 11-09-2026
Board: boot from QSPI flash, release images, device 9 bank, shareDemonstrated 11-10-2026
Board: listening check against sidplayfp, 30-minute soakNot yet done

Try it

Release v1.0 on GitHub has a ready-made flash image (ik64_qspi.mcs) with SHA-256 sums. Write it to the Nexys Video's QSPI flash, set jumper JP4 to "SPI Flash" and power up: READY. appears on HDMI and on the UART. Then type LOAD"$",9, LIST, LOAD"CANON*",9, RUN.

The built-in bank holds nine arrangements of public-domain pieces, from Pachelbel's Canon to Bach's Toccata in D minor. To build it yourself you need Vivado and Vitis 2026.1; the README has every command.

Get the release image →

Hardware needed

A Digilent Nexys Video, a USB keyboard on J15, an HDMI monitor, line input or headphones on the audio jacks, and a USB cable for the UART. Device 8 also needs an SMB share on the Ethernet LAN; device 9 needs no network.

Licences and credits

Firmware, tools and scripts are GPL-3.0-or-later. Gateware is GPL-3.0-or-later or CERN-OHL-S-2.0; the bitstream contains reDIP-SID by Dag Lem, so it is distributed under CERN-OHL-S-2.0. The network core is a closed netlist and library, with a licence exception for use with IronKernel 64. Every third-party item is listed in the notices file.

Commodore 64 is a trademark of its owner. IronKernel 64 is an unaffiliated hobby project and contains no Commodore ROMs.

Need FPGA work like this?

Tell us about your board and what you want to build.