
Getting Started: FPGAs Hello World!
L'intento di questo articolo non é di fornire una guida al VHDL, ma un workflow dallo schematico al bitstream attraverso l'ISE Design Suite di Xilinx rispondendo alle domande di chi compra un nuovo FPGA e non sa da dove iniziare.
Step 1 - Creare un nuovo progettoa) Aprite Xilinx ISE Design Suite e create un nuovo progetto. d) I dati inerenti al vostro FPGA gli trovate anche direttamente sulla board, una volta compilato il Project Settings cliccate Next.
Step 2 - Utilizzo dello schematicoa) Facciamo Right click su xc7a100t-1csg324 e selezioniamo New Source. c) Realizzando per primo lo schematico questo verrà impostato in automatico come Top Module.
![]() Work-Area Step 3 - VHDL Modulea) Facciamo Right click su “sch_ledBlink″ e selezioniamo “New Source”. VHDL e linguaggi di programmazioneA volte l'approccio di chi ha esperienza con un linguaggio di alto livello (c# , Java etc) è di considerare il VHDL come un qualsiasi altro linguaggio, scordandosi però che non si sta "programmando" ma "descrivendo" hardware. In particolare, vi sono due caratteristiche che differenziano il VHDL rispetto ai linguaggi di programmazione convenzionali:
Questi due punti sono interessanti se pensate all'implementazione di reti neurali artificiali (ANN) su FPGA considerando che l'architettura di Von Neumann su cui si basano i computer è seriale invece una delle peculiarità delle ANN era il loro essere parallele e distribuite. Qui trovate l'implementazione di un perceptron su FPGA utilizzando Matlab e System Generator. Entity e architectureUna descrizione di un componente VHDL richiede una entity declaration (riga 6-12) e un'architecture body (riga 14-34), la prima inerente all'interfaccia (interface) del componente quindi alle porte di input e output. La seconda invece definisce la funzione dei componenti. Inoltre possono esistere diverse possibili architetture per la stessa entity.
How it worksPerché il nostro led lampeggi abbiamo bisogno di dividere la frequenza di clock del FPGA attraverso un contatore binario, ma di quanti bits? Non dobbiamo contare fino a notiamo così che l'array standard logic avrà bisogno di un minimo di 27 bits.
Il contatore viene incrementato sul fronte di salita del clock fino a quando non è minore del valore LibraryCome nei linguaggi di programmazione possiamo utilizzare delle librerie e dei packages che aggiungono funzionalità al VHDL standard. I package e le librerie sono moduli che possono contenere porzioni di codice isolate dal resto della descrizione con lo scopo di rendere il codice riutilizzabile. Le entity, le architecture, i package, i package body e la configuration prendono il nome di design units. Un modello praticamente è fatto di design units al cui interno si costruisce la descrizione dettagliata del sistema. Ad esempio la LIBRARY IEEE contiene i seguenti packages:
I package contengono quindi le definizioni di tutti i tipi di variabili, degli operatori aritmetici e relazionali nonché alcune funzioni di importanza rilevante, come quelle di conversione (in interi, in std_logic e std_logic_vector, in interi con o senza segno, in bit e bit_vector). Entity declarationIl design entity inizia con la dichiarazione dell'entity definendone innanzitutto il nome che però non deve contenere spazi bianchi e caratteri speciali o iniziare con numeri. Se doveste usare un editor esterno , ad esempio SublimeText, il nome della entity e del file dovranno coincidere quando importate il file .vhd in un progetto su ISE Design. Con l’istruzione Port dichiariamo le porte di input e output dell’interfaccia.
Notiamo come dopo la dichiarazione dell'ultimo segnale non va messo il punto e virgola (;), ma nell'ultima parantesi rotonda chiusa a indicare il fatto che è l'ultima dichiarazione dell'entity. Nel nostro caso vogliamo far lampeggiare un Led, quindi avremmo come input il clock (riga 10) e come output il led (riga 11). Architecture bodyDopo aver definito l’interfaccia di una design entity, si passa alla descrizione di un'architettura cioè al funzionamento interno del sistema .
ProcessIl process body, nonostante sia un insieme di istruzioni sequenziali (sequential staments), viene considerato come un'unica operazione concorrente ed è alla base delle descrizioni comportamentali. Solo alle istruzioni sequenziali sono concesse le assegnazioni <= in quanto l'assegnazione di un signale viene considerata sequenziale all'interno di un processo. All’interno di un processo è possibile definire dei tipi, delle costanti, delle variabili che sono locali al processo e quindi invisibili ad altri processi o statements concorrenti dell’architettura. Un processo è composto da tre parti:
Prima abbiamo importato la libreria standard IEEE 1164 che ci permette di utilizzare le due funzioni: rising_edge() e falling_edge() che assumono valore true quando il segnale utilizzato come argomento delle funzioni effettua un fronte di salita o di discesa. Step 4 - Create Schematic SymbolNella barra laterale di ISE Design Suite selezioniamo il codice VHDL da convertire in Simbolo e in seguito a selezionare per aggiungerlo al nostro schematico. Per sicurezza converebbe anche fare prima un Check Syntax. In basso alla barra laterale di sinistra abbiamo diverse tab come Design, Files, Libraries, noi andremo a clicckare su Symbols dove selezioneremo dalla path del nostro progetto il simbolo appena realizzato. In categories ritroveremo la path d'installazione del nostro progetto selezionandola su Symbols apparirà il simbolo appena creato.
Come best practice mia personale quando inserisco I/O Marker scelgo di dare nomi in minuscolo per gli input e in maiuscolo per gli Output. Così facendo è più facile distinguerli scrivendo l'user contraits file UCF. Step 5 - Implementation Contraits Filea) Facciamo Right click su xc7a100t-1csg324 e selezioniamo New Source infine “Implementation Constraints File” e nominiamolo ad esempio “pinMapBlink”. In questo file imposteremo il pin-map del FPGA come gl'inputs, gli outputs ed il clock. Ci sono altri modi per farlo come ad esempio l'utilizzo di PlanAhead Design, ma preferisco questo metodo perché con pochi in-outputs è il più veloce.
Step 6 - SintesiLa sintesi ,detta anche compilazione, è il passaggio da una descrizione ad alto livello (comportamentale) ad una a bassa livello (net-list) ossia a livello di gates anche attraverso l'utilizzo del sintetizzatore di altre aziende non limitando la portabilità del VHDL. Infine l'elaborato della sintesi prende il nome di net-list attraverso un programma di place e routing, è in grado di generare il codice bitstream da inserire nel FPGA. Step 7 - Upload del codicePer l'implementazione del bit-code su FPGA vi consiglio il framework di Digilent Adept 2 selezionando il file con estensione .bit che avete generato dopo la sintesi che troverete nella path folder d'installazione del progetto. Step 8 - Hello world!Ed ecco il risultato finale con il led che lampeggia nella locazione (U3) che avevamo scelto nel nostro contraits file. Volendo sapere per quanto tempo il led rimane acceso o spento ci basta calcolare:
Ora dobbiamo dividere il risultato ottenuto per la frequenza di clock del FPGA cioè 100.000.000 di oscillazioni al secondo
Moltiplichiamo il risultato
Se controlliamo il led dovremmo vedere che lampeggia una volta ogni 1,3 secondi (spento-acceso o acceso-spento) e 2,7 secondi per un loop completo (da spento-spento o da acceso-acceso). E la frequenza?
BibliografiaNexys FPGAs |