Sei sulla pagina 1di 52

Appunti di Laboratorio 3

Disclaimer
Questi appunti si basano sul corso tenuto durante l’A.A. 2016-2017 dalla Professoressa Giuliano Fiorillo, e
sono stato scritti dal sottoscritto con l’aiuto, il confronto e la pazienza di tanti colleghi, che ringrazio sempre
di tutto cuore. Tali materiali sono accessibili da chiunque ne abbia bisogno e la loro diffusione dev’essere
mantenuta sempre libera e gratuita.

Inoltre, essendo frutto del lavoro di uno studente, questi appunti non sono esenti da errori e refusi, la cui
segnalazione è sempre incentivata e ben accetta.

Emanuele Di Maio

1
Parte 3: Elettronica digitale
Introduzione
I sistemi digitali
Un sistema digitale è un sistema elettronico che opera in maniera binaria, cioè utilizzando dispositivi che
hanno solamente due possibili stati di funzionamento. Questi due stati vengono denominati in più modi: i
più comuni sono stato 1 e stato 0, stato alto o stato basso, o vero o falso.
In passato abbiamo già avuto modo di affrontare diversi tipi di dispositivo in grado di attraversare due stati
di funzionamento, come i transistor BJT o gli amplificatori operazionali. Gran parte dei nostri circuiti
sfrutteranno questi primi o dei diodi, in numerose applicazioni che vedremo in dettaglio.
A pagina 37 della parte 1 abbiamo osservato come un transistor potesse funzionare, in seguito al passaggio
repentino da zona di interdizione a zona di saturazione (con un breve transiente di passaggio per la zona
attiva) come un interruttore: ad esso possiamo perciò associare uno stato di “corrente passa” (circuito
chiuso) o “corrente non passa” (circuito aperto). D’altra parte, un transistor passa in interdizione o
saturazione a seconda della tensione in uscita ed in entrata: come ricordiamo dalla nostra trattazione di
pagina 38, in un common emitter, basse tensioni (𝑉"# ∼ 0,3𝑉) lo portano in saturazione, mentre alte
tensioni (𝑉"# ∼ 𝑉(( ) in interdizione; possiamo perciò creare una convenzione che associ uno stato 1 o 0 a
seconda se la tensione è alta (convenzionalmente 6 ± 1𝑉) o bassa (convenzionalmente 0 ± 1𝑉), in maniera
del tutto arbitraria:

- Il sistema che vede lo stato 1 con un’alta tensione e lo stato 0 con una bassa tensione è detto di
logica positiva.
- Il sistema che vede lo stato 0 con un’alta tensione e lo stato 1 con una bassa tensione è detto di
logica negativa.

Osserviamo che non vi sono delle tensioni “fisse” che determinano lo stato 1 o 0 di un transistor, ma vi è un
certo “range” di valori possibili: la qual cosa è comprensibile, in quanto la 𝑉"# di saturazione varia a
seconda del modello di transistor, al variare della temperatura, tende ad essere soggetta a disturbi da parte
dell’alimentazione, etc.

In logica positiva, perciò, 𝑉, ∼ 5𝑉 e 𝑉. ∼ 0𝑉, mentre, in logica negativa, 𝑉, ∼ 0𝑉 e 𝑉. ∼ 5𝑉.

Algebra booleana
L’algebra booleana è un sistema matematico per l’analisi di stati logici, le cui variabili possono assumere
solo i valori 𝟏 e 𝟎. Su di essa sono definite particolari operazioni, che prendono il nome di funzioni o
operatori logici. Esse sono:

- La funzione AND, identificabile con un prodotto, che verrà espressa con il segno “⋅”;
- La funzione OR, identificabile con una somma, che verrà espressa con il segno “+”;

2
- La funzione NOT, identificabile come una sorta di “complemento”, che verrà espressa con una
barra “ 2 ”.

I circuiti usati per la realizzazione di funzioni logiche saranno dette porte logiche (gate). Come vedremo, la
combinazione di questi tre operatori ci permetterà di ottenere tutte le funzioni necessarie per i nostri
circuiti.

Le porte logiche
La porta OR
La porta OR ha due o più ingressi ed una sola uscita, e, in un circuito, è identificata dal seguente simbolo
circuitale:

La funzione è definita nel seguente modo: essa associa, ad 𝑛 valori 𝐴, 𝐵, 𝐶 … 𝑁 in entrata, lo stato 𝑌 = 1 se
uno o più valori in entrata è allo stato 1. Una porta OR dunque restituisce il valore 0 soltanto nel caso in cui
tutti i valori in entrata sono 0. Un modo per schematizzare i risultati di questa funzione, per due variabili in
entrata 𝐴, 𝐵, è attraverso la seguente tabella:

A B Y

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 1

Osserviamo valgano le seguenti proprietà:

𝐴 + 𝐵 + 𝐶 = (𝐴 + 𝐵) + 𝐶 = 𝐴 + (𝐵 + 𝐶 ) (𝑝𝑟𝑜𝑝𝑟𝑖𝑒𝑡à 𝑎𝑠𝑠𝑜𝑐𝑖𝑎𝑡𝑖𝑣𝑎)
𝐴 + 𝐵 = 𝐵 + 𝐴 (𝑝𝑟𝑜𝑝𝑟𝑖𝑒𝑡à 𝑐𝑜𝑚𝑚𝑢𝑡𝑎𝑡𝑖𝑣𝑎)
𝐴 + 1 = 1 𝐴 + 𝐴 = 𝐴 𝐴 + 0 = 𝐴 (𝑒𝑠𝑖𝑠𝑡𝑒𝑛𝑧𝑎 𝑑𝑒𝑙𝑙 O 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜 𝑛𝑒𝑢𝑡𝑟𝑜 0)
Vediamo come costruire un simile elemento circuitale attraverso l’uso dei diodi: ci porremo in logica
positiva, dove 1 → 𝑉, ∼ 5𝑉 e 0 → 𝑉. ∼ 0𝑉, sfruttando il seguente circuito:

3
Come osserviamo, il circuito atto alla realizzazione di una porta OR è caratterizzato da 𝑛 diodi per ciascuna
entrata 𝐴, 𝐵 …, collegati ad un ramo che presenti ad un’estremità una resistenza 𝑅, posta a tensione 𝑉. =
0𝑉 (e dunque allo stato logico 0), e all’altra estremità l’uscita 𝑌.
Se uno o più ingressi presenta una tensione in entrata𝑉, = 5𝑉 (e dunque allo stato logico 1), tra 𝑌 e
l’ingresso si crea una differenza di potenziale di circa 5 𝑉, che quindi permette il passaggio di corrente; in
questa situazione, la tensione in uscita al terminale 𝑌 sarà:

𝑉R = 𝑉, − 𝑉T − 𝑉. = 𝑉, − 𝑉T ∼ 𝑉,

Dove nell’ultimo passaggio abbiamo supposto trascurabile la tensione di ginocchio del diodo rispetto allo
stato alto. Complessivamente, quindi, la tensione in uscita è poco più piccola di 𝑉, , che corrisponde ad uno
stato 1.

Viceversa, se tutte le entrate presentano una tensione in entrata quasi nulla 𝑉. , tra 𝑌 e le entrate si crea
una differenza di potenziale pari a:

𝑉R = 𝑉. − 𝑉T − 𝑉. = −𝑉T ∼ 0

Abbiamo quindi ottenuto un circuito che restituisce uno stato 1 quando vi è almeno un segnale in entrata
allo stato 1, mentre restituisce lo stato 0 se tutti i segnali in entrata sono allo stato 0, che è proprio il
funzionamento di una porta logica OR.

Per ottenere una porta OR in logica negativa, basterà invertire le direzione dei diodi del circuito precedente
e sostituire il generatore 𝑉. = 0 con 𝑉. = 5 𝑉: in questo modo, si invertono le condizioni in cui i diodi
lasciano passare corrente, e dunque si invertono le tensioni per cui il gate restituisce un 1 o uno 0.
Volendo rappresentare in tabella le entrate (ad esempio, di tre porte 𝐴, 𝐵 e 𝐶) di una porta OR in logica
positiva e negativa, otterremmo quindi due griglie complementari:

OR in logica positiva OR in logica negativa

A B C Y A B C Y

0 0 0 0 1 1 1 1

0 0 1 1 1 1 0 0

0 1 0 1 1 0 1 0

1 0 0 1 0 1 1 0

0 1 1 1 1 0 0 0

1 1 0 1 0 0 1 0

1 0 1 1 0 1 0 0

1 1 1 1 0 0 0 0

4
La porta AND
Identificata col seguente simbolo circuitale, anche la porta AND presenta due o più ingressi e una sola
uscita:

Una porta AND è definita nel seguente modo: essa associa, ad 𝑛 valori 𝐴, 𝐵, 𝐶 … 𝑁 in entrata, lo stato 𝑌 = 1
se e solo se tutti i valori in entrata sono allo stato 1: l’uscita presenta quindi il valore 0 anche se è presente
soltanto uno 0 in entrata.

A B Y

0 ⋅ 0 = 0

0 ⋅ 1 = 0

1 ⋅ 0 = 0

1 ⋅ 1 = 1

Valgono le seguenti proprietà di facile verifica:

𝐴 ⋅ 𝐵 ⋅ 𝐶 = (𝐴 ⋅ 𝐵) ⋅ 𝐶 = 𝐴 ⋅ (𝐵 ⋅ 𝐶 ) (𝑝𝑟𝑜𝑝𝑟𝑖𝑒𝑡à 𝑎𝑠𝑠𝑜𝑐𝑖𝑎𝑡𝑖𝑣𝑎)
𝐴 ⋅ 𝐵 = 𝐵 ⋅ 𝐴 (𝑝𝑟𝑜𝑝𝑟𝑖𝑒𝑡à 𝑐𝑜𝑚𝑚𝑢𝑡𝑎𝑡𝑖𝑣𝑎)

𝐴 ⋅ 0 = 0 𝐴 ⋅ 𝐴 = 𝐴 𝐴 ⋅ 1 = 𝐴 (𝑒𝑠𝑖𝑠𝑡𝑒𝑛𝑧𝑎 𝑑𝑒𝑙𝑙 O 𝑒𝑙𝑒𝑚𝑒𝑛𝑡𝑜 𝑛𝑒𝑢𝑡𝑟𝑜 1)


𝐴 ⋅ (𝐵 + 𝐶 ) = 𝐴 ⋅ 𝐵 + 𝐴 ⋅ 𝐶 (𝑑𝑖𝑠𝑡𝑟𝑖𝑏𝑢𝑡𝑖𝑣𝑖𝑡à 𝑟𝑖𝑠𝑝𝑒𝑡𝑡𝑜 𝑎𝑙𝑙𝑎 𝑠𝑜𝑚𝑚𝑎)
𝐴+𝐴⋅𝐵 = 𝐴
(𝐴 + 𝐵) ⋅ (𝐴 + 𝐶 ) = 𝐴 + 𝐵 ⋅ 𝐶

La realizzazione di una porta AND, in logica positiva, è resa possibile grazie alla seguente combinazione di 𝑛
diodi alle 𝑛 entrate 𝐴, 𝐵, … della porta logica.

Come possiamo osservare, le 𝑛 entrate sono collegate ad una resistenza 𝑅, dov’è applicata una tensione
𝑉(( = 𝑉, = 5𝑉.
Per come è costruito il circuito, se una o più delle entrate 𝐴, 𝐵, 𝐶, è a 𝑉. = 0, tra l’uscita 𝑌 e una delle

5
entrate si crea una differenza di potenziale pari a 5 𝑉, che supera la tensione di ginocchio del diodo e
permette il passaggio di corrente. Detta 𝑅V la resistenza del diodo(generalmente trascurabile rispetto alla
resistenza 𝑅), la corrente che si genera è pari a:
𝑉(( − 𝑉T − 𝑉. 𝑉(( − 𝑉T
𝐼= ∼
𝑅 + 𝑅V 𝑅
D’altra parte, la tensione che si instaura all’uscita 𝑌 è pari a 𝑉(( − 𝐼𝑅 (essendo 𝑉(( poi collegata a massa),
perciò:

𝑉R = 𝑉(( − 𝐼𝑅 = 𝑉(( − X𝑉(( − 𝑉T Y = 𝑉T ∼ 0

Perciò, se anche una delle entrate assume il valore 𝑉. = 0, l’uscita 𝑉R assume il valore 0.
Se però tutte le entrate fossero a tensione 𝑉, = 5𝑉, tra l’uscita 𝑌 e ciascuna delle entrate si creerebbe una
differenza di potenziale nulla, che non supera la tensione di ginocchio del diodo e non permette il passaggio
di corrente. In questa situazione dunque 𝐼 = 0, e perciò 𝑉R = 𝑉(( = 𝑉, , cioè un segnale alto.
Il circuito così costruito restituisce un 1 soltanto quando tutti i segnali in entrata sono alti, che è proprio il
funzionamento di una porta AND.

Come nel caso precedente, da questa porta in logica positiva possiamo ottenere una porta in logica
negativa semplicemente invertendo la direzione dei diodi e ponendo 𝑉, = 0.
Mettendo a confronto le due porte considerando, per esempio, tre entrate, otteniamo le seguenti tabelle:

AND in logica positiva AND in logica negativa

A B C Y A B C Y

0 0 0 0 1 1 1 1

0 0 1 0 1 1 0 1

0 1 0 0 1 0 1 1

1 0 0 0 0 1 1 1

0 1 1 0 1 0 0 1

1 1 0 0 0 0 1 1

1 0 1 0 0 1 0 1

1 1 1 1 0 0 0 0

Confronto tra AND e OR e problematiche sperimentali


Dal confronto delle tabelle a pagina 5 e 3 vediamo come, in logica negativa, la porta AND si comporti come
una porta OR in logica positiva e viceversa. Anziché utilizzare due diversi tipi di porta logica, cioè le porte
AND ed OR, si mostra quindi più semplice utilizzare un’unica porta, che indicheremo con AND/OR, di cui
cambiarne ogni volta la logica a seconda della funzione desiderata.

L’utilizzo delle porte AND/OR in strutture “a cascata” crea problematiche sperimentali non indifferenti.
Nelle formule precedenti è sempre apparso, nelle tensioni in uscita, il fattore 𝑉T della tensione di ginocchio
dei diodi: questi è stato considerato, nella nostra trattazione, trascurabile, in quanto in generale non in
grado di alterare le tensioni 𝑉. o 𝑉, così tanto da far passare un segnale alto ad uno basso e viceversa. Se
però le porte logiche vengono collegate in serie, si avrà, in ogni passaggio, un fattore 𝑉T che si aggiunge o si

6
sottrae alla tensione 𝑉R , rischiando di far uscire il circuito dalla regione di tolleranza che determina un
segnale alto o basso. Ad esempio, consideriamo il seguente circuito in logica positiva, che vede un OR
seguito da un AND:

Se il primo circuito porta in uscita 𝑉Z un fattore 𝑉T , il secondo porterà in uscita 𝑉R un fattore 2𝑉T che rischia
di perturbare fortemente il segnale.

Un ulteriore problema sperimentale deriva dalla presenza di resistenze “pilota” all’interno di ciascuna porta
logica: maggiore è il numero di resistenze, maggiori saranno le cadute di tensioni di 𝑉(( , che tenderà a
distribuirsi secondo un partitore di tensione. Questo abbassa la tensione ai capi di ciascun diodo, con il
rischio di non superare la tensione di ginocchio ed impedire il corretto funzionamento della porta logica.

La porta NOT
La porta NOT è indicata attraverso il seguente simbolo circuitale:

Esso ha un solo ingresso e una sola uscita, ed esegue l’operazione di negazione logica, definita nel seguente
modo: l’uscita di un circuito NOT assume lo stato 1 se e solo se l’ingresso non assume lo stato 1. In altre
parole, il NOT trasforma uno 0 in entrata in un 1 in uscita e viceversa.
In generale, il simbolo del “pallino” alla fine di una porta logica indica l’inversione del segnale.

Valgono le seguenti proprietà di facile determinazione:

𝐴̅ = 𝐴

𝐴̅ + 𝐴 = 1

𝐴̅ ⋅ 𝐴 = 0

𝐴 + 𝐴̅ ⋅ 𝐵 = 𝐴 + 𝐵
Quest’ultima proprietà discende dalle seguenti uguaglianze:

𝐴 + 𝐴̅ ⋅ 𝐵 = 𝐴 ⋅ (𝐵 + 1) + 𝐴̅ ⋅ 𝐵 = 𝐴 ⋅ 𝐵 + 𝐴 + 𝐴̅ ⋅ 𝐵 = (𝐴 + 𝐴̅) ⋅ 𝐵 + 𝐴 = 𝐵 + 𝐴 = 𝐴 + 𝐵
Il circuito atto alla realizzazione di un NOT utilizza un transistor, come nel disegno sottostante:

7
Le resistenze vengono scelte in modo che, per una tensione in ingresso bassa (𝑉] = 𝑉. = 0), il transistor sia
interdetto: in questa situazione il circuito si apre impedendo il passaggio di corrente, in modo che la
tensione in uscita sia quella del generatore 𝑉R = 𝑉(( = 𝑉, : perciò, ad un segnale 0, viene associato in uscita
un segnale 1. Viceversa, per un’alta tensione in entrata 𝑉] = 𝑉, il transistor entra in saturazione, si
comporta come un circuito chiuso e il ramo in uscita risulta collegato a massa, restituendo dunque 𝑉R = 0:
in questo modo, un segnale 1 restituisce in uscita un segnale 0.

Teoremi di De Morgan
Introdotte le operazioni di AND, OR e NOT, valgono le seguenti proprietà, che prendono il nome di leggi o
teoremi di De Morgan:
^^^^^^^^^^^^^^^^^^^
𝐴 ⋅ 𝐵 ⋅ 𝐶 ⋅ … ⋅ 𝑁 = 𝐴̅ + 𝐵^ + ⋯ + 𝑁
2

^^^^^^^^^^^^^^^^^^^^
𝐴 + 𝐵 + ⋯ + 𝑁 = 𝐴̅ ⋅ 𝐵^ ⋅ … ⋅ 𝑁
2

Dai risultati del teorema, osserviamo che:

- La negazione di un AND restituisce lo stesso risultato di un OR le cui variabili in ingresso sono tutte
negate;
- La negazione di un OR restituisce lo stesso risultato di un AND le cui variabili in ingresso sono tutte
negate.

Le leggi di De Morgan possono essere verificate dal confronto diretto con le tabelle di verità. Ad esempio,
nel caso di due sole variabili, otteniamo:

𝑨 𝑩 𝑨+𝑩 ^^^^^^^^
𝑨+𝑩 2
𝑨 2
𝑩 2⋅𝑩
𝑨 2

0 1 1 0 1 0 0

1 0 1 0 0 1 0

0 0 0 1 1 1 1

1 1 1 0 0 0 0

Come possiamo notare, vale appunto 𝐴̅ ⋅ 𝐵^ = ^^^^^^^^


𝐴 + 𝐵.

Dalle leggi di De Morgan ricaviamo inoltre le seguenti relazioni:


^^^^^^^^
𝐴̅ + 𝐵^ = 𝐴̅ ⋅ 𝐵^ = 𝐴 ⋅ 𝐵

8
^^^^^^
𝐴̅ ⋅ 𝐵^ = 𝐴̅ + 𝐵^ = 𝐴 + 𝐵
Le due equazioni, generalizzate ad 𝑁 entrate, mostrano come:

- negando 𝑛 variabili in entrata di un circuito OR, e rinegando il risultato in uscita, si ottiene un


circuito AND;
- negando 𝑛 variabili in entrata di un circuito AND, e rinegando il risultato in uscita, si ottiene un
circuito OR.

Perciò, in un circuito digitale, da un circuito AND e un NOT può essere ottenuto un OR, o, alternativamente,
da un circuito OR e un NOT può essere ricavato un AND: non è dunque necessario utilizzare tutti e tre i
circuiti di base, ma solo un OR e un NOT, o un AND e un NOT.

La porta NOR
La funzione ottenuta dalla negazione di un OR è detta funzione NOR:

𝑌 = ^^^^^^^^^^^^^^^^^^^^^^^^^
𝐴 +𝐵 +𝐶 +⋯+𝑁
…ed è indicata col seguente simbolo circuitale, che descrive appunto un OR negato in uscita:

Dalla seguente tabella delle verità possiamo vedere un semplice esempio a due entrate:

A B Y

0 0 1

0 1 0

1 0 0

1 1 0

La porta XOR
Definiamo la funzione XOR, o OR esclusivo, la funzione che associa, ad 𝑛 valori 𝐴, 𝐵, 𝐶 … 𝑁 in entrata, lo
stato 𝑌 = 1 se e solo se il numero di entrate allo stato 1 è dispari. Verrà definito con il seguente simbolo:

𝑌 =𝐴⊕𝐵
9
…e con il seguente simbolo circuitale:

Nel caso di due entrate, il funzionamento della porta può essere riassunto dalla seguente tabella della
verità:

A B Y

0 0 0

0 1 1

1 0 1

1 1 0

Come si può verificare, il valore di 𝑌 può quindi essere ottenuto nelle seguenti maniere equivalenti:
( )(^^^^^^)
⎧ 𝐴+𝐵 𝐴⋅𝐵
⎪(𝐴 ⋅ 𝐵^ ) + (𝐵 ⋅ 𝐴̅)
𝑌 =𝐴⊕𝐵 = ^^^^^^^^^^^^^^^^
⎨ X𝐴 ⋅ 𝐵 + 𝐴̅ ⋅ 𝐵^Y

⎩ (𝐴 + 𝐵)(𝐴̅ + 𝐵^ )
Da un punto di vista strutturale, le porte XOR possono perciò essere ottenute a partire dalle porte AND,
NOT e OR nei seguenti modi equivalenti:

Etc.

10
La porta NAND
Una porta NAND o AND negato è una porta AND con una negazione del segnale in uscita:

𝑌 = ^^^^^^
𝐴⋅𝐵
Ed è espressa quindi dal seguente simbolo circuitale:

La porta NAND costituisce una vera e propria porta universale, poiché:

1) Con un NAND è possibile costruire un NOT: se si pone all’ingresso di un NAND un cortocircuito che
che unisca i due segnali in ingresso 𝐴 e 𝐵 in un unico segnale 𝐴, il NAND restituisce 0 o 1 a seconda
se 𝐴 sia 1 o 0 (poiché ^^^^^^
0 ⋅ 0=1, e ^^^^^^
1 ⋅ 1=0). Alternativamente, si può porre una delle due entrate ad
una tensione di riferimento 𝑉(( = 5𝑉, in modo che la tensione in entrata 𝐵 venga sempre operata
con lo stato 1, restituendo appunto uno 0 per 𝐵 = 1 e un 1 per 𝐵 = 0 (poiché ^^^^^^
1 ⋅ 1 = 0 e ^^^^^^
1⋅0=
1).

2) Con un NAND è possibile costruire un AND: basta aggiungere un ulteriore NOT (che, come abbiamo
visto prima, si può sempre costruire a partire da un NAND) in uscita:

Poiché un NAND può costruire un NOT e un AND, allora può anche costruire un OR grazie al teorema di De
Morgan, e uno XOR per quanto visto nel paragrafo precedente.

La costruzione fisica di una porta NAND può essere realizzata nei seguenti modi:

- La porta NAND in DTL (diode-transistor logic)


In un regime di logica positiva, un NAND può essere realizzato mettendo in serie un AND e un NOT,
e dunque dei diodi in parallelo ed un transistor, come visto nelle trattazioni di pagina 4 e 6. Questo
tipo di struttura prende il nome di DTL, cioè logica diodo-transistor (diode-transistor logic).

11
…dove la resistenza 𝑅h è utilizzata per fissare la corrente 𝐼i in base alle resistenze 𝑅 ed 𝑅h e la
tensione 𝑉(( .
Generalmente è posta anche una capacità in parallelo alla resistenza 𝑅, , per accelerare il passaggio
da saturazione ad interdizione, in quanto aiuta a rimuovere i portatori di carica minoritaria della
base nel periodo di storage.
Sebbene il circuito di sopra agisca come un NAND, non è questa l’architettura generalmente
utilizzata nei moderni circuiti. In generale, infatti, si preferisce sostituire le resistenze e le capacità
più grandi con transistor e diodi, industrialmente ed economicamente più semplici da realizzare.
In questa ottica, una versione alternativa del NAND precedente è il seguente:

Osserviamo che il funzionamento di questo nuovo circuito è equivalente al precedente: nell’ipotesi


in cui vi è anche una sola entrata a bassa tensione, il diodo corrispondente inizia a condurre la
tensione generata da 𝑉(( , e, in base a quanto imparato a pagina 5, la tensione che si sviluppa alla
base del diodo 𝐷, è 0. In questo modo, tra i diodi e la massa oltre il transistor si sviluppa una
differenza di potenziale nulla, e, consequenzialmente, i due diodi 𝐷, e 𝐷h rimangono interdetti. In
questo modo 𝐼i è zero, che comporta, come imparato nella parte 1, il raggiungimento del regime di
interdizione: il transistor risulta un circuito aperto, in 𝑅" non scorre corrente e all’uscita 𝑌 viene
misurata la tensione di 𝑉(( , dunque un valore alto. Viceversa, se tutte le entrate sono ad alta
tensione, alla base del diodo 𝐷, si sviluppa una tensione 𝑉(( − 𝑉T ∼ 5𝑉: essendo questa superiore
alla tensione di ginocchio complessiva dei diodo (2𝑉T ∼ 1.4𝑉), si sviluppa alla base una corrente 𝐼i
pari a…

12
𝑉(( − 𝑉i# − 2𝑉T 𝑉i#
𝐼i = 𝐼, − 𝐼h = −
𝑅, 𝑅h

…dove abbiamo indicato con 𝐼, la corrente circolante in 𝑅, ed 𝐼h la corrente circolante in 𝑅h .


Imponendo che 𝑉i# sia circa 0,7 𝑉 (affinché la giunzione BE sia polarizzata direttamente) e che 𝑉"#
sia circa pari a 0, cioè richiedendo quelle che abbiamo visto, nella parte 1, essere le condizioni di
saturazione del transistor, possiamo determinare la corrente di saturazione 𝐼imno e 𝐼"mno grazie alle
quali determinare il 𝛽qrs necessario per spingere il transistor in saturazione. In questo modo, se il
circuito è adeguatamente dimensionato, la corrente 𝐼i spinge il transistor in saturazione,
diventando un cortocircuito, che porta l’uscita 𝑌 ad avere la stessa tensione del ramo
dell’emettitore posto a massa, e dunque 𝑉R = 0.
Questo tipo di NAND in DTL presenta tuttavia alcune difficoltà se collegati in serie. Se ponessimo
infatti due NAND uno dopo l’altro, in modo che l’uscita 𝑌 di uno sia collegata all’entrata 𝐴
dell’altro, avremo, all’attivarsi del diodo in 𝐴, l’aggiungersi di una corrente 𝐼] al collettore del NAND
precedente: poiché 𝐼i è fissata, vi è il rischio, all’aumentare di 𝐼" , di uscire dalla zona di
saturazione, causando malfunzionamenti della prima porta NAND. La situazione diventa
ovviamente ancora più insostenibile se vengono poste, in parallelo, altre porte NAND in uscita alla
prima:

Il circuito precedente dunque limita il cosiddetto fan-out, cioè la possibilità di aggiungere “a


ventaglio” un numero elevato di circuiti in parallelo di uscita.
Per aumentare il fan-out di una porta NAND si sostituisce il diodo 𝐷, con un transistor, nella
seguente configurazione:

13
Indichiamo con 𝑄, il transistor a sinistra, mentre con 𝑄h il transistor a destra. Il circuito viene
dimensionato in modo che il transistor 𝑄, si trovi in regione attiva: in questo modo, la sua corrente
di emettitore 𝐼"u risulta pari a 𝛽𝐼i , , che può essere relativamente elevata, considerando che 𝛽 è
dell’ordine del centinaio. Poiché 𝐼"u costituisce parte della corrente di base 𝐼iv del transistor 𝑄h , ci
aspettiamo che anch’essa sia grande. D’altra parte, in saturazione, il transistor 𝑄h sta funzionando
da circuito chiuso, dunque la corrente 𝐼iv è circa la stessa circolante nel nodo dell’uscita 𝑌:
quest’ultima, essendo generalmente elevata, fa sì che i contributi provenienti da eventuali circuiti
posti in serie al NAND siano trascurabili, evitando correzioni dovuti a termini parassitari.

- La porta NAND in TTL (transistor-transistor logic)


La porta NAND più rapida è la porta TTL, cioè in logica transistor-transistor. Essa presenta, alle 𝑁
entrate, un transistor ad emettitore multiplo di facile realizzazione industriale, come si può
osservare in figura: in questo modo, i diodi di entrata vengono ridotti ad un unico elemento
circuitale di dimensioni e costi di produzione più contenuti.

Il secondo transistor 𝑄h svolge la funzione del diodo 𝐷, della prima configurazione analizzata per la
porta NAND DTL (o il transistor della configurazione modificata per aumentare il fan-out), mentre
l’ultimo transistor 𝑄w svolge la funzione adibita alla porta NOT.
Il funzionamento di base di un TTL è analogo a quello del DDL: iniziamo supponendo che almeno
uno degli ingressi sia a bassa tensione, ad esempio l’ingresso 𝐴, in modo che uno degli emettitori
del transistor 𝑄, sia polarizzato direttamente ed inizi a condurre corrente. Conseguentemente, ci
aspettiamo che 𝑉i# , ∼ 0.7 𝑉. Se quindi volessimo calcolare la tensione 𝑉x nel punto 𝑃, avremmo:

𝑉x = 𝑉i# + 𝑉] ∼ 0.7

𝑉x raggiunge dunque al massimo 0.7 ÷ 1 𝑉 (considerando tensioni parassite, variazioni di


temperatura, etc.). D’altra parte, osservando il circuito, vale anche:

𝑉x = 𝑉i" , + 𝑉i#v + 𝑉i# w

Da qui osserviamo che 𝑉i# h e 𝑉i# w devono essere necessariamente interdetti: se fossero in
saturazione, infatti, varrebbe:

14
𝑉x = 𝑉i" , + 𝑉i#v mno + 𝑉i# wmno ∼ 0.7 + 0.7 + 0.7 ∼ 2.1

Ma 𝑉x ∼ 0.7, dunque non è sufficientemente alto a portare i transistor 𝑄h e 𝑄w in saturazione;


come conseguenza, 𝑄h e 𝑄w sono interdetti, in 𝑄w non passa corrente e 𝑌 si trova all’alta tensione
di 𝑉(( .
Se invece tutti gli ingressi sono ad alta tensione, non passa più corrente tra base e gli emettitori di
𝑄, : la corrente proveniente da 𝑃 deve perciò scaricarsi sul collettore, portando il transistor 𝑄, in
una polarizzazione attiva inversa. La corrente proveniente dal collettore di 𝑄, è generalmente
abbastanza elevata da portare in saturazione 𝑄h e 𝑄w : 𝑄w dunque si trasforma in un circuito chiuso,
portando l’uscita 𝑌 a terra.
In questo modo otteniamo il classico funzionamento di una porta NAND. Vi è però un’ulteriore
problematica sperimentale da affrontare: in genere, quando le porte NAND sono collegate tra loro
in fan-out elevato, iniziano a diventare non trascurabili gli effetti capacitivi dei diodi posti tra
un’uscita e un’entrata di due NAND. Questi effetti possono essere schematizzati come nel disegno
da una capacità parassita:

La capacità 𝐶, con i suoi tempi di commutazione, può indurre dei ritardi nei tempi di passaggio da
saturazione ad interdizione del transistor 𝑄w in seguito a variazioni di tensione alle entrate, e
dunque dei malfunzionamenti della porta NOT. Un modo per rendere piccoli questi tempi di
commutazione sarebbe diminuire 𝑅" in modo da avere un tempo caratteristico 𝑅" 𝐶 molto più
piccolo dei tempi di trasmissione del segnale, ma questo comporterebbe un aumento della
corrente nel ramo 𝑅" e conseguentemente maggiori fenomeni di dissipazione e surriscaldamento.
La soluzione più comunque consiste perciò nell’utilizzo di un totem pole, che trova un giusto
compromesso tra alta dissipazione e piccoli tempi di commutazione.

- Porta NAND a totem pole


Nella porta NAND a totem pole, la resistenza 𝑅" viene sostituita con un ulteriore transistor 𝑄{ in
serie ad un diodo:

15
In questo modo si crea una struttura a due transistor uno sopra l’altro (“a totem”, appunto); la
resistenza 𝑅" è scelta piccola (100Ω), ma non eccessivamente da creare grandi effetti di
dissipazione.
Si immagini di avere inizialmente il transistor 𝑄w (e dunque 𝑄h , in base a quanto visto nel paragrafo
precedente) in saturazione. La tensione 𝑉i { , alla base del transistor 𝑄{ , sarà:

𝑉i} = 𝑉"#mno v + 𝑉i#mno~

Sia 𝑉"#mnov che 𝑉i#mno~ assumono valori piccoli, poiché i transistor sono in saturazione:
conseguentemente 𝑉i} non è sufficientemente alta per portare 𝑄{ in saturazione. Viceversa, come
si può mostrare, quando 𝑄h e 𝑄w sono in interdizione 𝑄{ entra in saturazione. Nel passaggio da
interdizione a saturazione di 𝑄w , perciò, 𝑄{ entra in interdizione, impedendo il passaggio di cariche
verso 𝐶 che determinano i tempi di commutazione. D’altra parte si avrebbe un processo di carica
nel passaggio da saturazione ad interdizione di 𝑄w , in quanto 𝑄{ , in saturazione, si comporta come
un circuito aperto: la sua resistenza è tuttavia generalmente piccola (insieme ad 𝑅" ), dunque i
tempi di commutazione sono molto brevi. Si pensi che, per una porta TTL, si ha un tempo di
risposta dell’ordine di 10 𝑛𝑠 (quattro volte più piccola di un DDL).

Logica cablata
Spesso, nella logica di un circuito, avviene il collegato di più uscite di porte logiche: infatti, in generale è
importante avere un circuito con tanti ingressi con più uscite in comune, in modo che l’informazione venga
via via costruita e arricchita. Questo tipo di configurazione viene detta di logica cablata, o wired.

Questo tipo di configurazione si dimostra però talvolta meno performante: la resistenza equivalente al
collettore comune è adesso pari al parallelo tra le due resistenze, che sappiamo essere più piccolo delle
singole 𝑅, ed 𝑅h : al collettore si sviluppa perciò una maggiore corrente, e si ha dunque maggiore
16
dissipazione. Per questo, in molti circuiti a logica cablata si preferisce eliminare le resistenze di collettore
quando possibile.

I circuiti integrati
Poiché, anche in sistemi digitali relativamente semplici, le porte fondamentali sono utilizzate in gran
numero, esse non sono disponibili individualmente: di solito, diverse porte sono realizzate su di una sola
piastrina e poste nello stesso contenitore, con massa ed alimentazione 𝑉(( comuni. Circuiti così realizzati
prendono il nome di circuiti integrati.
Ogni pacchetto, o contenitore, prende il nome di chip. Un esempio è quello del dual-in-line-package nella
seguente figura, dove a sinistra è presente la struttura fisica, mentre a destra la sua schematizzazione
circuitale:

Su ogni chip, per motivi industriali, è presente la seguente sigla:

𝐴𝐴 74 𝐴𝐴𝐴 𝑋𝑋𝑋
- Le prime due lettere sono rappresentative della casa produttrice;
- Subito dopo è posto un 74, identificativo del tipo di chip;
- Le tre cifre successive indicano la sottofamiglia del chip;
- Le ultime tre cifre indicano la funzione del circuito.

I circuiti integrati sono realizzati in due diversi tipi di strutture, divise in logica combinatoria e logica
sequenziale.

- In logica combinatoria, l’output di un circuito elabora gli input in maniera quasi istantanea. Circuiti
del genere sono particolari circuiti operazionali, cioè in grado di effettuare operazioni digitali, del
tipo:
Sommatore: un circuito in grado di effettuare la somma di 𝑛 bit in entrata;
Comparatore: un circuito che confronta due bit in entrata e determina quale sia il più
grande (o il più piccolo);
Parity Checker: un circuito che conti quanti bit sono contenuti in una parola;
Display: un circuito che rappresenti i bit in forma decimale su uno schermo luminoso.

- In logica sequenziale, l’output di un circuito al tempo 𝑡 dipende dallo stati degli input ad istanti di
tempo 𝑡 O antecedenti. Questo tipo di logica viene utilizzata per:
Convertire una parola di bits arrivati in tempi differenti in un’unica struttura;
Contare quanti segnali 1 o 0 sono arrivati in una sequenza temporale;
Riconoscere un pattern in una sequenza.

17
Sistemi digitali combinatori
Esempi di circuiti in logica combinatoria
Sommatore
Immaginiamo di voler costruire un circuito che effettui una semplice operazione di somma di due numeri
rappresentati da una parola binaria. Ricordando quanto imparato a pagina 43 della parte 2, una parola
binaria non è altro che una sequenza di 1 e 0, rappresentati i coefficienti dello sviluppo in serie di 2: in
particolar modo, avevamo preso l’esempio…

10011 = 1 ⋅ 2{ + 0 ⋅ 2w + 0 ⋅ 2h + 1 ⋅ 2, + 1 ⋅ 2. = 19
Poiché vogliamo costruire un circuito che sommi due parole binarie, dovremmo sommare ognuno dei bit di
ciascuna parola tra di loro: in maniera analoga a quanto avviene nel caso decimale, un’operazione del
genere segue due semplici fasi:

1) Si sommano due bit corrispondenti al digit 2• ;


2) Al risultato della somma dei bit 2• si aggiunge il riporto del digit 2•‚, .

I singoli bit corrispondenti a ciascuna parola da sommare devono perciò restituire una somma e un riporto;
questo secondo va poi aggiunto al bit successivo, fino alla fine della parola.
Il circuito in grado di sommare due bit di due parole binarie prende il nome di half adder, e viene indicato
dalla seguente scatola nera:

…dove con 𝐴 e 𝐵 abbiamo indicato i bit delle due parole da sommare, con 𝑅 il risultante risultante e con 𝑆
la somma risultante.
Un half-adder può essere realizzato attraverso il seguente circuito:

Cioè uno XOR e un AND, che rispettivamente restituiscono somma e riporto:

𝑆 = 𝐴 ⊕ 𝐵 = 𝐴̅ ⋅ 𝐵 + 𝐴 ⋅ 𝐵^

𝑅 =𝐴⋅𝐵
La seguente tabella delle verità mostra infatti tutte le possibili riposte realizzabili dall’half-adder, che sono
proprio quelle desiderate per l’operazione di somma:

18
𝑨 𝑩 𝑺 = 𝑨⊕𝑩 𝑹=𝑨⋅𝑩

0 0 0 0

0 1 1 0

1 0 1 0

1 1 0 1

In questo modo è possibile sommare tra loro due bit in modo da ottenerne somma e riporto. I bit delle cifre
più significative ricevono tuttavia un eventuale riporto dai bit precedenti, che va sommato a sua volta ai bit
𝑖-esimi. Per riuscirvi, viene utilizzata la seguente struttura, che prende il nome di full-hadder:

In questo modo, infatti, il primo half-adder somma due bit 𝑖-esimi, e il risultato 𝑆†O viene a sua volta
sommato al riporto del bit (𝑖 − 1)-esimo, restituendo 𝑆† ; la somma dei bit 𝑖-esimi può tuttavia avere un
riporto 𝑅†O , che viene confrontato con l’eventuale riporto dalla somma tra 𝑆†O e 𝑅†‚, : se essi sono entrambi
zero, significa che nessuna delle due somme ha dato un riporto, ma se anche solo una delle due somme
presenta 𝑅†O o 𝑅†OO diverso da 0, questo viene riportato in uscita 𝑅† tramite la porta OR. Si osservi che 𝑅†O ed
𝑅†OO non possono mai essere contemporaneamente 1.
In questo modo si ottiene un circuito in grado si sommare due bit in entrata e un terzo bit di riporto,
restituendo, a sua volta, una somma e un riporto.

19
Ponendo 𝑛 full-hadder in parallelo (con un primo full-hadder con 𝑅†‚, = 𝑅‚, a terra per dare un resto
nullo come prima somma in entrata), è possibile sommare le 𝑛 cifre che costituiscono una parola di bit. Ad
esempio, nella seguente figura è disegnato un circuito in grado di sommare quattro bit 𝐴. 𝐴, 𝐴h 𝐴w e
𝐵. 𝐵, 𝐵h 𝐵w di due parole in entrata, restituendo un’unica parola in uscita 𝑆. 𝑆, 𝑆h 𝑆w .

Osserviamo che, per un singolo full-hadder 𝑖-esimo, vale la seguente tabella della verità:

𝑨𝒊 𝑩𝒊 𝑹𝒊‚𝟏 𝑺𝒊 𝑹𝒊

0 0 0 0 0

0 0 1 1 0

0 1 0 1 0

0 1 1 0 1

1 0 0 1 0

1 0 1 0 1

1 1 0 0 1

1 1 1 1 1

A partire dalla tabella si può verificare che l’espressione di 𝑆† ed 𝑅† , in funzione delle variabili in entrata, è la
seguente:

𝑆† = 𝐴̅† 𝐵^† 𝑅†‚, + 𝐴̅ † 𝐵† 𝑅^†‚, + 𝐴† 𝐵^† 𝑅^ †‚, + 𝐴† 𝐵† 𝑅†‚,

𝑅† = 𝐴̅† 𝐵† 𝑅†‚, + 𝐴† 𝐵^† 𝑅†‚, + 𝐴† 𝐵† 𝑅^†‚, + 𝐴† 𝐵† 𝑅†‚,


Dove, per semplicità di notazione, non abbiamo riportato il puntino dell’AND.
Osserviamo sia possibile riscrivere 𝑅† in una forma più compatta: per com’è definita la porta OR, 𝐴 + 𝐴 =
𝐴, dunque 𝐴 + 𝐴 + 𝐴 = 𝐴 + 𝐴 = 𝐴. Il termine 𝐴† 𝐵† 𝑅†‚, può perciò essere riscritto come 𝐴† 𝐵† 𝑅†‚, +
𝐴† 𝐵† 𝑅†‚, + 𝐴† 𝐵† 𝑅†‚, e dunque:

𝑅† = (𝐴̅† 𝐵† 𝑅†‚, + 𝐴† 𝐵† 𝑅†‚, ) + (𝐴† 𝐵^† 𝑅†‚, + 𝐴† 𝐵† 𝑅†‚, ) + (𝐴† 𝐵† 𝑅^†‚, + 𝐴† 𝐵† 𝑅†‚, )
= (𝐴̅† + 𝐴† )𝐵† 𝑅†‚, + (𝐵^† + 𝐵† )𝐴† 𝑅†‚, + (𝑅^†‚, + 𝑅†‚, )𝐴† 𝐵†

E poiché 𝐴̅ + 𝐴 = 1,

𝑅† = 𝐵† 𝑅†‚, + 𝐴† 𝑅†‚, + 𝐴† 𝐵† = 𝐴† 𝐵† + (𝐴† + 𝐵† )𝑅†‚,

20
Da quest’ultimo risultato possiamo trovare anche una forma semplificata per 𝑆† : osserviamo infatti che,
definito…

𝐷† = (𝐴† + 𝐵† + 𝑅†‚, )𝑅^†

…sostituendo 𝑅^† con l’espressione ottenuta prima otteniamo:

𝐷† = 𝐴† 𝑅^† + 𝐵† 𝑅^† + 𝑅†‚, 𝑅^† = 𝐴† 𝐵^† 𝑅^†‚, + 𝐵† 𝐴̅† 𝑅^†‚, + 𝐴̅† 𝐵^† 𝑅†‚,

Dove, nell’ultimo passaggio, abbiamo direttamente eliminato i termini del tipo 𝐴̅𝐴 = 0.
Il termine 𝐷† coincide perciò con i primi tre termini di 𝑆† , che può dunque essere riscritto come…

𝑆† = 𝐴̅† 𝐵^† 𝑅†‚, + 𝐴̅ † 𝐵† 𝑅^†‚, + 𝐴† 𝐵^† 𝑅^ †‚, + 𝐴† 𝐵† 𝑅†‚, = (𝐴† + 𝐵† + 𝑅†‚, )𝑅^† + 𝐴† 𝐵† 𝑅†‚,
= 𝐴† 𝑅^† + 𝐵† 𝑅^† + 𝑅†‚, 𝑅^† + 𝐴† 𝐵† 𝑅†‚, = 𝑅†‚, (𝐴† 𝐵† + 𝑅^† ) + 𝑅^† (𝐴† + 𝐵† )
Sostituendo nuovamente 𝑅† e semplificando opportunamente i termini,
^^^^^^^^^^
𝑆† = 𝑅†‚, (𝐴† 𝐵† + 𝐴̅† 𝐵^† ) + 𝑅^†‚, (𝐴̅† 𝐵† + 𝐴† 𝐵^† ) = 𝑅†‚, X𝐴 ^
ˆ ⊕ 𝐵ˆ Y + 𝑅†‚, (𝐴† ⊕ 𝐵† )

Che comporta:

𝑆† = 𝑅†‚, ⊕ (𝐴† ⊕ 𝐵† )

In conclusione, perciò,

𝑅† = 𝐴† 𝐵† + (𝐴† + 𝐵† )𝑅†‚,
𝑆† = 𝑅†‚, ⊕ (𝐴† ⊕ 𝐵† )
Comprendiamo che quindi non è necessario utilizzare due half-adder per ottenere un full-adder, ma basta
semplicemente combinare adeguatamente degli AND, degli OR e degli XOR:

- Osservazione: la trattazione finora impiegata è quella di un sommatore in parallelo, e dunque in


regime combinatorio; sono tuttavia frequenti i sommatori seriali, cioè sommatori in grado di
ricevere bit in ingresso 𝐴† e 𝐵† in istanti di tempo differenti e di sommarli man mano riportando il
resto ad ogni ciclo. Questo tipo di circuiti è anche più efficiente, in quanto richiede l’utilizzo di un
solo full adder in grado di restituire periodicamente i risultati 𝑆† di ogni somma tra due bit,
“ricordando” il resto del ciclo precedente.
Un full-adder seriale può essere realizzato attraverso il seguente circuito:

21
…dove la componente 𝐷 induce un ritardo nel riporto del resto 𝑅† , in modo che sia ripresentato
come resto 𝑅†‚, nel ciclo successivo.

Complementatore
Un complementatore è un circuito in grado trasformare una parola di 𝑛 bit 𝐴• 𝐴•‚, … 𝐴, 𝐴. in una nuova
parola ad 𝑛 bit che presenti ogni bit invertito, nella forma 𝐴̅• 𝐴̅•‚, … 𝐴̅, 𝐴̅.. Ovviamente a questo scopo
basterebbe utilizzare 𝑛 circuiti NOT collegati a ciascun bit della parola in entrata: questo tipo di
procedimento si mostra però poco pratico, in quanto, se si volesse lasciare la parola “indisturbata”,
andrebbero smontati tutti i circuiti NOT. E’ invece più efficace costruire un circuito in grado di
complementare o lasciare invariata la parola al variare di uno switch o un comando esterno: a questo scopo
si presta particolarmente bene una porta XOR.
Si immagini infatti di voler complementare un bit in entrata 𝐴 a seconda di un segnale di riferimento 𝑀: se
𝑀 = 1, il complementatore è “acceso” e 𝐴 viene trasformato in 𝐴̅; se 𝑀 = 0, il complementatore è
“spento” e 𝐴 rimane, in uscita, pari ad 𝐴. Dalla tabella delle verità, osserviamo come questo risultato possa
essere ottenuto, appunto, da una porta XOR:

A M Y

0 0 0

1 0 1

0 1 1

1 1 0

Un’intera stringa di 𝑛 bit può allora essere complementata, bit per bit, attraverso il seguente circuito,
acceso per 𝑀 = 1 e spento per 𝑀 = 0:

22
Sottrattore
Completiamo la nostra trattazione analizzando un circuito che effettui la sottrazione tra due numeri
rappresentati da una parola binaria. L’operazione di sottrazione può essere in realtà ridotta ad
un’operazione di addizione sfruttando il complementatore descritto nel paragrafo precedente, come
vedremo a breve.
Immaginiamo di avere, per praticità, due parole binarie da quattro bit, 𝐴 = 𝐴w 𝐴h 𝐴, 𝐴. e 𝐵 = 𝐵w 𝐵h 𝐵, 𝐵. e
di voler effettuare, bit per bit, la differenza 𝐴 − 𝐵. Come ricondurre la sottrazione ad un’addizione1?

1) Se 𝐴 > 𝐵, possiamo osservare che, sfruttando la proprietà 𝐵† + 𝐵^† = 1,

𝐵 + 𝐵^ = 𝐵w 𝐵h 𝐵, 𝐵. + 𝐵^w 𝐵^h 𝐵^, 𝐵^. = 1111 ⇒ −𝐵 = 𝐵^ − 1111

D’altra parte, possiamo scrivere 1111 come 10000 − 1, perciò:

−𝐵 = 𝐵^ + 1 − 10000

Sommando 𝐴 ambo i membri otteniamo allora:

𝐴 − 𝐵 = 𝐴 + 𝐵^ + 1 − 10000

Perciò, se 𝐴 > 𝐵, la differenza 𝐴 − 𝐵 può essere effettuata sommando ad 𝐴 il valore di 𝐵^,


aggiungendo 1 e eliminando il riporto della cifra più significativa.

2) Se 𝐴 < 𝐵, riapplicando un ragionamento analogo al precedente,

𝐴 − 𝐵 = −(𝐵 − 𝐴) = −(1111 − 𝐵^ − 𝐴) = −X1111 − (𝐴 + 𝐵^)Y

Detto 𝐶 = 𝐴 + 𝐵^, osserviamo che, in parentesi, appare il termine 1111 − 𝐶; d’altra parte, per le
proprietà della complementazione, 𝐶 + 𝐶̅ = 1111, dunque 1111 − 𝐶 = 𝐶̅ = ^^^^^^^^
𝐴 + 𝐵^; otteniamo
allora:

^^^^^^^^
𝐴 − 𝐵 = −𝐴 + 𝐵^

1
Si faccia attenzione che il segno + utilizzato nella somma indica la somma algebrica tra due parole e non l’operazione
indotta dalla porta OR.
23
Perciò, se 𝐴 < 𝐵, la differenza 𝐴 − 𝐵 può essere effettuata sommando ad 𝐴 il valore di 𝐵^, negando
il risultato finale e ponendo un segno meno globale.

In conclusione,

- Se 𝐴 > 𝐵, 𝐴 − 𝐵 = 𝐴 + 𝐵^ + 1, da cui va trascurato il riporto (1);


- ^^^^^^^^
Se 𝐴 < 𝐵, 𝐴 − 𝐵 = −X𝐴 + 𝐵^Y.

Sommatore e sottrattore differiscono dunque semplicemente di alcune operazioni di complementazione e


l’eventuale somma di un bit 1. Per questo, entrambi i circuiti possono essere realizzati nel seguente modo,
dove uno switch cambia il valore globale 𝑀 dei complementatori:

In questa struttura, osserviamo che:

1) Se 𝑀 = 0, il primo complementatore è disabilitato, assieme a tutte le porte AND;


consequenzialmente, anche l’ultimo complementatore è disabilitato, in modo che le parole 𝐴 e 𝐵
arrivino direttamente al sommatore restituendo la loro somma 𝑌 bit per bit; in questo modo il
circuito effettua esclusivamente l’operazione di somma.
2) Per 𝑀 = 1, il primo complementatore è abilitato, e il sommatore effettuerà la somma di 𝐴 e 𝐵^.
Nell’ipotesi in cui 𝐴 > 𝐵, la somma 𝐴 + 𝐵^ restituisce un riporto (da eliminare alla fine), e dunque
un resto finale 𝑅• = 1: quest’ultimo, insieme ad 𝑀 = 1 abilita la prima porta AND, che restituisce,
al sommatore, un resto di partenza 𝑅‚, = 1. In questo modo il sommatore effettuare l’operazione
𝐴 + 𝐵^ + 1. La seconda porta AND non viene tuttavia abilitata, poiché 𝑅• = 1 viene negato: si ha
quindi il confronto, da parte della porta AND, tra 𝑅^• = 0 e 𝑀 = 1, che restituisce 0 e non abilita il
secondo complementatore. Il risultato complessivo perciò non viene complementato, e rimane 𝑌 =
𝐴 + 𝐵^ + 1: abbiamo effettuato una sottrazione tra 𝐴 e 𝐵 tenendo in conto che 𝐴 > 𝐵.
3) Per 𝑀 = 1, il primo complementatore è abilitato, e il sommatore effettuerà la somma di 𝐴 e 𝐵^.
Nell’ipotesi in cui 𝐴 < 𝐵, la somma 𝐴 + 𝐵^ non restituisce un riporto e perciò 𝑅• = 0: questo

24
risultato disabilita la prima porta AND in modo da non restituire riporti aggiuntivi al sommatore. Il
valore complementato di 𝑅• diventa tuttavia 𝑅^• = 1, che, insieme ad 𝑀 = 1, attiva la seconda
porta AND e dunque il secondo complementatore. Il risultato del sommatore 𝐴 + 𝐵^ viene perciò
complementato, restituendo in uscita ^^^^^^^^
𝐴 + 𝐵^: a meno di segno, abbiamo effettuato la differenza tra
𝐴 e 𝐵 tenendo in conto che 𝐴 < 𝐵.

Comparatore digitale
In un circuito digitale può essere talvolta necessario sapere se un numero binario 𝐴 è maggiore, minore o
uguale ad un altro numero binario 𝐵. Il circuito che consente di effettuare questa operazione è detto
comparatore digitale. In questo paragrafo osserveremo come l’operazione di comparazione in ambito
binario sia molto più semplice del caso decimale: 𝐴 e 𝐵 possono assumere solo due valori, dunque se 𝐴 >
𝐵, 𝐴 non può essere che uguale ad 1 e 𝐵 pari a 0, viceversa per 𝐵 > 𝐴.
Iniziamo a stabilire, dati due bit in entrata 𝐴 e 𝐵, se 𝐴 = 𝐵 o 𝐴 ≠ 𝐵: in altre parole, vogliamo un circuito
che restituisca “vero” se 𝐴 = 𝐵 ma “falso” se 𝐴 ≠ 𝐵. Osserviamo come un modo per potervi riuscire è
attraverso un circuito XOR negato (o un “NOR esclusivo”): la tabella della verità associata allo XOR, infatti,
restituiva 0 per 𝐴 = 𝐵 sia nei casi 𝐴 = 𝐵 = 0 che nei casi 𝐴 = 𝐵 = 1: la situazione inversa, che fa al caso
nostro, si ottiene appunto negato il tutto in uscita. In questo modo, lo XOR negato costituisce un rivelatore
di uguaglianza:
1 𝐴 = 𝐵
𝐴 ⊕ 𝐵 = ^^^^^^^^^^^^^^^^
𝐸 = ^^^^^^^^ 𝐴 ⋅ 𝐵^ + 𝐴̅ ⋅ 𝐵 = •
0 𝐴 ≠ 𝐵
Dove abbiamo sfruttato una delle possibili realizzazioni dello XOR tra quelle viste a pagina 9.
Se, attraverso lo XOR negato, si osserva 𝐴 ≠ 𝐵, diventa necessario stabilire se 𝐴 > 𝐵 o 𝐵 > 𝐴; osserviamo
che, se valesse 𝐴 > 𝐵, necessariamente si otterrebbe…

𝐶 = 𝐴 ⋅ 𝐵^ = 1
Poiché, se 𝐴 > 𝐵, allora deve valere necessariamente 𝐴 = 1 e 𝐵 = 0; nei casi in cui 𝐴 = 𝐵 o 𝐴 < 𝐵 (𝐴 = 0
e 𝐵 = 1) necessariamente si ottiene invece 𝐶 = 0.
Ripetendo un ragionamento analogo, nel caso in cui 𝐴 < 𝐵, si otterrebbe:

𝐷 = 𝐴̅ ⋅ 𝐵 = 1
In conclusione, un comparatore digitale deve possedere tre uscite: una per 𝐴 > 𝐵, una per 𝐵 > 𝐴 e una per
𝐴 = 𝐵, realizzabili attraverso due AND (con uno dei due ingressi negati) e uno XOR negato (o NOR
esclusivo), come nel seguente circuito:

25
In questo modo, misurando la tensione alle tre uscite 𝑌, 𝐶 e 𝐷, è possibile confrontare 𝐴 e 𝐵.
Il confronto di una parola a più bit può essere effettuata utilizzando un comparatore per ogni bit della
parola, ma, per poter effettivamente osservare se una stringa 𝐴, 𝐴h 𝐴w … descrive un numero minore,
maggiore o uguale del numero di una stringa 𝐵, 𝐵h 𝐵w … è necessaria, oltre una comparazione bit per bit,
anche una comparazione globale: 250 è più grande di 195, anche se la seconda e la terza cifra di
quest’ultimo sono più grandi della seconda e della terza cifra del primo!
Per comprendere il funzionamento di un comparatore a più bit, prendiamo a titolo d’esempio il caso a 4
cifre binarie. Dobbiamo perciò comparare una parola 𝐴w 𝐴h 𝐴, 𝐴. e una parola 𝐵w 𝐵h 𝐵, 𝐵. .
Iniziamo a stabilire se le parole descrivono lo stesso numero: affinché ciò avvenga, deve valere:

𝐴w = 𝐵w 𝐴h = 𝐵h 𝐴, = 𝐵, 𝐴. = 𝐵.
^^^^^^^^^^
Se 𝐸 = 𝐸w 𝐸h 𝐸, 𝐸. è la parola composta dalle uscite 𝐸† tale che 𝐸† = 𝐴 ˆ ⊕ 𝐵ˆ , l’uguaglianza è verificata solo
per 𝐸w = 𝐸h = 𝐸, = 𝐸. = 1, o, in forma più sintetica, deve valere 𝐸. ⋅ 𝐸, ⋅ 𝐸h ⋅ 𝐸w = 1.
Affinché invece 𝐴 > 𝐵, deve realizzarsi una delle seguenti situazioni:

- 𝐴w > 𝐵w
- Se 𝐴w = 𝐵w , 𝐴h > 𝐵h
- Se 𝐴w = 𝐵w e 𝐴h = 𝐵h , 𝐴, > 𝐵, ;
- Se 𝐴w = 𝐵w , 𝐴h = 𝐵h e 𝐴, = 𝐵, , 𝐴, > 𝐵, ;

Si può verificare che le condizioni precedenti sono soddisfatte dalla seguente espressione booleana:

𝐶 = 𝐴w ⋅ 𝐵^w + 𝐸w ⋅ 𝐴h ⋅ 𝐵^h + 𝐸w ⋅ 𝐸h ⋅ 𝐴, ⋅ 𝐵^, + 𝐸w ⋅ 𝐸h ⋅ 𝐸, ⋅ 𝐴. ⋅ 𝐵^. = 1


Il discorso 𝐴 < 𝐵 è analogo a quello 𝐴 > 𝐵, ma con 𝐴 e 𝐵 scambiati: dovrà perciò verificarsi la condizione…

𝐷 = 𝐴̅w ⋅ 𝐵w + 𝐸w ⋅ 𝐴̅h ⋅ 𝐵h + 𝐸w ⋅ 𝐸h ⋅ 𝐴̅, ⋅ 𝐵, + 𝐸w ⋅ 𝐸h ⋅ 𝐸, ⋅ 𝐴̅. ⋅ 𝐵. = 1


Si osservi che l’uscita 𝐷 potrebbe anche essere ottenuta attraverso una porta AND tra i bit di 𝐸 e 𝐶, nella
forma 𝐷 = 𝐸^ ⋅ 𝐶̅ : questo modo di ottenere 𝐷 necessita però l’aggiunta di nuove porte AND e invertitori in
grado di creare ulteriori ritardi di propagazione, mentre si preferisce “riciclare” le stesse porte AND
utilizzate per calcolare 𝐶 semplicemente scambiando 𝐴 e 𝐵.
Alla luce di quanto detto, il circuito può perciò essere realizzato nel seguente modo:

26
Dove i singoli 𝐸† , per poter essere calcolati, necessitano, ciascuno di un comparatore XOR negato a singolo
bit. Le entrate 𝐶 O (e la relativa porta AND aggiuntiva) ed 𝐸 O sono entrate di controllo, non necessarie nella
nostra trattazione (possiamo supporre 𝐶 O = 0 ed 𝐸 O = 1), ma diventano fondamentali nella realizzazione di
comparatori ad un numero maggiore di bit. Immaginiamo infatti di voler costruire un comparatore ad 8 bit
sfruttando due comparatori a 4 bit in cascata, in modo da comparare i numeri 𝐴• 𝐴‘ 𝐴’ 𝐴{ 𝐴w 𝐴h 𝐴, 𝐴. e
𝐵• 𝐵‘ 𝐵’ 𝐵{ 𝐵w 𝐵h 𝐵, 𝐵. : attraverso un primo comparatore vengono comparate le 4 cifre meno significative,
cioè 𝐴w 𝐴h 𝐴, 𝐴. e 𝐵w 𝐵h 𝐵, 𝐵. ; i rispettivi 𝐸 e 𝐶 vengono poi collegati ad 𝐸 O e 𝐶 O del secondo comparatore,
che compari le quattro cifre più significative 𝐴• 𝐴‘ 𝐴’ 𝐴{ e 𝐵• 𝐵‘ 𝐵’ 𝐵{ , acquisendo l’informazione, attraverso
𝐸 O e 𝐶 O , se 𝐴w 𝐴h 𝐴, 𝐴. e 𝐵w 𝐵h 𝐵, 𝐵. tra loro uguali o diverse.

Multiplexer e demultiplexer
Il multiplexer
Un multiplexer è un dispositivo in grado di selezionare uno tran 𝑁 dati in ingresso e di trasmettere il dato
così prescelto ad un singolo canale di informazione. In questo senso, esso costituisce un selettore di dati.

Affinché possa selezionare solo una delle 𝑁 entrate, un multiplexer è fornito di diversi indirizzi, cioè ingressi
in grado di abilitare solo l’𝑖-esima entrata e disabilitare tutte le altre. Verrà perciò schematizzato attraverso
la seguente scatola nera:

…dove l’entrata enable è utilizzata per abilitare o disabilitare il multiplexer. Si osservi che, per 𝑁 entrate,
non sono necessarie 𝑚 = 𝑁 indirizzi di abilitazione: il multiplexer è strutturato in modo che ad ogni
combinazione di bit, costituenti una parola dell’indirizzo 𝑆. 𝑆, 𝑆h … 𝑆“‚, , sia associato un unico ingresso
abilitato; poiché con 𝑚 indirizzi si possono creare 2“ combinazioni, avremo che, in generale, per 𝑁 entrate
dovrà valere…

𝑁 ≤ 2“
Basteranno dunque 𝑚 = log h 𝑁 indirizzi per l’abilitazione di ciascuna delle entrate.

Multiplexer 2-1 e 4-1


Vediamo come costruire un multiplexer a due entrate. In base a quanto detto prima, basterà 𝑚 = log h 2 =
1 indirizzi (dunque un unico indirizzo) per poter abilitare l’uno o l’altro ingresso.
L’indirizzo deve abilitare l’ingresso 𝐼. e disabilitare l’ingresso 𝐼, per un determinato valore (ad esempio, 𝑆 =

27
0), ma deve abilitare l’ingresso 𝐼, e disabilitare l’ingresso 𝐼. per il valore opposto (ad esempio, 𝑆 = 1).
Un modo per ottenere questo risultato è attraverso la seguente espressione:

𝑍 = 𝐼. ⋅ 𝑆̅ + 𝐼, ⋅ 𝑆
…che restituisce il seguente circuito:

La tabella della verità restituisce allora:

𝑰𝟎 𝑰𝟏 𝑺 𝒁

0 0 0 0 = 𝐼.

1 0 0 1 = 𝐼.

0 1 0 0 = 𝐼.

1 1 0 1 = 𝐼.

0 0 1 0 = 𝐼,

1 0 1 0 = 𝐼,

0 1 1 1 = 𝐼,

1 1 1 1 = 𝐼,

Osserviamo dunque che la tabella può essere riassunta nella seguente forma più compatta:

𝑺 𝒁

0 𝐼.

1 𝐼,

Si osservi dunque come può risultare comodo disporre le porte logiche del circuito in modo da creare una
corrispondenza uno ad uno tra il pedice 𝑗 dell’ingresso 𝐼œ (in decimale) e il numero dell’indirizzo 𝑆 (in
binario). Nel nostro caso, infatti, si ha che 𝐼. è abilitato dall’indirizzo 𝑆 = 0, e 𝐼, è abilitato dall’indirizzo 𝑆 =
1.

Una logica analoga può essere applicata per un multiplexer 4-1, cioè con quattro ingressi e dunque 𝑚 =
log h 4 = 2 indirizzi. In base alla logica di 𝑆 = 𝑗 (o meglio nel nostro caso, 𝑆 = 𝑆, 𝑆. = 𝑗) descritta prima,
avremo la seguente tabella della verità:

28
𝑺𝟏 𝑺𝟎 𝒁

0 0 𝐼.
0 1 𝐼,
1 0 𝐼h
1 1 𝐼w

Come si può verificare, la tabella della verità verifica la seguente espressione:

𝑍 = 𝑆,̅ ⋅ 𝑆.̅ ⋅ 𝐼. + 𝑆,̅ ⋅ 𝑆. ⋅ 𝐼, + 𝑆, ⋅ 𝑆.̅ ⋅ 𝐼h + 𝑆, ⋅ 𝑆. ⋅ 𝐼w


Un multiplexer 4-1 può dunque essere realizzato nel seguente modo:

Se si volesse aggiungere anche un’entrata di abilitazione enable, basterebbe, ad entrambi i circuiti,


aggiungere un ulteriore ingresso a ciascuno delle porte AND, in grado di abilitarle (𝐸 = 1) o disabilitarle
(𝐸 = 0).
In generale, si tende a non costruire multiplexer dal gran numero di entrate, ma ad utilizzare più
multiplexer in serie e parallelo, effettuando delle selezioni “a blocchi”. Ad esempio, un multiplexer con 32
entrate può essere ottenuto sfruttando 4 multiplexer ad 8 entrate (che filtrano tra gli 32 ingressi
restituendone 4) e un multiplexer a 4 entrate (che filtra tra gli ultimi 4 ingressi restituendo solo un’uscita).

Il multiplexer come convertitore parallelo-serie


Per come è strutturato, un multiplexer è in grado di convertire un’informazione in parallelo in un unico
ingresso seriale. Si immagini infatti di avere una parola di 𝑁 bit 𝐴•‚, 𝐴•‚h … 𝐴, 𝐴. allocata in 𝑁 ingressi di
un multiplexer. Come sappiamo, a seconda dell’abilitazione degli indirizzi, solo uno dei bit 𝐴† verrà
restituito in uscita. Se ad esempio, all’inizio, gli 𝑚 indirizzi si trovano nella configurazione
𝑆“‚, 𝑆“‚h … 𝑆, 𝑆. = 000 … 0, avremo, in uscita, 𝑍 = 𝐴. . Se però, ad istanti di tempo successivi, si
cambiano gli indirizzi con una certa frequenza (cadenzata ad esempio da un clock, come vedremo meglio
nei prossimi capitoli) in modo che essi aumentino progressivamente il valore in 000 … 1, 000 … 10,
000 … 11 etc., si avrà, ad ogni cambiamento di 𝑆“‚, 𝑆“‚h … 𝑆, 𝑆. , il passaggio in uscita del bit 𝐴, , 𝐴h , 𝐴w ,
etc. In questo modo, un segnale di bit in parallelo 𝐴•‚, 𝐴•‚h … 𝐴, 𝐴. viene trasformato in una sequenza di
bit successivi 𝐴. , 𝐴, , … 𝐴•‚, .

Il multiplexer come generatore di funzioni


Nella trattazione del multiplexer 4-1, abbiamo osservato come l’uscita 𝑍 assumesse la forma…

𝑆,̅ ⋅ 𝑆.̅ ⋅ 𝐼. + 𝑆,̅ ⋅ 𝑆. ⋅ 𝐼, + 𝑆, ⋅ 𝑆.̅ ⋅ 𝐼h + 𝑆, ⋅ 𝑆. ⋅ 𝐼w

29
Si osservi che, combinando adeguatamente entrate ed indirizzi della
formula di sopra, un multiplexer è in grado di effettuare qualsiasi
funzione logica di 4 variabili espressa come somma di prodotti tra
ingressi (generalmente indicati con il termine di minterm). Questa
peculiarità può ovviamente essere estesa ad 𝑁 variabili.
Ad esempio, se si volesse costruire un circuito in grado di associare, a
tre variabili in entrata, l’uscita…

𝑌 = 𝐴̅ ⋅ 𝐵 ⋅ 𝐶 + 𝐴 ⋅ 𝐵^ ⋅ 𝐶 + 𝐴 ⋅ 𝐵 ⋅ 𝐶̅

…basterebbe costruire un multiplexer 4-1 dove 𝑆, = 𝐴, 𝑆. = 𝐵, 𝐼, = 𝐼h = 𝐼w̅ = 𝐶, e 𝐼. = 0, come nella


figura a destra.

Il demultiplexer
Un demultiplexer svolge la funzione inversa di un multiplexer. Un demultiplexer, infatti, possiede una sola
entrata ma 𝑁 uscite, abilitate da 𝑚 indirizzi tale che 𝑁 ≤ 2“ , in grado di smistare l’informazione in entrata
solo verso uno dei terminali d’uscita. Ripetendo un ragionamento analogo a quello di pagina 28, come un
multiplexer è in grado di “serializzare” un segnale in entrata parallelo, un demultiplexer è in grado di
“parallelizzare” un segnale in entrata seriale.

Decodificatori e codificatori
Decodificatori
Un decodificatore è un sistema che accetta in ingresso una parola di 𝑀 bit e impone lo stato 1 a una (e una
sola) tra 2ž linee in uscita. In questo senso, un decodificatore individua (riconosce) un particolare codice e,
in base a quest’ultimo, restituisce una determinata risposta.
Un esempio interessante di decodificatori che tratteremo sarà quello dei decodificatori BCD, che associano,
ad una parola decimale, gruppi di quattro bit per ogni cifra.

Decodificatori BCD
Negli ultimi paragrafi della parte 2 abbiamo imparato a convertire un numero binario in un numero
decimale e viceversa. Nei sistemi digitali, tuttavia, si tende a non utilizzare una conversione biunivoca da
binario a decimale e viceversa, ma si preferisce rappresentare le parole decimali in “gruppi” di bit, secondo
il sistema binary coded decimal (BCD).
Poiché un gruppo di 4 bit è in grado di creare 2{ = 16 combinazioni, il sistema BCD associa, alle prime dieci
di esse, un numero decimale tra 0 e 9. In questo modo, si avrà una corrispondenza uno ad uno tra:

0000 → 0

0001 → 1
0010 → 2

30
1001 → 9
Sfruttando questa corrispondenza, un qualsiasi numero decimale di 𝑛 cifre può essere rappresentato da 𝑛
gruppi da quattro bit del sistema BCD; ad esempio, per rappresentare il numero 235, si utilizzerà il seguente
codice BCD:

235 → 0010 0011 0101


…poiché 0010 = 2, 0011 = 3 e 0101 = 5.
Per effettuare una conversione in numero binario attraverso il sistema BCD viene utilizzato un
decodificatore. Per comprenderne l’elemento più elementare, consideriamo il caso semplice di un
decodificatore a 4 entrate e un’unica uscita, che deve restituire un’uscita alta solo se il numero in entrata è,
nel sistema BCD, pari a 5, cioè 0101: In questo modo, misurando la tensione in uscita, si può conoscere se il
numero in entrata è pari ad un 5 o meno. Un modo semplice per poter realizzare un circuito del genere è
attraverso una porta AND:

Se infatti il numero in entrata è un 5, rappresentato da 𝐴𝐵𝐶𝐷 = 0101, l’AND, con le uscite 𝐵 e 𝐷 invertite,
percepisce in entrata la parola 𝐴𝐵^ 𝐶𝐷2 , che restituisce un 1 solo per il numero 5.
Immaginando di voler ripetere lo stesso ragionamento per ciascuno dei 10 numeri da 0 a 9, si ottiene una
struttura del genere:

Il circuito di sopra, a 4 ingressi 𝐴𝐵𝐶𝐷 (più un quarto costituito dall’abilitatore 𝑆), è costruito in modo che
solo una delle porte AND in uscita possa restituire un valore 1, come appunto è tipico dei decodificatori.
Poiché ogni porta AND rappresenta un numero binario secondo il sistema BCD, conoscendo quale delle
uscite sia alta si può conoscere il numero rappresentato dalla parola 𝐴𝐵𝐶𝐷.

31
Si osservi, infine, che un demultiplexer può essere utilizzato come decodificatore, sfruttando, come segnali
d’ingresso, gli indirizzi di smistamento e l’unica entrata come abilitatore. Alla fine solo una delle uscite sarà
alta (in quanto il demultiplexer smista soltanto in un possibile canale), proprio come si vuole per un
decodificatore.

Codificatori
L’operazione inversa di decodifica è detta di codifica, ed è effettuata da un codificatore. Un codificatore è
dunque un dispositivo in grado di associare, ad 2ž ingressi di cui solo uno allo stato 1, una e una sola parola
di 𝑀 bit dipendente dall’input acceso.

Codificatore a matrice
Un esempio semplice di codificatore è costituito dalla tastiera di un computer. Quest’ultima può essere
schematizzata da una matrice che associ ad ogni posto 𝑎†œ un tasto che, se pigiato, chiude un circuito
collegando l’alimentazione di 5 𝑉 ad una linea d’ingresso 𝑆† del codificatore. In base a com’è strutturata la
matrice, dall’ingresso del tasto 𝑎†œ vi è un’unica possibile configurazione in uscita, che restituisce il codice
con il quale il computer interpreta la lettera pigiata.

Per comprendere la struttura basilare di una simile struttura a matrice, immaginiamo un esempio più
semplice, con una tastiera a soli dieci tasti, con cui poter scrivere le cifre 0,1, … ,9. Abbiamo perciò bisogno
di 10 canali di entrata, e almeno 4 canali di uscita, in modo da poter rappresentare ogni numero attraverso
un codice BCD.
L’ingresso 𝑆† rappresenta l’𝑖-esimo tasto (con 𝑖 = 0,1, … ,9): perciò, se 𝑆† = 1, è stato premuto il tasto 𝑖,
corrispondente al numero 𝑖 rappresentato in BCD dai bit 𝑄w 𝑄h 𝑄, 𝑄.. Supponendo di non premere mai più
tasti contemporaneamente, si deve fare in modo che, premuto il tasto 𝑖, 𝑆œ = 𝛿†œ , cioè solo 𝑆† dev’essere
uguale ad 1, e tutti gli altri a 0. Secondo questa logica, si ottiene perciò la seguente tabella della verità:

𝑺𝟗 𝑺𝟖 𝑺𝟕 𝑺𝟔 𝑺𝟓 𝑺𝟒 𝑺𝟑 𝑺𝟐 𝑺𝟏 𝑺𝟎 𝑸𝟑 𝑸𝟐 𝑸𝟏 𝑸𝟎

0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 0 0 1 0 0 0 0 1

0 0 0 0 0 0 0 1 0 0 0 0 1 0

0 0 0 0 0 0 1 0 0 0 0 0 1 1

0 0 0 0 0 1 0 0 0 0 0 1 0 0

0 0 0 0 1 0 0 0 0 0 0 1 0 1

32
0 0 0 1 0 0 0 0 0 0 0 1 1 0

0 0 1 0 0 0 0 0 0 0 0 1 1 1

0 1 0 0 0 0 0 0 0 0 1 0 0 0

1 0 0 0 0 0 0 0 0 0 1 0 0 1

Da quest’ultima si può verificare che:

𝑄. = 𝑆, + 𝑆w + 𝑆’ + 𝑆• + 𝑆ª
𝑄, = 𝑆h + 𝑆w + 𝑆‘ + 𝑆•
𝑄h = 𝑆{ + 𝑆’ + 𝑆‘ + 𝑆•

𝑄w = 𝑆« + 𝑆ª
Fisicamente, una configurazione del genere può essere ottenuta attraverso il seguente sistema di diodi,
che, in corrispondenza della chiusura del cortocircuito 𝑖-esimo, attivano i diodi necessari alla realizzazione
della giusta combinazione dei valori 𝑄w 𝑄h 𝑄, 𝑄. :

Alla chiusura del tasto 𝑆, , ad esempio, si attiva solo il diodo più in alto, restituendo il segnale 𝑄w 𝑄h 𝑄, 𝑄. =
0001, corrispondente appunto ad 1.
Talvolta, in sostituzione dei diodi “in colonna”, vengono utilizzati equivalentemente più transistor o un
unico transistor multiemitter; ad esempio, alla colonna di 𝑄h sono presenti quattro in colonna, e nella riga
di 𝑆• tre diodi in fila: la colonna e la riga possono allora essere realizzate attraverso le seguenti due
configurazioni:

33
Codificatori a priorità
Nella semplice tastiera che abbiamo progettato nel paragrafo precedente, cosa succederebbe se pigiassimo
più tasti contemporaneamente?
Ovviamente abiliteremmo più ingressi nello stesso istante, portando dunque ad un’indeterminazione dello
stato finale. Per evitarlo, si può realizzare il circuito in modo che venga riconosciuto, come premuto, solo il
tasto corrispondente alla linea il cui codice ha valore più elevato. In questo modo si realizza un codificatore
a priorità.
In una “tastiera a priorità”, al premere di due tasti 𝑆† ed 𝑆œ , deve risultare, in uscita, solo l’informazione
associata ad 𝑆† se 𝑖 > 𝑗, viceversa se 𝑖 < 𝑗. La tabella delle verità vista prima assume quindi la seguente
forma:

𝑺𝟗 𝑺𝟖 𝑺𝟕 𝑺𝟔 𝑺𝟓 𝑺𝟒 𝑺𝟑 𝑺𝟐 𝑺𝟏 𝑺𝟎 𝑸𝟑 𝑸𝟐 𝑸𝟏 𝑸𝟎

0 0 0 0 0 0 0 0 0 1 0 0 0 0

0 0 0 0 0 0 0 0 1 X 0 0 0 1

0 0 0 0 0 0 0 1 X X 0 0 1 0

0 0 0 0 0 0 1 X X X 0 0 1 1

0 0 0 0 0 1 X X X X 0 1 0 0

0 0 0 0 1 X X X X X 0 1 0 1

0 0 0 1 X X X X X X 0 1 1 0

0 0 1 X X X X X X X 0 1 1 1

0 1 X X X X X X X X 1 0 0 0

1 X X X X X X X X X 1 0 0 1

Dove le 𝑋 stanno ad indicare un valore che può essere qualsiasi: essendo associate a righe di tasti di valori
minori, non verranno considerate nell’output finale.
Dalla tabella delle verità risulta, in particolare per la seconda uscita,

𝑄, = 𝑆ª̅ ⋅ 𝑆«̅ ⋅ 𝑆•̅ ⋅ 𝑆‘̅ ⋅ 𝑆’̅ ⋅ 𝑆{̅ ⋅ 𝑆w̅ ⋅ 𝑆h + 𝑆ª̅ ⋅ 𝑆«̅ ⋅ 𝑆•̅ ⋅ 𝑆‘̅ ⋅ 𝑆’̅ ⋅ 𝑆{̅ ⋅ 𝑆w + 𝑆ª̅ ⋅ 𝑆«̅ ⋅ 𝑆•̅ ⋅ 𝑆‘ + 𝑆ª̅ ⋅ 𝑆«̅ ⋅ 𝑆•
…che, raccogliendo i fattori comuni e sfruttando alcune proprietà dell’algebra booleana, può essere scritta:

𝑄, = 𝑆ª̅ ⋅ 𝑆«̅ ⋅ X𝑆• + 𝑆‘ + 𝑆’̅ ⋅ 𝑆{̅ ⋅ (𝑆w + 𝑆h )Y

34
L’uscita 𝑄, può quindi essere determinata attraverso una porta NOR (per 𝑆ª̅ ⋅ 𝑆«̅ = ^^^^^^^^^
𝑆ª + 𝑆« ) e alcune porte
AND-OR. Il ragionamento può poi essere esteso per tutte le altre uscite.

Memorie ROM
Terminiamo questo capitolo con le memorie ROM, che sfruttano le peculiarità di codificatori e
decodificatori.
Una memoria ROM (read only memory) è un dispositivo di 𝑀 ingressi ed 𝑁 uscite, dove 𝑀 può essere
maggiore, minore o uguale di 𝑁. Ad un determinato codice di 𝑀 bit, la memoria ROM fa corrisponde un
codice specifico di 𝑁 bit. Questa conversione può essere realizzata attraverso due passaggi intermedi: nel
primo, attraverso un decodificatore, la ROM trasforma gli 𝑀 ingressi in 2ž linee di uscita; nel secondo, le
2ž linee vengono poi ricodificate nelle 𝑁 uscite. Si osservi che queste 2ž parole non devono essere
necessariamente tutte diverse: infatti si può desiderare di avere lo stesso codice in uscita in corrispondenza
di parole d’ingresso diverse.
Una ROM è dunque progettata per restituire, ad una determinata parola in entrata, una determinata parola
in uscita, e questa relazione funzionale è fissata nella ROM stessa in base alla sua progettazione. In tal
modo l’informazione è ricordata in modo permanente: si dice perciò la memoria ROM costituisce un tipo di
memoria non volatile. D’alta parte, la codifica e la decodifica dell’informazione è, una volta progettata la
ROM, fissata, e per poter essere cambiata bisogna agire sulle parti fisiche (hardware) del dispositivo: a
differenza delle celle di memoria che vedremo nel prossimo capitolo, dunque, la memoria ROM è una
memoria a sola lettura (da cui il termine ROM).

Sistemi digitali sequenziali


Introduzione
Memoria e sincronia
I circuiti descritti nel capitolo precedente hanno, essendo basati su una logica combinatoria, la
caratteristica di restituire una riposta in uscita al tempo 𝑡 dipendente esclusivamente dagli ingressi allo
stesso istante di tempo (a meno di piccoli ritardi di propagazione). E’ per questo che si dice che i sistemi
combinatori non hanno memoria, poiché ad un istante 𝑡 O successivo non c’è traccia degli ingressi
precedenti. Al contrario, come già accennato, i sistemi in logica sequenziale restituiscono in uscita
all’istante 𝑡 informazioni legate ai segnali in entrata ad istanti precedenti, di cui ne detengono dunque una
qualche forma di memoria.
I computer, che necessitano di memorizzare le informazioni per poterle applicare in numerose istruzioni,
sono basati su strutture in logica sequenziale. Un calcolatore deve infatti essere in grado di:

1) Acquisire un’istruzione da una memoria;


2) Memorizzare l’istruzione in un registro;
3) Acquisire i dati da elaborare;
4) Effettuare l’istruzione;
5) Passare all’istruzione successiva secondo una frequenza precisa.

L’ultimo punto si mostra essenziale: se un circuito deve effettuare in sequenza una serie di istruzioni a
differenti istanti di tempo, è fondamentale ognuna di esse sia cadenzata secondo un “ritmo” ben preciso.
Per questo, molti sistemi digitali sono sincroni, ovvero funzionano in sincronismo con una sequenza di
impulsi di periodo 𝑇, detto clock (abbreviato 𝐶𝑘).
Un clock non è nient’altro che una sequenza di impulsi di breve durata 𝑡® , piccola rispetto al periodo del
segnale 𝑇 , che “scandisce” l’abilitazione o l’inabilitazione delle diversi componenti logiche di un circuito.
Per questo, nell’intervallo di tempo tra due impulsi, il valore delle variabili logiche del sistema deve
rimanere inalterato, e variare solo all’arrivo di un impulso successivo (si osservi che non è necessario

35
l’impulso di clock sia simmetrico). E’ perciò fondamentale che, tra un impulso e un altro, il circuito
mantenga memoria dell’informazione.

La cella di memoria elementare: il bistabile


Il circuito fondamentale di memoria in un sistema digitale si ottiene collegando due invertitori (ottenibili, in
base a quanto visto a pagina 10, attraverso due porte NAND ad ingressi cortocircuitati) in modo incrociato,
come indicato in figura:

In questa struttura, l’uscita di ciascuna porta è collegata all’ingresso dell’altra e questo sistema con
reazione è chiamato bistabile.
La proprietà più importante di un bistabile è che esso può rimanere solo in uno fra due stati stabili, cioè 𝑄 =
1 (𝑄^ = 0) o 𝑄 = 0 (𝑄^ = 0), “immagazzinandone” dunque l’informazione. Se infatti 𝑄 fosse uguale ad 1,
allora avremmo 𝐵 = 1; questa informazione viene ovviamente negata in uscita dal NAND 𝑁h , che comporta
𝑄^ = 0. Essendo però 𝑄^ = 0, allora anche 𝐴 = 0, cioè l’entrata di 𝑁, , che restituirà quindi in uscita il valore
𝑄 = 1. Questa conclusione conferma l’ipotesi iniziale, cioè 𝑄 = 1: se esso si trova quindi all’inizio nello
stato 1, vi rimane stabilmente. Analogamente si mostra la stabilità dello stato 𝑄 = 0, per questo il circuito è
detto, appunto, bistabile. Il bistabile, essendo in grado di immagazzinare stabilmente un bit d’informazione
(𝑄 = 0 o 𝑄 = 1), costituisce l’esempio più elementare di cella di memoria: per questo è detto anche latch,
in quanto l’informazione è bloccata (latched).
Si osservi che, tuttavia, non possono sussistere gli stati 𝐴 = 𝐵 = 0 e 𝐴 = 𝐵 = 1, come risulta anche dalla
tabella della verità:

𝑨 𝑩 𝑸 2
𝑸

0 0 ? ?

0 1 1 0

1 0 0 1

1 1 ? ?

Un bistabile è realizzabile attraverso il seguente circuito, cioè due invertitori incrociati:

36
Si può infatti osservare come, se un transistor è in regime di saturazione, l’altro è necessariamente
interdetto: i due stati di interdizione e saturazione (e dunque di uscite 1 e 0) non possono verificarsi
contemporaneamente, e questo genera l’indeterminazione 𝐴 = 𝐵 vista prima.

Si immagini adesso di voler memorizzare un bit nel bistabile, cioè ad esempio “immagazzinare” il dato 𝑄 =
1 o 𝑄 = 0. Per farlo è necessario inserire due canali di imput entro cui dare l’informazione: si realizza allora
il seguente circuito:

E’ immediato osservare che:

1) 𝐴 = 1, 𝐵 = 0 ⇒ 𝑄 = 0, 𝑄^ = 1;
2) 𝐴 = 0, 𝐵 = 1 ⇒ 𝑄 = 1, 𝑄^ = 0;
3) Lo stato del bistabile non è influenzato dalla combinazione 𝐴 = 𝐵 = 1: se 𝑄 = 1 o 𝑄 = 0 è lo
stato precedente dopo che gli ingressi vengono posti ad 𝐴 = 𝐵 = 1, le uscire rimarranno a
𝑄 = 1 o 𝑄 = 0;
4) La combinazione 𝐴 = 𝐵 = 0 non è consentita, in quanto risulterebbe 𝑄 = 𝑄^ = 1.

Combinando adeguatamente le entrate 𝐴 e 𝐵, e quindi possibile far memorizzare uno stato 𝑄 = 0 o 𝑄 = 1


al bistabile, in base alla seguente tabella della verità riassuntiva:

𝑨 𝑩 𝑸 2
𝑸

0 0 ? ?

0 1 1 0

1 0 0 1

1 1 𝑄 𝑄^

37
I FLIP-FLOP
Come abbiamo già accennato, in un circuito sequenziale è fondamentale riuscire a cambiare le variabili
logiche di un sistema in maniera cadenzata attraverso un clock: nasce quindi la necessità di abilitare ed
inabilitare in maniera sequenziale gli stati assumibili da un bistabile. Un bistabile cadenzato è detto FLIP-
FLOP.
Vi sono diversi tipi di FLIP-FLOP: in questi paragrafi ne analizzeremo numerosi esempi sempre più raffinati.

Il FLIP-FLOP 𝑺𝑹
Si consideri il seguente circuito, detto FLIP-FLOP 𝑆𝑅:

Quest’ultimo è costituito da due porte 𝑁, ed 𝑁h formanti un bistabile, a cui si aggiungono altre due porte
𝑁w ed 𝑁{ collegate ad un impulso di clock comune; queste fungono da porte pilota o di controllo che
stabiliscono lo stato del FLIP-FLOP ad ogni impulso di clock. E’ generalmente più schematico utilizzare la
seguente rappresentazione a scatola nera:

Da com’è strutturato, osserviamo che il FLIP-FLOP verifica le seguenti situazioni:

1) Nell’intervallo di tempo tra due impulsi di cadenza (𝐶𝑘 = 0), le porte 𝑁w ed 𝑁{ rimangono
disabilitate e restituiscono il valore 1 a prescindere dei valori assunti dalle entrate 𝑆 ed 𝑅;
perciò 𝑆 O = 𝑅O = 1, e, in base a quanto visto nell’analisi dei bistabili di pagina 28, 𝑄 e 𝑄^
manterranno il valore assunto un istante prima del cambio di ingressi: in altre parole, il FLIP-
FLOP non cambia stato nell’intervallo compreso tra due impulsi di cadenza, ma lo conserva.
2) Se all’istante 𝑡 è presente un impulso di cadenza (𝐶𝑘 = 1), e le entrate 𝑆 ed 𝑅 sono entrambe a
0, le uscite 𝑆′ ed 𝑅′ delle porte 𝑁w ed 𝑁{ sono entrambe ad 1; in base a quanto appreso, in
questa situazione lo stato 𝑄•°, del FLIP-FLOP rimane inalterato rispetto allo stato precedente
𝑄• , perciò 𝑄• = 𝑄•°, .
3) Se all’istante 𝑡 è presente un impulso di cadenza (𝐶𝑘 = 1), e le entrate sono rispettivamente
𝑆 = 0 ed 𝑅 = 1, le uscite di 𝑁w ed 𝑁{ assumono i valori 𝑆 O = 1 e 𝑅O = 0. In questa situazione,
in base alla tabella della verità di pagina 28, 𝑄•°, = 0; viceversa, se 𝑆 = 1 ed 𝑅 = 0, risulta
𝑄•°, = 1.
4) Se all’istante 𝑡 è presente un impulso di cadenza (𝐶𝑘 = 1), e le entrate 𝑆 ed 𝑅 sono entrambe a
1, le uscite di 𝑁w ed 𝑁{ sono entrambe a 0, e si entra nello stato non consentito descritto dalla
tabella delle verità di pagina 28. Questo stato è, come detto più volte, “ambiguo”, ed occorre
impedire che si verifichi.

38
Il FLIP-FLOP 𝑱𝑲
Per evitare l’ambiguità dello stato 𝑆 = 𝑅 = 0 si effettua la seguente modifica al FLIP-FLOP 𝑆𝑅, ottenendo il
cosiddetto FLIP-FLOP 𝑱𝑲:

…spesso schematizzato attraverso il seguente simbolo circuitale:

Per come è costruito, risulta:

𝑆 = 𝐽 ⋅ 𝑄^
𝑅 =𝐾⋅𝑄

In questo modo viene determinata la seguente tabella della verità:

𝑱𝒏 𝑲𝒏 𝑸𝒏 2𝒏
𝑸 𝑺𝒏 𝑹𝒏 𝑸𝒏°𝟏

0 0 0 1 0 0 𝑄• = 0

0 0 1 0 0 0 𝑄• = 1

1 0 0 1 1 0 1

1 0 1 0 0 0 𝑄• = 1

0 1 0 1 0 0 𝑄• = 0

0 1 1 0 0 1 0

1 1 0 1 1 0 1 = 𝑄^•

1 1 1 0 0 1 0 = 𝑄^•

Osserviamo che non può mai verificarsi lo stato 𝑆 = 𝑅 = 1, che causava l’ambiguità nel circuito. La tabella
può essere allora riassunta nella seguente:

39
𝑱𝒏 𝑲𝒏 𝑸𝒏°𝟏

0 0 𝑄•

0 1 0

1 0 1

1 1 𝑄^•

- Osservazione: il caso 𝐽 = 𝐾 = 1 in realtà è molto particolare: quando il clock è abilitato, in base a


quanto detto, vale 𝑄•°, = 𝑄^𝒏 : ad ogni impulso successivo, perciò, l’uscita 𝑄 assume il valore
opposto a quello precedente, in maniera oscillante:

In realtà, in un FLIP-FLOP 𝐽𝐾 non è necessaria la struttura a due porte AND descritta prima; un circuito
equivalente è infatti il seguente:

Il clear e il preset in un FLIP-FLOP 𝑱𝑲


Un circuito come il FLIP-FLOP 𝐽𝐾 è per sua natura fortemente pilotato dalle uscite, in quanto, come
abbiamo visto, queste ultime sono cortocircuitate con le entrate. Prima che si applichi l’impulso di clock,
tuttavia, non vi è modo di determinare il valore delle uscite 𝑄 e 𝑄^, che risultano quindi arbitrarie: è
necessario allora aggiungere due nuovi ingressi in grado di prestabilire i valori di uscita del FLIP-FLOP, che
verranno indicate con il termine di clear (Cr) e preset (Pr) .
Queste ultimi vengono applicati alle due porte NAND 𝑁, ed 𝑁h , e determinano una preassegnazione del
valore di 𝑄 all’istante iniziale 𝑡. , quando il clock è ancora a 0:

40
Osserviamo infatti che:

1) Se 𝐶𝑟 = 0, allora dovrà necessariamente risultare 𝑄^ = 1; in questo modo, poiché 𝐶𝑘 = 0, se si


pone 𝑃𝑟 = 1 la porta 𝑁, vede in ingresso tre segnali alti, e restituisce quindi 𝑄 = 0, in accordo
con 𝑄^ = 1.
2) Se 𝑃𝑟 = 0, allora dovrà necessariamente risultare 𝑄 = 1; in questo modo, poiché 𝐶𝑘 = 0, se si
pone 𝐶𝑟 = 1 la porta 𝑁h vede in ingresso tre segnali alti, e restituisce quindi 𝑄^ = 0, in accordo
con 𝑄 = 1.

Le due configurazioni 𝐶𝑟 = 0, 𝑃𝑟 = 1 e 𝐶𝑟 = 1, 𝑃𝑟 = 0 permettono quindi di prestabilire il FLIP-FLOP in


modo che l’uscita 𝑄 assuma i valori 0 ed 1 rispettivamente. Si osservi che lo stato 𝑃𝑟 = 𝐶𝑟 = 0 è proibito
per le solite implicazioni di ambiguità, mentre lo stato 𝑃𝑟 = 𝐶𝑟 = 1, come al solito, lascia invariate le uscite
rispetto ai valori assunti in precedenza: per questo, affinché 𝑃𝑟 e 𝐶𝑟 non perturbino i segnali del FLIP-FLOP
una volta azionato il clock, è fondamentale portare 𝑃𝑟 = 𝐶𝑟 = 1.

Condizioni di corsa critica di un FLIP-FLOP 𝑱𝑲


Sebbene il FLIP-FLOP 𝐽𝐾 risolva le ambiguità introdotte dal tipo 𝑅𝑆, possono insorgere delle difficoltà di
tipo fisico in grado di causare malfunzionamenti del circuito. Le tabelle della verità di pagina 30
presuppongono che gli ingressi siano indipendenti dalle uscite. Invece, a causa del legame di reazione fra 𝑄
(𝑄^) e l’ingresso 𝐾 (𝐽), durante l’impulso del segnale di cadenza (𝐶𝑘 = 1) l’ingresso cambia se l’uscita cambia
stato.
A titolo esplicativo, supponiamo, ad un istante iniziale, valga 𝐽 = 𝐾 = 1 e 𝑄. = 0. Appena viene applicato
l’impulso, come sappiamo 𝑄•°, = 𝑄^• , e dunque 𝑄, assume il valore 1; questa variazione ha luogo dopo un
tempo Δ𝑡 di propagazione attraverso le porte NAND in serie, al termine del quale si ha lo stato 𝐽 = 𝐾 =
𝑄, = 1. Se però terminato Δ𝑡 l’impulso di clock è ancora alto, allora avviene la transizione dovuta a 𝐽 =
𝐾 = 1 e 𝑄, = 1, che porta a 𝑄h = 0 in un ulteriore tempo Δ𝑡, e il processo si ripete finché il periodo 𝑡®
dell’impulso alto di clock non ha termine. Poiché durante tutto questo tempo 𝑄 oscilla tra 0 ed 1,
terminato l’impulso l’uscita 𝑄 non può essere determinata con certezza: a questo inconveniente
sperimentale si dà il termine di condizione di corsa critica.
Un primo modo semplice per evitare la condizione di corsa critica prevede la costruzione del FLIP-FLOP con
tempi di propagazione più o meno lunghi, in modo che 𝑡® < Δ𝑡 e dunque 𝑄 non abbia il tempo di
commutare nel periodo di impulso di clock. Sperimentalmente, tuttavia, questa condizione è impossibile da
realizzare nei circuiti integrati, la cui caratteristica è proprio la miniaturizzazione, e dunque piccoli tempi di
propagazione. Nei prossimi paragrafi descriveremo allora dei metodi pratici atti alla risoluzione del
problema di corsa critica.

Il FLIP-FLOP 𝑱𝑲 di tipo Master-Slave


Per evitare il problema dei tempi di propagazione introdotto nel paragrafo precedente, si usa una struttura
che prevede due FLIP-FLOP 𝑆𝑅 in una struttura a cascata, detta di Master-Slave (servo-padrone):

41
Osserviamo come il secondo FLIP-FLOP (lo slave) presenti un clock invertito rispetto al primo FLIP-FLOP (il
master): in questo modo, quando 𝐶𝑘 = 1 il master è abilitato e funziona in base a quanto visto nella tabella
della verità di pagina 30, ma lo slave è interdetto, pertanto le uscite 𝑄h = 𝑄 e 𝑄^h = 𝑄^ , cortocircuitate
all’entrata, rimangono inalterate per tutta la durata dell’impulso 𝑡® . In questo modo, non avviene
l’oscillazione dei valori in uscita descritta dalle condizioni di corsa critica.
Appena 𝐶𝑘, scende a 0, 𝐶𝑘h diventa alto, e abilità lo slave: quest’ultimo, essendo un FLIP-FLOP 𝑆𝑅, seguirà
la tabella della verità di pagina 21, perciò:

1) Se 𝑆h = 𝑄, = 1 e 𝑅h = 𝑄^, = 0, si ha 𝑄h = 1 e 𝑄^h = 0;
2) Se 𝑆h = 𝑄, = 0 e 𝑅h = 𝑄^, = 1, si ha 𝑄h = 0 e 𝑄^h = 1;

In altre parole, nell’intervallo tra gli impulsi di cadenza il valore di 𝑄, si trasferisce in 𝑄h = 𝑄 rimanendo
inalterato e pronto per essere cortocircuitato all’entrata evitando oscillazioni.
Il FLIP-FLOP 𝐽𝐾 del tipo Master-Slave mostra quindi un’incredibile stabilità rispetto ai FLIP-FLOP precedenti.
Industrialmente, a seconda delle applicazioni, essi possono essere di due tipi, denominati negative edge-
triggered F-F 𝐽𝐾 (quando la commutazione di 𝑄 avviene sul fronte di discesa del clock) e positve edge-
triggered F-F 𝐽𝐾 (quando la commutazione di 𝑄 avviene sul fronte di salita del clock).

I FLIP-FLOP 𝑱𝑲 di tipo 𝑫 e 𝑻
Concludiamo la nostra analisi dei FLIP-FLOP con due ultime strutture, dette di tipo 𝐷 e di tipo 𝑇.

1) I FLIP-FLOP 𝐽𝐾 di tipo 𝐷 presentano i due ingressi 𝐽 e 𝐾 legati da una porta NOT, in modo che
risultino sempre opposti:

𝑫𝒏 𝑸𝒏°𝟏

1 1

0 0

Questo tipo di circuito restituisce, in uscita 𝑄, lo stesso valore in ingresso 𝐷 per impulsi alti di clock.

2) I FLIP-FLOP 𝐽𝐾 di tipo 𝑇 presentano i due ingressi 𝐽 e 𝐾 tra loro cortocircuitati, in modo che
presentino lo stesso valore:

𝑻𝒏 𝑸𝒏°𝟏

1 𝑄^•

0 𝑄•

Questo tipo di circuito inverte dunque il valore di 𝑄 per 𝑇 = 1 ad ogni impulso di clock, mentre lo
lascia invariato per 𝑇 = 0.

I registri
Il registro come successione di FLIP-FLOP
Un FLIP-FLOP presenta, come struttura elementale, un bistabile, che, come abbiamo visto, ha la peculiarità
di poter immagazzinare un bit di memoria. Questo ovviamente permette di realizzare, attraverso 𝑛 FLIP-
FLOP, strutture di memoria in grado di registrare una parola di 𝑛 bit. Questa particolare combinazione di
FLIP-FLOP è detta registro.

42
Grazie alle peculiarità dei FLIP-FLOP, i registri possono essere sfruttati sia in parallelo che serialmente: i
FLIP-FLOP possono infatti essere collegati a cascata in modo che il bit di uno sia passato all’altro ad ogni
impulso di clock, o possono essere sfruttati individualmente, in parallelo, in modo che ognuno memorizzi
un bit diverso di memoria. In alternativa, le funzioni parallele e seriali vengono utilizzate
contemporaneamente a seconda delle necessità: per questo è utile distinguere i registri nei seguenti tipi:

1) Serial input – serial output (SISO), se gli ingressi vengono inseriti in successone e le uscite
vengono lette in maniera seriale;
2) Serial input – parallel output (SIPO), se gli ingressi vengono inseriti in successione, ma le uscite
vengono lette parallelamente ad ogni FLIP-FLOP;
3) Parallel input – serial output (PISO), se gli ingressi vengono inseriti parallelamente in ciascun
FLIP-FLOP, ma l’uscita è determinata solo da uno di questi;
4) Parallel input – parallel output (PIPO), se gli ingressi vengono inseriti parallelamente in ciascun
FLIP-FLOP e le uscite vengono lette anch’esse in parallelo.

Il registro a scorrimento (shift register)


Il registro a scorrimento è un tipico esempio di registro seriale: esso è costituito da una serie in cascata di
FLIP-FLOP 𝐽𝐾 nella seguente configurazione, che per praticità riportiamo con quattro componenti:

Ogni impulso di clock abilità ciascuno dei FLIP-FLOP 𝑛-esimi, che quindi, in una transizione da master a
slave, trasferiscono il loro segnale da 𝐽• a 𝑄• , inviandolo dunque al 𝐽•°, .
Al fine di evidenziarne il comportamento, consideriamo il seguente esempio esplicativo: immaginiamo di
voler registrare il numero costituito dalla parola binaria 1101:

1) Si parte innanzitutto dalla cifra meno significativa, cioè l’1. Poiché il FLIP-FLOP in entrata è di tipo
𝐷, se 𝐽w = 1 risulterà, in base alla tabella della verità di pagina 32, 𝑄w = 1 dopo un primo impulso
di clock (salita per abilitare il master, discesa per abilitare lo slave e dunque passare il segnale);
2) A questo punto viene inviata serialmente all’ingresso la seconda cifra, cioè 0; in questo modo, ad
un secondo impulso di clock, il valore 𝐽h = 𝑄w = 1 trasmette il valore 1 in 𝑄h , mentre il valore 𝑄w
assume il valore trasmesso da 𝐽w = 0.
3) Inserito in entrata la terza cifra pari ad 1, al terzo impulso di clock il valore 1, cioè la cifra meno
significativa, viene trasmesso in 𝑄, , il valore 0 (la seconda cifra) in 𝑄h e il valore 1 in 𝑄w (la terza
cifra).
4) Inserita in entrata l’ultima cifra pari ad 1, al quarto impulso di clock risulterà 𝑄. = 1, 𝑄, = 0, 𝑄h =
1, 𝑄w = 1.

Il registro così costruito può funzionare sia da SISO che da SIPO, in quanto si possono leggere i diversi valori
della parola 1101 sia analizzando i valori assunti da 𝑄. da ogni impulso di clock (dalla meno significativa alla
più significativa), sia analizzando, dopo quattro impulsi di clock, i valori assunti da 𝑄. , 𝑄, , 𝑄h , 𝑄w da sinistra
verso destra.
Alternativamente, il registro può essere utilizzato anche con un PISO (inserendo i valori in ingresso
43
regolando il preset e il clear di ciascun FLIP-FLOP), leggendo i valori di uscita analogamente al SISO, o come
un PIPO, combinando i funzionamenti di PISO e SIPO: in questi due casi, ovviamente, il registro non
funziona più “a scorrimento”, ma costituisce un registro di memoria.

Come ultima considerazione, immaginiamo di effettuare un collegamento in retroazione di 𝑄. , cioè il bit


meno significativo, all’ingresso seriale 𝐽• , cioè il bit più significativo. Imposta una 𝑛-upla di bit in parallelo
attraverso preset e clear, una volta attivato il clock, inizia lo scorrimento sequenziale dei diversi bit in modo
che l’ultimo bit sia inviato in entrata al primo bit della sequenza. In questo modo, all’interno del registro
scorre sempre la successione di bit impostata inizialmente. Questo tipo di registro è detto memoria
dinamica o circolare.

Il registro a scorrimento come divisore per 2


Un’utile applicazione di un registro a scorrimento lo vede effettuare l’operazione di divisione per 2: in altre
parole, in numero binario 𝐴 in entrata restituisce un numero binario 𝐵 in uscita tale che 𝐵 = 𝐴/2,
approssimando per difetto il risultato nel caso di numeri dispari.
Si immagini infatti di memorizzare una certa parola ad 𝑛 bit: se all’𝑛-esimo impulso di clock si porta
l’ingresso a 0, all’(𝑛 + 1)-esimo impulso avremo uno shif di tutti i bit verso destra; in questo modo, la cifra
più significativa diventerà 0, mentre la cifra meno significativa sarà assunta dalla seconda cifra meno
significativa. Riprendendo l’esempio del numero 1011 registrato nei quattro FLIP-FLOP, avremmo, dopo
l’(𝑛 + 1)-esimo impulso,

1011 → 0101
Il numero risultante dopo l’(𝑛 + 1)-impulso non è altro che il numero in entrata diviso per due ed
approssimato per difetto. Immaginiamo infatti di avere un numero del tipo 𝐴w 𝐴h 𝐴, 𝐴. , che, dopo l’ultimo
impulso, diventa 0𝐴w 𝐴h 𝐴, . Il numero 𝐴w 𝐴h 𝐴, “entra” nel numero 𝐴w 𝐴h 𝐴, 𝐴. una volta con resto di 𝐴. , ed
entra in 𝐴. 0 volte con resto di 𝐴. ; in binario, perciò, 𝐴w 𝐴h 𝐴, entra “10 volte” in 𝐴w 𝐴h 𝐴, 𝐴. , e cioè “2
volte” in decimale, con resto di 𝐴. : dunque 𝐴w 𝐴h 𝐴, 𝐴. /𝐴w 𝐴h 𝐴, ∼ 2, perciò 𝐴w 𝐴h 𝐴, ∼ 𝐴w 𝐴h 𝐴, 𝐴. /2.

I contatori
Contatore ad anello
Realizziamo una memoria circolare come quella descritta a pagina 34 utilizzando 𝑁 FLIP-FLOP, e si imposti,
tramite i clear e i preset, il valore 1 per 𝑄. e il valore 0 per tutti gli altri 𝑄† con 𝑖 ≠ 0. Essendo la memoria
circolare, scattato il primo impulso di clock (nel fronte di discesa, cioè all’abilitazione dello slave) il valore
𝑄. = 1 si trasmette in 𝑄, , passando poi di impulso in impulso ad ogni FLIP-FLOP da sinistra verso destra.
Un circuito del genere costituisce un contatore, cioè un circuito in grado di “scandire” (di “contare”,
appunto) gli impulsi del clock. Poiché infatti al primo impulso si ha 𝑄, = 1 e tutti gli altri 0, al secondo si ha
𝑄h = 1 e tutti gli altri 0, fino ad arrivare all’𝑛-esimo impulso dove 𝑄• = 1 e tutti gli altri 0, osservando la
posizione in cui si trova il valore alto 1 è possibile conoscere quanti impulsi di clock sono stati eseguiti.
Alternativamente, un contatore può essere utilizzato come un abilitatore sequenziale: se alle uscite 𝑄† sono

44
collegati circuiti abilitati da un ingresso alto, avremo l’abilitazione progressiva, in diversi istanti di tempo, di
ciascuno dei circuiti.

Un circuito del genere ripete lo stesso pattern di impulsi dopo 𝑁 impulsi di clock, quando il valore 1 è
ritornato in 𝑄. . Per questo viene detto divisore di frequenza per 𝑁, in quanto in grado di contare soltanto 𝑁
impulsi di clock.

Per riuscire ad aumentare il numero di conteggi effettuato da un contatore si può realizzare il seguente
circuito, detto contatore ad anello incrociato, che crea un collegamento di retroazione non con 𝑄. , ma tra
𝑄^. e l’ingresso:

Si immagini infatti di assegnare tutte le uscite a 0, in modo da avere consequenzialmente 𝑄^. = 1. Dopo il
primo impulso di clock, il valore 1 si trasmette in 𝑄, , per poi passare in 𝑄h (lasciando 𝑄, ancora al valore 1,
poiché 𝑄^. è ancora pari ad 1!), 𝑄w (lasciando 𝑄h = 1), etc. Il processo va avanti finché, dopo 𝑁 impulsi, tutti
i 𝑄† hanno assunto il valore 1, e consequenzialmente 𝑄^. = 0; da qui riparte allora il ciclo trasmettendo non
il valore 1, ma il valore 0 tra tutti i FLIP-FLOP, fino a ritornare nella condizione iniziale 𝑄. = 0 e 𝑄^. = 1
dopo altri 𝑁 impulsi di clock. In questo modo, il contatore è in grado di contare fino a 2𝑁: il contatore ad
anello incrociato è perciò detto divisore di frequenza per 2𝑁.

Contatori asincroni
I contatori ad anello possono contare fino ad 𝑁 o fino a 2𝑁: tuttavia, con 𝑁 memorie in grado di
immagazzinare due possibili stati, abbiamo 2• possibili combinazioni, quindi comprendiamo come gran
parte dell’informazione venga sprecata. Per riuscire a sfruttare al meglio le capacità di memoria dei
contatori, si costruiscono allora i cosiddetti contatori asincroni (o ripple counters), caratterizzati invece da
una struttura di tipo 𝑇 e da un clock trasmesso per interconnessioni tra FLIP-FLOP, come in figura:

45
Ogni FLIP-FLOP, come ricordiamo, presenta una struttura di master e slave 2, dove il primo è del tipo 𝑇, con
valore di ingresso 𝑇 = 1. In questo modo, in base a quanto visto a pagina 30, per ogni FLIP-FLOP vale
𝑄•°, = 𝑄^• (dove, si faccia attenzione, 𝑛 stavolta indica l’impulso del clock, non la posizione della
componente). In questo modo ognuno dei FLIP-FLOP subisce una continua commutazione dallo stato alto
allo stato basso, per ciascuno degli impulsi di clock dettato dal FLIP-FLOP precedente; occorre però
ricordare che il segnale, per poter passare da una componente all’altra, deve prima abilitare il master e poi
passare allo slave: il master cambia stato ogni volta che la forma d’onda applicata all’ingresso per il segnale
di cadenza si porta da 0 ad 1, e questo stato del master viene trasferito allo slave (che è complementare)
quando il segnale di cadenza si porta da 1 a 0. Otteniamo allora il seguente schema:

1) 𝑄. commuta in corrispondenza del fronte di discesa di ciascun impulso del clock di entrata.
Nell’impulso di salita infatti viene abilitato il master (ma 𝑄. , allo slave, non ha ancora subito la
commutazione), mentre nell’impulso di discesa viene abilitato lo slave, determinando la
commutazione finale di 𝑄. . Per poter determinare dunque un passaggio dello stato alto allo stato
basso di 𝑄. , sono necessari due impulsi di clock in entrata, dunque la frequenza è dimezzata, come
si può osservare in figura:

2) Tutti gli altri 𝑄† seguono lo stesso andamento di 𝑄. , ma ricevono in entrata un clock associato
all’uscita 𝑄†‚, ; poiché ad ogni FLIP-FLOP la frequenza si dimezza (in quanto si può avere una
commutazione di 𝑄† solo dopo due impulsi di discesa del clock generato da 𝑄†‚, ), si ha il seguente
andamento per ciascuna componente:

Come si può osservare, ad ogni impulso di clock appare una diversa parola costituita dalle uscite
𝑄• 𝑄•‚, … 𝑄, 𝑄. (in particolar modo, nel nostro esempio 𝑁 = 4): in questo modo, conscendo la parola 𝑛-
esima, si può conoscere quale sia l’impulso 𝑛-esimo del clock. Poiché il ciclo si ripete identicamente dopo
che sono state espresse tutte le possibili combinazioni (2• in tutto), il nostro contatore è in grado di
contare ben 2• passi.

2
Si osservi che nei precedenti contatori l’abilitazione di master e slave di ciascuno dei FLIP-FLOP avveniva allo stesso
momento in quanto tutti collegati ad un clock comune.
46
Alternativamente, il contatore asincrono può essere utilizzato come divisore di frequenze: ad ogni uscita si
ottiene un clock con frequenza dimezzata rispetto all’uscita precedente.

- Osservazione: attraverso il selettore 𝑎 − 𝑏, è possibile scegliere come clock di ogni FLIP-FLOP


l’uscita 𝑄^ anziché l’uscita 𝑄: in questo modo si ottiene un contatore “all’indietro”, che inverte le
commutazioni:

Generalmente, il selettore è costruito attraverso un multiplexer, che permetta il passaggio da una


configurazione all’altra a seconda dell’abilitazione degli indirizzi.

Un’applicazione del contatore asincrono: il contatore asincrono modulo 10


Come visto nel paragrafo precedente, un contatore asincrono riesce a contare 2• battiti, dove 𝑁 è il
numero di FLIP-FLOP. Dunque, è in grado di contare, in decimale, dal numero 0 al numero 2• − 1. Come
potremmo realizzare un contatore in grado di contare, ad esempio, fino a 9 (partendo da 0), che non è una
potenza di 2?
Innanzitutto, è necessario scegliere il numero di FLIP-FLOP; 3 componenti permetterebbero di contare fino
a 2w − 1 = 7, dunque sarebbero insufficienti; 4 FLIP-FLOP permettono invece di contare fino a 2w − 1 =
15: fa dunque al caso nostro, seppure saremo costretti a “sprecare” i cinque bit in eccesso.
Per riuscire a costruire un contatore modulo 10 con quattro FLIP-FLOP, è quindi necessario interrompere e
resettare il contatore una volta ottenuto, in binario, il numero 10, corrispondente al numero 1010: se così
non fosse, il contatore continuerebbe a contare fino a 15 (cioè 1111). Per farlo, si crea il seguente
collegamento attraverso una porta NAND:

Supponendo che il preset di ciascun FLIP-FLOP sia ad 1, la porta NAND restituisce il valore 1 per tutto il
tempo che 𝑄w e 𝑄, non assumono contemporaneamente il valore 1: in questa situazione, come sappiamo,
preset e clear non cambiano i valori di 𝑄† dei FLIP-FLOP. La prima volta che 𝑄w = 𝑄, = 1 si osserva quando
il contatore restituisce il numero 𝑄w 𝑄h 𝑄, 𝑄. = 1010, cioè il numero 10 in binario; in questo modo la porta

47
NAND vede in ingresso due segnali 1, e restituisce uno 0: ogni contatore allora registra i valori 𝐶𝑟 = 0 e
𝑃𝑟 = 1, che come sappiamo, azzerano i FLIP-FLOP. In questo modo il contatore viene azzerato alla cifra
0000, per poi ripartire e riazzerarsi dopo il valore 1010, come era richiesto per il contatore modulo 10.

Limiti sperimentali dei contatori asincroni


Un primo problema di carattere sperimentale dei contatori asincroni è costituito dai tempi di propagazione
del segnale. Come si è visto, è necessario un certo tempo 𝑡® affinché l’informazione passi dal master allo
slave, che si propaga e si accumula in ogni FLIP-FLOP. Questo causa una mancanza di sincronia tra le fasi di
discesa e salita del clock di partenza e di tutti gli altri FLIP-FLOP successivi, in quanto, per questi secondi, è
lo slave a determinare la commutazione degli 𝑄† .

Questi ritardi, che causano comportamenti indesiderati del contatore, possono essere superati attraverso i
contatori sincroni, dove la transizione dei FLIP-FLOP avviene in simultanea, e non accumula dunque ritardi
da parte dei FLIP-FLOP precedenti. Questi contatori non saranno tuttavia analizzati nella nostra trattazione.
Un ulteriore limite riguarda la frequenza di conteggio del contatore; essa è ovviamente limitata dai tempi di
ritardo 𝑡® dal master allo slave di ciascun FLIP-FLOP:
1 1
𝑓»¼½ = =
𝑇»¾¿ 𝑛𝑡®

Un conteggio a maggior frequenza sarebbe infatti determinato da un clock in rapida oscillazione, così
veloce che, nel passaggio del bit da master a slave, sarebbero già stati scanditi più di un impulso di clock.
Poiché, in generale, 𝑡® è dell’ordine di 100𝑛𝑠, la frequenza massima di un contatore si aggira attorno alla
decina di 𝑀𝐻𝑧.

Esempi applicativi di contatori


Il convertitore analogico-digitale (ADC)
L’ultimo argomento trattato nella parte 2 riguardava la conversione di un segnale digitale in un segnale
analogico attraverso un DAC. In paragrafo vogliamo completare la trattazione iniziata in quella sede
descrivendo il processo inverso, cioè la trasformazione di un segnale digitale in un segnale analogico,
attraverso l’utilizzo di un analog-digital converter, o ADC.

Un ADC sfrutta un DAC e un contatore nel seguente circuito:

48
Immaginiamo, di porre in ingresso la tensione 𝑉q > 0, collegata direttamente ad un comparatore;
supponendo la condizione iniziale in cui 𝑣‚ = 0, si ha 𝑉q > 𝑣‚ , e, in base a quanto appresso a pagina 32
parte 2 sugli amplificatori operazionali usati come comparatori, in uscita si osserverà una tensione “alta”
𝑣Á = 𝑉(( . La porta AND, in questo modo, viene abilitata ad ogni impulso di clock, attivando il contatore, che
inizierà a segnare i diversi “battiti”, e scandendo dunque uno ad uno i valori assunti dalla parola generata
dai bit dei suoi FLIP-FLOP. Se avessimo quattro bit, ad esempio, ad ogni impulso di clock il contatore
restituirebbe il valore 0000, 0001, 0010, 0011 etc. Questi valori vengono poi ritrasformati, in forma
analogica, da un DAC, che è collegato, a sua volta, al comparatore. Il DAC restituisce perciò in 𝑣‚ particolari
multipli di un valore di riferimento 𝑉Â , scanditi, ad ogni impulso di clock, dall’aumento di un’unità, come
nella seguente figura:

Non appena 𝑣‚ diventa tale da superare 𝑉q , e dunque 𝑉q − 𝑣‚ , come sappiamo l’amplificatore operazionale
commuta la propria uscita in −𝑉(( : la porta AND vede quindi in entrata un segnale basso ed uno alto, e si
disabilita, fermando il contatore. Poiché lo “stop” avviene nell’istante in cui 𝑉q supera 𝑣‚ , il contatore viene
bloccato quando 𝑉q ∼ 𝑣‚ e si può quindi leggere, dai valori in uscita del contatore, la rappresentazione
digitale della tensione analogica in ingresso 𝑉q .
Si osservi che, affinché un simile apparato strumentale possa funzionare, la tensione da “digitalizzare” 𝑉q
deve rimanere costante; se così non fosse, il campionamento dovrebbe avvenire in istanti di tempo così
piccoli da non determinare variazioni significative di 𝑉q . Inoltre, l’ADC non è in grado di convertire qualsiasi
tensione, a causa del numero limitato di bit a sua disposizione.
Questo tipo di ADC ha il grosso difetto di richiedere spesso lunghi tempi di conversione. Prima di poter
restituire il valore della tensione in forma digitale, infatti, è necessario che si arrivi all’impulso 𝑛 di clock per
cui valga 𝑉q ∼ 𝑣‚ : se 𝑇 è il periodo del clock, perciò, bisognerebbe attendere un periodo di 𝑛𝑇 prima di
poter ottenere il segnale digitalizzato. Poiché questo intervallo di tempo potrebbe essere eccessivamente
lungo, si attuano metodi di digitalizzazione più raffinati: uno di questi sfrutta il cosiddetto ADC parallelo o
flash ADC.
Un flash ADC sfrutta più tensioni di riferimento in parallelo, in modo da effettuare più confronti
contemporaneamente, come nella seguente figura:

49
Come si osserva, grazie al partitore di tensione, la tensione di riferimento 𝑉Â si riduce ad ogni morsetto
𝑣°Ã , determinando dunque diverse soglie per ciascuno degli amplificatori operazionali: all’uscita di
ciascuno di essi, si registrerà un segnale basso se e solo se 𝑣°Ã è maggiore della tensione analogica da
convertire 𝑉q ; al contrario, si registrerà un segnale alto in uscita per tutti quei comparatori tale che 𝑣°Ã <
𝑉q . Ad esempio, se 𝑣°v < 𝑉q < 𝑣°~ , poiché 𝑣°u < 𝑣°v , le uscite del primo e del secondo amplificatore
saranno alte, mentre tutte le altre saranno basse. Il codificatore a priorità è un circuito in grado di
restituire, come segnale in uscita, l’indirizzo del primo amplificatore operazionale che ha assunto, in uscita,
il valore basso: in questo modo si può conoscere il range, in bit, entro cui è compreso il segnale analogico in
entrata 𝑉q .

Misure di tempo e di frequenza


Un contatore può essere sfruttato per misurare l’intervallo di tempo trascorso tra l’arrivo di due impulsi.
Immaginiamo infatti di collegare il contatore, tramite una porta AND, ad un clock ed un FLIP-FLOP 𝑆𝑅,
quest’ultimo ricevente i due impulsi alle entrate 𝑆 ed 𝑅:

Immaginiamo, all’istante 𝑡. = 0, che 𝑆 = 𝑅 = 0: in base a quanto appreso a pagina 37, questo non
determina modifiche al valore di uscita 𝑄. Ad n certo istante 𝑇, > 𝑡. , in 𝑆, viene ricevuto un impulso
positivo di breve durata, che porta il FLIP-FLOP nella configurazione 𝑆 = 1, 𝑅 = 0 (solo per la durata
dell’impulso, subito dopo 𝑆 torna a 0), e conseguentemente 𝑄 = 1: questo attiva il clock del contatore, che
inizia il suo conteggio reso visibile analogicamente da un display. Ad un nuovo istante 𝑇h arriva un secondo
impulso, stavolta in 𝑅: il FLIP-FLOP assume la configurazione 𝑆 = 0, 𝑅 = 1 e dunque 𝑄 = 0: la porta AND si
disattiva, e il contatore smette di contare, come schematizzato nel disegno:

50
Grazie al display è possibile contare il numero di conteggi 𝑛 effettuati dal contatore durante il suo periodo
Δ𝑡 = 𝑇h − 𝑇, di attivazione; conosciuta la frequenza 𝑓 del clock, perciò, è possibile determinare Δ𝑡
attraverso…

𝑛
𝑇h − 𝑇, =
𝑓

…con un’incertezza su 𝑛 assimilabile a ±1 cicli. Osserviamo che, poiché 𝑓 è al denominatore, maggiore è la


frequenza del clock, minore è l’incertezza sul tempo.
Viceversa, se non si conoscesse la frequenza del conteggio ma fosse conosciuto il tempo tra due impulsi
attraverso un segnale di riferimento (ad esempio, un impulso quadrato), sarebbe possibile determinare 𝑓
dalla relazione precedente.

Misure di velocità
Immaginiamo di riprendere il circuito precedente, e di collegare le entrate del FLIP-FLOP 𝑆𝑅 a due rivelatori
di particelle (che saranno oggetto della nostra analisi nella parte 4) nella seguente struttura.

I rivelatori sono posti ad una certa distanza Δ𝑥 e, all’arrivo di una particella, inviano un segnale luminoso in
seguito convertito in un impulso elettrico da dei discriminatori, collegati direttamente ai due ingressi 𝑆 ed
𝑅. Poiché la particella arriva al primo e al secondo rivelatore in istanti diversi, gli impulsi arriveranno, in 𝑆
ed 𝑅, ad istanti 𝑇, e 𝑇h differenti: l’intervallo Δ𝑡 può essere misurato come descritto nel paragrafo
precedente, in modo da determinare, conosciuto Δ𝑥, la velocità media 𝑣 = Δ𝑥/Δ𝑡 della particella.

51
Bibliografia
J. Millman – Circuiti e sistemi microelettronici, Bollati Boringhieri (1985);

J. Millman, A. Grabel, P. Terreni – Elettronica di Millman, McGraw-Hill Education (2008);

W. R. Leo – Techniques for nuclear and particle physics experiments: a how-to apporach, Springer-Verlag
(1987);

V. Aita – Appunti di Aita di Laboratorio 3.

52