Addizionatori: metodo Carry-Lookahead Costruzione di circuiti

Transcript

Addizionatori: metodo Carry-Lookahead Costruzione di circuiti
Addizionatori: metodo Carry-Lookahead
Costruzione di circuiti combinatori
Standard IEEE754
Addizionatori
Il circuito combinatorio che implementa l’addizionatore a n bit si basa su
1-bit adder collegati in sequenza
- il circuito usa lo stesso metodo usato dall’algoritmo carta e
penna
- il segnale deve attraversare più livelli di logica
- porte con fan-in limitato
Addizionatori
"
La tabella di verità dell’addizionatore a singolo bit
A
0
0
0
0
1
1
1
1
B CarryIn
0
0
0
1
1
0
1
1
0
0
0
1
1
0
1
1
Sum
0
1
1
0
1
0
0
1
CarryOut
0
0
0
1
0
1
1
1
CarryOut
CarryIn
AB
00 01 11 10
1
0
1
1
1
1
Sum
AB
CarryIn 00 01 11 10
1
1
0
1 1
1
Sum = (~A ~B CarryIn) + (~A B ~CarryIn) +
(A B CarryIn) + (A ~B ~CarryIn)
CarryOut = (B CarryIn) + (A CarryIn) + A B
1-bit ALU
"
1-bit ALU usata per eseguire le istruzioni macchina seguenti:
– and $2, $3, $4
– or $2, $3, $4
– add $2, $3, $4
Operation
CarryIn
a
0
– Operation è un segnale di controllo
a 2 bit
" determina il tipo di operazione che
l’ALU deve eseguire
– l’ALU ? la tipica componente che fa
parte del Datapath (Parte operativa)
del processore
– La Parte Controllo comanda l’esecuzione
delle varie istruzioni
" settando opportunamente i segnali
di controllo dell’ALU (e delle
altre componenti della Parte
operativa)
1
2
b
CarryOut
Result
32-bit ALU
- catena di 1-bit ALU con
propagazione del Carry
- segnale di controllo per
determinare l’operazione
che l’ALU deve eseguire:
Operation propagato a
tutte le 1-bit ALU
- Il segnale CarryIn di ogni
ALU viene propagato sulla
ALU successiva
ALU & somma veloce
Considerazioni sulla velocità dell’ALU nell’eseguire la somma:
"
"
"
l’ingresso CarryIn dipende dal funzionamento dell’adiacente
sommatore a 1 bit
se si risale lungo la catena delle dipendenze, si nota che il bit più
significativo della somma è legato a quello meno significativo
il bit più significativo della somma deve attendere la valutazione
sequenziale di 32 sommatori a 1 bit ==> LENTO
... ci sono metodi per velocizzare il calcolo del riporto,
cercando di far passare il segnale per un numero
minore di porte. Uno di questi metodi è il Carry Lookahead
Carry Lookahead
L’equazione generale per il calcolo di CarryOut è
CarryOut = (B•CarryIn) + (A•CarryIn) + A•B
Il CarryOut di un 1-bit adder è il CarryIn del 1-bit adder successivo:
CarryIn1 = (b0•CarryIn0) + (a0•CarryIn0) + a0•b0
CarryIn2 = (b1•CarryIn1) + (a1•CarryIn1) + a1•b1
.....
In forma più compatta si può scrivere:
c1 = (b0c0) + (a0c0) + a0b0
c2 = (b1c1) + (a1c1) + a1b1
......
Sostituendo in c2 l’espressione relativa a c1 si ottiene
c2 = (b1a0b0)+(b1a0c0) +(b1b0c0)+(a1a0b0)+(a1a0c0)+(a1b0c0)+(a1b1)
L’equazione si espande in modo esponenziale a mano a mano che
si passa a bit di ordine più elevato ==> hardware costoso
Carry Lookahead
Come semplificare il calcolo di ci+1?
ci+1 = (bici) + (aici)+(aibi) = (aibi) + (ai+bi)ci
= gi + pi ci
gi = GENERAZIONE
se gi = 1 allora ci+1 = gi + pici = 1 + pici = 1
cio? il sommatore genera 1 indipendentemente dal valore di ci
pi = PROPAGAZIONE
se gi = 0 e pi = 1 allora ci+1 = 0 + 1ci = ci
cioè il sommatore propaga il CarryIn sul CarryOut
Quindi:
ci+1 = 1 se gi = 1 oppure pi = 1 e ci = 1
ci+1 = 0 altrimenti
Carry Lookahead
Per un sommatore a 4 bit si ha:
c1 = g0 + p0c0
c2 = g1 + p1c1 = g1 + (p1g0) + (p1p0c0)
c3 = g2 + p2c2 = g2 + (p2g1) + (p2p1g0)
+ (p2p1p0c0)
c4 = g3 + p3c3 = g3 + (p3g2) + (p3p2g1)
+ (p3p2p1g0) + (p3p2p1p0c0)
Il segnale CarryIn vale 1 se qualche
sommatore precedente ha generato
un riporto e tutti i sommatori intermedi
lo propagano
Carry Lookahead
Il sommatore con Carry Lookahead visto alla pagina precedente genera comunque
lunghe equazioni. . . non è pensabile realizzarlo per blocchi
superiori a 4 bit
Allora si considera il sommatore a 4 bit con logica di Carry Lookahead
come blocco elementare
"
"
attraverso il riporto si collegano blocchi simili in cascata
per 16bit la somma sarà più veloce rispetto alla versione senza Carry
Lookahead: vediamo come viene realizzato ...
Carry Lookahead
Per eseguire il Carry Lookahead con i sommatori a 4bit è necessario considerare i
segnali genera e propaga di “ordine superiore”
Il segnale di propagazione uscente da un sommatore a 4bit è vero solo se ciascuno
dei bit del gruppo propaga un riporto
P0 = p3p2p1p0
P1 = p7p6p5p4
P2 = p11p10p9p8
P3 = p15p14p13p12
Il segnale di generazione uscente da un sommatore a 4bit è vero se
" genera è vero per il bit più significativo o
" un precedente genera è vero e tutti i segnali propaga intermedi, incluso
quello del bit più significativo, sono anch’essi veri
G0 = g3 + (p3g2) + (p3p2g1) + (p3p2p1g0)
G1 = g7 + (p7g6) + (p7p6g5) + (p7p6p5g4)
G2 = g11 + (p11g10) + (p11p10g9) + (p11p10p9g8)
G3 = g15 + (p15g14) + (p15p14g13) + (p15p14p13g12)
Carry Lookahead
Ecco come vengono generati i segnali P0 e G0:
Carry Lookahead
Le equazioni per il riporto in ingresso ad ogni gruppo di sommatori a 4bit
all’interno di un sommatore a 16 bit sono:
C1 = G0 + P0c0
C2 = G1 + (P1G0) + (P1P0c0)
C3 = G2 + (P2G1) + (P2P1G0) + (P2P1P0c0)
C4 = G3 + (P3G2) + (P3P2G1) + (P3P2P1G0) + (P3P2P1P0c0)
Il meccanismo del Carry Lookahead rende il calcolo dei riporti più veloce
perchè prevede l’uso di un numero minore di porte logiche per trasmettere il segnale
di riporto in ingresso ==> il tempo di risposta è minore
Carry Lookahead
Sommatore a 16bit composto di quattro
ALU a 4bit con logica di Carry-Lookahead
Si osservi che i riporti provengono
dall’unità di Carry-Lookahead e non
dalle ALU a 4 bit
Carry Lookahead
Esempio: calcolare i segnali gi, pi, Gi, Pi per i seguenti due numeri
a
b
gi = aibi
pi = ai + bi
0010 1011 1111 1000
0001 0100 1101 0110
0000 0000 1101 0000
0011 1111 1111 1110
I segnali Pi per gruppi di 4bit sono dati dall’AND dei relativi pi
P3 = 0•0•1•1 = 0
P2 = 1•1•1•1 = 1
P1 = 1•1•1•1 = 1
P0 = 1•1•1•0 = 0
I segnali Gi sono dati da:
G0 = g3+(p3g2)+(p3p2g1)+(p3p2p1g0) = 0+(1•0)+(1•1•0) +(1•1•1•0)=0
G1 = g7+(p7g6)+(p7p6g5)+(p7p6p5g4) = 1+(1•1)+(1•1•0) +(1•1•1•1)=1
G2 = g11+(p11g10)+(p11p10g9)+(p11p10p9g8)=0+(1•0)+(1•1•0) +(1•1•1•0)=0
G3 = g15+(p15g14)+(p15p14g13)+(p15p14p13g12)=0+(0•0)+(0•0•0) +(0•0•1•0)=0
Carry Lookahead
Esempio (continua): la somma a+b genera riporto?
E' sufficiente calcolare il riporto dell’ultimo sommatore a 4bit:
C4 = G3 + (P3G2) + (P3P2G1) + (P3P2P1G0) + (P3P2P1P0c0)
= 0 + (0•0) + (0•1•1) + (0•1•1•0) + (0•1•1•0•0)
=0 + 0 + 0
+0
+0
=0
Realizzazione di circuiti combinatori
Esercizio: Dati tre ingressi A, B, C realizzare un circuito che
fornisca in uscita tre segnali
D è vera se almeno uno degli ingressi è vero
E è vera se esattamente due input sono veri
F è vera se tutti e tre gli input sono veri
A B C
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
D E F
0
1
1
1
1
1
1
1
0
0
0
1
0
1
1
0
0
0
0
0
0
0
0
1
Somme di Prodotti
D = (∼A∼BC)+(∼AB∼C)+(∼ABC)+
(A∼B∼C)+(A∼BC)+(AB∼C)+(ABC)
E = (∼ABC)+(A∼BC)+(AB∼C)
F = ABC
Realizzazione di circuiti combinatori
Esercizio: (continua) Realizzare le uscite D, E, F mediante PLA
(Programming Logic Array)
D = (∼A∼BC)+(∼AB∼C)+(∼ABC)+
(A∼B∼C)+(A∼BC)+(AB∼C)+(ABC)
E = (∼ABC)+(A∼BC)+(AB∼C)
F = ABC
Realizzazione di circuiti combinatori
Esercizio: Realizzare l’uscita E dell’esercizio precedente
E = (∼ABC)+(A∼BC)+(AB∼C) nei seguenti casi:
1. utilizzando porte AND e OR a
due ingressi
2. utilizzando porte NAND a tre
ingressi
Realizzazione di circuiti combinatori
Esercizio: (continua) E = (~ABC)+(A∼BC)+(AB∼C)
Realizzazione utilizzando porte AND e OR a due ingressi
Realizzazione di circuiti combinatori
Esercizio: (continua) E = (∼ABC)+(A∼BC)+(AB∼C)
Realizzazione utilizzando porte NAND a tre ingressi
E = (∼ABC)+(A∼BC)+(AB∼C) = [applico De Morgan]
∼[∼(∼ABC) • ∼(A∼BC) • ∼(AB∼C)]
Realizzazione di circuiti combinatori
Esercizio: (continua)
Realizzare il circuito usando
porte AND e OR a due soli
ingressi
E = ∼A∼B∼C + ∼A∼C∼D + ∼B∼C∼D + ∼A∼B∼D +
BCD + ABC + ABD + ACD
Realizzazione di circuiti combinatori
Esercizio: (continua) E = ∼A∼B∼C + ∼A∼C∼D + ∼B∼C∼D + ∼A∼B∼D +
BCD + ABC + ABD + ACD
Provate a
semplificarlo
raggruppando
opportunamente
i segnali di ingresso
Rappresentazione dei numeri razionali
in virgola mobile (floating point)
Un numero reale R può essere scritto come R = ±m•Be
m = mantissa
e = caratteristica
B = base
Esempi: B = 10
R1 = 3.1569 x 103
R2 = 2054.00035 x 10-6
R3 = 0.1635 x 102
R4 = 0.0091 x 10-12
notazione scientifica: m = 0 . d-1...d-k
" notazione scientifica normalizzata: m = d . d ...d
0
-1
-k
(per B=2 si ha d0 = 1 fisso!!)
"
con d0 ≠ 0
Rappresentazione dei numeri razionali
in virgola mobile (floating point)
Una volta fissato il numero di bit totale per la rappresentazione dei
numeri razionali rimane da decidere
quanti bit assegnare per la mantissa ?
(maggiore ? il numero di bit e maggiore ? l’accuratezza con cui
si riescono a rappresentare i numeri)
"
quanti bit assegnare per l’esponente ?
(aumentando i bit si aumenta l’intervallo dei numeri rappresentabili)
"
OVERFLOW: si ha quando l’esponente positivo è troppo grande
per poter essere rappresentato con il numero di bit
assegnato all’esponente
UNDERFLOW: si ha quando l’esponente negativo è troppo grande
per poter essere rappresentato con il numero di bit
assegnato all’esponente
Standard IEEE754
"
Standard IEEE754: Singola precisione (32 bit)
si riescono a rappresentare numeri 2.010 • 2-38 ÷ 2.010 • 238
"
Standard IEEE754: Doppia precisione (64 bit)
si riescono a rappresentare numeri 2.010 • 2-308 ÷ 2.010 • 2308
Standard IEEE754
Si osservi che m = d0 . d-1...d-k con d0 = 1 fisso.
Lo standard IEEE754 sceglie di rendere d0 = 1 implicito, mettendo un
circuito che somma automaticamente 1 alla cifra espressa dalla mantissa.
Così si guadagna un bit per la rappresentazione della mantissa e si aumenta
l’accuratezza dei numeri razionali espressi
Il numero espresso ? quindi:
(-1)S• (1 + m) • 2e
Ma .... come si rappresenta lo zero?
m = 00...0 ma non si deve sommare 1 ==> si usa l’esponente nullo come
valore riservato per indicare al circuito di non sommare 1
Quindi lo zero viene rappresentato come:
Standard IEEE754
Come rappresentare i numeri in modo che sia facile realizzare il confronto
tra interi (pensando soprattutto all’ordinamento)?
Lo standard IEEE754 ha scelto:
" la posizione del segno in modo che sia facile il test >0 , <0, =0
" la posizione dell’esponente (prima della mantissa) per
semplificare l’ordinamento dei numeri rappresentati
==> per esponenti con lo stesso segno il confronto è facile
Però gli esponenti negativi rappresentano un problema per l’ordinamento.
Infatti, usando il complemento a due,
esponente negativo ==> bit più significativo a 1
e quindi un esponente negativo appare come un numero grande
(leggendolo come semplice numero binario)
Esempio: 1.0 • 2-1
Esempio: 1.0 • 21
Standard IEEE754
Una buona rappresentazione deve denotare l’esponente “più negativo”
come 00...02 e quello “più positivo” come 11...12
Lo standard IEEE754 utilizza la notazione polarizzata
Singola precisione: polarizzazione pari a 127 = 011111112
" Doppia precisione: polarizzazione pari a 1023 = 01111111111
2
"
Allora, ad esempio:
esponente -125 rappresentato come -125+127 = 000000102
" esponente -1 rappresentato come -1+127 = 126 = 01111110
2
" esponente 0 rappresentato come 0 + 127 = 127 = 01111111
2
" esponente +1 rappresentato come 1+127 = 128 = 10000000
2
" esponente +125 rappresentato come 125+127=252=11111100
2
"
Standard IEEE754
Per leggere un numero in notazione polarizzata si usa la regola:
(-1)S•(1+m)•2(e - polazizzazione)
Per scrivere un numero in notazione polarizzata bisogna:
" non rappresentare la parte intera della mantissa (il bit 1 prima
della virgola)
" aggiungere all’esponente la polarizzazione
Con la notazione polarizzata gli esponenti variano
" da -126 a +127 per la singola precisione
" da -1022 a +1023 per la doppia precisione
Si noti che:
l’esponente 00...0 è riservato per lo zero
" l’esponente 11...1 è riservato per casi particolari
(fuori dall’insieme dei valori rappresentabili)
"
Standard IEEE754
Esempio: scrivere - 0. 2510 in notazione floating point, usando lo standard
IEEE754
- 0. 2510 = - 0. 012 = - 1. 0 • 2-2 = (-1)1 • (1 + 0.0) • 2(-2+127)
Esempio: Quale numero decimale rappresenta la seguente sequenza di bit,
letta secondo lo standard IEEE754?
esponente: 000010112 = 1310
mantissa: 0.012 = 0. 2510
Il numero rappresentato è: (-1)1•(1+ 0.25)•2(13-127) = - 1. 25 •2(-114)