O processador que você está usando para ler este texto é nada mais do que basilhões de transistores. Diferentes arranjos de transistores formam diferentes portas lógicas. E um arranjo de portas lógicas forma circuitos maiores, como somadores, flip-flops, multiplexadores e registradores. Todo circuito do processador é fabricado no silício e não pode ser redesenhado pelo usuário.
Toda porta lógica pode ser representada por uma tabela verdade. As primeiras colunas formam todos os inputs possíveis e a última coluna mostra seus respectivos outputs. Vejamos a tabela verdade da porta AND:

A saída do AND só é verdadeira (ou energizada) quando todas as entradas também são. Da mesma forma, outras portas lógicas podem ser representadas por tabelas verdade. Podemos usar esse conceito de forma interessante: em vez de implementar uma função lógica com portas fixas, podemos guardar sua tabela verdade como um dado. Isso nos dá a vantagem de poder reprogramar uma função lógica. Para transformar um AND em um OR, basta mudar os valores da saída. E é com essa ideia que surgem os FPGAs.
O que é um FPGA?
FPGA (Field-Programmable Gate Array) é um chip reconfigurável. Com ele, você pode desenhar seus próprios circuitos usando programas como Quartus (Intel/Altera) ou Vivado (AMD), fazer o upload da configuração e usá-los.
Um FPGA é formado por CLBs (Configurable Logic Blocks). Dentro de um CLB ficam várias Look Up Tables: as LUTs armazenam a tabela verdade de funções lógicas. Além das LUTs, um CLB geralmente contém um registrador programável, que faz o papel de um flip-flop.

Além das CLBs, um FPGA geralmente tem:
- Blocos de I/O
- Clock
- RAM
- Blocos DSP: blocos dedicados a multiplicação e outras operações aritméticas rápidas
- Carry chains
- Config memory: memória interna para guardar a configuração do FPGA
- Interface de configuração: o meio para gravar a configuração
- Interconexões programáveis: conectam as entradas e saídas de diferentes blocos
DE0 Cyclone III

A placa que tenho acesso é a Terasic DE0, que usa um FPGA Altera Cyclone III EP3C16F484C6. Ele contém 963 LABs (Logic Array Blocks), que são as unidades correspondentes aos CLBs. Cada LAB tem 16 LEs (Logic Elements). Cada LE tem uma Look Up Table de 4 entradas e um registrador. Portanto, são 15.408 LUTs e 15.408 flip-flops. Além disso, a placa contém diversos componentes acessórios:
- 56 blocos M9K de RAM interna
- 504 Kbits de RAM interna total
- 56 multiplicadores embarcados
- 10x slide switches
- 3x push buttons
- 10x LEDs verdes
- 4x displays de 7 segmentos
- 8 MB SDRAM
- 1x saída VGA
- 1x interface para LCD 16x2, mas o módulo LCD não vem incluso
- 1x slot SD Card
- 1x oscilador de 50 MHz
- 1x conector USB Blaster
- 1x chave RUN/PROG para JTAG/Active Serial
Quartus II 13.1 Web Edition
Quartus II 13.1 Web Edition é um software EDA (Electronic Design Automation) feito pela Altera. Tanto o software como o hardware do FPGA são proprietários. Para FPGAs AMD/Xilinx modernos, normalmente se usa o Vivado. Com o Quartus, você pode desenhar seus circuitos, fazer test benches e fazer upload para seu FPGA. Circuitos pequenos podem ser desenhados em forma de diagrama, como você faria em uma plataforma como CircuitVerse.

Para não precisar desenhar um circuito todo de uma vez, o Quartus oferece o conceito de entidades e instâncias. Podemos, portanto, criar um módulo e reutilizá-lo várias vezes. Vejamos como um somador de 8 bits é criado. Primeiro, fazemos um somador de um bit.

Agora, vamos reutilizar esse módulo para criar o somador de 8 bits. Conectamos os inputs e outputs nos somadores e encadeamos o carry out de um somador no carry in do somador seguinte. Além disso, adicionamos a possibilidade da subtração usando two's complement.

Tudo isso é muito divertido, porém é impraticável desenhar o diagrama de um circuito grande como um processador, um controlador de vídeo ou interfaces de comunicação. Para facilitar nossa vida, existem Hardware Description Languages. Com elas, podemos descrever o hardware com texto, como numa linguagem de programação. Então esse código é sintetizado em um circuito.
As linguagens mais famosas com esse propósito são Verilog e VHDL. Vejamos um exemplo de Verilog:
verilogmodule hex7seg (
input [3:0] hex,
output reg [6:0] seg // seg[6:0] = g f e d c b a (0 acende)
);
always @(*) begin
case (hex)
4'h0: seg = 7'b1000000;
4'h1: seg = 7'b1111001;
4'h2: seg = 7'b0100100;
4'h3: seg = 7'b0110000;
4'h4: seg = 7'b0011001;
4'h5: seg = 7'b0010010;
4'h6: seg = 7'b0000010;
4'h7: seg = 7'b1111000;
4'h8: seg = 7'b0000000;
4'h9: seg = 7'b0010000;
4'hA: seg = 7'b0001000;
4'hB: seg = 7'b0000011;
4'hC: seg = 7'b1000110;
4'hD: seg = 7'b0100001;
4'hE: seg = 7'b0000110;
4'hF: seg = 7'b0001110;
default: seg = 7'b1111111;
endcase
end
endmodule
Esse módulo recebe um número de 4 bits e traduz para o equivalente em hexadecimal no display de 7 segmentos. O Quartus nos permite ver o circuito sintetizado a partir desse código.

O ponto central é que conectar Look Up Tables, em vez de depender apenas de circuitos fixos, torna o FPGA um tipo de hardware com características únicas. A experiência de programar em uma HDL é diferente de qualquer outra coisa que eu já tinha feito antes: em vez de escrever instruções para um processador executar, descrevemos o próprio circuito que vai existir no chip.
Mesmo sendo usado na indústria para uma série de aplicações sérias, como processamento de sinais, controle, comunicação e prototipação de hardware, o FPGA também pode ser explorado como um laboratório de hardware. Nele, cada bloco lógico pode virar parte de uma máquina criada do zero.