FPGA e linguaggi di descrizione dell’hardware
Tabelle di ricerca e blocchi logici, collegamenti programmabili e blocchi dedicati, quando usare una FPGA, un contatore in Verilog, flusso di progetto dalla simulazione alla programmazione.
Un circuito integrato su misura (ASIC) è il modo più efficiente di realizzare una funzione digitale, ma progettarlo e produrlo costa milioni e richiede mesi, e una volta fabbricato non si può correggere. Le FPGA (Field Programmable Gate Array) sono chip pieni di blocchi logici e collegamenti programmabili, che si configurano in pochi secondi per diventare qualsiasi circuito digitale. In questa lezione vediamo come sono fatte, come si descrive un circuito con un linguaggio di descrizione dell’hardware e il flusso di progetto.
Il blocco logico

Il cuore di una FPGA è la tabella di ricerca (LUT, look-up table): una piccola memoria di
bit e un multiplexer con
ingressi di selezione. Come visto nella lezione sulle reti combinatorie, un multiplexer con le costanti giuste sugli ingressi dati realizza qualsiasi funzione delle sue variabili di selezione: una LUT a 4 ingressi può essere una qualsiasi delle
funzioni di 4 variabili, scrivendo nella memoria la colonna della tabella di verità. Le FPGA moderne usano LUT a 6 ingressi.
Ogni LUT è seguita da un flip-flop, che si può usare o scavalcare: con migliaia o milioni di questi blocchi si realizzano reti combinatorie e sequenziali di qualsiasi dimensione.
Il resto della FPGA
- I collegamenti programmabili: una rete di linee e di interruttori, comandati da celle di memoria, che collega i blocchi tra loro. Occupano la maggior parte dell’area e dei ritardi del chip.
- I blocchi di ingresso e uscita, configurabili per i diversi standard elettrici (livelli, impedenze, ricetrasmettitori seriali da decine di gigabit al secondo).
- Blocchi dedicati, molto più efficienti delle LUT per i loro compiti: memorie a blocchi, moltiplicatori e accumulatori (DSP) per l’elaborazione dei segnali, generatori di clock (PLL), in alcuni modelli interi processori ARM.
La configurazione sta in celle SRAM e si perde allo spegnimento: all’accensione la FPGA la carica da una memoria flash esterna. Esistono anche FPGA con configurazione in flash interna, che partono subito.
Quando usarle. Le FPGA servono per i prototipi degli ASIC, per i prodotti in piccola serie (strumenti, apparati di telecomunicazione, sistemi aerospaziali), quando gli standard cambiano e il circuito va aggiornato sul campo, e quando serve un’elaborazione massicciamente parallela con ritardi deterministici: decine di canali di filtraggio contemporanei, elaborazione video, controllo di motori ad alta velocità, accelerazione di calcoli nei data center. Rispetto a un ASIC consumano e costano di più per unità e sono più lente; rispetto a un processore fanno in parallelo e in un ciclo ciò che il software farebbe in sequenza.
I linguaggi di descrizione dell’hardware
Un circuito con milioni di porte non si disegna: si descrive in un linguaggio come VHDL o Verilog (e il suo successore SystemVerilog). Sembrano linguaggi di programmazione, ma descrivono hardware, in cui tutto avviene in parallelo. Un contatore a 8 bit con reset e abilitazione, in Verilog:
module contatore (
input wire clk,
input wire rst, // reset sincrono
input wire en, // abilitazione
output reg [7:0] q
);
always @(posedge clk) begin
if (rst)
q <= 8'd0;
else if (en)
q <= q + 8'd1;
end
endmodule
Il blocco always @(posedge clk) descrive flip-flop che cambiano sul fronte di salita; l’assegnazione <= (non bloccante) indica che tutti i registri si aggiornano insieme, come nell’hardware reale. Lo strumento di sintesi riconosce in queste righe un registro di 8 flip-flop, un sommatore e due multiplexer.
Il flusso di progetto
- Descrizione in HDL del comportamento.
- Simulazione: un banco di prova (testbench), scritto anch’esso in HDL, applica gli ingressi e controlla le uscite. È la fase in cui si trova la maggior parte degli errori, ed è lì che si passa più tempo.
- Sintesi: lo strumento traduce la descrizione in una rete di LUT, flip-flop e blocchi dedicati.
- Piazzamento e collegamento (place and route): ogni elemento viene assegnato a un blocco fisico del chip e i collegamenti vengono instradati.
- Analisi statica dei tempi (lezione sulla temporizzazione): si verifica che tutti i percorsi rispettino la frequenza richiesta.
- Programmazione del chip con il file di configurazione (bitstream) e prova sull’hardware, con analizzatori logici integrati che registrano i segnali interni.
Lo stesso flusso, con librerie di celle al posto delle LUT e passi aggiuntivi per la fabbricazione, si usa per progettare gli ASIC e i processori. La differenza decisiva è che sulla FPGA un errore si corregge in pochi minuti, mentre su un chip già prodotto può costare mesi e milioni: per questo i progetti ASIC vengono quasi sempre provati prima su grandi FPGA.




