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)