{"id":433,"date":"2026-07-07T21:35:47","date_gmt":"2026-07-07T18:35:47","guid":{"rendered":"https:\/\/sandrobenigno.com.br\/blog\/?p=433"},"modified":"2026-07-20T22:41:31","modified_gmt":"2026-07-20T19:41:31","slug":"fpgabuddy-e-atari-core-a2600nanosan","status":"publish","type":"post","link":"https:\/\/sandrobenigno.com.br\/blog\/2026\/07\/07\/fpgabuddy-e-atari-core-a2600nanosan\/","title":{"rendered":"FPGABuddy e Atari core A2600NanoSAN"},"content":{"rendered":"\n<p>H\u00e1 tempos eu vinha ensaiando mergulhar nos estudos de FPGA. Comecei essa jornada mais profundamente h\u00e1 alguns meses e, hoje, j\u00e1 colho alguns frutos.<\/p>\n\n\n\n<p>O primeiro desafio foi compreender o quanto uma implementa\u00e7\u00e3o em software difere de outra sintetizada em hardware. A tend\u00eancia inicial \u00e9 escrever muito para implementar pouco. Aos poucos, por\u00e9m, a familiaridade e as in\u00fameras experimenta\u00e7\u00f5es d\u00e3o lugar a t\u00e9cnicas de otimiza\u00e7\u00e3o que tornam o c\u00f3digo mais enxuto, consomem menos recursos e produzem solu\u00e7\u00f5es mais determin\u00edsticas. Esse aprendizado, somado \u00e0s experi\u00eancias acumuladas ao longo do caminho, permitiu-me criar minha pr\u00f3pria vers\u00e3o de um core para o Atari 2600!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1145\" height=\"677\" src=\"https:\/\/sandrobenigno.com.br\/blog\/wp-content\/uploads\/2026\/07\/Raica.jpg\" alt=\"Minha afilhada, Raica, conhecendo os jogos do Atari!\" class=\"wp-image-443\" style=\"width:1037px;height:auto\"\/><\/figure><\/div>\n\n\n<p>S\u00e3o quatro projetos em um:  <strong>A2600NanoSAN <\/strong>(core do Atari implementado em um FPGA Gowin GW2AR), <strong>FPGABuddy + PlaymoDump <\/strong>(o primeiro \u00e9 a interface de usu\u00e1rio e controle do core FPGA enquanto o segundo \u00e9 o leitor de cartuchos Atari, ambos implementados em microcontroladores RP2040) e, por fim, o <strong>FPGASticks <\/strong>(interface de ultra-baixa lat\u00eanca para entrada de joysticks e paddles originais do Atari, implementado em um microcontrolador ATmega328P).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>O <strong>A2600NanoSAN<\/strong> \u00e9 uma implementa\u00e7\u00e3o personalizada do core do Atari 2600 VCS. Ele \u00e9 baseado no core <a href=\"https:\/\/github.com\/MiSTle-Dev\/A2600Nano\">A2600Nano<\/a>, que \u00e9 um porte dos componentes do core FPGA <a href=\"https:\/\/github.com\/MiSTer-devel\/Atari2600_MiSTer\">MiSTer Atari 2600<\/a>.<br>Ele \u00e9 projetado para a seguinte configura\u00e7\u00e3o de hardware:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Placa<\/th><th>FPGA<\/th><th>Sa\u00edda de V\u00eddeo<\/th><th>Suporte \/ Observa\u00e7\u00f5es<\/th><\/tr><\/thead><tbody><tr><td><a href=\"https:\/\/wiki.sipeed.com\/nano20k\">Tang Nano 20k<\/a><\/td><td><a href=\"https:\/\/www.gowinsemi.com\/en\/product\/detail\/38\/\">GW2AR<\/a><\/td><td>HDMI<\/td><td>Dispositivos conectados ao FPGA via SPI:<br>MCU: FPGABuddy (Controle &#8211; Master)<br>MCU: FPGASticks (DB9 para SPI &#8211; Slave)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"661\" src=\"https:\/\/sandrobenigno.com.br\/blog\/wp-content\/uploads\/2026\/07\/pin_wiring.jpg\" alt=\"\" class=\"wp-image-438\" style=\"width:787px;height:auto\"\/><\/figure><\/div>\n\n\n<p>Esta vers\u00e3o personalizada do core A2600Nano introduz tr\u00eas caracter\u00edsticas principais:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Suporte a Cartuchos F\u00edsicos e\/ou SD<\/strong>: Capacidade de receber ROMS enviados via SPI, atrav\u00e9s do m\u00f3dulo <a href=\"https:\/\/github.com\/sandrobenigno\/A2600NanoSAN\/blob\/custom_san\/src\/spi_loader_san.v\" target=\"_blank\" rel=\"noreferrer noopener\">spi_loader_san.v<\/a>.<\/li>\n\n\n\n<li><strong>Controles Legados<\/strong>: Capacidade para receber dois joysticks ou at\u00e9 quatro paddles anal\u00f3gicos, com lat\u00eancia ultrabaixa atrav\u00e9s do m\u00f3dulo personalizado <a href=\"https:\/\/github.com\/sandrobenigno\/A2600NanoSAN\/blob\/custom_san\/src\/db9_to_spi_san.v\" target=\"_blank\" rel=\"noreferrer noopener\">db9_to_spi_san.v<\/a>.<\/li>\n\n\n\n<li><strong>Tela de Abertura<\/strong>: Uma <a href=\"https:\/\/github.com\/sandrobenigno\/A2600NanoSAN\/tree\/custom_san\/tools\" target=\"_blank\" rel=\"noreferrer noopener\">ROM interna personalizada<\/a> que atua como tela de abertura enquanto aguarda o streaming de alguma ROM de jogo.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>O <strong>FPGABuddy<\/strong> \u00e9 um firmware para o microcontrolador <strong>Raspberry Pi Pico (RP2040)<\/strong> que atua como companion (coprocessador) para o core de <strong>Atari 2600<\/strong> executado na FPGA.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O RP2040 gerencia o cart\u00e3o SD (FAT32), processa um banco de dados de ROMs local e renderiza a interface em um display LCD 20&#215;4 I2C. Concorrentemente, nos estados de sele\u00e7\u00e3o e configura\u00e7\u00e3o, ele tamb\u00e9m envia a interface ao <strong>OSD (On-Screen Display) gr\u00e1fico interno da FPGA<\/strong> (128&#215;64 pixels).<\/li>\n\n\n\n<li>\u00c9 esse dispositivo que faz a inje\u00e7\u00e3o f\u00edsica das ROMs diretamente na mem\u00f3ria da FPGA via barramento SPI0, seja a fonte um cart\u00e3o SD ou um cartucho.<\/li>\n\n\n\n<li>A interface tamb\u00e9m oferece um <strong>Menu de Configura\u00e7\u00f5es R\u00e1pidas<\/strong> durante a gameplay para alterar par\u00e2metros do jogo e da FPGA em tempo real.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>O firmware <strong>PlaymoDump <\/strong>roda em num RP2040 dedicado. Ele faz a leitura dos endere\u00e7os 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\u00e7\u00e3o da ROM na mem\u00f3ria do FPGA. Ainda \u00e9 um projeto privado, mas em breve estar\u00e1 em um artigo especial.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>O firmware <strong>FPGASticks <\/strong>(DB9-para-SPI) roda em num terceiro microcontrolador (<strong>ATmega328P<\/strong>). Ele se comunica com o m\u00f3dulo que criei dentro do core FPGA (o db9_to_spi_san.v). Tamb\u00e9m \u00e9 um projeto privado, que ser\u00e1 detalhado em um artigo separado.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>Os projetos resultaram na placa principal, a <strong>A2600BeniBoard<\/strong> e na placa de leitura, a <strong>PlaymoDump<\/strong>.<\/p>\n\n\n\n<p>Abaixo, temos um preview da A2600BeniBorad:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"973\" height=\"897\" src=\"https:\/\/sandrobenigno.com.br\/blog\/wp-content\/uploads\/2026\/07\/FPBB_Frente-1.jpg\" alt=\"\" class=\"wp-image-460\"\/><\/figure>\n\n\n\n<p>Para saber mais, seguem os links:<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/sandrobenigno\/A2600NanoSAN\">https:\/\/github.com\/sandrobenigno\/A2600NanoSAN<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/sandrobenigno\/FPGABuddy\">https:\/\/github.com\/sandrobenigno\/FPGABuddy<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1 tempos eu vinha ensaiando mergulhar nos estudos de FPGA. Comecei essa jornada mais profundamente h\u00e1 alguns meses e, hoje, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[3,13],"tags":[],"class_list":["post-433","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hacking","category-teoria-e-pratica"],"_links":{"self":[{"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/posts\/433","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/comments?post=433"}],"version-history":[{"count":33,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions"}],"predecessor-version":[{"id":496,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/posts\/433\/revisions\/496"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/media\/435"}],"wp:attachment":[{"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/media?parent=433"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/categories?post=433"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sandrobenigno.com.br\/blog\/wp-json\/wp\/v2\/tags?post=433"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}