Esercitazione su Three State e Bus

Lo scopo di questa esercitazione e' quello di imparare ad utilizzare le entita' VHDL le cui uscite sono di tipo three state. Queste uscite possono assumere valore '0', '1' o andare in uno stato di alta impedenza. La prima cosa da fare, per imparare a gestire i dispositivi a tre stati, e' leggere alcune note che contengono le nozioni sui meccanismi VHDL per dichiarare e usare segnali di tipo std_logic e std_logic_vector. Se questa lettura vi lascia qualche dubbio potete tornare a leggere la parte relativa (paragrafi 6.1, 6.2) presente sul manuale del VHDL e poi consultare il codice della libreria std_logic_1164. Dopo aver fatto questo, tenendo sempre presente quanto imparato sul sistema GM VHDL si svolgano le seguenti attivita':

Questa sezione, insieme alle precedenti, forniscono tutti gli elelmenti di base necessari per costruire modelli VHDL anche complessi assemblando i componenti predefiniti contenuti nelle librerie presentate (vedi sotto). In particolare si provi almeno una volta ad eseguire uno dei test automatizzati. Assicurarsi di aver capito il meccanismo del simulatore sve per salvare su file con Save Trace i valori di una traccia. Questo si ottiene clickando sulla traccia da salvare e poi su Save Trace. Il nome della traccia selezionata cambia colore e ci viene chiesto il nome del file in cui salvare i dati. Il nome da dare e' indicato nel file .txt che accompagna il test. Veniamo dunque ad alcuni esercizi conclusivi su i modelli VHDL.


Esercizi per la prova di Laboratorio

Per svolgere questi esercizi e' bene avere sottomano tutte le librerie presentate nel corso delle varie esercitazioni. Riassumiamo brevemente la lista dei componenti e delle librerie disponibili:


Libreria Vector

Nella libreria vector.o e' presente il package functions che contiene le principali operazioni sui bit_vector.


Libreria IEEE

Nella libreria IEEE e' presente il package std_logic_1164 che contiene le principali operazioni sui tipi std_logic e std_logic_vector.


Porte

Porte and or not nand nor xor xnor a 2 e a n ingressi con ritardo tpd parametrico le troviamo nel file gmgates.o. Qui abbiamo ad esempio:

entity xorg_n is
    generic (n:integer; tpd : time);
    port (inp:bit_vector(n-1 downto 0):=(others => '0'); out1:out bit := '0' );
end xorg_n;

Si noti che queste architetture usano la libreria vector.o


Half adder

E' disponibile nel file hag.o un half adder generico rispetto al ritardo introdotto (delay):

entity ha is
 generic(delay:time); 
 port (a,b: in bit; s,r: out bit); 
end ha;


Full adder

E' disponibile nel file fulladdg.o un full adder generico rispetto al ritardo introdotto (delay):

entity fa is
 generic(delay:time);
 port (a,b,carry: in bit; s,r: out bit); 
end fa;


Incrementatore

Entita' con un bus di n bit di ingresso (in_bus) ed un bus di n bit in uscita (out_bus). La rete fornisce in uscita gli n bit del numero che si ottiene aumentando di 1 l' ingresso. Se l' ingresso e' 2**n-1 l' uscita sara' 0. Il ritardo delay e' un parametro generico che da il ritardo massimo con cui il componente risponde a variazioni sugli ingressi. Ovvero, quando varia uno degli ingressi per un tempo delay l' uscita e' impredicibile ma, dopo tale tempo, l'uscita diventa stabile e corretta.

entity inc_n is generic(n:positive; delay:time);
    port(in_bus:bit_vector(n-1 downto 0);out_bus:out bit_vector(n-1 downto 0)); 
end inc_n;

[contenuta nel file incg.o]


Semisommatore BCD

E' disponibile nel file ha_bcd.o un semisommatore (Half-adder) BCD. Il componente ha due ingressi A,B a 4 bit che rappresentano due cifre tra 0 e 9. Le due uscite S,R sono due uscite a 4 bit che rappresentano ancora due numeri tra 0 e 9. L' uscita S e' la cifra decimale meno significativa della somma ed R e' la cifra piu' significativa o riporto.

entity ha_bcd is
 port (A,B: in bit_vector(3 downto 0); S,R: out bit_vector(3 downto 0)); 
end ha_bcd;


Flip Flop SR

E' disponibile nel file sr.o un modello di flip flop asincrono di tipo SR generico. Il parametro generico delay rappresenta il ritardo introdotto dal dispositivo tra il comando, set o reset, imposto con gli ingressi s e r e l' adeguamento delle uscite q e not_q. L' interfaccia sara':

