A two-player Street Fighter style game written in Verilog and synthesized onto a Nexys A7 FPGA, played with custom breadboard controllers and rendered over VGA.
highlights
Wrote the game engine: AABB collision, edge-triggered attack resolution so a held button cannot double-hit, movement and arena bounds, and the win/game-over state machine.
Stored each player in one one-hot 7-bit register (facing direction plus a 6-bit action) that both the combat and sprite-selection logic read directly, so there is no second decode stage.
Built a parameterized sub-second timer with a halfway flag, and reused it as-is for the jump arc and the punch cooldown.
Derived several slow clock domains (movement ~125 Hz, shield drain 2 Hz, animation) from one 100 MHz input without a PLL or MMCM.
Merged four nearly identical per-sprite ROM modules into one parameterized sprite_map module, and added the horizontal pixel mirroring for flipped sprites.
Wrote png_to_mem / mem_to_png Python tools to convert and visually debug sprite ROMs, and debugged on real hardware through seven-plus committed bitfiles.
collaboration
Built with Luke Albert. Luke owned the VGA display and controller I/O. I owned the game and simulation layer: player state, collision, combat resolution, health/shield bookkeeping, and win conditions. We wrote the health/shield bars and the sprite pipeline together.