I implemented a simple GPU on a TinyFPGA BX, which accepts a list of lines to draw over an SPI bus. The lines are transmitted as screen coordinates with begin and end points. It then renders those lines at 640x480@60Hz and displays them via a VGA connector.
Since the TinyFPGA BX lacks enough RAM for a full framebuffer, each scanline is rasterized just prior to display and then discarded to make space for the following scanlines. At no time is a full rendered image in memory.
Here it is rendering Suzanne the monkey from Blender:
(That video was recorded with my cell phone. It looks a little better in person.)
I’m driving the GPU with a Raspberry Pi. Here is what my setup looks like:
This is my first FPGA and first Verilog project, so I probably did some silly things there, but I was proud of the result, so I thought I’d share it.
If anyone wants to take a look, I put both the Verilog and Python code on github.