Há tempos eu vinha ensaiando mergulhar nos estudos de FPGA. Comecei essa jornada mais profundamente há alguns meses e, hoje, já colho alguns frutos.
O primeiro desafio foi compreender o quanto uma implementação em software difere de outra sintetizada em hardware. A tendência inicial é escrever muito para implementar pouco. Aos poucos, porém, a familiaridade e as inúmeras experimentações dão lugar a técnicas de otimização que tornam o código mais enxuto, consomem menos recursos e produzem soluções mais determinísticas. Esse aprendizado, somado às experiências acumuladas ao longo do caminho, permitiu-me criar minha própria versão de um core para o Atari 2600!

São quatro projetos em um: A2600NanoSAN (core do Atari implementado em um FPGA Gowin GW2AR), FPGABuddy + PlaymoDump (o primeiro é a interface de usuário e controle do core FPGA enquanto o segundo é o leitor de cartuchos Atari, ambos implementados em microcontroladores RP2040) e, por fim, o FPGASticks (interface de ultra-baixa latênca para entrada de joysticks e paddles originais do Atari, implementado em um microcontrolador ATmega328P).
O A2600NanoSAN é uma implementação personalizada do core do Atari 2600 VCS. Ele é baseado no core A2600Nano, que é um porte dos componentes do core FPGA MiSTer Atari 2600.
Ele é projetado para a seguinte configuração de hardware:
| Placa | FPGA | Saída de Vídeo | Suporte / Observações |
|---|---|---|---|
| Tang Nano 20k | GW2AR | HDMI | Dispositivos conectados ao FPGA via SPI: MCU: FPGABuddy (Controle – Master) MCU: FPGASticks (DB9 para SPI – Slave) |

Esta versão personalizada do core A2600Nano introduz três características principais:
- Suporte a Cartuchos Físicos e/ou SD: Capacidade de receber ROMS enviados via SPI, através do módulo spi_loader_san.v.
- Controles Legados: Capacidade para receber dois joysticks ou até quatro paddles analógicos, com latência ultrabaixa através do módulo personalizado db9_to_spi_san.v.
- Tela de Abertura: Uma ROM interna personalizada que atua como tela de abertura enquanto aguarda o streaming de alguma ROM de jogo.
O FPGABuddy é um firmware para o microcontrolador Raspberry Pi Pico (RP2040) que atua como companion (coprocessador) para o core de Atari 2600 executado na FPGA.
- O RP2040 gerencia o cartão SD (FAT32), processa um banco de dados de ROMs local e renderiza a interface em um display LCD 20×4 I2C. Concorrentemente, nos estados de seleção e configuração, ele também envia a interface ao OSD (On-Screen Display) gráfico interno da FPGA (128×64 pixels).
- É esse dispositivo que faz a injeção física das ROMs diretamente na memória da FPGA via barramento SPI0, seja a fonte um cartão SD ou um cartucho.
- A interface também oferece um Menu de Configurações Rápidas durante a gameplay para alterar parâmetros do jogo e da FPGA em tempo real.
O firmware PlaymoDump roda em num RP2040 dedicado. Ele faz a leitura dos endereços de todos os bancos do cartucho inserido e envia o dump da ROM para o FPGABuddy, que por sua vez verifica e faz a injeção da ROM na memória do FPGA. Ainda é um projeto privado, mas em breve estará em um artigo especial.
O firmware FPGASticks (DB9-para-SPI) roda em num terceiro microcontrolador (ATmega328P). Ele se comunica com o módulo que criei dentro do core FPGA (o db9_to_spi_san.v). Também é um projeto privado, que será detalhado em um artigo separado.
Os projetos resultaram na placa principal, a A2600BeniBoard e na placa de leitura, a PlaymoDump.
Abaixo, temos um preview da A2600BeniBorad:

Para saber mais, seguem os links: