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.
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:
Nella libreria vector.o e' presente il package functions che contiene le principali operazioni sui bit_vector.
Nella libreria IEEE e' presente il package std_logic_1164 che contiene le principali operazioni sui tipi std_logic e std_logic_vector.
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
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;
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;
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]
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;
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;
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]
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]
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]
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]
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 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 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 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 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]
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]
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]
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