Assembly Base con MASM

Capitolo 5: La logica del computer


Nei precedenti capitoli abbiamo raggiunto una notevole semplificazione nella codifica delle informazioni da rappresentare sul computer; in particolare, abbiamo visto che utilizzando il sistema di numerazione binario, possiamo codificare qualsiasi informazione attraverso i due soli simboli 0 e 1. La conseguenza più importante di tutto ciò è che i circuiti del computer dovranno essere in grado di gestire soltanto questi due simboli anziché, ad esempio, i dieci simboli del sistema di numerazione in base 10; lo scopo di questo capitolo è quello di illustrare le tecniche basilari che permettono ai circuiti elettronici di un computer di gestire fisicamente il codice binario.

5.1 Segnali analogici e segnali logici

Risulta ovvio che un computer, essendo un oggetto inanimato e privo di intelligenza propria, non è in grado di capire veramente cosa sia un numero e questo può sembrare un ostacolo piuttosto difficile da superare; grazie però al fatto che una cifra binaria può assumere solo i due valori 0 e 1, possiamo risolvere questo problema associando questi due simboli (bit) a due situazioni fisiche distinte come, ad esempio, i due stati fisici possibili per un interruttore elettrico (on/off), due valori di temperatura, due valori di una intensità di corrente elettrica, due valori di una tensione elettrica, etc.
Visto che abbiamo a che fare con un circuito elettronico, appare ovvio orientarsi sulle grandezze elettriche come tensioni e correnti e quindi, in generale, su segnali elettrici che attraversano i circuiti del computer; ad esempio, possiamo scegliere due valori distinti di tensione assunti da un segnale elettrico, associando a questi due valori i due simboli 0 e 1. Escludendo i segnali costanti nel tempo che quindi possono assumere un solo valore, dobbiamo fare riferimento necessariamente ai segnali che variano nel tempo assumendo due o più valori distinti.
I segnali che attraversano un circuito elettrico possono essere suddivisi in due grandi categorie: segnali analogici e segnali logici; la Figura 5.1 illustra questi due tipi di segnale. Si definisce analogico un segnale che varia nel tempo assumendo con continuità tutti gli infiniti valori compresi tra un massimo ed un minimo; in Figura 5.1a possiamo vedere, ad esempio, un segnale elettrico analogico che al trascorrere del tempo t assume in modo continuo (cioè senza salti) tutti gli infiniti valori di tensione elettrica (V) compresi tra max e min.
Si definisce logico un segnale che varia nel tempo assumendo un numero finito di valori compresi tra un massimo ed un minimo; la Figura 5.1b e la Figura 5.1c mostrano due esempi di segnali elettrici logici che al trascorrere del tempo t assumono solo alcuni dei valori di tensione elettrica (V) compresi tra max e min. Nel caso particolare della Figura 5.1c, il segnale logico assume due soli valori e cioè, il valore minimo 0 e il valore massimo max; in generale, per i segnali logici possiamo assumere che teoricamente il passaggio da un valore all'altro avvenga in modo istantaneo e cioè, in un tempo nullo.
A questo punto appare evidente il fatto che i segnali logici sono quelli più indicati per risolvere il nostro problema; osserviamo, infatti, che è possibile associare un certo numero di simboli da codificare, ad altrettanti livelli di tensione (detti livelli logici) assunti da questa categoria di segnali elettrici.
Consideriamo, in particolare, proprio il segnale logico di Figura 5.1c che può assumere nel tempo solo due valori distinti di tensione (che necessariamente coincideranno con il minimo e il massimo); come è stato già detto, assumiamo per semplicità che il passaggio da un livello all'altro avvenga in modo istantaneo (tempo di commutazione nullo). Possiamo far coincidere, ad esempio, il livello più basso con il potenziale elettrico della massa del circuito; indicando con GND il potenziale di massa, possiamo porre, ad esempio:
GND = 0 volt
Analogamente, possiamo far coincidere il livello più alto con il potenziale elettrico positivo di alimentazione del circuito; indicando con +Vcc il potenziale di alimentazione, possiamo porre, ad esempio:
+Vcc = +5 volt
In elettronica digitale, i due livelli logici minimo e massimo assunti dal segnale di Figura 5.1c, vengono indicati con diversi nomi come, ad esempio, basso/alto, low/high, off/on, GND/+Vcc e così via. Naturalmente, in relazione al sistema di numerazione binario, è intuitivo il fatto che le cifre binarie 0 e 1 verranno associate, rispettivamente, a GND e +Vcc; come vedremo nel seguito del capitolo e nei capitoli successivi, con questo accorgimento il computer si trova ad elaborare segnali elettrici senza rendersi conto che questi segnali rappresentano (per noi esseri umani) dei numeri.

I circuiti elettronici che elaborano i segnali logici, prendono il nome di circuiti logici o reti logiche; un problema molto delicato che è necessario affrontare nei circuiti logici, consiste nel tenere adeguatamente "distanti" il livello logico 0 dal livello logico 1 in modo da evitare commutazioni indesiderate dovute, ad esempio, a disturbi elettrici esterni. Si tratta quindi di scegliere due valori di tensione che risultino non troppo vicini tra loro; contemporaneamente però si deve anche rispettare il vincolo rappresentato dalla tensione di alimentazione +Vcc del circuito logico. Avendo a che fare con due soli simboli da rappresentare, possiamo associare un simbolo a GND e l'altro simbolo a +Vcc ottenendo così la massima distanza possibile tra i due livelli logici; in moltissimi circuiti logici si utilizza un valore di +Vcc pari a +5V.
Le considerazioni appena esposte ci fanno capire che non avrebbe molto senso realizzare un computer capace di lavorare in base 10; in un caso del genere, infatti, andremmo incontro ad enormi complicazioni circuitali e si presenterebbe anche il problema della eccessiva vicinanza tra due livelli logici adiacenti. Questa situazione farebbe aumentare notevolmente il rischio di commutazioni indesiderate; la Figura 5.2, ad esempio, illustra quello che succederebbe se si dovessero gestire 10 livelli logici differenti con una +Vcc di +5V. In Figura 5.2a vediamo i 10 livelli di tensione necessari per rappresentare i 10 diversi simboli del sistema di numerazione posizionale in base 10; in Figura 5.2b vediamo, invece, i 2 livelli di tensione necessari per rappresentare i 2 diversi simboli del sistema di numerazione posizionale in base 2.
Nel caso del codice binario abbiamo v0=0V e v1=+5V; in questo modo tra i due unici livelli logici esiste una distanza di +5V che è anche la massima distanza possibile. Nel caso, invece, del codice decale, per gestire tutti i 10 differenti simboli dobbiamo necessariamente suddividere l'intervallo tra 0V e +5V in 9 parti uguali, ciascuna delle quali rappresenta un salto di appena 0.55V; appare evidente quindi che una distanza così piccola tra due livelli logici adiacenti comporterebbe un altissimo rischio di commutazioni indesiderate.

5.2 I dispositivi logici

I segnali logici che transitano nei circuiti del computer, vengono gestiti ed elaborati attraverso appositi dispositivi chiamati dispositivi logici; si usa anche la definizione di dispositivi digitali. Il termine "logico" è legato al fatto che questi dispositivi producono un segnale in uscita che è una "logica" conseguenza del segnale (o dei segnali) in ingresso; il termine "digitale" è legato, invece, al fatto che i segnali da elaborare rappresentano come sappiamo le cifre (digits) di un numero binario.
Consideriamo ora un codice binario a 8 bit come, ad esempio, 01010110b; per gestire gli 8 bit di questo numero il computer si serve di 8 apposite linee elettriche che nel loro insieme formano un cosiddetto BUS. Su ciascuna linea transita uno dei bit del codice binario; partendo allora dal LSB possiamo dire che sulla prima linea transita un livello logico 0, sulla seconda linea transita un livello logico 1, sulla terza linea transita un livello logico 1 e così via.
Se vogliamo realizzare allora un dispositivo logico capace di sommare tra loro due numeri binari da 8 bit ciascuno, dobbiamo fare in modo che il dispositivo stesso sia dotato delle necessarie linee di ingresso e di uscita; la Figura 5.3 illustra in modo schematico la struttura di un dispositivo di questo genere. Come si può notare, abbiamo 16 linee di ingresso attraverso le quali entrano i due numeri binari da sommare; lungo le linee da A0 a A7 entrano gli 8 bit del primo addendo, mentre lungo le linee da B0 a B7 entrano gli 8 bit del secondo addendo. Abbiamo poi 8 linee di uscita (da S0 a S7) lungo le quali esce il numero binario che rappresenta la somma dei due numeri in ingresso; la nona linea (CF) contiene il riporto della somma.
La Figura 5.3 ci permette anche di capire meglio il concetto di architettura di una CPU (in questo caso si tratta chiaramente di architettura a 8 bit); appare evidente il fatto che con il dispositivo di Figura 5.3 non è possibile sommare via hardware numeri binari formati da più di 8 bit.
Si può anche constatare che un dispositivo sommatore appartenente ad una CPU con architettura a 16 bit sarà dotato di 32 linee di ingresso e 16+1 linee di uscita; al crescere del numero di linee disponibili cresce la potenza di calcolo della CPU, ma parallelamente cresce anche la complessità circuitale.

