I did something kind of like this for a college project. We were taking a course on FPGA soft-processors, and for our final project, we had to build A Thing.
My team chose to reimplement Space Invaders. The soft-core was supported by a C compiler, so we wrote the game in C, with carefully-chosen functions for graphics rendering containing #ifdefs that gated either direct memory accesses (for the FPGA VGA hardware) or SDL calls.
Our "init()" function would initialize the VGA hardware on the FPGA, and create an SDL window when compiled on a computer with an OS.
Using this, the hardware and software people were able to work together in parallel, and we won best project for our class, with a grand prize of "we'll show your cool project to the next classes".
As I recall, we wrote most of the game using SDL backend, and only tested it on "real" hardware a few days before the final project. We found a single bug (during the integration) that took us on the order of half an hour to debug, and that was that.
My team chose to reimplement Space Invaders. The soft-core was supported by a C compiler, so we wrote the game in C, with carefully-chosen functions for graphics rendering containing #ifdefs that gated either direct memory accesses (for the FPGA VGA hardware) or SDL calls.
Our "init()" function would initialize the VGA hardware on the FPGA, and create an SDL window when compiled on a computer with an OS.
Using this, the hardware and software people were able to work together in parallel, and we won best project for our class, with a grand prize of "we'll show your cool project to the next classes".
As I recall, we wrote most of the game using SDL backend, and only tested it on "real" hardware a few days before the final project. We found a single bug (during the integration) that took us on the order of half an hour to debug, and that was that.