This is an old revision of the document!
Esempio di simulazione in VHDL ( strumenti software: GHDL e gtkwave)
L'esempio in questa pagina è inteso come una prima guida introduttiva ed esemplificativa per chi non conosce il VHDL. La discussione è pertanto necessariamente incompleta e, a tratti, approssimativa.
Descrizione di un inverter in VHDL
Una unità logica (un sistema con un certo numero di ingressi e di uscite) in VHDL viene chiamata “entity”. La descrizione di una entity prevede un primo blocco di codice nel quale si dichiara il nome che invididua la “entity” e i collegamenti verso l'esterno della entity. In una secondo blocco di codice si descrive il comportamento della “entity”. Il blocco di codice che descrive il comportamento di una entity si chiama “architecture”.
Per definire una “entity” che possa essere usata per descrivere un inverter dobbiamo semplicemente dire che si tratta di una unità logica che prevede un ingresso e una uscita. Il codice seguente definisce tale unità.
entity inverter is port(a:in bit; y:out bit); end entity inverter;
Come si vede, la dichiarazione di “entity” (che chiameremo da ora in poi entità) è piuttosto semplice.
Nella prima riga si dichiara l'entità di nome “inverter” e si dice che essa è (“is”) uno scatolo (al momento “vuoto”) con un ingresso (“a”) e una uscita (“y”). Il fatto che “a” sia un ingresso è specificato con la parola chiave “in” dopo i due punti; allo stesso modo si specifica che “y” è una uscita usando la parola chiave “out” dopo i due punti. Semplificando molto, le porte (“a” e “y”) sono gli elementi di connessione dell'entità appena definita con altre entità per il tramite di oggetti che in VHDL prendono il nome di “signal” (segnale/segnali). Semplificando al massimo, i “signal” sono l'equivalente dei fili di collegamento fra dispositivi logici reali. In realtà i “signal” VHDL sono oggetti più complessi e possono assumere natura diversa. Per questa ragione è necessario specificare quale “tipo” di segnali si prevede che siano collegati alle porte. Nel nostro esempio i segnali collegabili alle porte sono di tipo “bit”. Il tipo “bit” è un tipo predefinito per enumerazione, con due soli valori possibili corrispondenti ai simboli '0' e '1'.
Successivamente alla dichiarazione di entità, in uno stesso file di testo o in un file differente, bisogna specificare il comportamento dell'entità stessa. Nel linguaggio VHDL questo risultato si ottiene specificando almeno una “architecture” (architettura) per l'entità. Notiamo esplicitamente che ad una singola unità possono corrispondere più architetture. All'atto dell'effettivo utilizzo dell'entità come parte di un sistema più complesso, il VHDL prevede meccanismi per specificare a quale delle architetture definite per l'entità si deve fare riferimento. Per fissare le idee potremmo pensare di definire due architetture, una che si riferisce al caso di prestazioni ottimali in termini di velocità (chiameremo questa architettura “veloce”) e una che si riferisce al caso in cui nella realtà si dovessero ottenere prestazioni peggiori (chiameremo questa architettura “lenta”). Quello che segue è il codice che specifica le due architetture, che si può pensare di includere nello stesso file di testo che definisce l'entità, subito dopo la definizione dell'entità.
architecture veloce of inverter is begin fai:process (a) begin if (a='0') then y<='1' after 5 ns; else y<='0' after 7 ns; end if; end process fai; end architecture veloce; architecture lenta of inverter is begin fai:process (a) begin if (a='0') then y<='1' after 10 ns; else y<='0' after 14 ns; end if; end process fai; end architecture lenta;
Facciamo ora riferimento a una sola delle due architetture (per esempio l'architettura “lenta”) e, prima di entrare nel dettaglio del codice VHDL, riflettiamo un momento su quello che significa descrivere il comportamento di un sistema digitale. Per semplicità riferiamoci, per il momento, al caso di sistemi digitali combinatoriali. Se l'ingresso (o gli ingressi)di un sistema combinatoriale restano costanti nel tempo a partire da un certo istante $t_1$, possiamo essere certi che a partire da un certo istante $t_2>t_1$, una volta che siano completamente estinti i transitori conseguenti all'ultima variazione degli ingressi, possiamo essere certi che l'uscita non si modificherà. Solo se dovessero cambiare gli ingressi, potrà succedere che le uscite, nei tempi derivanti dalla struttura interna del circuito, si modificheranno.
I blocchi “process” costituiscono il cuore di ogni architettura e rendono possibile la descrizione del comportamento di un blocco logico secondo la sequente modalità. Ciscun process ha una “sensitivity list”, ovvero un elenco di porte o di segnali ai quali risulta “sensibile”. Nel caso del nostro esempio la “sensitivity list” è composta dalla soloa porta di ingresso “a”. In VHDL si dice che un process si “attiva” se uno dei componenti della sensitivity list cambia di valore. Fin tanto che nessuno degli oggetti che compongono la sensitivity list cambia valore, il processo rimane inattivo.
work in progress……..
Il file inverter.vhd nella directory Desktop/ghdl/inverter contiene sia la dichiarazione di entità sia le architetture “lenta” e “veloce”.
