reti logiche la

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

Upload: ingegnere-pazzo

Post on 06-Jun-2015

1.713 views

Category:

Documents


0 download

DESCRIPTION

Riassunto di reti logiche

TRANSCRIPT

Page 1: Reti logiche LA

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

Page 2: Reti logiche LA

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

Page 3: Reti logiche LA

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

Page 4: Reti logiche LA

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:

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

I L1 = f1(I) L2 = f2(I) 1 1 0 0 0 1

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

Page 5: Reti logiche LA

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

Page 6: Reti logiche LA

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

Page 7: Reti logiche LA

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

Page 8: Reti logiche LA

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

modello, p si ricava con la formula di Bernoulli: . enee pp

en

P −−⋅⋅⎟⎟⎠

⎞⎜⎜⎝

⎛= )1(

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

Page 9: Reti logiche LA

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

Page 10: Reti logiche LA

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

Page 11: Reti logiche LA

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

Page 12: Reti logiche LA

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 tempo (T) Entrata (D) Uscita (U) Stato (S) C (alto = 1)

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

Page 13: Reti logiche LA

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

Page 14: Reti logiche LA

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

Page 15: Reti logiche LA

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:

essa ha tre “uni” e uno “zero”. La forma canonica PS contiene quindi il solo maxtermine a’ + b; la forma canonica SP contiene i tre mintermini a’b’, a’b, ab. Le due espressioni sono equivalenti e da esse, con le opportune operazioni (raccoglimenti, sostituzioni notevoli), si giunge alla forma minima F(a, b) = a’ + b

a b f(a,b) 0 0 1 0 1 1 1 0 0 1 1 1

15

Page 16: Reti logiche LA

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.

∑−

==+12

021 )().(),...,(n

in iFimxxxF - 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.

∏−

=+=+

12

021 ))()((),...,(

n

in iFiMxxxF

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

Page 17: Reti logiche LA

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

Page 18: Reti logiche LA

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

Page 19: Reti logiche LA

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

Page 20: Reti logiche LA

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

Page 21: Reti logiche LA

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

Page 22: Reti logiche LA

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

∑−

==12

021 )().(),...,,(n

in iFimxxxF 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

Page 23: Reti logiche LA

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

Page 24: Reti logiche LA

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

Page 25: Reti logiche LA

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

Nell’ipotesi che la configurazione 11 (proibita!) non sia utilizzata in ingresso e costituisca quindi una condizione d’indifferenza per la funzione d’aggiornamento, si ottengono due espressioni minime, una NAND e una NOR:

Q S R 0

0 0 1

0 1

1 0

SP Q (stato futuro) = S + R’.q (stato presente) PS Q = R’.(S + q)

Espressione NOR Q = R ↓ (S ↓ q) 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. Questo latch si può realizzare partendo dall’omologo SR, operando una trascodifica (v. tabella). Con il solito metodo delle mappe scopriamo che:

C D S R 1 1 1 0

S = C.D 1 0 0 1 R = C.D’ 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:

0 - 0 0

25

Page 26: Reti logiche LA

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

Quando gli stati interni sono più di due occorrono più bit di codifica, ma il relativo codice non può essere scelto arbitrariamente. Osserviamo questo caso particolare (v. tabella): in ogni riga compare almeno una stabilità (es. nella riga dello 01 appare la stabilità con I2 perché nell’incrocio c’è lo stesso valore). Osserviamo il caso in cui

I1 I2 I3

00 00 01 0001 00 01 10 11 00 11 1110 00 11 10

26

Page 27: Reti logiche LA

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 passi precedenti bisogna faticare un altro po’. Vediamo l’esempio in tabella: per ipotesi supponiamo che B e C siano i due stati impossibili da codificare con configurazioni adiacenti. Supponiamo poi che A 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.

I1 I2 I3

A A B C B D B C ( A)C A C CD D B D

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

Page 28: Reti logiche LA

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

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

00 01 11 10 00 = A A,0 B,0 A,0 A,001 = B C,0 B,0 C,0 C,0 11 = C C,1 D,1 C,1 C,110 = D A,1 D,1 A,1 A,1

28

Page 29: Reti logiche LA

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

Page 30: Reti logiche LA

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

Page 31: Reti logiche LA

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

Page 32: Reti logiche LA

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 colonna di “reset”.

A A,0 B,0 B A,0 C,0

- PASSO 3, codifica degli stati e definizione della tabella delle transizioni.

C A,0 C,1

Teniamo ben presente che, nelle macchine sincrone, la scelta di un periodo di clock elimina a priori il pericolo delle corse critiche. La codifica degli stati è del tutto arbitraria e in genere si usa un codice non ridondante.

0 1 A = 00 00,0 01,0 B = 01 00,0 11,0 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 realizzazione dello stato futuro. Si richiede la realizzazione di mappe che riportino, separatamente, i valori di y1n+1, y2n+1 e dell’uscita z. Siccome non c’è il pericolo di incontrare alea statica, bisogna sempre cercare l’espressione minima.

00 01 11 0 0 0 0 1 0 1 1

Y1n+1 = x.y2

00 01 11 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

Page 33: Reti logiche LA

Luca Pagani - Riassunto di Reti Logiche A

00 01 11 00 01 11

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.

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.

- 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)B n

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

0 0 0 - 0 - - 1 1 0 1 - 1 - - 0

J1 = x.y2 K1 = y2.x’

00 01 00 01 11 0 - 1 1

11 0 0 -

1 - 0 0 -

1 1 - K2 = y2.x’

- J2 = x.y1’

00 01 11 00 01 0 0 0 0

11 0 0 0 0

1 1 1 1 1 0 1 1 Y2n+1 Y1n+1

00 01 00 01 11 0 0 1 1

11 0 0 0 1 1 0 1 0 1 1 0 0

T1 = x.y1’.y2 + x’.y1.y2 T2 = x.y1’.y2’ + x’.y2

33

Page 34: Reti logiche LA

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)B n

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

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

- 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, QB A), 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 dell’utente che ha commissionato l’esecuzione dell’algoritmo. 0 0

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

Page 35: Reti logiche LA

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

Page 36: Reti logiche LA

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 = BB1 ⋅ B2 ⋅ … ⋅ BN. 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

Page 37: Reti logiche LA

Luca Pagani - Riassunto di Reti Logiche A

STATO X = 0 X = 1 STATO X = 0 X = 1 Z 000 0,0,0 1,0,0 000 000

(stabilità) 001

(inizio conteggio) 0 001 1,0,0 -

001 010 - 010 1,0,0 - 0 010 011 - 011 1,0,0 - 0 011 100 - 100 1,0,1 - 0 100 101 - 1 101 -,1,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.

101 000 - 1

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