Voodoo FPGA, A SystemVerilog reimplementation of the 3dfx Voodoo Graphics 3D accelerator

erek

8-D
2FA
Joined
Dec 19, 2005
Messages
18,546
“A SystemVerilog reimplementation of the 3dfx Voodoo Graphics 3D accelerator for FPGA.

This project implements the complete Voodoo 1 3D graphics pipeline in synthesizable RTL. The implementation is based on analysis of the original hardware specifications and the PCem emulator's Voodoo emulation code.

Voodoo on ULX3S FPGA​

The design running on real hardware: a Radiona ULX3S board with a Lattice ECP5 FPGA, driving an HDMI monitor.

The Voodoo core was re-architected to run faster and to follow the original Voodoo 1 hardware more closely. The rendering pipeline and the SDRAM subsystem, which previously ran on separate clocks (a 50 MHz pipeline and a 100 MHz memory subsystem), now share a single clock domain that has been progressively raised — currently 100 MHz — through deeper pipelining, registered-DSP retiming, and floorplanning. The intermediate rendering caches (texture, depth, and framebuffer) were removed entirely — every pipeline stage now reads and writes SDRAM directly through a fully-pipelined, per-client arbiter. Previously a cache miss stalled the whole pipeline until the data arrived; now each stage issues its memory accesses without blocking and hides the SDRAM latency, so a slow memory access no longer stalls the work behind it.

To measure the genuine speed of the FPGA Voodoo core itself, a pre-recorded Tomb Raider Glide command stream was replayed directly from an SD card, bypassing the host link entirely. In this mode the game runs at about 8-15 FPS in gameplay on the ULX3S — the actual throughput of the Voodoo pipeline on this board — and 30 FPS on the much simpler title screen.

With a host PC driving the FPGA over the 2 Mbaud UART debug link, the observed frame rate drops below 1 FPS: the UART is the dominant bottleneck in that setup.

The real bottleneck is the board's single 16-bit SDR SDRAM chip, shared between framebuffer reads and writes, depth, texture, and the display controller. Long-term, the goal is to retarget to a PCIe + DDR FPGA card; PCIe and DDR lift both ceilings and put playable frame rates within reach.

​
​
ulx3s.jpg​
2e636f6d2f76692f6b5969544f344458454b412f302e6a7067.jpg​
2e636f6d2f76692f4b5462712d4733484f4f632f302e6a7067.jpg​
2e636f6d2f76692f5f547466617a68356543382f302e6a7067.jpg​
2e636f6d2f76692f5579626a4a615a6b6c39632f302e6a7067.jpg​
​

Video​

2e636f6d2f76692f43777a74694f5a6b4f56732f302e6a7067.jpg2e636f6d2f76692f685873712d6d786f3133452f302e6a7067.jpg2e636f6d2f76692f5662365447615f3963756f2f302e6a7067.jpg2e636f6d2f76692f686b4b6c454b78724d44512f302e6a7067.jpg2e636f6d2f76692f6d744f70534f5a336838492f302e6a7067.jpg2e636f6d2f76692f644f654e617635556a43772f302e6a7067.jpg

Screenshots​

Games​

​
​
unreal_tournament_1.png​
unreal_tournament_4.png​
unreal_tournament_2.png​
unreal_tournament_3.png​
need_for_speed_II.png​
quake2.png​
3dmark99_1.png​
3dmark99_2.png​
unreal.png​
tomb_raider.png​

3dfx Demo Programs​

​
​
fight.png​
racing.png​
anubis.png​
ludwig.png​
martini.png​
dragon.png​
vw.png​
teapot.png​
texcube.png​
cube.png​

Glide SDK Test Programs​

​
​
splash_screen_2.png​
splash_screen_1.png​
texture_lighting_modes_1.png​
texture_lighting_modes_2.png​
texture_lighting_modes_3.png​
texture_lighting_modes_4.png​
texture_lighting_modes_5.png​
texture_alpha.png​
texture_compositing_1.png​
texture_compositing_2.png​
texture_compositing_3.png​
fog_with_multi_pass_texturing.png​
depth_bias.png​
iterated_alpha.png​
gouraud_triangle.png​
draw_lines.png​

