Sei sulla pagina 1di 37

Luca Pagani - Riassunto di Reti Logiche A

CAPITOLO 1 – Macchine digitali


Da sempre l’uomo costruisce macchine per rappresentare e trattare le informazioni: questi
sistemi artificiali operano su insiemi discreti di simboli e sono per questo detti digitali.
L’evoluzione di queste macchine ha subito un vera e propria esplosione con l’avvento della
meccanica, dell’elettrica e dell’elettronica: la tecnologia si è affinata, la velocità operativa è
aumentata vertiginosamente, l’ingombro si è ridotto.

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.

Le tre regole di disposizione dei blocchi sono (I = input, O = output, M1 ed M2 = macchine):


- disposizione in serie: O = M1 ( M2 ( I ) );
O1 = M1 ( I )
- disposizione in parallelo:
O2 = M2 ( I )
- disposizione in retroazione: O = M1 ( I, M2 (M1 ( I ) ) );

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.

Dal punto di vista dello sviluppo temporale:


- il programma viene caricato in memoria,
- vengono reperite le istruzioni (fetch),
- vengono eseguite le istruzioni (execute).

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

- un esecutore delle operazioni che il linguaggio di macchina mette a disposizione del


programmatore.
Tale livello si pone l’obiettivo di fornire al livello superiore, quello del software, un insieme di
istruzioni (instruction set) che può esprimere qualsiasi algoritmo. L’esecuzione è ottenuta
coordinando le quattro unità funzionali costituite da:
- processore (sopra descritto: contiene l’interprete, l’esecutore e la memoria per i
risultati parziali);
- memoria principale: contiene il programma e i suoi dati, il software di base necessario
per eseguirlo (kernel del sistema operativo, drivers…) e le tabelle di dati che fanno
funzionare l’intero sistema;
- unità di ingresso/uscita (I/O), che contiene le interfacce dei dispositivi installati;
- bus, che trasporta i segnali elettrici fra questi tre componenti.

I pregi che caratterizzano una macchina ben costruita sono:


- adattabilità,
- capacità di memorizzazione,
- velocità d’esecuzione,
- potenza espressiva,
- sicurezza del funzionamento.

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.

1.2 – Segnali e interruttori

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:

I L1 = f1(I) L2 = f2(I) 1 = interruttore alto / lampadina accesa


1 1 0 0 = interruttore basso / lampadina spenta
0 0 1 I = interruttore
L1, L2 = le due lampadine, descritte da due “funzioni”

Il comportamento della lampadina 1 riporta in uscita il valore d’ingresso (buffer); la lampadina


2 lo inverte (not).

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.

La tecnologia elettronica ha consentito di assemblare, sotto forma di un unico componente


fisico, un numero sempre più grande di interruttori interconnessi, mettendo così a disposizione
dei soprastanti livelli di progettazione componenti primitivi di sempre maggiore complessità.

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.

CAPITOLO 2 – Codifica binaria dell’informazione


La comunicazione ha bisogno di:
- una sorgente e una destinazione;
- un canale (sopporto di comunicazione);
- un’informazione comunicata (messaggio), definita da:
o alfabeto (numero finito di simboli concordati da sorgente e destinazione);
o stringhe (giustapposizione di simboli in un certo ordine).

Nelle macchine digitali l’alfabeto è l’insieme {1,0} e qualsiasi informazione è rappresentata da


una stringa di bit. Un aspetto cruciale riveste quindi la regola che attribuisce un ben preciso
significato ad ogni configurazione binaria che viene trattata.

Se I è un’insieme di informazioni (in tutto M) rappresentate con stringhe di simboli, si


definisce codice binario una funzione dall’insieme Bn (l’insieme delle 2n distinte
configurazioni di n bit) all’insieme I.
Ovviamente, è necessario che 2n ≥ M (sennò non ci sarebbero abbastanza codifiche per le
informazioni che bisogna rappresentare!).
Quando un codice utilizza l’n “più piccolo possibile” (log2 M) che permetta di rappresentare le
M informazioni, allora si dice non ridondante. Se l’n è “più grande dello stretto necessario”
(facendo sì che vi sia un certo numero di configurazioni di bit che non vengono associate a
informazioni) allora si parla di codice ridondante. Il concetto di ridondanza non è un concetto
intrinsecamente “negativo”: sebbene sia innegabile che i codici non ridondanti permettano di
limitare al massimo il costo del supporto fisico necessario per trasmettere e memorizzare i bit,
i codici ridondanti hanno tuttavia il pregio di semplificare la generazione/interpretazione dei
dati, mentre in altri casi ne verificano l’integrità.
Una volta fissato n, si possono avere più codici per I: la prima informazione più essere
rappresentata in 2n modi diversi; la seconda (una volta fissata la prima) in 2n-1 modi. A parità
di n e di M il numero C di differenti codici (tutti validi, visto che trattasi di convenzione) è pari
a C = 2n! / (2n – M)!.

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.

Il sistema di numerazione (posizionale) in base 2 è certamente il più semplice e conosciuto. In


esso, il valore di una certa stringa è espresso da un polinomio in cui ciascuna cifra è pesata da
una potenza di b con esponente uguale alla distanza della cifra dal simbolo che separa la parte
intera da quella frazionaria. Questa rappresentazione è di certo la più conveniente per le unità
di elaborazione, ma richiede l’esecuzione di algoritmi di trascodifica, per consentire all’uomo di
continuare ad impiegare la per lui più familiare notazione decimale.
Per trattare direttamente coi numeri binari, sono stati poi inventati codici che riducono la
lunghezza della stringa di bit, in modo da permettere una lettura più agile:
- codice octal: si divide la stringa di bit in pacchetti di 3 bit e si sostituisce ogni numero
binario col corrispondente decimale (es. 12 = 001-010);
- codice esadecimale: si divide la stringa di bit in pacchetti di 4 bit, sostituendovi i
simboli 1…9, A…F.
Per quanto riguarda le notazioni:
- la notazione scientifica usata per rappresentare numeri molto grandi o molto piccoli
richiede due stringhe binarie: una per il segno ed il valore assoluto della mantissa,
un’altra per esprimere il segno e il valore assoluto dell’esponente di 2.
- IEEE 754 è invece lo standard più usato per la rappresentazione di un numero in
virgola mobile.

Le operazioni aritmetiche in sistema binario sono così strutturate:


