Tutorial di programmazione per FPGA

In ambito computazionale, FPGA e SoC programmabili sono una classe di dispositivi distinta rispetto ai dispositivi CPU, MCU, DSP e GPU. Con i dispositivi FPGA, gli sviluppatori hanno a disposizione implementazioni che offrono maggiore velocità di elaborazione, minore latenza e un livello più elevato di determinismo.

In ambito computazionale, FPGA e SoC programmabili sono una classe di dispositivi distinta rispetto ai dispositivi CPU, MCU, DSP e GPU. Con i dispositivi FPGA, gli sviluppatori hanno a disposizione implementazioni che offrono maggiore velocità di elaborazione, minore latenza e un livello più elevato di determinismo.

FPGA e SoC programmabili contengono celle di logica programmabili quali ad esempio tabelle di ricerca, registri e RAM in blocco. Quando crea una soluzione logica programmabile, lo sviluppatore definisce la configurazione e le connessioni di queste celle logiche.

Dal momento che lo sviluppatore descrive la configurazione delle celle logiche anziché la sequenza di istruzioni per l'esecuzione, il flusso di sviluppo che ne deriva è molto diverso. Questa differenza introduce anche nuove sfide per gli sviluppatori, tra cui:

- Verifica: in che modo il progettista verifica la funzionalità e ne esegue il debug?
- Allocazione delle risorse: il dispositivo contiene una quantità sufficiente di risorse logiche per implementare il progetto?
- Chiusura delle temporizzazioni: è possibile connettere le celle logiche utilizzate in base alle esigenze e ottenere comunque la frequenza d'esercizio desiderata?
- Dissipazione della potenza: la dissipazione della potenza del progetto finale è accettabile per gli alimentatori e l'ambiente termico?


Acquisizione dei progetti

Dalla sua introduzione nel 1984, la modalità di acquisizione dei progetti logici programmabili è notevolmente cambiata. I progressi hanno visto l'acquisizione dei progetti evolvere dalla definizione delle equazioni logiche per ogni cella logica all'acquisizione schematica dei circuiti logici, all'uso di linguaggi di descrizione hardware e, più di recente, alla sintesi ad alto livello.

Uno dei principali fattori trainanti alla base del livello superiore di astrazione usato per programmare i dispositivi è costituito, naturalmente, dall'aumento delle capacità e delle funzionalità dei dispositivi.

La maggior parte dei progetti moderni viene acquisita tramite un linguaggio di descrizione hardware (HDL) quale ad esempio Verilog o VHDL. Entrambi i linguaggi consentono allo sviluppatore di descrivere la funzionalità desiderata da implementare con la sintesi logica a registri (RTL, Register Transfer Level). La definizione di un progetto RTL implica, da parte dello sviluppatore, la descrizione di un progetto logico sincrono e il trasferimento delle informazioni tra registri, ad esempio macchine di stato e contatori.