entity sr is generic(delay:time); port(s,r:bit; q,not_q:out bit); end sr;




Flip Flop D

E' disponibile un modello di un flip flop sincrono di tipo D (H e' l' ingresso di clock). L' ingresso D e' campionato sul fronte di salita di H e il valore trovato viene riportato sull' uscita Q dopo un ritardo delay.

entity DFF is  generic(delay:time);
  port (D,H:in bit; Q:out bit);  
end DFF;

[presente nel file ffg.o]


Flip Flop T

E' disponibile un modello di un flip flop sincrono di tipo T (H e' l' ingresso di clock). Se T='1' l' uscita Q cambia stato ad ogni fronte di salita del clock H, dopo un tempo delay da detto fronte. Se T='0' il flip flop conserva il suo stato. Se CLR='1', quando interviene un fronte di salita, allora l' uscita viene portata a 0 dopo un tempo delay dal fronte di salita.

entity TFF is  generic(delay:time);
  port (H,T:in bit; CLR:in bit; Q:out bit);  
end TFF;

[presente nel file ffg.o]


Registro con ritardo

E' disponibile un registro di memorizzazione in cui i dati vengono immagazzinati campinandoli sulle n linee del bit_vector in_bus e vengono presentate in uscita sulle n linee del bit_vector out_bus. Il processo di campionamento dell' uscita e' controllato dall' ingresso di clock ck. Il bus di ingresso e' campionato sul fronte di salita dell' ingresso di clock e l' uscita assume il valore campionato dopo un ritardo delay.

entity NDFF is generic(n:positive; delay:time);
  port (ck: bit; 
    in_bus: bit_vector(n-1 downto 0);
        out_bus: out bit_vector(n-1 downto 0) );
end NDFF;

[presente nel file ffg.o]


Registro master slave senza ritardi

In questo registro di memorizzazione i dati vengono immagazzinati campinandoli sulle n linee del bit_vector in_bus e vengono presentate in uscita sulle n linee del bit_vector out_bus. Il processo di campionamento dell' ingresso e di abilitazione all' uscita e' controllato da un ingresso di clock ck. L' ingresso e' campionato sul fronte di salita di ck e viene riportato sull' uscita sul fronte di discesa di ck. Non avendo ritardi, questo registro e' da usarsi tutte le volte che si vuol fissare esattamente nel tempo l' uscita di un segnale

entity gpr is generic(n:natural);
  port (ck: bit; 
    in_bus: bit_vector(n-1 downto 0);
        out_bus: out bit_vector(n-1 downto 0) );
end gpr;

[presente nel file ffg.o]


Clock

L'entita' clock genera sull' uscita ck una onda quadra di periodo T. L' entita' e' generica rispetto al periodo T del clock e rispetto alla durata fi dell' impulso di clock. L' onda parte da '0' e ivi permane per un tempo T-fi

