VHDL è il linguaggio di descrizione dell’hardware più utilizzato, insieme a Verilog, in elettronica digitale per la progettazione di circuiti. Esso permette di modellare sistemi hardware, dotati di ingressi e uscite, che interagiscono tra di loro per mezzo di segnali.

Questo articolo nasce dall’esigenza di mettere in piedi un ambiente di sviluppo quanto più possibile essenziale, senza dover ricorrere ad IDE elaborati quali ISE WebPACK e ModelSim.

Colui che si appresta a creare, in ambito accademico o amatoriale che sia, piccoli progetti di elettronica, IMHO, ha bisogno di un ambiente di sviluppo semplice e immediato. La soluzione alternativa, open source e multipiattaforma, che ho avuto modo di utilizzare è stata l’accoppiata GHDL/GTKWave.


GHDL (G Hardware Design Language)

GHDL è un simulatore e compilatore per il linguaggio VHDL che, attraverso l’uso di GCC, si occupa di tradurre file VHDL in codice macchina. L’ultima versione è disponibile sul sito ufficiale. Una volta installato avremo accesso al compilatore attraverso il comando ghdl.

N.B. La versione per Windows di GHDL è basata su un generatore di codice interno e non su GCC.

Analisi

Uno dei comandi fondamentali è il comando di analisi. Esso consente di compilare ed analizzare il contenuto di uno o più file VHDL in cerca di eventuali errori sintattici.

ghdl -a [VHDL_FILES]

L’analisi verrà arrestata in caso vi sia un errore nel file corrente e i file successivi non verranno analizzati. In caso non vi siano errori verrà generato un file oggetto, contentente informazioni di cui GHDL necessita.

Esecuzione

Per poter procedere con una simulazione abbiamo bisogno del file di test-bench relativo al componente di cui vogliamo testare il funzionamento. Una volta creato il file basterà analizzarlo e lanciare il comando di esecuzione specificando alcuni particolari parametri.

ghdl -r TEST_BENCH_ENTITY_NAME --stop-time=SIMULATION_TIME --wave=WAVEFORM_FILE.ghw

Il parametro TEST_BENCH_ENTITY_NAME indica il nome dell’entità di test-bench. I parametri SIMULATION_TIME e WAVEFORM_FILE, invece, indicano rispettivamente il tempo di simulazione e il nome del file che conterrà le informazioni relative ai segnali messi in moto dal processo di simulazione.

Il mio consiglio è quello di settare un tempo di simulazione in linea con il test-bench, poiché un valore elevato comporterà un maggiore tempo necessario per l’esecuzione della simulazione.

GHDL non si limita ovviamente alle sole funzioni viste fino ad ora. A tal proposito vi rimando alla guida utente presente sul sito del progetto.


GTKWave

GTKWave è un visualizzatore di onde che supporta vari formati. Sul sito ufficiale è disponibile il download delle diverse versioni del programma.

In sostanza esso sarà utile durante l’analisi degli andamenti temporali dei segnali coinvolti nel test-bench. I dati sono contenuti nel file GHW ottenuto al termine del processo di simulazione.


Esempio: Half-Adder

Il circuito addizionatore di base per eccellenza è l’half-adder. Esso restituisce, dati due bit $A$ e $B$, la loro somma $S$ ed un eventuale riporto $C_{out}$.

Progettazione

Il suo funzionamento è riassunto nella seguente tabella di verità.

Osservandola si nota subito che i due segnali di output corrispondono a delle funzioni logiche note, ossia la XOR e la AND.

Per approfondimenti sull’argomento Algebra Booleana vi consiglio la lettura del relativo articolo su Wikipedia.

Risulta semplice, a questo punto, realizzare questo circuito mediante VHDL.

library IEEE ;
use IEEE.std_logic_1164.all;

entity HALFADDER is
    port (
        A, B     : in std_logic;
        S, C_out : out std_logic);
end HALFADDER;

architecture HA of HALFADDER is
begin -- Behavioral description
    S <= A xor B;
    C_out <= A and B;
end HA;

Il test sul componente verrà eseguito utilizzando le 4 possibili sequenze di input riportate nella tabella di verità esaminata in precedenza.

library IEEE;
use IEEE.std_logic_1164.all;

entity HALFADDER_TB is
end HALFADDER_TB;

architecture HA_TB of HALFADDER_TB is
    signal A_SGN     : std_logic;
    signal B_SGN     : std_logic;
    signal S_SGN     : std_logic;
    signal C_out_SGN : std_logic;

    component HALFADDER is
        port (
            A, B     : in std_logic;
            S, C_out : out std_logic);
    end component;
begin
    HA: HALFADDER port map (A_SGN, B_SGN, S_SGN, C_out_SGN);

    HA_TB1: process
    begin
        A_SGN <= '0';
        B_SGN <= '0';
        wait for 5 ns;
        A_SGN <= '1';
        wait for 5 ns;
        A_SGN <= '0';
        B_SGN <= '1';
        wait for 5 ns;
        A_SGN <= '1';
        B_SGN <= '1';
        wait for 5 ns;
    end process;
end HA_TB;

Analisi e Test

I file VHDL vanno innanzitutto compilati e analizzati.

Compilazione e Simulazione con GHDL

Una volta superata questa fase si procede con la simulazione.

Compilazione e Simulazione con GHDL

A questo punto bisogna solamente aprire il file HA_WAVE.ghw con GTKWave e:

  1. Selezionare il livello di test-bench dal riquadro SST;
  2. Selezionare i segnali da analizzare e dare conferma attraverso il pulsante Append per importarli nel riquadro Waves.

Analisi con GTKWave

Per ogni segnale di ingresso e uscita verrà visualizzato il relativo andamento temporale. Spetta ora al “progettista” il compito di analizzare questi dati e verificare il corretto funzionamento del componente. Come è subito possibile constatare, l’half-adder appena testato funziona a dovere.


Extra

A coloro i quali utilizzano, come il sottoscritto, Sublime Text consiglio il package Sublime VHDL. Oltre ad avere a disposizione l’evidenziazione della sintassi, il build system integrato è configurato per eseguire il comando di analisi di GHDL.