VHDL
Appunti di lezione
Modulo 3
Sistemi Digitali (Controlli)
Prof. Francesco Sforza
1
Sommario
1.
Elementi di base del linguaggio VHDL. ............................. 3
1.1.
Ex Or a “componenti discreti” facendo uso di signal
(descrizione DATA FLOW).......................................................... 6
1.2.
Flip Flop
Set Reset .................................................................. 7
1.3.
Flip Flop
D Latch .................................................................... 8
1.4.
Flip Flop
D Latch “Behavioral” ............................................. 9
1.5.
Flip Flop
J/K
1.6.
Flip Flop
D Master Slave ...................................................... 11
1.7.
Flip Flop
D Master Slave (“Behavioral”)............................ 12
“Behavioral”.............................................. 10
2.
Circuiti combinatori complessi .............................................. 13
3.
Algorithmic State Machines in VHDL............................ 17
4.
Descrizione strutturale .......................................................... 21
5.
Pilotaggio motore passo - passo ........................................... 25
2
Con il linguaggio (V)HDL si descrivono i circuiti con un: Very
(High Scale of Integration Circuits ) Hardware Description
Language.
I circuiti creati con il VHDL serviranno a 2 scopi :
la simulazione
il fitting
1.
Elementi di base del linguaggio VHDL.
I circuiti normalmente vengono descritti tramite due strutture
interconnesse: l’ENTITY e l’ ARCHITECTURE.
Tramite l’ENTITY viene definita l’interfaccia esterna del circuito
che si vuole creare, cioè vengono definiti i pin (che verranno
chiamati PORT) di ingresso e di uscita del circuito.
Tramite l’ARCHITECTURE si definisce il funzionamento interno
del circuito. Esistono diversi stili di scrittura: i fondamentali sono
3: STRUCTURAL, BEHAVIORAL, DATA FLOW.
N.B. ogni riga di codice andrà conclusa con il punto e virgola.
ENTITY
La sintassi per introdurre una ENTITY
costrutto:
ENTITY …… IS PORT (
Nome_pin_uscita : OUT
Nome_pin_ingresso : IN
richiede
il seguente
BIT;
BIT);
END … ;
Quando si vogliono usare simboli maggiormente flessibili dei bit si
ricorre alle standard_logic; sono così disponibili i valori 0, 1,
FALSE, TRUE, LOW, HIGH, X, Z.
Per richiamare la libreria che li contiene sarà necessario far precedere
la dichiarazione di ENTITY dalle seguenti 2 linee di programma:
3
LIBRARY ieee;
USE ieee.std_logic_1164.all;
In questo caso si possono usare per le uscite le espressioni BUFFER
e INOUT; BUFFER sta a significare che il pin è pilotato da un F/F
ed è disponibile per essere riportato ad un nodo interno; INOUT sta
a significare che il pin può essere usato come pin di ingresso e/o di
uscita.
ARCHITECTURE
La sintassi per introdurre una ARCHITECTURE è la seguente:
ARCHITECTURE
…… of …… is
begin
………………
end ……;
Lo stile che verrà usato dopo il begin farà rientrare il vostro
progetto in una delle tre categorie citate precedentemente:
STRUCTURAL, BEHAVIORAL, DATA FLOW; questo stile
dipenderà dai gusti individuali, dalle necessità del progetto (in
particolare se sviluppato da più persone contemporaneamente), dalle
risorse disponibili, dall’orientamento verso la simulazione piuttosto
che non verso il fitting.
Descrizioni behavioral e Data Flow
Nella descrizione DATA FLOW l’architecture viene espressa
avendo molto chiaro l’esatto aspetto circuitale del sistema che si
vuole realizzare
In questo tipo di rappresentazione viene rappresentato il cammino
delle informazioni all’interno dell’hardware, da cui il nome: “flusso
dei dati”
A questo proposito sono utili e necessari i nodi circuitali interni: i
così detti SIGNAL.
Si noti bene che nell’entity compaiono solo i pin (PORT) che si
affacciano esternamente al circuito. I SIGNAL sono nodi elettrici
effettivamente presenti nel circuito, ma non visibili all’esterno;
vengono dichiarati all’interno dell’architecture, prima del begin, e
4
devono essere dello stesso tipo dei pin di IN e OUT, normalmente
std_logic oppure bit.
SINTASSI: SIGNAL nome,[nome] : std_logic;
Nella descrizione BEHAVIORAL
l’architecture
descrive il
funzionamento del sistema, prescindendo dall’eventuale aspetto
circuitale che esso potrà assumere, l’enfasi è posta tutta sulla
modalità di funzionamento (“behavior”) e sui pin “sensibili” che il
circuito potrà presentare; a questo proposito va ricordato che due
categorie di pin d’ingresso si distaccano grandemente da tutti gli
altri: i pin di clock e i pin di Chip Select (comunque i pin che
pilotano il 3_STATE sulle uscite).
Si pensi al clock di un F/F master slave: solo se esso è attivo avrà
senso l’insieme dei segnali presenti sugli altri pin d’ingresso!!!
Nella descrizione BEHAVIORAL compariranno elementi tipici dei
linguaggi di programmazione ad alto livello quali le strutture di
controllo del flusso di programma: i cicli FOR, gli IF, i CASE.
Parallelamente si farà esteso ricorso ai PROCESS, cioè ai dei
sottoprogrammi che descriveranno il funzionamento del circuito (o
parte di esso) quando avviene un cambiamento su un particolare pin
(o signal interno).
RIFERIMENTI:
Il costrutto CASE compare nel punto 8 a pag. 12 (ASM –
automi)
Il costrutto IF compare ai punti 5 e 6 , pag. 7 e seguenti
Il costrutto FOR non è illustrato in questo volumetto.
PROCESS: esempi di process appaiono ai punti 6, 8, 9 da pag. 7
in avanti.
N.B. la descrizione strutturale viene trattata da pag. 21
5
1.1. Ex Or a “componenti discreti” facendo uso
di signal (descrizione DATA FLOW)
Nel nostro primo listato VHDL è descritta una porta ex or vista
come un circutito, quello che appare in figura; vengono introdotti
due SIGNAL (cioè nodi circuitali non associati a dei pin) x e z
Descrizione data flow
entity xor is port
(a,b: in bit;
y1,y2: out bit);
end xor;
architecture pippo of xor is
signal x,z: bit;
begin
x<=not (a) and b;
z<=a and not(b);
y1<=x or z;
descrizione behavioral
entity xor is port
(a,b: in bit;
y2: out bit);
end xor;
architecture pippo of xor is
begin
y2 <=a xor b;
end pippo;
y2<=a xor b;
end pippo;
Ex Or “Behavioral”
La port logica Ex Or può più comodamente essere descritta in base al
suo funzionamento, cioè al suo comportamento (“behavior” in
inglese); il listato VHDL si semplifica grandemente.
6
1.2. Flip Flop
Set Reset
Il circuito rappresentato in figura verrà poi descritto da una entity di
tipo DATA FLOW, infatti le uscite saranno rappresentate da
equazioni booleane che fanno esplicito riferimento alla struttura del
circuito del flip flop.
BUFFER: le uscite del F/F Set Reset vengono utilizzate non solo
come pin di pura uscita in quanto pilotano gli ingressi delle nand;
una uscita che viene retroazionata per pilotare un nodo interno deve
essere descritta da un BUFFER oppure da una INOUT:
Per usare le uscite di tipo BUFFER utilizziamo la libreria standard
logic.
library ieee;
use ieee.std_logic_1164.all;
entity SR is port(
in s,r:
std_logic;
q,qn: buffer std_logic);
end SR;
architecture funz of SR is
begin
q <= qn nand s;
qn <= q nand r;
end Enzo;
7
1.3. Flip Flop
D Latch
Anche il circuito seguente viene descritto da una architecture di tipo
DATA FLOW.
library ieee;
use ieee.std_logic_1164.all;
entity ff_d is port(
din, clock: in std_logic;
q, qn: buffer std_logic);
end ff_d;
architecture enzo of ff_d is
signal s1, s2, s3: std_logic;
begin
s1<=not (din);
s2<=clock nand din;
s3<=s1 nand clock;
q<=s2 nand qn;
qn<=s3 nand q;
end enzo;
8
1.4. Flip Flop
D Latch “Behavioral”
Il Flip Flop può più comodamente essere descritto in base al suo
funzionamento, cioè al suo comportamento (“behavior” in inglese);
il listato VHDL si semplifica grandemente.
library ieee;
use ieee.std_logic_1164.all;
entity ff_d is
port
(in, clock: in std_logic;
q, qn: buffer std_logic);
end ff_d;
architecture enzo of ff_d is
begin
if clock =’1’
then q <= din; qn <= not(din);
else q <= q; qn <= qn;
--memoria
end if;
end enzo;
Occhio !!! in questo tipo di flip flop non ci sono i
trasparente quando clock è alto.
fronti, è
9
1.5. Flip Flop
J/K
“Behavioral”
Tabella di verità del Flip Flop J/K
J
K
clock
0
0
↑
0
1
↑
1
0
↑
1
1
↑
N.B. comm = commuta
Q
Qn
mem
0
1
comm
mem
1
0
comm
--Listato VHDL
library ieee;
use ieee.std_logic_1164.all;
entity ff_jk is
port
(j,k, clock: in std_logic;
q, qn: buffer std_logic);
end ff_jk;
architecture enzo of ff_jk is
begin
process (clock) begin
if (clock'event and clock ='1') then
if
(j ='1' and k ='1) then q <= qn; qn <= q;
else if (j ='0' and k ='1') then q <= '0'; qn <= '1';
else if (j ='1' and k ='0') then q <= '1'; qn <= '0';
end if;
end if;
end if;
else q <= q; qn <= qn;
end if;
end process;
end enzo;
In figura appare il risultato della simulazione dove si ha conferma
della tabella di verità:
10
Flip Flop
1.6.
D Master Slave
Anche il circuito seguente viene descritto da una architecture di tipo
DATA FLOW.
library ieee;
use ieee.std_logic_1164.all;
entity ff_d is
port
(din, clock: in std_logic;
q, qn: buffer std_logic);
end ff_d;
architecture enzo of ff_d is
signal s1, s2, s3, s4, s5, s6, s7: std_logic;
begin
s1<=not (din);
s2<=clock nand din;
s3<=s1 nand clock;
s4<=s2 nand s5;
s5<=s3 nand s4;
s6<=not(clock) nand s4;
s7<=not(clock) nand s5;
q<=s6 nand qn;
qn<=s7 nand q;
end enzo;
La posizione dei SIGNAL è abbastanza evidente, anche se non
riportata sul disegno.
11
1.7. Flip Flop
D Master Slave (“Behavioral”)
architecture enzo of ff_d is
begin
process (clock) begin
if (clock’event and clock =’0’)
then q <= din; qn <= not(din);
else q <= q; qn <= qn;--memoria
end if;
end process;
end enzo;
12
2.
Circuiti combinatori complessi
In questo paragrafo si analizza un DMX usato come line selector,
quindi con l’ingresso sempre a 0;quando en = 0 l’uscita selezionata
con gli ingressi s2,s1,s0 sarà = 0 e le altre saranno = 1; nel caso en
= ENABLE sia a
1 allora tutte le uscite saranno
= 1
(deselezionate).
Descrizione sequenziale
library ieee;
use ieee.std_logic_1164.all;
entity dmx is port(
en :
in std_logic;
s : in std_logic_vector (2 downto 0);
y:
out std_logic_vector(7downto 0));
end dmx;
architecture funz of dmx is
begin
process (en, s) begin
if en = '1' then y <= "11111111";
else
if s = "000" then y <= "11111110";
else
if s = "001" then y <= "11111101";
else
if s = "010" then y <= "11111011";
else
if s = "011" then y <= "11110111";
else
if s = "100" then y <= "11101111";
else
if s = "101" then y <= "11011111";
else
if s = "110" then y <= "10111111";
else
if s = "111" then y <= "01111111";
end if;end if;end if;end if;end if;end if;end if;end if;end if;
end process ;
end funz;
13
Il risultato della simulazione è il seguente:
Con l’espressione “descrizione sequenziale” si intende
una
descrizione in cui l’algoritmo fa uso di “righe di programma” che
hanno senso solo se eseguite in un preciso ordine, ad esempio in
questo caso con la serie degli IF; il tutto è racchiuso all’interno di un
“process” cosa che implica:
1) che l’insieme dei passi di cui è composto un processo, se pur
sequenziale come algoritmo, è da intendersi come eseguito nello
stesso istante
2) che il processo ha luogo solo quando si ha una variazione su uno
dei pin o signal elencati nella “sensitivity list” (posta tra parentesi
dopo la parola “process” e prima del begin).
Descizione concorrente
library ieee;
use ieee.std_logic_1164.all;
entity dmx_w is port(
en : in std_logic;
s : in std_logic_vector (2 downto 0);
y : out std_logic_vector(7downto 0));
end dmx_w;
14
architecture funz of dmx_w is
begin
y <= "11111110"
when (en ='0' and s = "000") else
"11111101"
when (en ='0' and s = "001") else
"11111011"
when (en ='0' and s = "010") else
"11110111"
when (en ='0' and s = "011") else
"11101111"
when (en ='0' and s = "100") else
"11011111"
when (en ='0' and s = "101") else
"10111111"
when (en ='0' and s = "110") else
"01111111"
when (en ='0' and s = "111") else
"11111111";
end funz;
In una “procedura concorrente” l’ordine degli statement all’interno
dell’algoritmo non è importante; le righe di programma potrebbero
essere tra loro scambiate. ATTENZIONE !!! questo non significa
che possa essere alterata la sintassi del comando usato, in questo
caso il comando “when ... else”.
In presenza di costrutti concorrenti non è necessario usare processi.
Assegnazione dei pin
Come passo finale dell’iter di progettazione è necessario operare il
così detto “fitting” del VHDL dentro un componente (ovviamente
programmabile). Useremo il programma WARP, in quanto Orcad
non è in grado di operare questa funzione.
Verrà generato anche un file .jed che servirà per la programmazione
fisica del componente (una PAL 22V10).
Vengono aggiunte nell’entity due righe di programma:
entity
port
(en :
s : in
y :
dmx_w is
in std_logic;
std_logic_vector (2 downto 0);
out std_logic_vector(7downto 0));
ATTRIBUTE part_name of dmx_w:ENTITY IS "C22v10";
ATTRIBUTE pin_numbers of dmx_w:ENTITY IS
"s(0):2 s(1):3 " --The spaces after 3 and 5 are necessary
& "s(2):4 en:5 "; --for concatenation (& operator)
--signal y(x) will be assined a pin by warp
end dmx_w;
15
1)
nella prima riga di programma
ATTRIBUTE part_name of dmx_w:ENTITY IS "C22v10";
Si assegna il tipo di componente, in questo caso una PAL 22V10
2)
nella seconda riga (n.b. la riga finisce dove c’è il punto e
virgola) si definiscono i pin veri e propri
ATTRIBUTE
pin_numbers
of
dmx_w:ENTITY
IS
"s(0):2 s(1):3 "
--The spaces after 3 and 5 are necessary
& "s(2):4 en:5 "; --for concatenation (& operator)
--signal y(x) will be assined pins by warp
Nel file di report generato da WARP
componente:
si ha la struttura del
Nel file di report si ha anche l’insieme delle equazioni che portano
alle uscite; nel nostro caso non si sono effettuate semplificazioni
(scelta possibile nella finestra “Generic Options”).
16
3.
Algorithmic State Machines in VHDL
Nel progetto che viene qui illustrato si vuole realizzare una ASM,
in italiano “un automa”, utilizzando il linguaggio VHDL.
Con la tecnica delle macchine a stati è assolutamente necessario
avere le idee molto chiare riguardo alla ASM che si intende
realizzare.
In questo capitolo faremo riferimento ad un contatore a due bit che
può operare in modo UP (conteggio in avanti) oppure in modo
DOWN (conteggio all’indietro); la selezione tra i due modi avviene
attraverso il pin “U” e può essere effettuata in ogni momento,
anche a conteggio in corso.
Di seguito è indicata la rappresentazione esterna, cioè la “scatola
nera”, del dispositivo desiderato (fig. 1)
Fig. 1
Tabella di funzionamento
U=1
A
B
0
0
1
1
0
1
0
1
U=0
17
Lo scorso anno (modulo 2) avete imparato a sviluppare lo schema
elettrico dell’ASM ricavando in un primo tempo le tabelle di
transizione degli stati, poi quelle di eccitazione ed infine i circuiti
che pilotavano i flip flop del tipo prescelto.
Il listato VHDL corrispondente è il seguente:
library ieee;
use ieee.std_logic_1164.all;
--------------------------------------------------------------entity macchina_a_stati is port
(u :in std_logic;
clk :in std_logic;
qa,qb : buffer std_logic);
end macchina_a_stati;
18
--ENTITY
architecture A_stati of macchina_a_stati is --ARCHITECTURE
type passaggi is (s0,s1,s2,s3);
signal s_presente , s_futuro : passaggi;
--2 dichiarazioni relative alle ASM
--
begin
process (s_presente,u) begin
case s_presente is
--in questo primo processo si stabilisce
--solo il prossimo stato
-- la lista di sensitività non prevede il clock
when s0 => qa <= '0', qb <= '0';
if (u='1') then s_futuro <= s1;
else s_futuro <= s3;
end if;
when s1 => qa <= '0', qb <= '1';
if (i='u') then s_futuro <= S2;
else s_futuro <= s0;
end if;
when s2 => qa <= '1', qb <= '0';
if (u='1') then s_futuro <= s3;
else s_futuro <= s1;
end if;
when s3 => qa <= '1', qb <= '1';
if (u='1') then s_futuro <= s0;
else s_futuro <= s2;
end if;
end case;
end process;
process (clk) begin
if (clk'event and clk = '1')
then s_presente <= s_futuro;
end if;
end process;
end A_stati;
--in questo secondo processo, attivato
--dal fronte di salita del clock, avviene il
--cambiamento di stato: lo sto futuro diventa
-- lo stato presente.
Forme d’onda attese:
19
Commenti al listato VHDL:
N.B.1) la decisione di ricorrere ad una descrizione facente uso di
STATE MACHINES si riflette nella presenza di due linee di
programma poste immediatamente dopo la dichiarazione di
Architecture e prima del begin dell’architecture stessa:
type
signal
passaggi is (s0,s1,s2,s3);
s_presente , s_futuro :
passaggi;
con la dichiarazione di type si definisce un gruppo di valori
che si chiama passaggi: implicitamente essi vengono contati ed
associati al numero adeguati di Flip Flop: nel nostro caso 2
con la dichiarazione di signal si assegnano a dei nodi
circuitali le due variabili s_presente e s_futuro che saranno due
nomi transitori per s0,s1,s2,s3
N.B.2) seconda caratteristica del programma (non legata alla
presenza di ASM) è la presenza del costrutto case:
case …. is
when ….
end case;
N.B.3)
a)
nel programma sono presenti 2 process:
il primo process (sensibile a U ed a s_presente)
il secondo process (sensibile a clk)
Nel primo viene stabilito lo stato futuro (cosa che dipende solo
dallo stato presente e dagli ingressi, che non dovrebbero cambiare
nel l’intervallo tra due fronti attivi del clock, cioè dovrebbero essere
sincroni con questo).
Nel secondo avviene il cambiamento di stato in occasione del fronte
attivo (in questo esempio di salita) del clock.
20
4.
Descrizione strutturale
Nel progetto che viene qui illustrato si vuole realizzare un flip flop
S/R a porte NAND con il linguaggio VHDL nel “dialetto”
STRUCTURAL.
Con questa tecnica descrittiva si intende rappresentare circuiti così
come appaiono in un disegno schematico, senza necessariamente
capirne il funzionamento di insieme.
E’ ovvio che senza la comprensione del funzionamento non sarà
possibile capire i risultati della simulazione.
Di seguito è dato lo schema del S/R a porte NAND (fig. 1)
Fig. 1
Nella descrizione STRUCTURAL è necessario appoggiarsi ad una
libreria esterna, dove devono essere contenuti gli elementi circuitali
usati, nel nostro caso le nand2 (NAND a 2 ingressi) cui noi, in
questo caso, assegnamo il nome di
u0 e u1.
LIBRERIA
In questo file è contenuta la descrizione del componente nand2.
Il file si chiama
nand2.vhd
e deve essere posizionato
“Simulation Resources” nella sottocartella “In Design”.
in
21
Fig. 2
LIBRARY ieee;
USE ieee.std_logic_1164.all;
PACKAGE
mio IS
COMPONENT nand2
PORT (
y : OUT std_logic;
in_a,in_b : IN std_logic);
END COMPONENT;
END mio;
------------------------------------------LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY nand2 IS
PORT (
in_a,in_b : IN std_logic;
--qui è importante l'ordine !!!
y : BUFFER std_logic);
--qui è importante l'ordine !!!
22
END nand2;
-----------------------------------------ARCHITECTURE testbench OF nand2 IS
BEGIN
y
<= in_a nand in_b;
END testbench;
N.B.1
in figura 2 non compare una struttura realmente esistente
sull’hard disk, bensì una struttura logica. Per inserire un file nella
cartella “In Design” si deve posizionare il cursore sopra la cartella e
ciccare sul tasto destro del mouse; comparirà ADD FILE.
N.B.2
Nel file di libreria compare un costrutto particolare:
PACKAGE pinco_pallino
COMPONENT
END COMPONENT;
END
pinco_pallino;
Le ENTITY, le PACKAGE e le ARCHITECTURE, sono tutte
unità di progetto (in particolare le package e le entity sono unità
primarie).
Le unità PACKAGE servono a rendere visibile un componente al
di fuori del file cui appartengono.
N.B. vanno ripetute (essendo unità indipendenti) le dichiarazioni
delle librerie di appoggio IEEE.
23
PROGETTO DI TIPO “STRUCTURAL”
CHE FA USO DI UNA LIBRERIA
Il file che segue si chiama S_R.vhd ed è il file principale vhd del
progetto.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY s_r IS
PORT (
q,qn : BUFFER std_logic;
s,r
: IN std_logic);
END s_r;
ARCHITECTURE
funz of s_r is
begin
u0:
u1:
nand2 port map (s,qn,q);
nand2 port map (r,q,qn);
end funz;
Come si può notare, nel file precedente compare l’espressione
PORT MAP; questa espressione “mappa i pin” del componente
nand2 (contenuto in una libreria esterna) nell’ordine in cui sono stati
scritti nell’entity contenuta nella libreria!!!
Nella nostra libreria, nell’entity di nand2, i primi 2 pin sono in_a e
in_b di INGRESSO; il terzo è y, un buffer cioè un particolare tipo
di pin di USCITA).
N.B. u0 e u1 sottolineano la rappresentazione “circuitale” di
questa variante del VHDL: esiste un “componente” u0, con i pin
mappati come vogliamo noi (vedere elenco), esiste un componente
“u1”, con i pin mappati come da elenco, etc.
24
5.
Pilotaggio motore passo - passo
Si vuole realizzare un dispositivo che piloti un motore passo passo.
Questo tipo di motore richiede che vengano attivati in una
particolare sequenza gli avvolgimenti dello statore.
Noi useremo il motore a 5V della RS siglato 440-420
Vengono di seguito fornite le caratteristiche elettriche e la tabella di
pilotaggio.
In questo caso col termine “ON” si intende
“passaggio di
corrente”, ne segue che (dato che BRowN è a +5V) si tratterà
sostanzialmente di uno “0”. Questi valori attivi bassi verranno forniti
da dei BJT NPN BC317 (configurazione Emettitore Comune) che
dovranno essere pilotati con degli stati alti sulla base, quindi il
dispositivo sotto progetto genererà degli “1” in corrispondenza
degli “ON”.
25
Il circuito che si intende realizzare prevederà quindi un componente
programmabile PAL/PLD che piloterà dei BJT (che costituiranno il
così detto “stadio di potenza”) che infine forniranno la necessaria
corrente al motore.
N.B. I buffer che compaiono in figura sono necessari in quanto le
uscite della PAL 22V10 non sono in grado di pilotare i BJT.
26
In figura è fornito il DIAGRAMMA DEGLI STATI
NB qa = colore bianco qc = colore rosso
qb = colore blu qd = colore giallo
S = stop, attivo alto, il motore si ferma
A = 1, avanti A = 0, indietro (il motore gira in senso inverso)
Fig. 1
ASM
realizzazione con VHDL
library ieee;
use ieee.std_logic_1164.all;
entity pilotaggio is port (
a,s,clock: in std_logic;
bianco,blu,rosso,giallo: inout std_logic);
end pilotaggio;
27
architecture pilotaggio2 of pilotaggio is
type stati_usati is(s0,s1,s2,s3);
signal stato_presente, stato_futuro: stati_usati;
begin
process (stato_presente,a,s) begin
case stato_presente is
when s0=>bianco<='1'; blu<='1'; rosso<='0'; giallo<='0';
if (s='1' ) then stato_futuro<=s0;
--memoria = fermo
else if (a='1') then stato_futuro<=s1; --avanti
else stato_futuro<=s3;
--indietro
end if;
end if;
when s1=>bianco<='0'; blu<='1'; rosso<='1'; giallo<='0';
if (s='1') then stato_futuro<=s1;
else if (a='1') then stato_futuro<=s2;
else
stato_futuro<=s0;
end if;
end if;
when s2=>bianco<='0'; blu<='0'; rosso<='1'; giallo<='1';
if (s='1') then stato_futuro<=s2;
else if (a='1') then stato_futuro<=s3;
else stato_futuro<=s1;
end if;
end if;
when s3=>bianco<='1'; blu<='0'; rosso<='0'; giallo<='1';
if (s='1') then stato_futuro<=s3;
else if (a='1' ) then stato_futuro<=s0;
else stato_futuro<=s2;
end if;
end if;
end case;
end process;
if (clock'event and clock ='1') then
stato_presente <= stato_futuro;
end if;
end process;
end pilotaggio2;
28
Le forme d'onda in uscita sono riportate in figura: trattandosi di
una simulazione sotto Express non compaiono ritardi tra il fronte
attivo del clock (in questo caso di salita) e le var iazioni delle uscite.
Eseguita la simulazione sotto Express, si passa quindi al “FITTING”
in un PLD!
Fitting sta ad indicare l’insieme di procedure che portano il nostro
circuito descritto in VHDL ad essere compilato in funzione di un
particolare Dispositivo Logico Programmabile (PLD in inglese),
nuovamente simulato ed infine fisicamente realizzato tramite un
programmatore di PAL/PLD (disponendo di un file JED).
Il programma che permette la portabilità verso una PAL è WARP.
La PAL / PLD è la 22V10.
Nella fase di compilazione i punti critici sono i seguenti:
1) nel menu device si devono seguire i campi indicati in figura; il
campo critico è l’OUTPUT che deve essere di tipo JEDEC normale
per il programmatore di fascia bassa che abbiamo in E5.
29
2) In fase di ottimizzazione si deve scegliere “none” per evitare
“spifferi di circa 1 ns come appare in figura:
30
Ecco come appare la simulazione (sotto NOVA) qualora si eviti
ogni ottimizzazione (opzione “none”).
31
Al termine della compilazione si ha a disposizione un file JED ed
anche un file di report (nome_nostro.rpt) che contine, verso la fine
anche la piedinatura della nostra PAL/PLD.
32
ASM:
realizzazione a componenti discreti
Il medesimo dispositivo può essere realizzato con il metodo classico
di progettazione che prevede la stesura della tabella di transizione
degli stati e della tabella di eccitazione dei f/f, la progettazione dei
circuiti di pilotaggio dei f/f ed infine la progettazione dei circuiti di
uscita (programma di modulo 2).
Passo 1) : si disegna il “diagramma” dell’automa/ASM, vedi fig, 1
Passo 2) : si stende la tabella di transizione degli stati; si noti bene
che ad ogni stato sono riservate tante righe quante sono le possibili
combinazioni degli ingressi; ognuna di queste combinazioni
rappresenta un if ed è rappresentata da una freccia nel diagramma
degli stati.
Stato
presente
S0
S0
S0
S0
S1
S1
S1
S1
S2
S2
S2
S2
S3
S3
S3
S3
Ingressi
SA
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
Stato
futuro
S3
S1
S0
S0
S0
S2
S1
S1
S1
S3
S2
S2
S2
S0
S3
S3
A questo punto si deve associare al singolo stato un valore, a
piacere, univoco, binario, che a livello hardware sostituirà il nome
“umano” S0, S1 etc.
Normalmente si usano gli interi nel loro ordine naturale.
33
Questo valore binario si troverà in uscita ai f/f di stato X,Y, etc.
Passo 3) : si stende la tabella di eccitazione.
La tabella, pensata per dei f/f J/K, è la seguente:
Stato
presente
Xt Yt
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
Ingressi
S
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
Stato futuro
X t +1 Y t +1
A
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
1
0
0
0
0
1
0
0
0
1
1
1
1
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
0
0
X
X
X
X
X
X
X
X
J flip flop X
X t _Yt
S_A
1
0
X
X
J x = S ⋅ A ⋅Y + S ⋅ A ⋅Y
34
0
1
X
X
Jy Ky
Jx Kx
0
0
X
X
0
0
X
X
X
X
X
X
X
X
X
X
1
0
0
0
0
1
0
0
1
1
0
0
X
X
X
X
1
1
0
0
X
X
X
X
X
X
X
X
1
1
0
0
X
X
X
X
1
1
0
0
K flip flop X
X t _Yt
S_A
X
X
0
1
X
X
1
0
X
X
0
0
X
X
0
0
1
X
X
1
0
X
X
0
0
X
X
0
X
1
1
X
X
0
0
X
X
0
0
X
K x = S ⋅ A ⋅Y + S ⋅ A ⋅Y
J flip flop Y
X t _Yt
S_A
1
X
X
1
Jy = S
K flip flop Y
X t _Yt
S_A
X
1
1
X
Ky = S
Di seguito è riportato il circuito complessivo del solo automa:
35
Xt
Yt
Nel circuito finale gli stati al tempo t sono fisicamente rappresentati
dai valori delle uscite dei flip flop e sono una rappresentazione
binaria dei “nomi umani” S0, s1, etc.
Lo stato futuro sarà determinato dal valore degli ingressi e dallo stato
in cui la macchina si trova (cioè dal valore di Xt e Yt).
I pin J e K saranno pilotati da dei circuiti combinatori che avranno
come ingresso gli stati al tempo t e gli ingressi.
Il pin di clock esiste e non viene mai citato, ovviamente le
transizioni avverranno in concomitanza al presentarsi del fronte di
clock attivo.
L’andamento delle uscite dei soli f/f è dato in figura (si tratta di un
contatore a due bit, UP/DOWN, con STOP):
36
In questa pagina sono illustrati i circuiti combinatori presenti nel
sistema:
Circuito X_pilotaggio
Circuito Y_pilotaggio
.
Circuito decodifica (uscite)
37
L’andamento complessivo del circuito è dato dalle forme d’onda
mostrate nella fig. seguente; si noti che il fronte attivo è quello di
discesa e che sono considerati i ritardi dei componenti utilizzati; ne
segue che i f/f di stato e le uscite non cambiano valore
istantaneamente al fronte di discesa, ma successivamente.
In questa figura compaiono i nomi “interni” a Express per le uscite
dei due flip flop di stato: n00848 corrisponde a Xt, n00863
corrisponde a Yt.
38
39
40
Scarica

Appunti