- addizione: l’addizione tra n bit genera un risultato di n+1 bit. Quando se ne sommano
due, il bit di maggior peso (quello a sinistra) è detto riporto. La macchina in grado di
eseguire le somme, tramite l’algoritmo simile a quello che usiamo noi umani quando
facciamo le operazioni in colonna, è detta full adder;
- sottrazione: la sottrazione tra due numeri naturali formati da un bit è definita solo nei
tre casi in cui il minuendo non è più piccolo del sottraendo. Presi n bit, si può effettuare
la sottrazione in colonna introducendo, all’occorrenza, un bit preso in prestito dalla
colonna di peso immediatamente superiore. L’algoritmo è simile a quello che usano gli
esseri umani e la relativa macchina si chiama full subtracter;
- moltiplicazione: moltiplicando due bit si ottiene un bit, moltiplicando due numeri
binari di n bit si ottiene un risultato di 2n bit. Ancora una volta, il procedimento è
analogo quello della moltiplicazione in colonna.
- divisione: richiede successive sottrazioni del divisore dal dividendo.

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

- Trasmissione in serie: il segnale è unico, i bit vengono trasmessi uno di seguito


all’altro. Il costo è minimo, ma il tempo di trasmissione è molto alto rispetto alla
trasmissione in parallelo (passano “uno per volta”).
- Trasmissione serie/parallelo: la giusta via di mezzo per coniugare la velocità del
collegamento in parallelo con i basti costi del collegamento in serie. I bit di codifica
vengono prima suddivisi in pacchetti, quindi inviati uno alla volta e riassemblati a
destinazione.
Una macchina digitale impiega in genera la trasmissione in parallelo al suo interno (per
massimizzare lo throughput – ovvero la quantità di dati inviata in funzione del tempo) e la
trasmissione in serie con l’esterno (per minimizzare il supporto fisico).

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

I disturbi (o rumori, in genere interferenze elettromagnetiche) possono modificare in maniera


non prevedibile la sequenza di valori che il trasmettitore ha immesso sul canale; per impedire
al ricevitore di prendere decisioni errate, occorre dunque fornire la possibilità di riconoscere
queste situazioni. Condizione necessaria è che il codice sia ridondante: se arriva una
configurazione “non utilizzata” (non assegnata in maniera biunivoca ad un’informazione) il
ricevente ha la certezza che si siano verificati errori; se invece arrivasse una configurazione

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 separabile è il modo più agevole per proteggere da errori informazioni


originalmente rappresentate con un codice non ridondante. A monte della sezione critica
(quella in cui è probabile l’insorgere di errori) una macchina affianca ai bit di informazione (I)
un certo numero bit di controllo (C) ottenuti tramite una funzione F(I). All’uscita della sezione
critica un’altra macchina ricalcola i bit di controllo, li confronta con quelli ricevuti e, se vi sono
discrepanze, genera i bit sindrome d’errore. Se questi ultimi sono tutti a 0, l’informazione
ricevuta è considerata integra; se ce n’è almeno uno non nullo la macchina può mettere in atto
una delle seguenti politiche:
- scarto dei dati errati;
- manutenzione: si interviene sul canale sospendendo il servizio quando la frequenza
degli errori supera un soglia prefissata;
- ritrasmissione dei dati;
- correzione (sfruttando contesto e ridondanza).

Intervenendo opportunamente sulla realizzazione fisica del canale (uso di conduttori


schermati) è possibile formulare l’ipotesi che la modifica del valore di un bit (errore, con e =
numero di errori) all’interno di una stringa di n bit sia un evento aleatorio indipendente dalla
posizione del bit nella stringa e caratterizzato da una probabilità di occorrenza p. Con questo
⎛n⎞
modello, p si ricava con la formula di Bernoulli: Pe = ⎜⎜ ⎟⎟ ⋅ p e ⋅ (1 − p ) n −e .
⎝e ⎠
Per definire i codici in grado di proteggere la comunicazione dell’informazione da questo tipo di
errori si è dimostrato utile definire alcuni indicatori, tra i quali il più importante è la
distanza minima (DMIN) di un codice, ovvero valore minimo della distanza (numero di bit
omologhi con valore diverso) fra due configurazioni qualsiasi dello stesso codice. I codici con
DMIN=k+1 consentono di rilevare fino a k errori contemporanei.

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.

Da questo modello facciamo un passo avanti operando una distinzione:


- una macchina è detta combinatoria se il simbolo d’uscita in ogni istante dipende
solo dal simbolo d’ingresso contemporaneo. L’insieme finito S degli stati interni
della macchina è vuoto o contiene un unico stato. Non si opera alcuna retroazione;
- una macchina si dice sequenziale se il valore di ogni simbolo della stringa d’uscita
dipende al valore contemporaneamente presente in ingresso, da quelli arrivati in
istanti precedenti e dal suo stato iniziale; l’insieme finito S degli stati interni della
macchina contiene due o più stati e occorre saper scegliere ad ogni istante quale dovrà
essere lo stato futuro. Rispetto alla macchina combinatoria ha, in più, una memoria di
retroazione.

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.

Il progetto logico impiega due differenti modelli d’automa:


- l’automa di Mealy;
- l’automa di Moore, che è un caso particolare di quello di Mealy in quanto l’uscita
dipende solo dallo stato presente. La tabella di flusso è quindi semplificata,
essendo specificato ad ogni incrocio solo lo stato futuro, mentre l’output è in una
colonna a parte.

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).

3.2 – La macchina combinatoria

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 della macchina combinatoria gode delle proprietà di:


- composizione in serie e/o parallelo di macchine combinatorie qualsiasi (per ottenere
una macchina combinatoria più complessa);
- decomposizione (processo inverso).
Ad es., per la somma di due numeri binari di n bit, può essere necessaria la composizione in
serie di n full adder, ognuno dei quali calcola la somma di un bit di determinato peso e passa,
al componente “successivo”, il riporto.

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.

3.3 – La macchina asincrona

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

3.4 – La macchina sincrona

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

Risulta rilevante evidenziare che il flip-flop permette di trasformare un segnale asincrono in


sincrono: una volta che il segnale asincrono è dato in entrata, il flip-flop lo “sincronizza” ad
ogni scatto del clock.

Altri esempi di macchina sincrona sono il contatore modulo N e il semaforo.

CAPITOLO 4 – Reti logiche


Rete logica è la denominazione che viene usualmente attribuita al modello della macchina a
stati finiti quando si mette in conto la rappresentazione binaria dei simboli d’ingresso, d’uscita
e di stato interno.
- La parola rete indica che il modello studia strutture formate da parti che interagiscono;
- la parola logica sottintende l’uso di segnali a due valori come strumento di iterazione
ed evidenzia l’impiego del metodo deduttivo (introdotto per la prima volta da Aristotele)
per passare dal comportamento alla struttura (sintesi) o dalla struttura al
comportamento (analisi).

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.

Passaggio da tabella di verità a schema logico Æ Sintesi


