Talrepresentation Ett tal kan representeras binärt på många sätt. De vanligaste taltyperna som skall representeras är: Heltal, positiva heltal (eng. integers) ett-komplementet, två-komplementet, sign-magnitude Decimala tal med fix tal-område Fix-tal (eng. fixed-point) Decimala tal i olika talområden Flyt-tal (eng. floating-point)
Heltal Positiva Heltal: 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 0 1 1 0 1 = 1 2 6 + 1 2 5 + 1 2 3 + 1 2 2 + 1 2 0 = 109 Men hur representerar vi negativa tal???
Sign-magnitude Heltal: S 2 5 2 4 2 3 2 2 2 1 2 0 1 1 0 1 1 0 1 = - (1 2 5 + 1 2 3 + 1 2 2 + 1 2 0 ) = - 45 Magnituden (beloppet) av talet Tecken-bit Nackdel: två nollor (+/-) 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1-komplement De negativa talen är komplementet av de positiva talen. Bit för i det positiva talet bit inverteras för att ge den negativa motsvarigheten. B=b N-1 b N-2...b 1 b 0 där b i {0,1} b N-1 b N-2... b 1 b 0 Tecken-Bit (Sign Bit) Nackdelar: Två nollor (+/-) 0. Vid vissa additioner krävs justering av resultatet.
2-komplement heltal Representation med 2-komplement B=b N-1 b N-2...b 1 b 0 där b i {0,1} Tecken-Bit (Sign Bit) Decimalvärde: b N-1 b N-2... b 1 b 0 D(B)= - b N-1 2 N-1 +b N-2 2 N-2 +...+b 1 2 1 +b 0 2 0 Detta är den vanligaste representationen av tal med tecken.
2-komplement heltal Omvandlingsexempel: B=b N-1 b N-2...b 1 b 0 där b i {0,1} 1 1 1 1 1 1 1 1 Tecken-Bit (Sign Bit) Decimalvärde: D(B)= - b N-1 2 N-1 +b N-2 2 N-2 +...+b 1 2 1 +b 0 2 0 = -128 + 127 = -1 Det är alltid det största talet som motsvarar -1.
Talkonvertering positivt tal till negativt Tvåkomplementmetoden 01111 +15 10000 invertera 10001 lägg till ett 10001-15
Talkonvertering negativt tal till positivt Tvåkomplementmetoden 10001-15 01110 invertera 01111 lägg till ett 01111 +15 Samma procedur i bägge riktningarna!
2-komplement heltal 000 Dator-register är ringar. Figuren visar ett trebitarsregister. När man räknar med tal med tecken är de negativa talen den vänstra halvan av ringen. 111 0 001-1 1 110-2 2-3 3 101-4 011 100 010
2-komplementet snabbt För att lätt ta fram 2-komplementet av ett binärtal kan man använda följande förfarande: Börja från höra sidan Kopiera alla bitar från binärtalet som är 0 och den första 1:an Invertera Invertera alla andra bitar Kopiera Exempel: 2-komplement från 110 är 010
Sign-extension Vid beräkningar i datorer behöver man ofta öka antalet siffror (bitar) inför någon beräkning hur gör man det med negativa tal? Heltal: -2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 0 1 1 0 1 = -1 2 6 + 1 2 5 +1 2 3 + 1 2 2 + 1 2 0 = - 45 Teckenbiten har negativ vikt -2 n-1 2 n-2 1 1 2 7 1 2 6 2 5 2 4 2 3 2 2 2 1 2 0 1 1 0 1 1 0 1 Om man vill utvidga talområdet genom att använda flera bitar kopierar man teckenbiten till de nya bitarna!
Addition (BV: sida 264) (+5) + (+2) (+7) 0101 + 0010 0111
Addition (BV: sida 264) ignorera (+5) + (-2) (+3) 1 1 0101 + 1110 1 0011 Carry-biten kan ignoreras!
Addition (BV: sida 264) ignorera (-5) + (-2) (-7) 1 11 1011 + 1110 1 1001 Carry-biten kan ignoreras!
Overflow Overflow teckenbiten stämmer inte överens med ingående tal... (+5) + (+5) (-6) 1 1 0101 + 0101 1010
Overflow 2 ignorera Overflow teckenbiten stämmer inte överens med ingående tal... (-5) + (-5) (+6) 1 11 1011 + 1011 1 0110 Carry-biten kan ignoreras!
Subtraktion (BV: sida 265) Låna ett (+5) - (+2) (+3) 10 0101-0010???? Hur gör man subtraktionen på ett enkelt sätt?
Subtraktion (BV: sida 265) ignorera (+5) - (+2) 0101-0010 1 1 0101 + 1110 (+3)???? 1 0011 Gör en addition med 2-komplementet i stället! Carry-biten kan ignoreras!
Subtraktion (BV: sida 265) ignorera (-5) - (+2) 1011-0010 111 1011 + 1110 (-7)???? 1 1001 Carry-biten kan ignoreras!
Subtraktion (BV: sida 265) (+5) - (-2) (+7) 1011-1110???? 0101 + 0010 0111
Subtraktion (BV: sida 265) (-5) - (-2) (-3) 1011-1110???? 1 1011 + 0010 1101
2-komplement sammanfattning Område: -2 N-1 upp till 2 N-1-1 Negation: Invertera varje bit (det boolska komplementet), addera sedan 1. Expansion av bit-längd: Lägg till ytterligare bit positioner till vänster om teckenbiten, med samma värde som teckenbiten. Overflow-regeln: Om två nummer med samma tecken adderas, så har det blivit overflow om resultatet har ett motsatt tecken. Subtraherings-regeln: För att subtrahera B från A, ta tvåkomplementet av B och addera till A.
Alternativt sätt att detektera overflow (BV: sida 271) c 4 =0 c 3 =1 (+7) + (+2) (-7) 0 1 1 0111 + 0010 1001 Overflow eftersom c 4 och c 3 är olika!
Alternativt sätt att detektera overflow (BV: sida 271) c 4 =0 c 3 =0 (-7) + (+2) (-5) 0 0 1001 + 0010 1011 Inte Overflow eftersom c 4 och c 3 är lika!
Alternativt sätt att detektera overflow (BV: sida 271) ignorera (+7) + (-2) (+5) c 4 =1 c 3 =1 1 1 1 0111 + 1110 1 0101 Inte Overflow eftersom c 4 och c 3 är lika! Carry-biten kan ignoreras!
Alternativt sätt att detektera overflow (BV: sida 271) ignorera (-7) + (-2) (+7) c 4 =1 c 3 =0 1 0 1001 + 1110 1 0111 Carry-biten kan ignoreras! Overflow eftersom c 4 och c 3 är olika!
Logik för att detektera overflow För 4-bit-tal Overflow om c 3 och c 4 är olika Annars är det inte overflow XOR testar olikhet Overflow = c 3 c 4 + c 3 c 4 = c 3 c 4 För n-bit-tal Overflow = c n 1 c n
En Snabbfråga Talet +5 representeras med 0101 om vi använder 4 bitar. Vilket tal mostvarar -5 om vi använder 8 bitars två-komplement representation? a: 1111 1011 b: 1111 1010 c: 1000 0101
Halv-adderaren (Half adder) a b HA s c a b c s 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 a b 0 1 0 1 0 0 0 1 a b 0 1 0 1 0 1 1 0 c = a b s = a b a b s c
Hel-adderaren ( Full adder ) a b c in FA s c ut a b c in c ut s 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 a b c in s c ut c in c in 0 1 ab 00 01 11 10 0 1 0 1 1 0 1 0 s = a b c in 00 01 11 10 0 0 0 1 0 1 0 1 1 1 c ut = a b + c in a + c in b
Summafunktionen? c in 00 01 11 10 0 1 0 1 1 0 0 1 1 0 s = a b c in
Summa = Udda paritet Heladderarens summafunktion är den udda -paritetsfunktionen. Detta är XOR-funktionens naturliga utökning för fler variabler än två. Udda paritet är när antalet 1:or på ingångarna är ett udda tal. b 0 a XOR 0 1 0 1 Udda paritet a b c ab Udda paritet 00 01 11 10 1 1 0 a b c Udda paritet 0 1 0 1 1 0 0 1 1 0
Carryfunktionen? 00 01 11 10 0 1 0 0 0 1 1 0 1 1 Majoritetsfunktionen. Utgången antar det som är flest 1/0 på ingångarna. M
Hel-adderaren med två ½ -adderare Vi kan även konstruera en hel-adderare mha två halv-adderare och en OR-grind a b c in FA s c ut a b c in HA HA s cut Dekomposition innebär att man ser kretsen som sammansatt av byggblock. Med hjälp av sådana kända byggblock kan man sedan bygga helt nya system Komposition.
a b c in c ut s 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 Hel-adderaren ½+ ½ = 1 c in c in a b HA Man kan använda (a b) till både s och c ut! a b HA s cut s c ut c in c in ab a b 00 01 11 10 0 0 0 1 0 1 0 1 1 1 (a b) c in c ut = (a b) c in + a b ab 00 01 11 10 0 0 1 0 1 1 1 0 1 0 s = a b c in
Populär tatuering? Tatueringar är för evigt! Tyvärr är detta inte den bästa adderarkretsen, inte om man vill ha snabba datorer. Spännande fortsättning om adderarkretsar följer
( Paritetsfunktionen trevägs ljuskontroll ) c in 0 1 00 01 11 10 0 1 0 1 1 0 1 0 Udda paritet. s = a b c in
Trevägs ljuskontroll - revisited Brown/Vranesic: 2.8.1 Antag att vi behöver kunna tända/släcka vardagsrummet från tre olika ställen. Lösningen är paritetsfunktionen. Paritetsfunktionen x 3 x 2 f x 1 x 2 x 3 Udda paritet f x 1
XOR eller NAND? x 1 x 2 x 3 Udda paritet f Den tidigare lösningen baserades på NAND-grindar. XOR-grindar blir mycket effektivare än NAND grindar! x 1 x 2 x 3 f x x 2 x 3 1 00 01 11 10 f 0 1 0 1 1 0 0 1 1 0
Enklare med XOR-grindar Med XOR-grindar: x 1 x 2 x 3 f 7486 ( Med NAND-grindar: )
( Paritetscheck ) Med paritetsfunktioner kan man kontrollera om data blivit stört eller ej. 0 P U 1 0 1 0 Data - orginal Störning! Data som överförs har alltid jämn paritet! LARM! En bit ändrad! Data har störts! 1 P U? 0 1 0 1 0 0 1 1 1 0 1 1 1 0 Paritetsbit läggs till Paritetscheck kontrollerar om udda antal 1:or Data ev fel
Mer komposition Komposition kan även användas för att konstruera n-bit-adderare Man behöver n hel-adderare för att konstruera en n-bit-adderare ( eller 2 n halvadderare )
Ripple-Carry Adderare (RCA) a 1 b 1 a 0 b 0 c ut1 FA c in1 c ut0 FA c in0 s 1 s 0 + c ut1 c ut0 b 1 a 1 s 1 c in0 b 0 a 0 s 0
Ripple-Carry Adderare (RCA) a n-1 b n-1 a 1 b 1 a 0 b 0 c utn-1 FA c inn-1 FA c in1 c ut0 FA c in0 s n-1 s 1 s 0 a n-1 b n-1... a 0 b 0 A FA area för en Fulladder t FA fördröjning genom en Fulladder c utn-1 n-bit ADD s n-1... s 0 c in0 Tidsfördröjning från c in0 till c outn-1 blir hela n t FA Totala arean blir n A FA
Ripple-Carry Adderare (RCA) a0 b0 c in0 s0 Critical path a1 b1 s1
Ripple effect = efterdyningar Carry måste rippla igenom hela adderaren!
Heladderarens Carry-funktion & AND-OR A AND-OR = 20 MOS T AND-OR = 5T NAND & NAND-NAND & >1 & & & A NAND-NAND = 14 MOS T NAND-NAND = 3T NAND &
XOR med NAND & & & & a b b a b a ab ab b a b b a a b a b b a a = + = = + + + = = + ) ( ) ( ) ( ) ( Area: A XOR =16 MOS Delay: T XOR =3T NAND
Kan vi konstruera en snabbare adderare? Fördröjningen i en rippleadderare växer proportionellt med antalet bitar För 32 bitar kan fördröjningen blir mycket stor ( 65 gate delays)
generate- och propagate- funktionerna Carry-kedjan kan beskrivas med två funktioner: Generate g i (carry-out c i+1 = 1 ifall g i = 1) p i = x i + y i g i = x i y i Propagate p i (carry-out c i+1 = 1 ifall c i = 1 och x i = 1 eller y i = 1 ) p i = x i y Fungerar också! i c = g + i+1 i p i c i c i c i x i y i 0 1 c = 0 1 c i+ 1 x 00 01 11 10 0 0 0 1 i x i y i = y i x i 0 0 0 1 y i + c i 1 0 1 1 + c ( x i i x + 00 01 11 10 = x y 1 0 1 1 + c i + c y ( x i ) i y y i+ 1 i i i i i i )
Carry-look-ahead funktion Carry-bit c 0 g i = x i y i c 1 = g 0 + p 0 c 0 Carry-bit c 1 c 2 = g 1 + p 1 c 1 = g 1 + p 1 (g 0 + p 0 c 0 ) Propagate funktionen från föregående bitar kan genereras parallellt p i = x i + y i = g 1 + p 1 g 0 + p 1 p 0 c 0 Bara två logiknivåer behövs
Carry-kedjan i ripple-adderaren #1 ½ + ½ OR eller XOR kan användas till p funktionen! p 0 c 0 g 0 p 1 g 1 #2 #3 #4 c1 c 2 #5 p 2 #6 g 2 6 grindnivåer c 3
Snabbare implementering av Carry-kedjan p 0 g 0 #1 #2 c 0 c 1 p 1 #2 g 1 #1 c 2 c 1 = g 0 +p 0 c 0 c 2 = g 1 +p 1 g 0 +p 1 p 0 c 0 Två-nivåers nät
(n = 8) med två logiknivåer c 1 =g 0 +p 0 c 0 c 2 =g 1 +p 1 g 0 +p 1 p 0 c 0.. Snabbt, men otympligt med så här många ingångar! c 8 =g 7 +p 7 g 6 +p 7 p 6 g 5 +p 7 p 6 p 5 g 4 +p 7 p 6 p 5 p 4 g 3 + + p 7 p 6 p 5 p 4 p 3 g 2 +p 7 p 6 p 5 p 4 p 3 p 2 g 1 + + p 7 p 6 p 5 p 4 p 3 p 2 p 1 g 0 + p 7 p 6 p 5 p 4 p 3 p 2 p 1 p 0 c 0 Det behövs specialgrindar till detta Ooops!
Carry-lookahead adder (CLA) 8-bit adder c s s s s s s = a a a a a a + b 8 7 6 5 4 3 2s1s0 7 6 5 4 3 2a1a0 7 6 5 4 3 2b1b 0 b b b b b a 7 b 7 a 6 b 6 a 5 b 5 a 4 b 4 a 3 b 3 a 2 b 2 a 1 b 1 a 0 b 0 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder 1-bit Full Adder c 0 s 7 s 6 s 5 s 4 s 3 s 2 s 1 s 0 c 8 p 7 g 7 c 7 p 6 g 6 c 6 p 5 g 5 c 5 p 4 g 4 c 4 p 3 g 3 Carry look ahead unit c 3 p 2 g 2 c 2 p 1 g 1 c 1 p 0 g 0 P 0 G 0 c 8 =g 7 +p 7 g 6 +p 7 p 6 g 5 +p 7 p 6 p 5 g 4 +p 7 p 6 p 5 p 4 g 3 +p 7 p 6 p 5 p 4 p 3 g 2 +p 7 p 6 p 5 p 4 p 3 p 2 g 1 + + p 7 p 6 p 5 p 4 p 3 p 2 p 1 g 0 + p 7 p 6 p 5 p 4 p 3 p 2 p 1 p 0 c 0
c 32 Hierarkisk expansion (BV sid 277) a 31-24 b 31-24 Block 3 CLA a 23-16 b 23-16 Block 2 CLA 32-bit adder a 15-8 b 15-8 Block 1 CLA a 7-0 b 7-0 Block 0 CLA G 3 P 3 S 31-24 G 2 P 2 S 23-16 G 1 P 1 S 15-8 G 0 P 0 S 7-0 c 24 c 16 c 8 P G P G 3 3 2 2PG 1 1P0 G0 c 0 P G 2 2PG 1 1P0 G0 c 0 PG P 1 1 0G0 c 0 P 0 G 0 c 0 c 0 32-bits adderare. Varje block består av en 8-bits CLA. First level four 8-bit adders with Carry lookahead Second level four Carry lookahead units
Hierarkisk expansion Carry-bitar från en andra nivåns Carry lookahead enheter C 8 = G 0 +P 0 c 0 C 16 = G 1 +P 1 G 0 +P 1 P 0 c 0 C 24 = G 2 +P 2 G 1 +P 2 P 1 G 0 +P 2 P 1 P 0 c 0 C 32 = G 3 +P 3 G 2 +P 3 P 2 G 1 +P 3 P 2 P 1 G 0 +P 3 P 2 P 1 P 0 c 0 etc. Med Carry lookahead enheter i flera nivåer kan grindar med färre ingångar användas, men varje nivå bidrar med extra grindfördröjningar.
(Carry look ahead three level hierarchy) 16-bit LCU 64-bit adder 64-bit LCU
Carry-Select-Adder (CSA) Idé Man delar upp en adderare i två steg med samma antal bitar För att snabba upp processen så räknar man ut resultatet av det andra steget i förväg för två fall Carry-in = 0 Carry-in = 1 När beräkningen av carry-biten är klar för det första steget, så väljer man resultatet av det andra steget beroende på carry-bitens värde!
8-bit Carry-Select-Adder c 8-high b[7:4] a[7:4] a[3:0] b[3:0] 1 0 Add Add Add c 8-low c 0 a b a+b = s Mux c c 8 Mux c c 4 s[7:4] s[3:0] s
Ripple-Carry Adder Jämförelse T(n)= n*2.5*t NAND, A = n*12.5t NAND +T XOR T(4)= 14T NAND, A(4) = 50 A NAND Carry-Lookahead Adder (4bits) T(4)= ~8T NAND, A(4)= 43A NAND +4*4*A NAND = ~60A NAND Carry-Select Adder (8 bits) T(8)= ~(8+4)T NAND, A(8)= ~(120+20)A NAND
Vilken är den bästa adderaren? Det finns inget entydigt svar! Ripple-adderaren tar minst plats men är långsam Carry-lookahead-adderaren tar mycket plats men är snabb Carry-select-adderaren är en kompromiss Man måste göra en trade-off mellan area och speed
Subtraktion Subtraktion kan göras genom addition med två komplementet Invertera alla bitar av den andra operanden Addera 1
Add/sub-enheten y n 1 y 1 y 0 Add/Sub = 0: Addition Add/Sub = 1: Subtraktion Add Sub control x n 1 x 1 x 0 c n n -bit adder c 0 s n 1 s 1 s 0
Arithmetic Logic Unit (ALU) Funktionsväljare f 0 f 1 AU LU A/L MUX f 0 f 1 A/L x ALU y c in Processorer brukar alltid ha en ALU, inte bara en adderare. A/L f1 f0 Funktion 0 0 0 x+y 0 0 1 x+y+c in 0 1 0 x-y 0 1 1 x-y-c in 1 0 0 x or y 1 0 1 x and y 1 1 0 x xor y 1 1 1 inv x
Komparator Komparatorn implementeras som subtraktionskrets???
Komparator Komparatorn implementeras som subtraktionskrets
Sammanfattning Addition och subtraktion av heltal Två-komplementet Subtraktion av ett tal implementeras som addition med dess två-komplement Trade-Off: Area mot Speed Olika Adder-strukturer Ripple-Carry Adder (RCA) Carry-Lookahead Adder (CLA) Carry-Select Adder (CSA)