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.