Passaggio da schema logico a tabella di verità Æ Analisi
Per svolgere questi due procedimenti occorre:
- scegliere le funzioni che si vuole descrivere tramite un’operazione;
- individuare le porte logiche che eseguono tali operazioni;
- stabilire le regole di composizione di queste funzioni;
- definire la relazione fra formula e schema logico.

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.

Vi sono quattro funzioni ad un bit:


- costante 0 (esce sempre 0);
- costante 1 (esce sempre 1);
- identità / buffer (esce ciò che c’è in input);
- not (nega ciò che c’è in input).

Vi sono sedici funzioni a due bit:

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.

Infine, esaminiamo cosa sono le operazioni logiche. Un’operazione è detta logica se la è la


descrizione matematica di una funzione di una o di due variabili binarie. Essa viene
rappresentata da un simbolo detto operatore: se la variabile è una sola, il simbolo di
operazione può precedere e seguire il simbolo dell’operando; se le variabili sono due,
l’operatore è di norma impiegato tra gli operandi.

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

Ma, assegnata una qualsiasi funzione di un numero qualsiasi di variabili, è possibile


descriverla con una espressione contenente le sole operazioni dei gate? La risposta è sì (si
rimanda la dimostrazione).

4.2 – Algebra di commutazione

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.

Proprietà delle operazioni


- Le operazioni di somma e di prodotto sono commutative e associative.
- Vale la proprietà distributiva della somma rispetto al prodotto e del prodotto rispetto
alla somma.
- Collegare uno stesso segnale a due ingressi di un and o un or non produce alcuna
elaborazione (x + x = x; x.x = x); alla stessa maniera, un or con un ingresso ad 1 e un
and con un ingresso a 0 non servono a nulla (x + 0 = 0; x.1 = 1)
- Due not in cascata riproducono il segnale d’ingresso al primo : (x’)’ = x
- Limitazione: x + x’ = 1; x.x’ = 0
- Combinazione: xy + xy’ = x; (x + y).(x+y’) = x
- I legge di DeMorgan: (x + y)’ = x’ . y’
- II legge di DeMorgan: (x . y)’ = x’ + y’
o Le leggi di DeMorgan evidenziano come {+, ., ‘ } sia ridondante;

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

4.3 – Famiglie logiche

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:

Q {variabile indipendente} = R ↓ (q ↓ S) = (R + (q + S)’)’ = R’.(q + S) {variabili dipendenti}


(sono stati assegnati più simboli per la retroazione)

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

CAPITOLO 5 – Reti combinatorie


Data una funzione, l’algebra di commutazione consente di individuare molte espressioni
equivalenti in grado di descriverla: ma qual è la migliore? Di fondamentale importanza sono
infatti la ricerca della rete di costo minimo (massima velocità di elaborazione, minimo
numero di gate, minimo numero di collegamenti) e del miglior rapporto tra prodotto e mercato
(minimo tempo di progetto, minimo costo di realizzazione, massima flessibilità d’impiego).

Introduciamo alcuni indicatori:


- Ngate = numero di gate,
- Nconn = numero di connessioni,
- Ncasc = numero di gate disposti in cascata sul più lungo percorso di elaborazione.
Ovviamente, minori sono questi indicatori e meglio è. Anche in questo caso l’algebra di
commutazione ci viene in aiuto, facendoci determinare in modo rigoroso una rete formata da:
- minima durata di transitorio;
- minimo numero di gate and e or;
- minimo numero di ingressi per gate.

Introduciamo quindi delle definizioni:


- espressione normale: qualsiasi SP o PS;
- espressione minima: l’espressione normale che descrive la rete di costo minimo;
- implicante di una funzione completa a n variabili: prodotto di n o meno variabili che
assume valore 1 per configurazioni per cui anche la funzione vale 1;
o implicante primo: prodotto da cui non si può eliminare alcun letterale (variabile
in forma vera o complementata) senza perdere la proprietà di implicare la
funzione;
- implicato di una funzione completa di n variabili: somma di n o meno variabili che
assume valore 0 per configurazioni per cui anche la funzione vale 0;
o implicato primo: somma da cui non si può eliminare alcun letterale (variabile in
forma vera o complementata) senza perdere la proprietà che la funzione la
implichi;
- espressione irridondante: una espressione normale SP o PS da cui non può essere
eliminato alcun termine senza invalidare l’equivalenza con l’espressione stessa.

Da qui due importanti teoremi:


- l’espressione minima SP è una somma irridondante di implicanti primi;
- l’espressione minima PS è un prodotto irridondante di implicati primi.

Cerchiamo ora un procedimento sistematico e assumiamo per i ipotesi di avere in ingresso, in


forma vera e complimentata, segnali con fan-in grande quanto occorre.

Il metodo delle mappe di Karnaugh


Viene detta mappa di Karnaugh una rappresentazione bidimensionale della tabella di
verità di una funzione. Le variabili indipendenti vengono suddivise tra i due assi della mappa
e i loro valori vengono elencati in modo che le due configurazioni consecutive
differiscano per un solo bit. Sono dette adiacenti due celle di una mappa le cui coordinate
hanno questa caratteristica (distanza = 1): in particolare sono adiacenti le celle
- con un lato in comune,
- che sono poste alle estremità della stessa riga,
- che sono poste alle estremità della stessa colonna.
Due (21) mappe di 4 variabili (sottomappe) affiancate consentono lo studio di funzioni di 5
variabili, quattro (22) mappe di 4 variabili permettono lo studio di funzioni a 6 variabili etc…

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.

ALGORITMO PER TROVARE L’ESPRESSIONE MINIMA (SINTESI DA TABELLA DI


VERITÀ AD ESPRESSIONE PS / SP)
1) Si sceglie se prendere la SP o la PS.
2) Si cerca di individuare tra le celle da coprire una cella che possa essere racchiusa in un
solo RR e lo si traccia di dimensione massima, annotando il termine corrispondenza. Se
la funzione è incompleta il RR può contare anche condizioni di indifferenza.
3) Si ripete fino a quando è possibile il passo 2, tenendo conto della possibilità di coprire
anche celle incluse in RR già tracciati.
20
Luca Pagani - Riassunto di Reti Logiche A

4) Si prendono in considerazione le celle ancora da coprire e se ne sceglie a colpo d’occhio


la copertura migliore, tenendo conto come al solito della possibilità di coprire celle già
coperte e condizioni di indifferenza.
5) Si itera il passo quattro fino alla copertura completa e si scrive l’espressione minima.

MAPPE DI KARNAUGH: ANALISI DALL’ESPRESSIONE PS / SP ALLA TABELLA DI VERITÀ