entity clock is generic(T:time;fi:time);
 port ( ck: out bit');
end clock;

[presente nel file clock.o]


Demultiplexer a 4 bus di uscita

Demultiplexer con quattro bus di uscita a n bit o_00, o_01, o_02, o_03, due linee di selezione organizzate in un bit_vector sel. e. L' ingresso in_bus e' un bit_vector a n bit. Il ritardo delay e' un parametro generico ed e' il ritardo massimo con cui il componente risponde a variazioni sugli ingressi. Ovvero, quando varia uno degli ingressi, per un tempo delay, l' uscita e' impredicibile. Dopo tale tempo l'uscita sara' stabile e corretta.

entity dmpxm is generic(n:positive;delay:time);
  port (sel: bit_vector(1 downto 0); 
     o_00: out bit_vector(n-1 downto 0); -- da  in_bus se sel(1)=0 sel(0)=0
     o_01: out bit_vector(n-1 downto 0); -- da  in_bus se sel(1)=0 sel(0)=1
     o_10: out bit_vector(n-1 downto 0); -- da  in_bus se sel(1)=1 sel(0)=0
     o_11: out bit_vector(n-1 downto 0); -- da  in_bus se sel(1)=1 sel(0)=1
         in_bus: bit_vector(n-1 downto 0) );
end dmpxm;

[disponibile nel file ssi.o]


Demultiplexer a 2 bus di uscita

Demultiplexer con due bus di uscita a n bit o_0, o_1, un bit di selezione sel e n bit nell' ingresso in_bus. Il ritardo delay e' un parametro generico ed e' il ritardo massimo con cui il componente risponde a variazioni sugli ingressi. Ovvero quando varia uno degli ingressi per un tempo delay l' uscita e' impredicibile ma dopo tale tempo l'uscita sara' stabile e corretta.

entity dmpxm2 is generic(n:positive;delay:time);
  port (sel: bit; 
     o_0: out bit_vector(n-1 downto 0); -- da  in_bus se sel=0
     o_1: out bit_vector(n-1 downto 0); -- da  in_bus se sel=1
         in_bus: bit_vector(n-1 downto 0) );
end dmpxm2;

[disponibile nel file ssi.o]


Multiplexer a 4 bus di ingresso

Multiplexer con quattro bus di ingresso a n bit in_00,in_01,in_02,in_03, due linee di selezione organizzate in un bit_vector sel e n bit nella uscita out_bus. Il ritardo delay e' un parametro generico ed e' il ritardo massimo con cui il componente risponde a variazioni sugli ingressi. Ovvero quando varia uno degli ingressi per un tempo delay l' uscita e' impredicibile ma dopo tale tempo l'uscita sara' stabile e corretta.

entity mpxm is generic(n:positive;delay:time);
  port (sel: bit_vector(1 downto 0); 
    in_00: bit_vector(n-1 downto 0); -- su out_bus se sel(1)=0 sel(0)=0
    in_01: bit_vector(n-1 downto 0); -- su out_bus se sel(1)=0 sel(0)=1
    in_10: bit_vector(n-1 downto 0); -- su out_bus se sel(1)=1 sel(0)=0
    in_11: bit_vector(n-1 downto 0); -- su out_bus se sel(1)=1 sel(0)=1
        out_bus: out bit_vector(n-1 downto 0) );
end mpxm;

[disponibile nel file ssi.o]


Multiplexer a 2 bus di ingresso

multiplexer con due bus di ingresso a n bit in_0,in_1 una linea di selezione sel e n bit nella uscita out_bus. Il ritardo delay e' un parametro generico ed e' il ritardo massimo con cui il componente risponde a variazioni sugli ingressi. Ovvero quando varia uno degli ingressi per un tempo delay l' uscita e' impredicibile ma dopo tale tempo l'uscita sara' stabile e corretta.

entity mpxm2 is generic(n:positive;delay:time);
  port (sele: bit; 
    in0: bit_vector(n-1 downto 0); -- su out_bus se sel(0)=0 
    in1: bit_vector(n-1 downto 0); -- su out_bus se sel(1)=1
    o_bus: out bit_vector(n-1 downto 0) );
end mpxm2;

[disponibile nel file ssi.o]


Decodificatore 1 su 2**n

Componente con n linee in ingresso e 2**n linee in uscita. Una sola di tali linee e' a '1', La linea da mandare a '1' e' quella indicate dal numero binario presente su sel. Cosi' se n=3 e sel=000 viene mandata a '1' la linea 0. se sel=010 va a '1' la linea 2 e cosi' via. Questa entita' ha una architettura che usa il package functions nella libreria vector.

entity decoder is generic(sel_lines:positive; delay:time); 
  port (sel: in bit_vector (sel_lines-1 downto 0);
        out_bus: out bit_vector ((2**sel_lines)-1 downto 0));
end decoder;

[disponibile nel file ssi.o]


Driver three state

Questo dispositivo, a livello circuitale, e' costituito da un interruttore posto tra l' ingresso in_b di tipo bit e l' uscita out_bz di tipo std_logic. Un altro ingresso CE comanda l' interruttore. Quando CE=1 viene stabilito il collegamento e in_b sara' collegato a out_bz. Quando CE=0 invece la linea di uscita e' portata allo stato di alta impedenza. Tutte le commutazioni, sia quelle causate da CE, sia quelle causate da variazioni su in_b, si propagano all' uscita con un ritardo delay.

entity ts_driver is generic(delay:time);
  port (CE: bit;in_b: bit; out_bz: out std_logic );
end ts_driver;

[disponibile nel file ts.o]


Driver three state per n linee

Questo dispositivo e' costituito da una batteria di n driver del tipo precedente. L' interfaccia sara':

entity ts_driver is generic(n:positive; delay:time);
  port (CE: bit;in_bus:bit_vector(n-1 downto 0); out_bus:out std_logic_vector(n-1 downto 0));
end ts_driver;

[disponibile nel file tsg.o]

Appunti a cura di morando@disi.unige.it