Contatori e registri a scorrimento

Da Hacknowledge.

[modifica] I contatori

I contatori sono particolari macchine sequenziali, che, come lascia intendere la parola stessa contano un valore dato come ingresso alla macchina. L’importanza dei contatori è di notevole rilevanza poiché essi costituiscono il comportamento di numerose macchine (complesse e non) ottenute per decomposizione. Tipicamente si usa chiamare un contatore come contatore modulo-N poiché esso conta in modulo-N gli impulsi e le variazioni di livello di un segnale assunto come segnale di conteggio. Un contatore modulo-N si presenta con n stati ordinati, se a partire dall’uscita ui si applica una sequenza di ingresso che contiene r volte la sequenza di conteggio c, il contatore finirà nello stato uk con:


Immagine:Contatori-formula1.gif


contando cioè in modulo n il numero di volte che si è presentato l’evento. Generalmente un contatore riceve in ingresso i segnali di:


  • incremento del conteggio (può trattarsi di un fronte di salita o discesa, oppure di un impulso);
  • abilitazione al conteggio (fornisce al contatore l’inizio di un nuovo conteggio);
  • altri segnali ausiliari come:
    • segnale per individuare se il conteggio è a crescere oppure a decrescere;
    • segnale di reset, che azzera il contatore, oppure lo porta in uno stato noto;
    • segnale per identificare lo stato o il valore iniziale del contatore;


I segnali di uscita, tipici di un contatore, sono invece:


  • valore del conteggio;
  • segnale di div, per indicare che il contatore ha un valore di conteggio pari ad N-1 si usa il segnale di div alto nello stato più significativo della macchina per contatori a crescere (ad esempio un contatore modulo 8 ha un segnale div alto quando la macchina è in S7 che costituisce l’uscita massima 0,1,2,…,7), mentre per contatori a decrescere div è alto in S0. Il segnale div è un segnale a livelli ed è mantenuto attivo per tutta la durata del conteggio;
  • segnale di ripple. Si tratta di un segnale, di tipo impulsivo, per indicare la transizione dal valore N-1)→0 per contatori a crescere oppure da 0→(N-1) per quelli a decrescere;


La figura che segue riassume brevemente quanto abbiamo finora detto:


Immagine:Contatori-img1.gif


La classificazione dei contatori è basata ovviamente sulla sincronizzazione della macchina e dagli ingressi che essa può accettare. Si avranno allora contatori sincroni o asincroni, che contano impulsi o sequenze a livello sui fronti di salita e/o discesa. Per realizzare un contatore modulo-N si usano, tipicamente, contatori modulo-k, in cui sia necessariamente k<N, ed in particolare si adoperano quelli per cui k=2 e cioè contatori modulo 2 per i quali (supponendo che il contatore sia a crescere):


  • L’uscita di conteggio coincide con l’uscita div;
  • Il segnale ripple è associato alla variazione da 1 a 0 e quindi sul fronte di discesa;


Un contatore modulo-2 non è altro che un flip-flop di tipo T, non sono rari i casi in cui a volte si usano anche flip-flop JK come contatori modulo-2. Esistono altre classificazioni sui contatori:


  • contatore binario: se la sequenza delle uscite u0 u1 u2 … un-1 è codificata secondo l’aritmetica binaria;
  • contatore decimale: se cioè n=10 e le uscite sono un codice per la rappresentazione delle cifre decimali;
  • contatore a crescere: se la sequenza di uscita è una sequenza ordinata di valori in modo crescente, ad esempio 0,1,2,3,…,9 per un contatore decimale;
  • contatore a decrescere: se la sequenza di uscita, contrariamente a quanto avviene per quello a crescere, è una sequenza ordinata in modo decrescente, ad esempio 9,8,7,…,0;
  • contatore bilaterale: se possiede due valori di conteggio, uno a crescere ed uno a decrescere;


