Corso di microprogrammazione: i circuiti sequenziali all’opera

Numbers

Bentornati al nostro corso di microprogrammazione. Nella scorsa puntata vi abbiamo presentato i circuiti sequenziali cercando di capire come funzionano ma la cosa davvero importante è rendersi conto che vanno utilizzati all’interno di sistemi più complessi. Quella di oggi, quindi, sarà una lunga rassegna dei circuiti sequenziali, ovvero sistemi completi basati su dispositivi sequenziali, grazie alla quale vi proporremo una spiegazione di come vengono utilizzati, di quali sono le applicazioni principali e di che cosa potete farci. Siete pronti?

Shift Register

Quando si tratta questo argomento non si può che cominciare parlando del registro a scorrimento, un dispositivo circuitale il cui nome può essere tradotto letteralmente. Lo Shift register è una particolare configurazione di memoria che conta un solo bit. Dal momento che questo dispositivo è basato sull’utilizzo di un flip flop SR, e che, come sappiamo, questo elemento può essere utile per memorizzare un solo dato, se utilizzassimo n flip flop potremmo certamente immagazzinare una parola costituita da n bit.
Ed è proprio per questo che la combinazione prende il nome di “registro”.
Nella prossima figura vediamo che cosa succede se due flip flop vengono posti in cascata.

È facile osservare che ci sono due diverse configurazioni possibili che prevedono l’utilizzo di coppie di flip flop identici, nel primo caso SR mentre nel secondo caso di tipo D.
Vediamo di capire meglio come funziona questo registro.
Se supponiamo di attivare l’ingresso di clear, otterremo che Q1 e Q0 si annulleranno. In questa situazione, presentando all’ingresso del sistema una sequenza di bit, ad esempio 1011, in entrambi i circuiti (ovviamente!) succederà che:

Ck

Serial In

Q1

Q0

1

1

1

0

2

1

1

1

3

0

0

1

4

1

1

0

è ovvio, e lo si capisce chiaramente analizzando il circuito, che sarà necessario utilizzare una configurazione di tipo Master-Slave. Questo discende logicamente dalla considerazione che si tratta di dispositivi sequenziali. Se l’ingresso, infatti, non è presente al Master, certamente lo slave non avrà mai dati sui quali lavorare.
Detto questo, possiamo passare a considerare un circuito più complesso, anche per capire meglio come funziona e come lavori una serie di circuiti sequenziali.

Input/Output

Nella figura che vi abbiamo appena mostrato i nomi degli ingressi sono già stati assegnati ed è proprio grazie al loro nome che si intuisce una nozione che adesso “daremo” in maniera formale. Abbiamo parlato di circuiti sequenziali, ovvero di sequenze di dati. Ancorché in sequenze, però, i dati possono essere proposti in ingresso ad un sistema sia in serie sia in parallelo. Altrettanto, ovviamente, può essere detto per quanto riguarda le uscite; ne discende che abbiamo effettivamente quattro possibili combinazioni che determinano altrettanti tipi di sistemi.
Parleremo quindi di:

  • SISO (Serial Input – Serial Output)
  • PISO (Parallel Input – Serial Output)
  • SIPO (Serial Input – Parallel Output)
  • PIPO (Parallel Input – Parallel Output)

Queste sono le quattro possibili combinazioni che discendono dalle considerazioni fatte in precedenza. Vale anche la pena di sottolineare che un sistema che lavori ottenendo gli ingressi in maniera parallela sarà sicuramente più veloce di un sistema che abbia necessità di acquisire i dati che arrivino in serie. Questo banalmente discende dal fatto che per l’acquisizione dei dati, nel caso di un sistema che possa ottenere ingressi in parallelo, sarà necessario attendere un unico colpo di clock. Nel caso di sistemi con ingressi seriali, il numero di colpi di clock necessari perché il sistema acquisisca l’intero bitstream è pari proprio al numero di bit contenuti nella sequenza.
Queste considerazioni sembrano banali, un po’ scontate, magari ovvie ma è proprio dal tentativo di rendere i sistemi il più funzionalmente paralleli possibile che discende l’evoluzione della quale siamo stati spettatori fino a questo momento.

