This is an FPGA implementation of the arcade game "1942" based on the Capcom schematic circuit diagram.
This has been implemeted on a custom FPGA board called the Pipistrello based on a Spartan LX45 and designed by Saanlima.com (discontinued) but it should work on any FPGA able to fit the design and all the game ROMs. Game controller options are PS2 Keyboard or a Nintendo Gamecube Controller. Video output can be via analog VGA and/or digital DVID directly to your monitor.
This current release is fully functional, without any known problems but it has not had extensive testing.
During implementation, errors and omissions were discovered in the schematic.
For example in page 6/8 of the video schematic the ROMs L1, L2, N1, N2
don't have an A13 address line listed but the reality is that A13 is in
fact connected to signal VOVER on previous page.
I have also had to deviate from the schematic in one place to even have the
sprites display at all. This is also on page 6/8 of the video in the creation
of the VINZONE signal by the comparators L5, M5 where I had to eliminate
gates N4 and M4 and simply feed the signal A>B inverted to gate N5.
I'm not totally sure why this is so and further investigation is needed. The
sprites however seem to function as they should, proven during both simulation,
debugging and actual game play.
The schematic consists of a total of 16 pages, the fist 8 pages cover the main
processor, audio board and character generation board 84100-01A while the
last 8 pages cover the scroll generation, object generation and video mixing
board 84100-02A. On the real arcade these are separate boards connected to
each other via ribbon cables.
The project has been split into functional modules which roughly correspond to the relevant schematic pages.
FPGA_1942.vhdis the arcade game top level module which connects all the other modules together.CPUA_IO.vhdimplements the mainCPU, ROM, RAMand userI/Oon pages 1 and 2 of84100-01ACPUB_PSG.vhdimplements the audio CPU, ROM, RAM and PSG (programmable sound generators) page 3 and 4 of84100-01ASYNC.vhdimplements the synchronization signal generation on page 5 of84100-01ACHR_GEN.vhdimplements the character generation pages 6,7,8 of84100-01A(this is video related but on main board)SCR_GEN.vhdimplements scroll (background generation) pages 1,2,3 of84100-02AVIDEO_MIX.vhdimplements the video mixer on page 4 of84100-02AOBJ_GEN.vhdimplements the object (sprite) generator on pages 5,6 of84100-02AOBJ_LINE_BUF.vhdimplements the sprite line buffer on page 7,8 of84100-02A
Each video section can be easily debugged in the simulator by commenting out unneccessary modules.
After making the relevant changes as below run the top level testbench in the
simulator for 20ms. At the end of the simulation in the screens folder, the
first frame of the video will be saved as a .ppm file (portable pixmap) which
can be viewed with a suitable graphics viewer.
- in
FPGA_1942.vhdcomment out the modulesCPUA_IO, CPUB_PSG, CHAR_GEN, OBJ_GEN, OBJ_LINE_BUF - in
SCR_GEN.vhdcomment out theRAM_A9block.
The following picture will appear in the screens folder:
- in
FPGA_1942.vhdcomment out the modulesCPUA_IO, CPUB_PSG, SCR_GEN, OBJ_GEN, OBJ_LINE_BUF - in
CHR_GEN.vhdcomment out theRAM_D2block.
The following picture will appear in the screens folder:
- in
FPGA_1942.vhdcomment out the modulesCPUA_IO, CPUB_PSG, CHAR_GEN, SCR_GEN - in
OBJ_GEN.vhdcomment out theRAM_H9_H10block.
The following picture will appear in the screens folder:
If all three modules are left in, then the composite picture looks like this:
The purpose of commenting out the RAM blocks is because during simulation an equivalent debug ROM block is activated. ROM_A9, ROM_D2 and ROM_H9_H10 have been prepared with suitable contents to simulate what the respective RAMs would have been loaded with by the CPU had we not commented it out. This way we only have to simulate the video circuitry for a short 20ms while it writes the first video frame out, otherwise if we left all the game modules in, we would have to simulate several seconds while the CPU wastes precious simulation time erasing whole RAM sections and performing initialisation and other various tasks before it even writes anything useful to the screen.



