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.
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.
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
| Board | Digilent Nexys Video, AMD Artix-7 XC7A200T, 512 MiB DDR3 |
|---|---|
| Processors | 2 × MicroBlaze V RV32IMC, 100 MHz |
| SID | reDIP-SID 6581 at 50 MHz, 48 kHz out |
| Video | 720p60 HDMI, 384 × 240 drawn 3× |
| Audio | ADAU1761, 16 bit, 48 kHz |
| Input | USB keyboard (J15), USB-UART 115200 |
| FPGA use | LUT 29.3 %, BRAM 78.5 %, DSP 1.6 % |
| Core 0 image | 89,686 B text, 96.0 % of 256 KiB LMB |
| Licence | GPL-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.
| Area | Features |
|---|---|
| Shell | 40 × 25 screen editor, RETURN reads the logical line, C64 error messages, boot banner with the probed RAM size |
| Commands | LOAD"name",8 or ,9, LOAD"$", LIST, RUN, NEW, @, @$pattern, CBM wildcards |
| Player | PSID v1 to v4, VBI and CIA speed, PAL and NTSC, 6502 with documented and stable illegal opcodes |
| SID | reDIP-SID 6581 in fabric, 512-entry timestamped write FIFO, OSC3 and ENV3 read-back |
| Video | 720p60 CEA-861, 3× pixel scaling, Colodore palette, MEGA65 Open ROMs font |
| Drive | CBM DOS channels, byte-exact directory program, status codes, device 8 SMB 2/3 client, device 9 bank |
| Network | Gigabit RGMII, DHCP in IronKernel's closed network core, lwIP and libsmb2 without an RTOS |
| Tools | Host tests, RTL regression with negative controls, bank packer, siddump-style SID dump over the UART |
Verification
Numbers from the release build of 11-10-2026.
| Evidence | Result |
|---|---|
| RTL regression (reset-policy scan, 16 benches each with a forced-failure control) | 33 passed, 0 failed |
| Timing of the release build | WNS 0.083 ns, WHS 0.012 ns, 0 failing endpoints |
| Host tests: drive bank, CBM DOS, CLI, piano, OLED, PSID, SID, screen | 12 of 12 pass |
| Public bank: 9 tunes through the real PSID loader, 6502 and memory map | All 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 share | Demonstrated 11-09-2026 |
| Board: boot from QSPI flash, release images, device 9 bank, share | Demonstrated 11-10-2026 |
| Board: listening check against sidplayfp, 30-minute soak | Not 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.
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.
Need FPGA work like this?
Tell us about your board and what you want to build.