In definitiva, possiamo dire che un dispositivo logico riceve in ingresso (input) una serie di segnali digitali e produce in uscita (output) un'altra serie di segnali digitali che sono una logica conseguenza dei segnali in ingresso; a questo punto resta da capire come sia possibile eseguire su questi segnali digitali delle operazioni matematiche che producono dei risultati sempre sotto forma di segnali digitali. Le tecniche che vengono impiegate nella realizzazione dei circuiti logici del computer si basano principalmente sull'algebra sviluppata nel XVIII secolo dal matematico George Boole il quale non poteva certo immaginare che un giorno i suoi studi avrebbero avuto una applicazione pratica così importante.

5.3 L'algebra di Boole

L'algebra di Boole, definisce le operazioni fondamentali che si possono compiere sugli insiemi formati da un unico elemento che può essere 0 o 1; l'algebra di Boole è fortemente basata sulla teoria degli insiemi, per cui è necessario definire le nozioni fondamentali relative agli insiemi stessi.
Il concetto di insieme viene considerato primitivo in quanto è naturale associare questo termine ad un gruppo o aggregato di oggetti della stessa natura come, ad esempio: un gruppo di automobili, un gruppo di sedie, un gruppo di bicchieri, un gruppo di dischi, un gruppo di computer, etc; analogamente, anche il concetto di elemento di un insieme è primitivo in quanto rappresenta ovviamente un oggetto appartenente all'insieme stesso.
Gli insiemi vengono rappresentati con le lettere maiuscole (A, B, C, ...) , mentre gli elementi di un insieme vengono rappresentati con le lettere minuscole (a, b, c, ...); un insieme A formato dai quattro elementi a, b, c, d viene rappresentato come:
A = {a, b, c, d}
Un elemento può appartenere o meno ad un insieme; se l'elemento a appartiene all'insieme A si scrive:
a ∈ A
Se, invece, a non appartiene ad A si scrive:
a ∉ A
Dato un insieme A, si dice che l'insieme B è un sottoinsieme di A se tutti gli elementi di B appartengono ad A e si scrive:
B ⊆ A
oppure:
A ⊇ B
Se:
B ⊆ A
ed esiste almeno un elemento di A che non appartiene a B si dice che B è un sottoinsieme proprio di A e si scrive:
B ⊂ A
oppure:
A ⊃ B
Se:
B ⊆ A
e
A ⊆ B
allora tutti gli elementi di A appartengono a B e viceversa e quindi i due insiemi sono uguali e si scrive:
A = B
Un insieme privo di elementi si chiama insieme vuoto e viene rappresentato dal simbolo:
Se consideriamo, ad esempio, l'insieme delle automobili targate Roma, abbiamo stabilito una proprietà chiamata proprietà caratteristica che ci dice in modo inequivocabile se un'automobile appartiene o meno al nostro insieme (solo se la macchina è targata Roma appartiene al nostro insieme); questo insieme è "immerso" nell'insieme più vasto che comprende tutte le automobili del mondo, chiamato insieme universale. Questo concetto è valido in generale per qualsiasi insieme composto da qualsiasi tipo di elementi; l'insieme universale viene indicato con
U
Un insieme composto da un numero finito di elementi (o da una infinità numerabile di elementi) si chiama insieme discreto; se, invece, l'insieme è costituito da una infinità non numerabile di elementi, allora si parla di insieme continuo.

Vediamo ora le operazioni che si possono compiere sugli insiemi.

Dati due insiemi A e B, si definisce unione o somma dei due insiemi, un nuovo insieme costituito dagli elementi che appartengono ad A o a B; questa operazione, che viene rappresentata come:
A ∪ B
si estende in generale ad un numero qualsiasi di insiemi.
Ad esempio, se:
A = {5, 7, 9}
e:
B = {7, 9, 15, 20, 24}
allora:
A ∪ B = S = {5, 7, 9, 15, 20, 24}
Dati due insiemi A e B, si definisce intersezione o prodotto dei due insiemi, un nuovo insieme costituito dagli elementi che appartengono, contemporaneamente, sia ad A che a B; questa operazione, che viene rappresentata come:
A ∩ B
si estende in generale ad un numero qualsiasi di insiemi.
Ad esempio, se:
A = {5, 7, 9}
e:
B = {7, 9, 15, 20, 24}
allora:
A ∩ B = P = {7, 9}
Se, invece:
A = {1, 2, 3}
e:
B = {4, 5, 6}
allora:
A ∩ B = P = ∅
e i due insiemi si dicono disgiunti.

Dato un insieme A, si definisce complemento di A rispetto all'insieme universale U, l'insieme formato da tutti gli elementi di U che non appartengono da A; questa operazione viene rappresentata con:
Ā
Ad esempio, se A è l'insieme delle automobili targate Roma, allora il complemento di A è l'insieme di tutte le automobili del mondo che non sono targate Roma.
In base alle considerazioni appena esposte, sono facilmente verificabili le uguaglianze mostrate in Figura 5.4.

5.4 Concetti fondamentali dell'algebra di Boole

Vediamo ora i concetti e i postulati fondamentali dell'algebra di Boole che in seguito verranno interpretati e dimostrati; ricordiamo che l'algebra di Boole si applica agli insiemi formati da un unico elemento che può essere 0 oppure 1. I concetti fondamentali dell'algebra di Boole sono elencati in Figura 5.5. Per chiarire meglio questi concetti, consideriamo un insieme A formato da un unico elemento che può essere 0 oppure 1; appare evidente che un insieme del genere è un sottoinsieme proprio dell'insieme K. Si dice allora che A è un elemento in classe K.
Gli operatori come OR (somma binaria) e AND (prodotto binario) si chiamano operatori binari in quanto richiedono come operandi due elementi in classe K; l'operatore NOT (negazione unaria) si chiama, invece, operatore unario in quanto richiede un solo operando che ovviamente deve essere un elemento in classe K.

5.5 Interpretazione dei concetti fondamentali

Vediamo ora di interpretare i concetti fondamentali dell'algebra di Boole servendoci della cosiddetta algebra delle proposizioni; ci serviamo cioè di dichiarazioni che possono risultare vere o false. Questo significa che le dichiarazioni devono essere prive di qualsiasi ambiguità e per questo motivo si parla anche di proposizioni logiche.
Prendiamo, ad esempio, le due dichiarazioni:
"La capitale dell'Italia è Roma"
e
"La capitale della Francia è Berlino"
La prima dichiarazione è vera (TRUE) mentre la seconda è chiaramente falsa (FALSE) e questo può essere detto senza ombra di dubbio.
Invece, la dichiarazione:
"L'Italia è più bella della Francia"
non è una proposizione logica in quanto la risposta è influenzata dai gusti personali.

Tornando alle proposizioni logiche, associamo alla proposizione vera il simbolo 1 (TRUE) e alla proposizione falsa il simbolo 0 (FALSE); stabilite queste convenzioni, possiamo studiare i concetti OR, AND, NOT e =, costruendo per ciascuno di essi, la cosiddetta tabella della verità o truth table che ci dà una rappresentazione visiva dei risultati che si ottengono applicando questi operatori agli elementi 0 e 1.

5.5.1 OR logico

