Académique Documents
Professionnel Documents
Culture Documents
Due sono i tipi di descrizione utili per progettare una macchina di questo tipo:
- la struttura (com’è fatta): definizione delle parti che la compongono;
- il comportamento (cosa fa): stabilito in relazione alle sollecitazioni. Si tratta di una
descrizione astratta, e quindi comprensibile sia da un essere umano, sia dalle molte
macchine che possono comprenderla.
Entrambe queste descrizioni sono fondamentali nell’ingegneria, e due, in particolare, sono i
momenti descrittivi:
- l’analisi: si prende atto di una struttura esistente e se ne deduce il comportamento;
- la sintesi: il comportamento è il punto di partenza e la struttura il punto d’arrivo.
Una macchina complessa richiede una gerarchia dei livelli di descrizione. Salendo di livello
aumenta l’astrazione perché si assumono, come componenti primitivi, intere strutture di
componenti più semplici (descritte nel livello sottostante). Scendendo di livello si aumenta il
dettaglio fornendo la descrizione strutturale dei componenti (assunti come primitivi nel livello
superiore). Si dice:
- bottom up: il “salire” di livello in livello (verificare il corretto funzionamento dei
componenti in contesti più vasti);
- top down: lo “scendere” di livello in livello (verificare il corretto funzionamento delle
specifiche in ambiti più ristretti).
Oggi si dispone delle realizzazioni e degli standard d’impiego dei componenti a tutti gli strati;
ciò ha reso di grande importanza saper operare nei livelli più “estremi”:
- al livello più basso si prende atto di una famiglia di componenti complessi già
realizzati;
- al livello più alto si definiscono le specifiche della nuova macchina e la si assembla.
Essendoci più modi per realizzare una macchina, è ovviamente preferibile quello che comporta
un minor dispendio e maggiori prestazioni. A tal fine è determinante avvalersi della
progettazione assistita dal calcolatore (Computer Aided Design – CAD).
Ogni componente può essere descritto da una scatola nera, che ne oscura la struttura posta al
suo interno: si tratta di una notazione simbolica molto pratica, che consente una grande
espressività. La struttura consta di:
- una freccia entrante (dati d’ingresso - causa);
- una freccia uscente (alfabeto d’uscita - effetto);
- sviluppo temporale della trasformazione (processo di elaborazione, ovvero la relazione
P che lega l’input all’output).
Lo schema a blocchi (che lega più componenti astratti, il cui numero è maggiore più si scende
di livello) consente di descrivere una macchina digitale ad ogni livello d’astrazione.
1
Luca Pagani - Riassunto di Reti Logiche A
Al livello più alto di descrizione le macchine digitali sono rappresentate da un unico blocco e
classificate in base a due differenti tipi di comportamento: la macchina special purpose e la
macchina general purpose.
- Una macchina special purpose risponde ad una specifica e ben precisa esigenza di
elaborazione (o più esigenze selezionabili tramite un certo numero di parametri di
configurazione).
- Una macchina general purpose è predisposta per presentare qualsiasi
comportamento descrivibile con un algoritmo. Essendo molto flessibile, questa
macchina ha un campo d’applicazione vastissimo.
Nella visione di più alto livello il funzionamento di un calcolatore elettronico si basa sulla
cooperazione di:
- software: descrizione del comportamento desiderato: la forma è quella di una lista di
istruzioni (instruction set);
- hardware: è l’oggetto fisico in grado di memorizzare il software, di prelevare dalla
memoria un’istruzione alla volta, di svolgere l’attività di elaborazione per essa prevista.
Ad un esame più approfondito, l’hardware è costituito da due blocchi di retroazione:
o il controllo (controller) scandisce i passi dell’algoritmo da eseguire;
o il percorso dei dati (data path) esegue sui dati tutte le operazioni che vengono
via via richieste dall’algoritmo.
In ogni istante di funzionamento è il controllo a dire al percorso dei dati cosa fare,
ricevendo da quest’ultimo lo stato dell’operazione e passandogli un comando. A sua
volta, il controllo passa una notifica (es. “Esecuzione terminata”) all’utente, che può
immettere una richiesta. In sintesi: per arrivare al risultato, il dato compie il
percorso dei dati, gestito dal controllo che è a sua volta amministrato da un utente.
Questo tipo di decomposizione vanta semplicità d’uso e flessibilità d’impiego.
La macchina ha necessità di comunicare con il mondo esterno: ciò avviene tramite protocollo
specifico del dispositivo periferico con cui si deve interagire. Per questo motivo è prassi
suddividere il percorso dei dati in tre blocchi disposti in serie:
- l’input per acquisirli,
- la Central Processing Unit (CPU) per trasformarli,
- l’output per restituirli.
Siccome comunicare in maniera “diretta” tramite il protocollo è un processo che rallenta la
macchina, si è pensato di interfacciare la CPU con le unità periferiche: ciò significa che il
blocco di interfaccia con l’esterno è dotato di un suo controllo e di suo percorso dati. Quando la
CPU (che in questo modo si può dedicare soltanto all’attività di calcolo vera e propria) ha
necessità di comunicare con l’esterno, sarà sufficiente un solo comando d’attivazione (al quale
corrispondono e sono legate moltissime operazioni della periferica).
Ogni interfaccia può essere agevolmente inserita/estratta dalla macchina principale ed ha,
ovviamente, una sua struttura interna.
La CPU di una macchina general purpose è costituita, sotto il profilo architettonico (il livello
più alto), da quattro componenti:
- una memoria in cui alloggiare le istruzioni (algoritmo) e un’altra in cui far risiedere i
dati del programma;
- un interprete capace di trasformare le istruzioni in una serie di comandi interni utili ad
eseguire l’operazione;
2
Luca Pagani - Riassunto di Reti Logiche A
Al di sotto del livello architettonico si trova il livello fisico, a cui compete la realizzazione dei
veri e propri componenti fisici della macchina digitale. Occorre, a tal proposito, prendere in
considerazione relazioni di causa/effetto fra le grandezze fisiche e i segnali (che caratterizzano
fenomeni di varia natura). Il problema principale resta però il coordinare lo svolgimento di
moltissimi di questi comportamenti elementari. Di ciò si occupa il livello logico, con un
duplice compito:
- impiegare l’astrazione matematica della variabile, della funzione e dell’operazione,
per dare una descrizione indipendente della tecnologia;
- definire procedimenti formali che indichino come impiegare tali operazioni per
conseguire comportamenti più complessi.
I circuiti elettrici ed elettronici formano il livello fisico di una macchina digitale, coordinano il
loro funzionamento scambiandosi segnali, cioè grandezze fisiche variabili nel tempo.
L’attribuzione di un certo andamento, o forma d’onda, ad uno o più segnali è dunque il modo
con cui un circuito genera e comunica informazioni; il riconoscimento di uno degli andamenti
previsti è invece il modo con cui un circuito riceve informazioni. Le grandezze impiegate dai
segnali di ingresso e uscita, e la loro natura, sono in genere profondamente diverse, in
particolare i segnali si suddividono in:
- analogici: ovvero “continui”, che impiegano tutti i possibili valori istantanei della
grandezza fisica; teoricamente un segnale analogico dispone di infiniti valori e infiniti
andamenti. Il problema dei segnali analogici è che mancano di affidabilità per via dei
rumori, dei disturbi, ovvero, che possono modificare anche solo lievemente il segnale;
- digitali: grandezze fisiche in cui il campo di variabilità è stato suddiviso in un certo
numero di “fasce” d’eguale ampiezza. Tanto più sono grandi le fasce tanto più bassa è la
possibilità di interferenza da parte del disturbo. Usuale è l’impiego del segnale
(digitale) binario, che garantisce la massima robustezza (la capacità, ovvero, di non
essere condizionato dai rumori): i due unici possibili valori (alto, basso) si ottengono
suddividendo l’intervallo di variabilità con due valori di soglia.
Per garantire grande flessibilità d’impiego è necessario che le macchine digitali scambino col
mondo esterno sia segnali binari che analogici. La trasformazione fra analogico e digitale
3
Luca Pagani - Riassunto di Reti Logiche A
(A/D) e fra digitale e analogico (D/A) è affidata ai convertitori: a monte del convertitore A/D
è posto un trasduttore, a valle del convertitore D/A un attuatore.
Il più semplice componente di una macchina digitale è l’interruttore, oggetto fisico dotato di
comando atto a far passare o meno corrente elettrica (valori alto-basso) fra i due morsetti
esterni. Può essere:
- ad azionamento manuale;
- ad azionamento elettromagnetico (relé); il vantaggio di questo tipo d’azionamento è che
è possibile interessare contemporaneamente più contatti, con una velocità molto
maggiore di quella di un essere umano;
- l’interruttore elettronico (transistor): è piccolissimo, estremamente veloce e dal basso
costo e consumo.
Per capire meglio le dinamiche dei segnali, costruiamo una tabella che riporta lo stato di
un’eventuale lampada in corrispondenza di ogni stato del contatto a lei collegato:
Ritornando al livello fisico, si possono individuare alcuni montaggi principe fra i vari contatti:
- montaggio in serie: il montaggio in serie prevede che i due (o più) contatti siano messi
“uno di seguito all’altro”. Elettronicamente, si comporta come l’operatore and: in uscita
avremo corrente solo se entrambi gli interruttori sono bassi. Se vi sono più di due
ingressi, il discorso rimane immutato: per il passaggio di corrente è necessario che tutti
gli interruttori siano chiusi;
- montaggio in parallelo: si comporta come l’operatore or. In uscita avremo corrente se
almeno uno degli interruttori è basso. Se vi sono più di due interruttori, è sufficiente
che solo uno di loro sia basso per garantire il passaggio di corrente;
o combinando questi due tipi di montaggi è possibile ricavare (vedi tabella) anche
le porte ex-or (esclusive or), nor (not dell’or), nand (not dell’and);
- retroazione: quando si impiega l’uscita di una rete d’interruttori per azionare uno dei
contatti posti al suo interno (es. relé ad autoritenuta)
Entrata 1 Entrata 2 Uscita AND Uscita OR Uscita XOR Uscita NOR Uscita NAND
0 0 0 0 0 1 1
0 1 0 1 1 0 1
1 0 0 1 1 0 1
1 1 1 1 0 0 0
Come è facile intuire, due sono le possibili associazioni tra valori del bit e valori del segnale:
considerando il segnale Alto (High) = 1 e quello Basso (Low) = 0 si usa la logica positiva; se
High = 0 e Low = 1 si usa la logica negativa.
Si dice configurazione binaria la stringa di bit (b1, b2… bn), una volta attribuitigli i valori 0
o 1. Il calcolo combinatorio suggerisce che le disposizioni con ripetizione di m elementi presi n
a n sono mn: le distinte configurazioni binarie di n bit sono dunque 2n.
4
Luca Pagani - Riassunto di Reti Logiche A
La piccola area di silicio su cui è stata realizzata una rete di interruttori elettronici è detta
chip, ed è alloggiata all’interno di un contenitore isolante. La descrizione della struttura, del
comportamento e delle norme di corretto impiego di ognuno di tali circuiti complessi è fornita
da un data sheet.
In generale una macchina digitale ha un codice interno (di norma non ridondante) per
rappresentare ogni informazione che la sua unità centrale (CPU) deve elaborare e diversi
codici esterni (in genere ridondanti) per acquisire e restituire informazioni nella modalità
più appropriata col mondo esterno. Necessaria è una trascodifica fra il codice interno e il
codice esterno e viceversa, la quale avviene tramite una funzione fra le configurazioni dei due
insiemi.
Si dice encoder (codificatore), la macchina che trasforma il codice “uno su N” (il codice formato
da tutte le possibili stringhe di N bit che contengano al più un 1: 100…0, 010…0, …, 00…1) in
un codice non ridondante.
Si dice decoder (decodificatore) la macchina che compie il processo inverso.
Teoricamente ogni progettista può far comunicare parti della sua macchina col codice che più
gli piace (codice proprietario), ma per ragioni di standardizzazione questa scelta è conveniente
solo in pochi casi. Comprensibili esigenze di unificazione dei codici ha portato enti
internazionali a proporre codici detti standard de iure; sono invece denominati standard de
facto codici proprietari che sono stati adottati in molti progetti per la loro efficacia o praticità.
5
Luca Pagani - Riassunto di Reti Logiche A
Il primo standard de iure per la codifica binaria di caratteri è stato il codice ASCII: ne sono
uscite molte versioni, dalla prima (7 bit e 96 simboli) a quella a 8 bit (che comprende tutti i
simboli delle lingue generate dal latino), fino a quella a 16 bit (UNICODE, compatibile con
ASCII, e capace di fornire la rappresentazione binaria univoca di ogni simbolo di ogni lingua
scritta del pianeta).
Anche la codifica di un numero può essere fatta codificando separatamente in binario le cifre
che lo compongono. Nei documenti, i numeri sono codificati come caratteri ASCII, ma
all’interno della macchina, nei processi di calcolo numerico, questa scelta non è conveniente:
ne occorre un’altra che sia in grado di rendere massima la velocità d’esecuzione di calcoli e
minima l’occupazione in memoria.
2.2 – Trasmissione
Il numero di segnali impiegati da un canale può essere uguale o inferiore al numero di bit di
codifica (compromesso spazio/tempo).
- Trasmissione in parallelo: il numero di segnali è uguale a quello dei bit. Il tempo
necessario alla trasmissione è minimo (passano “tutti in una volta”), ma ha un alto
costo.
6
Luca Pagani - Riassunto di Reti Logiche A
Il passaggio da parallelo in serie (P/S) e quello contrario (S/P) sono effettuati dai convertitori.
La conversione P/S di un byte (8 bit) richiede:
- un oscillatore: per stabilire il ritmo con cui verranno serializzati i bit;
- un contatore: per numerare gli otto successivi intervalli elementari di trasmissione;
o oscillatore e contatore formano il controller della macchina;
- un selettore: per scegliere i bit d’ingresso; detto anche multiplexer, è costituito da una
funzione con tre “variabili-contatore” (per decidere quali degli otto bit trasmettere in
uscita) e dalle otto “variabili-bit” della trasmissione stessa (8 differenti ingressi);
o il selettore costituisce il data path.
La conversione S/P di un byte richiede:
- un oscillatore: per scandire gli istanti d’arrivo dei bit;
- un contatore: per numerare gli intervalli;
- un distributore: per instradare i bit verso le 8 direzioni del parallelo; la soluzione più
semplice per questo componente è quella di presentare il bit in arrivo
contemporaneamente sulle 8 uscite, affiancandolo però a un segnale (flag: 1 = valido, 0
= non valido) che indichi a ciascuna destinazione se debba o meno prenderlo in
considerazione. Il codice del flag dev’essere quindi del tipo “uno su N” e a tal fine è
necessario un decoder.
Due macchine coinvolte nel trasferimento di una informazione hanno in generale bisogno di
scambiarsi, prima e dopo, messaggi di servizio (per aprire, controllare e chiudere il canale di
comunicazione). Il tutto deve naturalmente essere codificato in binario e svolto secondo un
protocollo noto ad entrambe le unità.
Il protocollo deve dunque stabilire delle regole precise che consentano alla destinazione di
accorgersi dell’arrivo di ogni nuovo carattere e di ogni nuovo bit. Il caso più comune delle
comunicazioni “in rete” è che le due unità operino a ritmi solo nominalmente uguali. Per
garantire il sincronismo ci si deve limitare a trasmettere in serie piccoli pacchetti di bit e il
protocollo usato è detto a start-stop (RS232): inizialmente la linea ha valore alto, che si
modifica in basso all’inizio di ogni messaggio (bit di start). Questo segnale ha la stessa durata
del periodo d’oscillazione della trasmissione, il quale scandisce il ritmo con cui vengono
trasmessi i bit di dato. Al termine di ogni messaggio è previsto un bit di parità (per il controllo
degli errori, v. cap. 2.3) e due bit di stop (per dare al ricevente il tempo di prepararsi per un
successivo messaggio).
2.3 – Protezione
7
Luca Pagani - Riassunto di Reti Logiche A
“utilizzata”, il destinatario potrebbe solo avere la speranza che sia integra. Per garantire
grande efficacia nel rilevamento degli errori è quindi importante che le configurazioni non
utilizzate siano l’effetto più probabile dell’azione dei disturbi sulle configurazioni utilizzate.
Il codice più semplice di rivelazione errori è il cosiddetto bit di parità. Impieghi tipici sono la
rilevazione dell’errore nelle memorie di un calcolatore e nelle comunicazione fra un calcolatore
e le sue periferiche. Funziona nel modo seguente: la sorgente da cui partono i dati aggiunge un
bit ad ogni stringa di lunghezza n da inviare, attribuendogli un valore che renda pari il
numero complessivo di “uni” e creando dunque un nuovo codice con distanza minima 2 (Single
error detection code, DMIN almeno 2). Se la destinazione rileva una stringa con un numero
dispari di “uni”, allora vene settato ad 1 il bit sindrome d’errore: in questo modo vengono
rilevati tutti gli errori nelle stringhe con numero dispari di bit. Si può realizzare un semplice
circuito di confronto con degli ex-or (rappresentato da F): e = F(F(x1,x2), F(x1,x2)), con x1 e x2
ingressi, e = 1 errore.
Gli errori nel codice possono essere corretti se la probabilità che vi siano p errori è maggiore di
quella per cui ve ne sono p+1*.
Teoremi di Hamming (inventore di un codice di correzione che si basa sul calcolo della
parità di alcuni particolari gruppi di bit):
- un codice SECC (Single error correction code) può correggere tutti gli errori singoli;
- un codice con DMIN = 2k+1 può correggere fino a k errori contemporanei.
Se, ad esempio, TRUE è codificato con 111 e FALSE con 000 (codice con DMIN = 3) e si riceve
110, allora è molto più probabile che tale informazione vada classificata come TRUE visto che
dista 1 dalla configurazione 111 e 2 (meno probabile!*) dalla configurazione 000.
8
Luca Pagani - Riassunto di Reti Logiche A
Esistono anche sistemi di correzione automatica. Poniamoci ancora nel caso di errori
singoli: se I sono i bit che codificano l’informazione e C quelli aggiunti dal trasmettitore, allora
il ricevitore (confrontando i bit di controllo) può codificare con C bit ogni tipo di errore che può
verificarsi. Dove sta il bit sbagliato? Le possibili situazioni di errore sono I (bit sbagliato
nell’informazione) + C (bit sbagliato fra quelli aggiunti dal trasmettitore), alle quali si
aggiunge un + 1 (codifica per l’assenza d’errore): perché possa avvenire una correzione
automatica deve dunque verificarsi che 2C ≥ I + C + 1 (altrimenti mancherebbero codifiche per
alcuni tipi di errori e C bit non sarebbero sufficienti per “catalogarli” e suggerire al “correttore”
come agire).
CAPITOLO 3 - Modelli
Prendiamo un componente generico. La sua uscita (output) u altro non sarà che il risultato di
un processo P su ciò che ha ricevuto in ingresso fino a un certo momento t (chiamiamo questo
input J(t)). Sia l’entrata che l’uscita sono definite con alfabeti di bit (codici), che devono
essere completi e quindi devono poter codificare ogni tipo di configurazione lecita in entrata
(alfabeto d’entrata I) o in uscita (alfabeto d’uscita U). Cosa può cambiare, in una macchina
così, il suo funzionamento? Due eventi, in particolare, possono farlo:
- la modifica del valore d’ingresso (che appartiene ad I);
- lo scorrere del tempo t.
Delineiamo ora un tipo di macchina (a memoria finita). Che ci serve per realizzarla?
- abbiamo bisogno di una scansione temporale: la macchina ha infatti uno stato
iniziale s(t0), corrispondente a un certo momento t0, un “passato” e uno stato “futuro”;
- abbiamo bisogno di una memoria m per lo stato iniziale e di una memoria M per tutti
gli ingressi arrivati dopo t0;
- abbiamo bisogno di una funzione P che usa tutti i dati memorizzati e l’ingresso attuale
(avvenuto al tempo tn) per calcolare l’uscita attuale u(tn).
Facciamo un esempio: il traduttore automatico dovrà disporre di una memoria m (allo stato
iniziale) contenente i vocaboli e la sintassi di una certa lingua (e i significati per la
traduzione). Dall’istante t0 in poi, un utente inserisce un certo numero di caratteri, che
andranno a finire nella memoria M. Infine, ad un certo istante tn, la macchina leggerà i
caratteri immessi dall’utente in M, li elaborerà utilizzando le informazioni in m, e darà in
uscita la traduzione.
Esaminiamo infine un tipo particolare di macchina sequenziale e quello che a noi interessa
maggiormente: la macchina a stati finiti. Questo tipo particolare d’automa non necessita di
memoria M (un notevole risparmio, perché in molti casi è superfluo disporre di tutte le
informazioni immesse in passato) e si regge sull’idea che è necessaria un’informazione
riassuntiva e aggiornata di quello che è successo in precedenza. In base a quello che è lo stato
interno presente, la macchina si mette in grado (in un certo istante ti) di prendere determinati
tipi di scelte e di calcolare quello che sarà lo stato interno futuro all’istante ti+1. Calcolare
9
Luca Pagani - Riassunto di Reti Logiche A
un’uscita e calcolare uno stato futuro sono due operazioni diverse e ben distinte; servono
quindi due funzioni specifiche, che sono:
1. F: S x I Æ U (funzione d’uscita); nella macchina combinatoria è l’unica
funzione presente.
2. G: S x I Æ S (funzione di stato); è presente nelle macchine sequenziali
ed assente in quelle combinatorie.
Fino al successivo aggiornamento di stato, alla funzione G viene in retroazione associata una
memoria (trattasi quest’ultima di una macchina sequenziale) che mantenga lo stato interno
“per un po’” (un aggiornamento istantaneo, in un tempo pari a 0, renderebbe inutile definire il
concetto di stato presente, perché esisterebbero infiniti stati in tempo pari a 0: ciò è
ovviamente impossibile).
La modifica dello stato interno è un evento che la macchina si procura sia per tener conto del
trascorrere del tempo, sia per elaborare immediatamente ogni simbolo d’ingresso.
Esempio: ho una macchina che fa l’addizione in serie. Non è necessario (come nel primo
modello di macchina a memoria finita descritto), che nella memoria M siano presenti tutti gli
addendi. Risulta altresì più comodo e potente mantenere in memoria solo l’ultimo addendo
elaborato nella somma totale, trasmettendo, di volta in volta, soltanto il riporto.
Per lavorare con le macchine a stati finiti sono necessarie due tecniche di descrizione:
- la tabella di flusso: ha due dimensioni. In orizzontale si elencano tutti i simboli (o le
configurazioni) dell’alfabeto d’ingresso; in verticale gli stati che la macchina impiega
per riassumere la storia passata. In ogni “incrocio” della tabella (prodotto cartesiano
simboli X stati) si inseriscono i risultati delle funzioni F (uscita) e G (stato futuro) per la
coppia di ordinate che lo individuano. NOTA: non è presente la temporizzazione.
- il diagramma degli stati: è un grafo a rami orientati. Ogni nodo rappresenta uno
stato ed ogni ramo una transizione dallo stato precedente allo stato futuro. L’input e
l’output sono segnati sopra le frecce di collegamento. Se una freccia fa un arco e si
richiude sullo stato da cui è partita si parla di stabilità dello stato interno. NOTA:
neanche qui è presente il fattore tempo.
Fra le due rappresentazioni, la tabella è di certo quella più ordinata e funzionale.
Un’osservazione importante: di norma si devono progettare macchine che non si fermano mai.
Il comportamento dev’essere quindi sempre descritto da un grafo strettamente connesso, in
cui deve esistere almeno una sequenza d’ingresso che consenta di passare da uno stato
arbitrariamente scelto a un altro. Non ha quindi molto senso parlare di stato iniziale e di stato
finale, almeno in fase di sintesi! Altra nota: una macchina può avere più descrizioni e lo stesso
compito può essere effettuato da automi equivalenti (fra i quali il minimo ha il numero
inferiore di stati).
Le macchine sequenziali sopra introdotte possono essere a loro volta classificate in due grandi
categorie: l’elemento discriminante di questa differenziazione è la misura del tempo, che in
alcune macchine è indispensabile e in altre inessenziale. Queste due categorie sono:
- macchine asincrone: sono macchine sequenziali in cui ogni simbolo d’ingresso
produce un solo simbolo d’uscita. La misura del tempo non ha rilevanza perché la
durata del simbolo d’uscita è automaticamente fissata dalla durata del simbolo in
10
Luca Pagani - Riassunto di Reti Logiche A
ingresso. Come conseguenza di ciò, nelle macchine asincrone si passa da una condizione
di stabilità interna all’altra;
- macchine sincrone: sono macchine sequenziali in cui esiste almeno un simbolo
d’ingresso in presenza del quale dev’essere generata una sequenza di simboli in uscita.
La misura del tempo è indispensabile perché la macchina deve poter decidere da sola il
momento in cui è necessario produrre un nuovo simbolo della sequenza in uscita. Per
scandire il tempo la macchina si serve di eventi periodici interni; il comportamento
sincrono richiede che questo automa compia più transizioni di stato (che in genere
terminano con la stabilità, ma non sempre).
In una macchina combinatoria (es. encoder e decoder, full adder, full subtracter,
multiplexer a due vie…) con n segnali binari d’ingresso e m segnali binari d’uscita, I è
l’insieme delle 2n configurazioni di n bit, U l’insieme delle 2m configurazioni di m bit. Tramite
tabella di flusso è possibile descrivere una funzione, un’espressione, in cui ciascuna delle
possibili configurazioni di valori delle variabili indipendenti è affiancata dai valori
corrispondenti delle variabili dipendenti. Nel caso delle macchine binarie occorre dunque
introdurre un’algebra particolare basata su alcune operazioni chiuse su {0,1} (vedi cap. 4).
Il modello fin’ora descritto è astratto: l’aspetto che è stato volutamente omesso è che, dopo una
modifica d’ingresso, occorre aspettare un po’ di tempo (ritardo τp, evidenziato, nella
descrizione strutturale, come blocco di ritardo a valle di quello che rappresenta la funzione)
prima di poter riscontrare la corrispondente modifica d’uscita. Una macchina combinatoria
reale ha quindi un ritmo massimo di funzionamento, lo throughput.
La macchina asincrona, nel passaggio dal simboli i1 e i2, tiene in memoria lo stato presente
per poter calcolare lo stato futuro β. Una volta compiuto il calcolo, β sostituisce in memoria:
per un tempo ε (che può essere considerato quindi come “un piccolo ritardo”) lo stato futuro è
dunque diverso dallo stato presente. Per realizzare la macchina asincrona “reale” è quindi
sufficiente una retroazione diretta tra ogni bit di codifica dello stato futuro (in uscita) ed il bit
corrispondente dello stato iniziale (in entrata).
Esempio: consideriamo il relé ad autoritenuta con retroazione fra ingresso i (la posizione del
contatto azionato dal relé) e uscita I (corrente nella bobina). Si tratta di una macchina
sequenziale, asincrona (un solo simbolo in uscita) a due stati (I = stato futuro, i = stato
presente).
Anche una lampada con pulsante di accensione è una macchina asincrona (passa di stabilità
in stabilità, con un solo simbolo in entrata/uscita), più precisamente a quattro stati (quattro
stabilità, appunto):
- pulsante rilasciato e lampada resta spenta;
- pulsante premuto e lampada si accende;
- pulsante rilasciato e lampada resta accesa;
- pulsante premuto e lampada si spegne.
11
Luca Pagani - Riassunto di Reti Logiche A
Per ottenere un’esatta misura del tempo da una macchina sincrona occorre accettare un
vincolo: la modifica dei simboli d’ingresso, di stato e di uscita deve verificarsi solo in
corrispondenza di istanti tn, detti di sincronismo, che distano uno dall’altro di una quantità
T0 prefissata. Il funzionamento della macchina viene così suddiviso in intervalli di eguale
durata, durante ciascuno dei quali ingresso, stato e uscita sono costanti. Alla fine di ognuno di
questi, nella memoria viene scritto (dopo un tempo τp in cui si calcolano le funzioni F e G) il
simbolo di stato futuro; anche in questo caso il ruolo di memoria può essere affidato ad un
ritardo (che dev’essere esattamente di valore T0, perché in quel mentre gli stati non devono
cambiare!). Tecnica usuale per sincronizzare in maniera periodica la scrittura in memoria
(registro) dello stato futuro e la successiva sostituzione degli stati è quella di implementare un
clock.
L’uscita della macchina asincrona da porre in retroazione alla funzione G di una macchina
sincrona deve avere la proprietà di modificarsi solo in corrispondenza degli istanti di
sincronismo (non può avere ritardi qualsiasi, dovendo interagire con l’altra macchina).
ESEMPIO: I flip-flop sono dei dispositivi elettronici utilizzati nell'elettronica digitale come
dispositivi di memoria elementare; essi utilizzano ingressi di comando regolati da un ingresso
dinamico (clock). La macchina esamina il valore di un segnale d’ingresso D solo quando un
altro segnale d’ingresso C presenta un fronte di salita; il valore di D visto durante questo
momento dev’essere fornito sull’uscita U fino al fronte di salita successivo. Quali sono gli stati
possibili di questa macchina sincrona durante il fronte di salita?
- stato M Æ il fronte di salita C si verifica con segnale d’ingresso 1. La macchina dà in
uscita 1;
- stato P Æ il fronte di salita C si verifica con segnale d’ingresso 0. La macchina dà in
uscita 0.
Dopo un certo tempo si ha un fronte di discesa di C, per poter permettere un (futuro) nuovo
fronte di salita e quindi un nuovo campionamento. Ecco gli altri due stati della macchina:
- stato N Æ si verifica dopo il fronte di discesa C se l’ultimo segnale d’ingresso è stato 1;
- stato Q Æ si verifica dopo il fronte di discesa C se l’ultimo segnale d’ingresso è stato 0.
Per ricollegarci al nostro discorso, ipotizziamo ora che C sia un segnale periodico di periodo T0.
Sempre per ipotesi, poniamo che l’ingresso D sia 1 che quindi la macchina, al fronte di salita di
C, vada in M. Dopo un altro periodo T0 si ha il fronte di discesa e la macchina va in N
cambiando stato; nel frattempo D è passato a 0 quindi, al successivo fronte di salita (ancora
dopo T0), la macchina andrà in P, poi in Q e così via. Riassumendo:
Istanti di C Æ (alto = 1)
Entrata (D) Uscita (U) Stato (S)
tempo (T) clock
T0 0 - - 0
Fronte di salita, la macchina passa all’output 1, poco dopo l’entrata cambia 1 Æ 0 0Æ1
T1 0 1 M 1
T2 0 1 N 0
Fronte di salita, la macchina passa all’output 0, poco dopo l’entrata cambia 0 Æ 1 0Æ1
T3 1 0 P 1
T4 1 0 Q 0
Fronte di salita, la macchina passa all’output 1, l’entrata resta invariata 0Æ1
T5 1 1 M 1
T6 1 1 N 0
Fronte di salita, la macchina passa all’output 0, perché è cambiata l’entrata 1 Æ 0 0Æ1
Dove sta il ritardo? Il ritardo fra l’ingresso e l’uscita è pari ad esattamente T0 (vedi numeri in
grassetto). Idealmente, le righe gialle rappresentano invece il ritardo τp.
12
Luca Pagani - Riassunto di Reti Logiche A
Le strutture studiate fino ad adesso sono parte integrante di reti logiche (e lo sono loro stesse):
- rete logica sequenziale: i segnali d’uscita dipendo da quelli d’ingresso presenti e
passati; è presente una memoria, che può essere in retroazione diretta (rete asincrona)
oppure integrata da flip-flop (rete sincrona);
- rete logica combinatoria: i valori d’uscita dipendono solo da quelli contemporanei.
Il punto focale del modello di rete logica sta nell’uso di un linguaggio matematico di
espressioni, in grado di conferire descrizione unitaria al comportamento e alla struttura della
rete stessa. In genere, tale comportamento viene descritto da più tabelle di verità (m tabelle
se le applicazioni sono m), in cui vengono descritte le funzioni così strutturate: u (uscita) = F
(i1, i2, i3… in). La struttura della rete viene invece assegnata ad uno schema logico in cui
appaiono un certo numero di blocchi e i relativi collegamenti.
Viene detta booleana (da G. Boole) una funzione in cui le variabili indipendenti e la
variabile dipendente hanno come valori B: {0,1}.
Una funzione F è detta completa se il suo dominio è Bn (la relativa tabella di verità ha 2n
righe e n+1 colonne), incompleta se il dominio è un sottoinsieme di Bn (e la tabella di verità
avrà o meno di 2n righe, oppure 2n righe con molte condizioni di indifferenza “ – “).
Il numero di funzioni possibili, all’aumentare dei bit, cresce esponenzialmente: Φ(n) = 22n.
13
Luca Pagani - Riassunto di Reti Logiche A
- le quattro della funzione a un bit (che diventano sei perché vi è un buffer e un not in
più, essendoci due colonne di bit da iterare e non una);
- and, nand, or, nor, equivalence, ex-or;
- altre quattro funzioni (implicazioni).
Esaminiamo ora cosa sono le porte logiche (gates): esse sono reti logiche combinatorie alle
quali è stata data una denominazione e un simbolo grafico (per non dover ogni volta disegnare
i componenti interni e per avere una maggiore espressività). Ad ognuna di esse sono legate
due funzioni (che sono una il not dell’altra), l’una in logica positiva (assunta come standard),
l’altra in logica negativa.
Operatori:
- identità F(x) = x
- not F(x) = x’
- somma (and) F(x,y) = x + y
- prodotto (or) F(x,y) = x.y
- somma modulo due (ex-or) F(x,y) = x ⊕ y
- equivalenza (equivalence) F(x,y) = x ≡ y
- operazione di Shaffer (nand) F(x,y) = x ↑ y
- operazione di Pierce (nor) F(x,y) = x ↓ y
Definiamo dunque espressione logica una stringa in cui compaiono un certo numero di bit, le
costanti 0/1 ed alcuni degli operatori appena definiti; per evitare errori di interpretazione e di
priorità è opportuno l’uso delle parentesi. Le espressioni logiche si valutano come le
espressioni aritmetiche: prima si sostituisce ogni bit col suo valore e poi, partendo dalle
parentesi più interne, si sostituisce ogni operazione col suo risultato. Il risultato finale
(codominio) è sempre 1 o 0.
Proprietà notevoli:
- un’espressione logica descrive una e una sola funzione booleana completa;
- ogni espressione descrive uno schema logico formato da gates connessi in serie e/o
parallelo;
- espressioni di n variabili che forniscono eguale valutazione per ogni configurazione di n
bit, limitatamente al dominio di una funzione incompleta, descrivono una stessa
funzione e sono dette equivalenti. La relazione di equivalenza tra espressioni è (per
definizione) riflessiva, simmetrica, transitiva;
- tutte le operazioni fra due bit godono della proprietà commutativa;
- somma (and), prodotto (or) e somma modulo due (ex-or) godono della proprietà
associativa;
- i complementi (la versione negata) della somma (and) del prodotto (or) e della somma
modulo due (ex-or) equivalgono rispettivamente al nor, nand ed equivalence.
Quest’ultima proprietà indica che non tutti i gates sono indispensabili, mentre lo
sono di fatto gli and, or, not (con i quali si possono ottenere tutte le porte). Dal solo
nand, addirittura, si può ottenere il comportamento di tutte le porte logiche! Quando un
insieme di operatori logici consente di esprimere qualsiasi funzione di variabili binarie
esso viene detto funzionalmente completo. Ognuno di questi definisce un’algebra
binaria.
14
Luca Pagani - Riassunto di Reti Logiche A
Operazioni ed espressioni
- L’algebra di commutazione ha due costanti (0, 1) e tre operazioni (and, or, not).
- Le operazioni sono definite da 10 postulati, 4 per la somma logica, 4 per il prodotto e 2
per la complementazione.
- Le variabili sono simboli (sostituibili da 0, 1).
- Le espressioni sono stringhe di variabili, di costanti e di operatori formati in accordo
con le seguenti regole:
o 0 e 1 sono espressioni,
o una variabile è un’espressione,
o se A è un’espressione, lo è anche A’ (A complementato),
o se A, B sono espressioni, lo sono anche (A+B), (A.B).
- Ogni espressione descrive:
o una funzione completa,
o una struttura and, or, not priva di retroazioni.
Espressioni canoniche
- Espressione canonica Somma di Prodotti (SP): ogni funzione di n variabili è descritta
da una somma di tanti prodotti quante sono le configurazioni per cui vale 1. In ciascun
prodotto, o mintermine, appare ogni variabile, in forma vera se anche nella
configurazione corrispondente vale 1, in forma negata se vale 0.
- Espressione canonica Prodotto di Somme (PS): ogni funzione di n variabili è descritta
da un prodotto di tante somme quante sono le configurazioni per cui vale 0. In ciascuna
somma, o maxtermine, appare ogni variabile, in forma vera se nella configurazione
corrispondente vale 0, in forma negata se vale 1.
Le funzioni complete hanno una e una sola espressione canonica SP e PS. Le funzioni
incomplete ne hanno più di una.
Facciamo un esempio con questa funzione:
a b f(a,b) essa ha tre “uni” e uno “zero”. La forma canonica PS contiene
0 0 1 quindi il solo maxtermine a’ + b;
0 1 1 la forma canonica SP contiene i tre mintermini a’b’, a’b, ab.
1 0 0 Le due espressioni sono equivalenti e da esse, con le opportune
1 1 1 operazioni (raccoglimenti, sostituzioni notevoli), si giunge alla
forma minima F(a, b) = a’ + b
15
Luca Pagani - Riassunto di Reti Logiche A
Notazioni simboliche
La corrispondenza fa mintermini (o maxtermini) e righe della tabella di verità rende le
espressioni canoniche un utile strumento per i procedimenti di sintesi e di analisi. Per
semplificarne la scrittura sono state introdotte alcune notazioni simboliche.
i = numero (base 10) della configurazione binaria indicata su una riga della tabella di verità;
m(i) = mintermine che assume valore 1 per la configurazione di indice i;
M(i) = maxtermine che assume valore 0 per la configurazione d’indice i;
Σn = somma di mintermini di n variabili;
Πn = prodotto di maxtermini di n variabili.
I 2n possibili mintermini di una funzione di n variabili possono essere realizzati da una rete
combinatoria che richiede:
- 2n and a n ingressi,
- n o 2n not.
Questo trascodificatore da codice binario a codice “1 su N” è detto, come sappiamo, decoder.
Espressioni generali
I teoremi di espansione, o di Shannon, individuano due particolari espressioni equivalenti ad
una data espressione
E(x1,x2, … , xn-1, xn) = xn’. E(x1,x2, … , xn-1, 0) + xn.E(x1,x2, … , xn-1, 1)
E(x1,x2, … , xn-1, xn) = (xn + E(x1,x2, … , xn-1, 0)) . (xn’+E(x1,x2, … , xn-1, 1))
Si nota come al secondo membro di entrambe compaiano due espressioni di n-1 variabili: da
ciò consegue che la realizzazione di E richiede un multiplexer (a due vie) con un bit d’indirizzo,
a monte del quale occorre predisporre le reti combinatorie di due funzioni più semplici. Si può
iterare questo processo, diminuendo di volta in volta il numero di variabili.
Da qui due espressioni generali:
- ogni funzione di n variabili è descritta dalla somma logica di tutti i mintermini di
n variabili, ciascuno in prodotto logico con il valore della funzione per la
configurazione per cui esso vale 1.
2 n −1
F( x1 + x2 ,..., xn )= ∑ i = 0 m(i ).F (i )
- ogni funzione di n variabili è descritta dal prodotto logico di tutti i maxtermini di
n variabili, ciascuno in somma logica con il valore della funzione per la configurazione
per cui esso vale 0.
2 n −1
F( x1 + x 2 ,..., x n )= ∏ (M (i) + F (i))
i =0
Questa è un’altra conferma che tutte le 2 alla 2n funzioni di n variabili possono essere con una
sola formula di tipo PS o SP.
L’espressione generale SP ha come schema logico un multiplexer con n bit d’indirizzo e 2n bit
d’ingresso. Per impiegarlo nella realizzazione di una data funzione occorre solo:
- collegare i bit di indirizzo (quelli che scelgono cosa far andare in uscita, cosa prendere
da quale “via” in entrata) alle variabili indipendenti della funzione;
- imporre su ciascuna “via” il valore della funzione (0 o 1) per la configurazione binaria
delle variabili indipendenti che la seleziona; se la funzione è incompleta le vie
selezionate da configurazioni non appartenenti al dominio possono essere
indifferentemente connesse a 0 o 1 (tanto non verranno mai pescate!).
Il progetto logico impiega dunque il multiplexer in due modi diversi:
- come selettore di dati (es. nella conversione P/S);
- come generatore di funzioni.
16
Luca Pagani - Riassunto di Reti Logiche A
La disponibilità di gates pronti per l’uso è stato il primo grande contributo dato dalla
tecnologia elettronica al livello di progettazione logica delle macchine generali. La
disponibilità di un insieme ridondante di componenti primitivi è stato il secondo: la
possibilità di avvalersi di tutti i gates consente infatti di risparmiare nel loro numero (e di
diminuire, di conseguenza, la complessità della rete). Il terzo contributo è stato quello di
fornire, all’interno di un unico chip, reti sempre più complesse di gate già interconnessi
(trascodificatori, decoder, multiplexer, circuiti aritmetici, memorie, contatori…). Un insieme di
componenti di questo tipo è detto famiglia di circuiti logici e una relativa sigla ha
contraddistinto le differenti modalità di realizzazione degli interruttori che si sono succedute
nel tempo. Ogni membro della famiglia è individuato da un numero (riportato sul contenitore)
e da un data sheet. In questo documento il costruttore indica:
- le condizioni elettriche per il corretto impiego;
- la struttura logica interna (in logica positiva!);
- i parametri che caratterizzano l’andamento dei segnali d’ingresso e d’uscita;
- l’allocazione dei segnali ai piedini del contatore.
Esaminiamo da vicino alcuni di questi aspetti.
Fan-out
I punti d’ingresso e di uscita dei componenti di una famiglia sono tra loro direttamente
collegabili (devono essere agevolmente connessi!), anche se con un vincolo: ogni uscita (in
genere sono 10 o più) ha un numero massimo di ingressi a cui può essere collegata. Tale
numero è detto fan-out. Se servono più uscite basta creare copie dei segnali con dei buffer o
coppie di not.
Fan-in
C’è poi un altro vincolo: i gate disponibili nella famiglia hanno un numero di ingressi (fan-in)
relativamente basso (2-8). Se i segnali da elaborare sono di più basta implementare ulteriori
gate del tipo desiderato.
Tempo di propagazione
Ogni macchina combinatoria reale risponde con un certo ritardo alla sollecitazione che riceve
dall’esterno. Il fenomeno del ritardo alla risposta caratterizza anche il comportamento di tutti
i gate elettronici e deve essere attentamente preso in considerazione. Facciamo un esempio
concreto ed esaminiamo cosa accade con il componente not. Il ritardo con cui il segnale d’uscita
assume il valore opposto a quello presente sul segnale d’ingresso (questo è il compito del not)
ha una certa durata quando in ingresso si verifica un fronte di salita (da 0 a 1) ed una diversa
quando si verifica un fronte di discesa (da 1 a 0). Entrambi i ritardi vengono definiti nel data
sheet. La sensibile differenza fra i due fa sì che un segnale che attraversa un gate venga sia
ritardato che deformato. Per tener conto di ciò è consuetudine ipotizzare che ogni porta logica
contenga, disposti in serie:
- un gate ideale (senza ritardo) che rappresenta il comportamento del pezzo complessivo;
- un blocco che ne ritarda la forma d’onda d’uscita di una quantità (tempo di
propagazione).
Il progettista logico usa di solito il valore massimo possibile di ritardo (metodo del caso
peggiore), preferendo mettere in conto la situazione più onerosa piuttosto che operare una
preselezione dei componenti da montare.
Il tempo di propagazione viene utilizzato in due modelli differenti di ritardo:
- il ritardo puro, cioè una traslazione rigida della forma d’onda ideale di una quantità
pari a τp;
- il ritardo inerziale (più vicino alla realtà): un impulso di durata inferiore a tp (tempo
di propagazione) che non appare nel segnale d’uscita.
17
Luca Pagani - Riassunto di Reti Logiche A
Il progettista logico, dunque, è vincolato dal fatto che un segnale elaborato da un gate deve
mantenere ciascuno dei suoi valori per un tempo non inferiore a tp. Esiste quindi un limite
superiore per la velocità di funzionamento di ogni porta logica.
Comportamento in transitorio
Quello che però preme al progettista è sia di far funzionare correttamente una rete formata da
più porte logiche, sia di scegliere la struttura in grado di presentare la più alta possibile
velocità di elaborazione. Entrambi questi problemi sono connessi alla questione del ritardo
dei gate. Ogni nuova situazione dei segnali d’ingresso deve infatti propagarsi lungo dei
percorsi di elaborazione la cui complessità è determinante nella scelta della rete più veloce:
maggiore è il numero dei gates da oltrepassare, minore sarà la velocità della rete. Due sono i
differenti comportamenti temporali di ogni rete logica combinatoria:
- la prima fase inizia dopo ogni cambiamento dei segnali d’ingresso, è detta
comportamento in transitorio ed è caratterizzata dal fatto che l’uscita non ha
ancora presentato il valore previsto per la nuova configurazione. Non è costante perché
dipende dal percorso e dalla complessità della rete (più sono i gate attraverso i quali il
segnale transita, maggiore sarà il ritardo); durante il transitorio possono verificarsi
sull’uscita tre differenti tipi di forma d’onda:
o il ritardo puro, inevitabile e non dannoso;
o l’alea statica e l’alea dinamica, fenomeni causati dal fatto che l’uscita si
modifica in maniera imprevedibile (statica = una volta; dinamica = più volte)
prima di assumere il valore “corretto”; si può ignorare l’alea se la rete
combinatoria comanda una macchina totalmente insensibile agli impulsi di
breve durata (i glitch, presenti nelle macchine sincrone e assolutamente da
evitare nelle asincrone);
- la seconda fase è detta comportamento a regime, è caratterizzata dalla disponibilità di
una risposta corretta e viene raggiunta solo se gli ingressi sono stati mantenuti
costanti per tutta la durata del transitorio.
Per stimare la durata massima è usuale modellare la rete con un unico ritardo disposto a valle
del gate d’uscita ed attribuirgli un valore pari al prodotto di tp per il numero di gate disposti in
cascata sul percorso più lungo.
Retroazione
La necessità di fare reti asincrone con retroazione diretta pone diverse problematiche: a livello
fisico la retroazione riguarda un solo segnale, mentre a livello logico sono necessarie due
differenti astrazioni: una variabile indipendente (ingresso) e una variabile dipendente (uscita).
La soluzione sta nel associare due simboli ad ogni retroazione; facciamo un esempio,
considerando una rete di due nor in retroazione (ritardo = 2 τp): quando il sistema è stabile gli
ingressi S (primo nor) ed R (secondo nor) e l’uscita Q avranno lo stesso valore. Indicando con q
il bit che codifica lo stato presente della macchina asincrona, con Q (uscita) il bit dello stato
interno futuro (che va a concatenarsi nel primo nor), ricaviamo che:
Analogo comportamento può essere ottenuto disponendo due nand in cascata e poi in
retroazione; i circuiti elettronici che presentano questa struttura sono denominati latch SR: i
due ingressi sono detti rispettivamente comando di Set (attivo = uscita 1) e comando di Reset
(attivo = uscita 0). Il latch è la più semplice realizzazione di una memoria binaria, ma pone
problemi di corretto impiego. Il tempo di attivazione dei due comandi dev’essere maggiore del
tempo di ritardo della rete combinatoria che calcola lo stato futuro: se questa condizione è
soddisfatta il nuovo valore riesce a tornare in ingresso e sostituire così la causa che l’ha
determinato in una specie di “staffetta” fra i segnali.
18
Luca Pagani - Riassunto di Reti Logiche A
19
Luca Pagani - Riassunto di Reti Logiche A
Occorre però tener conto, quando si specificano i valori delle variabili (ad es. 00, 01, 11, 10) che
identificano le sottomappe, che le sottomappe adiacenti siano identificate da configurazioni
adiacenti. Sono adiacenti celle che occupano la stessa posizione in sottomappe adiacenti.
- Ricerca degli implicanti e degli implicati
Ogni cella contenente il valore 1 identifica un mintermine della funzione; due celle adiacenti
contenenti il valore 1 identificano due termini dell’espressione canonica SP che possono essere
sostituiti da un solo prodotto: in tale implicante della funzione non compare però la variabile
che ha valori diversi in corrispondenza delle due celle (il fatto che non compaia nella formula
indica proprio che nulla “importa” quale sia il suo valore, nel mintermine in questione). Questa
sostituzione di due prodotti con un solo termine è lecita anche nel caso in cui una cella
contenga 1 e l’altra il simbolo di condizione di indifferenza (-). Le indifferenze, infatti, sono
spesso utili per creare raggruppamenti più grandi possibili, come vedremo più avanti.
Per l’espressione canonica PS vale una sostituzione analoga: due celle adiacenti contenenti il
valore 0 possono essere sostituite da un unico termine-somma in cui non compare la variabile
per il cui valore differiscono le loro coordinate.
- Individuazione dei termini primi
Per agevolare l’individuazione degli implicanti e degli implicati primi di una funzione è utile
denominare raggruppamento rettangolare (RR) di ordine p un insieme formato da 2p
celle, ciascuna delle quali ha p celle adiacenti all’interno dell’insieme. Bisogna tenere ben
presente delle seguenti proprietà:
- un RR di ordine p costituito da celle contenenti il valore 1 (o anche condizioni di
indifferenza, se la funzione è incompleta) individua un implicante e viene indicato con
la notazione RR(1). Nel prodotto che lo descrive compaiono le coordinate che hanno
valore costante in corrispondenza delle celle del RR, in forma vera se valgono 1, in
forma complementata se valgono 0;
- un RR(1) non interamente incluso in un RR(1) di ordine superiore individua un
implicante primo;
- un RR di ordine p costituito da celle contenenti valore 0 (o condizioni di indifferenza, v.
sopra), individua un implicato [notazione: RR(0)]. Nella somma che lo descrive
compaiono le coordinate costanti in corrispondenza delle celle dell’RR, in forma vera
se valgono 0, in forma complementata se valgono 1;
- un RR(0) non interamente incluso in un RR(0) di ordine superiore individua un
implicato primo;
- Individuazione dei termini ridondanti
Un RR(1) le cui celle sono tutte incluse in altri RR(1) individua un prodotto la cui presenza è
inessenziale nella descrizione della funzione con una espressione normale SP. Analoga
proprietà vale per RR(0) coperti interamente da altri RR(0).
- Individuazione dei termini ridondanti
Un insieme di più RR(1) la cui unione racchiude tutte le celle contenenti il valore 1 (risp. 0)
della mappa è detto copertura degli uni (risp. copertura degli zeri). Una copertura degli uni
(zeri) individua una espressione normale SP (PS) che descrive, nel suo dominio, la funzione
assegnata tramite la mappa. Gli implicanti (implicati) che appaiono nell’espressione sono
individuati dai raggruppamenti componenti la copertura.
Una copertura è minima se l’insieme individuato sulla mappa contiene il minimo numero
possibile di RR, tutti di dimensione massima.
21
Luca Pagani - Riassunto di Reti Logiche A
Un circuito digitale VLSI (Very Large Scale Integration) può contenere al suo interno milioni
di gate interconnessi; la realizzazione di tali circuiti è onerosa e quindi, per ammortizzare le
spese, è necessario che abbiamo un grandissimo impiego (e quindi grande flessibilità d’uso).
Una strada che si è dimostrata vincente è quella dei cosiddetti circuiti programmabili: il
Costruttore predispone una struttura in grado di presentare moltissimi comportamenti e
l’Utente seleziona di volta in volta quello che gli serve. A tal fine un circuito programmabile
deve disporre di:
- n bit d’ingresso (x1, x2, …, xn),
- m bit d’uscita (z1, z2, …, zm),
- y bit di programmazione (p1, p2, …, py) Æ comportamenti programmabili = 2y.
22
Luca Pagani - Riassunto di Reti Logiche A
- Se il numero dei bit d’indirizzo è insufficiente bisogna ricorrere alla selezione a due
dimensioni: se n è il desiderato numero di bit d’indirizzo ed m (< n) quello del
componente, si dispongono in parallelo 2n-m dispositivi ROM e se ne selezionano le
uscite con dei multiplexer dotati di n-m bit d’indirizzo.
Le PLA consentono di impiegare uno stesso AND su più uscite, ma proprio per questo sono
anche più difficili da programmare.
Nelle PAL questo non è possibile, dato che il Costruttore ha già deciso quanti AND sono
assegnati a ciascun OR di uscita; un problema d’impiego può però discendere dall’eventuale
limitatezza del n° di ingressi, anche se esiste un’ampia gamma di scelta nell’ambito della
23
Luca Pagani - Riassunto di Reti Logiche A
La denominazione di memoria binaria viene attribuita a tutte le reti asincrone che sono
state adibite a ricordare il valore di un bit; l’importanza di questo comportamento le rende
componenti primitivi per ogni macchina digitale, come dimostra il fatto che la loro
realizzazione è inclusa in ogni famiglia di circuiti integrati.
La memoria binaria ha:
- due segnali d’uscita per comunicare il bit in forma vera e complementata;
- due segnali d’ingresso per sapere quando e cosa mettere in memoria.
24
Luca Pagani - Riassunto di Reti Logiche A
Sono stati messi a punto tre differenti tipi di memoria binaria, che differiscono dal tipo di
sequenza impiegata per individuare il quando e il cosa, aspetti che influenzano poi la
complessità logica interna e la facilità d’impiego:
- il latch SR,
- il latch CD,
- il flip-flop edge triggered.
Latch SR (Set-Reset)
Ricorda il valore di un bit Q comunicatole da due ingressi denominati:
- comando di SET: attivo Æ Q (bit in memoria) = 1
- comando di RESET: attivo Æ Q (bit in memoria) = 0
Se i comandi sono entrambi a zero, Q deve mantenere il valore precedentemente attribuitogli.
La macchina ha due soli stati interni (Q=0, Q=1) e quattro condizioni di stabilità (v. tabella).
Q S R Nell’ipotesi che la configurazione 11 (proibita!) non sia utilizzata in ingresso e
costituisca quindi una condizione d’indifferenza per la funzione
0
0 0 d’aggiornamento, si ottengono due espressioni minime, una NAND e una NOR:
1 SP Æ Q (stato futuro) = S + R’.q (stato presente)
0 PS Æ Q = R’.(S + q)
1 0 Espressione NOR Æ Q = R ↓ (S ↓ q)
1
Espressione NAND Æ Q = S’ ↑ (q ↑ R’)
Nelle espressioni NOR e NAND si mette a disposizione in uscita il bit Q in forma vera e
complementata senza ricorrere all’impiego di un NOT: consideriamo più da vicino lo schema a
NAND per capire come ciò è possibile.
Operando idealmente un taglio subito dopo l’uscita Q del circuito, si ottiene una rete
combinatoria a tre ingressi (S, q {segnale a valle del taglio}, R) e due uscite (Q, X {uscita del
secondo NAND} = R + q’). Le espressioni che la delineano sono (operando trasformazioni):
Q = S’ ↑ (q ↑ R’) [come prima] = S + q.R’
X = R’ ↑ q = R + q’
Che accade? Che se andiamo a costruire una mappa di
Karnaugh con i valori di q, S ed R, ci accorgiamo che gli
incroci in cui Q e X hanno lo stesso valore non vanno presi in
considerazione, o perché in ingresso viene data una
configurazione proibita (11) o perché la loro durata è
assolutamente irrilevante. Rimarranno dunque solo le
configurazioni in cui le uscite Q e X sono una il complemento
dell’altra: abbiamo quindi dimostrato che non servono
NOT, avendo già in uscita le due versioni (vera e
complementata) dei segnali.
25
Luca Pagani - Riassunto di Reti Logiche A
{SP} Q = CD + C’.q
{PS} Q = (C + q).(C’ + D)
Il comportamento è stato però ottenuto tramite un’espressione ridondante: queste sono le
espressioni minime, ma nel ricavarle è stato tolto qualcosa. Ecco infatti la versione “completa”
(con tutti gli implicanti/implicati primi – in grassetto quelli “eliminati”):
{SP} Q = CD + C’.q + D.q (implicanti primi)
{PS} Q = (C + q).(C’ + D).(D + q) (implicati primi)
Che accade se usiamo queste due ultime espressioni? Viene rispettata la proprietà per cui i
segnali d’ingresso cambiano di valore uno solo alla volta. Non si presenta dunque alea statica
perché i valori “in più” che abbiamo introdotto (e che, in assenza di problemi, si sarebbero
rivelati solamente inutili al fine della realizzazione di rete di costo minimo) impediscono il
variare di due valori contemporaneamente!
Vi è infine una quarta soluzione per risolvere lo stesso problema: l’eliminazione dell’alea può
avvenire intervenendo fisicamente sul circuito. Riprendiamo l’espressione:
{SP} Q = CD + C’.q
Si tratta di multiplexer: se a valle di questo (prima della retroazione di q che “torna” in
entrata al primo AND come input), inseriamo due porte NOT, queste genereranno un ritardo
che eliminerà l’eventuale glitch.
Per come è stato costruito e descritto il latch CD, pare ovvio che abbia una maggiore lunghezza
e complessità dell’SR (ci sono due gate in più): il transitorio deve per forza avere una durata
superiore. Ciò si spiega perché quando C passa ad 1 (ed è dunque possibile scrivere) è
necessario che D rimanga costante in tutto il percorso (due/tre gate + la retroazione) del suo
valore. Il tempo in cui D passa per i gate è detto setup time, quello in cui viene retroazionato
hold time; la durata minima del comando di campionamento C deve esser almeno pari al
tempo di setup (durante l’hold può tornare a zero senza problemi). Il lasso di tempo che
intercorre fra il fronte di salita del comando C e l’avvenuta sistemazione del segnale in
memoria viene infine detto response time.
Corse critiche
I1 I2 I3 Quando gli stati interni sono più di due occorrono più bit
00 00 01 00 di codifica, ma il relativo codice non può essere scelto
01 00 01 10 arbitrariamente. Osserviamo questo caso particolare (v.
11 00 11 11 tabella): in ogni riga compare almeno una stabilità (es.
nella riga dello 01 appare la stabilità con I2 perché
10 00 11 10
nell’incrocio c’è lo stesso valore). Osserviamo il caso in cui
26
Luca Pagani - Riassunto di Reti Logiche A
si passa dalla codifica di uno stato a un altra di distanza due [ad es. se si dà I1 nello stato 11 (e
si passa allo stato 00) o se si dà I3 nello stato 01 (e si ottiene 10)]. Non succederà mai che le
variabili di stato 00 Æ 11, 01 Æ 10 cambino contemporaneamente! Bensì:
- passaggio 00 Æ 11 (in arancione)
CASO 1: si modifica prima il bit di maggior peso e si passa allo stato 10. Nel frattempo
l’ingresso non è cambiato (si continua a dare I1) ma non c’è problema: nello stato 10, con
I1, la macchina continua a tendere alla stabilità di 00.
CASO 2: si modifica prima il bit di minor peso e si passa allo stato 01. Nel frattempo
l’ingresso non è cambiato (si continua a dare I1) ma non c’è problema: nello stato 01, con
I1, la macchina continua a tendere alla stabilità di 00.
Questa corsa si dice non critica. La macchina arriva a 00 come desiderato.
- passaggio 01 Æ 10 (in viola)
CASO 1: si modifica prima il bit di maggior peso e si passa allo stato 11. Con lo stesso
ingresso (che non è cambiato), la macchina ha raggiunto una stabilità in 11 (incrocio fra
I3 e 11). La macchina non giungerà mai a 10, che è il valore cui dovrebbe andare!
CASO 2: si modifica prima il bit di minor peso e si passa allo stato 00. Con lo stesso
ingresso (che non è cambiato), si passa all’incrocio fra I3 e 00 e qui la macchina è
stabile. Anche in questo caso una stabilità non voluta ha “catturato” il valore prima che
la macchina raggiungesse lo stato esatto.
Questa corsa si dice critica.
Le corse critiche, con opportuni accorgimenti, possono essere evitate. In particolare, esiste il
vincolo dell’adiacenza delle configurazioni di stato presente e di stato futuro: in tutte le
colonne in cui sono previste più condizioni di stabilità, le codifiche degli stati coinvolti in una
transizione devono differire per un solo bit.
Ecco come rispettare la regola:
- grafo delle adiacenze: dopo aver “idealmente” eliminato dalla tabella di flusso le
colonne in cui è presente una sola condizione di stabilità, si traccia un grafo in cui tutti
gli stati della macchina sono connessi a tutti i loro possibili stati futuri da un ramo non
orientato;
- verifica: si costruisce una mappa per il n° minimo di variabili di stato e le si
“sovrappone” il grafo delle adiacenze, inserendo uno stato in ogni casella. Così
costruita, la mappa indica una codifica priva di corse critiche;
- ricerca della transazione multipla: se non è possibile risolvere il problema con i due
I1 I2 I3 passi precedenti bisogna faticare un altro po’.
A A B C Vediamo l’esempio in tabella: per ipotesi supponiamo
B D B C (Æ A) che B e C siano i due stati impossibili da codificare
C A C C con configurazioni adiacenti. Supponiamo poi che A
D D B D sia adiacente sia a B che a C: per eliminare il
problema della corsa multipla basta dunque
effettuare una transizone multipla che faccia passare la macchina prima da B ad A, e quindi
da A a C. Tali modifiche vanno improntate direttamente in tabella, come si vede nell’incrocio
fra I3 e B. Se nell’incrocio fra I3 e A era inizialmente presente una condizione d’indifferenza, si
poteva mettere C senza alcun problema.
- response: intervallo di tempo successivo al fronte del clock impegnato dal circuito per
attribuire valori complementari ai suoi due segnali d’uscita.
Le espressioni sono minime. Sono state infatti ottenute usando il minimo numero di RR
di dimensioni massime: ciò però non ha eliminato il pericolo dell’alea statica! Non viene
infatti rispettata la seguente regola: una rete combinatoria in cui segnali d’ingresso
cambiano di valore uno solo alla volta non presenta alea statica se la copertura degli
uni (degli zeri) è fatta in maniera che ogni coppia di 1 (di 0) contenuta in celle adiacenti
sia racchiusa in almeno un RR. E ciò non avviene.
- PASSO 4, studio delle condizioni di stabilità.
Si evidenziano sulla tabella le situazioni di stabilità della rete (caselle in cui lo stato
futuro è uguale allo stato presente). Si verifica se la codifica degli stati adottata dal
circuito non presenta corse critiche. Riferiamoci ancora all’esempio precedente.
28
Luca Pagani - Riassunto di Reti Logiche A
applicare una regolina: gli incroci fra 10 e B, fra 10 e D (in verde), distano
“orizzontalmente” 2 da una condizione di stabilità sulla stessa riga. Lì può essere posta
una condizione di indifferenza.
- PASSO 5, individuazione della tabella di flusso e del grafo degli stati.
Si sostituisce con una lettera ogni configurazione di stato indicata sulla tabella delle
transizioni; una volta ottenuta la tabella di flusso, i eliminano, se presenti, tutte le
transizioni multiple (annotando direttamente in ogni incrocio instabile lo stato finale
stabile che verrà raggiunto) e tutti gli stati sulla cui riga non compare almeno una
condizione di stabilità; lo studio del comportamento ha come obiettivo l’individuazione
di una compatta descrizione a parole e può quindi esser prima indirizzato
all’eliminazione di stati ridondanti: una riga della tabella di flusso può essere
eliminata se i suoi incroci sono identici a quelli di un’altra riga (o se ci sono
indifferenze).
Nel caso delle macchine asincrone è necessario ricordarsi che gli stati di un circuito con k
retroazioni sono sempre 2k. L’automa (magari quello minimo) che modella il
comportamento del circuito può però averne un numero inferiore: in tal caso bisogna rendere
instabili gli stati “in più” per ogni ingresso.
29
Luca Pagani - Riassunto di Reti Logiche A
Il modello della rete sincrona prevede una rete combinatoria dotata di un certo numero di
retroazioni, su ciascuna delle quali è presente un ritardo di durata T0. Con queste
retroazioni non dirette, la macchina sequenziale sincrona appare a prima vista solo come una
versione più lenta della macchina asincrona, in quanto occorre attendere sempre T0 prima che
il valore dello stato futuro sia disponibile come stato presente. Il tener conto dello scorrere del
tempo è però fondamentale in quanto incrementa di molto il numero di comportamenti
realizzabili: la misura del tempo è infatti indispensabile ogniqualvolta l’informazione è
associata non solo alla sequenza, ma anche alla durata dei simboli d’ingresso e/o d’uscita. In
questo caso occorre infatti saper svolgere azioni diverse ad istanti diversi.
Per misurare il tempo si utilizzano istanti di sincronismo posti a distanza T0 l’uno dall’altro.
In ogni intervallo elementare di funzionamento la macchina fornisce un simbolo d’uscita di
pari durata e si calcola un nuovo riassunto di ciò che ha fatto fino a quel momento;
l’aggiornamento dello stato presente avviene all’inizio dell’intervallo successivo. In realtà la
realizzazione del ritardo con un flip-flop rende meno stringente il vincolo del perfetto
sincronismo dei segnali. Il suo coretto impiego richiede infatti soltanto che il segnale da
campionare abbia e mantenga il valore desiderato per un po’ di tempo
- prima (setup time, τSU), e
- dopo (hold time, τHS)
il verificarsi di un fronte di salita del clock. Occorre dunque che il calcolo dello stato futuro
avvenga all’istante t - τSU (τSU prima di quando si verifica il fronte del clock). Indicando come
τRC il ritardo, nel caso peggiore, di questa rete combinatoria, possiamo dire che i suoi ingressi,
cioè le configurazioni associate al simbolo che proviene dall’esterno ed al simbolo di stato
interno, devono avere valori a regime all’istante t - τSU - τRC. I segnali d’ingresso devono
dunque aver completato il loro transitorio prima di questo istante. La stessa condizione
30
Luca Pagani - Riassunto di Reti Logiche A
deve valere anche per i segnali di stato presente, cioè per le uscite dei flip-flop. Sappiamo però
che il flip-flop impiega un certo tempo a partire dal fronte del clock (response time, τR) per
completare l’esecuzione del comando di scrittura: tale comando deve quindi essere stato dato
prima dell’istante t - τSU - τRC - τR. In conclusione, il periodo dell’oscillatore dev’essere un po’ più
grande della durata del transitorio sull’anello di retroazione: T0 > τSU + τRC + τR. Il rispetto del
vincolo che il segnale in ingresso al flip-flop mantenga il valore campionato per almeno τH è
garantito dal fatto che nelle realizzazioni integrate si ha sempre τH < τR. Si può quindi
retroazionare direttamente l’uscita del flip-flop sul suo ingresso senza temere che il valore
campionato scompaia prima del tempo.
Tipi di flip-flop
Per chiudere le retroazioni di un circuito sincrono non c’è solo il flip-flop D, che abbiamo
studiato fin’ora. Nell’ambito dei circuiti elettronici integrati sono stati infatti realizzati anche
quello JK e quello T.
Nel flip-flop D (già esaminato) le variabili di stato futuro (in entrata) sono connesse agli
ingressi D di altrettanti flip-flop, mentre le variabili di stato presente (in uscita) sono
disponibili sulle loro uscite Q.
Il flip-flop JK, macchina asincrona azionata da fronti di clock, ha due ingressi (detti J e K)
tramite i quali è possibile imporgli quattro differenti comportamenti:
- J = 0, K = 0 (hold), mantiene Q;
- J = 1, K = 0 (set), dà 1;
- J = 0, K = 1 (reset), dà 0;
- J = 1, K = 1 (toggle), complementa Q.
La sua equazione caratteristica è: Qn+1 = (J.Q’ + K’.Q)n.
31
Luca Pagani - Riassunto di Reti Logiche A
Prese in considerazione le due tabelle di prima, sono stati messi in grassetto i valori che
comportano un cambiamento della variabile di stato presente. Ora servono altre 4
mappe: 2 per il J e il K di Y1, altrettante per il J e il K di Y2.
32
Luca Pagani - Riassunto di Reti Logiche A
00 01 11 00 01 11
0 0 0 - 0 - - 1
1 0 1 - 1 - - 0
J1 = x.y2 K1 = y2.x’
00 01 11 00 01 11
0 0 - - 0 - 1 1
1 1 - - 1 - 0 0
J2 = x.y1’ K2 = y2.x’
Ci vuole certamente più tempo a elaborare le mappe per i flip-flop JK, ma le reti
combinatorie che ne risultano sono di certo più semplici.
FLIP-FLOP T:
Si opera come si è fatto nel JK, adattando le regole a quelle del T:
- si deve dare 1 quando bisogna invertire una variabile;
- si deve dare 0 quando bisogna mantenere il suo valore.
Prendiamo ancora una volta in considerazione le mappe delle variabili di stato futuro.
00 01 11 00 01 11
0 0 0 0 0 0 0 0
1 0 1 1 1 1 1 1
Y1n+1 Y2n+1
Ancora una volta sono in grassetto le caselle in cui è prevista variazione di variabile: a
queste va immediatamente associato un 1 nelle tabelle riguardanti i rispettivi T. Nelle
altre mettiamo direttamente 0.
00 01 11 00 01 11
0 0 0 1 0 0 1 1
1 0 1 0 1 1 0 0
T1 = x.y1’.y2 + x’.y1.y2 T2 = x.y1’.y2’ + x’.y2
- PASSO 6: disegno dello schema logico.
Al solito.
33
Luca Pagani - Riassunto di Reti Logiche A
Registro
Per chiudere le retroazioni di una rete sincrona occorrono, in generale, diversi flip-flop.
Una loro disposizione in parallelo (registro) è quindi sicuramente un utile componente
complesso in ogni progetto e si rivela ancor più utile se è in grado di svolgere più compiti.
Facciamo un esempio: consideriamo una rete sincrona adibita a svolgere un certo algoritmo; in
ogni istante, lo stato interno rappresenta il risultato parziale ottenuto elaborando (in ogni
intervallo elementare di funzionamento) i dati che provengono dall’ingresso: sul registro di
retroazione, detto accumulatore, c’è dunque un certo valore all’inizio di ogni intervallo ed un
nuovo ed in generale diverso valore al termine dello stesso intervallo. Ecco che si presenta
l’utilità di introdurre due bit di comando, a cui sono associati tre comportamenti:
WE RES Comportamento
- 1 Inizializzazione con un dato appropriato (es. 0)
1 0 L’aggiornamento con un nuovo risultato calcolato dalla rete combinatoria
La memorizzazione del risultato finale fino al suo “prelievo” da parte
0 0
dell’utente che ha commissionato l’esecuzione dell’algoritmo.
Può tutto ciò essere realizzato con un multiplexer, un gate AND, un flip-flop D.
Al multiplexer viene fornito in entrata Ii, che viene dato in uscita quando WE = 1 e quindi è
necessario un aggiornamento; altrimenti (nel caso in cui WE = 0, detto memorizzazione)
“passa” ciò che sta nell’altra entrata del MUX, ovvero la retroazionata uscita Qi del flip-flop D
(che sta a valle di tutto). L’uscita del MUX diventa input, assieme al comando RES negato, di
un gate AND; se RES = 1 si genera 0 sull’ingresso D del flip-flop (fase di inizializzazione),
altrimenti l’entrata D del flip-flop riceve ciò che uscito dal MUX.
Posso ottenere un risultato simile con un flip-flop JK (che è più “potente” e richiede meno
gates): le espressioni per le entrate diventano le seguenti
Ji = RES’.WE.Ii
Ki = RES + WE.Ii’
34
Luca Pagani - Riassunto di Reti Logiche A
Contatore
Sono dette contatori le reti sequenziali sincrone il cui grafo presenta un ciclo contenente
tutti, o quasi tutti, gli stati interni. Parametri importanti per la struttura ed il
comportamento di un contatore sono il n° di stati appartenenti al ciclo, detto base di
conteggio (es. il contatore “modulo 16” conta da 0 a 15 e ha in totale 16 stati), e la codifica
degli stati. Il caso di maggiore interesse è quello del contatore binario, in cui tutti gli stati
appartengono al ciclo e in cui stati successivi sono codificati da configurazioni consecutive in
base 2. In questo caso particolare si evincono alcune proprietà “notevoli”:
- tutte le uscite del flip-flop sono onde quadre;
- l’uscita Qi del flip-flop che memorizza il bit di peso 2i ha un periodo doppio di quella
presente su Qi-1, dove è memorizzato il bit di peso 2i-1;
- l’uscita del Q0 del flip-flop che memorizza il bit di peso 20 divide per 2 la frequenza del
clock.
Potrebbe venir da pensare che, per implementare un contatore, sia necessario un full adder
ma così, fortunatamente, non è. Non c’è infatti bisogno di una rete così complessa per una
funzione così semplice; partiamo dal bit meno significativo: per ottenere Q0n+1 da Q0n è
sufficiente un EX-OR in cui si dà in entrata CI (carry in) = 1 (sta a simboleggiare che bisogna
ogni volta aggiungere 1) e Q0n. Per ottenere il riporto è sufficiente collegare R a Q0 (1, che
sarebbe CI, +1, che sarebbe Q0, dà resto 1; 1+0 dà in maniera evidente resto 0; dunque R = Q0).
E per i bit di maggior peso di 20? Al posto del CI inseriamo, nell’EX-OR, il riporto della somma
dei bit di peso immediatamente inferiore; nell’altra entrata mettiamo Qin, cioè il valore del bit
che stiamo eventualmente incrementando. Per il calcolo del nuovo resto (da far entrare
nell’EX-OR successivo) è invece sufficiente un AND fra le stesse due entrate del sopraccitato
EX-OR (Qi e Ri). Iterando questo procedimento possiamo creare il sommatore con riporto
(un full adder in miniatura!) per ogni bit del nostro numero binario.
Ora bisogna scegliere un flip-flop, che sincronizzi i passi dell’algoritmo grazie al suo clock, da
inserire tra ogni “blocco” che si occupa di incrementare il bit di un certo peso: se scegliamo il
flip-flop D la rete è esattamente quella vista poco più sopra, con il percorso d’elaborazione più
lungo pari a 3 gate.
Facendo la stessa cosa con i flip-flop JK si ha un duplice vantaggio: scompaiono tutti gli EX-
OR (percorso massimo: 2 gate) ed il contatore può essere impiegato con una frequenza di clock
più alta.
Esiste infine un ultimo modo alternativo: l’algebra binaria ci dice che, nel caso di un
incremento unitario, ogni bit del numero da incrementare modifica il suo valore se, e solo se,
tutti i bit di minor peso hanno valore 1. L’i-esimo flip-flop JK può dunque essere preceduto da
un solo AND (percorso massimo: 1 gate) che riceve in ingresso le uscite di tutti i flip-flop che
memorizzano bit di peso inferiore ad i. Se sono tutte pari ad 1, tale sarà anche l’uscita. La
contropartita di questa velocissima rete è che il fan-in degli AND cresce con i.
Comandi di un contatore
Per offrire una maggiore flessibilità d’impiego, un circuito di conteggio è di solito dotato di
comandi sincroni esterni. Quattro sono quelli che più frequentemente sono messi a
disposizione del progettista logico, anche se non tutti contemporaneamente:
- enable: consente di abilitare o meno la modifica dello stato interno;
- reset: consente di imporre una configurazione iniziale di tutti zeri;
- load: consente di imporre una qualsiasi configurazione iniziale;
- up/down: consente di percorrere il ciclo di conteggio in un verso o nell’altro.
Facciamo riferimento al contatore binario nella sua realizzazione più veloce (l’ultima, quella
degli AND con elevato fan-in).
- Il comando di enable è connesso a tutti gli AND del riporto e abilita quindi la modifica dei
valori contenuti nei flip-flop solo se è posto a 1.
35
Luca Pagani - Riassunto di Reti Logiche A
- Il comando di reset arriva in ogni cella e viene eseguito quando vale 1; esso viene inserito
(negato) in AND e (vero) nell’OR che andranno a finire rispettivamente nel J e nel K del flip-
flop. Ha una priorità maggiore dell’enable.
- Il comando di load, alternativo al reset, si avvale di due MUX, posti a monte di J e K, per
introdurre nella cella il valore di un bit esterno.
- Il comando di up/down richiede una breve premessa: complementando tutti gli ingressi
dell’AND di ogni cella del contatore binario (complemento a due) si calcola il bit di prestito
invece del bit di riporto: il numero memorizzato nel contatore viene quindi decrementato di
un’unità per ogni fronte del clock. Se predispongo due AND in parallelo (invece che uno), in cui
nel primo si dà in input i bit in forma vera e il comando U/D (anch’egli in forma vera), nel
secondo gli stessi bit e lo stesso comando U/D, ma in forma complementata, e infine collego le
due uscite ad un OR e quindi l’uscita di quest’ultimo alle entrate J = K del flip-flop, allora ho
ottenuto un selettore a due vie. Con U = D’ = 1 sommerò, con U = D’ = 0 sottrarrò: nel primo
caso conterò in avanti, nel secondo all’indietro.
La memorizzazione dello stato interno di una qualsiasi RSA (Rete Sequenziale Asincrona)
può essere affidata a un contatore: basta infatti sceglierne uno con comando di LOAD, fissare
il comando a 1 e disporre l’accumulatore così ottenuto in retroazione alla rete che calcola lo
stato futuro. In questo modo il contatore non conterà un bel niente, non modificherà il valore
datogli, ma si limiterà a mantenerlo e a darlo in output all’occorrenza. Tuttavia non è questo il
modo migliore per impiegarlo. Vediamo perché con un esempio.
Una rete sequenziale sincrona ha un ingresso X che assume il valore 1 molto di rado e
comunque sempre per un solo periodo di clock. L’uscita Z della rete deve ritardare questo
impulso di 4 unità di tempo e raddoppiarne la durata. Il grafo degli stati è semplice: gli stati
sono 6, con il primo ad essere stabile per 0 (attesa di un 1 su X); quando si presenta un 1, la
macchina inizia a passare di stato in stato (uno per ogni clock), fino a quando, dal quinto al
sesto e dal sesto al primo, non dà due volte 1 su Z. Ecco la tabella delle transizioni e quella
riguardante EN, RES, Z.
36
Luca Pagani - Riassunto di Reti Logiche A
Registri a scorrimento
Abbiamo già parlato dei registri formati da un certo numero di flip-flop. L’ingresso del primo
flop-flop della cascata è usualmente denominato SI (Serial Input); l’uscita dell’ultimo flip-flop
è detta SO (Serial Output). Possono essere utilizzati questi registri nello sviluppo di:
- linee di ritardo;
- convertitori P/S e S/P;
- conteggio;
- memoria a circolazione;
- rotazione verso destra/sinistra;
- moltiplicazione/divisione per 2i.
Per coprile tutte è stato predisposto l’USR (Universal Shift Register), un circuito a 4-bit in cui
ogni flip-flop della cascata è preceduto da un MUX a quattro vie, le quali sono:
- la sua uscita Qi;
- l’uscita del precedente Qi-1;
- l’uscita del successivo Qi+1;
- un bit esterno Ii.
I due bit d’indirizzo del multiplexer gestiscono quattro differenti comportamenti:
A1 A0 Comportamento
0 0 Mantenimento dello stato
0 1 Scorrimento (shift) verso destra
1 0 Scorrimento (shift) verso sinistra
1 1 Caricamento di un dato (Ii)
Facciamo alcuni esempi.
Voglio creare un ciclo di conteggio in base quattro (contatore ad anello) con degli SR.
Possiamo usare il codice 1 su 4 (1000 – 0100 – 0010 – 0001) e, per realizzarlo, è sufficiente
collegare SO con SI. Il principio, detto in maniera schietta, sta nello spostare (shift) le cifre del
numero binario, introducendone – ogni volta – una da sinistra e facendone “uscire” una da
destra. Inizializzato, ad esempio, il circuito di conteggio ad anello in base 4 con 1000, la
macchina continuerà a “inserire a sinistra” degli zeri (0 Æ1000 ; 0100 Æ 0) fino a quando il
SO (in questo caso la cifra più a destra del numero) non andrà a riversarsi sul SI, facendo
ricominciare il ciclo (1 (SI) Æ0001 (SO) ; 1000 Æ 1).
In alternativa, con lo stesso numero di bit, posso contare in base 8 utilizzando il Codice
Johnson: invece che far traslare un singolo 1 lungo il numero binario fatto di zeri, lo si può
riempire di uni fino al totale riempimento e quindi reinserire zeri fino allo svuotamento.
Questa volta, però, è necessario collegare il SO negato allo SI. Partendo infatti da 0000 si
procede fino al riempimento degli 1 (1 (SO negato) Æ 0000 (SO) ; 1000 Æ 0 // …) e il successivo
inserimento di zeri (0 (SO negato) Æ 1111 (SO) ; 0111 Æ 1 // …).
37