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 “architecure”.
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, da un punto di vista del tutto generale, descrivere il comportamento di un sistema digitale.
work in progress
Il file inverter.vhd nella directory Desktop/ghdl/inverter contiene sia la dichiarazione di entità sia le architetture “lenta” e “veloce”.