Date le due proposizioni A e B, la composizione delle due proposizioni attraverso l'OR logico si scrive:
A OR B
e risulta vera se, e solo se, almeno una delle due proposizioni è vera; componendo, ad esempio, le due dichiarazioni viste prima:
"La capitale dell'Italia è Roma" OR "La capitale della Francia è Berlino"
si ottiene 1 (TRUE) in quanto la prima delle due dichiarazioni è vera.
Nella Figura 5.6, vediamo il simbolo logico dell'OR e la relativa tabella della verità: La tabella della verità in genere viene letta come: 0 OR 0 = 0, 0 OR 1 = 1 e così via. A sinistra della tabella della verità in Figura 5.6 vediamo il simbolo che schematizza il componente che nei circuiti elettronici del computer svolge il ruolo di OR logico; come si può notare, alla sinistra del componente sono presenti due linee di ingresso, mentre alla sua destra c'è una linea di uscita e questo perché, essendo l'OR un operatore binario, riceverà in input due segnali producendo un segnale in output.
In base alla tabella della verità, possiamo vedere che se in input entrano due segnali a livello logico 0, il segnale in uscita è anch'esso a livello logico 0; se un segnale in ingresso è a livello logico 0 mentre l'altro è a 1, il segnale in uscita sarà a livello logico 1 e così via.
Facendo riferimento alla teoria degli insiemi, possiamo dire che l'OR logico corrisponde alla operazione di unione tra i due insiemi A e B; questo componente elettronico, fa parte, insieme a quelli che seguono e a molti altri, della grande famiglia delle cosiddette porte logiche.
Le considerazioni appena esposte possono essere estese nel caso più generale possibile a una porta logica OR formata da un numero arbitrario n di ingressi e da una sola uscita. In questo caso, l'uscita fornisce un livello logico 1 quando almeno uno degli n ingressi è a livello logico 1; se tutti gli ingressi sono a livello logico 0, anche in uscita si ottiene 0.

5.5.2 AND logico

Date le due proposizioni A e B, la composizione delle due proposizioni attraverso l'AND logico si scrive:
A AND B
e risulta vera se, e solo se, entrambe le proposizioni sono vere; componendo, ad esempio, le due dichiarazioni viste prima:
"La capitale dell'Italia è Roma" AND "La capitale della Francia è Berlino"
si ottiene 0 (FALSE) in quanto la seconda delle due dichiarazioni è falsa.
Nella Figura 5.7, vediamo il simbolo logico dell'AND e la relativa tabella della verità: Attraverso la Figura 5.7 si verifica subito che solo quando i due segnali in ingresso sono entrambi a livello logico 1 (cioè quando le due proposizioni sono entrambe vere), l'AND logico produrrà in uscita un segnale a livello logico 1; in tutti gli altri casi il segnale in uscita sarà, invece, a livello logico 0.
La figura 5.7 mostra chiaramente il significato di operatore binario; anche l'AND, infatti (come l'OR), opera su due elementi in classe K per produrre il risultato finale.
Si può facilmente dimostrare che, nella teoria degli insiemi, l'AND coincide con l'operazione di intersezione tra i due insiemi A e B.
Le considerazioni appena esposte possono essere estese nel caso più generale possibile a una porta logica AND formata da un numero arbitrario n di ingressi e da una sola uscita. In questo caso, l'uscita fornisce un livello logico 1 quando tutti gli n ingressi sono a livello logico 1; in tutti gli altri casi (cioè quando almeno uno degli n ingressi è a 0), in uscita si ottiene 0.

5.5.3 NOT logico

A differenza degli operatori binari, il NOT logico è un operatore unario perché opera su di un solo elemento in classe K. Data la proposizione A, la negazione di questa proposizione si scrive:
NOT A
e risulta vera se A è falsa, mentre risulta falsa se A è vera.
Nel caso, ad esempio, di:
NOT "La capitale dell'Italia è Roma"
si ottiene 0 (FALSE) in quanto stiamo negando una proposizione che è vera; questa negazione produce, infatti, la proposizione:
"La capitale dell'Italia non è Roma"
che è chiaramente falsa.

Nel caso, invece, di:
NOT "La capitale della Francia è Berlino"
si ottiene 1 (TRUE) in quanto stiamo negando una proposizione che è falsa; questa negazione produce, infatti, la proposizione:
"La capitale della Francia non è Berlino"
che è chiaramente vera.
Nella Figura 5.8, vediamo il simbolo logico del NOT e la relativa tabella della verità: La Figura 5.8 ci permette di constatare che il NOT logico ha una sola linea in ingresso e una sola linea in uscita. Se in ingresso entra un segnale a livello logico 0, avremo in uscita un segnale a livello logico 1; viceversa, se in ingresso entra un segnale a livello logico 1, avremo in uscita un segnale a livello logico 0.
Negli schemi dei circuiti elettronici spesso, il NOT logico viene rappresentato attraverso il solo cerchietto che si vede in Figura 5.8 sul vertice destro del triangolo.
Nella teoria degli insiemi, il NOT logico corrisponde all'operazione di complemento di A rispetto all'insieme universale U (in questo caso U = {0, 1}); si ottengono quindi tutti gli elementi di U esclusi quelli che appartengono ad A.

5.5.4 Uguaglianza logica ( = )

L'uguaglianza logica, non è associata ad alcun componente elettronico in quanto esprime solamente il fatto che due elementi in classe K sono uguali tra loro; possiamo dire allora che due proposizioni logiche A e B sono uguali quando hanno la stessa tabella della verità.
Nella teoria degli insiemi tutto questo discorso è rappresentato dal fatto che:
B ⊆ A
e
A ⊆ B
Quindi, tutti gli elementi di A sono anche elementi di B e viceversa.

Una volta interpretati i concetti fondamentali, possiamo passare alla definizione e dimostrazione dei postulati dell'algebra di Boole.

5.6 Postulati fondamentali dell'algebra di Boole

Postulato 1 - Dati i due elementi 0 e 1 in classe K, allora le operazioni OR e AND applicate a questi elementi, saranno a loro volta in classe K, cioè produrranno un risultato binario.

Postulato 2 - Se A e B sono due elementi in classe K, valgono le due uguaglianze:
A OR B = B OR A
e
A AND B = B AND A
In sostanza, anche per l'algebra di Boole è valida la proprietà commutativa.

Postulato 3 - Dati gli elementi A, B e C in classe K, valgono le uguaglianze:
A OR (B AND C) = (A OR B) AND (A OR C)
e
A AND (B OR C) = (A AND B) OR (A AND C)
Quindi, nell'algebra di Boole la proprietà distributiva vale non solo per il prodotto rispetto alla somma, ma anche per la somma rispetto al prodotto.

Postulato 4 - L'elemento neutro per l'OR è 0 e quindi:
0 OR A = A OR 0 = A
qualunque sia il valore di A.

L'elemento neutro per l'AND è 1 e quindi:
1 AND A = A AND 1 = A
indipendentemente dal valore di A.

Postulato 5 - Per ogni elemento A in classe K valgono le due uguaglianze:
A OR Ā = 1
e
A AND Ā = 0

5.7 Dimostrazione dei postulati fondamentali

Grazie a quanto abbiamo appreso riguardo all'interpretazione dei concetti fondamentali, la dimostrazione dei postulati risulta piuttosto semplice.
Partiamo dal postulato n. 1 che afferma in pratica che applicando gli operatori OR e AND agli elementi 0 e 1, si ottiene un risultato che può essere o 0 o 1; per dimostrare questo postulato basta osservare le tabelle della verità dei due operatori OR e AND (Figura 5.6 e Figura 5.7) e si vede subito che il risultato che si ottiene è sempre 0 o 1.

Il postulato n. 2 afferma che i due operatori OR e AND godono della proprietà commutativa e questo significa che si possono scambiare tra loro i due operandi (A e B) ottenendo gli stessi risultati; per dimostrarlo basta prendere le tabelle della verità di Figura 5.6 e Figura 5.7 e scambiare tra loro i due elementi A e B ricalcolando poi B OR A e B AND A e verificando in tal modo che i risultati ottenuti sono identici a quelli di A OR B e A AND B.

Il postulato n. 3 afferma che nell'algebra di Boole vale la proprietà distributiva, sia del prodotto rispetto alla somma, sia della somma rispetto al prodotto, mentre come sappiamo, nell'algebra tradizionale vale solo la proprietà distributiva del prodotto rispetto alla somma; ad esempio:
3 x (2 + 5) = 21 = (3 x 2) + (3 x 5)
mentre
3 + (2 x 5) = 13 ≠ (3 + 2) x (3 + 5) = 40
Per dimostrare il postulato n. 3 utilizziamo le tabelle della verità di Figura 5.9 e di Figura 5.10. In entrambe le tabelle si vede che la colonna 5 coincide con la colonna 8.