Detto questo, torniamo a noi e vediamo, adesso, la configurazione SIPO.
Partendo sempre da una situazione di clear, per cui le uscite siano tutte nulle, applichiamo la sequenza d’ingresso della quale avevamo accennato poco fa. Avremo:

Load

Ck

Serial In

Q3

Q2

Q1

Q0

0

1

1

1

0

0

0

0

2

1

1

1

0

0

0

3

0

0

1

1

0

0

4

1

1

0

1

1

come si può vedere, il dato che è stato posto in ingresso in maniera seriale al sistema è, ora, interamente disponibile sulle uscite Q numerate da 3 a 0 (notazione posizionale!).
Ora che abbiamo visto la tabella sarà sicuramente più chiaro il concetto di sistema seriale in ingresso e parallelo in uscita.
Questo tipo di applicazione, ovviamente con riferimenti a sequenze molto differenti tra di loro, viene utilizzata quando si voglia dimostrare come funziona la ricezione da parte di una porta seriale di un microcontrollore.

Quando il dato viene presentato all’ingresso di una configurazione SISO, esso risulta disponibile all’uscita dopo quattro colpi di clock (in questo caso). Questo vale per ciascun ingresso, ovvero ciascun bit, che componga il bitstream. Questo configura, nei fatti, un sistema che produce un ritardo lineare sulla propagazione dei dati. Ecco per quale motivo si parla di “Line Delay“.

Nel caso di sistema PISO, invece, se supponiamo di porre ad 1 il segnale di Load, abilitando così il caricamento della parola composta da 4 bit e formata da Pr3, Pr2, Pr1, Pr0 (immaginiamo ad esempio di utilizzare la sequenza 1010), possiamo porre al valore logico zero il serial input. A questo punto, attivando il clock, otterremo:

Load

Ck

Serial In

Q3

Q2

Q1

Q0

1

0

1

0

1

0

0

1

0

0

1

0

1

0

2

0

0

0

1

0

0

3

0

0

0

0

1

0

4

0

0

0

0

0

come si può facilmente osservare, il dato viene caricato in parallelo e posto sul uscita Q0 in serie. Questo tipo di applicazione può essere utilizzata, ad esempio, nella trasmissione di una porta seriale di un microcontrollore.

Shifters

Un’altra importante applicazione sono i cosiddetti “shifter”. Il dato può essere semplicemente “traslato” di una posizione (per volta) in una direzione specifica. Guardando le tabelle, questa considerazione risulta quasi banale, di fatto, quando abbiamo la configurazione PISO; guardando le prime due righe (della tabella precedente) ci si rende conto immediatamente che dopo un’operazione di shift a destra è disponibile sulle uscite la combinazione 0101. Essa non è altro che (numericamente) la metà del numero caricato parallelamente in origine; infatti il numero inizialmente era 10 (in decimale) ed ora è 5 (sempre in decimale).
Proviamo con una domanda: c’è un inconveniente in questa configurazione, quale secondo voi?

Al di là di questo piccolo quiz, vale la pena di farvi notare che effettuare un’operazione, in qualche modo, duale può creare non già un divisore per due, come nel caso precedente, ma un moltiplicatore per due. Che ne pensate? Come lo fareste?

La traslazione è un’operazione sicuramente molto utile ma potrebbe anche essere interessante non traslare semplicemente il dato verso un’altra posizione ma riproporlo ciclicamente in uscita. Da quest’idea nasce il cosiddetto “Ring Counter (Shift)“. Supponiamo di collegare Q0 al Serial In del circuito e, quindi, di caricare un bitstream in parallelo. Per comodità, supponiamo la combinazione 0110. Se forniamo al sistema un sufficiente numero di colpi di clock (quanti ne servono?), otterremo:

Load

Ck

Serial In

Q3

Q2

Q1

Q0

1

0

0

1

1

0

0

1

0

0

0

1

1

0

2

1

1

0

0

1

0

3

1

1

1

0

1

0

4

0

0

1

1

0

Si vede chiaramente che il bitstream in ingresso si ripropone all’uscita dopo un numero di colpi di clock pari proprio al numero di stadi di cui è costituito un registro.

Non solo shift

Certamente queste non sono le uniche operazioni che è possibile effettuare ma ce ne sono tante altre che risultano, se non più utili, almeno altrettanto interessanti. I circuiti sequenziali risultano molto versatili quando si vogliano realizzare funzioni di conteggio, di modulo specificato. Vediamo, quindi, adesso una struttura che prende il nome di Ripple Counter.