1) Si manipola l’espressione che descrive lo schema logico fino ad ottenere un’espressione
normale.
2) Si predispone una mappa di dimensioni adeguate e si tracciano i RR corrispondenti
individuati al punto 1.
3) Nelle celle coperte da un RR si indica il valore 1 se l’espressione è SP, 0 se è PS; nelle
celle non coperte si inserisce il valore opposto (senza mettere alcuna condizione
d’indifferenza!).

Eliminazione a priori delle alee statiche attraverso le mappe di Karnaugh


L’alea statica, cioè la modifica temporanea (e, appunto, aleatoria) dell’uscita di una rete
combinatoria in risposta ad una sequenza di due configurazioni d’ingresso (per cui avrebbe
dovuto mantenere invece lo stesso valore), è causata da valori particolari dei ritardi introdotti
dalla propagazione dei segnali sia sui collegamenti tra gate, sia all’interno dei gate.
Come eliminarla?
- Accettando il vincolo che gli ingressi della rete combinatoria cambino di valore uno
solo alla volta (condizione necessaria / non sufficiente; se ben si ricorda, nelle mappe
di Karnaugh le coordinate scritte sugli assi non devono distare più di 1 e quindi
verificano questa condizione).
- Coinvolgendo in questo compito la sintesi PS e SP: una rete combinatoria
completamente specificata in cui i 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.

Sintesi a NAND e NOR


Il fatto che l’algebra di commutazione preveda l’impiego dei soli and, or, not non implica che
il progettista logico non debba usare gli altri gate disponibili nelle famiglie logiche, tra cui il
nand e il nor, che consentono di realizzare qualsiasi rete impiegando un solo tipo di gate. Se
esistono ci sarà pure un motivo…

ALGORITMO PER TRASFORMARE UN’ESPRESSIONE SP IN UN’ESPRESSIONE MINIMA NAND:


1) Si parte da un’espressione SP, SPS, SPSP... e si introducono gli operatori di prodotto
logico e le parentesi che non vi appaiono.
2) Si sostituisce il simbolo ↑ ad ogni simbolo di prodotto logico e di somma logica
(complementando, in quest’ultimo caso, le variabili e le costanti da esso elaborate).
3) Si manipolano – eventualmente - le parentesi, sfruttando la regolina
(a ↑ a ) ↑ b = a ↑ (a ↑ b), al fine di ridurre il numero di gate e non mettere più nand con
ingressi identici (si potrebbe, nel caso, risparmiare dei gate).
4) Si disegna lo schema corrispondente.

ALGORITMO PER TRASFORMARE UN’ESPRESSIONE PS IN UN’ESPRESSIONE MINIMA NOR:


1) Si parte da un’espressione PS, PSP, PSPS... e si introducono gli operatori di prodotto
logico e le parentesi che non vi appaiono.
2) Si sostituisce il simbolo ↓ ad ogni simbolo di somma logica e di prodotto logico
(complementando, in quest’ultimo caso, le variabili e le costanti da esso elaborate).
3) Si disegna lo schema corrispondente, facendo attenzione che non vi siano nor con
ingressi uguali (si potrebbe, nel caso, risparmiare dei gate).

21
Luca Pagani - Riassunto di Reti Logiche A

5.4 – Reti programmabili

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.

ROM (Read only memory)


Le ROM sono in grado di realizzare qualsiasi funzione di n variabili; per conseguire tale
proprietà ogni uscita è generata da una rete descritta da un’espressione generale SP
2 n −1
F ( x1 , x2 ,..., x n )= ∑ i = 0 m(i ).F (i )
I bit di programmazione (in questo caso 2n) agiscono separatamente su altrettanti AND e i loro
valori sono fissati in modo da corrispondere ordinatamente ai 2n valori della funzione
desiderata. Si è detto in precedenza che il progetto logico impiega il multiplexer come
generatore di funzioni: la ROM è idealmente una disposizione in parallelo di MUX con un
grande numero di ingressi, ma con una differenza notevolissima. Fisicamente, con n pari a 16
(o più) e l’uso di MUX, servirebbero circuiti con decine di migliaia di piedini (ovvero gli
ingressi del MUX, che sarebbe enorme!). Nella ROM questi sono invece definiti da bit
contenuti all’interno del circuito.
Come implementare i numerosissimi prodotti m(i).F(i) e decidere quale, di volta in volta,
attivare? Semplicemente con contatti elettrici: se la funzione vale 1 per la configurazione per
cui il mintermine vale 1, il contatto deve essere chiuso (verrà così attivata l’area del circuito
corrispondente alla realizzazione della specifica funzione), altrimenti dev’essere aperto. Nota
che la memoria così costituita attiverà, di volta in volta, una linea “verticale” (corrispondente
ad una funzione) e soltanto nel momento in cui la si richiama attraverso una specifica
configurazione di bit (quelli che individuano lo stato futuro e che attiveranno la funzione di
stato futuro) e non, come nel multiplexer, da bit d’indirizzo! All’interno di una ROM si
programmano dunque i collegamenti tra i 2n AND a n ingressi e l’OR (finale) a 2n ingressi (dà
in uscita il risultato della funzione che si è scelto di elaborare): come rappresentazione
“compatta”, l’OR a 2n ingressi viene separato in tanti OR ad una linea d’ingresso “orizzontale”
(una linea = 1 variabile), in ognuno dei quali differenti AND (in base a quali sono definiti i bit
di programmazione) immettono i propri segnali.
Da dove deriva infine la denominazione memoria di sola lettura? Introduciamo un’analoga
schematizzazione per lo stesso componente ROM descritto poco fa: abbiamo un decoder, al
quale diamo in entrata una configurazione fatta di n bit d’indirizzo; ogni configurazione
attiverà una delle 2n possibili uscite, collegate a tutti i possibili k OR a un ingresso di cui sopra
(tale rappresentazione è dunque matriciale: 2n righe e k colonne). In base a quali saranno i
bit di programmazione (che regolano i contatti presenti agli incroci fra le uscite del decoder e
le linee di ogni OR) avremo in uscita k particolari dati. Non è però possibile scrivere, ma
soltanto ricevere (leggere, appunto) questi dati in uscita. Da qui il read only.

Come sopperire ad un eventuale bisogno di aumentare la capacità delle ROM?


- Se il numero di bit d’uscita è insufficiente, basta disporre in parallelo tanti dispositivi
ROM quanti servono per avere il desiderato numero di uscite.

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 memorie di sola lettura oltre alle ROM


