FireStorm — FPGA
FireStorm is not a fixed "sound chip" or a simple video controller — it is a reconfigurable, multi-paradigm execution fabric at the heart of the Ant64.
Overview
FireStorm is built around the GoWin GW5AT-LV138Pg484A FPGA. It handles screen generation, audio DSP, 2D rasterisation, and high-speed memory access — all simultaneously.
- Reads a special display program to generate the screen layout and HDMI video signal
- Combined with a WM8958 or WM8960 codec for audio I/O + optical digital audio out
- Runs various hardware emulators — Amiga, Atari STE, SNES, NES, C64, VIC-20, PacMan, Spectrum, MSX2 / Yamaha VDP
Memory
- 1 or 2GB DDR3 SDRAM — 256/512M words × 32-bit (direct FPGA access)
- 9MB fast SRAM — 2 independent banks of 1M words × 36-bit
Security
The FPGA supports both 128-bit AES encrypted and unencrypted bitstream images. The key is stored in a locked, write-once secure location — once set it cannot be read or overwritten. This allows encrypted personality cartridges whilst still permitting unencrypted community images.
The AES key will be set before distribution — if not set first, anyone could lock it with their own key.
DeMon programs FireStorm via JTAG at boot, and can display a logo or effect from its own flash whilst the rest of the system initialises.
FPGA Comparison
| Feature |
Ant64s/Ant64b |
Ant64/Ant64c |
Next (KS1) |
Next (KS2) |
Next (KS3) |
| Device |
GW5A-60 |
GW5A-138 |
XC6LX9 |
XC7A15T |
XC7A35T |
| LUT4 |
59,904 |
138,240 |
9,152 |
16,640 |
33,380 |
| Shadow SRAM (Kbits) |
468 |
1,080 |
90 |
200 |
400 |
| Block SRAM (Kbits) |
2,124 |
6,120 |
576 |
900 |
1,800 |
| Number of BSRAM |
118 |
340 |
?? |
25 |
50 |
| DSP multipliers |
118 |
298 |
16 |
45 |
90 |
JTAG
Signal Lines
| Signal |
Direction |
Description |
TCK |
Out |
Clock — connected to all devices |
TMS |
Out |
Mode select — connected to all devices |
TDI |
Out |
Data in — chained from previous device TDO |
TDO |
In |
Data out — last device in chain |
Status Pins
On the Tang Primer 25K, the debug test points are the JTAG lines.
FRAM Interfaces
The main chips — SG2000, DeMon, QMK, and Pulse — interface to FireStorm via a FRAM (Fake QSPI RAM) interface. Hosts map this directly into their memory space:
- All chips get 4GB mapped shared access to FireStorm's DDR3/SRAM
- Each FRAM16 interface leaves 12MB spare per chip in the memory map
- The SG2000's FRAM256 interface leaves 252MB spare
Audio Codec
The WM8958 or WM8960 codec is wired to an I2S output, with I2C controlled by Pulse. The DAC drives:
- Headphone / microphone connection
- 2× internal speakers
- Audio sampler connections
- SG2000 audio out (possibly stereo)
The SG2000 has a microphone input connected to the internal motherboard mic. Its Tensor unit can be used for voice recognition, with mono audio output fed into R3/L3 for mixing.
WM8958 — I/O Routing
| Input |
Source |
Output |
Destination |
| L1 (in1) |
Headphone microphone (mono) |
LHP (2nd DAC) |
Headphone L — 5.3mW |
| R1 (in1) |
— |
RHP (2nd DAC) |
Headphone R |
| L2 (in1) |
LSAM — Sampler left |
LSPK (1st DAC) |
L internal speaker — 2W |
| R2 (in1) |
RSAM — Sampler right |
RSPK (1st DAC) |
R internal speaker |
| L3 (in2) |
SG2000 audio out (mono?) |
L line out 1 |
— |
| R3 (in2) |
SG2000 audio out (mono?) |
R line out 1 |
— |
| L4 (in2) |
— |
L line out 2 |
— |
| R4 (in2) |
— |
R line out 2 |
— |
AIF1 is connected directly to FireStorm.
WM8960 — I/O Routing
| Input |
Source |
Output |
Destination |
| L1 |
Headphone microphone (mono) |
LHP |
Headphone socket L |
| R1 |
— |
RHP |
Headphone socket R |
| L2 |
LSAM — sampler socket left |
LSPK |
Left internal speaker |
| R2 |
RSAM — sampler socket right |
RSPK |
Right internal speaker |
| L3 |
SG2000 audio out (mono?) |
— |
— |
| R3 |
SG2000 audio out (mono?) |
— |
— |
Prototype 1 — Tang Primer 25K
Prototype 1 features: HDMI out · 64MB 5ns SDRAM · 8MB QSPI NOR Flash · SG2000 FRAM256 interface · I2S raw audio from Pulse · VSync out · HSync out · Pixel clock out · Pulse Sequencer SPI master · I2C system master (all chips)
J3 — SDRAM
| RAM |
Function |
Pin |
Pin |
Function |
RAM |
| D0 |
K2 IOR20B |
1 |
2 |
K1 IOR20A |
D1 |
| D2 |
L1 IOR18B |
3 |
4 |
L2 IOR18A |
D3 |
| D4 |
K4 IOR22B |
5 |
6 |
J4 IOR22A |
D5 |
| D6 |
G1 IOR24B |
7 |
8 |
G2 IOR24A |
D7 |
| D15 |
L3 IOR31B |
9 |
10 |
L4 IOR31A |
D14 |
| +V |
5V |
11 |
12 |
GND |
GND |
| D13 |
C2 IOB04B |
13 |
14 |
B2 IOB4A |
D12 |
| D11 |
F1 IOB26B |
15 |
16 |
F2 IOB26A |
D10 |
| D9 |
A1 IOB24A |
17 |
18 |
E1 IOB12B |
D8 |
| A12 |
D1 IOB14B |
19 |
20 |
E3 IOB60A |
CLK |
| A9 |
J2 IOR33B |
21 |
22 |
J1 IOB33A |
A11 |
| A7 |
H4 IOB89B |
23 |
24 |
G4 IOB89A |
A8 |
| A5 |
H2 IOB91B |
25 |
26 |
H1 IOB91A |
A6 |
| WE |
J7 IOT21B |
27 |
28 |
K7 IOT21A |
A4 |
| LDM |
L8 IOT19B |
29 |
30 |
L7 IOT19A |
UDM |
| CAS |
K10 IOT15B |
31 |
32 |
L10 IOT15A |
RAS |
| CS0 |
K9 IOT31B |
33 |
34 |
L9 IOT31A |
BA0 |
| BA1 |
K8 IOT56B |
35 |
36 |
J8 IOT56A |
A10 |
| A0 |
F6 IOT58B |
37 |
38 |
F7 IOT58A |
A1 |
| A2 |
J10 IOT1B |
39 |
40 |
J11 IOT1A |
A3 |
J4
| Pin |
FPGA |
Description |
Pin |
FPGA |
Description |
| 2 |
3v3 |
|
1 |
3v3 |
|
| 4 |
GND |
|
3 |
GND |
|
| 6 |
C10 IOL5B |
SG2000 memory WP |
5 |
C11 IOL5A |
SG2000 memory HOLD |
| 8 |
B10 IOL12B |
SG2000 memory MOSI |
7 |
B11 IOL12A |
SG2000 memory MISO |
| 10 |
D10 IOL9B |
SG2000 memory SCK |
9 |
D11 IOL9A |
SG2000 memory CS |
| 12 |
G10 IOT7B |
I2S PCM1808 BCK |
11 |
G11 IOT7A |
I2S PCM1808 DATA |
| 8 |
L11 IOT11B |
SPI master MISO |
7 |
K11 IOT11A |
SPI master MOSI |
| 10 |
E10 IOL3B |
SPI master SCK |
9 |
E11 IOL3A |
SPI master CS0 — Pulse Sequencer |
| 12 |
A10 IOL14B |
I2C master SCL |
11 |
A11 IOL14A |
I2C master SDA |
J5
| Pin |
FPGA |
Description |
Pin |
FPGA |
Description |
| 2 |
3v3 |
|
1 |
3v3 |
|
| 4 |
GND |
|
3 |
GND |
|
| 6 |
K5 IOT63B |
I2S PCM1808 LRCK |
5 |
L5 IOT63A |
Pixel clock out |
J6 — HDMI
| Pin |
FPGA |
Description |
Pin |
FPGA |
Description |
| 2 |
3v3 |
|
1 |
3v3 |
|
| 4 |
GND |
|
3 |
GND |
|
| 6 |
J5 IOT61B |
HDMI CKN — CTRL/STATUS |
5 |
H5 IOT61A |
HDMI CKP — CTRL/STATUS |
| 8 |
H7 IOT66B |
HDMI D0N — BLUE, H/V SYNC |
7 |
H8 IOT66A |
HDMI D0P — BLUE, H/V SYNC |
| 10 |
G8 IOT68B |
HDMI D1N — GREEN, CTL 0/1 |
9 |
G7 IOT68A |
HDMI D1P — GREEN, CTL 0/1 |
| 12 |
G5 IOT72B |
HDMI D2N — RED, CTL 2/3 |
11 |
F5 IOT72A |
HDMI D2P — RED, CTL 2/3 |
USB A Host
| Pin |
FPGA |
Description |
| 1 |
L6 IOT23A |
USB-A P — VSync out |
| 2 |
K6 IOT23B |
USB-A N — HSync out |
| 3 |
E8 READY |
USB DP Pull |
Debug
| Pin |
FPGA |
Description |
| 1 |
B1 JTAG TMS |
JTAG TMS |
| 2 |
A3 JTAG TDI |
JTAG TDI |
| 3 |
C1 JTAG TCK |
JTAG TCK — 5.1k resistor to GND |
| 4 |
— |
5V |
| 5 |
A2 JTAG TDO |
JTAG TDO |
| 6 |
— |
GND |
| 7 |
— |
3v3 |
| 8 |
— |
BL616 Enable — connect to GND to disable BL616 |
| — |
B3 IOB56A |
UART TX — to BL616 UART RX |
| — |
C3 IOB56B |
UART RX — to BL616 UART TX |
LED
| Pin |
FPGA |
Description |
| 3 |
E8 READY |
Ready = 1, not ready = 0 |
| 4 |
D7 DONE |
Done = 1, fail = 0 |
Button
| Pin |
FPGA |
Description |
| 1 |
H11 IOT3A |
S1 |
| 2 |
H10 IOT3B |
S2 |
4-Pin Connector
| Pin |
FPGA |
Description |
| 1 |
D8 Reconfig |
— |
| 2 |
GND |
— |
| 3 |
E8 Ready |
— |
| 4 |
D7 Done |
— |
Special Pins
| Pin |
Default |
Description |
IOB01A |
RECONFIG_N |
Global reset for GowinCONFIG logic — active low |
IOB33B |
EMCCLK |
Optional external clock input for master mode configuration. Ignored in JTAG/slave modes. |
IOB37A |
READY |
High = device can be programmed; Low = device cannot be programmed |
IOB37B |
MCS_N/CSO_B |
MSPI mode: enable signal, active-low |
IOB52A |
MODE1 |
Set to 0 via resistor — Master mode, FPGA reads config from external Flash via SPI |
IOB54A |
MI2 |
MSPI X4 mode: parallel data bit 2 — connects to DQ2/WP#/IO2 of external Flash |
IOB54B |
MI3 |
MSPI X4 mode: parallel data bit 3 — connects to DQ3/HOLD#/IO3 of external Flash |
IOB58A |
MISO |
MSPI X1: serial data input. X2/X4: parallel data bit 1 — connects to DQ1/SO/IO1 |
IOB58B |
MOSI |
MSPI: serial instruction/address output. X2/X4: parallel data bit 0 — connects to DQ0/SI/IO0 |
IOB62A |
CCLK |
Slave mode: clock input from external source. Master mode: clock output |
IOB62B |
MODE0 |
Set to 1 via resistor — Master mode, FPGA reads config from external Flash via SPI |
IOB64A |
DONE |
Input: low = delay activation until high. Output: high = config complete; low = config failed or incomplete |
IOR01A |
TCK |
JTAG: serial clock input |
IOR01B |
TDI |
JTAG: serial data input |
IOR03A |
TMS |
JTAG: serial mode input |
IOR03B |
TDO |
JTAG: serial data output |
IOT29A |
PUDC_B |
Active-low weak pull-up selection during configuration. Low = all GPIOs weak pull-up; High = all GPIOs high impedance. Must not be left floating. |
Reference Links