Se consideriamo i due flip-flop in figura, quando l’ingresso di abilitazione viene posto al valore logico 1, non solo i due vengono abilitati ma lavorano in modalità Toggle; per questo motivo a ciascun impulso di ingresso per clock si verificherà un cambio di stato della loro uscita. Se supponiamo di azzerare il sistema tramite l’ingresso di clear, e quindi di inviare una sequenza di impulsi di clock, potremo facilmente analizzare il grafico degli stati.
Quello che verificheremo sarà che le uscite Q1 e Q0 troveremo la sequenza di conteggio (che risulta essere ciclica) costituita da 00,01,10,11.
È facile notare che questa sequenza è un conteggio “modulo 4“, ovvero 2^2.
Allo stesso modo si può dimostrare (e non è difficile) che utilizzando una catena costituita da N flip flop collegati in cascata (esattamente come nello schema precedente) si può costituire un contatore “modulo 2^N”.
Il cambiamento dello stato del primo J-K genera il cambiamento sul secondo e, quindi, si ottiene una propagazione (da cui il nome Ripple).
Questo tipo di contatore viene anche chiamato “asincrono”.
Lo svantaggio di questa configurazione è che, per avere in uscita la medesima sequenza, sarà necessario attendere un numero di colpi di clock pari al numero di bit che costituiscono la parola e questo è tanto più influente quanto maggiore è il numero di bit. Altro svantaggio è il fatto che ciascun bit corrisponde ad un dispositivo fisico e pertanto l’hardware di cui abbiamo necessità è piuttosto complesso.
Solo per darvi un’idea del fatto che esistono altre soluzioni, vale la pena di accennare qui, adesso, che le soluzioni “sincrone” per contatori esistono e risolvono il problema della propagazione migliorando, di conseguenza, le performance del contatore stesso.
Secondo voi come si potrebbe realizzare questa soluzione?

Volendo realizzare dei contatori, esiste la possibilità di realizzarli “modulo N” (che può essere comodo nel caso in cui il numero che dovete contare sia costituito da un numero di cifre non potenza di 2) magari modulo 3. Nel primo caso (generale) è possibile utilizzare flip flop di tipo J-K o D.

Sul secondo caso, invece, vale la pena di soffermarci un attimo. Siccome per capirlo serve la tabella, sapreste farla? Un utile aiuto portrebbe essere quello di proporvi la rispettiva figura.

Come possiamo vedere nella tabella che avete fatto, questo contatore passa ciclicamente per gli stati S=00, S=01, S=10 senza mai passare per lo stato 11. È ovvio che questa configurazione circuitale richieda la presenza di due flip-flop (perchè?). Se assumiamo di realizzare il contatore con due J-K, partendo dalla configurazione 00, otteniamo esattamente la tabella riportata in precedenza.
Nella figura che vi abbiamo mostrato, invece, è riportato lo schema del circuito. Come metodo di lavoro è importante sempre avere ben chiari:

  • la normale tabella della verità di un J-K;
  • la tabella di transizione dello stesso (e quindi le condizioni di ingresso che è necessario che si verifichino per avere la transizione da uno stato al successivo);
  • lo studio di tutte le transizioni degli ingressi necessari per ciascun flip-flop.

Osservazione: Anche se, nello specifico esempio, è stato utilizzato un J-K, queste indicazioni di massima servono per realizzare un qualunque tipo di contatore per qualunque tipo di flip-flop scegliate di utilizzare. Ovviamente questo vuol dire che, in generale, potrete (e dovrete) scegliere il flip-flop più “opportuno” per la vostra specifica applicazione. Il metodo di lavoro, tuttavia, non c’è ragione che cambi.

Un altro contatore che sarà certamente utile poter realizzare è quello “modulo 5“.
Come per il circuito precedente, è necessario partire dalla tabella degli stati. Poiché cinque non è potenza di due ed è maggiore di quattro, è evidente che serviranno 3 flip-flop. Questo vuol dire che il contatore potrebbe essere in grado di contare anche modulo 6 o 7.
Ne discende, comunque, che gli stati S=101,110,111 non verranno utilizzati.
Analogamente a quanto fatto nei casi precedenti, serve la tabella ed anche qui c’è di che darsi da fare per voi…