Technical Overview​

Voodoo variantVoodoo 1 (SST-1) only
PipelineHighly pipelined: triangle setup → rasterizer → TMU → pixel shader → depth buffer → framebuffer, valid/ready handshaking with inter-stage FIFOs
FPGA targetULX3S (Lattice ECP5 LFE5U-85F, 32MB SDRAM)
Display640×480@60Hz HDMI (DVI-D), RGB565 framebuffer, 8-line circular SDRAM prefetch FIFO
LanguageSystemVerilog
Code size~30,000 lines of RTL
SynthesisOpen-source toolchain (Yosys, yosys-slang, nextpnr-ecp5)
VerificationVerilator testbenches, Glide trace replay, PCem bridge for real-time verification
Clocks25 MHz VGA/HDMI pixel output (125 MHz TMDS shift); single 100 MHz render + SDRAM clock domain. Timing closure achieved through deep pipelining, registered-DSP retiming, and floorplanning.
Memory subsystemCustom SDRAM controller on the shared render clock (CL=3), 7-client fully-pipelined arbiter with per-client request FIFOs and address-derived bank interleaving to overlap command overhead with data. Each pipeline stage accesses SDRAM directly — no rendering caches — matching the original Voodoo 1 architecture.
FPGA resources52% LUTs, 43% FFs, 36% BRAM, 58% DSP (ECP5-85F)

Simulation​

The design is verified using Verilator. A PCem bridge testbench connects the RTL to PCem over shared memory, replacing its software Voodoo emulation with the RTL design. This allows real Glide 2.x games running inside PCem to drive the hardware simulation and display rendered output via SDL in real time.

Status​

Started in August 2025. First 3D render (teapot) in October 2025. Valley of Ra demo and Unreal Tournament running in February 2026. ECP5-85F synthesis and place-and-route with timing closure at 50/100 MHz in March 2026. First bring-up on the ULX3S board with HDMI output in April 2026. Pipeline and memory subsystem re-architected into a single-clock, cacheless design in June 2026, with the clock raised to 100 MHz in August 2026.

All code written by Claude Code.

This is not an open source project. The source code is not publicly available.

Copyright​

Created by Victor Fisyuk.

3dfx, Voodoo, and Glide are trademarks of 3dfx Interactive, Inc., now owned by Nvidia Corporation. This project is not affiliated with or endorsed by Nvidia. All other trademarks are the property of their respective owners. This is an independent reimplementation for educational and hobbyist purposes.“

https://github.com/victor-fisyuk/voodoo-fpga-public
 
Very cool stuff, takes me back to when I was 16, hope to be able to use a mature version of this. Games finally shined back then because of 3dfx.
 
Last edited:
  • Like
Reactions: erek
like this
Very cool stuff,takes me back to when I was 16, hope to be able to use a mature version of this. Games finally shined back then because of 3dfz

View: https://youtu.be/F_IHDfCksHI?is=YVa5g5wC86XREDeS

“In the late 1990s, 3dfx and its Glide API helped transform PC gaming from blocky software-rendered graphics into the world of hardware-accelerated 3D. In this video, I revisit the 3dfx Voodoo Banshee and take a look back at the company that helped make 3D acceleration such a massive part of PC gaming.

But rather than simply looking at benchmarks, I wanted to recreate the experience of 1998 and show exactly why 3dfx was such a big deal.

I build a period-correct Slot 1 system around an Intel 440LX motherboard and Pentium II 333MHz, install Windows 95, and put the Banshee through a selection of classic games.”
 
That is so cool!

My first 3d card was the "Matrox Mystique". Never did get it working well.

My second was the Voodoo banshee because I didn't want to buy a card for 2d and one for 3d, lol. Loved it!
 
I think it would be cool to have a PCI version, for systems that lack AGP and PCIe. Otherwise, PCIe or USB would be really cool too, if they managed to get that working well.
 
Back
Top