Assembly Base con NASM
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.