Skip to the content.

My DIY FPGA board can run Quake II (part 3)

22-mar-2026

Second attempt

Key changes:

Top view, 3d model in KiCad

Bottom view, 3d model in KiCad

By this point, I had gained enough experience not to run into any unfixable issues – though many would say my soldering is still far from perfect.

Top view

Bottom view

What followed were months of meditating on green lines in gtkwave, repeatedly re-reading the datasheet of the DDR1 chip, and diving into the USB protocol. I spent a significant amount of time trying to figure out why the OHCI implementation from the SpinalHDL repository wasn’t working (it turned out I was incorrectly handling unaligned access in my memory controller). In the later stages the list included adding debug printk statements throughout the Linux kernel.

During this process, I migrated my modules from the AXI4 bus to TileLink and migrated from VexRiscv to the higher-performance VexiiRiscv.

I spent three months chasing a deadlock that occurred whenever I tried to run gcc on my device. To find it, I had to shrink the entire system down to a 40MB initrd image, create a stripped-down testbench without peripherals, and reproduce the bug in Verilator. Each simulation of the minimal Linux boot took 11 hours. It turned out to be an actual bug in VexiiRiscv; after I sent the trace dump to Dolu1990, he committed a one-line fix within thirty minutes.

I won’t go into full detail now, or I’ll never finish this article. But in the end, almost everything worked. My single-core CPU, running at 60 MHz, took about ten seconds to compile a simple “Hello World” – but it was still incredibly cool!

Almost everything worked, with a few notable exceptions:

Video artifacts at 1280x720

The biggest issue was that after six months, the board simply died. Memtest started failing consistently. I suspect the RAM fried because I didn’t pay enough attention to the decoupling capacitors on the power rails. I tried to save it by swapping the RAM chip with the last one I had in stock; the memory started working again, but the heat from the air gun seemingly damaged the FPGA, and the video output stopped working.

Next part: Next generation (4/6)