Impara › Argomento 10
Contatori e registri a scorrimento: progetto passo dopo passo
7 min di lettura · Team bitGateLab
Un contatore è un gruppo di flip-flop che percorre una sequenza fissa di stati a ogni impulso di clock; un registro è un gruppo di flip-flop che memorizza o fa scorrere una parola binaria. Con essi si misurano tempi, si dividono frequenze, si convertono dati da seriale a parallelo e si generano sequenze di controllo. Devi avere ben chiari i flip-flop D, JK e T e le loro tabelle di eccitazione, spiegati in latch e flip-flop.
Contatore asincrono (ripple)
Il modo più semplice di contare è concatenare flip-flop T con T = 1, in modo che ciascuno commuti e divida la frequenza per 2. Solo il primo riceve il clock di sistema; ciascuno dei successivi prende come clock l'uscita del precedente. Con flip-flop attivati sul fronte di discesa si collega la Q di uno stadio al clock del successivo e il contatore conta in avanti; con il fronte di salita bisogna usare Q per contare in avanti (con Q conterebbe all'indietro).
Il suo difetto è il ritardo accumulato: lo stadio n non cambia finché non sono cambiati tutti i precedenti, come un'onda che percorre la catena. In quell'intervallo l'uscita passa per valori falsi.
Esempio: contatore asincrono a 4 bit con tCQ = 12 ns per flip-flop. Passa da 0111 a 1000.
- Q0 passa da 1 a 0 dopo 12 ns: l'uscita si legge 0110.
- Q1 cambia dopo 24 ns: 0100.
- Q2 cambia dopo 36 ns: 0000.
- Q3 cambia dopo 48 ns: 1000, il valore corretto.
Per 48 ns l'uscita ha mostrato 0110, 0100 e 0000. Se un circuito decodifica questi valori, vedrà impulsi falsi. Per leggere sempre un valore stabile il periodo del clock deve superare 48 ns, cioè f < 20.8 MHz.
Contatore sincrono
Nel contatore sincrono tutti i flip-flop ricevono lo stesso clock, ed è la logica a decidere chi commuta. In un contatore binario in avanti un bit commuta quando tutti i bit meno significativi valgono 1:
T0 = 1, T1 = Q0, T2 = Q0·Q1, T3 = Q0·Q1·Q2
Tutte le uscite cambiano insieme, tCQ dopo il fronte. Il periodo minimo non dipende più dal numero di bit attraverso la catena di flip-flop, ma da tCQ + ritardo della AND + tsu.
Contatore modulo N
Un contatore modulo N percorre N stati e ricomincia da capo. Richiede almeno ⌈log2 N⌉ flip-flop. Ci sono due modi di realizzarlo.
Con reset asincrono: si prende un contatore binario e si rileva il primo stato che non deve comparire. Per il modulo 10 questo stato è 1010; basta una NAND di Q3 e Q1 collegata al clear attivo basso, perché è la prima volta che Q3 e Q1 valgono 1 contemporaneamente. Funziona, ma lo stato 1010 compare per alcuni nanosecondi e genera un impulso breve sulle uscite.
Progetto sincrono: si scrive la tabella degli stati e si calcolano gli ingressi con la tabella di eccitazione. Non ci sono stati transitori.
Esempio: contatore sincrono modulo 6 (da 0 a 5) con flip-flop T. Stati Q2 Q1 Q0; gli stati 110 e 111 non si usano e valgono X.
| Q2 Q1 Q0 | Successivo | T2 | T1 | T0 |
|---|---|---|---|---|
| 000 | 001 | 0 | 0 | 1 |
| 001 | 010 | 0 | 1 | 1 |
| 010 | 011 | 0 | 0 | 1 |
| 011 | 100 | 1 | 1 | 1 |
| 100 | 101 | 0 | 0 | 1 |
| 101 | 000 | 1 | 0 | 1 |
Ogni T vale 1 quando il bit cambia. Semplificando con le X:
- T0 = 1.
- T1 = Q2·Q0 (copre 001 e 011; in 101 vale 0 perché Q2 = 1).
- T2 = Q1·Q0 + Q2·Q0 = Q0·(Q1 + Q2).
Controlla gli stati non usati: da 110, T2 = 0, T1 = 0, T0 = 1, il contatore va in 111; da 111, T2 = 1, T1 = 0, T0 = 1, va in 010. Entrambi rientrano nella sequenza: il contatore si avvia da solo anche se all'accensione si trova in uno stato non valido.
Registri a scorrimento
Un registro a scorrimento è una catena di flip-flop D: l'uscita di ciascuno pilota l'ingresso del successivo e, a ogni fronte, tutti i bit avanzano di una posizione. In base a come entrano ed escono i dati si classificano così:
- SISO (ingresso seriale, uscita seriale): ritarda un segnale di n cicli di clock.
- SIPO (ingresso seriale, uscita parallela): riceve i bit uno alla volta e li fornisce tutti insieme. Converte da seriale a parallelo.
- PISO (ingresso parallelo, uscita seriale): carica una parola completa e la emette bit per bit. Ogni flip-flop ha un MUX 2 a 1 sul suo ingresso:
Di = LOAD·Pi + LOAD·Qi−1. - PIPO (da parallelo a parallelo): un semplice registro di memoria.
Esempio: registro SIPO a 4 bit, inizialmente a 0000, con Q0 ← ingresso, Q1 ← Q0, Q2 ← Q1, Q3 ← Q2. Si inviano i bit 1, 0, 1, 1 in quest'ordine.
| Fronte | Bit in ingresso | Q0 Q1 Q2 Q3 |
|---|---|---|
| 1 | 1 | 1 0 0 0 |
| 2 | 0 | 0 1 0 0 |
| 3 | 1 | 1 0 1 0 |
| 4 | 1 | 1 1 0 1 |
Dopo 4 fronti, letto come Q3 Q2 Q1 Q0, il registro contiene 1011: il primo bit inviato è finito in Q3.
Contatore ad anello e contatore Johnson
Se l'uscita dell'ultimo flip-flop di un registro a scorrimento viene collegata all'ingresso del primo, si ottiene un contatore ad anello. Lo si inizializza con un solo 1 (per esempio 1000) e quell'1 circola: 1000, 0100, 0010, 0001, 1000. Con n flip-flop ha n stati e ogni stato è già decodificato, perché una sola uscita è a 1. Bisogna garantire il caricamento iniziale; se parte da 0000 vi resta per sempre.
Se invece di Q si riporta in ingresso la Q dell'ultimo flip-flop, si ottiene il contatore Johnson (o ad anello incrociato), con 2n stati. Per 4 bit (Q0 Q1 Q2 Q3, con Q0 ← Q3):
0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → 0001 → 0000
Ogni stato si distingue con una AND a due soli ingressi, guardando dove si trova il confine tra uni e zeri: per esempio 1100 è l'unico con Q1 = 1 e Q2 = 0, e 0000 è l'unico con Q0 = 0 e Q3 = 0.
Errori comuni
- Decodificare le uscite di un contatore asincrono con logica combinatoria senza tener conto degli stati transitori.
- Collegare Q invece di Q tra gli stadi di un contatore asincrono a fronte di salita e ottenere un contatore all'indietro.
- Dimenticare di controllare dove vanno gli stati non usati di un contatore modulo N.
- Avviare un contatore ad anello senza caricare l'1 iniziale.
- Confondere l'ordine dei bit nel leggere un registro SIPO: il primo bit che entra finisce all'estremità più lontana.
Provalo nel simulatore
Confrontare nel cronogramma un contatore asincrono con uno sincrono è il modo migliore per vedere l'effetto ripple.
- Inserisci quattro flip-flop T con T = 1, collega il clock al primo e concatena gli altri come contatore asincrono.
- Collega le quattro uscite a degli indicatori e a un display o a una barra di LED.
- Costruisci accanto il contatore sincrono con T1 = Q0, T2 = Q0·Q1 e T3 = Q0·Q1·Q2, tutti con lo stesso clock.
- Apri il cronogramma, lascia scorrere il clock e osserva la transizione da 0111 a 1000 in entrambi.
- Costruisci un registro di quattro flip-flop D in catena, cambia l'ingresso seriale prima di ogni fronte e osserva come avanzano i bit; poi riporta la Q dell'ultimo stadio sul primo e verifica gli 8 stati del Johnson.
Esercizi
- Quanti flip-flop ti servono per un contatore modulo 12 binario, ad anello e Johnson?
Risposta
Binario: 4 (24 = 16 ≥ 12). Anello: 12. Johnson: 6 (2 × 6 = 12).
- Quale porta e quali uscite useresti per realizzare un contatore modulo 12 con reset asincrono attivo basso a partire da un contatore binario a 4 bit?
Risposta
12 = 1100. Una NAND di Q3 e Q2 collegata al clear, perché è la prima volta che entrambi valgono 1.
- Un contatore asincrono a 8 bit usa flip-flop con tCQ = 10 ns. Qual è il tempo di assestamento nel caso peggiore?
Risposta
8 × 10 = 80 ns, per esempio nel passaggio da 01111111 a 10000000.
- Quale AND a due ingressi decodifica lo stato 0111 del contatore Johnson a 4 bit?
Risposta
Q0·Q1: è l'unico stato con Q0 = 0 e Q1 = 1.