Gli FPGA (Field Programmable Gate Array) rappresentano una tecnologia in continua evoluzione che viene utilizzata in un’ampia gamma di applicazioni in vari campi, dall’elettronica all’informatica.
Sono dispositivi elettronici programmabili che consentono agli ingegneri e ai progettisti hardware di creare circuiti integrati personalizzati, su misura per l’assolvimento di specifiche esigenze. Invece di avere un circuito integrato fisso con funzionalità limitate, un FPGA può essere programmato per eseguire una vasta gamma di funzioni elettroniche grazie all’utilizzo di una matrice di blocchi logici configurabili, che possono essere interconnessi per creare dei circuiti personalizzati.
Grazie alla loro programmabilità, gli FPGA sono utilizzati nei settori dell’automazione industriale, delle telecomunicazioni, dell’elettronica di consumo, dell’informatica ad alte prestazioni e della ricerca scientifica. Vengono utilizzati per l’elaborazione di segnali digitali, la comunicazione di rete, l’elaborazione di immagini, la crittografia e la sicurezza informatica, l’intelligenza artificiale, il calcolo ad alte prestazioni e altro ancora.
Gli FPGA appartengono a una classe di dispositivi nota come logica programmabile: un FPGA non fa nulla da solo, ma può essere configurato per vestire i panni di qualsiasi circuito digitale desiderato. La magia è che nulla cambia dal punto di vista fisico: basta caricare una configurazione nel dispositivo FPGA e questo inizia a comportarsi come il circuito desiderato. Nessuna saldatura, nessun ponticello, nessun problema.
Un FPGA può quindi essere riconfigurato per comportarsi come un altro circuito, e un altro, e un altro ancora. La configurazione è basata sulla RAM, il che significa che può essenzialmente essere modificata e riconfigurata un numero illimitato di volte.
La capacità degli FPGA di offrire un’elaborazione parallela altamente efficiente e personalizzabile li rende infatti una scelta ideale per tutte quelle applicazioni che richiedono prestazioni elevate, bassa latenza, basso consumo energetico e flessibilità di progettazione. L’unico problema è il costo impegnativo, anche se negli ultimi anni si è ridotto.
Gli FPGA possono creare solo circuiti digitali: alcuni dei dispositivi più recenti usano convertitori da analogico a digitale integrati, ma anche questi convertono l’ingresso analogico in un segnale digitale “il prima possibile”.
Come funzionano gli FPGA
Abbiamo detto che gli FPGA sono dispositivi di elaborazione digitale che utilizzano una rete di porte logiche programmabili per implementare funzioni logiche e aritmetiche. Il loro funzionamento è basato sulla programmazione di queste porte logiche tramite un linguaggio di descrizione dell’hardware (HDL), come VHDL o Verilog.
Esistono diverse porte logiche ma le più comuni sono AND, OR, XOR e NOT: ciascuna accetta ingressi digitali, svolge la sua funzione logica ed eroga in uscita un valore digitale. Ci sono poi varianti delle porte di base conosciute come NAND, NOR e XNOR: corrispondono semplicemente alle versioni standard con le uscite invertite.
Come avviene per tutte le porte logiche, inoltre, se prendiamo una porta AND, essa può essere costruita utilizzando transistor. Si può quindi ricorrere a un design noto come CMOS (Complementary Metal-Oxide Semiconductor), uno schema che utilizza transistor MOSFET NMOS e PMOS ed è alla base del funzionamento della maggior parte dei circuiti moderni.
Con solo porte logiche, è possibile descrivere qualsiasi circuito digitale: ci sono tuttavia molte funzioni ricorrenti di livello superiore che vengono gestiti con i multiplexer, uno degli elementi costitutivi fondamentali degli FPGA.
Negli FPGA, i multiplexer sono utilizzati per implementare le funzioni logiche. Una singola linea di un FPGA può essere utilizzata per diverse funzioni, e i multiplexer consentono di selezionare quale funzione deve essere eseguita in un determinato momento. Ad esempio, un multiplexer può selezionare quale ingresso deve essere instradato ad una determinata porta logica, o quale valore costante deve essere utilizzato come input per una porta logica.
I multiplexer sono spesso utilizzati in combinazione con le Look-Up Table (LUT) degli FPGA, che memorizzano la tabella di verità delle funzioni logiche. I segnali di ingresso vengono quindi inviati alle LUT attraverso i multiplexer, e il risultato viene restituito come uscita dell’FPGA. Una LUT è un circuito logico che consente di mappare un insieme di input su un insieme di output specifici: combinando più LUT si ottengono circuiti logici più complessi.
Come viene programmato un dispositivo FPGA
La programmazione dell’FPGA avviene in due fasi: la sintesi e il mapping. Durante la fase di sintesi, il codice HDL viene tradotto in una rappresentazione intermedia detta netlist, che descrive la struttura logica dell’hardware da implementare. Nella fase di mapping, la netlist viene mappata sui blocchi logici dell’FPGA, in modo che questi possano implementare le funzioni desiderate.
Una volta programmato, l’FPGA diventa un circuito elettronico personalizzato che può essere configurato per svolgere una vasta gamma di funzioni. Come detto, l’architettura dell’FPGA consente inoltre di implementare circuiti paralleli, il che lo rende particolarmente adatto per l’elaborazione di dati in tempo reale.
Questi dispositivi sono sempre più spesso adottati nel campo dell’intelligenza artificiale perché in grado di implementare algoritmi di deep learning in modo efficiente grazie alla loro capacità di elaborare grandi quantità di dati in parallelo. Ciò consente di ottenere prestazioni molto elevate, riducendo i tempi di elaborazione.
Perché e quando usare un FPGA?
Fino a questo punto abbiamo cercato di fornire una descrizione approssimativa del funzionamento degli FPGA. La domanda, a questo punto, è perché e in quali circostanze si sceglie un FPGA al posto di un processore.
In generale, va detto che molte persone sanno programmare, molte di meno sanno come creare progetti per FPGA. Scrivere codice è spesso più facile per creare comportamenti complessi e cambiare drasticamente il modo con cui un’operazione viene implementata.
Tuttavia, gli FPGA possono essere molto più efficienti in termini di tempo di elaborazione e una latenza ridotta ai minimi termini. Perché? Perché tutte le fasi che normalmente si gestiscono tramite codice di programmazione sono implementate in hardware e possono essere gestite in modo completamente indipendente l’una dall’altra. Non sono righe di codice che competono l’una con l’altra per utilizzare le risorse computazionali disponibili sul processore.
Gli FPGA non sono un vestito per tutte le stagioni: come abbiamo detto tendono a essere costosi e l’elevato numero di transistor che compongono le LUT richiedono potenza. È necessario quindi che siano alimentati correttamente affinché il dispositivo funzioni: per questo motivo gli FPGA sono candidati poco consigliabili per i sistemi a batteria.
Ovviamente il progettista può disegnare i circuiti in modo che siano efficienti dal punto di vista energetico, ma anche senza fare assolutamente nulla, un FPGA consuma già 100 mA e può superare molto facilmente i 1.000 mA iniziando a “sollecitare” il dispositivo.
Gli FPGA sono una specie di “catena di montaggio”: ogni elemento che la compone funziona indipendentemente e, nel loro insieme, sono incredibilmente efficienti. Tuttavia, può essere difficile impostare inizialmente la linea e se si desidera apportare modifiche importanti è spesso più semplice iniziare da zero.
Viceversa, i processori sono un po’ come le persone: una singola persona potrebbe svolgere praticamente qualsiasi compito con tempo e formazione sufficienti. Compiti sequenziali complessi sono facili da realizzare per una persona.
La scelta di un processore o di un FPGA dipende quindi dallo specifico progetto che si sta realizzando.
Nelle miniature dell’articolo, l’immagine di un FPGA Xilinx, controllata di AMD (fonte: Programming an FPGA: An Introduction to How It Works).