Anche se i linguaggi HDL contengono i costrutti che ci si aspetta di trovare in un linguaggio di programmazione (ad esempio, l'uso di file), per creare una soluzione di logica programmabile è possibile usare solo un sottoinsieme limitato del linguaggio. I costrutti rimanenti vengono usati durante la verifica del progetto.

Sempre più di frequente, tuttavia, gli sviluppatori di soluzioni di logica programmabile usano linguaggi di livello superiore, ad esempio C, C++, OpenCL e Matlab/Simulink per l'acquisizione dei progetti. Questi linguaggi vengono usati insieme a uno strumento di sintesi ad alto livello, ad esempio Vivado HLx o HLS Compiler di Intel, che è responsabile della conversione del linguaggio di alto livello in una descrizione VHDL o Verilog. Questa descrizione HDL viene quindi implementata usando il flusso di sviluppo FPGA standard.

Come in tutti gli altri tipi di sviluppo, indipendentemente dall'uso di un linguaggio HDL o di alto livello, è una buona pratica usare un approccio modulare che consente una più facile comprensione e il riutilizzo in base alle esigenze.


Test bench

Durante lo sviluppo di ogni modulo HDL o HLS, è necessario testarlo per assicurarsi che la funzionalità sia quella prevista. È a questo punto che entra in gioco il test bench. Il test bench stimolerà gli input e il monitoraggio del modulo. In casi avanzati, fornirà un report relativo al comportamento dei segnali di output. Durante la simulazione delle transazioni per ogni registro del progetto, le simulazioni logiche possono risultare molto più lente.

Anche se concettualmente simile a un test harness del software, il test bench può richiedere un'interazione più dettagliata perché è necessario azionare e temporizzare correttamente ogni segnale e bus per simulare il modulo. È all'interno del test bench che vengono usati gli ulteriori costrutti del linguaggio durante la lettura delle impostazioni di stimolazione o la registrazione dei risultati in file di testo.

Uno degli elementi chiave della simulazione è il test per casi limite e condizioni limite, che può determinare un funzionamento imprevisto del modulo.

Per applicare il test bench all'unità che si sta testando, è necessario un simulatore HDL come Vivado Simulator (incluso in Vivado HLx) che consente agli sviluppatori di simulare il progetto di logica.

È una pratica comune simulare il progetto prima dell'implementazione all'interno del dispositivo. Tuttavia, in questo modo i risultati della simulazione non tengono conto dei ritardi di tempo che si verificano nel dispositivo implementato, ad esempio i tempi di configurazione e attesa. Di conseguenza, vengono simulate solo le prestazioni funzionali. Queste informazioni possano essere annotate nelle simulazioni dopo l'implementazione del progetto, ma questa scelta determina un aumento significativo del runtime della simulazione.


Implementazione

Una volta che lo sviluppatore è soddisfatto delle prestazioni funzionali, la fase finale dello sviluppo è l'implementazione.

È possibile suddividere l'implementazione in quattro fasi distinte: sintesi, inserimento, routing e generazione del file di programmazione. Anche se l'implementazione è costituita da più fasi, è possibile eseguirle tutte tramite uno strumento proprietario reso disponibile dal fornitore di dispositivi prescelto, ad esempio Intel Quartus o Xilinx Vivado.

Nella sintesi, i file HDL vengono acquisiti e sintetizzati in una descrizione dei circuiti logici da implementare. La sintesi determina pertanto le impostazioni delle celle di logica, dei registri e delle RAM in blocco configurabili e di altre risorse di logica dedicate disponibili all'interno del dispositivo di destinazione. È durante la fase di sintesi che avverrà la maggior parte dell'ottimizzazione della logica e che verrà eseguita l'eliminazione delle variabili e dei segnali inutilizzati. Ciò può determinare ottimizzazioni o decisioni di sintesi non desiderate. Per questo motivo, lo sviluppatore può controllare opzioni, strategie e ottimizzazioni di sintesi tramite i vincoli di sintesi. I vincoli sono basati su testo e guidano lo strumento di sintesi durante il funzionamento.

L'output derivante dalla sintesi è una netlist che descrive il comportamento logico del progetto. La fase successiva dell'implementazione è l'inserimento fisico di ogni funzione logica all'interno del dispositivo. Lo strumento di inserimento userà in genere algoritmi predefiniti che definiscono la modalità di inserimento delle celle logiche all'interno del progetto. Tuttavia, l'utente può anche, se vuole, esaminare e spostare l'inserimento di celle logiche tramite l'uso di vincoli di inserimento. Ciò risulta molto utile quando si tenta di ottenere la chiusura delle temporizzazioni nel progetto.

La penultima fase dell'implementazione viene eseguita dopo la mappatura delle funzioni logiche. Le risorse mappate devono essere connesse in base a quanto stabilito dal progetto usando le risorse disponibili nel dispositivo. Questo processo è denominato "routing" e avviene quando le prestazioni di temporizzazione desiderate vengono usate dagli algoritmi di routing per provare a ottenere la frequenza d'esercizio desiderata. La realizzazione della frequenza d'esercizio desiderata è denominata "chiusura delle temporizzazioni" e sta a indicare che ciascun elemento di registro e clock nel progetto realizza i tempi di configurazione e attesa richiesti.

Nel caso non sia possibile ottenere la chiusura delle temporizzazioni, è possibile usare diversi approcci, tra cui la selezione di una strategia di implementazione diversa, l'aggiornamento dei vincoli di inserimento per avvicinare ulteriormente i blocchi critici di temporizzazione e l'aggiornamento del progetto HDL per implementare una struttura logica più ottimale durante la sintesi.

La fase finale del processo di implementazione è la generazione di un file di programmazione che è possibile usare per configurare il dispositivo di destinazione. Al termine di questa fase, sarà possibile scaricare il file nel dispositivo e iniziare le attività di integrazione con il sistema in uso.

L'integrazione può, naturalmente, presentare altre sfide per lo sviluppatore FPGA e l'integratore di sistemi.


Conclusione

Il processo di sviluppo FPGA è certamente diverso da quello usato per la creazione di una soluzione di elaborazione più tradizionale. La curva di apprendimento, tuttavia, poiché riguarda i linguaggi e le toolchain (in particolare con HLS), è meno ripida di quanto si potrebbe pensare inizialmente. Dedicando il tempo necessario allo studio di questi processi, gli sviluppatori possono iniziare a implementare soluzioni basate su FPGA che offrono maggiore velocità di elaborazione, minore latenza e un livello più elevato di determinismo.

 

 

Ultime notizie

Sorry, your filter selection returned no results.

Non perderti le ultime novità sull'elettronica

Abbiamo aggiornato la nostra politica sulla privacy. Si prega di prendere un momento per rivedere questi cambiamenti. Cliccando su Accetto, l'utente accetta la Politica sulla privacy e Condizioni di utilizzo di Arrow Electronics.

Il nostro sito web mette i cookies sul vostro dispositivo per migliorare la vostra esperienza e il nostro sito. Leggete altre informazioni sui cookies che usiamo e su come disabilitarli qui. I cookies e le tecnologie di tracking possono essere usati per scopi commerciali.

Con un click su “Accept”, voi consentite l'inserimento dei cookies sul vostro dispositivo e l'uso da parte nostra di tecnologie di tracking. Per avere altre informazioni e istruzioni su come disabilitare i cookies e le tecnologie di tracking, clickate su “Read More” qui sotto. Mentre l'accettazione dei cookies e delle tecnologie di tracking è volontaria, una loro disabilitazione potrebbe determinare un funzionamento non corretto del sito web, ed alcuni messaggi di allarme potrebbero essere per voi meno importanti.

Noi rispettiamo la vostra privacy. Leggete qui la nostra politica relativa alla privacy