Inleiding Digitale Techniek Week 4 Binaire optellers, tellen, vermenigvuldigen, delen Jesse op den Brouw INLDIG/25-26
Optellen Optellen is één van meest gebruikte rekenkundige operatie in digitale systemen. Elke general purpose microprocessor heeft een optelcircuit aan boord. Daarnaast is het eenvoudig een optelschakeling om te zetten in een aftrekschakeling. Een speciaal geval van optellen (add) is verhogen met één (increment). Veel processoren hebben ook een telschakeling (counter). 2
Optellen Optellen in het binaire systeem is identiek aan optellen in het decimale systeem. Ook alle andere rekenregels zijn identiek. Vermenigvuldigers kunnen worden gemaakt met behulp van optelschakelingen. Eerst wordt er uitgegaan van niet-negatieve* gehele getallen. * niet-negatief = unsigned 3
Optellen Het optellen van twee decimale cijfers levert een decimaal getal op van maximaal twee decimale cijfers: 4 5 9 + 5 + 5 + 9 + 9 8 Als het antwoord groter wordt dan 9, moet een overloop (carry) naar de volgende kolom worden doorgegeven. Het is hierdoor mogelijk twee getallen van willekeurige lengte op te tellen. 4
Optellen Het optellen van twee decimale getallen gebeurt kolomsgewijs. Als het resultaat van een kolomoptelling groter is dan 9, moet een carry naar de volgende kolom worden doorgegeven. carry 9 6 4 9 9 7 3 9 + 9 3 8 8 5
Binaire opteller Om inzicht te krijgen in het optellen van twee binaire cijfers moeten de vier mogelijkheden bekeken worden. + + + + In de eerste drie gevallen past de uitkomst (de som) ook in één binair cijfer. Bij de optelling + moet het resultaat met twee binaire cijfers worden weergegeven (er is een overloop). 6
Optellen Optellen in het binaire systeem is identiek aan optellen in het decimale systeem. In totaal moeten er per kolom drie bits worden opgeteld. In het voorbeeld worden twee 8-bit getallen opgeteld. carry getal A getal B + 7
Optellen Het is mogelijk om een optelschakeling te ontwerpen voor twee binaire getallen. Hiervoor wordt een overgang gemaakt van numerieke -en en -en naar logische -en en -en: numeriek logische numeriek logische Eerst wordt gekeken naar een optelschakeling voor twee binaire cijfers. 8
Half adder Voor deze opteller kan een waarheidstabel worden opgesteld. De variabelen a en b zijn de aangeboden bits. De variabele c out is het carry-bit en s is het sombit. De functies zijn eenvoudig: a b c out s c out s a b a b 9
Half adder Dit wordt in de digitale techniek een half adder genoemd. Het schema: a b = s a HA s & c out b c out
Full adder Een full adder is in staat om drie bits op te tellen. De variabelen a en b zijn de bits van de getallen. De variabele c in is de inkomende carry. c out is de uitgaande carry. c in a b c out s
Full adder De functie voor s is eenvoudig te vinden: s c in ( a b) c ( a b) Dit kan worden omgewerkt naar: in c in a b c out s s c ( a b) in c in a b De exor heeft de associatieve eigenschap. 2
Full adder De functie voor c out is als volgt: c in a b c out s c out c in ( a b) c ( a b) in Dit kan worden omgewerkt naar: c out a b a c in b c in Maar ook naar: c out a b c in ( a b) 3
Full adder Het schema kan als volgt worden opgebouwd. FA = = s s cin ( a b) c in a b & & c out c out a b a c in b c in & 4
Full adder Als alternatief kan de full adder ook als volgt worden opgebouwd. FA c in HA HA a b = & = & s c out s cin ( a b) c out a b c in ( a b) 5
4-bit Full Adder Een 4-bit opteller kan worden opgebouwd uit een cascade-schakeling van -bit full adders. De getallen A en B worden opgesplitst in hun afzonderlijke bits. De bits krijgen een index: a 3 a 2 a a en b 3 b 2 b b De indexnummers komen overeen met de posities van de afzonderlijke binaire cijfers en geven ook de exponent van het gewicht aan (a 3 2 3, ). De naamgeving van c in en c out verandert: de inkomende c-bit krijgt hetzelfde nummer als de a- en b-bits, de uitgaande c-bit krijgt één hoger: a b c in = c, c out = c 2 6
4-bit Full Adder Een 4-bit opteller kan worden opgebouwd uit een cascadeschakeling van -bit full adders. a 3 b 3 a 2 b 2 a b a b 4-bit FA FA c 3 FA c 2 FA c FA c c 4 s 3 s 2 s s c 4 kan als 5 e sombit gebruikt worden 7
4-bit Full Adder Het voordeel van deze realisatie is dat er maar één logische schakeling hoeft worden te ontworpen en het systeem is eenvoudig uitbreidbaar. Het nadeel van deze realisatie is dat het lang duurt om de juiste waarde voor de uitgaande c 4 -bit te krijgen. Na het instellen van de getallen A en B en carrybit c, kost het enige tijd voordat c 4 beschikbaar is. Dit wordt een ripple carry adder genoemd. Deze vertraging heeft geleid tot een scala aan andere implementaties: carry look-ahead, carry-select, carry-skip, carry-completion. Deze implementaties zijn allemaal bedoeld om het berekenen van de carry s te versnellen. 8
Opgaven Tel de volgende binaire getallen op: + + + Toon aan dat: c out c ( a b) c ( a b) in in a b a c in b c in Toon aan dat: c out a b a c in b c in a b c in a b Als de functies van s en c out vanuit de -en zouden worden gemaakt, wordt de functie dan kleiner (minder poorten)? 9
Tellen De bewerking tellen komt in veel schakelingen voor. Meestal betreft het toepassingen waarbij wordt bijgehouden hoeveel keer een bepaalde gebeurtenis optreedt. Tellen wordt meestal gedaan in het binaire stelsel, maar het is heel goed mogelijk in het decimale systeem te tellen. In dit geval worden de decimalen in de BCD-code voorgesteld. Tellers hebben de eigenschap een getelde hoeveelheid te onthouden. Dat betekent dat tellers geheugen bezitten. 2
Tellen Tellers worden vrijwel altijd modulair opgebouwd (bv in processoren: 8 bits, 6 bits). In de BCD-code is dat van nature vier bits. Een cyclus van een 3-decaden teller loopt van BCD tot 999 BCD, waarna de teller weer in BCD start. Zo n teller heet cyclisch. 2 3... 99 2... 999 2... cyclus start opnieuw 2
Telcyclus 4-bit teller Hieronder een voorbeeld van een 4-bit binaire teller. cyclus start opnieuw Duidelijk is dat bij de huidige telstand steeds wordt opgeteld om de nieuwe telstand te krijgen. Dit kan dus met een opteller waarvan één getal de vaste waarde krijgt. 22
Verhogen met één Als voorbeeld verhogen we onderstaand getal met. Verwisselen van c met b levert iets moois op: c c + + B is! 23
Waarheidstabel De waarheidstabel voor de full adder kan aanzienlijk vereenvoudigd worden. Alle regels met b = kunnen worden geschrapt. Alleen de regels met b = blijven over. Aangezien b altijd is kan deze kolom worden geschrapt. c in a b c out s 24
Half adder De waarheidstabel wordt vereenvoudigd. Dit is een half adder. Een telschakeling kan dus gemaakt worden door een cascadeschakeling van half adders. c in a c out s 25
4-bit incrementer Hieronder het resultaat. Merk op dat de carry-ingangen nu verdwenen zijn en de carry-uitgangen zijn verbonden met de b-ingangen. a 3 a 2 a a HA HA HA HA 4-bit incrementer c 4 s 3 s 2 s s wordt niet gebruikt, of carry naar volgende sectie 26
Opgave Hieronder is de full adder die eerder is besproken nog eens afgebeeld, maar nu is de b-ingang aan een logische gekoppeld. Vereenvoudig het schema ( minimaliseer b weg ). Doe hetzelfde voor b is logisch. c in a = & = & s c out 27
Subtractor Op eenzelfde wijze als het ontwerpen van een optelschakeling, kan ook een aftrekschakeling gemaakt worden. In de praktijk wordt echter een optelschakeling gebruikt en wordt de wiskundige gelijkheid gebruikt: A B = A + (-B) Dit vereist echter wel het gebruik van negatieve getallen. Negatieve binaire getallen worden later behandeld. 28
Vermenigvuldigen Het vermenigvuldigen van twee getallen is erg gemakkelijk in het binaire systeem. Er zijn maar drie tafels nodig: voor, en. Als voorbeeld een vermenigvuldiging in het decimale systeem. 39 283 73 328 782 653 x + deelvermenigmuldigingen leveren deelantwoorden die groter zijn dan 9. één plek opschuiven, want 8 is een tiental twee plekken opschuiven, want 2 is een honderdtal lastig, meerder rijen optellen 29
Vermenigvuldigen In het binaire systeem werkt het net zo: x + Vermenigvuldigen is eenvoudig: Vermenigvuldigen met levert! Vermenigvuldigen met levert getal! -en schuiven voor tweetal, viertal, Nadeel: multi-input opteller nodig Maximaal 4+4 = 8 cijfers 3
Vermenigvuldigen De multi-input opteller kan vermeden worden door tussentijds op te tellen: x + + + standaard optellers 3
Vermenigvuldigen Er zijn maar twee tafels nodig: de tafel van en van. Deze kunnen gecombineerd worden. = = = = Dit is precies de tabel van een AND! Een vermenigvuldiger is te bouwen uit ANDs en optellers. 32
Vermenigvuldigen Hardware ontwikkelen gaat ook eenvoudig: a 3 a 2 a a b 3 b 2 b b a 3 b a 2 b a b a b a 3 b a 2 b a b a b a 3 b 2 a 2 b 2 a b 2 a b 2 a 3 b 3 a 2 b 3 a b 3 a b 3 p 7 p 6 p 5 p 4 p 3 p 2 p p x + p = product term 33
Vermenigvuldigen Hardware voor deze oplossing: a 3 a 2 a a 4-bit Full Adders b 3 b 2 b b a 3 b a 2 b a b a b a 3 b a 2 b a b a b pp 4 pp 3 pp 2 pp pp a 3 b 2 a 2 b 2 a b 2 a b 2 pp 4 pp 3 pp 2 pp pp a 3 b 3 a 2 b 3 a b 3 a b 3 p 7 p 6 p 5 p 4 p 3 p 2 p p x x + + + pp = partial product term p = product term 34
Vermenigvuldigen a 3 b a 2 b a 3 b a b a 2 b a b a b a b Hardware: & HA & & FA & & FA & HA & & a 3 b 2 a 2 b 2 a b 2 a b 2 & & & & FA FA FA HA a 3 b 3 a 2 b 3 a b 3 a b 3 & & & & FA FA FA HA p 7 p 6 p 5 p 4 p 3 p 2 p p 35
Vermenigvuldigen Het langste pad van a b of a b naar p 7 is 8 optelsecties. Het kan slimmer met een carry-save structuur. Dit wordt niet besproken. 36
Vermenigvuldigen Natuurlijk kan een vermenigvuldiger ook volgens de bekende oplossingsstructuur van digitale systemen worden ontworpen. Stel een waarheidstabel op met 2x vier ingangen en acht uitgangen: a 3 a 2 a a b 3 b 2 b b p 7 p 6 p 5 p 4 p 3 p 2 p p.. 37
Vermenigvuldigen Dit levert echter zeer veel logica op. Een groot gedeelte van het ICoppervlakte wordt dan gebruikt voor de multiplier. Let hier op tijdens het gebruik van de * -operator in VHDL. library ieee; use ieee.std_logic_64. all; use ieee.numeric_std. all; entity vmul8x8i is port ( x: in unsigned (7 downto ); y: in unsigned (7 downto ); p: out unsigned (5 downto ); ); end vmul8x8i; architecture vmul8x8i_arch of vmul8x8i is begin p <= x*y; end vmul8x8i; 38
Vermenigvuldigen met een constante Een vermenigvuldiging met een constante kan eenvoudig worden omgezet naar een serie optellingen. Bijvoorbeeld: vermenigvuldigen met 3 x = 2 x 2 Het getal is te schrijven als 8 + 2 + = 2 3 + 2 + 2 Dus de vermenigvuldiging is 3 8 + 3 2 + 3 = 3 2 3 + 3 2 + 3 2 39
Vermenigvuldigen met een constante Nu is vermenigvuldigen met 8 (2 3 ) niets anders dat drie plaatsen naar links schuiven en aanvullen met nullen. Vermenigvuldigen met 2 (2 ) is één plaats naar links schuiven en aanvullen met nullen. x = + + Vermenigvuldigen van een 4-bit getal a 3 a 2 a a met 2 : a 3 a 2 a a x 2 = a 3 a 2 a a + a 3 a 2 a a + a 3 a 2 a a 4
Vermenigvuldigen met een constante a 3 a 2 a a a 2 a a s 3 s 2 s a 3 s 4 s s 5 + a 3 a 2 a a a p 7 a a 3 a 2 a p 6 p 5 p 3 p 3 p 2 p p + + + + + s 5 a 3 a 2 a s 4 a s 3 s 2 s s + + + + p 7 p 6 p 5 p 4 p 3 p 2 p p 4
Opgaven Ontwerp volgens de bekende oplossingsstructuur van digitale systemen een 2x2-bit vermenigvuldiger. Ontwerp een schakeling die test of twee niet-negatieve 4-bit getallen gelijk zijn. Ontwerp een 4x4 bit carry save multiplier (tip: uiteraard heeft iemand dat allang gedaan). Hoeveel optellers zijn er nodig voor een 5x3-bit vermenigvuldiger? Hoe breed zijn de optellers? 42
Delen Delen gaat op vergelijkbare wijze als in het decimale systeem: : =, - -,, - 365 : = 36,5 3 65 6 5, 5, Het algoritme is gebaseerd op aftrekken als het mogelijk is en het bijtrekken van de volgende cijfers. Combinatorische delers leveren veel hardware op. 43
Referenties De volgende boeken zijn gebruikt: Digitale techniek, van probleemstelling tot realisatie deel ; A.. Thijssen; 5 e druk. Digital Design, rinciples and ractices; J.F. Wakery; 3 th Ed. Fundamentals of Digital Logic with VHDL Design, S. Brown, 3 th Ed. 44
Carry lookahead Een 4-bit full adder ontworpen als ripple carry adder heeft als nadeel dat het veel tijd kost voordat c 4 beschikbaar is, ongeveer 8 poortvertragingen. Maar c 4 kan natuurlijk ook geschreven worden als functie van de ingangen a 3 t/m a, b 3 t/m b en c. Dit levert echter heel veel hardware op. Slimmer is om uit te gaan van de functie voor de carry. 45
Carry lookahead De carry voor de eerste -bit full adder kan geschreven worden als: c a b a b ) ( c Er worden nu twee hulpfuncties geintroduceerd: G a a b b G staat voor carry generate, want het genereert een carry c onafhankelijk van de c. staat voor carry propagate, want het geeft een eventuele c door aan c. 46
47 Carry lookahead De functie voor c is nu te schrijven als Maar dan is voor c 2 te schrijven In deze functie kan de functie voor c ingevuld worden c G c 2 c G c 2 c G G c G G c G c
48 Carry lookahead En dan kan de functie voor c 3 ook uitgewerkt worden: En natuurlijk uiteindelijk de functie voor c 4 : 2 2 2 2 2 2 2 2 2 3 c G G G c G G G c G c 2 3 2 3 2 3 2 3 3 2 2 2 2 3 3 3 3 3 4 c G G G G c G G G G c G c
Carry lookahead De functie voor c 4 is nu te maken met AND2, AND3, AND4, AND5 en een OR4. Samen met de - en G-hulpfuncties levert dit een schakeling die maximaal drie poortvertragingen heeft. Deze realisatie van carry-propagatie heet carry lookahead. Op de volgende slide staat een schema voor een 4-bit Full Adder. Merk op dat de inversen van en G gegenereerd worden, dat levert snellere logica op. 49
Carry lookahead Uitvoering van de SN74283 4-bit full adder. Merk op dat de inversen van en G gegenereerd worden. 5
De Haagse Hogeschool, Delft +3-5-2663 J.E.J.opdenBrouw@hhs.nl www.dehaagsehogeschool.nl