Hanno tutte una proprietà comune: non sono volatili. I bit cioé, una volta programmati,
mantengono il loro valore anche quando il dispositivo non viene alimentato. Nelle ROM è il
costruttore a stabilire (una volta per tutte, visto che non sono riprogrammabili) i bit di
programmazione. Altri tipi di memorie sono:
- PROM: la matrice di bit contiene fusibili ad ogni incrocio, che l’utente (non il
costruttore!) può bruciare a suo piacimento; è programmabile una volta sola.
- EPROM: la matrice di bit contiene interruttori che l’utente può aprire o chiudere. Sono
programmabili più volte.
- E2PROM: come le EPROM, ma gli interruttori sono programmabili elettricamente
senza estrarre il dispositivo dalla piastra e senza usare apposite macchine esterne.
Sono programmabili più volte e facilmente personalizzabili.
Una ulteriore importante proprietà delle memorie a sola lettura discende dalla presenza di
amplificatori a tre stati d’uscita disposti a monte dei veri e propri morsetti d’uscita del
circuito. Questi possono impedire o permettere la comunicazione all’esterno dei segnali
elettrici in base ai valori assegnati al comando CE (Chip Enable) e OE (Output Enable):
schematizzando l’amplificatore come un buffer seguito da un interruttore, se OE è attivo
l’uscita è uguale all’ingresso e il segnale passa perché l’interruttore è chiuso (stato definito
dall’ingresso); se OE è disattivo l’interruttore aperto non farà giungere nulla in output (stato
fluttuante o di alta impedenza). Passare da stato definito dall’ingresso a stato fluttuante è
un’operazione che richiede tempo (ritardo del transitorio).
A che servono questi amplificatori? A rendere semplice e distribuita la realizzazione dei MUX
che selezionano i dati in uscita dalla ROM; l’unica condizione da rispettare è che non ci sia mai
più di un amplificatore abilitato, o si rischia il conflitto elettrico. Per realizzare ciò, il MUX
viene anch’esso governato da un decoder, che in base ai bit di indirizzo fa arrivare i dati a uno
e un solo amplificatore. Anche qui bisogna stare attenti alla durata di attivazione, in modo da
non creare conflitti quando si passa da un’attivazione all’altra (momento in cui si generano
ritardi che possono creare problemi): a tal proposito si introducono quattro AND e il comando
EN (di cui sopra).

PLA e PAL (Rappresentazione di una ROM in termini di matrici AND e OR)


Una ROM può essere meglio delineata in questo modo: vi è una prima matrice, in cui si
incrociano gli indirizzi del decoder con gli ingressi degli AND (che sono 2n); ve n’è una seconda,
in cui le uscite di questi ultimi AND si incrociano con gli ingressi degli OR (la cui uscita è
gestita dal multiplexer, etc. etc.). La realizzazione di una ROM può quindi essere affidata alla
programmazione di due matrici di bit disposte in cascata. Chi programma le due matrici?
ROM PAL PLA
Matrice degli AND Costruttore Utente Utente
Matrice degli OR Utente Costruttore Utente
La caratteristica strutturale di maggior rilievo delle PAL e delle PLA è che hanno un numero
di AND molto più piccolo di 2n. Ciò fornisce il vantaggio di costi minori e lo svantaggio
(modesto) di impedire la realizzazione di qualsiasi funzione a n variabili.

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

stessa famiglia. Al progettista è comunque data un’interessante possibilità: progettare l’I/O,


cioè trasformare da uscite ad ingressi alcuni dei pin che il dispositivo impiega per comunicare
con l’esterno. Il grande successo ottenuto dalle PAL è disceso dalla possibilità di impiegarle
per realizzare in tempi brevi, in spazi limitati e a basso costo, reti combinatorie anche di
notevole complessità.

PLD, CPLD, FPGA


Il campo d’impiego delle matrici programmabili si è ulteriormente allargato con l’inserimento,
all’interno dei chip, di flip-flop e retroazioni. I primi dispositivi di questo tipo vengono detti
PLD (Programmable Logic Devices) e avevano spesso un MUX su ogni uscita, per consentire
anche il solo uso della parte combinatoria, in forma vera o complementata.
I dispositivi più recenti (CPLD, FPGA) sono ancora più complessi e flessibili: la struttura
interna è una matrice di piccole reti sincrone singolarmente programmabili (PLB) e fasci di
conduttori tramite i quali è possibile programmare una loro disposizione in serie e/o parallelo
e/o in retroazione.

CAPITOLO 6 – Reti asincrone


Il modello della rete asincrona deve essere impiegato ogniqualvolta occorre discriminare e
ricordare l’ordine temporale con cui alcuni segnali binari hanno modificato il loro valore. Non è
un’esigenza sporadica: i sensori delle attuali macchine digitali sono intelligenti, proprietà che
presuppone di elaborare in modo asincrono le forme d’onda dei segnali d’ingresso per chiamare
in causa la CPU solo quando si verificano eventi significativi. L’elaborazione asincrona è
inoltre determinante nella realizzazione e gestione delle risorse all’interno della macchina. Il
caso più importante è quello della memorizzazione dei dati (flip-flop). Per la loro velocità
nel prendere decisioni, le macchine che adottano questa modalità di elaborazione sono
pericolosamente esposte a malfunzionamenti e devono quindi essere progettate con grande
attenzione.
Caratteristica della macchina asincrona è l’inseguire continuamente il variare dell’ingresso
passando da una ad un’altra condizione di stabilità dello stato interno; ogni simbolo d’ingresso
deve determinare al più un cambiamento di stato interno ed un cambiamento di uscita. Come?
- realizzando le funzioni F (funzione d’uscita) e G (funzione di stato);
- retroazionando (grazie all’intrinseca – e necessaria - presenza di ritardi sulle uscite
del circuito combinatorio) i k segnali che codificano lo stato futuro sui k segnali che
codificano lo stato presente.
Due sono le regole da rispettare:
- funzionamento in modo fondamentale: l’ingresso può essere modificato solo dopo che il
circuito ha raggiunto la stabilità;
- adiacenza delle configurazioni d’ingresso: simboli d’ingresso consecutivi devono essere
codificati in modo da differire per il valore di un solo bit (se la distanza è maggiore, la
macchina può – in maniera aleatoria - passare anche per gli stadi “intermedi” e
generare errori!).

6.2 – Memorie binarie

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.

Latch CD (Controller – Data Path)


Ha anche lui due ingressi:
- C = 1 Æ indica che si può scrivere qualcosa, il circuito campiona il segnale;
- D Æ è ciò che si vuole scrivere e che si vuole memorizzare per il successivo intervallo
in cui C avrà valore 0.
CD SR Questo latch si può realizzare partendo dall’omologo SR, operando una
11 10 trascodifica (v. tabella). Con il solito metodo delle mappe scopriamo che:
10 01 S = C.D
R = C.D’
0- 00
Occorre dunque preporre al latch SR due gate AND, le cui uscite vanno a
collegarsi a S e R. Questa macchina ha un problema: è sensibile alle alee statiche. Come si può
eliminare l’inghippo? Siccome questo circuito è collegato al latch SR, avrà anch’esso, in uscita,
un valore futuro vero Q e uno complementato Q’, un valore presente q. Cercando le espressioni
minime SP e PS otteniamo che:

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!

