caricato da oscar2480

Flip Flop e Contatori in VHDL

Flip-Flop e contatori in VHDL
Leggendo i commenti riguardo ad un mio precedente articolo (programmazione di
un decoder per display a 7 segmenti in VHDL -->
http://www.grix.it/viewer.php?page=5348&mode=preview) ho pensato fosse cosa
buona proporre un altro articolo riguardo al VHDL: l’implementazione di flip-flop
e di contatori in VHDL. Prima di ricominciare il discorso del linguaggio VHDL
voglio rispondere ad alcune domande poste nei commenti che avevo citato sopra:
cosa serve per iniziare??
COSA SERVE PER INIZIARE??
Ora vi espongo software e hardware che noi usiamo a scuola per i nostri progetti
con le PLD. Prima di tutto serve una PLD. In quest’anno ne abbiamo usate due, la
C16V8 e la 22V10 entrambe prodotte dall’azienda Lattice. Le sigle della maggior
parte delle PLD è già una indicazione della “potenza hardware” di questi
componenti e ci serve per scegliere la PLD in base alle nostre esigenze. In
particolare le due PLD sono GAL di bassa potenza (non hanno un numero
spropositato di termini prodotto e hanno solo 8 e 10 uscite rispettivamente) ma sono
più che sufficienti per creare piccoli progetti in cui occorrerebbero un numero
spropositato di porte logiche.
Come programmatore di PLD usiamo uno strumento connesso al computer tramite
USB che non serve a programmare solo PLD, ma ci è utile anche per programmare
microC, eeprom, memorie flash.... Lo strumento in questione è della HILO System
con il codice ALL-11P3 e lo potete trovare in questa pagina
http://www.praticasrl.com/programmatori.html (è quello centrale). Uno strumento
così è buono di costare molti soldi che per fare delle prove semplici è meglio non
spendere, in compenso ho trovato uno schema online che permette di costruirsi un
programmatore in modo semplice ed è affiancato da un software scritto
dall’ideatore del progetto (http://www.geocities.com/mwinterhoff/galblast.htm se
l’autore preferisce non farsi pubblicare può mandarmi una mail).
Oltre al programmatore e alla PAL servono almeno altri due software: il primo è
superfluo ma consigliato, il secondo è indispensabile. Il primo software è un
normale software di simulazione di circuiti logici che supporti la programmazione
in VHDL: permette, dopo avere scritto il listato, di provare la PLD come
risulterebbe dopo essere programmata. Questo è molto utile se la PLD in proprio
possesso può essere programmata solo una volta. Io uso un programma chiamato
LogicWorks 5 (http://www.logicworks5.com/), ma mi dicono anche che ci sono
alcune versioni di Multisim che permettono di fare la stessa cosa (io ho il 10 ma non
ho trovato questa funzione). L’altro software fondamentale è quello che traduce il
listato in VHDL in un file JED leggibile dal programmatore per poter
programmare la PLD. IO uso un software chiamato Galaxy (della suite Warp della
Cypress).
FLIP FLOP IN VHDL
Dopo questa piccola introduzione passiamo alla costruzione dei nostri elementi
logici in VHDL. Sulla parte base dell’architettura e dell’entità penso di averne già
parlato abbastanza nel precedente tutorial, e perciò inizio subito con un nuovo
comando necessario per creare i componenti che ci siamo prefissati. I Flip-Flop
hanno una caratteristica rispetto agli altri circuiti logici di memoria (latch): hanno
bisogno di una fonte che scandisce il tempo in intervalli ben definiti, il clock.
I
Flip – Flop e gli altri circuiti sequenziali quando sentono un cambio di stato del
clock fanno accadere qualcosa al loro interno. Serve perciò un circuito che
permetta al circuito di capire quando avviene una transizione del clock. Molto
semplicemente si potrebbe fare un circuito del genere:
Il circuito è costituito fondamentalmente da una porta NAND su di un ingresso
della quale è stato prodotto un ritardo di qualche nanosecondo con una porta NOT
( il segnale ad attraversare la porta NOT impiega, infatti, pochi nanosecondi ). In
questo modo sull’ingresso 1 arriva lo stesso impulso presente sull’ingresso 2, ma
invertito e in ritardo di qualche nanosecondo. Si produce sull’uscita della porta
NAND uno spike ( un impulso ) di pochi nanosecondi negativo, poi invertito dalla
seconda porta NOT che segnala che è avvenuta una transizione del clock.
Descrivere in VHDL un circuito del genere è abbastanza complicato e non si sa
neanche se il funzionamento è sicuro: per questo i cervelloni della Verilog (coloro
che hanno inventato il VHDL) hanno implementato un comando che segnala se è
avvenuta una transizione su di un piedino della PLD. Per descrivere un Flip - Flop
j-k in VHDL è necessario avere la tavola della verità.
Sotto è presente il listato di descrizione del FF JK e sotto ancora il commento ad
ogni istruzione.
library IEEE;
use IEEE.std_logic_1164.all;
entity ff_jk is
port(
k : in std_logic;
clk : in std_logic;
j : in std_logic;
Q : out std_logic;
clr : in std_logic
);
end ff_jk;
architecture arch1 of ff_jk is
begin
process(clk,j,k)
begin
if clr='0' then Q<='0';
end if;
if (clk'EVENT and clk='1') then
if (j='1' and k='0') then
Q <= '1';
elsif (j='0' and k='1') then
Q <= '0';
elsif (j='1' and k='1') then
Q <= NOT Q;
end if;
end if;
end process ;
end arch1;
Iniziamo con il commento del programma: in alto si trovano gli include delle
librerie utilizzate (in questo caso solo le standard) e l’entità del flip - flop :gli
inglessi J e K, l’ingresso per il clock, un ingresso per il clear( reset asincrono) e
l’uscita Q. L’architettura è molto semplice da capire , ma c’è un’istruzione nuova:
if (clk'EVENT and clk='1') THEN
Questa istruzione controlla se c’è stata una transizione del clock: in questo caso dal
basso verso l’altro; per cambiare il verso basta cambiare l’1 in uno 0. Tutte le
istruzioni presenti dentro a questo if e prima dell’ end dello stesso vengono eseguite
se c’è una transizione di clock. Prima ho parlato del clear del dispositivo: in questo
caso è asincrono (non deve aspettare la transizione del clock per funzionare), infatti
è stato messo fuori dal controllo del clock. Le altre istruzione sono molto semplici
sono tutti i controlli basati sulla tavola della verità del dispositivo. Qua in basso ci
sono le immagini della simulazione del componente (Logic Works 5).
CONTATORI IN VHDL
Un altro componente molto comodo da fare in VHDL può essere un contatore. Io
ho preso come esempio un contatore che arriva fino a 7 (contatore a 3 bit; fino a
111) , che può contare sia all’avanti che all’indietro, a seconda del segnale applicato
all’ingresso up/down). Utilizzando le porte logiche questo contatore andrebbe fatto
sincrono con 4 flip-flop jk, utilizzando una tabella di transizione degli stati e
almeno 6-7 porte logiche(vedi figura): utilizzando una PLD con un programma in
VHDL il lavoro è molto più semplice.
Qua sotto c’è il listato del VHDL e il commento più in basso.
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity up_down is
port(
clk : in std_logic;
U_D : in std_logic;
Q : out std_logic_vector(2 downto 0);
clr : in std_logic
);
end up_down;
architecture arch1 of up_down is
begin
process(clk,clr,U_D)
begin
if clr='0' then Q<="000";
end if;
if(clk'event and clk='1') then
if U_D='1' then Q<=Q+1;
else Q<=Q-1;
end if;
end if;
end process;
end arch1;
Il programma è un po’ più complesso di quello precedente. Innanzitutto si vede che
è presente una libreria aggiuntiva rispetto alle precedenti: è la libreria aritmetica,
necessaria per effettuare somme e sottrazioni. Cambia da compilatore a
compilatore quindi controllate nell’help la vostra. E’ come sempre presente un
ingresso clear, il reset asincrono, che permette di portare a zero il conteggio quando
si vuole. Sotto alle istruzioni del clear sono presenti le istruzioni per il controllo
della transizione del clock: se presente (e positiva) il programma esegue un
controllo sull’ingresso U_D: se alto somma 1 al vettore dell’uscita, altrimenti toglie
1. In basso è presente una foto del funzionamento del circuito.
In questo modo, aggiungendo qualche riga di programma, si possono creare contatori
molto complessi che richiederebbero un numero spropositato di integrati.
Spero che questo tutorial possa essere utile a chiunque inizi a lavorare con PLD e
VHDL.