Transformando uma FPGA Tang nano 20k em um Nintendo Entertainment System (NES)

Transformando uma FPGA Tang nano 20k em um Nintendo Entertainment System (NES)

Imagem do MegaMAN no NES

Introdução

Ao abordar o tema de jogar jogos retrô, o uso de emuladores é uma prática bastante comum. Geralmente, quando desejamos emular um jogo, recorremos a algum software de emulação. Atualmente, temos à nossa disposição uma ampla variedade de programas de emulação, muitos dos quais são de código aberto. No entanto, mesmo com a qualidade de muitos emuladores de software, eles costumam apresentar problemas de desempenho, como alta latência e questões de sincronização.

Felizmente, a emulação por hardware está se tornando cada vez mais viável graças às FPGAs (Field Programmable Gate Arrays). Para aqueles que não estão familiarizados, uma FPGA é um dispositivo lógico que pode ser programado para simular um circuito digital. Com uma FPGA, podemos simular um circuito digital completo, descrevendo seu comportamento por meio de uma linguagem de descrição de hardware.

Agora que sabemos que é possível criar um emulador em nível de hardware, vamos colocar a mão na massa e começar a implementação.

Conheça a Tang nano 20k

A Tang nano 20k é uma FPGA de baixo custo fabricada pela empresa chinesa Sipeed. Ela possui aproximadamente 18 mil blocos lógicos e inclui uma implementação mantida pela própria Sipeed de um emulador de NES chamado NESTang (Nes Emulator for Tang Primer 20K). O NESTang oferece suporte a HDMI, áudio, controles e ao uso de cartão SD para executar imagens de jogos de NES. Além disso, a Sipeed oferece um kit que inclui a placa, uma protoboard, dois controles de PS2 e os adaptadores para conectar os controles á protoboard.

Imagem do kit

Hardware Necessário para Montar o NES

  • 1 Tang Nano 20k ou Tang Primer 20k
  • 1 ou 2 joysticks e adaptadores para protoboard
  • 1 cartão SD
  • 1 protoboard
  • 1 monitor
  • 1 computador com sistema operacional Linux ou MacOS para gravar o NESTang na FPGA
  • Leitor de cartão SD

Software Necessário para Montar o NES

  • Python
  • OpenFPGAloader

Para os usuários do Windows, a Sipeed fornece um guia passo a passo em seu site oficial: link.

Gravando o Firmware na FPGA

Para gravar o firmware na FPGA, basta fazer o download no site oficial da Sipeed: link. Se preferir, também é possível sintetizá-lo do zero. Para isso, você precisará da IDE Gowin e do código-fonte disponível no GitHub: link. Neste tutorial, com o objetivo de simplificar o processo, não abordarei esse passo. Em vez disso, iremos gravar o firmware já pronto fornecido pela Sipeed. Após o download do firmware, acesse a pasta onde o arquivo .fs está localizado usando o terminal com o comando “cd”. No meu caso, está na pasta Downloads, então usei “cd Downloads”. Antes de gravar o firmware, é necessário obter o utilitário openFPGAloader. A instalação do openFPGAloader pode ser feita usando os comandos apropriados, dependendo da distribuição que você está usando.

Para distribuições baseadas em Debian ou Ubuntu:

sudo apt install openFPGALoader

Para distribuições baseadas em Arch:

sudo pacman -S openfpgaloader

Para distribuições Fedora:

sudo dnf copr enable mobicarte/openFPGALoader
sudo dnf install openFPGALoader

Para MacOS:

brew install openfpgaloader

Certifique-se de escolher o comando apropriado de acordo com o sistema operacional que você está usando. Uma vez instalado, você estará pronto para gravar o firmware na memória da FPGA com o comando a seguir:

openFPGALoader -f -b tangnano20k tang_nano_20k_nestang.fs

Imagem do processo

Após executar este comando, se tudo ocorrer bem, o firmware estará gravado na FPGA. Se você a conectar a um monitor, verá uma imagem como esta:

Imagem da FPGA

Não se preocupe se ela estiver assim, pois ainda não possui nenhuma imagem para rodar. Para gravar uma imagem, você precisará de um cartão SD e alguns scripts para gerar a imagem. Se você baixou o código-fonte do NESTang, encontrará uma pasta chamada “tools” com todos esses scripts. Para quem baixou apenas o firmware, esses scripts também estão disponíveis para download aqui. Após o download dos scripts e das imagens de NES, você pode gravá-los no cartão usando os seguintes comandos:

Preparando as Imagens de Jogo

Para gerar a imagem, use:

python nes2img.py -o games.img img1.nes img2.nes img3.nes … imgN.nes

E para gravá-la no cartão SD, utilize:

sudo dd if=games.img of=/dev/unidade_sd bs=512

Substitua “unidade_sd” pelo nome do cartão. Se você estiver utilizando um adaptador USB, provavelmente será algo como sda ou sdb. Se estiver utilizando um adaptador SD ou conectando o cartão diretamente, pode ser algo como mmcblk0.

Montando o Hardware

Após gravar a imagem, conecte o cartão SD à FPGA.

Imagem do NES

Em seguida, conecte os adaptadores em paralelo com os pinos da FPGA, começando pelo lado do HDMI.

Imagem do adaptador

Após fazer isso, o NES estará pronto. Basta conectar os controles, o HDMI e alimentar a placa. Se tudo correu bem, você verá uma imagem como a mostrada abaixo:

Imagem do NES

Jogando no NES

Após iniciar o NES, use os D-pads para escolher o jogo e o botão número 2 para iniciar o jogo. Para retornar ao menu, basta apertar o botão S1 na placa. Depois deste guia passo a passo, é só começar a jogar e se divertir! 😊

Perguntas e Comentários

Se surgirem dúvidas, sinta-se à vontade para perguntar na seção de comentários abaixo.