Il latch CD può essere ottenuto anche con i NAND e con i NOR:


Realizzazione NAND: Q = (C ↑ D) ↑ ((C ↑ D’) ↑ q)
Realizzazione NOR: Q = (C’ ↓ D) ↓ ((C’ ↓ D’) ↓ q)
Nota: Questi altre versioni di latch CD sono state ottenute a partire dalle espressioni
ridondanti complete sopra descritte, quindi neanche loro “soffrono” di alea statica.

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.

Se il comando di campionamento C ha una durata più lunga della minima e se,


contemporaneamente, D modifica il suo valore, quest’ultimo si riproduce anche sull’uscita: il
fenomeno è detto delle uscite trasparenti. Il valore in uscita può essere l’ultimo (se il
campionamento è durato abbastanza per due segnali) o il penultimo (se l’elaborazione ha
portato in uscita solo il primo): è dunque necessario che D sia costante durante il tempo di
campionamento. Il latch CD, da solo, non deve mai essere impiegato per chiudere la
retroazione di un circuito combinatorio (circuito sequenziale sincrono); va invece benissimo
come componente del registro buffer (memoria temporanea per segnali in arrivo e in
partenza) e della RAM (Random Access Memory)

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.

Flip-flop D (edge triggered)


Nasce dall’esigenza di modificare lo stato interno in corrispondenza di istanti di
sincronismo (regolati da un clock). Per la realizzazione sono necessarie 6 porte NAND: 4 sono
impiegati nello stato di campionamento, 2 per il latch SR necessario alla memorizzazione. Il
transitorio è ovviamente più lungo di quello del latch CD. Nel data sheet vengono sempre
riportati i seguenti tempi:
- setup: intervallo precedente il fronte del clock, durante il quale il segnale D dev’essere
costante;
- hold: intervallo di tempo successivo al fronte del clock, durante il quale il segnale D
deve mantenere ancora costante il suo valore;
27
Luca Pagani - Riassunto di Reti Logiche A

- response: intervallo di tempo successivo al fronte del clock impegnato dal circuito per
attribuire valori complementari ai suoi due segnali d’uscita.

6.3 – Analisi e sintesi, in dettaglio

PROCEDIMENTO DI ANALISI (MACCHINE ASINCRONE)


Si suddivide in 5 passi fondamentali:
- PASSO 1, individuazione delle variabili di stato.
Si taglia idealmente sullo schema ogni retroazione, denotando con una maiuscola
(variabile di stato futuro) il segnale a monte del taglio e con la corrispondente
minuscola (variabile di stato presente) il segnale a valle. Lo stato futuro diventa infatti
quello presente dopo un certo istante di tempo (ritardo).
- PASSO 2, analisi della rete combinatoria d’uscita e della rete combinatoria
d’aggiornamento dello stato interno.
Ispezionando i percorsi di elaborazione presenti nello schema, si scrivono le espressioni
delle variabili di stato futuro; se necessario, si manipolano queste espressioni fino ad
ottenere delle forme normali.
- PASSO 3, individuazione della tabella delle transizioni.
Si elencano le configurazioni d’ingresso e di stato sui bordi di una tabella delle
transizioni rispettando le condizioni di adiacenza richieste da una mappa di
Karnaugh; si tracciano sulla tabella i RR corrispondenti ai termini delle espressioni
normali individuate al passo 2; si controlla infine se la copertura impiegata nel circuito
è stata scelta in modo di eliminare a priori il problema dell’alea statica.
ESEMPIO: una PLA con due retroazioni, in cui x1 e x2 sono le variabili d’ingresso, y1 e
y2 le variabili di stato presente, Y1 e Y2 quelle di stato futuro, z la variabile d’uscita.
Con le mappe di Karnaugh si scopre che il circuito è governato da queste espressioni:
Y1 = x2’y2 + x1y2 + x1’x2y1
Y2 = x2’y2 + x1y2 + x1’x2y1’
z = y1
y1 y2 x1 x2 y1 y2 x1 x2
00 01 11 10 00 01 11 10
00 0 0 0 0 00 0 1 0 0
01 1 0 1 1 01 1 1 1 1
11 1 1 1 1 11 1 0 1 1
10 0 1 0 0 10 0 0 0 0

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.

Y1 y2 x1 x2 z (= y1) Ecco la tabella degli stati: sottolineate vi sono le


00 01 11 10 configurazioni in cui vi è stabilità. In ogni
00 = A A,0 B,0 A,0 A,0 transizione è richiesta la modifica di un solo bit di
01 = B C,0 B,0 C,0 C,0 stato (es. prima rima: da 00 posso andare a 00 o
11 = C C,1 D,1 C,1 C,1 01): non vi sono dunque corse critiche. Non sono
10 = D A,1 D,1 A,1 A,1 neanche presenti transizioni multiple; si può però

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.

PROCEDIMENTO DI SINTESI (MACCHINE ASINCRONE)


Si suddivide in 5 (6) passi fondamentali:
- PASSO “0”, mettere in evidenza una chiara descrizione del comportamento della
macchina da progettare.
Di notevole aiuto possono rivelarsi le forme d’onda che illustrino situazioni
significative, o notevoli, di relazione ingresso-uscita. Ad esempio, per quanto riguarda
una lampada da tavolo che modifica il suo stato tramite un pulsante, possiamo dire che
z (output) cambia il suo valore ad ogni fronte di salita di x (quando si rilascia il
pulsante). Ciò si evince con chiarezza nello studio delle forme d’onda.
- PASSO 1, individuazione del grafo degli stati.
È necessario ricordarsi di imporre la stabilità di ogni stato per la configurazione
d’ingresso con cui lo si raggiunge (non devono esserci transizioni multiple;
ricordiamoci poi che è una macchina asincrona, che va di stabilità in stabilità).
Nell’indicare sui rami la configurazione d’uscita occorre tener presente che il transitorio
è molto breve: quando un segnale d’uscita ha un valore in corrispondenza di una certa
situazione di stabilità, ed il valore complementare nella situazione che si dovrà
raggiungere, la scelta migliore è quella di porre una condizione d’indifferenza sul
ramo che li congiunge.
- PASSO 2, definizione della tabella di flusso.
Al solito. Ricordarsi di evidenziare le condizioni di stabilità.
- PASSO 3, codifica degli stati e definizione della tabella delle transizioni.
Al fine di non creare corse critiche, la codifica dev’essere dedotta dal grafo delle
adiacenze “sovrapposto” ad una mappa caratterizzata dal minimo numero possibile di
variabili di stato: se non si riesce ad ottenere l’adiacenza tra ogni possibile coppia stato
presente/futuro, occorre definire transizioni multiple o, eventualmente, aumentare il
numero di bit di codifica degli stati. Come già abbiamo evidenziato, per eliminare a
priori il pericolo dell’alea statica la copertura delle funzioni di stato futuro deve
garantire che ogni coppia di 1 (per le SP) o di 0 adiacenti (per le PS) sia racchiusa in
almeno un RR.
- PASSO 4, sintesi della parte combinatoria.
Se troviamo più gates di natura analoga e con lo stesso input, compattiamoli in un gate
solo (sfruttando un eventuale fan-out >1). Si semplifica così la rete e si guadagna in
chiarezza e compattezza. Infine, sfruttiamo i latch SR in modo da avere a disposizione
segnali veri e complementati per un’eventuale retroazione.

