Sappiamo che i Flip Flop sono delle celle di memoria da 1 bit, per incrementare la capacità di memoria dobbiamo utilizzare dei gruppi di Flip Flop, questi prendono il nome di Registri. Un registro da, ad esempio, 4 bit sarà formato quindi da 4 Flip Flop. Vediamo un esempio con 4 FF D:
Il Clock è l’ingresso a sinistra ed è collegato a tutti i registri contemporaneamente. Siccome abbiamo degli ingressi per ogni FF, questo significa che ad ogni fronte positivo del clock il nostro registro cambia valore e perdiamo quello precedente. Per non far cambiare continuamente valore al registro abbiamo bisogno di una linea di controllo aggiuntiva chiamata load che fa cambiare il registro soltanto quando è attiva. Esistono due tipi di load:
- Sincrono: Il registro cambia valore soltanto quando sono attivi sia clock che load
- Asincrono: Il registro cambia valore ogni volta che il load è attivo anche con il clock spento
Inserimento e Trasferimento dei Dati
I dati all’interno di un registro possono essere inseriti o estratti in due modi:
- Seriale: 1 bit alla volta
- Parallelo: Tutti i bit in una sola volta
Classificazione dei Registri
Possiamo classificare i registri in base a più parametri:
- Input / Output
- SISO (Serial Input Serial Output)
- SIPO (Serial Input Parallel Output)
- PISO (Parallel Input Serial Output)
- PIPO (Parallel Input Parallel Output)
- Utilizzo
- Shif Register: Vogliamo far scorrere i bit da un FF ad un altro
- Storage Register: Ci interessa soltanto memorizzare i valori
Shif Register (SISO)
Questi si dividono in altre due categorie:
- Right Shift: Scorrimento a destra
- Left Shift: Scorrimento a sinistra
In questo tipo di registri se vogliamo caricare un dato, ad esempio 1111, dobbiamo individuare il LSB (less significant bit) e MSB (most significant bit) e inserire in ordine dall’LSB al MSB tutti i bit, con questo esempio otterremo degli stati come questi:
Abbiamo bisogno quindi di 4 fronti positivi di clock per memorizzare il dato, in un caso reale però per trasmettere appunto 4 bit abbiamo usato un solo cavo dato che l’output è seriale, se avessimo avuto un output parallelo avremmo avuto bisogno di 4 cavi, aumentando notevolmente il costo. Per lunghe distanze conviene quindi utilizzare un approccio SISO.
Shif Register (SIPO & PIPO)
Un problema dell’output seriale è che se per esempio abbiamo avuto bisogno di 4 cicli di clock per memorizzare il dato avremo bisogno di altrettanti cicli per estrarlo, dato che abbiamo una sola uscita. Quindi con un registro SIPO otteniamo una situazione simile a questa:
In un registro PIPO invece avremo una situazione come questa:
Quindi in un solo fronte d’onta avremo registrato il nostro dato, è importante quindi inviare i dati prima dell’arrivo del fronte d’onda. Questo prende il nome anche di Buff Register proprio per questa azione di Buffer ovvero se diamo in input 1011 nel nostro registro finirà esattamente 1011.
Shift Register (PISO)
In questo tipo di registri abbiamo bisogno di caricare in modo parallelo i nostri input. Questi possono funzionare in due modi:
- Load Mode: Quando abbiamo bisogno di caricare i dati
- Shift Mode: Quando dobbiamo mandare in output i dati Vediamo come costruire il circuito e poi analizziamolo:
Quindi abbiamo 2 casi, Shift = 1 OPPURE Load = 1
LOAD = 1
Le porte AND 1 - 3 - 5 valgono 0 dato che entra il load = 0 mentre le porte AND 2 - 4 - 6 valgono quando gli input B quindi nei registri entra il valore dell’input corrispondente
SHIFT = 1
Le porte AND 2 - 4 - 6 valgono 0 mentre le porte AND 1 - 3 - 5 valgono quanto l’uscita dell’FF precedente, questo significa che ogni FF prenderà il valore del precedente e il valore dell’ultimo FF verrà mandato in output
Bidirectional Shift Register
Prima di analizzare il circuito vediamo cosa succede quando “shiftiamo” dei bit a destra o a sinistra:
Attenzione
Se prendiamo la sequenza 11 in un totale di 3 bit in realtà stiamo considerando 011 che in decimale vale 3 Cosa succede se la spostiamo a sinistra? 011 → 110 che non vale più 3 ma bensì 6, abbiamo moltiplicato il valore per 2 E se shiftiamo la sequenza verso destra? 110 → 011 che da 6 prende il valore 3, abbiamo quindi diviso per 2
Nei registri bidirezionali possiamo scegliere se shiftare i valori a destra o a sinistra, analizziamo il circuito:
Vediamo il caso in cui M = 1 e !M = 0
M = 1
Quando M = 1 siamo nell’operazione di shift a destra, vediamo perché. In questo caso le porte 2 - 4 - 6 - 8 valgono 0 dato che hanno fra gli input M negato che vale 0, mentre le porte 1 - 3 - 5 - 7 hanno come input 1 e l’output del Flip Flop alla loro sinistra, quindi prenderanno come input lo stato del Flip Flop. Ovviamente il Flip Flop 3 non ha altri FF alla sua sinistra quindi prende un input seriale esterno
M = 0
In questo caso abbiamo che M negato = 1 quindi disabilitiamo le porte and 1 - 3 - 5 - 7 e abilitiamo le porte 2 - 4 - 6 - 8 che avranno come input lo stato del Flip Flop alla loro destra tranne per il Flip Flop 0 che prenderà un input seriale esterno. Otteniamo quindi l’operazione di shift a sinistra.
E’ importante quindi ricordare il suo utilizzo per effettuare moltiplicazioni e divisioni per 2
Universal Shift Register
Per ottenere un registro universale dobbiamo rispettare questi 2 requisiti:
- Shift Bidirezionale
- Caricamento Parallelo dei dati
Non c’è molto di nuovo da spiegare dato che il circuito universale riesce a fare tutte le operazioni viste precedentemente, infatti può:
- Avere Input seriale o parallelo
- Output seriale o parallelo
- Shift a destra o sinistra