Il postulato n. 4 afferma che esiste l'elemento neutro, sia per l'OR che per l'AND. Nell'algebra tradizionale, l'elemento neutro per la somma è 0 in quanto, sommando un qualsiasi numero n a 0, si ottiene sempre n; infatti:
n + 0 = 0 + n = n
Per il prodotto, invece, l'elemento neutro è 1 in quanto, moltiplicando un qualsiasi numero n per 1, si ottiene sempre n; infatti:
n x 1 = 1 x n = n
Per dimostrare questo postulato, basta servirsi ancora delle tabelle della verità riferite ad un elemento A che può valere 0 o 1; si verifica subito che:
A OR 0 = 0 OR A = A
e
A AND 1 = 1 AND A = A
È importante sottolineare che 0 equivale ad una proposizione logica sempre falsa, mentre 1 equivale ad una proposizione logica sempre vera; nei circuiti digitali, si ottiene la proposizione logica sempre falsa, collegando un ingresso della porta logica a massa (GND) che corrisponde al livello logico basso (Figura 5.11a), mentre per avere una proposizione logica sempre vera si collega un ingresso della porta logica ad un punto del circuito a potenziale elettrico +Vcc che corrisponde al livello logico alto (Figura 5.11b). Nei circuiti digitali, inoltre, può capitare che uno o più ingressi di una porta logica non vengano utilizzati; questi ingressi devono essere ugualmente collegati al circuito per garantire il corretto funzionamento della porta logica stessa. Tenendo conto della funzione svolta dalle porte OR e AND, è facile capire che: ogni ingresso non utilizzato di una porta OR va collegato a GND (Figura 5.11c), mentre ogni ingresso non utilizzato di una porta AND va collegato a +Vcc (Figura 5.11d).
È evidente, infatti, che in caso contrario, si possono ottenere sull'uscita di queste porte, risultati imprevisti, come si può facilmente verificare.

Il postulato n. 5 infine è abbastanza intuitivo in quanto, se A vale 0, allora NOT A vale 1 e viceversa; questo significa che abbiamo in ogni caso, una proposizione logica vera e una falsa. La conseguenza è che:
A OR (NOT A) = 1
mentre:
A AND (NOT A) = 0

5.8 Teoremi dell'algebra di Boole

Un insieme di porte logiche collegate tra loro, formano una cosiddetta rete combinatoria o R.C.; quando il numero di porte logiche comincia a diventare piuttosto consistente, le R.C. tendono ad assumere una notevole complessità e in questo caso, è necessario trovare il modo di semplificare la rete stessa. I teoremi dell'algebra di Boole hanno proprio lo scopo di studiare, risolvere e semplificare le R.C.; per maggiori dettagli su questo argomento si può consultare un testo di elettronica digitale.
A titolo di esempio, citiamo solo il teorema dell'idempotenza il quale afferma che:
A OR A = A
e
A AND A = A
La verifica attraverso le tabelle della verità è immediata.

In generale l'elemento A può essere anche il risultato di una qualunque espressione booleana come, ad esempio:
A = B OR (C AND D)
Attraverso questo teorema è possibile ottenere notevoli semplificazioni delle R.C. Supponiamo, ad esempio, di voler realizzare attraverso porte logiche la funzione:
f = (A AND B AND C) OR (B AND (NOT C)) OR (A AND B AND C) OR ((NOT A) AND B) OR (B AND (NOT C))
Questa funzione richiede 1 OR a 5 ingressi, 2 AND a 3 ingressi, 3 AND a 2 ingressi e 2 NOT, per un totale di 8 porte logiche.
Raggruppiamo i termini simili (proprietà associativa) e riscriviamo la funzione come:
f = [(A AND B AND C) OR (A AND B AND C)] OR [(B AND (NOT C)) OR (B AND (NOT C))] OR ((NOT A) AND B)
Applicando il teorema dell'idempotenza, notiamo subito che:
(A AND B AND C) OR (A AND B AND C) = (A AND B AND C)
e:
(B AND (NOT C)) OR (B AND (NOT C)) = (B AND (NOT C))
Possiamo allora riscrivere la funzione come:
f = (A AND B AND C) OR (B AND (NOT C)) OR ((NOT A) AND B)
La nuova funzione così ottenuta richiede 1 OR a 3 ingressi, 1 AND a 3 ingressi, 2 AND a 2 ingressi e 2 NOT, per un totale di 6 porte logiche. La Figura 5.12 mostra le R.C. relative alle due funzioni. In Figura 5.12 a sinistra vediamo la R.C. della funzione non semplificata, mentre sulla destra vediamo la R.C. equivalente che si ottiene dai calcoli illustrati in precedenza; con l'ausilio di questi due circuiti si verifica subito che assegnando qualunque terna di valori agli elementi in ingresso A, B, C, si ottiene lo stesso valore in uscita per entrambe le R.C.. Si noti che nel circuito a destra la porta NOT è stata sostituita (come si fa usualmente) con un cerchietto; inoltre, il segno + indica l'operatore OR, mentre l'operatore AND () è stato omesso come si fa usualmente con il segno di moltiplicazione.

5.9 Altre porte logiche importanti

Le porte logiche OR, AND, NOT, vengono definite fondamentali in quanto tutte le altre porte logiche utilizzate nei circuiti digitali, possono essere ottenute a partire da queste tre; analizziamo le principali porte logiche derivate dalle tre fondamentali.

5.9.1 Porta OR Esclusivo

In figura 5.13, vediamo la porta EX-OR chiamata anche Exclusive OR (OR Esclusivo); si tratta di un operatore binario che restituisce un livello logico 1 solo quando i due segnali in ingresso hanno livelli logici diversi tra loro. Possiamo dire quindi che se entrambi gli ingressi sono a livello logico 1, in uscita otterremo un livello logico 0; la Figura 5.13 mostra (a sinistra) una delle possibili realizzazioni dell'EX-OR attraverso le porte fondamentali OR, AND, NOT.

5.9.2 Porta NOR Esclusivo

In Figura 5.14 vediamo, invece, la porta EX-NOR chiamata anche Exclusive NOR (NOR Esclusivo); l'operatore EX-NOR viene ottenuto semplicemente negando il segnale prodotto in uscita dall'EX-OR. Come si può notare dalla tabella della verità, i livelli logici in uscita sono, infatti, opposti a quelli dell'EX-OR; nella Figura 5.14 a sinistra vediamo anche una possibile realizzazione dell'EX-NOR con le porte logiche fondamentali OR, AND, NOT.

5.9.3 Porta NOR

La Figura 5.15 mostra la porta NOR che si ottiene semplicemente negando il risultato prodotto da una porta OR; come si vede, infatti, dalla tabella della verità, i livelli logici che si ottengono in uscita sono esattamente opposti a quelli della porta OR. In Figura 5.15 a sinistra viene mostrata una possibile realizzazione della porta NOR con le porte logiche fondamentali; il metodo più ovvio da seguire consiste nel ricorrere ad un OR e ad un NOT collegati in serie.

5.9.4 Porta NAND

La Figura 5.16 infine mostra la porta NAND che si ottiene negando il risultato prodotto da una porta AND; anche in questo caso, la tabella della verità mostra appunto che i livelli logici prodotti dalla porta NAND sono esattamente opposti a quelli della porta AND: In Figura 5.16 a sinistra viene mostrata una possibile realizzazione della porta NAND con le porte logiche fondamentali; il metodo più ovvio da seguire consiste nel ricorrere ad un AND e ad un NOT collegati in serie.

5.9.5 Porte logiche derivate dalla porta NAND

Le ultime due porte che abbiamo visto (NOR e NAND) assumono una importanza particolare in quanto, sia l'una che l'altra possono essere utilizzate per realizzare diverse altre porte logiche; questo aspetto è molto importante in quanto può capitare che nella realizzazione pratica di un circuito digitale, venga a mancare qualche porta logica NOT, OR, EX-OR, etc. La soluzione consiste allora nell'utilizzare appunto uno di questi due componenti (NOR o NAND) per realizzare le porte mancanti; la Figura 5.17, ad esempio, mostra una serie di porte logiche ottenibili a partire dalla porta NAND: La porta AND si può ottenere facendo seguire ad un NAND il NOT che si vede in Figura 5.17; considerando il fatto che a partire dalle porte NOT, OR, AND si può realizzare qualunque altra porta logica, si capisce subito che è possibile (come spesso avviene in pratica) realizzare un intero circuito digitale utilizzando solo porte NAND (o solo porte NOR).