29
Luca Pagani - Riassunto di Reti Logiche A

- PASSO 5, disegno dello schema logico.


In maniera naturale.

Grafi degli stati primitivi e non primitivi


Come già detto, all’arrivo di ogni nuovo simbolo d’ingresso la rete asincrona deve passare da
una precedente ad una nuova situazione di stabilità. Per rispettare con maggiore facilità il
comportamento richiesto, è spesso utile prevedere che ogni modifica d’ingresso produca una
modifica di stato. Il grafico risultante è detto primitivo ed ha la proprietà che ogni suo nodo è
stabile per una sola configurazione d’ingresso.
ESEMPIO: riconoscitore 00-01-11. Si potrebbe pensare che il riconoscitore primitivo abbia 3
stati: uno per il riconoscere 00 (chiamiamolo A), uno per il 01 (B) e un ultimo per 11 (C) con
output 1 (= “ho riconosciuto una sequenza esatta”). Ma non è così. Se per caso ci troviamo in C
(stato in cui è stata appena riconosciuta una sequenza esatta) e ci viene passato un 01, non
possiamo assolutamente andare in B! Se ci capitasse un nuovo 11 non potremmo infatti
passare nuovamente in C (il grafo lo consentirebbe!) e dire che la sequenza è esatta (01-11 non
è esatta: manca lo 00 iniziale, stato A). Per mantenere la condizione di primitività del grafo,
bisogna introdurre un nuovo stato D, stabile per 01 e con uscita 0 (= “non ho riconosciuto
una sequenza esatta”). Per completezza, si dovrebbe fare poi la stessa cosa per un eventuale
input 01 allo stato C (andare in un nuovo stato E, stabile in 01, output 0, che va in A per 00)
etc. Si capisce bene che il numero degli stati è superiore di quello strettamente necessario:
se il comportamento lo consente, è dunque utile operare una riduzione del loro numero. Gli
stati D, E ed F (stabile per 11, output 0) possono essere inglobati in un unico stato “di attesa
dello 00”, stabile per 10, 11, 01, output 0, che si porta in A per 00.
Tale riduzione può essere fatta sulla tabella di flusso: due o più righe di una tabella di flusso
possono essere compresse in un’unica riga se, per ogni ingresso, presentano simboli di stato
futuro e di uscita identici a meno di condizioni d’indifferenza.

CAPITOLO 7 – Reti sincrone

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.

Nelle reti sincrone:


- non occorre preoccuparsi dell’alea statica e dinamica;
- non occorre preoccuparsi dell’adiacenza delle configurazioni consecutive d’ingresso e di
stato;
- è possibile ricercare sempre e soltanto espressioni minime;
- è possibile scegliere arbitrariamente la codifica dei simboli d’ingresso e d’uscita.

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.

Il flip-flop T ha il solo ingresso T e quindi due sole modalità di funzionamento:


- T = 0 (hold), mantiene Q;
- T = 1 (toggle) complementa Q.
L’equazione caratteristica di questa memoria è: Qn+1 = (T ⊕ Q)n. Si nota che deriva dal flip-
flop JK, dove T è stato applicato ad entrambe le entrate J e K o, allo stesso modo, dal flip-flop
D, in cui l’uscita z viene retroazionata, messa in ex-or con il comando T e collegata all’entrata
D del flip-flop.

I flip-flop possono “ottenersi l’uno dall’altro”: è possibile ottenere:


- un JK da D: D (entrata del flip-flop D) = Qn+1 = J.Q’ (uscita complementata del flip-flop D) +
K’.Q (uscita vera del flip-flop D);
- un D da un JK: Qn+1 = (D.Q’+D.Q)n = Dn;
- un D da un T: Qn+1 = ((X ⊕ Q) ⊕ Q)n = Xn, dove X ⊕ Q = T;
- un JK da un T: T = JQ’ + KQ, dunque Qn+1 = (JQ’ + KQ)n

31
Luca Pagani - Riassunto di Reti Logiche A

7.2 – Analisi e sintesi

PROCEDIMENTO DI SINTESI (MACCHINE SINCRONE)


Illustriamolo direttamente su un esempio: consideriamo una rete sequenziale sincrona (RSA)
con un ingresso x ed un’uscita z, a cui sia richiesto di fornire z = 1 nel terzo intervallo
consecutivo in cui si verifichi x = 1. Si può esprimere questo comportamento con la relazione:
zn = xn.xn-1.xn-2
- PASSO 1, individuazione del grafo degli stati.
Un possibile grafo degli stati per questo automa è quello che presenta uno stato A,
stabile in 0 (rappresenta l’attesa di un primo 1), che passa, al primo input 1, in B (non
stabile). In B un secondo 1 fa andare il circuito in C (“ho riconosciuto una sequenza
esatta”), stabile per 1. Da B e C si torna in A per ogni 0 dato in input.
- PASSO 2, definizione della tabella di flusso. 0 1
Al solito. Si nota che la colonna dello 0 è una A A,0 B,0
colonna di “reset”. B A,0 C,0
- PASSO 3, codifica degli stati e definizione della C A,0 C,1
tabella delle transizioni.
Teniamo ben presente che, nelle macchine
0 1
sincrone, la scelta di un periodo di clock elimina a
A = 00 00,0 01,0
priori il pericolo delle corse critiche. La codifica
degli stati è del tutto arbitraria e in genere si usa B = 01 00,0 11,0
un codice non ridondante. C = 11 00,0 11,1
- PASSO 4 – 5: scelta del flip-flop e sintesi della parte combinatoria.
È possibile impiegare tutti o alcuni flip-flop fra il D, il JK o il T. I segnali da inviare in
ingresso al flip-flop variano da caso a caso; la realizzazione della variabile di stato
presente è invece sempre fornita dall’uscita Q del flip-flop. Esaminiamo i singoli casi.
FLIP-FLOP D:
All’ingresso D deve essere connessa una 00 01 11
realizzazione dello stato futuro. Si richiede la 0 0 0 0
realizzazione di mappe che riportino, 1 0 1 1
separatamente, i valori di y1n+1, y2n+1 e dell’uscita z. Y1n+1 = x.y2
Siccome non c’è il pericolo di incontrare alea
statica, bisogna sempre cercare l’espressione 00 01 11
minima. 0 0 0 0
1 1 1 1
00 01 11 Y2n+1 = x.y2 + x.y1
0 0 0 0
1 0 0 1
z = x.y2.y1
FLIP-FLOP JK:
Bisogna ricordarsi che:
- quando la variabile di stato deve passare da 0Æ1 bisogna dare J=1, K= indiff.;
- quando la variabile di stato deve passare da 1Æ0 bisogna dare J=indiff., K= 1;
- quando la variabile di stato deve mantenere il valore 1 bisogna dare J = indiff., K = 0;
- quando la variabile di stato deve mantenere il valore 0 bisogna dare J = 0, K = indiff.
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

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.

