Vai al contenuto
Elettronica dei Sistemi Digitali

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

Blocco logico di una FPGA: tabella di ricerca a quattro ingressi, flip-flop e multiplexer d'uscita
Sedici celle di memoria contengono la tabella di verità di una funzione; i quattro ingressi A, B, C, D comandano un multiplexer 16:1 che ne sceglie una. L’uscita può andare direttamente all’uscita del blocco oppure passare prima per un flip-flop D, a scelta di un secondo multiplexer configurabile.

Il cuore di una FPGA è la tabella di ricerca (LUT, look-up table): una piccola memoria di 2^k bit e un multiplexer con k 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 2^{16} = 65\,536 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

  1. Descrizione in HDL del comportamento.
  2. 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.
  3. Sintesi: lo strumento traduce la descrizione in una rete di LUT, flip-flop e blocchi dedicati.
  4. Piazzamento e collegamento (place and route): ogni elemento viene assegnato a un blocco fisico del chip e i collegamenti vengono instradati.
  5. Analisi statica dei tempi (lezione sulla temporizzazione): si verifica che tutti i percorsi rispettino la frequenza richiesta.
  6. 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.

Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
0
Would love your thoughts, please comment.x
()
x