Williams MPU based on FPGA
Hardware version v1.3
Software Version x.30
user manual
v1.31 23.10.2026
German version: WillFA7_HWv1_x_Bedienungsanleitung.html. French version: WillFA7_HWv1_x_manuel_utilisateur.html. The chapter numbering is the same in all three.
By using WillFA7 it is possible to damage your pinball machine. As this is a private project with NO commercial interest the author accepts no liability for any damage that may arise by using WillFA7!
WillFA7 uses a (low cost) FPGA which emulates the hardware of a Williams MPU type SYS3 up to SYS7; the driverboard is integrated on the PCB.
Note: The games 'Defender' and 'Star Light' are not supported on the 'standard' Cyclone II board. To run them you need my Cyclone IV board. With the Cyclone IV board all SYS3..SYS7 games are supported.
Note: If you also want to replace the sound board, have a look at WillFA7S. It is the same MPU with a Williams sound board built into the same FPGA, and it has its own manual.
New with software x.30: the board also runs without SD card, with the game roms in the flash memory of the FPGA board (chapters 5.3 and 9).
What do you need?
Possibility to read/write micro SD cards
A PC with an USB port in order to be able to program the FPGA
Download latest versions of the SD card Image and the FPGA program from lisy.dev
Write the image to a SD card
Program the FPGA
Configure switch 'game select' according to your pinball ( Appendix A )
Replace your original Williams MPU and Driverboard with WillFA7
On first boot with your game set option DIP1 to ON ( init nvram)
Switch the game ON
Game will show Williams prom number, wait until 'Diag LED' goes off
Switch the game OFF
Switch the Game ON
Enjoy
WillFA7 boards have the same connectors and same mounting holes as the original Williams MPUs, so replacing of the board can be done in seconds. The board needs to be placed at the former location of the Williams driverboard.
Here you can select what game WillFA7 should run. This depends on the roms placed on the SD card. See Appendix A for a full list and Chapter 'SD card' for an explanation of the structure of the SD card content.
Default setting is all 'OFF'
With Dip1 to 'ON' WillFA7 during boot will initialize the nvram ram for the selected game to zero. This is useful if you want to reset ALL ram content and for the very first boot with your game.
With DIP2 & DIP3 the pulse time for the special solenoids can be adjusted. By default (both OFF) the pulse time is 60ms which should fit the original gameplay. Possible settings are:
OFF – OFF 60ms
OFF – ON 50ms
ON – OFF 40ms
ON – ON 35ms
The trigger inputs of the special solenoids are debounced inside the FPGA. With DIP4 to 'OFF' the filter is 57µs, with DIP4 to 'ON' it is 250µs. Default is 'OFF'.
With DIP5 to 'ON' the returns of the switch matrix are debounced inside the FPGA. With DIP5 to 'OFF' they are passed through unfiltered, which is the behaviour of software x.17 and earlier. Default is 'OFF'.
Needed for game 'CONTACT' as spec. sol 6 needs to be permanently activated (moving target relay) pin 9 on 2P12
Immediately after switching on the pinball the 'ON' Led will go on and you will see the following output on the display of your pinball machine
Player 1: version of the FPGA program running
Player 2: value of selected game on S1 (game select)
Player 3: build date of the FPGA program
Player 4: boot phase
Credit Display: value of the option switches S2 (game options)
Versions .22 to .2x showed two checksums of the card on player 3 and 4. Since x.30 the card carries no checksum any more, and the two displays are back to the build date and the boot phase.
Seven digit displays. Games marked
SYS6A or SYS7 in appendix A came with seven
digit player displays instead of six. WillFA7 knows this from the game
number and moves the boot message accordingly: the text stands right
aligned, the leftmost digit of each player display stays dark, and the
options keep their place on the credit display. Nothing has to be set
for this.
WillFA7 tries to read the SD card content. If this fails the red LED 'SD card error' will go ON and '56' will be shown on display 4.
The red LED also blinks a code that tells you what went wrong. Count the blinks; after the last one there is a pause of about 2 seconds, then the group repeats.
| Blinks | Meaning |
|---|---|
| 1 | the SPI transfer stalled - check the card contacts and the wiring |
| 2 | the card does not answer the reset command |
| 3 | card type not supported, most likely a very old SD v1 card |
| 4 | the card never finished its initialisation |
| 5 | no data arrived from the card |
| 6 | the card reported a read error |
| 8 | no SD card, and the FPGA flash holds no roms for this game - see 5.3 |
Code 7 (checksum mismatch) existed with versions .22 to .2x only. Since x.30 there is no checksum on the card any more.
New with x.30: if no SD card answers (codes 1 to 4 above), WillFA7 does not stop there but reads the game roms from the flash memory the FPGA itself boots from. This takes about 1.3 seconds longer, because the board first gives the card its chance.
The code indicated by the Dip switch 'game select' is read from the SD card (or from the flash, see 5.3) and executed. If the code runs ( regular display strobes are present) the 'active' LED will go ON.
In general game settings can be done in the same way as with the original MPU. WillFA7 uses a serial EEPROM to store the game settings individually per game. There are small differences due to the different board layout which are described below.
WillFA7 has only one diagnostic LED, but does provide Data, Enter, Diagnostic and Function switches with the same functionality as with the original board. Refer to the picture below for the locations on the WillFA7 board. For settings have a look at the manual of your Williams pinball game.
Setting on SYS3 with WillFA7:
Do a 'fresh' boot ( Turning OFF the machine and then turning it back ON )
Press the 'Diag' button on WillFA7, the LED nearby will blink twice
Determine which function is to be changed by looking at table 1 in your game Manual.
Set the Bottom switch to the function you want to change
( e.g. function 19 'Maximum Tilts' by setting Dip 4,7 & 8 to ON )
Set the Top switch to the value you want to store
( e.g. to 1 by setting DIP 8 to ON ( default is 3 ))
To store the value press 'Enter', the LED nearby will blink to indicate the change has been made.
You can check the values by pressing 'Advance' in the coin door
The status display will show '1804' to indicate that you are in 'test 4' and can read
the value for 'Readout No.' 18 ( High Score to date) in display for player 1
By pressing Advance again you step through the different Readouts.
After Readout 23 it starts again with Readout 1 (Replay 1). Have a look at your game Manual for a complete list!
Settings for SYS4 games are made in the same way as with the original MPU, using the Data, Enter, Diagnostic and Function switches on the board. Refer to the picture in chapter 'system3' for their location.
From SYS6 on, the settings are made through the coin door, with the Advance button and the Auto/Manual switch, exactly as described in the manual of your pinball game. WillFA7 passes both signals to the emulated MPU in the same way as the original board, so the procedure is unchanged.
SYS7 games are set up through the coin door in the same way as SYS6, see above, following the manual of your pinball game.
Everything you need to get the software onto the board is described on my website, and it is kept up to date there:
You will find there:
the latest FPGA program and the latest SD card image for download
how to write the image to a SD card
which programmer software you need, how to install the driver for the USB Blaster and how to program the FPGA
This used to be two chapters of this manual. It was moved to the website because the download links, the tool versions and the Intel download pages change far more often than this manual does.
Make sure you take the FPGA program for your FPGA board - see chapter 10.
Due to limitations of the SD card read routine in the FPGA (it does read fix sector numbers instead of looking for filenames) it is necessary to use my SD-card image ( 128 Mbyte). You can write the image to a SD-card of your choice.
With game select all '0' WillFA7 will try to read the first rom image at sector number 660. With my 128MB WillFA7 image this is the location of the first file you write to an empty SD card.
My WillFA7 SD card image has almost all available roms 'on board'. See appendix A for a gamelist
Important when updating: since version x.30 every board uses the x.20 card again (12 KByte per game) - Cyclone II included. A card that ran with an x.20 Cyclone IV program runs unchanged. A card made for .22 does not: write the current image.
The current image has a second area behind the games with the sound board roms of WillFA7S. Boards without a sound board simply never read it.
The SD card image holds one slot per game number, so a rom set can be exchanged without changing the FPGA program.
Every slot is 24 sectors of 512 bytes, that is 12 KByte, and the first slot starts at sector 660. The slot of a game therefore starts at sector 660 + game number x 24, with the game number being the value set on switch S1 (see Appendix A).
| Offset in the slot | Size | Content |
|---|---|---|
| 0x0000 - 0x2FFF | 12 KByte | game roms, 6 x 2K, seen by the MPU from $5000 on |
The sound board roms (WillFA7S only) are a separate area: 40 sectors = 20 KByte per game from sector 1428 + game number x 40.
Write your rom set to that position with a sector editor. It is read as one block and has to be complete. Boards with Cyclone IV or Cyclone 10 use all 12 KByte of game rom; boards with Cyclone II have one rom block less and ignore the first 2 KByte, so the games that need the full 12 KByte (Defender, Star Light) do not run there. There is no checksum to fix up.
New with software x.30. The FPGA boots from a flash chip on the FPGA board, and the space behind the FPGA program can hold the game roms of all 32 games. A board with roms in the flash runs without SD card (chapter 5.3).
| Board | Flash | Layout |
|---|---|---|
| Cyclone IV, Cyclone 10, dev_open (2.30 .. 5.30) | EPCS16, 2 MByte | from 080000h, 32 KByte per game: 12 KByte game roms, then the 20 KByte sound board roms of WillFA7S. A board without sound board reads only the first 12 KByte |
| Cyclone II (1.30) | EPCS4, 512 KByte | from 030000h, 10 KByte per game (one rom block less, as on the SD card), 32 games up to the end of the flash. Defender and Star Light do not run here |
EPCS16 flash address 080000h + game number x 8000h
EPCS4 flash address 030000h + game number x 2800h (Cyclone II)
The roms are copyrighted, so they cannot be part of the download. You put them there yourself, from your own SD card:
Write your SD card with the image as usual (chapter 8) and keep the image file, or put the card into the card reader of your PC.
Build the rom file. In the WillFA7 source tree (github.com/bontango/WillFA7) run
scripts\make_flash_hex.ps1 -Image <image file> -Out variants\<variant>\output_files\willfa7_roms.hex
For the Cyclone II board add -CycloneII; it writes the
compact layout. Instead of -Image, -SlotFiles
takes the 32 game files of the card (named after the games:
hottip, lucky7, ...), in game order. The
script lists every game it found with its reset vector; a game shown
with vector FFFF is empty.
In the folder variants\<variant> run
quartus_cpf -c willfa7_roms.cof. This puts the FPGA program
and the roms into one file,
output_files\willfa7_roms.jic.
Program willfa7_roms.jic with the Quartus Programmer
instead of the normal file, with 'Verify' ticked. On the Cyclone
II board this is a .jic too, programmed over JTAG,
not the usual .pof.
The variant names are those of chapter 10. From now on the board runs without SD card. With a card in the slot the card always wins, so you can still try other roms from a card without touching the flash.
Keep that file to yourself. It contains the game roms and must not be passed on.
Test status: booting from the flash without SD card has been confirmed on the Cyclone II board (1.30). On the other boards the flash fallback has not been tried in hardware yet.
The same design runs on several FPGA boards, and the FPGA program is not interchangeable between them - the pin assignment differs. The first digit of the version shown on player display 1 at boot tells you which program is running.
| Version | FPGA board | Release file x.30 | Variant (source tree) |
|---|---|---|---|
| 1.30 | Cyclone II (EP2C5) - 'standard' board | Cyclone_II/WillFA7_v130.pof |
cyclone_ii |
| 2.30 | Cyclone IV v3.x (EP4CE6F17) | Cyclone_IV/FPGA_board_v3.x/willfa7_v230.jic |
cyclone_iv_v3 |
| 3.30 | Cyclone IV v4.x (EP4CE6E22) | Cyclone_IV/FPGA_board_v4.x/willfa7_v330.jic |
cyclone_iv_v4 |
| 4.30 | Cyclone 10 (10CL006) | cyclone_10/willfa7_v430.jic |
cyclone_10 |
| 5.30 | dev_open Cyclone IV board (EP4CE6E22) | dev_open/willfa7_v530.jic |
cyclone_iv_dev_open |
| 6.30 | WillFA7S with sound board - see the WillFA7S manual | WillFA7S/willfa7_v630.jic |
s_cyclone_iv_v4 |
Games 30 and 31 (Defender, Star Light) need all six rom blocks and therefore do not run on the Cyclone II board.
| No | S1 | S2 | S3 | S4 | S5 | S6 | type | Name |
|---|---|---|---|---|---|---|---|---|
| 0 | off | off | off | off | off | off | SYS3 | Hot Tip |
| 1 | on | off | off | off | off | off | SYS3 | Lucky Seven |
| 2 | off | on | off | off | off | off | SYS3 | World Cup |
| 3 | on | on | off | off | off | off | SYS3 | Contact |
| 4 | off | off | on | off | off | off | SYS3 | Disco Fever |
| 5 | on | off | on | off | off | off | SYS4 | Pokerino |
| 6 | off | on | on | off | off | off | SYS4 | Phoenix |
| 7 | on | on | on | off | off | off | SYS4 | Flash |
| 8 | off | off | off | on | off | off | SYS4 | Stellar Wars |
| 9 | on | off | off | on | off | off | SYS6 | Tri Zone |
| 10 | off | on | off | on | off | off | SYS6 | Time Warp |
| 11 | on | on | off | on | off | off | SYS6 | Gorgar |
| 12 | off | off | on | on | off | off | SYS6 | Laser Ball |
| 13 | on | off | on | on | off | off | SYS6 | Firepower |
| 14 | off | on | on | on | off | off | SYS6 | Blackout |
| 15 | on | on | on | on | off | off | SYS6 | Scorpion |
| 16 | off | off | off | off | on | off | SYS6A | Algar |
| 17 | on | off | off | off | on | off | SYS6A | Alien Poker |
| 18 | off | on | off | off | on | off | SYS7 | Black Knight |
| 19 | on | on | off | off | on | off | SYS7 | Jungle Lord |
| 20 | off | off | on | off | on | off | SYS7 | Pharaoh |
| 21 | on | off | on | off | on | off | SYS7 | Solar Fire |
| 22 | off | on | on | off | on | off | SYS7 | Barracora |
| 23 | on | on | on | off | on | off | SYS7 | Cosmic Gunfight |
| 24 | off | off | off | on | on | off | SYS7 | Varkon |
| 25 | on | off | off | on | on | off | SYS7 | Warlok |
| 26 | off | on | off | on | on | off | SYS7 | Time Fantasy |
| 27 | on | on | off | on | on | off | SYS7 | Joust |
| 28 | off | off | on | on | on | off | SYS7 | Firepower II |
| 29 | on | off | on | on | on | off | SYS7 | Laser Cue |
| 30 | off | on | on | on | on | off | SYS7 | Defender * |
| 31 | on | on | on | on | on | off | SYS7 | Star Light * |
(*) Cyclone IV board & SD image needed
The type column also says which player displays the
game came with: SYS3, SYS4 and
SYS6 are six digit, SYS6A (Algar and Alien
Poker) and SYS7 are seven digit. WillFA7 places its boot
message according to that, see chapter 5.1.