In questo capitolo abbiamo appurato quindi che componendo una serie di proposizioni logiche A, B, C, etc, attraverso le porte NOT, OR, AND, NOR, etc, si ottiene una cosiddetta espressione booleana che produrrà come risultato un valore binario 0 o 1; ad esempio:
f = A AND (C OR (NOT B))
In base alle considerazioni esposte in precedenza, è evidente che qualsiasi espressione booleana, potrà essere implementata fisicamente attraverso una R.C.; nel prossimo capitolo parleremo, in particolare, delle R.C. che ricevono in input dei numeri binari ed effettuano su di essi delle operazioni matematiche producendo in output dei risultati sempre sotto forma di numeri binari.

5.10 Le famiglie logiche

Dopo aver esaminato gli aspetti teorici su cui si basano i circuiti logici del computer, può essere interessante analizzare i metodi che vengono impiegati per la realizzazione pratica delle principali porte logiche; nel corso degli anni sono state impiegate a tale scopo diverse tecnologie sempre più evolute, che vengono indicate con il nome di famiglie logiche. Naturalmente, nel seguito del capitolo questo argomento verrà trattato in modo molto semplificato; per maggiori dettagli si consiglia di consultare un testo di elettronica digitale.

5.10.1 La famiglia DL (Diode Logic)

Storicamente la prima famiglia logica comparsa sul mercato, è stata la famiglia DL o Diode Logic (logica a diodi); tale nome deriva dal fatto che questa tecnologia è basata sull'uso dei diodi. La Figura 5.18 illustra il simbolo grafico del diodo (Figura 5.18a) e la curva che rappresenta la caratteristica di funzionamento di questo dispositivo elettronico (Figura 5.18b): Il terminale A del diodo prende il nome di anodo, mentre il terminale K prende il nome di catodo; semplificando al massimo possiamo dire che il diodo è una sorta di valvola elettronica che si lascia attraversare dalla corrente elettrica solo in un verso (quello indicato dal triangolo nero). Se sul terminale A viene applicato un potenziale elettrico maggiore di quello presente sul terminale K, si dice che il diodo è polarizzato direttamente; come si nota dalla curva caratteristica di Figura 5.18b (semiasse positivo V), non appena la differenza di potenziale V supera la tensione Vt, il diodo entra in conduzione comportandosi con buona approssimazione come un interruttore chiuso (ON). La tensione Vt si chiama tensione di soglia e per i diodi al silicio vale circa 0.5V.
Se sul terminale A viene applicato un potenziale elettrico minore di quello presente sul terminale K, si dice che il diodo è polarizzato inversamente; come si nota dalla curva caratteristica di Figura 5.18b (semiasse negativo V), in queste condizioni il diodo è in interdizione e impedisce il passaggio della corrente. Il diodo in interdizione si comporta quindi con buona approssimazione come un interruttore aperto (OFF).