Com’è fatta la tabella?

Quando tutto sarà completo, vi accorgerete che la complessità del sistema è aumentata ed ancora una volta risulta essere particolarmente utile la sintesi mediante le mappe di Karnaugh.
Come nei casi precedenti, la realizzazione di questi circuiti può essere ottenuta mediante l’utilizzo di flip-flop del tipo che si ritenga più opportuno: J-K, D e così via dicendo. L’importante è rispettare sempre il metodo di lavoro suggerito dall’elenco puntato che abbiamo visto in precedenza. Come sarà fatto, secondo voi, lo schema di questo circuito?

Altra possibilità nel conteggio è quella di realizzare sistemi Up e Down. Spesso è necessario poter scegliere se incrementare o decrementare un contatore ed è per questo motivo che viene utilizzato un circuito di conteggio con una logica combinatoria in grado di selezionare la direzione del conteggio, ovvero se Up oppure Down.
Se supponiamo di voler realizzare un contatore modulo 3 (mod3) di questo tipo, di fatto la parte “up” è già stata realizzata in precedenza. Vediamone, quindi, la parte “down” grazie alla seguente tabella

anche in questo caso non verrà utilizzato S=11. A questo punto, è arrivato il momento delle domande: cosa fareste per trovare la soluzione a questo quesito? Sapreste dire come si fa la sintesi con le mappe di Karnaugh? Che tipo di flip-flop scegliereste? Che schema ne deriva?

Applicazioni

Di quanto abbiamo detto fino a questo momento esistono diversi esempi, casi applicativi e così via dicendo. I contatori vengono utilizzati nei più disparati sistemi per applicazioni anche molto diverse tra loro:

  • contatori di eventi (ovviamente!);
  • divisori di frequenza;
  • convertitori A/D;
  • generatori di forme d’onda;
  • temporizzatori.

Ma non è tutto perché è possibile anche effettuare misurazioni di tempo e frequenza grazie a questo tipo di sistemi, oltre al fatto che i generatori PWM risultano una delle applicazioni più interessanti. Per darne un’idea, eccone un esempio

un’altra soluzione è rappresentata dal cosiddetto “frequenzimetro”, rappresentato in figura

Conclusioni

Bene, siamo in chiusura. In questa puntata abbiamo analizzato la struttura di alcune delle configurazioni più comunemente utilizzate nell’impiego dei circuiti sequenziali. Il contatore è certamente l’applicazione più banale ma si rivela straordinariamente utile e versatile. La prossima puntata sarà dedicata ad una richiesta che abbiamo avuto due lezioni fa a riguardo del Sigma-Delta mentre successivamente riprenderemo la scaletta parlando dei dispositivi programmabili.
Come avrete notato, questa puntata ha provato ad essere più interattiva; il tentativo fatto di stimolare una vostra riflessione su questi argomenti dovrebbe servire, almeno nel privato, a farvi riflettere su alcuni degli argomenti trattati.
Ma adesso, come di consueto, la parola è a voi: è tutto chiaro fino a questo momento? Ci sono domande, dubbi, perplessità, questioni? Che ne pensate del nuovo “metodo”? Avete preferenze per i prossimi argomenti? Suvvia, non siate timidi…

 

Quello che hai appena letto è un Articolo Premium reso disponibile affinché potessi valutare la qualità dei nostri contenuti!

 

Gli Articoli Tecnici Premium sono infatti riservati agli abbonati e vengono raccolti mensilmente nella nostra rivista digitale EOS-Book in PDF, ePub e mobi.
volantino eos-book1
Vorresti accedere a tutti gli altri Articoli Premium e fare il download degli EOS-Book? Allora valuta la possibilità di sottoscrivere un abbonamento a partire da € 2,95!
Scopri di più

7 Comments

  1. Giorgio B. Giorgio B. 1 maggio 2013
  2. Boris L. 1 maggio 2013
  3. Antonello Antonello 1 maggio 2013
  4. Piero Boccadoro Piero Boccadoro 1 maggio 2013
  5. gfranco78 gfranco78 6 maggio 2013
  6. Giorgio B. Giorgio B. 7 maggio 2013
  7. Piero Boccadoro Piero Boccadoro 27 maggio 2013

Leave a Reply