O que é FPGA?

Em 26 de dezembro de 2015

De algum tempo para cá, muito se ouve falar em FPGA no meio da retrocomputação, principalmente por causa de alguns autores de hardware que vivem nos surpreeendendo com diversas novidades para os videogames e micros de 20-30 anos de idade. Claro que um FPGA não é exclusivo para retrocomputação, mas tem feito um relativo sucesso pela facilidade de uso e principalmente o preço que esses componentes tem aparecido no mercado. Antes de falarmos do FPGA em si, precisamos de uma pequena introdução para podermos entender o funcionamento da coisa.

Provavelmente qualquer pessoa sabe que as máquinas dessa época foram construídas com circuitos integrados digitais, além de algum apoio analógico para geração de som e video. Pois bem, esses CIs digitais, são compostos de portas lógicas que ligadas e agrupadas de determinadas maneiras, desempenham funções específicas. Como exemplo, vou citar o TTL 7432, muito comum nessa época


O 7432 nada mais é do que 4 portas lógicas "OU" dispostas num invólucro de 14 pinos. Nesse caso é bem fácil de notar que as portas não tem ligação entre si, mas vamos ver um exemplo um pouco mais complexo, o TTL 74245


Aqui já bem mais interessante! Temos buffers com porta de controle, além de de duas "E" com inversores em algumas entradas. Traduzindo em miudos, este CI permite a passagem de dados do lado A para o lado B ou do lado B para o lado A, a depender do seu pino de direção DIR. Além disso tem o pino ENABLE, que habilita ou não o seu funcionamento.

Bem, para realmente ser útil para alguma coisa, precisamos de ao menos um punhado de CIs, que combinados, farão algo específico. Por exemplo, eu poderia combinar algumas portas do 7432 com a entrada ENABLE do 74245, fazendo com que determinada situação precisasse ser atendida para que o CI permitisse a passagem dos dados. E assim iríamos colocando mais e mais CIs, até completarmos o circuito.

Mas... e se pudessemos "personalizar" o nosso próprio CI, fazendo a ligação das portas como quisessemos, conseguindo nossa função específica? Ai entra o PLD, abreviação de programmable logic device, ou no português, dispositivo lógico programável. Ele foi bastante utilizado na época e além de simplificar e diminuir o tamanho dos circuitos, ainda permitia um primeiro nível de proteção contra cópia, prática muito comum na época, já que os dados da programação do CI não podiam ser lidos. Como exemplos de PLDs, podemos citar as PALs ou sua versão mais moderna, as GALs.


Com o passar do tempo, a evolução do PLD chegou com o CPLD, o complex programmable logic device ou dispositivo complexo lógico programável, que aumentava a quantidade de portas lógicas internas, conseguindo que circuitos realmente grandes pudessem ser agrupados numa única pastilha. O melhor exemplo que posso citar é o artigo A ULA em CPLD do TK90X, onde conto em forma de diário como foi o desenvolvimento e a série Dissecando a ULA, com vasta explicação sobre o assunto.


Bem, chegamos então ao FPGA, o Field Programmable Gate Array ou em português, Arranjo de Portas Programável em Campo. Enquanto que o CPLD é o "irmão maior" do PLD, não podemos dizer o mesmo do FPGA. Apesar de do ponto de vista prático, um FPGA ser apenas um CPLD "grande", a tecnologia envolvida é muito diferente. Enquanto o CPLD recebe a programação na sua própria pastilha, o FPGA tem uma pequena memória externa com a programação, que é transferida cada vez que o equipamento é ligado. Numa comparação meio extravagante, seria como dizer que um FPGA se comporta como uma RAM, que perde seu conteúdo cada vez que é desligado, e precisa receber os dados novamente quando ligado. O processo é MUITÍSSIMO rápido e não é perceptível, mas acontece.


A organização interna do FPGA também difere um pouco, conforme vemos as imagens ilustrativas abaixo. Os blocos laranja são os de lógica, que são roteados pelos switch boxes em azul.
Fatal error: Uncaught Error: Call to undefined function imagecreatetruecolor() in /home/victortrucco/funcoes.php:91 Stack trace: #0 /home/victortrucco/funcoes.php(1232): CriarThumb_ShotGraph('', 'cpld-clean.png', 400, false) #1 /home/victortrucco/Diversos/OQueeFPGA/OQueeFPGA.php(105): Print2Fotos('cpld-clean.png', 'fpga-clean.png') #2 {main} thrown in /home/victortrucco/funcoes.php on line 91