Sulla base delle considerazioni appena esposte, possiamo ora analizzare le porte logiche realizzabili in tecnologia DL; la Figura 5.19 mostra una porta OR a 3 ingressi: Assumiamo come al solito che la massa (GND) sia a potenziale di 0V e che il positivo di alimentazione (+Vcc) sia a potenziale di +5V; questi due valori di tensione rappresentano come al solito il livello logico 0 e il livello logico 1. Osserviamo che in fase di conduzione un diodo si comporta come un vero e proprio corto circuito e quindi può essere danneggiato dalla corrente intensa che lo attraversa; proprio per questo motivo i diodi vanno usati sempre con una resistenza in serie (Rd in Figura 5.19) che ha lo scopo di limitare la corrente.
Supponiamo ora che i tre ingressi A, B, C siano tutti a potenziale di massa (0V), cioè a livello logico 0; in queste condizioni i tre diodi non possono condurre (in quanto non sono polarizzati) e quindi si trovano tutti allo stato OFF. La corrente in uscita vale 0 e quindi anche la resistenza R (resistenza di pull-down) viene attraversata da una corrente I=0; in base alla legge di Ohm quindi otteniamo:
Vout = R x I = R x 0 = 0V = GND
In definitiva, se tutti gli ingressi sono a livello logico basso, anche in uscita (Vout) si ottiene un livello logico basso.
Supponiamo ora che almeno uno degli ingressi (ad esempio, A) si trovi a potenziale +Vcc=+5V, cioè a livello logico alto; in questo caso i due diodi D2 e D3 non conducono (OFF) in quanto non sono polarizzati, mentre il diodo D1 entra in conduzione (ON) in quanto è polarizzato direttamente. Tenendo conto del fatto che la resistenza Rd e la resistenza interna del diodo sono in genere trascurabili rispetto a R, si ottiene:
Vout = +Vcc - Vt = 5 - 0.5 = 4.5V
Si tenga presente che i circuiti logici hanno necessariamente una certa tolleranza, per cui riconoscono come livello logico 0 una tensione prossima a 0V (ad esempio, tra -1V e +1V) e riconoscono come livello logico 1 una tensione prossima a +5V (ad esempio, tra +4V e +6V); tutte le tensioni intermedie (ad esempio, tra +1V e +4V) rappresentano, invece, uno stato di ambiguità che si presenta solo nell'istante in cui avviene la commutazione da ON a OFF e viceversa. Possiamo dire quindi che se almeno uno degli ingressi di Figura 5.19 è a livello logico alto, anche l'uscita si porterà a livello logico alto; in definitiva, il circuito di Figura 5.19 implementa la funzione:
f = A OR B OR C
Attraverso la tecnologia DL è possibile realizzare anche le porte AND; la Figura 5.20 mostra, ad esempio, una porta AND a 3 ingressi. Supponiamo che almeno uno degli ingressi (ad esempio, A) si trovi a potenziale di massa GND=0V, cioè a livello logico basso; in queste condizioni il diodo D1 è polarizzato direttamente (ON), mentre i due diodi D2 e D3 hanno entrambi i terminali collegati a +Vcc e quindi sono in interdizione (OFF). Tutta la corrente I che arriva dal positivo di alimentazione, attraversa la resistenza R (resistenza di pull-up) e si scarica a massa attraverso D1; possiamo dire quindi che:
Vout = +Vcc - (R x I)
Indicando con Ri la resistenza interna del diodo, possiamo scrivere:
I = (+Vcc - Vt) / (Ri + Rd + R)
Abbiamo quindi:
Vout = +Vcc - (R x I) = +Vcc - R x (+Vcc - Vt) / (Ri + Rd + R)
Ricordando che Ri e Rd sono trascurabili rispetto a R, si ottiene:
Vout = +Vcc - R x (+Vcc - Vt) / R = +Vcc - (+Vcc) + Vt = Vt = +0.5V
La tensione in uscita di 0.5V viene riconosciuta come un livello logico basso; in definitiva, se almeno un ingresso è a livello logico basso, anche in uscita (Vout) si ottiene un livello logico basso.
Supponiamo ora che tutti gli ingressi A, B, C si trovino a potenziale +Vcc=+5V, cioè a livello logico 1; in questo caso, i tre diodi D1, D2 e D3, avendo entrambi i terminali collegati a +Vcc, sono tutti in interdizione (OFF). Dal positivo di alimentazione non arriva alcuna corrente e quindi in R non si verifica alcuna caduta di tensione; si ottiene quindi:
Vout = +Vcc - (R x I) = +Vcc - 0 = +Vcc = +5V
Possiamo dire quindi che se tutti gli ingressi sono a livello logico alto, anche in uscita si ottiene un livello logico alto; in definitiva, il circuito di Figura 5.20 implementa la funzione:
f = A AND B AND C
Le considerazioni appena esposte ci permettono di dedurre una serie di pregi e difetti della famiglia di porte logiche DL.
Osserviamo innanzi tutto che la curva caratteristica di Figura 5.18b dimostra come i diodi abbiano una elevata velocità di risposta, che si traduce in un bassissimo tempo di propagazione (tempo che intercorre tra l'arrivo in ingresso dei segnali da elaborare e la comparsa in uscita del segnale elaborato); come si può facilmente intuire, questo è uno dei parametri più importanti per una porta logica.
Un grave difetto della famiglia DL è costituito dalla elevata caduta di tensione provocata dalle porte OR; abbiamo visto, infatti, che applicando su un ingresso di una porta OR un livello logico alto (+5V), si ottiene in uscita un livello logico alto di +4.5V. Tutto ciò significa che in presenza di diverse porte OR collegate in serie, si ottiene una caduta di tensione eccessiva che compromette il funzionamento del circuito logico.
Un secondo importante difetto della famiglia DL è dato dal fatto che con i diodi non è possibile realizzare porte NOT.
Un ulteriore grave difetto è costituito dal fatto che le caratteristiche costruttive delle porte in tecnologia DL rendono praticamente impossibile la miniaturizzazione delle porte stesse; tutto ciò si traduce in un ingombro eccessivo dei circuiti logici realizzati con i diodi.
Come si può constatare, i difetti della famiglia DL superano abbondantemente i pregi; proprio per questo motivo questa tecnologia è stata quasi del tutto abbandonata.

5.10.2 La famiglia TTL (Transistor Transistor Logic)

Con l'invenzione del transistor, il mondo dell'elettronica ha subito una vera e propria rivoluzione; questa rivoluzione ha avuto naturalmente importantissime ripercussioni positive anche sulle tecnologie costruttive delle varie famiglie logiche. In particolare, grazie ai transistor sono nate le famiglie logiche DTL (Diode Transistor Logic) e la famosissima TTL (Transistor Transistor Logic); la Figura 5.21 illustra il simbolo grafico del transistor tipo BJT completo di resistenze di polarizzazione (Figura 5.21a) e la curva che rappresenta la sua caratteristica di funzionamento (Figura 5.21b): La sigla BJT sta per Bipolar Junction Transistor (transistor a giunzione bipolare); come possiamo notare in Figura 5.21a, il BJT ha tre terminali chiamati base (B), collettore (C) e emettitore (E). Semplificando al massimo si può dire che il BJT è una sorta di regolatore di corrente; in pratica, regolando da un minimo ad un massimo la corrente Ib che giunge alla base, è possibile regolare da un minimo ad un massimo la corrente Ic che transita dal collettore all'emettitore. Da queste considerazioni segue anche il fatto che il BJT è un transistor pilotato in corrente.
Analizziamo ora il funzionamento del BJT con l'ausilio delle curve caratteristiche di Figura 5.21b; si tenga presente che queste curve vengono fornite direttamente dal produttore. Supponiamo innanzi tutto di alimentare il circuito di Figura 5.21a con la tensione +Vcc=+5V; riportiamo il valore +Vcc sull'asse Vce del grafico di Figura 5.21b. Per la legge di Ohm, la massima corrente di collettore sarà quindi:
Icc = Vcc / Rc
Riportiamo il valore Icc sull'asse Ic del grafico di Figura 5.21b; congiungendo questi due punti, si ottiene la cosiddetta retta di carico del transistor.
A questo punto, imponendo una determinata corrente di base Ib, otteniamo il cosiddetto punto di lavoro del transistor e cioè, il punto di intersezione tra la retta di carico e la curva relativa a Ib; in Figura 5.21b vediamo, ad esempio, che in corrispondenza della corrente di base Ib4, otteniamo il punto di lavoro Q. La retta verticale passante per Q individua sull'asse Vce la tensione di collettore, cioè la tensione Vout prelevabile dall'uscita di collettore; la retta orizzontale passante per Q individua sull'asse Ic la corrente di collettore, cioè la corrente Ic che entra dal collettore del transistor.
Si tenga presente che per i BJT di piccola potenza, la corrente di base è dell'ordine di qualche microampere (milionesimi di ampere), mentre la corrente di collettore è dell'ordine di qualche milliampere (millesimi di ampere); in sostanza, piccolissime variazioni della corrente di base, producono grandi variazioni della corrente di collettore. Da queste considerazioni si deduce che il BJT può essere quindi usato in funzione di dispositivo amplificatore; ad esempio, applicando sulla base un debole segnale radio captato da una antenna, otteniamo in uscita lo stesso segnale radio, ma notevolmente amplificato.

Per la realizzazione delle famiglie logiche, il BJT non viene usato come amplificatore, bensì come interruttore elettronico; per capire questa importante caratteristica dei BJT, analizziamo ancora la Figura 5.21b. Applicando sulla base una corrente nulla (Ib1=0), si ottiene la minima corrente di collettore possibile; questa corrente viene indicata in Figura 5.21b con Ic0, ed è anch'essa quasi nulla. In queste condizioni, la caduta di tensione provocata da Rc è molto piccola, per cui il potenziale +Vcc si trasferisce quasi interamente sull'uscita di collettore (Vout); come si può notare in Figura 5.21b, in corrispondenza di Ib1=0 il punto di lavoro del BJT si porta in posizione P2. In sostanza, possiamo dire che per Ib1=0 si ottiene Vout circa uguale a +Vcc, e Ic0 circa uguale a zero; in queste condizioni si dice che il BJT è in stato di interdizione (zona celeste) e il suo comportamento equivale con buona approssimazione ad un interruttore aperto (OFF) che impedisce il transito della corrente dal collettore all'emettitore.
Applicando ora sulla base una corrente elevatissima come Ib7, si ottiene una altrettanto elevata corrente di collettore; come si nota in Figura 5.21b, questa corrente tende verso il massimo valore possibile Icc. In queste condizioni, la caduta di tensione provocata da Rc è molto grande, per cui il potenziale +Vcc viene quasi completamente "eroso" dalla stessa caduta di tensione; sull'uscita di collettore sarà quindi possibile prelevare una tensione Vout prossima allo zero, indicata in Figura 5.21b con Vces. Come si può notare sempre dalla Figura 5.21b, in corrispondenza di Ib7 il punto di lavoro del BJT si porta in posizione P1; applicando sulla base correnti maggiori di Ib7, si ottiene una corrente di collettore che cresce in modo insignificante in quanto come si può facilmente intuire, il BJT è ormai "saturo". In sostanza, possiamo dire che per Ib7 si ottiene Vout circa uguale a zero (Vces) e Ic circa uguale a Icc; in queste condizioni si dice che il BJT è in stato di saturazione (zona verde) e il suo comportamento equivale con buona approssimazione ad un interruttore chiuso (ON) che lascia scorrere liberamente la corrente che va dal collettore all'emettitore.
A questo punto è facile capire come sia possibile trasformare il BJT in un interruttore elettronico; per far svolgere al BJT questa funzione, basta portarlo rapidamente dalla saturazione all'interdizione o viceversa (dal punto P2 al punto P1 o viceversa). Si tenga presente che costruttivamente il BJT è formato in pratica da due diodi contrapposti, per cui la sua velocità di risposta sarà elevatissima; come è stato già detto in precedenza, la velocità di risposta è un parametro di enorme importanza per le porte logiche.

Dai concetti appena esposti, si deduce anche una ulteriore importante caratteristica del BJT; assumiamo come al solito che il potenziale GND=0V rappresenti il livello logico 0 e che il potenziale +Vcc=+5V rappresenti il livello logico 1. Applichiamo ora alla base un potenziale Vin=+Vcc; ciò equivale ad applicare in ingresso un livello logico 1. Dimensionando opportunamente Rb, in corrispondenza di Vin=+Vcc possiamo far arrivare alla base una corrente maggiore di Ib7 (Figura 5.21b); in questo caso sappiamo che il BJT si porta in saturazione, per cui in uscita otterremo Vout circa uguale a zero. In sostanza, applicando in ingresso un livello logico 1, otteniamo in uscita (di collettore) un livello logico 0.
Applichiamo ora alla base un potenziale Vin=0; ciò equivale ad applicare in ingresso un livello logico 0. In corrispondenza di Vin=0, arriva alla base una corrente Ib1=0 (Figura 5.21b); in questo caso sappiamo che il BJT si porta in interdizione, per cui in uscita otterremo Vout circa uguale a +Vcc. In sostanza, applicando in ingresso un livello logico 0, otteniamo in uscita (di collettore) un livello logico 1.
A questo punto abbiamo appurato che il BJT con uscita di collettore non è altro che una semplicissima porta NOT; questa porta NOT può essere impiegata singolarmente, oppure per negare porte OR, AND, etc, realizzate sempre con i transistor.

Nella sezione 5.9 di questo capitolo abbiamo visto che a partire dalla porta NAND (o NOR), è possibile realizzare qualsiasi altra porta logica; vediamo allora come può essere realizzata una porta NAND mediante l'uso di diodi e transistor (DTL). La Figura 5.22 illustra lo schema di una porta NAND in tecnologia DTL. Supponiamo che almeno uno dei due ingressi (ad esempio, A) sia collegato a massa (cioè a livello logico 0); in questo caso il diodo D1 è polarizzato direttamente ed è quindi in conduzione, mentre il diodo D2 ha entrambi i terminali a +Vcc e quindi non essendo polarizzato è in interdizione. La corrente che arriva dal positivo di alimentazione si scarica quindi a massa tramite D1 portando il potenziale del punto P quasi a zero; il potenziale del punto P viene ulteriormente "eroso" dalle tensioni di soglia dei diodi D3 e D4 e quindi non riesce a portare il BJT in conduzione. Il BJT è in interdizione (OFF) e quindi sull'uscita di collettore troviamo Vout circa uguale a +Vcc; in sostanza, se almeno uno dei due ingressi è a livello logico basso, l'uscita sarà a livello logico alto. Si tenga presente che tra il punto P e la base del BJT sono presenti due diodi in quanto la caduta di tensione (Vt) provocata da un solo diodo potrebbe non essere sufficiente per tenere il transistor in interdizione.
Supponiamo ora che entrambi gli ingressi siano a potenziale +Vcc (cioè a livello logico 1); in questo caso i due diodi D1 e D2 hanno entrambi i terminali a potenziale +Vcc e quindi non essendo polarizzati si trovano in interdizione. La corrente che arriva dal positivo di alimentazione, passa attraverso D3 e D4 e si riversa in buona parte sulla base del BJT portandolo in conduzione; dimensionando opportunamente i vari componenti del circuito di Figura 5.22, si può fare in modo che la corrente di base sia più che sufficiente per saturare il BJT (ON). In questo modo sull'uscita di collettore troviamo Vout circa uguale a zero; in sostanza, se tutti gli ingressi sono a livello logico alto, l'uscita sarà a livello logico basso.
La tabella della verità del circuito di Figura 5.22 dimostra quindi che abbiamo a che fare proprio con una porta NAND.

L'evoluzione della famiglia DTL ha portato alla nascita delle porte logiche in tecnologia TTL; come si intuisce dal nome, in questa tecnologia i diodi vengono sostituiti quasi del tutto da transistor. Ricordiamo, infatti, che di fatto un BJT è formato da due diodi contrapposti; di conseguenza, ogni diodo posto all'ingresso di una porta logica DTL, può essere sostituito dalla giunzione base emettitore di un BJT. Invece di utilizzare un BJT per ogni ingresso, possiamo servirci di un unico BJT dotato di due o più emettitori (BJT multiemettitore); in questo modo è possibile ottenere una elevatissima miniaturizzazione delle porte logiche TTL. La figura 5.23 mostra appunto come i tre ingressi di una porta NAND DTL possano essere sostituiti da un solo BJT a tre emettitori. La famiglia TTL e le altre famiglie da essa derivate, presentano una numerosa serie di vantaggi ai quali si contrappongono pochissimi svantaggi; uno dei vantaggi più importanti è rappresentato dalla elevatissima velocità di risposta, che nella serie High Speed (alta velocità) può scendere anche sotto i 6 nanosecondi (1 nanosecondo = 1 miliardesimo di secondo). Un altro vantaggio che assume un grande rilievo è dato dalla elevata possibilità di miniaturizzazione delle porte TTL e derivate; in questo modo è possibile realizzare microcircuiti contenenti al loro interno una enorme quantità di porte logiche.
Lo svantaggio principale della famiglia TTL è dato dalle elevate correnti di lavoro e dalla conseguente sensibile potenza dissipata (diversi milliwatt per porta); in presenza di elevate correnti di lavoro, si creano sensibili disturbi interni in fase di commutazione da ON a OFF e viceversa, che aumentano notevolmente il rischio di commutazioni indesiderate. Nella famiglia TTL è necessario quindi tenere adeguatamente separati i livelli logici 0 e 1; come abbiamo visto, viene utilizzata la tensione di 0V per il livello logico 0, mentre per il livello logico 1 non è consigliabile scendere sotto i +5V.
In ogni caso, i vantaggi delle porte TTL superano abbondantemente gli svantaggi; tanto è vero che la famiglia TTL presenta una enorme diffusione sul mercato.

5.10.3 La famiglia CMOS

Come abbiamo appena visto, il tallone di Achille della famiglia TTL (e derivate), è rappresentato dal sensibile valore che assume la potenza dissipata; per risolvere questo problema sarebbe necessario ovviamente ridurre l'intensità della corrente di lavoro. È stata realizzata a tale proposito una serie Low Power (bassa potenza) della famiglia TTL che permette di ridurre la potenza dissipata sino a 1 milliwatt per porta; purtroppo però questa tecnologia presenta l'inconveniente di un costo di produzione relativamente elevato.
La situazione è cambiata in modo radicale con la comparsa sul mercato del Field Effect Transistor o FET (transistor ad effetto di campo); in relazione alla tecnologia costruttiva basata sui semiconduttori all'ossido di metallo, il FET viene anche chiamato MOSFET o semplicemente MOS (Metal Oxide Semiconductor). La Figura 5.24 illustra il simbolo grafico di un MOS a canale N (NMOS) e di un MOS a canale P (PMOS); le curve caratteristiche di questi transistor sono del tutto simili a quelle del BJT. Come possiamo notare, il MOS ha un terminale G chiamato gate (cancello), un terminale D chiamato drain (canale di scarico) e un terminale S chiamato source (sorgente); la differenza fondamentale che esiste tra BJT e MOS è data dal fatto che il BJT come già sappiamo è pilotato in corrente, mentre il MOS è pilotato in tensione. Il gate, infatti, è elettricamente isolato dal drain e dal source grazie ad uno strato di biossido di silicio (SiO2, da cui deriva il nome MOS); regolando da un minimo ad un massimo la tensione applicata al gate, è possibile regolare la larghezza del canale che collega il drain al source. Attraverso la regolazione della larghezza del canale si ottiene anche la regolazione della sua resistenza elettrica; possiamo dire quindi che regolando da un minimo ad un massimo la tensione applicata al gate, otteniamo la regolazione da un minimo ad un massimo della corrente che attraversa il canale.
L'aspetto veramente importante è dato dal fatto che quando vengono impiegati nei circuiti logici, i MOS possono lavorare con correnti spesso irrisorie; mediamente le porte logiche realizzate con i MOS presentano una potenza dissipata pari a frazioni di milliwatt. Tutto ciò rende possibile un grado di miniaturizzazione estremamente elevato; vengono prodotti, infatti, microcircuiti contenenti al loro interno milioni di transistor MOS!
Un'altra importante caratteristica dei MOS è rappresentata dalla elevata tensione di soglia Vt che vale circa +1.5V; ciò si traduce in una notevole immunità ai disturbi elettrici, con la conseguente possibilità di ridurre il valore di tensione associato al livello logico 1. Vengono prodotte, ad esempio, porte logiche basate sui MOS, che si servono di una tensione +Vcc di appena +3V per il livello logico 1.

Analizziamo ora il comportamento di un NMOS utilizzato come interruttore elettronico.
Se la tensione Vgs applicata tra gate e source è inferiore alla tensione di soglia Vt, allora il canale tra drain e source è chiuso e il NMOS è in interdizione (OFF); il canale chiuso impedisce il passaggio della corrente, per cui Ids=0.
Se la tensione Vgs applicata tra gate e source è superiore alla tensione di soglia Vt, allora il canale tra drain e source è aperto e il NMOS è in conduzione (ON); nel canale circola una corrente Ids maggiore di zero che cresce al crescere di Vgs (sino alla saturazione).

Nel caso del PMOS la situazione è opposta.
Se la tensione Vgs applicata tra gate e source è superiore alla tensione di soglia Vt, allora il canale tra drain e source è chiuso e il PMOS è in interdizione (OFF); il canale chiuso impedisce il passaggio della corrente, per cui Ids=0.
Se la tensione Vgs applicata tra gate e source è inferiore alla tensione di soglia Vt, allora il canale tra drain e source è aperto e il PMOS è in conduzione (ON); nel canale circola una corrente Ids maggiore di zero che cresce al diminuire di Vgs (sino alla saturazione).

Sulla base di queste considerazioni possiamo analizzare alcune porte logiche realizzabili con i MOS; la Figura 5.25 illustra, ad esempio, una porta NOT realizzata con i NMOS. In teoria, tra il positivo di alimentazione +Vcc e il transistor T1 ci dovrebbe essere una resistenza di polarizzazione; si preferisce però utilizzare per tale scopo la resistenza interna di un secondo NMOS (T2). In questo modo è possibile ottenere una miniaturizzazione molto più spinta della porta logica; osserviamo, infatti, che un MOS è molto più piccolo e miniaturizzabile di una resistenza elettrica.
Supponiamo ora di portare l'ingresso a potenziale di massa (Vin=0); ciò equivale ad applicare in ingresso un livello logico zero. Dalla Figura 5.25 si rileva che T2 dovrebbe essere teoricamente in conduzione; T1 però è in interdizione (perché ha il gate a potenziale zero) e impedisce anche a T2 di condurre. In Figura 5.25 notiamo che G2 è allo stesso potenziale (+Vcc) di D2, per cui ricaviamo:
Vout = Vcc - Vds2 = Vcc - Vgs2
Siccome T2 è costretto all'interdizione, la sua tensione Vgs2 è sicuramente inferiore alla sua tensione di soglia Vt2; il transistor T2 può essere progettato in modo da avere Vt2 prossima allo zero, per cui anche Vgs2 sarà praticamente zero. Otteniamo quindi:
Vout = Vcc - Vgs2 = Vcc - 0 = Vcc
Applicando quindi in ingresso un potenziale Vin=0 (livello logico basso), otteniamo in uscita un potenziale Vout=+Vcc (livello logico alto).
Portiamo ora l'ingresso a potenziale Vin=+Vcc; ciò equivale ad applicare in ingresso un livello logico 1. T1 passa sicuramente in conduzione trascinando in conduzione anche T2; la caduta di tensione si ripartisce tra T1 e T2, per cui possiamo scrivere:
Vcc = Vds1 + Vds2 = Vout + Vds2
Da questa relazione si ricava:
Vout = Vcc - Vds2
Siccome T2 lavora come carico resistivo, possiamo fare in modo che la sua resistenza interna sia talmente alta da "erodere" quasi tutta la +Vcc; in questo modo si ottiene:
Vout = Vcc - Vds2 = Vcc - Vcc = 0
Applicando quindi in ingresso un potenziale Vin=+Vcc (livello logico alto), otteniamo in uscita un potenziale Vout=0 (livello logico basso). In definitiva possiamo dire che il circuito di Figura 25 rappresenta una porta NOT in tecnologia NMOS.

Partendo dalla porta NOT è possibile costruire facilmente una porta NAND che, come già sappiamo, può essere utilizzata per ottenere qualsiasi altra porta logica; la Figura 5.26 mostra proprio una porta NAND in tecnologia NMOS: Supponiamo che almeno un ingresso (ad esempio, A) sia a livello logico basso (Va=0 e Vb=+Vcc); in questo caso T2 è in interdizione e impedisce di condurre anche a T1 (che è in serie a T2). In base a quanto abbiamo visto prima in relazione alla porta NOT, l'uscita si porterà a potenziale +Vcc; possiamo dire quindi che se almeno un ingresso è a livello logico basso, l'uscita sarà a livello logico alto.
Supponiamo ora che entrambi gli ingressi siano a livello logico alto (Va=+Vcc e Vb=+Vcc); in questo caso T1 e T2 sono entrambi in conduzione. In base a quanto abbiamo visto prima in relazione alla porta NOT, l'uscita si porterà a potenziale 0; possiamo dire quindi che se tutti gli ingressi sono a livello logico alto, l'uscita sarà a livello logico basso. Abbiamo appurato quindi che il circuito di Figura 5.26 rappresenta una porta NAND in tecnologia NMOS.

I transistor NMOS e PMOS presentano una serie di vantaggi veramente notevoli; oltre alla piccolissima potenza dissipata, bisogna considerare anche una elevatissima possibilità di miniaturizzazione e un tempo di propagazione molto basso (tra 10 e 20 nanosecondi). Purtroppo però questi transistor presentano anche un difetto abbastanza serio; tale difetto è dato dal fatto che il tempo necessario per la commutazione da OFF a ON (fronte di salita) è notevolmente differente dal tempo necessario per la commutazione da ON a OFF (fronte di discesa).
Per risolvere questo problema si parte dal fatto che, come abbiamo visto prima, un NMOS ha un comportamento opposto (o per meglio dire, complementare) rispetto ad un PMOS; la soluzione consiste allora nell'utilizzare una coppia di MOS formata da un NMOS e da un PMOS. In questo modo, il comportamento del NMOS viene compensato dal comportamento del PMOS e viceversa; la nuova famiglia logica così ottenuta viene chiamata CMOS (Complementary MOS).

Analizziamo in Figura 5.27 una porta NOT realizzata in tecnologia CMOS. Osserviamo subito che portando l'ingresso Vin a livello logico alto (+Vcc), T1 (NMOS) si porta in conduzione, mentre T2 (PMOS) si porta in interdizione; siccome però i due MOS sono in serie, T2 costringerà anche T1 all'interdizione e tra i due transistor circolerà quindi una corrente nulla. Consideriamo ora le curve caratteristiche di Figura 5.21, dove per i MOS bisogna sostituire Vce con Vds, Ic con Ids e le curve Ib con le curve Vgs; da queste curve si può notare che per Ids1=0 (Ic=0) si ottiene Vds1=0 (Vce=0) e quindi possiamo scrivere:
Vout = Vds1 = 0
Possiamo dire quindi che se l'ingresso Vin è a livello logico alto, l'uscita Vout sarà a livello logico basso.
Portando ora l'ingresso Vin a livello logico basso (0), T1 si porta in interdizione, mentre T2 si porta in conduzione; in questo caso è T1 che costringe anche T2 all'interdizione e tra i due transistor circolerà quindi una corrente nulla. Possiamo scrivere allora:
Vout = Vcc - Vds2
In analogia con il caso precedente, possiamo dire che per Ids2=0 si ottiene Vds2=0; di conseguenza possiamo scrivere:
Vout = Vcc - Vds2 = Vcc - 0 = Vcc
Possiamo dire quindi che se l'ingresso Vin è a livello logico basso, l'uscita Vout sarà a livello logico alto; a questo punto abbiamo appurato che il circuito di Figura 5.27 rappresenta una porta NOT in tecnologia CMOS.

Partendo dalla porta NOT è possibile costruire facilmente una porta NAND che può essere utilizzata per ottenere qualsiasi altra porta logica; la Figura 5.28 mostra proprio una porta NAND in tecnologia CMOS. Supponiamo che almeno uno dei due ingressi (ad esempio, A) sia a livello logico basso (Va=0 e Vb=+Vcc); in questo caso T2 è in interdizione e impedisce di condurre anche a T1 (che è in serie a T2). Dalla Figura 5.28 si rileva che il PMOS T4 ha il gate a livello logico basso, per cui è in conduzione, mentre il PMOS T3 ha il gate a livello logico alto, per cui è interdizione; l'interdizione di T1 e T2 costringe all'interdizione anche T4, portando Vds3 e Vds4 a zero. Possiamo scrivere quindi:
Vout = Vcc - Vds3 = Vcc - Vds4 = Vcc - 0 = Vcc
Possiamo dire quindi che se almeno un ingresso è a livello logico basso, l'uscita sarà a livello logico alto.
Supponiamo ora che entrambi gli ingressi siano a livello logico alto (Va=+Vcc e Vb=+Vcc); in questo caso T1 e T2 sono entrambi in conduzione. Dalla Figura 5.28 si rileva che il PMOS T3 e il PMOS T4 hanno entrambi il gate a livello logico alto, per cui sono in interdizione; T1 e T2 essendo in conduzione cortocircuitano a massa il potenziale Vout per cui si ottiene:
Vout = 0
Possiamo dire quindi che se entrambi gli ingressi sono a livello logico alto, l'uscita sarà a livello logico basso; abbiamo appurato così che il circuito di Figura 5.28 rappresenta una porta NAND in tecnologia CMOS.

La presenza nelle porte CMOS di un maggior numero di transistor rispetto alle porte NMOS e PMOS, aumenta i tempi di propagazione che possono ammontare a diverse decine di nanosecondi; si può dire che questo è l'unico vero difetto delle porte CMOS. Per ovviare a questo problema, anche per le porte CMOS viene realizzata una apposita serie High Speed che permette di raggiungere tempi di propagazione pari a quelli delle porte TTL; queste considerazioni unite a ciò che è stato detto in precedenza, giustificano il fatto che la tecnologia CMOS è quella su cui sta puntando maggiormente l'industria dell'hardware.