Nella progettazione e realizzazione dei contatori, tra l'altro molto semplice, è sufficiente scegliere dapprima il tipo di elemento per la memorizzazione. Quindi si procede alla codifica degli stati s0, s1, s2, sn-1, ognuno di questi è associato al valore di conteggio che il contatore rappresenta (è questa la maniera più semplice per realizzare un contatore). Le funzioni logiche che si ricavano dalle mappe di Karnough (ci sarà una funzione logica per ogni bit di conteggio) devono semplicemente tradurre la sequenzialità fra gli stati logici del contatore (ad esempio da s0 ad s1, da s1 ad s2, e così via...) e sono funzione del tipo di flip-flop scelto. Per brevità di esposizione ma anche per invogliare il lettore ad una semplice ma utile esercitazione propongo alcuni schemi logici che realizzano semplici contatori logici. Trovo assai utile provare a svolgere la progettazione di alcuni contatori logici, almeno nella fase iniziale di studio di questi componenti. Nell'uso di tools e software, infatti, si utilizzaranno quasi sempre dei blocchi componenti che rappresentano contatori e flip-flop (ma anche altri dispositivilogici). Il rischio è dunque quello di usare blocchi logici senza nemmeno poi sapere come questi funzionano al loro interno.

Contatore modulo 8 con FF D ETS

Immagine:Contatori_-_con_D_ETS.gif

Contatore modulo 8 con FF T ETS

Immagine:Contatori_-_con_T_ETS.gif

Contatore modulo 8 con FF D, bilaterale ETS

Immagine:Contatori_-_con_D_bilaterale.gif


Notare come i primi due schemi logici, pur realizzando lo stesso conteggio, abbiano effettivamente diverse connessioni logiche, ciò è senz'altro dovuto alla scelta del flip-flop che quindi condizione il progetto.


[modifica] I registri a scorrimento, shif register

Oltre a svolgere le proprie funzioni, i registri a scorrimento vengono usati nella composizione di macchine più complesse. Un registro a scorrimento è una macchina sequenziale a sincronizzazione esterna composta da n flip-flop e che in presenza di un segnale di abilitazione acquisisce serialmente un dato D nella prima posizione a sinistra del registro, al successivo ingresso il nuovo bit prende il posto più sinistra del registro (quello cioè occupato in precedenza dal primo bit letto) mentre quello che occupava la prima posizione viene spostato in avanti (shift). La macchina ha pertanto due ingressi:


  • il segnale di abilitazione, bit a;
  • il bit dato D;


mentre le uscite sono n e rappresentano lo stato attuale;

Immagine:Contatori_-_con_D_bilaterale.gif

Ad ogni colpo di clock il dato D in ingresso è letto e messo nella posizione più a sinistra del registro, se il registro si compone di n celle per la memorizzazione del bit, cosa succede all’ultimo bit quando il registro è pieno? Esistono due tipi di registri,in alcuni registri a scorrimento quando la posizione n-1 è già occupata da un bit questi eliminano tale bit al successivo colpo di clock, altri registri a scorrimento invece riportano tale bit nuovamente in testa al registro (posizione più a sinistra) compiendo così uno scorrimento ciclico dei bit in esso contenuti. Ecco cosa succede ad esempio in un registro a scorrimento dotato di quattro celle per la memorizzazione del dato D:

Immagine:Shift_register_-_esempio.gif

La macchina può essere realizzata ponendo n flip-flop in serie, il flip-flop più comodo da usare è quello di tipo D, mentre la tempificazione deve essere master-slave oppure edge-trigger:

Immagine:Shift_register_-_con_D.gif

Un uso pratico dei registri a scorrimento sono i riconoscitore di sequenze, si realizzi ad esempio il riconoscitore di sequenza per la stringa 10101 usando un registro a scorrimento ad 8 bit. La realizzazione di un riconoscitore di sequenza mediante uso di shift register è estremamente semplice come si può vedere dal circuito:

Immagine:Shift_register_-_riconoscitore.gif

Come si può notare lo shift register oltre ad avere 8 uscite è dotato anche di 8 ingressi per caricare un valore in memoria, il bit LD (bit di load) carica il valore posto in ingresso. Il riconoscitore di sequenza appena visto è inoltre capace di riconoscere le sequenze valide anche se sovrapposte. Questo avviene poiché quando il registro riconosce la sequenza non effettua il reset e continua nella sua lettura. Per realizzare un riconoscitore di sequenza che non consideri le possibili sovrapposizioni è opportuno collocare il bit di uscita al bit di reset, non appena la sequenza è riconosciuta, e quindi l’uscita è alta, tale bit (che abbiamo posto in ingresso al bit di reset) realizza per noi la condizione di reset per il registro:

Immagine:Shift_register_-_riconoscitore_seq10101.gif

Strumenti personali