PROCEDIMENTO DI ANALISI (MACCHINE SINCRONE)


Illustriamo anche questo con un esempio.

- PASSO 1: individuazione delle espressioni dei segnali in ingresso a ciascun flip-


flop.
Qui si nota con facilità che tutti i J di ogni flip-flop sono uguali ai relativi K.
Esaminando il circuito con più attenzione ricaviamo le espressioni desiderate.
JA n= KAn = Xn
JB n= KBn= (X.QA.QD’)n
JCn = KCn = (X.QA.QB)nB

JDn = KDn = (X.QA.QB.QC + X.QA.QD)n


B

33
Luca Pagani - Riassunto di Reti Logiche A

- PASSO 2: individuazione delle espressioni di stato futuro e di uscita.


In questo caso i flip-flop JK sono impiegati come flip-flop T, perché, ricordiamo Qn+1 =
(T ⊕ Q)n, dove T = J = K. Si ha dunque che:
QA n+1= (X ⊕ QA)n
QB n+1= ((X.QA.QD’) ⊕ QB)n
B

QCn+1 = ((X.QA.QB ) ⊕ QC)n


QDn+1 = ((X.QA.QB.QC + X.QA.QD) ⊕ QD)n
B

- PASSO 3: individuazione della tabella delle transizioni.


Con un po’ d’occhio si nota che, se nella tabella si ordinano gli stati come si
ordinerebbero le cifre di un numero binario a 4 bit (in ordine di peso QD, QC, QB, QA),
B

questo rimane inalterato se X = 0, mentre viene incrementato di un’unità (modulo 10)


se X = 1.
- PASSO 4: deduzione e studio della tabella di flusso.
Si nota subito che, una volta inizializzato il circuito con un valore inferiore a 9, questo
non può mai assumere i valori 10, 11, 12, 13, 14, 15. Ci troviamo dunque di fronte a un
contatore con base 10 e stati codificati in BCD. Il segnale X è detto comando di
abilitazione al conteggio, o anche semplicemente enable.
- PASSO 5: deduzione e studio del grafico degli stati.
La caratteristica più evidente è l’anello di dieci stati percorso, un passo dietro l’altro,
solo negli intervalli in cui vale 1. Un altro aspetto importante è quello
dell’autoinizializzazione del circuito: se lo stato iniziale è per caso una delle sei
configurazioni non appartenenti al codice BCD, sono sufficienti due soli intervalli con X
= 1 per entrare nel ciclo e non uscirvi più.

7.3 – Registri e contatori

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.

Per i moduli di conteggio vale un’interessante proprietà: la disposizione in cascata di n moduli


di conteggio, rispettivamente con base B1, B2, …, BN (e con il CO [carry-out, dà 1 quando tutte
le cifre del contatore sono = 1] di ogni modulo di connesso all’EN del modulo successivo),
fornisce un contatore con base B = B1 ⋅ B2 ⋅ … ⋅ BN.
B

Se vogliamo, ad esempio, creare un contatore x256 da due contatori x16, la soluzione è


semplicissima: si azionano i due moduli di conteggio con lo stesso clock e si connette l’uscita
CO di uno con l’ingresso di EN dell’altro. Il primo modulo conterà i bit meno significativi, il
secondo quelli più significativi.
Infine, dato un modulo di conteggio binario con base B, dotato di EN e RES, è possibile
ottenere un contatore binario con base più piccola.
Prendiamo ad esempio un contatore binario x16, che vogliamo trasformare in un contatore a
base X+1 (con X<15); per fare ciò occorre connettere alle sue uscite (che, ricordiamo,
rappresentano i bit del numero binario) con una rete combinatoria che generi il valore 1
quando riconosce il numero al quale vogliamo terminare il conteggio. Questo 1 va ad attivare il
reset e fa dunque ripartire il conteggio da zero. In maniera pratica, si costruisce una mappa di
Karnaugh per l’uscita RES in cui si danno in input gli stati d’uscita del contatore (e quindi i
bit del numero binario); poi si pongono delle indifferenze per i numeri più grandi di X, 0 per i
numeri coi quali non si deve dare RES, 1 con il numero che lo fa invece scattare. Dopodichè si
cerca la rete minima. In alternativa, metodo ancora più veloce, si realizza il mintermine
corrispondente a X e lo si collega direttamente all’uscita del contatore: se ad esempio vogliamo
smettere di contare a 1010 (nel contatore Q1Q2Q3Q4), creiamo un circuito AND con entrate 1 e
3 vere (per riconoscere gli uni) e con entrate 2 e 4 false (per riconoscere gli zeri). Questo AND,
quando, si presenterà 1010, darà in uscita l’1 che si ripercuoterà sul reset.

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

STATO X=0 X=1 Z STATO X=0 X=1


000 000 001 0 000 0,0,0 1,0,0
(stabilità) (inizio conteggio) 001 1,0,0 -
001 010 - 0 010 1,0,0 -
010 011 - 0 011 1,0,0 -
011 100 - 0 100 1,0,1 -
100 101 - 1 101 -,1,1 -
101 000 - 1 EN, RES, Z
Ora si può agire in vari modi: si possono, ad esempio, creare le mappe di Karnaugh per
individuare una rete combinatoria in grado di riconoscere lo stato 101 da mettere in AND e
collegare (in uscita) al RES, ma attenzione! Nelle tabelle soprastanti gli stati non sono
ordinati come dovrebbero essere in una mappa di Karnaugh: le configurazioni degli stati non
sono adiacenti! Vanno prima sistemate.

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

Potrebbero piacerti anche