Digitale Elektronica

Maat: px
Weergave met pagina beginnen:

Download "Digitale Elektronica"

Transcriptie

1 Elektronica en Informatiesystemen Digitale Elektronica door Prof. dr. ir. J. Van Campenhout Syllabus bij de gelijknamige Cursus Academiejaar

2 Inhoudsopgave 1 De ontwerpruimte van digitale schakelingen De ontwerpruimte De gedragshiërarchie Structuurbeschrijvingen Fysische beschrijvingen: de verpakkingshiërarchie Het Ontwerptraject Formalisering Decompositie, abstractie en verfijning Synthese en analyse Fysisch ontwerp: generatie en extractie Valideren, verifiëren en testen Systeemmodellen op logisch niveau Boole-algebra s Onmiddellijke eigenschappen Een alternatieve definitie gebaseerd op ordening Andere eigenschappen Boolese functies Representaties van Boolese functies Grafische representaties Basisfuncties voor Boolese functies Tekstuele representaties: Boolese vormen Ternaire representaties van Boolese SVP-vormen Boolese decisiediagrammen of BDD s Opgaven Combinatorische schakelingen en hun bouwstenen De relatie tussen Boolese vormen en schakelnetwerken Modellen van schakelaars Modellen van poorten en poortnetwerken Andere interconnecties Boolese matrices en de analyse van taknetwerken Bouwstenen voor combinatorisch ontwerp Standaardcomponenten Programmeerbare componenten ASIC-bouwstenen Opgaven i

3 4 Synthese van combinatorische schakelingen Tweenineausynthese Algebraïsche minimalisatie Implicantenmethoden Topologische methoden Heuristische Minimalisatie: ESPRESSO Circuitrealisaties Meerniveausynthese Concept en Motivering Factorisatie Realisaties van functies Een wat groter voorbeeld ULM s en Multiplexersynthese Spectrale Technieken Combinatorische hazards Opgaven Analyse van Sequentiële Netwerken Terugkoppelingen in schakelnetwerken Het wiskundig model van sequentiële netwerken Analyse van poortnetwerken met terugkoppelingen Afwijkingen van het voorspeld gedrag Races en meervoudige overgangen Combinatorische hazards Essentiële hazards Ternaire analyse Een korte samenvatting Geheugencellen Analyse van poortnetwerken met geheugencellen Opgaven Sequentiële schakelingen en hun bouwstenen Standaardcomponenten Sequentiële SSI-componenten Sequentiële MSI-componenten Sequentiële LSI- en VLSI-componenten Programmeerbare componenten Sequentiële synthese op logisch niveau Incrementele gedragsbeschrijvingen Het minimaliseren van het aantal toestanden De assignatie van toestanden aan binaire geheugencellen Toestandsassignatie in synchrone netwerken Toestandsassignatie in asynchrone netwerken Compositie en decompositie van synchrone automaten Cascade- en paralleldecompositie Compositieregels voor synchrone automaten: synchrone interconnecties ii

4 7.7 Asynchrone interconnecties en aansturingen Asynchrone interconnecties Synchronisatieflipflops en -protocollen Opgaven A Concrete representatievormen voor digitale systemen 243 A.1 Tekstuele vormen A.1.1 ISPS A.1.2 ABEL, ALTERA A.1.3 VHDL A.2 Grafische beschrijvingsvormen A.2.1 PMS A.2.2 Tijdsdiagrammen A.2.3 Schema-editors A.3 Beschrijvingen van fysische structuur A.4 Het uitwisselingsformaat EDIF B Chipverpakkingen 266 C Enkele aanvullingen op circuitniveau: CMOS, flipflops en interconnectie 272 C.1 Een korte herhaling: de veldeffecttransistor en CMOS C.1.1 De veldeffecttransistor C.1.2 CMOS-poorten C.1.3 De invertor C.1.4 Complexe poorten C.1.5 Standaardcomponenten in CMOS C.2 Teruggekoppelde circuits en metastabiliteit C.3 Interconnecties en bussen C.3.1 Punt-tot-puntverbindingen C.3.2 Meerpuntconnecties en bussen D Maple-fragmenten en - voorbeelden 301 D.1 Representaties in Maple D.2 Combinatorische minimalisatie in Maple D.3 Sequentiële analyse in Maple D.4 Sequentiële synthese in Maple iii

5 Voorwoord De discipline van digitaal ontwerp stelt zich tot doel de realisatie van digitale systemen die een vooropgegeven functionaliteit vervullen, en met inachtname van bijkomende randvoorwaarden, zoals b.v. niet meer dan een vooropgegeven prijs kosten, of sneller zijn dan een opgegeven minimum. Deze discipline is relatief jong: vele, zeer gesofisticeerde analoge elektronische toepassingen bestonden (denk maar aan de radio, de TV), terwijl digitale systemen nog elektromechanisch van aard waren. Vernieuwing in de technologie, en de opkomst van de digitale computer, hebben aanleiding gegeven tot een stormachtige groei in de digitale elektronische systemen, en deze evolutie is nog steeds bezig. Op vele terreinen werden analoge systemen geheel of gedeeltelijk verdrongen door digitale systemen, in die mate zelfs dat een Elektrotechnisch Ingenieur het zich al lang niet meer kan veroorloven geen weet te hebben van het ontwerp van digitale systemen. Wegens de betrekkelijke jeugd van het domein is de systematiek van het ontwerp van digitale systemen nog lang niet zo goedgeëvolueerd en doorgedrongen in de diverse geledingen van het ingenieursberoep. De opleiding in het bestuderen en ontwerpen van analoge systemen steunt immers op een veel langere traditie. Gaandeweg echter ontgroeit het ontwerp van digitale systemen het domein van de kunst, en wordt het een kunde, die men door studie en oefening kan verwerven. De wiskundige basis, nodig voor de beschrijving van het gedrag en de structuur van digitale systemen, kent een groeiende verspreiding. Computergesteunde methoden voor het ontwerp van complexe digitale systemen nemen een hoge vlucht. Deze cursus wil een inleiding zijn tot het ontwerp van digitale systemen. Hij steunt op die cursussen die de wiskundige en technologische basis aanbrengen voor de behandeling van digitale systemen. Deze cursus behandelt digitaal ontwerp op logisch niveau. Belangrijke stappen in dit proces zijn de correcte en ondubbelzinnige weergave van het gewenst gedrag in één of andere concrete, computerleesbare en wiskundig onderbouwde vorm, en de opeenvolgende verfijningsstappen ervan naar een compositie van bouwstenen met een eenvoudiger gedrag, tot wanneer realiseerbare bouwstenen worden verkregen. Vele keuzen moeten gemaakt worden bij het doorlopen van dit traject, en deze cursus exploreert de implicaties van sommige van deze keuzen. De nadruk van de cursus ligt op methoden, en minder ophulpmiddelen, hoewel deze zeker noodzakelijk zijn wil men tot effectief ontwerp overgaan. De cursus is ook niet enkelzijdig gericht op VLSI-systemen; ook andere, meer traditionele vormen van digitaal ontwerp komen aan bod. De lezer zal, na lectuur van deze syllabus, tenvolle beseffen dat slechts de oppervlakte van het domein werd aangeraakt. Het uitgroeien tot volleerd ontwerper kan niet zonder zeer intensief in de praktijk ondergedompeld te worden,en zichzelf permanent te blijven bijscholen in een domein waarvan de evolutie zich in een niet te stuiten stroomversnelling bevindt. J. Van Campenhout Januari

6 Hoofdstuk 1 De ontwerpruimte van digitale schakelingen In dit hoofdstuk beschrijven wij het domein waarin modern digitaal ontwerp zich afspeelt. Deze beschrijving brengt orde in de veelheid van termen en methoden die samen het domein van digitaal ontwerp uitmaken, en zal ons in staat stellen op een gestructureerde manier te redeneren over diverse stadia van een ontwerp. Wij zullen ook een specifieke betekenis geven aan termen die vaak in verscheiden betekenissen voorkomen in de literatuur. Het deeldomein waarop deze cursus ingaat het ontwerp van logische schakelingen wordt gesitueerd in de veel bredere context van systeemontwerp. 1.1 De ontwerpruimte Een systeem, en in het bijzonder een digitaal systeem, kan op verschillende manieren beschreven worden, die elk een particulier aspect van het systeem belichten. Drie belangrijke aspecten worden hierbij frequent gebruikt: deze zijn het gedrag, de logische structuur, en de fysische realisatie. Men kan deze drie aspecten zien als orthogonale dimensies van een driedimensionale ruimte waarin systemen voorgesteld worden. Deze ruimte staat bekend als de de ontwerpruimte (Eng. design space), en kan worden voorgesteld op diverse manieren. Het voorbeeld dat wij in deze cursus hanteren is Gajski s Y-diagram (Eng. Y-chart) ([Michel92]). Systemen zijn over het algemeen zeer complexe objecten. Om hun beschrijving mogelijk te maken, en beheersbaar door mens en machine, maakt men gebruik van de beproefde techniek van hiërarchie. In elk van de beschrijvingsdimensies heeft men een vorm van hiërarchie gedefinieerd, waarin conventioneel de volgende lagen worden onderkend: het systeemniveau het algoritmisch niveau het registertransferniveau het logisch niveau het circuitniveau Wij zullen nu eerst de opeenvolgende lagen van deze hiërarchie exploreren in de drie dimensies van het Y-diagram. 2

7 Figuur 1.1: De ontwerpruimte: Gajski s Y-diagram De gedragshiërarchie Een eerste beschrijvingsdimensie is het gedrag van het systeem. Het gedrag van een systeem is de relatie die het realiseert tussen zijn inputs en outputs. Het beschrijven van dat gedrag vereist in de eerste plaats dat men de informatie die gedragen wordt door de inputs, resp. outputs, formeel voorstelt (de datatypes), en daaraan gekoppeld, de relatie tussen de geformaliseerde in- en outputs. De relatie bevat zowel waarde-informatie als tijdinformatie. De waarde-informatie kan functioneel zijn van aard, wat wil zeggen dat met één input precies één output overeenkomt (bij deterministische systemen), maar kan ook een minder stricte relatie zijn. Hte tijdgedrag specificeert wanneer veranderingen zich voordoen op outputs als reactie op een verandering van de inputs. De wijze waarop deze gedragsaspecten voorgesteld worden hangt zeer sterk af van het niveau in het Gajski-diagram. Circuitniveau Datatypes. Op het laagste niveau, het circuitniveau, beschrijft men het gedetailleerd gedrag van de elektrische circuits waaruit het systeem is opgebouwd. De variabelen zijn analoge elektrische grootheden, zoals stroom, spanning, impedantie, en na het aanschakelen van het apparaat nemen deze grootheden waarden aan in een continuüm, voor elke waarde van de tijd die ook als continuüm beschouwd wordt. Input/outputrelaties. Om het gedrag van een circuit te beschrijven op dit niveau moet men in het algemeen (niet-lineaire en/of partiële) differentiaalvergelijkingen gebruiken, die het tijdverloop van de outputs O(t) beschrijven wanneer de inputs aangestuurd worden door functies I(t) gedefinieerd op een continue tijddimensie t R +. Inputs en 3

8 outputs zijn dan eindige 1 verzamelingen spanningen, stromen, of zelfs impedanties, gedefinieerd voor elke niet-negatieve waarde van de tijd. Wij noemen ze signalen. Logisch niveau Bij de beschrijving van digitale systemen op het logische niveau gaan wij ervan uit dat wij het gedetailleerd tijdgedrag van de signalen aan de inputs en outputs van het systeem kunnen abstraheren tot discrete signalen, die bijgevolg abrupt van waarde veranderen. Datatypes. De eenvoudigste waardenruimte voor digitale signalen is de binaire ruimte {0, 1}. Wanneer men echter de werking van reële circuits wil beschrijven met voldoende nauwkeurigheid heeft men een wat rijkere ruimte nodig. Voor digitale schakelingen die met spanningsniveaus werken gebruikt men dikwijls de waardenruimte {L, H, Z, X}, waarin L laag betekent, H hoog, Z hoogimpedant of afgeschakeld, en X ongeldig (wordt gebruikt voor signalen die foutief zijn, of onbepaald wegens een verandering). Hedendaagse beschrijvingstalen zoals VHDL (zie hoofdstuk A) maken gebruik van negen of meer discrete waarden, die meer eigenschappen van het onderliggende analoge signaal kunnen vatten. In het analoge domein definieert men twee intervallen I L = [0, V IL ] en I H = [(V IH, V cc ], die afgebeeld worden op de symbolen L resp. H. Waarden die niet in deze intervallen liggen, worden afgebeeld op X. Bijvoorbeeld, bij TTL wordt het interval 0 V 0,8 volt afgebeeld op L, en het interval 2,0 V 5 volt op H. Het verboden gebied 0,8 < V < 2,0 volt wordt afgebeeld op X. Figuur 1.2 geeft een beeld van de gebruikte spanningsniveaus in diverse logische families (TTL en CMOS, zowel de traditionele 5-voltversies als de meer recente 3,5- en 2,5-voltversies). Slechts in de meest eenvoudige gevallen kunnen wij de waardenverzameling verder beperken tot de verzameling {0, 1}, waarbij wij een keuze moeten maken over de representatie van 0 en 1. In positieve logica beeldt men L af op 0, in negatieve logica doet men net het omgekeerde. Tijdmodellering. De signalen kunnen van waarde veranderen op willekeurige tijdstippen, en moeten dus nog steeds beschouwd worden als functies van een reëel argument. Het logisch niveau is het niveau waarop men een schakeling voorstelt als een interconnectie van bv. poortschakelingen of netwerken van schakelaars. Het dynamisch gedrag van deze schakelingen wordt gemodelleerd op een veelheid van manieren. Vooreerst is het het onderscheid tussen bouwblok en interconnectie. Vroeger (in het domein van de digitale systemen enkele jaren geleden) kon men bij het beschrijven van het tijdgedrag van een schakeling rustig zeggen dat alle vertraging veroorzaakt werd door de bouwblokken, en dat de interconnectie niet bijdroeg tot vertraging. Inderdaad, de vertraging van bijvoorbeeld een TTL-poort is verschillende nanoseconden, terwijl signalen op een goed-ontworpen gedrukte schakeling of PCB (Eng. Printed Circuit Board) ongeveer 20 cm afleggen in één nanoseconde. Op hedendaagse chips liggen de zaken totaal anders. Poortvertragingen zijn kleine fracties van nanoseconden, afhankelijk van de belasting van de poort. Op de fijnste verbindingen doen signalen er echter steeds langer over om van het ene eind van de chip 1 Wij laten systemen met verdeelde parameters hier buiten beschouwing. 4

9 5 V Vcc 5 V Vcc 4.44 V OH 3.5 V IH V t V IL V OL GND V OH V IH V t V IL V OL GND 3.3 V Vcc V OH V IH V t V IL V OL GND 2.5 V Vcc V OH V IH V t V IL V OL GND 5V CMOS HC, AHC,AC 5V TTL Standaard TTL ABT, AHCT, HCT LVTTL LVT, LVC, ALVC LV, ALVT 2.5V CMOS ALVC, ALVT Figuur 1.2: De ligging van de logische niveaus in moderne discrete logische families (TTL en CMOS). V t =drempelspanning, V IL = maximale spanning aan de ingang die herkend wordt als een L, V OL = maximale spanning aan de uitgang bij een L,V IH = minimale spanning aan de ingang die herkend wordt als een H,V OH = minimale spanning aan de uitgang bij een H, naar het andere eind te lopen. Dit komt doordat de breedte van de metaalbaantjes en de dikte van de isolatorlaag op de chip steeds maar dalen, terwijl de chipoppervlakte ruwweg dezelfde blijft of zelfs toeneemt. Verbindingen worden relatief langer. Hierdoor neemt de serieweerstand van de verbindingen toe zonder dat de capaciteit van de verbindingen evenredig afneemt. Een baantje kan dan aanzien worden als een verlieshebbende vertragingslijn (van het RC-type). Zonder bijkomende voorzorgen kan de signaaloverdracht over grotere afstanden op de chip (meerdere mm) dan gerust meer dan een nanoseconde in beslag nemen, wat veel meer is dan de poortvertraging. Wanneer dit belangrijk is moet men een interconnectie dus aanzien als een component zoals een andere. Laat ons wat nauwkeuriger kijken naar modellen voor component- of interconnectievertragingen. Het meest eenvoudig model bestaat erin de vertragingstijd van alle componenten te aanzien als een eenheidsvertraging, met een vaste, gekende waarde. Het spreekt vanzelf dat dit model geen nauwkeurige resultaten geeft, en gewoon onbruikbaar is in gevallen waar het gedrag van het circuit effectief afhangt van de precieze waarden van de componentvertragingen. Het is echter wel nuttig wanneer men dergelijke modellen wil simuleren, omdat men dat ten minste beschikt over signalen die afhankelijk zijn van de tijd, die men dus kan visualiseren. Een veel fijner model bestaat uit een tweezijdig begrensde vertragingstijd d t p D. De effecten van deze vertragingstijd kan men op diverse manieren modelleren. Een eerste manier neemt aan dat de vertragingstijd vast is en zich bevindt in het opgegeven interval. Men kan de vertragingstijd dan interpreteren als inertiaal delay of als transport- 5

10 delay. Deze begrippen komen wat verder uitgebreider aan bod; voor de huidige discussie volstaat de volgende beschrijving. Een transportmodel is een abstrahering van een looptijdvertraging zonder bandbreedtebeperking. Dit zou bv. een verliesloze transmissielijn kunnen zijn, of draadloze communicatie met elektromagnetische golven. De vertragingstijd en de doorlaatbandbreedte zijn losgekoppeld van elkaar. Voor de modellering van poorten en verlieshebbende verbindingen gebruikt men gewoonlijk een inertiaalmodel, dat een abstrahering is van een laagdoorlaatsysteem: vertragingstijd en bandbreedte zijn sterk gekoppeld 2. Met een signaal dat onderhevig is aan een delay associeert men een excitatiewaarde X(t) en een outputwaarde x(t). Bijvoorbeeld, bij een poort is de excitatiefunctie de gewenste Boolese combinatie van de inputwaarden, zonder enige vertraging. De outputwaarde is hier een vertraagde versie van. Zij zal de excitatie volgen indien deze gedurende minstens een tijd t p op dezelfde waarde gebleven is. Signaalveranderingen van kortere duur worden weggefilterd. Gewoonlijk kent men echter niet de precieze waarden van de delays van de poorten in een circuit, en men wil ze ook niet kennen. De delays kunnen variëren van component tot component, zijn afhankelijk van de (capacitieve) belasting van de component en van een hele rist omgevingsfactoren, en kunnen zelfs afhankelijk zijn van de activiteit in de component zelf. Het enige dat men weet is dat de vertragingstijden tussen een minimum d en een maximum D liggen, en men wenst circuits te bouwen die bewijsbaar correct functioneren voor alle concrete keuzen van de vertragingstijden die hieraan voldoen. Hierdoor is het onmogelijk een precieze beschrijving te geven van de output van een poort bij een gegeven input. Men moet zich beperken tot het opgeven van een verzameling mogelijke outputs voor een gegeven input. Dat dit echter niet zo eenvoudig is als blijkt op het eerste gezicht mag blijken uit het nu volgend voorbeeld. Wij stellen de output van een poort voor door twee signalen: een intern excitatiesignaal Y (t) en een waarneembare output y(t). De output kan de excitatie volgen als deze minstens gedurende een tijd d op een bepaalde waarde gestaan heeft; de output moet de excitatie volgen nadat deze ten hoogste gedurende een tijd D op dezelfde waarde gestaan heeft. Elke overgang van L naar H of omgekeerd moet verlopen via de onstabiele waarde X. Dit reflecteert eindige stijg- en daaltijden van de overgangen. Een signaal y(t) is dan een geldige vertraagde versie van de excitatie Y (t) als aan de volgende voorwaarden is voldaan: 1. als y(t) van de waarde α {L, H} verandert naar de waarde X op ogenblik τ, dan moet Y (t) α voor τ d t < τ; 2. als y(t) verandert van X naar α {L, H} op ogenblik τ, dan moet Y (t) = α voor τ d t < τ; 3. als Y (t) = β {L, X, H} voor τ t < τ + D, dan moet er een τ bestaan, met τ < τ + D, zodanig dat y(t) = β voor τ t < τ + D; 2 Herinner u de zeer robuuste vuistregel voor systemen die bij benadering eerste-ordesystemen zijn met bandbreedte B Ghz en stijgtijd R ns: BR = 0, 35 6

11 Poortmodel exitatie X(t) output x(t) ideale poort delay t d Input X(t) Inertiaal- en transportvertragingen met vaste delay Transportvertraging met vast delay Inertiaalvertraging met vast delay Twee mogelijke outputs met gegeven d en D d d D D H X L H X L Figuur 1.3: Interpretatie van delaymodellen 4. als Y (t) α {L, H} voor τ t < τ +D, dan moet er een τ bestaan, met τ < τ +D, zodanig dat y(t) α voor τ t < τ + D. Figuur 1.3 stelt deze concepten grafisch voor: het model van een poort met vertraging, als een ideale poort gevolgd door een vertraging; de interpretatie van inertiaal en transportdelay met vaste vertragingstijd; en twee interpretaties van bovenstaande regels over het domein {L, X, H} met tweezijdig begrensde vertragingstijd. De tweede interpretatie is echter niet helemaal correct: waar zit de fout? Gewoonlijk gebruikt men een gestileerde versie van dit model bij de beschrijving van echte componenten in catalogi en technologiebibliotheken. Een voorbeeld van de manier 7

12 Figuur 1.4: Gestileerde voorstelling van discrete waarden en delaygedrag gebruikt in datasheets. Waarden worden voorgesteld door horizontale lijnen of arceringen; vertragingen door horizontale pijlen tussen gebeurtenissen. Een arcering stelt de waarde X voor, een horizontale lijn in het midden Z. Een horizontale lijn boven stelt H voor, en een beneden L. Aan de getekende vertragingstijden wordt in een bijgevoegde tabel meestal een bovengrens opgegeven, en soms ook een benedengrens. Noteer dat in dergelijke diagrammen onderscheid moet gemaakt worden tussen ingangssignalen en uitgangssignalen. Ingangsignalen leggen een restrictie op aan de gebruiker, terwijl uitgangssignalen een beperking opleggen aan het circuit. Een dergelijk timingdiagram is dus een soort van contract tussen circuitbouwer en -gebruiker. waarop deze informatie wordt voorgesteld vindt men in figuur 1.4. Synchrone tijdmodellen. Een verdere abstractie van het tijdbegrip bestaat erin dat wij de waarde van de signalen enkel beschouwen op een (aftelbare) verzameling voorgeschreven tijdstippen (of in intervallen rond) t i, i = 0, 1,..., die bijvoorbeeld geassocieerd worden met transities op een vooropgegeven signaal dat kloksignaal genoemd wordt. Elk signaal wordt dan een (potentieel oneindige) sequentie van Boolese grootheden over {0, 1}. Systemen die afdoende op een dergelijke manier kunnen beschreven worden noemen wij synchrone systemen. Op het concept synchronisme komen wij verder in deze cursus uitvoerig terug. Determinisme. Wij zullen ons beperken tot digitale systemen die bij een ordentelijke aansturing een deterministisch gedrag vertonen. Hiermee bedoelen wij dat een systeem dat (i) op de goede manier geïnitialiseerd is na het aanschakelen, en (ii) dat aangestuurd wordt met signalen die aan welbepaalde eisen voldoen (bv. in verband met het precieze tijdverloop, zie figuur 1.4), als antwoord steeds dezelfde digitale outputsignalen zal genereren, op de variaties in tijdverloop na die toegelaten worden door de vertragingsmodellen. Wij onderstellen ook dat de outputs van een circuit, wanneer alle inputs (inclusief de mogelijke klok-inputs) constant gehouden worden, na verloop van een eindige tijd een 8

13 constante waarde zullen aannemen. 3 Voor synchrone systemen die starten vanuit een gegeven begintoestand betekent dit dat een gegeven inputsequentie steeds zal aanleiding geven tot één deterministisch bepaalde outputsequentie. Combinatorisch versus sequentieel gedrag. In het eenvoudigste geval zullen, bij een constant gehouden stel inputs, de outputs van het systeem na een karakteristieke tijd constante waarden aannemen die louter bepaald worden door de huidige inputwaarden, en dus onafhankelijk is van de eerder aangelegde inputs. Zulke systemen noemen wij geheugenloos of combinatorisch, en de eis van determinisme impliceert dat de input/outputrelatie bijgevolg een (partiële) functie is. Gezien wij hier spreken over systemen met een eindig aantal tweewaardige inputs en outputs, zijn het domein en het co-domein van deze functie eindig, en wij spreken dan over een eindige functie. Deze functies kunnen concreet voorgesteld worden in het wiskundig formalisme van de Boole-algebra, wat in hoofdstuk 2 aan bod komt. In het meer ingewikkelde geval is de output, die verkregen wordt na een voldoend lange wachttijd bij constante inputs, ook afhankelijk van de vorige inputs, en eventueel van de manier waarop de schakeling geïnitialiseerd werd na het aanzetten. Gegeven de initialisatie zal het circuit een functie realiseren die de inputsignalen afbeeldt op de outputsignalen, eerder dan een afbeelding van de huidige inputwaarde op de huidige outputwaarde, zoals een combinatorisch circuit. Deze functie is niet willekeurig: zo is het duidelijk dat alleen de huidige en vorige inputwaarden de huidige outputwaarde kunnen beïnvloeden, daar anders het systeem ofwel non-deterministisch, ofwel niet-causaal is. De afhankelijkheid van voorbije inputs impliceert dat een vorm van geheugen aanwezig is in het circuit. Wij gaan er van uit dat de interne opbouw van het circuit kan beschreven worden als een eindig digitaal netwerk, wat impliceert dat het zich intern slechts in een eindig aantal toestanden kan bevinden. De afhankelijkheid van voorgaande inputs moet dan kunnen gerealiseerd worden via een eindige hoeveelheid geheugen, wat de klasse van mogelijke functies nog verder beperkt. Het functioneel verband tussen outputsignalen en inputsignalen kan dan eenvoudiger beschreven worden door middel van twee eindige functies: de toestandsfunctie, die de huidige toestand en de huidige input afbeeldt op de nieuwe toestand, en de outputfunctie, die de huidige toestand en de huidige input afbeeldt op de huidige outputwaarde (zie hoofdstuk 6). Noteer dat uit deze beschrijving niet langer op te maken valt of het hier gaat over een synchroon of asynchroon netwerk. Deze informatie, die bepaalt wanneer een toestandsovergang gebeurt, moet apart verstrekt worden. Dit soort van systemen noemen wij sequentiële systemen of eindige automaten. Zoals men kan zien is de klasse van de combinatorische systemen een echte deelverzameling van de klasse van de eindige automaten. Sequentiële schakelingen en hun gedrag komen aan bod in hoofdstuk 6. Synchrone circuits en asynchrone inputs. Naast de opgave van de tijdinformatie in het gedragsmodel van het circuit zelf, moet men over het algemeen bepaalde tempore- 3 Noteer dat deze beperking een echte beperking is, in de zin dat zij een aantal zeer nuttige schakelingen uitsluit. Zo worden bv. uitgesloten alle signaalbronnen, circuits die een signaal produceren dat verandert in de tijd zonder dat deze veranderingen het gevolg zijn van een verandering aan de input. Klokgeneratiecircuits zijn hier een voorbeeld van. 9

14 le restricties opleggen aan de externe signalen die door de buitenwereld aan het circuit opgelegd worden. Bijvoorbeeld, in synchrone circuits moeten inputs constant gehouden worden gedurende bepaalde tijdintervallen bepaald door het kloksignaal. Bij asynchrone circuits zijn er temporele beperkingen op het verloop van de inputsignalen onderling, bijvoorbeeld, er mag slechts één input tegelijkertijd veranderen, en het circuit moet gestabiliseerd zijn alvorens er een input mag veranderen (resp. de SIC, single input change of Hamming-1 voorwaarde, en de werking in fundamentele mode) zie hoofdstuk 6. De gedetailleerde temporele aspecten van een digitaal circuit worden in sterke mate bepaald door de uiteindelijke implementatie, en zijn meestal irrelevant en onbekend op de hogere beschrijvingsniveaus. Men abstraheert ze dus meestal weg op deze niveaus. Noteer echter dat men tijdens het ontwerp en de realisatie van de systemen wel degelijk moet rekening houden met dit aspect, wil men correcte circuits bouwen. RT-niveau Op de hogere niveaus worden krachtiger modellen gebruikt, die op een meer efficiënte manier het gedrag van een digitaal systeem voorstellen. Datatypes. Op RT-niveau beschrijft men het gedrag van een systeem in termen van elementaire operaties op bitrijen van vaste lengte ( woorden ). Deze bitrijen kunnen al andere concepten voorstellen, bijvoorbeeld gehele getallen. Een elementaire operatie is een overdracht (transfer) van een bitrij tussen twee geheugenlocaties, eventueel gepaard gaande met een combinatorische transformatie tijdens de overdracht. Transformaties kunnen bitgewijze uitbreidingen zijn van de operaties uit het logisch niveau, maar kunnen ook al geïntepreteerd worden als (aritmetische) operaties op getallen, waarbij echter de precieze representatie van het getal door een bitrij zichtbaar en relevant blijft. Het begrip overflow van een aritmetische operatie, bijvoorbeeld, hoort hier thuis. Een typisch voorbeeld van een beschrijving op RT-niveau is de beschrijving van de werking van een gemicroprogrammeerde computer in termen van zijn verzameling controlepunten. 4 Het effect van de activatie van een controlepunt is een typische elementaire operatie op RT-niveau. Tijdmodel. De tijdnotie op dit niveau wordt meestal geabstraheerd tot deze van een synchrone klok; in uitzonderlijke gevallen vindt men ook asynchrone schakelingen op RT-niveau. Algoritmisch niveau Op algoritmisch niveau gebruikt men algoritmen (of, in het veel voorkomend geval van niet-terminatie, procedurale beschrijvingen 5 ) voor de weergave van het input/outputgedrag van een systeem. Datatypes. De datatypes zijn hier de datatypes van programmeertalen, dus abstracties van bitrijen, zoals getallen, lettertekens, structuren of zelfs de objecten uit de OO-talen. 4 Cursus Computerarchitectuur 5 Conventioneel neemt men immers aan dat een algoritme na een eindig aantal berekeningsstappen termineert. In deze zin is het gedrag van het besturingssysteem van een computer, of de controle-eenheid van een microprocessor niet algoritmisch. 10

15 Van de numerieke datatypes zelf is men op dit niveau meestal niet langer bekommerd over hun concrete binaire representatie (bv. woordlengte, formaat). Noteer dat, wanneer recursie of onbeperkte precisie toegelaten is, men met algoritmen in het algemeen input/outputrelaties kan beschrijven die men niet kan realiseren met een circuit van op voorhand begrensde complexiteit en afmetingen. Tijdnotie. Op dit niveau is het gedetailleerd gedrag per klokperiode irrelevant geworden, en de tijdnotie wordt verder geabstraheerd tot een totaal geordende verzameling van gebeurtenissen (events) die het begin of het einde van opdrachten aangeven. Met totaal geordend bedoelen wij dat van elke gebeurtenis kan gezegd worden of zij steeds vóór of na een andere gebeurtenis komt. De precieze duur van de operatie (het aantal klokperioden) is dus meestal ook niet langer gekend, hoewel in sommige toepassingen (ware tijd) minstens een bovengrens bekend moet zijn. De tijd wordt geabstraheerd tot enkele discrete gebeurtenissen, die bv. het begin en het einde van een berekening aangeven. Een berekening (de uitvoering van een algoritme) noemt men proces. Systeemniveau Op systeemniveau, tenslotte, beschrijft men gedrag met behulp van meerdere, communicerende processen. Elk proces is intern een sequentiële activiteit (een algoritme), maar kan interageren met de andere processen via de uitwisseling van berichten via gebeurtenissen of het delen van gegevens. Gezamenlijk beschrijven zij het gedrag van het hele systeem. De notie van een gemeenschappelijke, centrale tijd ontbreekt hier meestal; temporele aspecten worden vaak gereduceerd tot een partiële ordening over de gebeurtenissen. Hiermee wordt bedoeld dat de gebeurtenissen van elk proces afzonderlijk totaal geordend zijn op de tijdsas die hoort bij dat proces. De gebeurtenissen van alle processen samen kan men echter niet steeds op één enkele tijdsas samenbrengen, omdat men de relatieve ligging in de tijd van gebeurtenissen uit verschillende processen niet altijd kent. De procesinteracties kunnen op de diverse manieren beschreven worden die men ook terugvindt in parallelle programmeertalen zoals Ada. Dit kan gaan van asynchrone gebeurtenissen (events), asynchrone communicatie via gemeenschappelijke datastructuren, tot volledig gesynchroniseerde uitwisseling van berichten (rendez-vous). Vaak zal men een vorm kiezen die goed past bij het gedrag van hardwaresystemen (zie verder, bij VHDL) Structuurbeschrijvingen Daar waar een gedragsbeschrijving zegt wat het systeem doet, beschrijft een structuurbeschrijving hoe dit gedrag gerealiseerd wordt door een structuur die samengesteld is uit primitievere bouwstenen. Wij bespreken nu kort de hiërarchische lagen uit de logische structuur, die goed overeenkomen met de lagen uit de gedragshiërarchie. Figuur 1.5 geeft een beeld van deze hiërarchie. Op het circuitniveau wordt een systeem beschreven als een interconnectie van elektrische circuitelementen zoals transistoren, dioden, weerstanden, condensatoren, enz. Deze interconnectie wordt voorgesteld door een (niet-gerichte) graaf, een circuitschema. Knopen zijn circuitelementen, takken zijn elektrische verbindingen. Wanneer de elektrische 11

16 Figuur 1.5: Een visueel beeld van de logische structuurhiërarchie verbindingselementen een niet te verwaarlozen vertraging introduceren, wordt hun aanwezigheid expliciet gemaakt door deze verbindingen ook te beschouwen als component (bijvoorbeeld als transmissielijn); zij worden dan ook als knopen voorgesteld. De takken in de circuitgraaf zijn dan tijdloze interconnecties, die louter de topologie van het netwerk weergeven. Eén enkele geleider kan meerdere componenten interconnecteren. Een dergelijke geleider en de verzameling geïnterconnecteerde componenten noemt men een net, en de lijst van alle interconnecties de netlijst (Eng. Net list). Op logisch niveau worden deelcircuits samengesteld uit logische elementen gemodelleerd als poorten, flipflops of schakelaars. Poortnetwerken worden ook voorgesteld door grafen, maar deze zijn dan gericht: informatie stroomt van outputs naar inputs. Wanneer de graaf van een poortnetwerk lusvrij is, stelt het netwerk een combinatorisch circuit voor. Ook hier kan men de interconnectie beschouwen als component. Een tussenvorm tussen circuitniveau en logisch niveau is dat van de tak- of schakelaarnetwerken. De componenten zijn schakelaars (open of gesloten), en de verbindingen ertussen zijn nietgericht. Dit model wordt bijvoorbeeld gebruikt bij de beschrijving van een CMOS-poort. Op RT-niveau worden de primitieven van het logisch niveau samengenomen tot aggregaten zoals registers, ALU s, multiplexers, bussen, enz. Het algoritmisch niveau wordt ook PMS-niveau genoemd (van Processor-Memory-Switch). Op dit niveau worden de bouwblokken processors, controllers en geheugens, terwijl op systeemniveau systemen beschreven worden door subsystemen zoals werkstations, servers, printers, communicatieapparaten, enz. 12

17 1.1.3 Fysische beschrijvingen: de verpakkingshiërarchie Het fysisch niveau geeft weer hoe de logische structuur afgebeeld wordt op de fysische realiteit. De terminologie die men hanteert hangt sterk af van of men spreekt over de interne structuur van een geïntegreerd circuit, dan wel over de structuur van een circuit opgebouwd met discrete componenten. De binding tussen de fysische en de logische structuurhiërarchie is lang niet zo duidelijk en welgedefinieerd als tussen de logische structuurhiërarchie en de gedragshiërarchie. Dit komt omdat de constante en snelle evolutie van de integratietechniek ervoor gezorgd heeft dat steeds grotere systemen (of systeemonderdelen) op één enkele chip kunnen geïntegreerd worden (de zogenaamde SoC, Systems on a Chip). Hierdoor stijgt, bij gelijkblijvende systemcomplexiteit, het niveau in de logische structuurhiërarchie waarop de chipgrens zich bevindt in de verpakkingshiërarchie. De ligging van deze grens is dus duidelijk niet enkel afhankelijk van de grootte van het systeem dat men beschrijft, maar ook het tijdstip waarop men dit doet. Op circuitniveau (op de chip) wordt de fysische implementatie van de circuitelementen beschreven door de geometrie van de maskers gebruikt bij de fabricage: rechthoeken, polygonen. De beschrijving bestaat meestal uit een aantal lagen, die elk een welbepaalde functie hebben (bv. metaal, polysilicium, diffusiegebied, isolator, via,...). De beschrijving bevat naast topologische ook metrische en fysische informatie (afmetingen, doperingen,...). In de zeldzame gevallen waar wij spreken over een circuit opgebouwd met discrete elementen zoals transistors, dioden, weerstanden, enz., bevat de beschrijving de geometrische beschrijving van de verpakkingen van de circuitelementen (bv. surface-mountcomponenten), alsook de geometrie van de PCB of het hybried interconnectiesubstraat. Op logisch niveau en RT-niveau worden dit de elementaire standaardcellen of modules uit een ontwerpsbibliotheek. Bij VLSI-ontwerp zijn deze cellen meestal rechthoeken met verbindingsplaatsen op de rand van de rechthoek. Bij discreet ontwerp spreekt men van aparte chips in hun diverse verpakkingsvormen. De interconnectie van deze blokken op de chip wordt beschreven door de geometrie van het banenpatroon (rechthoeken, trapezia, via s, boorgaten,...). Op PMS-niveau spreekt men van complexe blokken (bv. een processorkern of een RAMblok) waaruit complexe chips samengesteld zijn, of de chips die deze functie realiseren. Bij discreet ontwerp zit men hier reeds op het niveau waarop chips samengebracht werden op borden, en de moederborden of backplanes die dienen voor hun interconnectie. Op systeemniveau tenslotte vindt men individuele chips (voor de eenvoudigste systemen), chips gemonteerd op één bord, borden verbonden door een moederbord of backplane, of interconnecties van dergelijke systemen (bv. geïnterconnecteerde computers). 1.2 Het Ontwerptraject Wij kunnen digitaal ontwerp beschouwen als een vertalingsproces dat in verschillende stadia verloopt. Deze stadia en hun opeenvolging kunnen gemodelleerd worden als een traject doorheen de ontwerpruimte, waarbij in elk stadium gebruik gemaakt wordt van geëigende representaties van het systeem (of wat er op dat ogenblik al van gekend is). Vele overgangen tussen stadia hebben een eigen naam, en wij zullen nu kort enkele belangrijke stadia bespreken, en de terminologie die in dit verband gebruikelijk is (figuur 1.6). 13

18 Figuur 1.6: Het ontwerptraject Formalisering Het eerste stadium in elk systeemontwerp staat eigenlijk nog buiten het Y-diagram. Het is de informele beschrijving van het gewenst gedrag van het te realiseren systeem. Deze beschrijving het lastenboek 6 is informeel, omdat bij de formulering ervan gebruik gemaakt wordt van natuurlijke taal, diagrammen, schetsen, enz. Een dergelijke beschrijving is, als gevolg van haar aard, gewoonlijk behept met een aantal problemen. Om te beginnen is zij meestal niet compleet: men legt het gewenst gedrag uiteraard wel vast in een aantal gevallen, maar in vele andere (misschien even belangrijke) gevallen wordt het gewenst gedrag helemaal niet beschreven. Bovendien kent men op dat ogenblik zeker niet alle details van het gedrag van het te realiseren systeem, bv. wat betreft het gedetailleerd tijdgedrag. Een informele beschrijving is vaak ook vatbaar voor meer dan één interpretatie, waarbij het gevaar zeker niet denkbeeldig is dat de opdrachtgever en de ontwerper een verschillende perceptie hebben van wat precies moet gerealiseerd worden. Om die reden kan een informele beschrijving ook inconsistent zijn, in de zin dat er interne tegenspraak kan bestaan tussen de onderdelen van de beschrijving, en dat het gewenst gedrag zelfs logisch niet realiseerbaar is. Een informele beschrijving is met de huidige computertechnologie niet automatisch verwerkbaar of interpreteerbaar, en kan dus niet als input gebruikt worden van een automatisch syntheseproces. De eerste stap in elk systematisch ontwerp moet dan ook zijn zo vlug mogelijk te komen tot een formalisering van de informele beschrijving van het gedrag. Met formeel bedoelen wij hier dat de beschrijving ondubbelzinnig wordt (daarom nog niet compleet), en computerverwerkbaar. Men moet het gewenst gedrag van het te realiseren systeem dus representeren in een of andere, op soliede wiskundige basis gefundeerde maar computerverwerkbare notatie. Deze kan tekstueel zijn van aard, en de beschrijving neemt dan de vorm aan van een tekst in een of andere computertaal. Zij kan echter ook grafisch zijn, in de gedaante van een stel tekeningen, schema s of diagrammen 6 Een galliscisme voor bestek. 14

19 gemaakt met een daarvoor gebouwd computergesteund tekenpakket. Wij komen terug op diverse concrete representaties in de loop van deze cursus. Declaratief versus Proceduraal. In dit eerste stadium van het ontwerp kent men nog niet de structuur van het te realiseren systeem synthese heeft precies als doel een structuur af te leiden die het gewenst gedrag van het systeem realiseert, en die bovendien voldoet aan een aantal randvoorwaarden van snelheid en/of kostprijs. In de eerste formaliseringsstap zou het dus wenselijk zijn dat men het gewenst systeemgedrag zou kunnen beschrijven op een declaratieve manier, dit wil zeggen op een manier die nog geen implicaties heeft op de structuur van een mogelijke realisatie. Dit laat de handen vrij bij de exploratie van de vele alternatieven waaruit men kan kiezen. Alternatief aan een zuiver declaratieve beschrijving is een procedurele, uitvoerbare beschrijving, die in zekere zin al een eerste realisatie voorstelt (onder de vorm van een algoritme) van het te ontwerpen systeem. Deze realisatie verschilt echter meestal van de finale realisatie in de gedaante van een circuit. Een kort voorbeeld maakt het verschil tussen beide benaderingen duidelijk. Voorbeeld 1.1 Stel dat men een prioriteitsschakeling wil bouwen waaraan n verschillende namen s i van k lettertekens worden aangeboden, en waarbij men wil dat het systeem uit deze namen de kleinste in alfabetische volgorde vindt. Het gedrag van dit systeem (waarbij wij abstractie maken van temporele aspecten) is duidelijk een eindige functie: voor elke geldige input I = {s 1,..., s n }, bestaat er precies één geldige output O: O = min{s 1,..., s n }, waarbij de functie min op de totaal geordende verzameling I gedefinieerd wordt zoals gebruikelijk. Dit is een declaratieve beschrijving, omdat zij wel ondubbelzinnig zegt wat moet berekend worden, maar niet hoe. Alternatief zou men het gedrag kunnen beschrijven door middel van een sorteeralgoritme, bijvoorbeeld quicksort. Deze beschrijving gebruikt een concrete datastructuur, en een stapsgewijze berekening van de gewenste functie. Wil men nu het systeem realiseren als een snel, combinatorisch circuit (wat kan, want het gaat over een eindige functie), dan is de structuur van het sorteerprogramma onbruikbaar. Meer nog, men moet de te realiseren functie afleiden uit het programma door een analyse van het laatste, en dan op zoek gaan naar een combinatorische realisatie van de gevonden functie. Wil men echter het systeem realiseren met behulp van een microcontroller, dan is de algoritmische beschrijving uiteraard zeer nuttig, en al een stap naar de realisatie. Men ziet dus dat de declaratieve noch de procedurale beschrijving altijd de meest nuttige zijn. Om deze procedurale beschrijving neer te schrijven heeft men implementatiebeslissingen moeten nemen (de keuze van een algoritme en datatypes,, de structurering van het programma). Deze beslissingen en keuzen kunnen meestal niet overgenomen worden bij de realisatie van het gewenste gedrag in de vorm van een circuit, en moeten dus ongedaan gemaakt worden. Anderzijds is het zo dat de uitvoerbaarheid van de eerste gedragsbeschrijving een nuttige eigenschap is. Inderdaad, een uitvoerbare gedragsbeschrijving maakt een vorm van animatie of simulatie mogelijk, die onschatbare waarde heeft tijdens het formaliseren van het gewenst gedrag. Men kan de formele representatie dan zeer vroeg in het synthesetraject toetsen aan de informele beschrijving het valideren van de formalisering. 15

20 1.2.2 Decompositie, abstractie en verfijning Eens men een gedragsbeschrijving heeft zal men deze moeten aanvullen en verfijnen om te kunnen komen tot een uitvoerbare specificatie. Binnen een gegeven hiërarchisch niveau in het Y-diagram kan men de gedragsbeschrijving herschrijven als een fijnere decompositie. Dit komt omdat de beschrijvingstechnieken die wij gebruiken alle de mogelijkheid hebben om een zekere vorm van hiërarchie in te bouwen in de beschrijving. Bijvoorbeeld, een procedurale beschrijving kan gedecomposeerd worden in elkaar aanroepende functies en procedures; een Boolese functie kan herschreven worden als een samenstelling van eenvoudiger Boolese functies; een eindige automaat kan herschreven worden als een stel gekoppelde of vernestelde automaten; enz. De overstap van een gegeven hiërarchisch niveau in het Y-diagram naar een lager niveau noemt men verfijning. Bijvoorbeeld, de gedragsbeschrijving van een sequentieel proces (systeemniveau) kan gebeuren door een algoritme op algoritmisch niveau; de transformaties uitgevoerd door een algoritme kunnen beschreven worden door een stel primitieve overdrachten op RT-niveau; een operator (bv. een opteller) van het RT-niveau kan beschreven worden door middel van logische Boolese vergelijkingen, en de controlestructuur van een RT-beschrijving kan logisch beschreven worden door een eindige automaat. Verfijning voegt meer detailinformatie toe aan de gedragsbeschrijving. Bijvoorbeeld, in de overgang van het algoritmisch niveau naar het RT-niveau moet men de concrete voorstelling van de gegevens expliciteren. Men zal precies moeten zeggen met hoeveel bits een object moet voorgesteld worden (numerieke precisie), en in welk formaat (2-complement, 1-complement,...). Men zal ook moeten zeggen precies in hoeveel tijdstappen een gegeven transformatie uit het algoritme zal uitgevoerd worden. Bij de overstap naar het Boolese niveau moet men bijkomend zeggen waar elke bit staat (bv. plaats van de tekenbit, representatie van constanten,...). Men zal ook moeten aangeven hoe bepaalde primitieven in het algoritmisch niveau worden gerealiseerd op het lager niveau, bijvoorbeeld de vermenigvuldiging. Wanneer men naar circuitniveau overstapt zal men moeten zeggen of men in positieve of negatieve logica werkt, en waar de logische niveaus precies liggen. Met abstractie bedoelen wij het omgekeerde van verfijning. Het is de stap van een lager niveau naar een hoger. Hierbij behoudt men essentiële aspecten van het gedrag, maar verwijdert men op dat ogenblik irrelevante aspecten. Bijvoorbeeld, wanneer men overstapt van het logisch niveau naar het RT-niveau wordt het irrelevant wat de Boolese functies die een ALU karakteriseren precies zijn. Het enige wat men wil kennen is de functie die gerealiseerd wordt door die ALU op het RT-beschrijvingsniveau, op de datatypes van dat niveau. Ook het gedetailleerd tijdverloop van het logische niveau wordt meestal irrelevant Synthese en analyse Met synthese bedoelen wij de overstap van het gedragsdomein naar het structuurdomein. In feite komt de synthesestap neer op het realiseren van een gedrag door een structuur, die zelf bestaat uit bouwstenen met een primitiever gedrag. Bijvoorbeeld, (combinatorische) synthese op logisch niveau, die wij in hoofdstuk 3 zullen bekeijken, bestaat uit het vinden van een poortnetwerk dat een opgegeven Boolese functie realiseert. Sequen- 16

21 tiële synthese bestaat uit het vinden van een digitale schakeling die een eindige automaat realiseert (hoofdstuk 6). Men verkrijgt een structuur het netwerk en primitieve elementen (poorten, flipflop s). Synthese op RT-niveau bestaat o.m. uit het vastleggen van een datapad, een structuur die bestaat uit registers, ALU s, multiplexers, bussen en een controller, die in staat is alle primitieve operaties van een RT-beschrijving uit te voeren. Het omgekeerde van synthese is analyse. Men krijgt een structuur op een gegeven beschrijvingsniveau, en men heeft als taak het gedrag te bepalen van het circuit, gegeven de gedragsbeschrijving van de primitieven. Bijvoorbeeld, men vertrekt van een poortnetwerk, en men poogt de functie gerealiseerd door dit netwerk te achterhalen. Of men vertrekt van een programmatekst, en men probeert te achterhalen wat dit programma precies doet Fysisch ontwerp: generatie en extractie De generatiestap is het afbeelden van een logische structuur op een concrete, fysische structuur. Deze stap bestaat uit twee deelstappen, in het Engels Technology Mapping en Physical Design genoemd. De eerste deelstap uit het kiezen van de componenten (technologie, bibliotheek), en het (her)verdelen van de functies in de logische structuur over de beschikbare componenten. Bijvoorbeeld, wanneer men een poortnetwerk wil realiseren met discrete poorten, moet men zeggen van elke poort door welk gedeelte van welke chip ze gerealiseerd wordt. Wanneer het ontwerp een EN-poort met 10 ingangen nodig heeft, maar de componentenbibliotheek heeft maar poorten met tot 3 ingangen, dan moet men de 10-ingangspoort in het ontwerp vervangen door een netwerk van 3-ingangspoorten. De interconnectie zelf moet gerealiseerd worden door een fysische interconnectie, bv. op een PCB (Printed Circuit Board) of op het chipoppervlak. Dit vereist de plaatsing van de componenten op de drager en het uitwerken van de routering van de interconnectie. De inverse stap, extractie, is verantwoordelijk voor het extraheren van de logische structuur en een aantal gedragseigenschappen uit een gegeven fysische structuur. Bijvoorbeeld, uit een stel maskers en de kennis van het gebruikte halfgeleiderproces kan men de structuur van het gerealiseerde systeem afleiden (net list extraction). Men kan de circuitelementen identificeren, alsook hun interconnectie en eventueel aanwezige parasitaire elementen. Bovendien kan men een aantal tot dan toe onbekende parameters van de realisatie afleiden, i.h.b. parameters die bepaald worden door de elektrische en geometrische eigenschappen van de interconnectie. De extractie van deze parameters, en het terugvoeren van hun waarden naar de andere niveaus in het Y-diagram, noemt men back annotation. Deze stap is onmisbaar, wil men verifiëren of de gerealiseerde schakeling effectief de opgelegde randvoorwaarden vervult. Vaak kan men enkel precieze informatie krijgen over de snelheid die het circuit zal halen door een parameterextractie, bijvoorbeeld van de sterkte van de capacitieve koppeling van interconnecties met de aarding of onderling. De ongewilde aanwezigheid van parasitaire circuitelementen kan in sommige gevallen ook de oorzaak zijn van een verkeerd gedrag. Aangezien deze elementen niet zichtbaar zijn in de ontwerpsgegevens, is de enige manier om ze te detecteren het uitvoeren van een extractiestap. Fysisch ontwerp strekt zich uiteraard ook uit op de andere hiërarchische niveaus. Dit bevat o.m. het ontwerp van de module-interconnecties, de verpakking, de koeling en het uitwendig voorkomen van het systeem. In het bijzonder voor apparaten waar mensen intensief mee interageren is dit een belangrijk aspect. 17

22 1.2.5 Valideren, verifiëren en testen Correctheid, en het nagaan ervan, is een cruciaal onderdeel van elk syntheseproces. Bij elke stap in het syntheseproces moet men nagaan of de toegepaste transformatiestap correct is. Hoewel er oppervlakkig veel gelijkenis bestaat tussen de stappen die wij nu zullen bespreken, toch zijn er grote verschillen. Deze liggen besloten in het gekende adagium Building the right system versus Building the system right. Valideren. De eerste keer gebeurt dat na de formalisering. Men moet nagaan of de formalisering op een correcte manier de wensen van de opdrachtgever verwoordt het gaat dus over Building the right system. Dit noemt men de validatie van de formalisering 7. Men valideert een formalisering voornamelijk door ze te simuleren, en na te gaan of het geobserveerde gedrag voldoet aan de verwachtingen. Dit is duidelijk een zeer informele procedure, aangezien een misgelopen simulatie wel de aanwezigheid van een probleem kan aantonen, maar een correct verlopen simulatie niet de afwezigheid van mogelijke problemen. Bepaalde aspecten kan men echter ook op een formele manier nagaan. Zo kan men proberen te bewijzen of een geven formalisering sommige formele eigenschappen heeft of niet heeft. Bijvoorbeeld, van een controller voor verkeerslichten wil men dat op geen enkel ogenblik meer dan één rijrichting groen krijgt. Van de controller van een wasmachine wil men dat de verwarming nooit aan gaat wanneer er onvoldoende water aanwezig is, of dat de trommel nooit kan draaien waneer de laaddeur open is. Dit zou men willen nagaan op de formele gedragsbeschrijving, zonder gebruik te moeten maken van (exhaustieve!) simulaties. Sommige formaliseringssystemen stellen de ontwerper in staat vereisten zoals deze te formaliseren als een stelling, en machinegesteund het bewijs te leveren dat de formalisering voldoet aan deze stelling. Er bestaan heel wat technieken die dit mogelijk maken op logisch niveau, waar men bewijsbare uitspraken kan doen over het gedrag van een eindige automaat. Verifiëren. Verifiëren is een verzamelterm voor het nagaan van de correctheid van een vertalingsstap uit de ontwerpshiërachie, waarbij zowel de bron als het resultaat van de stap in machineleesbare vorm staan. Hier gaat het om Building the system right. Alle inverse stappen abstractie, analyse, extractie kunnen aangevuld worden met een verificatiestap. Bijvoorbeeld, bij een extractie zou men willen bewijzen dat de fysische structuur inderdaad overeenkomt met de logische, en dat er bv. geen parasitaire elementen gevormd werden door het layoutproces van de componenten of de interconnectie. Dit heet een LVS-verificatie, van layout versus schematic. In ideale omstandigheden zou men kunnen hopen dat verificatiestappen overbodig zijn, omdat de voorwaartse synthesestap correct is door constructie. Dit is een situatie vergelijkbaar met de situatie van een compiler voor een programmeertaal: compilers zijn zo betrouwbaar geworden dat men er slechts in laatste instantie zal van uit gaan dat een softwarefout veroorzaakt werd door het compilatieproces. Slechts in omstandigheden waar extreme eisen gesteld worden aan betrouwbaarheid zal men de compiler wantrouwen, en de gegenereerde machinecode verifiëren. De synthese van hardware is echter veel complexer, en men heeft nog niet het vertrouwensniveau bereikt dat men heeft bij software. Een aantal stappen in het syntheseproces 7 Net zoals bij andere termen wordt de term validatie in meerdere betekenisen gebruikt in de literatuur. In deze cursus beperken wij ons tot de opgegeven betekenis. 18

23 gebeuren bovendien nog manueel, door de ontwerper. En tenslotte is het zo dat de implementatie van de synthesesoftware zelf eerst correct moet bewezen worden alvorens men kan uitspraken doen over de syntheseproducten. Dit is bij mijn weten voor geen enkel realistische ontwerpomgeving gebeurd. Testen. Testen, tenslotte, is de activiteit die na gaat of de uiteindelijke realisatie van het circuit overeenkomt met de resultaten van het syntheseproces. Men zal nagaan of alle onderdelen functioneren volgens plan. Hiervoor zal men bv. in de interconnectie (bedrading) nagaan of er geen kortsluitingen of open ketens voorkomen, en of alle poorten in het circuit inderdaad functioneren. Het gaat hem dus in wezen over een verificatie van de structuur van de effectieve realisatie. Men zal ook nagaan of het tijdgedrag van het gerealiseerde circuit binnen de vooropgelegde marges ligt (parametrisch testen). 19

24 Hoofdstuk 2 Systeemmodellen op logisch niveau In dit hoofdstuk beginnen wij met onze behandeling van het in vorig hoofdstuk geïdentificeerde logisch niveau. Wij behandelen de beperkte wiskundige basis, namelijk de Boole-agebra s, de Boolese functies en hun concrete voorstellingen. 2.1 Boole-algebra s De abstractie op logisch niveau van digitale circuits wordt gekenmerkt door signalen die maar een eindig aantal waarden kunnen aannemen. Een geschikt wiskundig model van het gedrag van de bouwstenen moet deze discrete aard, en de gerealiseerde verbanden tussen de in- en uitgangssignalen van de schakelingen weerspiegelen. Dit gebeurt door middel van wiskundige structuren die men Boole-algebra s noemt. 1 Deze wiskundige structuren en hun eigenschappen zijn ongetwijfeld reeds aan bod gekomen in andere opleidingsonderdelen; ter volledigheid, en als definitie van de gebruikte notatie, geven wij hier een korte herinnering. Definitie 2.1 Een Boole-algebra B over een eindige verzameling B = {b 1,..., b m } is een structuur B =< B, +,, 0, 1 > die voldoet aan de volgende eisen: 1. + en zijn twee binaire bewerkingen op B, d. w. z. x, y B : x + y B en x y B; 2. + en zijn commutatief en associatief; 3. + is distributief m. b. t., en is distributief m. b. t. +; 4. B bevat twee identiteitselementen 0 en 1, waarvoor geldt x B : x + 0 = x en x 1 = x; 5. Voor elk element x B bestaat er een complement x waarvoor geldt x+x = 1 en x x = 0. Voorbeeld 2.1 Voorbeelden van Boole-algebra s: 1 Wij gebruiken de termen Boole-algebra en Boolese functie i.p.v. Booleaanse algebra resp. Booleaanse functie, dit in analogie met Besselse functie. 20

25 Voor een eindige verzameling S noteren wij met P(S) de verzameling van alle deelverzamelingen van S (de machtsverzameling, eveneens eindig). Dan is een Boole-algebra. < P(S),,,, S > Weze B = {0, 1}. Dan is B 1 =< {0, 1}, +,, 0, 1 > een Boole-algebra, de binaire Boolese algebra. De definitie van +,, en volgt rechtstreeks uit definitie 2.1. Weze B = {0, 1} n. Dan is B n =< {0, 1} n, +,, 0 n, 1 n > een Boole-algebra. De operaties +, en zijn de componentsgewijze uitbreiding van de operaties in B Onmiddellijke eigenschappen Uit de definitie van een Boole-algebra kunnen wij meteen een aantal interessante eigenschappen afleiden. Onderstaande eigenschappen gelden voor willekeurige a, b B. Wij laten het aan de lezer over deze eigenschappen te bewijzen (zie oefeningen) = 1 en 1 = 0; 2. a + a = a (Idempotentie van +); 3. a a = a (Idempotentie van ); 4. a + 1 = 1 (Absorptie door 1); 5. a 0 = 0 (Absorptie door 0); 6. a + a b = a; 7. a (a + b) = a; 8. a is uniek (Uniciteit van invers); 9. (a ) = a; 10. (a + b) = a b (Stelling van De Morgan); 11. (a b) = a + b (Stelling van De Morgan); 12. a + a b = a + b; 13. a (a + b) = a b Een alternatieve definitie gebaseerd op ordening Men kan een Boole-algebra over een verzameling B ook definiëren op basis van een ordening van de elementen van B. Een binaire relatie op B is een partiële ordening wanneer 1. zij reflexief is: x B : x x; 2. zij antisymmetrisch is: x y en y x x = y; 3. zij transitief is: x y en y z x z. 21

26 Koppels x, y die niet tot behoren zijn niet vergelijkbaar. Zo kan men b.v. in B n de elementen componentsgewijze ordenen: weze x = (x 1,..., x n ) en x = (x 1,..., x n) elementen van B n. We hebben dan dat x x indien x i x i i. Men kan dus zeggen dat (0010) (0110), maar (0010) en (0100) zijn niet vergelijkbaar. Hoewel dus slechts partieel is hebben x en x wel steeds een gemeenschappelijke grootste ondergrens glb(x, x ) en een kleinste bovengrens lub(x, x ) in B n. In het algemeen zegt men dat z de kleinste bovengrens is van x en y, z = lub(x, y), indien 1. x z en y z 2. u: x u en y u geldt dat z u. Partieel geordende structuren die gesloten zijn onder lub en glb noemt men tralies. Men kan de binaire operaties lub en glb ook in de meer vertrouwde infix-notatie schrijven; zij definiëren dan inwendige samenstellingswetten + en als volgt: glb(x, y) = x y lub(x, y) = x + y Wanneer + en distributief zijn t.o.v. elkaar noemt men de tralie distributief. Wanneer bovendien universele boven- en ondergrenzen b max en b min kunnen gevonden worden in B heet de tralie begrensd. Wanneer tenslotte voor elk element b B een ander element b B kan gevonden worden waarvoor geldt dat b max = b + b = lub(b, b ) en b min = b b = glb(b, b ) is de tralie distributief, universeel begrensd, en gecomplementeerd. Een dergelijke tralie heet Boole-algebra. Deze definitie is interessant omdat zij bijkomende structuur oplevert in een Boolealgebra: elke Boole-algebra bezit dus van nature uit een partiële ordening, gedefinieerd door de operaties + en. Bijvoorbeeld, in de algebra < P(S),,,, S > is de natuurlijke ordening de setinclusie ; in B n =< {0, 1} n, +,,, 0 n, 1 n > is het de componentsgewijze ordening hierboven beschreven Andere eigenschappen Dualiteit Zowel de definitie van een Boole-algebra, als de eigenschappen die eruit volgen, bezitten een kenmerkende dualiteit onder de afbeelding d Zo zijn b.v. eigenschappen 2 en 3, 4 en 5, en 6 en 7 hierboven elkaars duaal. Deze dualiteit kan gebruikt worden om, eens een stelling bewezen, ook snel het bewijs te leveren van de duale stelling. Dualiteit komt verder in deze cursus herhaaldelijk aan bod. 22

27 Verscheidenheid van Boole-algebra s Stelling 2.1 Elke eindige Boole-algebra is isomorf met de Boole-algebra < P(S),,,, S > voor een geschikte basisverzameling S. Bewijs. zie [Stone73] Deze stelling heeft belangrijke consequenties: zo is het aantal elementen in elke eindige Boole-algebra steeds een macht van 2 (er bestaat dus geen ternaire Boole-algebra!). Men moet dus in feite maar één enkele eindige Boole-algebra bestuderen. Atomen van Boole-algebra s Definitie 2.2 (Atomen van een Boole-algebra) Een element x 0 van een Boole-algebra B is een atoom als voor elk element y x geldt dat y = 0 of y = x. De atomen van een Boole-algebra zijn dus zijn kleinste niet-nulelementen. In het geval van onze Boole-algebra < P(S),,,, S > zijn dit de deelverzamelingen van S met precies één element. Een Boole-algebra met 2 n elementen heeft precies n atomen. Atomen vormen de primitieve bouwstenen van de algebra, men kan er elk ander element mee bouwen. Dit volgt uit de volgende stelling. Stelling 2.2 (Compositiewet voor de atomen) In een eindige Boole-algebra kan elk element ondubbelzinnig en op unieke wijze geschreven worden als een som (met de +-operator van de Boole-algebra) van een deelverzameling van de atomen. Bewijs. zie [Stone73] Met n atomen kan men inderdaad precies 2 n deelverzamelingen (en dus elementen) maken (inclusief de ledige verzameling, die bij conventie het 0-element oplevert). 2.2 Boolese functies De basisverzameling B beschrijft de signaalwaarden van een elementair schakelelement of een poort. De relaties tussen de signalen op deze elementen en hun interconnecties in netwerken hebben dikwijls een functie-karakter (combinatorische functies), en kunnen dan beschreven worden door middel van Boolese functies. De volgende definities geven vorm aan de Boolese functies. Definitie 2.3 Een Boolese functie f(x 1,..., x n ) van n Boolese veranderlijken is een afbeelding van B n op B: f(x 1,..., x n ) : B n B. Het aantal functies van een eindige verzameling X, met kardinaalgetal X, naar een eveneens eindige verzameling Y is eindig, en wordt gegeven door Y X (bewijs dit). Toegepast op het geval X = {0, 1} n en Y = {0, 1} vinden wij dat het aantal binaire Boolese functies van n binaire variabelen 2 2n bedraagt. Definitie 2.4 De verzameling {0, 1} n {0, 1} van alle binaire Boolese functies van n binaire variabelen noemen wij F n. 23

28 In F n kunnen wij ook interne samenstellingswetten + en definiëren op de volgende wijze. Definitie 2.5 Weze g, f F n. De functiesom h( ) = (f + g)( ) wordt gegeven door { 0, als g(x1,..., x n ) = 0 en f(x 1,..., x n ) = 0 h(x 1,..., x n ) = 1, in alle andere gevallen. Het functieproduct h( ) = (f g)( ) wordt gegeven door { 1, als f(x1,..., x n ) = 1 en g(x 1,..., x n ) = 1 h(x 1,..., x n ) = 0, in alle andere gevallen. Definitie 2.6 De nulfunctie f 0 en de éénfunctie f 1 worden gedefinieerd als f 0 (x 1,..., x n ) f 1 (x 1,..., x n ) = 0, (x 1,..., x n ) {0, 1} n = 1, (x 1,..., x n ) {0, 1} n Wij zullen f 0 (x 1,..., x n ) ook schrijven als 0, en f 1 (x 1,..., x n ) als 1. Uit definities 2.5 t.e.m. 2.6 volgt dat F n =< F n, +,, f 0, f 1 > een Boole-algebra is (bewijs dit). Wat is de natuurlijke ordening op F n? Definitie 2.7 Het gewicht van een functie f(x 1,..., x n ) is het aantal waarden van (x 1,..., x n ) {0, 1} n waarvoor f(x 1,..., x n ) = 1. Een functie f(x 1,..., x n ) is monotoon (niet-dalend) als (x 1,..., x n ) (y 1,..., y n ) f(x 1,..., x n ) f(y 1,..., y n ). Een functie f(x 1,..., x n ) is symmetrisch als f(x 1,..., x n ) = f(x π(1),..., x π(n) ), voor alle permutaties π. Boolese functies kunnen diverse andere nuttige eigenschappen hebben, zoals zelfdualiteit en unaatheid. Deze eigenschappen komen verderop aan bod; in de oefeningen wordt er dieper op ingegaan. 2.3 Representaties van Boolese functies Boolese functies zijn eindige objecten, en in tegenstelling tot wat het geval is bij reële functies, kan men elke Boolese functie expliciet neerschrijven. Er bestaan diverse representatievormen voor Boolese functies; niet alle zijn echter even geschikt voor verdere (geautomatiseerde) verwerking. Representaties hebben bij voorkeur een aantal gunstige eigenschappen. Onder gunstige eigenschappen verstaat men onder andere De compactheid van de representatie: hoeveel plaats neemt de representatie van een functie in (in het computergeheugen)? Noteer hierbij dat, als men alle functies van n variabelen wil representeren, men noodgedwongen een gemiddelde representatielengte moet hebben die exponentieel groeit in n. De reden hiervoor is dat er 2 (2n ) objecten moeten kunnen gerepresenteerd worden met een eindig alfabet; dit vraagt nu eenmaal namen met een gemiddelde lengte van O(2 n ). Wat er echter wel zo is dat, afhankelijk van het soort representatie, eenvoudige of veel voorkomende functies een beduidend kortere representatie hebben. 24

29 x 1 x 2 x 3 f(x 1, x 2, x 3 ) Figuur 2.1: De waarheidstabel van een Boolese functie De toegankelijkheid van de representatie. Een representatie is des te beter naarmate zij de essentiële eigenschappen van de functie blootlegt, zodanig dat de algoritmen die zich moeten baseren op deze representatie, dit kunnen doen met zo weinig mogelijk extra werk. In het bijzonder zullen wij verderop zien dat voor meerdere representaties, er een nogal sterke band bestaat tussen de structuur (syntaxis) van de representatie, en de structuur (topologie) van het netwerk dat de functie realiseert. Wij zullen nu enkele concrete representaties beschrijven Grafische representaties De waarheidstabel Deze representatie is een tabel waarvan de linkerkolom bestaat uit de 2 n mogelijke elementen van {0, 1} n, lexicografisch geordend. De rechterkolom bevat de functiewaarde f(x 1,..., x n ) voor dat element (fig. 2.1). Noteer dat deze representatie een lengte heeft die groeit als n2 n (dit wil zeggen, exponentieel in het aantal variabelen n), en vrij snel onbruikbaar wordt voor grotere n. Noteer dat elke Boolese functie een even lange representatie heeft, zelfs de meest triviale functies zoals 0 en 1. Noteer ook dat mogelijke speciale eigenschappen van een functie, zoals bv. symmetrie, in het geheel niet naar voor komen in deze representatie. De hyperkubus en de karnaugh-kaart Wanneer wij de rij (x 1,..., x n ) beschouwen als de coördinaten van een punt in de n-dimensionale ruimte, zien wij dat de 2 n elementen uit {0, 1} n de hoekpunten voorstellen van een n-dimensionale kubus met zijde 1. Een functie f(x 1,..., x n ) kan dan worden voorgesteld door het aanmerken van die hoekpunten van een n-kubus waarvoor de functie de waarde 1 aanneemt (fig. 2.2). De kubus heeft een nuttige geometrische en topologische structuur, bruikbaar bij de representatie van functies. Noteer in dit verband dat de zijden van de kubus steeds elementen verbinden die vergelijkbaar zijn onder de natuurlijke ordening, en dat de coördinaten van verbonden hoekpunten slechts in één positie verschillen. 25

30 1 (111) 0 (011) 1 (110) 1 (010) 0 (101) 0 (001) 0 (100) 1 (000) Figuur 2.2: De functie van fig. 2.1 in de hyperkubus Op de n-kubus kan een afstandsmaat worden gedefinieerd: de hamming-afstand. Definitie 2.8 De hamming-afstand tussen twee hoekpunten (x 1,..., x n ) en (y 1,..., y n ) van de n-kubus is het aantal zijden dat men moet doorlopen om van het ene punt naar het andere te gaan. Merk op dat dit tevens het aantal plaatsen is waarin (x 1,..., x n ) en (y 1,..., y n ) verschillen. De hamming-afstand voldoet aan alle eigenschappen van een metriek (symmetrie, positiviteit, driehoeksongelijkheid). Het zijn overigens deze eigenschappen die ons toelaten deze functie een afstand te noemen. Voor kleine waarden van n kan de n-kubus ook vlak gerepresenteerd worden, onder de vorm van een karnaughkaart. In fig. 2.3 wordt het proces verduidelijkt: men vouwt eerst de kubus open tot wanneer hij vlak wordt; nadien vervangt men knooppunten op afstand 1 door aangrenzende vierkantjes. Vierkanten die minder dan n buren hebben in een n-variabele kaart moet men als aangrenzend beschouwen aan vierkanten aan het horizontaal of vertikaal overliggend vierkant aan het andere uiteinde van de kaart. De essentie van een karnaughkaart is dus dat aangrenzende cellen alle hamming-afstand 1 hebben. Noteer dat, evenals de waarheidstabel, ook de karnaugh-kaart snel groot wordt, ongeacht de functie die gerepresenteerd wordt: de oppervlakte groeit als 2 n. Karnaughkaarten worden onpraktisch voor n = 5 (twee kaarten van n = 4) en onbruikbaar voor n > 5, omdat de eis van afstand 1 door aangrenzing nog slechts voor een kleine fractie van de cellen opgaat. Het nut van Karnaugh-kaarten is hoofdzakelijk conceptueel, omdat zij vaak een uitstekende representatie vormen waneer men wenst te redeneren over de eigenschappen van functies Basisfuncties voor Boolese functies Daar F n een Boole-algebra is, geldt dat elke functie in F n kan geschreven worden als het resultaat van een binaire operatie (+ of ) tussen twee functies uit F n. Zoals reeds gezegd genereren in elke Boole-algebra de atomen de hele Boole-algebra ([Stone73], pag. 376). Elk element uit de Boole-algebra kan dan op een unieke manier geschreven worden als een combinatie van atomen met de operator +. Het blijkt zelfs dat, naast de atomen, 26

31 1 (000) 1 (010) 1 (110) 0 (100) 0 (001) 0 (011) 1 (111) 0 (101) x x x 2 Figuur 2.3: De overgang van n-kubus naar karnaugh-kaart er een aantal andere stellen basisfuncties kunnen gevonden worden. Wij zullen er twee stellen basisfuncties bespreken. Mintermen en mintermfuncties Mintermfuncties zijn de atomen van de Boolealgebra F n. Het zijn de 2 n functies met gewicht 1 (zie def. 2.7). D.w.z., een mintermfunctie m( ) wordt volledig beschreven door die ene waarde van (x 1,..., x n ) {0, 1} n waarvoor m(x 1,..., x n ) = 1. Er zijn 2 n mintermfuncties in F n (waarom?). Een eenvoudige naamgeving van de mintermfuncties kan verkregen worden door de combinaties (x 1,..., x n ) af te beelden op de gehele getallen als volgt : ν : {0, 1} n {0, 1,..., 2 n 1} met ν(x 1,..., x n ) = n i=1 x i 2 n i, waarin x i in het rechterlid geïnterpreteerd wordt als het gehele getal 0 of 1. De afbeelding ν is een isomorfisme (bewijs), en is dus inverteerbaar. Het bitpatroon ν 1 (i), 0 i 2 n 1, is niets anders dan de binaire representatie van i. De 2 n mintermfuncties m 0,..., m 2 n 1 kunnen dan worden benoemd als volgt : m k (x 1,..., x n ) = { 1, als ν(x1,..., x n ) = k 0, anders. De mintermfuncties vormen een complete basis voor F n, zoals aangegeven door de volgende stelling. Stelling 2.3 (Normaalvorm) Elke Boolese functie kan op een unieke manier voorgesteld worden als de functiesom van mintermfuncties. 27

32 Bewijs. Volgt onmiddellijk uit stelling 2.2. Voorbeeld 2.2 Voorbeeld van mintermcompositie. door haar waarheidstabel Beschouw de functie f als gedefinieerd De mintermfunctierepresentatie is x 1 x 2 x 3 ν(x 1, x 2, x 3 ) f(x 1, x 2, x 3 ) f(x 1, x 2, x 3 ) = (m 0 + m 2 + m 6 + m 7 )(x 1, x 2, x 3 ). Meestal wordt deze notatie ingekort tot f = (0, 2, 6, 7). Noteer dat deze notatie niet steeds een exponentiële lengte heeft in n. Noteer ook dat, wanneer wij de mintermfuncties op een vaste manier ordenen, deze representatie canonisch is. Wij komen hier wat verder formeel op terug. Spectrale representaties De canonische mintermexpansie is lang niet de enige basisfunctierepresentatie van een Boolese functie. In analogie met reële functies kan men ook representaties uitdenken in termen van een ander orthonormaal stel basisfuncties, zoals b.v. de reële periodieke trigoniometrische functies. Een bruikbare set basisfuncties in {0, 1} n zijn de Hadamardfuncties, de rijen uit de Hadamard-matrix T n. De Hadamard-matrix T n wordt recursief als volgt gedefinieerd: T 0 = [1] T 1 = T n = [ ] [ T n 1 T n 1 T n 1 T n 1 ] = T n 1 [ ] = T n 1 T. Hierin zijn 1 en 1 gehele getallen en is het Kronecker-produkt. Noteer dat T n dimensie 2 n 2 n heeft. Elke rij uit T n kan dus beschouwd worden als de waarheidstabel (met waarden in { 1, 1} ) van een Boolese functie (fig. 2.4). De rijen uit T n zijn paarsgewijs orthogonaal: 2 n 1 k=0 t jk t lk = { 2 n, j = l 0, in alle andere gevallen. 28

33 De matrix T n is inverteerbaar, en men kan nagaan dat (T n ) 1 = 2 n T n. De Hadamard-matrix definieert een transformatie op {0, 1} 2n : T n : {0, 1} 2n Z 2n, d.w.z. ook op de waarheidstabellen van functies uit F n. Weze f b {0, 1} 2n de waarheidstabel van f(x 1,..., x n ), gerepresenteerd als kolommatrix. De Hadamard-transformatie van f b wordt dan gegeven door f H = T n f b, eveneens een kolommatrix, maar met gehele elementen. De getallenrij f H is een unieke representatie van f(x 1,..., x n ). Elk element uit f H zegt echter iets over het globale gedrag van f(x 1,..., x n ) op {0, 1} n, en niet het lokale gedrag zoals vastgelegd door de mintermfuncties. Wanneer men de betekenis van de coëfficiënten van f H nauwkeuriger onderzoekt, dan vindt men dat zij kunnen geïnterpreteerd worden als de gelijkenis (correlatie) van de functie f(x 1,..., x n ) met respectievelijk de volgende functies (de notatie wordt verderop geformaliseerd): 1 de DC-term, het gewicht van f 1 x 3 de functie die 1 is wanneer x 3 = 0 is 1 x 2 1 x 3 x 2 de functie die 1 is wanneer x 2 = x 3 1 x 1 1 x 1 x 1 1 x 2 x 1 1 x 1 x 2 x 3 Naast de Hadamard-transformatie bestaan er nog een aantal andere spectrale transformaties zoals de Rademacher-Walshtransformaties en de Haar-transformaties. Spectrale representaties worden veel minder gebruikt dan mintermrepresentaties. Zij zijn vooral nuttig in de classificatie en de studie van de eigenschappen van Boolese functies, en in test- en diagnosetechnieken van digitale netwerken. Soms worden zij gebruikt bij de synthese van poortnetwerken. In deze cursus gaan wij er niet verder op in, en voor een dieper inzicht verwijzen wij naar de literatuur (b.v. [Hurst85]). Reed-Muller representaties In B n kunnen wij de operatie, die wij al eerder tegenkwamen, definiëren als volgt: x y = x y + x y. Met deze definitie van wordt B n een eindige, commutatieve groep met 0 als eenheidselement. Het interessante hieraan is dat, onder inversen 2 bestaan. Dit wil zeggen: x x : x x = 0. In feite is ieder element zijn eigen invers: x : x x = 0. De operator krijgt dus gelijkaardige rekenregels als de optelling van gehele getallen; men kan o.m. in een vergelijking termen van lid laten veranderen. Omgekeerd kunnen wij de operator + uitdrukken in termen van en als volgt: x + y = x y x y 2 Noteer dat invers wat anders betekent dan het complement uit de Boole-algebra! 29

34 f H = = x 3 1 x 2 1 x 3 x 2 1 x 1 1 x 1 x 1 1 x 2 x 1 1 x 1 x 2 x 3 Figuur 2.4: De Hadamard-matrix en de hadamard-transformatie van de functie f(x 1, x 2, x 3 ) = (0, 2, 6, 7) uit ons vorig voorbeeld. De operator wordt gedefinieerd in de tekst (bewijs dit). Dit betekent dat het stel operatoren en een volledig stel is, d.w.z., alle elementen die kunnen gevormd worden door + en kunnen ook gevormd worden door en. Op deze eigenschappen zijn de Reed-Muller-representaties van Boolese functies gesteund. Laat met i = ν(y 1, y 2,..., y n ) zoals hierboven gedefinieerd, de verzameling S i = {k : y k = 1} overeenkomen. S i is dus niets anders dan de verzameling van posities waar de binaire representatie van i een 1 heeft. De basisfuncties g i worden dan gegeven door 3 g i (x 1,..., x n ) = x j, i = 0, 1,..., 2 n 1. j S i Men gebruikt als basisfuncties dus de 2 n produkten van mogelijke deelverzamelingen S i van de variabelen {x 1, x 2,..., x n }. De representatiestelling luidt dan als volgt: elke functie f(x 1,..., x n ) kan op een unieke wijze geschreven worden als: = 2 n 1 i=0 C i g i (x 1,..., x n ) = 2 n 1 i=0 C i j S i x j, waarbij de som nu staat voor de n-aire uitbreiding van, en waarbij C i {0, 1}. De basisfuncties zijn dus niet de mintermfuncties. Noteer overigens dat telkens wanneer de basisfunctie g i (x 1,..., x n ) de waarde 1 aanneemt, dit ook het geval is voor alle functies g k waarvoor S k S i. Meer formeel: S i S k g i (x 1,..., x n ) g k (x 1,..., x n ). Deze representatie is uniek en compleet, d.w.z., voor elke functie f kan een uniek stel coëfficiënten C i B, i = 0, 1,..., 2 n 1 gevonden worden zodanig dat de functie inderdaad wordt voorgesteld door de bovenstaande uitdrukking. De coëfficiënten kunnen berekend worden door de inversie van deze uitdrukking als volgt. Noteer dat voor elk punt (x 1,..., x n ) {0, 1} n geldt: f(x 1,..., x n ) = i:s i S ν(x1,...,xn) dit wegens de ordening van de basisfuncties. Voor dit type van vergelijkingen op de tralie van de deelverzamelingen van {0, 1} n bestaat er een techniek die Möbius-inversie 3 Een product over de ledige verzameling levert de functie 1 op. C i, 30

35 heet. Volgens deze techniek wordt de oplossing van het bovenstaande stelsel gegeven door C i = ( 1) S i S j f(ν 1 (j)), j:s j S i waarin ν 1 (j) de binaire representatie is van j, en S i de cardinaliteit is van S i. Het bewijs hiervan kan geleverd worden door eenvoudige substitutie van de oplossing in de opgave. De vermenigvuldiging met 1 betekent het gebruik van het additief invers onder de operatie. Gezien onder in B n elk element zijn eigen invers is, kunnen wij de inversie gewoon weglaten: C i = f(ν 1 (j)). j:s j S i Voorbeeld 2.3 Voorbeeld van Reed-muller-representatie. Neem de functie uit bovenstaand voorbeeld. Wij verkrijgen het stel vergelijkingen f(000) = 1 = C 0 f(001) = 0 = C 0 C 1 f(010) = 1 = C 0 C 2 f(011) = 0 = C 0 C 1 C 2 C 3 f(100) = 0 = C 0 C 4 f(101) = 0 = C 0 C 1 C 4 C 5 f(110) = 1 = C 0 C 2 C 4 C 6 f(111) = 1 = C 0 C 1 C 2 C 3 C 4 C 5 C 6 C 7. Door Möbius-inversie wordt hieruit verkregen: C 0 = f(000) = 1 C 1 = f(001) f(000) = 1 C 2 = f(010) f(000) = 0 C 3 = f(011) f(010) f(001) f(000) = 0 C 4 = f(100) f(000) = 1 C 5 = f(101) f(100) f(001) f(000) = 1 C 6 = f(110) f(100) f(010) f(000) = 1 C 7 = f(111) f(110) f(101) f(100) f(011) f(010) f(001) f(000) = 0, of f(x 1, x 2, x 3 ) = 1 x 3 x 1 x 1 x 3 x 1 x 2. Reed-Mullerrepresentaties worden gebruikt bij de synthese van combinatorische netwerken, en bij het testen ervan. In deze cursus zullen wij echter niet dieper ingaan op hun gebruik (zie b.v. [Green86, Lewin92]) Tekstuele representaties: Boolese vormen Waarheidstabellen en karnaughkaarten zijn letterlijke representaties van functies, waarvan de afmeting (exponentieel in n) niet afhangt van de functie zelf. Dit is ook zo voor de spectrale representaties: steeds heeft men 2 n coëfficiënten nodig. 31

36 Minterm- en Reed-Mullerrepresentaties zijn ietwat beter in dit opzicht, omdat niet alle functies een even lange voorstelling hebben. Toch kan het nog steeds zijn dat eenvoudige functies een zeer lange representatie hebben, en omgekeerd. Uiteraard hangt deze uitspraak wezenlijk af van wat wij bedoelen met eenvoudig. Iedereen is het er echter over eens dat de functie 1 zeer eenvoudig is. Deze functie heeft nochtans een exponentieel lange mintermrepresentatie! Boolese vormen zijn tekstuele representaties: dit zijn sequenties van alfanumerieke tekens die aan welbepaalde grammaticale regels voldoen. Deze tekstuele representaties zijn over het algemeen veel compacter dan de grafische representaties en zijn behandelbaar door een algoritme (computer). Wij zullen zien dat Boolese vormen o.m. mintermrepresentaties tekstueel kunnen voorstellen en dus minstens de eigenschappen bezitten van deze representaties; in feite zijn zij echter veel krachtiger. Boolese vormen zijn de concrete gedaante waarin Boolese functies voorgesteld worden in ontwerptalen zoals VHDL, Verilog of Abel, zij het steeds in de syntaxis opgelegd door de taal. Wij zullen hier een eenvoudige, abstracte syntaxis definiëren, die de essentiële aspecten van Boolese vormen vat, en bruikbaar is bij de concrete representaties. Definitie 2.9 De verzameling V n van Boolese vormen (BV) over X 1,..., X n bestaat uit alle eindige sequenties van letters die voldoen aan 1. de ledige uitdrukking Λ is een BV; 4 2. de symbolen 0 en 1 zijn BVn; 3. X i en X i, i {1,..., n} zijn BVn; 4. indien A een BV is, dan zijn ook (A) en (A) BVn; 5. indien A en B BVn zijn, dan zijn ook A + B en A B BVn. Hoewel V n slechts sequenties van eindige lengte bevat is V n niet eindig; V n is echter wel een aftelbare verzameling (waarom?). Voorbeeld 2.4 Voorbeelden van Boolese vormen. De sequenties X 1 ((X 1 + X 3 ) X 3 ) (((0))) zijn Boolese vormen. Noot. Noteer dat wij dikwijls de niet schrijven; wanneer wij echter de vorm als input opgeven voor computermanipulatie, moeten wij dit symbool wel degelijk neerschrijven, tenzij wij de aanwezigheid ervan ondubbelzinnig kunnen veronderstellen. In onze Maple-suite hebben wij gekozen voor het laatste. De prijs die wij ervoor betalen is dat 4 Dit is een pathologische uitzondering, die wij enkel om formele redenen opnemen. 32

37 elke variabelenaam nu precies één letterteken lang moet zijn, omdat de streng AB eigenlijk geïnterpreteerd wordt als A B. Boolese vormen kunnen allerhande mathematische objecten voorstellen, al naar gelang van de interpretatie die men geeft aan de symbolen. In de huidige context wensen wij dat Boolese vormen elementen uit F n voorstellen. In F n zijn er slechts 2 2n verschillende elementen. Een zinvolle interpretatie vereist dus dat wij op V n een equivalentierelatie definiëren waaronder Boolese vormen equivalent zijn indien zij dezelfde functie representeren. Deze equivalentierelatie wordt gedefinieerd door de volgende interpretatieregels. Definitie 2.10 Een assignatie is een functie α : {X 1,..., X n } {0, 1}. De assignatie kent een waarde 0 of 1 toe aan elke variabele X i, i = 1,..., n. Er bestaan 2 n assignaties voor de variabelen X i, i = 1,..., n. Definitie 2.11 Een valuatie onder de assignatie α is een functie α : V n {0, 1} die voldoet aan de volgende regels: 1. Λ α = 0; 2. 0 α = 0; 1 α = 1; 3. X i α = α(x i ), i = 1,..., n; 4. (A) α = ( A α ) ; 5. A + B α = A α + B α ; 6. A B α = A α B α. Een valuatie interpreteert de symbolen +, en uit V n als de corresponderende operatoren uit F n, en interpreteert de variabelen X i als hun Boolese waarde onder de assignatie α. Elke Boolese vorm v stelt een Boolese functie v of f v voor, gedefinieerd door: α : f v (α(x 1 ),..., α(x n )) = v α Definitie 2.12 Twee Boolese vormen v 1 en v 2 zijn equivalent, v 1 v 2, indien d. w. z. indien f v1 = f v2. α : v 1 α = v 2 α, 2 2n equivalentie- Daar er 2 2n verschillende functies zijn in F n, induceert de relatie klassen in V n. Er bestaat een bijectie tussen deze klassen en F n. Opmerking. Bovenstaande definities maken het mogelijk dat een algoritme (een computer) in een eindige tijd kan uitmaken of twee willekeurige Boolese vormen equivalent zijn. Dit impliceert ook dat er een algoritme bestaat dat voor elke vorm v een equivalente vorm v min van minimale lengte kan bepalen. Dit is mogelijk dank zij de eenvoud van F n. In meer ingewikkelde stelsels, zoals b.v. de eerste-orde predikaatlogica of de klasse van de recursieve functies, is het algoritmisch bepalen van de equivalentie of het vinden van een minimale vorm niet algemeen mogelijk (een gevolg van de stellingen van Gödel en Church). 33

38 Dualiteit van Boolese vormen Als gevolg van definitie 2.1 is het niet te verwonderen dat op V n een dualiteitsrelatie kan worden gedefinieerd die de basisdualiteit van de Boole-algebra reflecteert. De dualiteitsrelatie D wordt als volgt gedefinieerd (wij beperken ons tot niet-ledige vormen). Definitie 2.13 De dualiteitsafbeelding D is een functie D : V n V n die voldoet aan: 1. D(0) = 1 en D(1) = 0 2. D(X i ) = X i, voor i = 1,..., n 3. D(A + B) = D(A) D(B) 4. D(A B) = D(A) + D(B) 5. D(A ) = (D(A)) Voorbeeld 2.5 Dualiteit in Boolese vormen. v = ((X 1 + X 2 ) X 3 ) D(v) = (D((X 1 + X 2 ) X 3 )) (5) = (D(X 1 + X 2 ) + D(X 3 )) (4) = ((D(X 1 ) D(X 2 )) + D(X 3 )) (3) = ((X 1 X 2 ) + X 3 ) (2) Wij moeten nu echter nog nagaan of deze definitie inderdaad correspondeert met de eigen dualiteit in de Boole-algebra F n. Dat dit zo is volgt uit de volgende lemma s en stelling. Lemma 2.1 De complementering van de variabelen in een mintermfunctie m j leidt tot de mintermfunctie m 2 n 1 j: m j (x 1,..., x n) = m 2 n 1 j(x 1,..., x n ). Bewijs. Het bewijs volgt onmiddellijk uit de definitie van m j en ν(x 1,..., x n ). Het volgende lemma is eveneens zeer nuttig. Lemma 2.2 Indien f(x 1,..., x n ) = j S f m j (x 1,..., x n ), dan is waarbij f (x 1,..., x n ) = m j (x 1,..., x n ) j S f C S f C = {0, 1,..., 2 n 1} S f. 34

39 Bewijs. Het bewijs is triviaal. Met deze lemma s kunnen wij nu de volgende stelling bewijzen. Stelling 2.4 De functie f D(v), voorgesteld door de duale vorm van v, is het functie-complement van f v toegepast op gecomplementeerde variabelen, f D(v) (x 1,..., x n ) = f v (x 1,..., x n). Bewijs. Het bewijs steunt op een inductie op de lengte van v. 1. v bestaat uit één symbool: 0, 1, of X i. D(0) = 1 = m j (x 1,..., x n ) = = j {0,1,...,2 n 1} j {0,1,...,2 n 1} = j {0,1,...,2 n 1} m j (x 1,..., x n) j C = f 0 (x 1,..., x n); m 2 n 1 j(x 1,..., x n ) m j (x 1,..., x n) D(1) = 0 = m j (x 1,..., x n) = f 1 (x 1,..., x n); j D(X i ) = X i = m j (x 1,..., x n ). j S Xi Hierin is S Xi = {ν(x 1,..., x i 1, 1, x i+1,..., x n ) : x j {0, 1} en j i} en S C X i = S Xi = {ν(x 1,..., x i 1, 0, x i+1,..., x n ) : x j {0, 1} en j i}. Noteer dat j S Xi 2 n 1 j S Xi. Wij vinden dus D(X i ) = j S Xi m j (x 1,..., x n ) = j S Xi m 2 n 1 j(x 1,..., x n) = j S C X i m j (x 1,..., x n) = f X i (x 1,..., x n). 35

40 2. (Inductiestap.) Veronderstel dat v bestaat uit n > 1 symbolen, en dat de stelling geldt voor alle Boolese vormen met lengte kleiner dan n. Uit definitie 2.9 volgt dan dat v werd gevormd door de toepassing van de regels 2.9(4) of 2.9(5). Wij passen deze regels toe (abstractie makend van haakjes, die louter zorgen voor groepering). D(v ) = (D(v)) = ( D(v) ) = (f v(x 1,..., x n)) = f v (x 1,..., x n) = f v (x 1,..., x n); (volgens 2.11(3)) D(v 1 + v 2 ) = D(v 1 )D(v 2 ) = D(v 1 ) D(v 2 ) = (f v 1 f v 2 )(x 1,..., x n) = (f v1 + f v2 ) (x 1,..., x n) = f v 1 +v 2 (x 1,..., x n); D(v 1 v 2 ) = f v 1 v 2 (x 1,..., x n). (duaal van hierboven) Punten 1 en 2 bewijzen de stelling. Deze dualiteitseigenschap is uiteraard op theoretische gronden interessant. Zij heeft echter ook belangrijke praktische consequenties: het kan soms gebeuren dat f D(v) te duur is om te realiseren in een bepaalde technologie, en dat f v veel goedkoper is. De relatie f D(v) (x 1,..., x n ) = f v(x 1,..., x n) laat dan toe f D(v) te realiseren als een functiesamenstelling van f v en n + 1 complementeringen, wat veel eenvoudiger kan uitvallen dan de rechtstreekse realisatie van f D(v). Dit alternatief zal later nog aan bod komen. Bovendien geeft deze stelling de essentie weer van het CMOS-concept, waarin de n-netwerken en p-netwerken die samen een poort vormen, elkaars duaal zijn. Standaardrepresentaties van Boolese vormen Elk van de 2 2n equivalentieklassen onder in V n is een aftelbaar oneindige verzameling van sequenties. Wij hebben dus veel meer Boolese vormen dan functies, de equivalentie tussen twee vormen v 1 en v 2 kan vastgesteld worden door de valuatie van v 1 en v 2 te vergelijken over alle 2 n assignaties. Dit is een exponentieel, en voor grote n en lange v 1, v 2 dus een zeer langdurig proces. Een rechtstreekse vaststelling van equivalentie in V n (dus zonder naar de voorgestelde functie te kijken) kan hiervoor nuttig zijn. Rechtstreekse vaststelling van de equivalentie kan indien elke equivalentieklasse een unieke representatie heeft, en indien er een procedure bestaat om elke vorm tot zijn equivalente representant te herleiden. Het volstaat dan de representatie van de vormen te vergelijken. In de volgende stellingen zullen wij bewijzen dat er inderdaad zulke representanten bestaan, en zullen wij een algoritme aangeven waarmee elke Boolese vorm tot zijn equivalente representant kan herleid worden. De procedure die wij zullen opgeven heeft echter nog steeds een exponentieel gedrag in het slechtste geval. Definitie 2.14 Een lettervorm (literal) is een veranderlijke X i of zijn complement X i. 36

41 Definitie 2.15 Een minterm is een Boolese vorm bestaande uit het product van n lettervormen met verschillende index, geordend naar toenemende index. Er bestaan precies 2 n verschillende mintermen (waarom?). De mintermen van V 3 zijn: X 1 X 2 X 3 X 1 X 2X 3 X 1 X 2 X 3 X 1 X 2 X 3 X 1 X 2 X 3 X 1 X 2X 3 X 1 X 2 X 3 X 1 X 2 X 3 Een systematische notatie voor mintermen is als volgt: waarin X i j j = X i 1 1 Xi 2 2 Xi 3 3 Xin n { Xj, indien i j = 1 X j, indien i j = 0. Uit deze definitie volgt dat mintermen voorstellingen zijn van mintermfuncties, en dat het verband tussen vorm en functie gegeven wordt door: X i 1 1 Xi 2 2 Xin n = m ν(i1,i 2,...,i n)(x 1,..., x n ). Lemma 2.3 (Shannon-decompositie) Weze v(x) een Boolese vorm in één veranderlijke X. Dan geldt f v (x) = X v(1) + X v(0). Bewijs. (exhaustief nazicht van de twee mogelijke assignaties) Noteer dat v(0) en v(1) geen vrije variabelen meer bevatten, en dat v(0) = f v (0), en v(1) = f v (1). Wij vinden dan wat het lemma bewijst. Xv(1) + X v(0) α = Xv(1) α + X v(0) α = X α v(1) α + X α v(0) α = α(x)f v (1) + (α(x)) f v (0) { fv (1), α(x) = 1 = f v (0), α(x) = 0 Lemma 2.4 Weze v(x 1,..., X n ) een Boolese vorm, en α een assignatie. Definieer de Boolese vormen i j V n als { 0, indien α(xj ) = 0 i j = 1, indien α(x j ) = 1. Dan is v(i 1,..., i n ) equivalent met de éénlettervorm 0 of 1 gegeven door v(i 1,..., i n ) { 0, indien v α = 0 1, indien v α = 1. Bewijs. Passen wij de definitie van een valuatie (2.11) toe op de vormen v(x 1,..., X n ) en v(i 1,..., i n ). Aangezien, bij onderstelling, X j α = i j α 37

42 volgt dat de constante waarde van de functie v(i 1,..., i n ) gegeven wordt door v(i 1,..., i n ) α = { v(x 1,..., X n ) α 0 α, indien v α = 0 = 1 α, anders. Met deze lemma s zijn we in staat de normaalvormstelling te bewijzen: Stelling 2.5 (Normaalvoorstelling) Elke Boolese functie f(x 1,..., x n ) kan uniek gerepresenteerd worden door een Boolese vorm in de Disjunctieve Normaalvorm, als volgt f(x 1,..., x n ) = i 1,..., i n {0, 1} v(i 1,..., i n ) 1 X i 1 1 Xi 2 2 Xi 3 3 Xin n Hierin is v(x 1,..., X n ) om het even welke Boolese vorm die f voorstelt, en v(i 1,..., i n ) de Boolese vorm v waarin alle variabelen X j vervangen werden door hun assignatie i j. Bewijs. (Inductie op n) 1. Het geval n = 1 volgt uit lemma s 2.3 en (Inductiestap) Veronderstel de stelling correct voor n 1 variabelen. Kies een willekeurige maar vaste waarde voor X 2,..., X n. De functie f v (x 1,..., x n ) hangt dan ook enkel af van X 1. Volgens lemma 2.3 kunnen wij dus schrijven f v (x 1,..., x n ) = X 1 v(1; X 2,..., X n ) + X 1v(0; X 2,..., X n ). Anderzijds stelt de vorm v(1, X 2,..., X n ) ook een functie voor van n 1 variabelen. Volgens de hypothese is dus v(1; X 2,..., X n ) i 2,..., i n {0, 1} v(1; i 2,..., i n ) 1 met een gelijkaardige uitdrukking voor v(0; X 2,..., X n ). X i 2 2 Xin n Substitutie leidt tot f(x 1,..., x n ) = X 1 X i 2 2 Xin n i 2,..., i n {0, 1} v(1; i 2,..., i n ) 1 + X 1 X i 2 2 Xin n i 2,..., i n {0, 1} v(0; i 2,..., i n ) 1 = X i 1 1 Xin n. i 1,..., i n {0, 1} v(i 1,..., i n ) 1 38

43 Stelling 2.5 bewijst dat elke Boolese vorm ondubbelzinnig kan geschreven worden als een som van mintermen, en dus niets anders is dan een tekstuele versie van het gebruik van mintermfuncties voor een canonische representatie. Noteer dat de mintermrepresentatie van de functie 0 bestaat uit de ledige uitdrukking Λ (een som met 0 termen). Boolese vormen zijn dus equivalent indien ze tot dezelfde DSV kunnen herleid worden. De volgende procedure herleidt elke Boolese vorm tot zijn DSV. Deze procedure steunt op het feit dat wij in V n formeel de rekenregels van Boole-algebra s uit definitie 2.1 mogen gebruiken. Dat dit mag volgt uit de definities van valuatie en equivalentie (bewijs dit zelf). Algoritme 2.1 (Herleiding tot DSV van Boolese vormen) 1. Propageer alle inversies rond haakjes naar binnen, tot wanneer alleen nog inversies voorkomen op lettervormen. Gebruik daartoe de regels van De Morgan: (A + B) = (A B ) en (A B) = (A + B ); 2. Vervang alle vormen (A+B) C door A C +B C, tot wanneer de hele uitdrukking bestaat uit een som van producten van lettervormen zonder haakjes (gebruik distributiviteit). 3. Orden, in elk product, de factoren naar stijgende index (commutativiteit van het product ). 4. Laat weg: (a) alle dubbels van producten (X + X = X); (b) alle producten die 0 bevatten; (0 X = 0 en 0 + X = X ); (c) alle producten die X i en X i bevatten voor een gegeven i (X X = 0); (d) alle factoren 1 in de producten (1 X = X); (e) alle dubbels van factoren in de producten (X X = X). 5. Voor alle resterende producten: indien het product geen minterm voorstelt, dan ontbreekt er minstens één lettervorm, zeg X j. Vul het product aan met de factor (X j + X j ), voor alle ontbrekende j (X + X = 1 en 1 Y = Y ); 6. Wanneer in een product nog haakjes voorkomen, ga dan naar stap 2; 7. Sorteer de producten lexicografisch, volgens de regel X j < X j (commutativiteit van +). Voorbeeld 2.6 Reductie naar DSV. v(x 1, X 2, X 3 ) (X 1 + X 2 )(X 1 + X 3) (na stap 2) X 1 X 1 + X 2 X 1 + X 1 X 3 + X 2 X 3 (na stap 3) X 1 X 1 + X 1 X 2 + X 1 X 3 + X 2 X 3 (na stap 4) X 1 + X 1 X 2 + X 1 X 3 + X 2 X 3 (na stap 5) X 1 (X 2 + X 2)(X 3 + X 3) + X 1 X 2 (X 3 + X 3) +X 1 (X 2 + X 2)X 3 + (X 1 + X 1)X 2 X 3 (na stap 6) X 1 X 2 X 3 + X 1 X 2X 3 + X 1 X 2X 3 + X 1 X 2 X 3 + X 1X 2 X 3 (na stap 7) X 1 X 2 X 3 + X 1 X 2 X 3 + X 1 X 2X 3 + X 1 X 2X 3 + X 1X 2 X 3 De DSV-procedure maakt het dus mogelijk elke vorm naar een standaard gedaante te herleiden (deze is niet noodzakelijk minimaal in lengte!). Equivalentie in V n kan dus rechtstreeks en louter door symbolische manipulatie van de Boolese vorm worden getest. 39

44 2.3.4 Ternaire representaties van Boolese SVP-vormen Bij de afleiding van de DSV-vorm is gebleken dat deze vorm niet noodzakelijk de kortste haakjesvrije representatie is van de functie. Immers, niet elk product dat voorkomt in een som was een minterm, en moest daarom uitgebreid worden met de ontbrekende lettervormen. Meestal zal men functies om die reden niet opgeven via hun DSV-vorm; men zal eerder een zo kort mogelijke haakjesvrije som-van-productenvorm (SVP-vorm) opgeven. Deze vorm hoeft zelf uiteraard ook niet de minimale lengte te hebben. Om computermanipulatie van dergelijke vormen te vereenvoudigen, heeft men een meer bruikbare representatie van dergelijke vormen uitgewerkt. Men ordent de variabelen eenmalig, op een vaste manier. Men denoteert elke term (product) als een sequentie van n symbolen over het ternair alfabet {0, 1, }. De k-de positie in deze sequentie komt overeen met de k-de variabele. Wanneer deze variabele niet voorkomt in de term, schrijft men op die plaats een ; anders een 0 of 1, al naar gelang de variabele gecomplementeerd voorkomt of niet. De voorstelling van de Boolese vorm met m termen neemt dan de gedaante aan van m dergelijke sequenties, of nog als een m n matrix over {0, 1, }. Deze voorstelling kan ook gebruikt worden om gelijktijdig meerdere Boolese vormen over dezelfde variabelen voor te stellen. Men ordent de k vormen ook éénmalig en vast, en bij elke sequentie die een product voorstelt geeft men aan in welke van de k vormen dit product als term optreedt. Dit doet men door aan elke sequentie, die men dan inputsequentie noemt, een tweede sequentie, de outputsequentie te hechten. De outputsequentie heeft lengte k, het aantal vormen, en is over {0, 1}. De outputsequentie heeft een 1 op plaats j a.s.a. de term die voorgesteld wordt door de inputsequentie optreedt in de j-de vorm. Een voorbeeld maakt dit duidelijk. Beschouw het stel vormen Hierin is dus n = 4 en k = 3. Wij representeren dit als y 1 = x 1 x 2 + x 2x 4 (2.1) y 2 = x 3 x 4 (2.2) y 3 = x 1 x 2 + x 3 x 4 (2.3) Uiteraard bevat de voorstelling van één enkele vorm geen outputgedeelte. Het voordeel van dergelijke vormen is dat zij computermanipulatie vereenvoudigen. Dit komt doordat de termrepresentaties alle dezelfde lengte hebben (representatie door middel van ARRAYs), en doordat sommige operaties, bv. het maken van het product van twee termen, of de berekening van de Hamming-afstand (zie verder) eenvoudig uit te voeren is. Figuur D.1 geeft een impressie van de concrete implementatie van een aantal representatieconcepten in een Maple-suite die hoort bij deze syllabus Boolese decisiediagrammen of BDD s Computermanipulatie van Boolese functies vereist representaties die, zoals al eerder gezegd, voor een zo groot mogelijke klasse van functies, zo compact mogelijk zijn, en zeker 40

45 veel kleiner dan de exponentiële afhankelijkheid van het aantal variabelen. Eenvoudige functies dienen eenvoudige representaties te hebben. Alles hangt natuurlijk af van wat men bedoelt met eenvoudige functies, en diverse definities zijn mogelijk. Maar meestal is men het erover eens dat de constante functies 0 en 1 zeer eenvoudig zijn, en dat de functies die effectief afhangen van minder dan de n variabelen (b.v. de functie f(x 1,..., x n ) = x 1 ) ook eenvoudiger zijn dan de andere. Dit komt in zekere mate al tot uiting in de Boolese vormen die deze functies representeren. Naast compactheid vereist een goede representatie ook de mogelijkheid om diverse operaties op en tussen functies efficiënt uit te voeren. Voorbeelden van dergelijke operaties zijn: het evalueren van de functie op een gegeven input; het genereren van alle plaatsen waar de functie de waarde 1 aanneemt (de lijst van mintermen); het uitmaken of een functie ooit de waarde 1 kan aannemen (satisfiability); het uitmaken of de functie altijd de waarde 1 aanneemt (tautologietest); het complementeren van een functie; het nagaan of twee functies identiek zijn; het combineren van twee functies met de operatoren + en uit F n ; het samenstellen van functies door functiecompositie. Niet al deze operaties kunnen altijd efficiënt uitgevoerd worden, omdat sommige ervan, zoals het probleem van satisfiability, z.g. NP-complete problemen zijn. Men kan er echter wel voor zorgen dat een goede keuze van de interne representatie aanleiding geeft tot een gemiddeld goed gedrag. De ternaire representatie van Boolese vormen die wij hierboven gezien hebben, heeft al op veel punten deze eigenschappen, en wordt om die reden intensief gebruikt, i.h.b. in synthesesoftware. Dit is software die gebruikt wordt bij het zoeken naar zo optimaal mogelijke circuitrealisaties van een opgegeven stel functies. De BDD-representatie die wij nu zullen voorstellen is een representatie met gelijkaardige kenmerken, die i.h.b. het redeneren over functies (gelijkheid, tautologie,...) elegant ondersteunt. Dit is van belang bij de analyse van bestaande netwerken, bv. bij de verificatie en het testen van circuits. Representatie Een BDD is een gerichte acyclische graaf met knopenverzameling V en takkenverzameling E. Het BDD heeft twee soorten knopen v: eindknopen, die geen opvolgers hebben, en die de waarde 0 of 1 dragen: W (v) {0, 1}; er is minstens één eindknoop in elk BDD; 0 of meer inwendige knopen, die geen waarde dragen, maar precies twee opvolgers hebben: L(v) resp. R(v). Elke inwendige knoop draagt bovendien een index I(v) {1,..., n} die overeen komt met precies één argument van de functie. 41

46 Figuur 2.5: BDD-voorstelling van de functie f(x 1, x 2, x 3 ) = x 1 x 2 + x 3 (x 1 + x 2 ). als een interne knoop v 1 een andere interne knoop v 2 als opvolger heeft, dan is de index van de opvolger steeds groter dan deze van de beschouwde knoop: v 2 {L(v 1 ), R(v 1 )} I(v 2 ) > I(v 1 ); als de verzameling van interne knopen niet-ledig is, dan is er precies één interne knoop met minimale index. Deze knoop heeft geen voorgangers, en is dus de unieke oorsprong van de graaf. Een dergelijke graaf kan geïnterpreteerd worden als de representatie van een Boolese functie f(x 1,..., x n ) van n variabelen. Deze representatie is gesteund op de shannondecompositie van de functie, zoals wij ze voor het eerst tegengekomen zijn in lemma 2.3. De representatie is recursief gebaseerd op de shannondecompositie: weze knoop v de oorsprong van een BDD, waarin i = I(v) de kleinste index is van de variabelen die effectief optreden in de functie. Wij kunnen schrijven f(x 1,..., x n ) = x if xi =0 + x i f xi =1 De graaf met als oorsprong v representeert de functie f a.s.a. de graaf met als oorsprong L(v) de residufunctie f xi =0 representeert en de graaf met als oorsprong R(v) de functie f xi =1. De eindknopen representeren de functies 0 resp. 1. Beschouw, om de gedachten te vestigen, de functie Opeenvolgende decomposities leiden tot f(x 1, x 2, x 3 ) = x 1 x 2 + x 3 (x 1 + x 2 ). f(x 1, x 2, x 3 ) = x 1x 3 + x 1 (x 2 + x 2 x 3 ) = x 1(x 2x 3 + x 2 x 3 ) + x 1 (x 2 + x 2 x 3 ) = x 1(x 2(x 30 + x 3 1) + x 2 (x 30 + x 3 1)) +x 1 (x 2(x 31 + x 3 1) + x 2 (x 30 + x 3 1)) De graaf in figuur 2.5(a) toont hoe deze algebraïsche vorm als BDD kan gerepresenteerd worden. Uiteraard is het zo dat de naïeve manier waarop wij dit gedaan hebben leidt tot 42

47 een representatie van exponentiële afmetingen, die dus helemaal niet de bovenstaande verwachtingen kan inlossen. Wij kunnen de bestaande graaf nu vereenvoudigen, zonder dat daardoor de representatie van de functie in het gedrang komt. De bedoeling is dat wij de graafrepresentatie canonisch maken, d.w.z. dat een gegeven Boolese functie maar door één graaf kan voorgesteld worden. Elke knoop in een minimaal BDD moet dus een verschillende functie voorstellen. Wij gebruiken de volgende vereenvoudigingsregels, die wij toepassen vanuit de eindknopen naar de oorsprong toe: 1. eindknopen die dezelfde waarde dragen kunnen samengenomen worden (zij stellen immers dezelfde functie 0 of 1 voor). Aldus krijgen wij een graaf met één of twee eindknopen; 2. wanneer een interne knoop identieke linkse en rechtse opvolgers heeft, dan treedt de variabele die overeenstemt met de knoop, niet op in de functie voorgesteld door de knoop. Wij kunnen deze knoop weglaten als oorsprong, en hem vervangen door zijn linkse opvolger. Dit steunt op de identiteit x j g + x jg = g, g; 3. wanneer twee interne knopen identieke linkse en rechtse opvolgers hebben, dan stellen de grafen met deze knopen als oorsprong dezelfde functie voor. Wij kunnen één van deze knopen weglaten, en alle verwijzingen ernaar vervangen door verwijzigingen naar de andere. Wanneer wij deze procedure toepassen op de graaf, dan verkrijgen wij als resultaat een graaf met een minimaal aantal knopen, die bovendien canonisch is. Zoals als gesuggereerd wil dit zeggen dat elke functie waarvan het mimimaal BDD isomorf is met het minimaal BDD van f, gelijk is aan f. Geen enkele ander BDD kan f voorstellen met zo weinig knopen (uiteraard met de gekozen volgorde van de variabelen). Het bewijs van de canoniciteit wordt gegeven door Bryant in [Bryant86]. Figuur 2.5(b) toont de canonische representatie van het minimaal BDD. Figuur D.6 toont een gecombineerd algoritme in Maple, dat uitgaande van een Boolese vorm, een canonisch BDD opstelt. Het algoritme zelf vermijdt de generatie van redundante knopen. Noteer dat dit niet noodzakelijk de meest efficiënte benadering is! Ter volledigheid herinneren wij eraan dat de complexiteit van een minimaal BDD zeer sterk, en soms kritisch kan afhangen van de volgorde waarin men de variabelen sorteert. Veel nuttige functies kunnen echter met zeer eenvoudige diagrammen voorgesteld worden, zelfs de pariteitsfunctie, die wij later zullen ervaren als een eerder complexe functie. Er zijn ook functies die met geen enkele ordening van de variabelen een compacte voorstelling hebben. Een belangrijk en relevant voorbeeld hiervan zijn de functies die een binaire vermenigvuldiger beschrijven. Algoritmen Nu zullen wij schetsmatig enkele algoritmen beschrijven die operaties uitvoeren op één of meerdere minimale BDD s, en als resultaat getallen en/of minimale BDD s afleveren. Reductie Het eerste algoritme is natuurlijk reductie. Wij hebben hierboven al ruwweg gezegd hoe men een niet-minimaal BDD kan reduceren. Wij zullen dat nu wat concreter doen. 43

48 Algoritme 2.2 (BDD-reductie) 1. doorloop de BDD breedte-eerst, en plaats de knopen op niveau i in een lijst L i (de eindknopen zitten op niveau n + 1); 2. doorloop elk van de lijsten L i, te beginnen bij de laatste, en doe het volgende (a) voor de lijst met eindknopen: i. sorteer de lijst op basis van de knoopwaarde; ii. wanneer twee identieke knopen voorkomen, elimineer er dan één van, en doe de vaderknopen van de weggelaten knoop wijzen naar de andere knoop; iii. geef de overblijvende knopen een uniek nummer (bv. gehele getallen vanaf 0) en geef dat nummer door aan de vaderknopen; (b) voor een lijst met interne knopen: i. sorteer de lijst lexicografisch op basis van het koppel unieke nummers van de opvolgers; ii. wanneer twee identieke knopen voorkomen, elimineer er dan één van, en doe de vaderknopen van de weggelaten knoop wijzen naar de andere knoop; iii. indien een knoop twee identieke opvolgers (nummers) heeft, verwijder hem dan, en doe zijn vaderknopen wijzen naar zijn linker opvolger; iv. geef de overblijvende knopen een uniek nummer en geef dat door aan de vaderknopen; De rekenduur van dit algoritme wordt bepaald door de tijd nodig om de lijsten te sorteren (O( G log G ), met G het aantal knopen in de originele graaf G). Wanneer men start van een volledige binaire boom is dit uiteraard exponentieel in n, maar dit hoeft niet het geval te zijn voor bijna minimale bomen, die optreden als tussenresultaat van bewerkingen op bomen. Tautologie, evaluatie, complementering, gewichtsbepaling Uitgaande van een minimaal BDD kan men snel zien of een boom een tautologie is (de boom bestaat uit één eindknoop met waarde 1), of niet gelijk is aan de nulfunctie (de boom bevat een eindknoop met waarde 1). De waarde van de functie evalueren kan in O(n) tijd, door de graaf te doorlopen van oorsprong tot eindknoop, volgens een pad uitgestippeld door de argumentwaarden. De functie complementeren kan door eenvoudig de eindknopen van waarde te verwisselen; wanneer men geen rechtstreekse toegang heeft tot deze knopen, kan men ze opzoeken in een tijd O( G ). Het gewicht van de functie kan bepaald worden in tijd O( G ); de verzameling mintermen in O(n S ), waarin S het gewicht is van de functie. Operatoren en compositie Wij zullen nog twee belangrijke generieke algoritmen bestuderen: één dat twee functies combineert m.b.v. de operatoren in F n, en één dat functiecompositie uitvoert. Wij veronderstellen dat beide functies gerepresenteerd zijn volgens dezelfde ordening van de variabelen, en dat de operator voorgesteld wordt door. Het algoritme is 44

49 gebaseerd op een recursie, die volgt uit de shannondecompositie op x 1 : f 1 (x 1,..., x n ) f 2 (x 1,..., x n ) x 1 (f 1 x1 =0 f 2 x1 =0) + x 1 (f 1 x1 =1 f 2 x1 =1), als x 1 optreedt in f 1 en f 2 = x 1 (f 1 f 2 x1 =0) + x 1 (f 1 f 2 x1 =1), als x 1 enkel optreedt in f 2 f 1 f 2, als x 1 optreedt in geen van beide (Bewijs dat dit correct is voor = + of.) De berekening van het linkerlid kan effectief gebeuren als f 1 en f 2 beide constante functies zijn; wanneer één van beide constant is, kan men in sommige gevallen ook nog de berekening doen (b.v. wanneer = en f 1 = 0, is het resultaat steeds 0, ongeacht f 2 ). Dit stopt de recursie. Uit deze regels kunnen wij rechtstreeks een algoritme distilleren. Start het algoritme met de oorsprongen v 1 en v 2 van de BDD s als argumenten. Algoritme 2.3 (Combinatie d.m.v. de operator : bereken g = f 1 f 2 ) COMB(v 1, v 2, ): 1. indien één van beide argumenten v 1 of v 2 een eindknoop is, en de combinatie is evalueerbaar, genereer dan een eindknoop u met de goede waarde en termineer; 2. indien de combinatie niet evalueerbaar is, doe dan het volgende: (a) creëer een interne knoop u met index min(i(v 1 ), I(v 2 )); (b) als I(v 1 ) = I(v 2 ), stel R(u) COMB(R(v 1 ), R(v 2 ), ) L(u) COMB(L(v 1 ), L(v 2 ), ). Hierin is COMB(R(v 1 ), R(v 2 ), ) het resultaat van een recursieve oproep naar de huidige routine. (c) als I(v 1 ) < I(v 2 ), stel R(u) COMB(R(v 1 ), v 2, ) L(u) COMB(L(v 1 ), v 2, ). (d) als I(v 1 ) > I(v 2 ), doe dan als hierboven, maar met de rollen van v 1 en v 2 omgewisseld. 3. retourneer de graaf met oorsprong u. Bij wijze van optimalisatie houdt men tijdens de uitvoering bij welke subgrafen al gecombineerd werden door het algoritme: men hoeft elke combinatie immers hoogstens één keer te doen. Wanneer men eenzelfde combinatie tweemaal dreigt te doen, dan zal men de reeds bestaande waarde retourneren. Dit verhindert de onnodige groei van de resultaatgraaf. Nadat deze procedure beëindigd is, moet men de resulterende graaf reduceren tot zijn minimale representatie, door gebruik te maken van het reductiealgoritme. Figuur D.7 toont hoe de combinatie-operator in Maple werd geïmplementeerd. 45

50 Figuur 2.6: De combinatie van twee grafen door middel van een operator Voorbeeld 2.7 Weze f 1 (x 1, x 2, x 3 ) als in figuur 2.5, weze f 2 = x 2 + x 3, en weze =. Wanneer wij het algoritme COMB toepassen op de twee grafen in figuur 2.6(a) en (b), dan krijgen wij (met gebruik van de vermelde optimalisatie) het BDD in figuur 2.6(c). Merk op dat de resulterende graaf voor f 1 f 2 niet minimaal is, en dat dus een extra minimalisatiestap nodig is. Het algoritme heeft een complexiteit van O( G 1 G 2 ). De functiecompositie kan men, door middel van een kleine uitbreiding van de techniek, op gelijkaardige manier uitvoeren. De opgave is als volgt: gegeven twee functies f 1 (x 1,..., x n ) en f 2 (x 1,..., x n ), bereken de functie g(x 1,..., x n ) = f 1 (x 1,..., x j 1, f 2 (x 1,..., x n ), x j+1,..., x n ). Het is niet moeilijk aan te tonen dat men g(x 1,..., x n ) kan schrijven als g(x 1,..., x n ) = if f 2 (x 1,..., x n ) = 0 then f 1 (x 1,..., x n ) xj =0 else f 1 (x 1,..., x n ) xj =1. = ITE(f 2, f 1 xj =0, f 1 xj =1) Deze vorm laat zich recursief uitdrukken door middel van Shannondecompositie, net zoals voor een gewone binaire operatie: g(x 1,..., x n ) = x 1ITE(f 2, f 1 xj =0, f 1 xj =1) x1 =0 46

51 +x 1 ITE(f 2, f 1 xj =0, f 1 xj =1) x1 =1, waarin ITE(f 2, f 1 xj =0, f 1 xj =1) x1 =0 = ITE(f 2 x1 =0, f 1 x1 =0,x j =0, f 1 x1 =0,x j =1) Evenals bij de binaire operaties stopt de recursie van zodra alle argumenten van ITE constante functies worden, en soms ook vroeger. Bryant bewijst dat een algoritme dat op deze basis geïmplementeerd wordt, een complexiteit O( G 1 2 G 2 ) heeft, waarin G 1 de graaf is die f 1 voorstelt. Andere varianten Hachtel ([Hachtel96]) beschrijft een nog compactere vorm voor canonische BDD s door het gebruik van complementeringstekens op sommige takken in de BDD. Door het gebruik van complementeringen kan men de knoop naar waar verwezen wordt als gecomplementeerd aanzien. Geen enkel diagram heeft dan nog twee eindknopen nodig, en ook veel tussenliggende knopen kunnen worden geëlimineerd. Om de canoniciteit te waarborgen moeten er echter wel restricties opgelegd worden op de plaatsen waar complementeringstekens kunnen voorkomen, bijvoorbeeld nooit op de uitgaande tak die overeenstemt met 1. Wij laten de studie van deze verfijningen over aan de geïnteresseerde lezer. 2.4 Opgaven 1. Bewijs de eigenschappen 1 t.e.m. 10 in paragraaf Bewijs dat de operator associatief is. 3. Beschouw de verzameling van alle delers van het getal 210. Rust deze verzameling uit met interne bewerkingen zodanig dat de resulterende structuur een Boolese algebra is. Kan je dit ook doen met de delers van 90? Waarom, of waarom niet? 4. Beschouw de verzameling {0, 1, 2, 3} en rust ze uit met de operaties +, en als volgt: Is deze structuur een Boole-algebra? Bewijs, of geef een tegenvoorbeeld. Zo het antwoord neen was, kan je dan een wijziging voorstellen om er toch een Boolealgebra van te maken? 5. Een symmetrische Boolese functie is invariant onder de permutaties van haar n variabelen. Bijvoorbeeld, de functie x 1 + x 2 is symmetrisch; de functie x 1 + x 2 is het niet. Bepaal hoeveel symmetrische functies er bestaan van n variabelen. Bewijs dat, met de geschikte keuze voor de inwendige samenstellingswetten, deze functies een Boole-algebra vormen. 47

52 6. Een Boolese functie is monotoon niet-dalend (monotoon, om kort te zijn) wanneer, als (x 1, x 2,..., x n ) (y 1, y 2,..., y n ), dan f(x 1, x 2,..., x n ) f(y 1, y 2,..., y n ), waarin de ordening de gewone betekenis heeft. (a) Bewijs dat de monotone functies een distributieve tralie vormen. Wat is het minimumelement, en wat is het maximumelement? (b) Teken deze tralie voor n = 2. Is de tralie een Boole-algebra? Verklaar. (c) Toon aan dat een functie monotoon is a.s.a. ze kan geschreven worden als een som van producten van niet-gecomplementeerde variabelen. Onderstel hierbij dat de ledige som gelijk is aan 0, en het ledige product gelijk aan 1. (d) Een Boolese functie is lineair separeerbaar als er reële getallen a i, b bestaan zodanig dat { 1 als i f(x 1, x 2,..., x n ) = a ix i b, 0 anders. Toon aan dat, als a i 0, f monotoon niet-dalend is. 7. Toon aan dat de functie f(x, y, z, u, w) = yzu w + xuw + x yzuw + xzu + xz uw monotoon niet-dalend is (baseer u op oefening 6). 8. Een functie f(x 1, x 2,..., x n ) is monotoon niet-dalend in een variabele x j als geldt, (x 1, x 2,..., x j 1, x j+1,..., x n ) {0, 1} n 1, f(x 1, x 2,..., x j 1, 0, x j+1,..., x n ) f(x 1, x 2,..., x j 1, 1, x j+1,..., x n ). Wanneer de ongelijkheid in de andere richting gaat, is de functie monotoon nietstijgend. Een functie die ofwel monotoon niet-dalend of niet-stijgend is in een variabele, noemt men unaat in die variabele. Een functie die unaat is in al haar variabelen noemt men kortweg unaat. Een SVP-representatie heet unaat, wanneer geen enkele variabele zowel gecomplementeerd als niet-gecomplementeerd voorkomt. Toon de volgende eigenschappen aan van unate functies en unate SVP-vormen. (a) Elke unate SVP-vorm stelt een unate functie voor. waar? Bewijs of geef een tegenvoorbeeld. (b) Het complement van een unate functie is unaat. Is het omgekeerde ook (c) Een functie is unaat (niet-dalend) in x a.s.a. haar shannonexpansie kan geschreven worden als f = xf x=1 + f x=0 (d) De shannonexpansie van het complement van een niet-dalende functie in x kan geschreven worden als f = x f x=0 + f x=1 (e) De complete som van een unate functie is unaat. (Hint: veronderstel het tegendeel, en maak gebruik van het resultaat van de vorig punten.) (f) Elke priemimplicant van een unate functie is essentieel. (Hint: veronderstel voor de eenvoud en zonder verlies aan algemeenheid dat de functie nietdalend is in alle variabelen, en onderzoek de punten met minimaal gewicht (aantal eentjes) van het domein waarvoor de functie voor het eerst 1 wordt.) 48

53 9. Een Boolese functie f(x), x {0, 1} n, is zelfduaal wanneer f D (x) = f(x). (a) hoeveel zelfduale functies van n variabelen zijn er? (b) vormen deze functies een Boolealgebra onder de gebruikelijke operatoren +,, en complementering? (c) bewijs dat, onder de operatoren f g = x fg + x(f + g) f g = x (f + g) + xfg de zelfduale functies een Boolealgebra vormen. Hier is x eender welke variabele van f en g. Wat is het minimale en het maximale element? Wat is de geassocieerde partiële ordening? 10. (Pseudo-Boolese functies) In de syllabus hebben wij enkel gesproken over de functies van {0, 1} n naar {0, 1}, die wij allemaal als Boolese functies gedefinieerd hebben. Elke dergelijke functie kan voorgesteld worden door een Boolese vorm over de variabelen en de constanten 0, 1. Men kan echter ook de functies van B n naar B beschouwen, met bijvoorbeeld B = {0, a, b, 1}. Wij definiëren + en op B zodanig dat < B, +,, 0, 1 > een Boole-algebra is. Antwoord op de volgende vragen: (a) Hoeveel dergelijke functies zijn er? (b) Is het zo dat alle functies van B n naar B kunnen voorgesteld worden door een Boolese vorm (B.V.), nu over over de variabelen en de constanten 0, a, b, 1? (c) Indien niet, hoeveel functies van B n naar B kunnen dan wel voorgesteld worden door een B.V.? (d) Zelfs indien je het algemeen antwoord niet vindt, werk concreet de bovenstaande vragen uit voor de functies van één variabele, van B naar B. 11. (Boolese intervallen) In een partieel geordende ruimte < V, > kan men het begrip interval [a, b], met a, b V, definiëren als volgt: [a, b] = {x : a x b en x V }. Beschouw de Boole-algebra F n van Boolese functies van n binaire variabelen, en beschouw het interval I = [f l, f h ] met f l < f h. (a) toon aan dat I kan uitgebouwd worden tot een Boole-algebra. Wat zijn dan de operatoren +,, wat zijn de extreme elementen? Geef een algemene vorm voor een willekeurig element van I. (b) pas dit toe op F 3, door de atomen te bepalen (en enkel de atomen) van I = [xyz, x + yz] 12. Weze f k (x 1, x 2,..., x n ) de functie die 1 is wanneer precies k van de variabelen de waarde 1 aannemen. Stel het canonisch BDD op voor f 3 (x 1, x 2,..., x 5 ). Probeer dit te doen zonder een exponentiële explosie van de tussenvormen die je gebruikt. 49

54 Hoofdstuk 3 Combinatorische schakelingen en hun bouwstenen In dit hoofdstuk zullen wij eerst het verband tussen schakelnetwerken en Boolese uitdrukkingen nader onderzoeken. Daartoe moeten wij eerst de mogelijke vormen van schakelnetwerken nagaan, en de mate waarin zij door Boolese vormen voorgesteld worden. Wij bestuderen ook een systematische methode voor de analyse van taknetwerken. Nadien zullen wij een kort overzicht geven van de concrete bouwstenen waarover de ontwerper kan beschikken voor de realisatie van digitale systemen. Ons overzicht kan niets anders zijn dan een overzicht. Een echte, operationeel bruikbare kennis van bestaande componenten kan slechts verkregen worden door een grondige studie van de catalogi van de diverse producenten, en uiteraard, het effectief gebruik van de componenten. Hieraan besteden wij aandacht in de oefeningen bij dit vak. 3.1 De relatie tussen Boolese vormen en schakelnetwerken Schakelnetwerken zijn interconnecties van primitieve schakelelementen: poorten of schakelaars. Zowel de primitieve schakelelementen als hun interconnecties kunnen gemodelleerd worden in het formalisme van de Boole-algebra en de Boolese functies. Wij zullen eerst de basiselementen behandelen Modellen van schakelaars Een schakelaar realiseert een elementaire Boolese functie van één argument x j. Het argument fungeert als controle-ingang, dat de toestand van de schakelaar beïnvloedt. Wij zeggen dat de functiewaarde 1 is wanneer de schakelaar gesloten is, dus wanneer een geleidend pad bestaat tussen zijn twee klemmen. Noteer dat de controle-ingang meestal niet van dezelfde aard is als de functiewaarde: bij de controle-ingang gaat het om een spanning (MOSFET) of stroom (bipolaire transistor, relais), of zelfs een mechanische stand, zoals bij een lichtschakelaar; bij de functiewaarde gaat het om de aanwezigheid van een geleidend pad. Dit betekent meestal dat het definitiegebied en het beeldgebied gescheiden verzamelingen zijn, en dat het gebruik van de functiewaarde gerealiseerd door 50

55 5 Figuur 3.1: De compositieregels voor serie/parallelnetwerken een schakelaar als argument voor de functie gerealiseerd door een andere schakelaar, niet zonder meer mogelijk is. De meest eenvoudige elementen zijn de open keten (de functie 0) en de doorverbinding (de functie 1). Een eigenlijke schakelaar, gecontroleerd door de controlevariabele x j, realiseert de elementaire functies f(x 1,..., x n ) = x j of f(x 1,..., x n ) = x j. Elke schakelfunctie van meer variabelen die meer is dan louter een inversie of identiteitsfunctie van één variabele moet dus gebouwd worden uit een interconnectie van schakelaars. Serie-parallelnetwerken Wij beschouwen nu de samenstelling van enkelvoudige schakelaars tot grotere netwerken. Wanneer wij vertrekken van twee taknetwerken N 1 en N 2, elk met twee klemmen, dan kunnen wij hiermee een nieuw netwerk bouwen met twee klemmen door een serieschakeling of een parallelschakeling te maken van deze netwerken. Als f 1 (x 1,..., x n ) resp. f 2 (x 1,..., x n ) de functies voorstellen van de netwerken, dan zal het resulterend netwerk de functie f( ) = (f 1 f 2 )( ) resp. f( ) = (f 1 + f 2 )( ) realiseren. De interconnectie van schakelaars kan dus gemodelleerd worden door de operaties en + uit F n. Wanneer wij ons beperken tot netwerken die op kunnen gebouwd worden door de stapsgewijze samenstelling van steeds twee netwerken met elk twee klemmen, dan verkrijgen wij de klasse van de serie/parallelnetwerken. Om de relatie met de Boolese vormen te onderzoeken, kunnen wij gebruik maken van de constructieregels uit definitie 2.9, waarin wij regel 4 weglaten. Elk van de overblijvende regels kan geïnterpreteerd worden als de generatie van een primitief schakelelement, of als een serie/parallel compositieregel. Figuur 3.1 toont deze correspondentie. 51

56 Figuur 3.2: Elementaire poortfuncties ((a) de invertor (NOT), (b) de EN-functie (AND) en(c) de OF-functie (OR) Compleetheid Uit de correspondentie blijkt dat er Boolese vormen bestaan die geen rechtstreeks equivalent hebben als serie/parallel taknetwerk. Zo kan de vorm (x 1 + x 2 ) niet gegenereerd worden zonder gebruik te maken van regel 4; wij vinden dus geen serie-parallel netwerk dat rechtstreeks met deze vorm overeenkomt. De reden hiervoor is natuurlijk dat wij met interconnecties van schakelaars enkel de operatoren + en kunnen realiseren, en niet de complementering van een reeds gerealiseerde functie. Omgekeerd komt echter wel elk serie/parallelnetwerk overeen met een Boolese vorm. Betekent dit dat de klasse van de serie/parallelnetwerken niet in staat is om alle functies te representeren? Het antwoord is gelukkig neen. Dit kan eenvoudig ingezien worden door op te merken dat de DSV-vorm wel kan gegenereerd worden zonder gebruik te maken van regel 4, en met DSV-vormen kan men alle functies voorstellen Modellen van poorten en poortnetwerken Bij een poort behoren de argumenten en de functiewaarden tot hetzelfde domein (bijvoorbeeld spanningen). De argumenten vormen de inputs van het circuit, de functiewaarde vindt men op de output. De meest eenvoudige poorten zijn de vaste verbindingen met de vaste waarden 0 en 1 (bijvoorbeeld 0 V en 3,3 V in CMOS-schakelingen). Zij hebben geen inputs, en representeren de constante functies 0 en 1. Iets minder eenvoudig zijn de doorverbinding of buffer en de invertor, die functie zijn van één argument x j, en de functies f(x 1,..., x n ) = x j of f(x 1,..., x n ) = x j realiseren. Om zinvolle interconnecties mogelijk te maken moet men nog complexere bouwstenen hebben, namelijk poorten met twee inputs. De EN-poort realiseert de operatie (die uiteraard als functie gezien kan worden: f(x i, x j ) = x i x j ). De OF-poort realiseert de +-operatie (eveneens met geassocieerde functie). De symbolen voor de poortfuncties die wij hier zullen gebruiken werden voorgesteld in fig. 3.2, en representeren de operaties in B 1. Poortnetwerken Alle functies die complexer zijn dan de basispoort moeten worden gevormd door een interconnectie van poorten (outputs aan inputs). De interconnectie van een of twee poortnetwerken via één der basispoorten uit figuur 3.2 kan niet rechtstreeks gemodelleerd worden door een operator in F n, zoals de interconnectie van schakelaars. Een meer geschikt model lijkt functiesamenstelling: men substitueert de functies, gerealiseerd door de samen te stellen netwerken, in de argumenten van de functie gerealiseerd door de basispoort. Opnieuw kan men de stapsgewijze constructie van een poortnetwerk door gebruik van de basispoorten beschrijven door de samenstellingsregels voor Boolese vormen (fi- 52

57 Figuur 3.3: Compositieregels met poorten guur 3.3). Echter, dit keer kan men alle regels gebruiken, zodanig dat men kan zeggen dat alle Boolese vormen een corresponderend poortnetwerk hebben, dat een weergave is van de syntactische structuur van de vorm 1. Dit is een belangrijke opmerking, omdat zij de essentie blootlegt van de meeste synthese-algoritmen: deze proberen een opgegeven Boolese vorm te herschrijven naar een equivalente vorm die kan afgebeeld worden op een zo geschikt mogelijk netwerk Andere interconnecties Interconnecties van schakelaars of poorten kunnen uiteraard op veel andere manieren gebeuren dan deze die overeenstemmen met de productieregels van Boolese vormen. In sommige netwerken kunnen bijvoorbeeld terugkoppelingen voorkomen. In taknetwerken kan dit gebeuren door, vanuit het signaalpad, de controle-input van één of meerdere schakelaars te beïnvloeden (dit vraagt echter andere dingen dan de eenvoudige interconnecties die wij bestudeerd hebben). In poortnetwerken kan dit eenvoudiger, door de output van een poort terug te voeren naar de input van een stroomopwaarts gelegen poort. In deze gevallen slaagt men er niet steeds meer in de ingangs/uitgangsrelatie te schrijven als een Boolese vorm. Bij een analyse komt men steeds op een vergelijking uit waar dezelfde symbolen aan beide zijden van het gelijkheidsteken voorkomen. Deze vergelijkingen kunnen in de Boole-algebra soms geen enkele, soms precies één, maar soms 1 Hier moeten wij echter opmerken dat onze beschrijving geen rekening houdt met poorten met meer dan twee ingangen. Om netwerken met dergelijke poorten correct te beschrijven zou men de productieregel 4 kunnen uitbreiden tot willekeurige aantallen vormen A 1, A 2,... A n 53

58 Figuur 3.4: Een poortnetwerk dat niet overeenkomt met één enkele Boolese vorm Figuur 3.5: Een niet serie/parallel netwerk ook meer dan één oplossing vertonen. Wanneer er geen oplossingen gevonden worden, heeft het netwerk een gedrag dat niet als een logisch niveau kan gerepresenteerd worden (bijvoorbeeld een oscillatie). Wanneer er echter meer dan één oplossing is, kan het netwerk een vorm van geheugenwerking vertonen, wat impliceert dat het geen Boolese functies meer realiseert. Het gedrag van het netwerk wordt immers mede bepaald wordt door de voorgeschiedenis, en de output of de toestand van het signaalpad, is niet louter een functie van de huidige controlevariabelen. Zulke netwerken noemt men sequentiële netwerken; wij zullen ze behandelen verderop in deze cursus, in hoofdstuk 6. Voorlopig beperken wij ons tot netwerken waarin geen terugkoppelingen voorkomen. In deze netwerken is de output, of de toestand van het signaalpad, louter een (Boolese) functie van de inputs. Deze netwerken noemen wij combinatorische netwerken. Wanneer het netwerk een boomvormige structuur vertoont is het eenvoudig de Boolese vorm af te leiden die het gedrag van het netwerk beschrijft (analyse): men rekent terug van de uitgang naar de ingangen. Het is echter mogelijk netwerken zonder terugkoppellussen te bouwen, waarvan de structuur toch niet door één Boolese vorm gegeven wordt. Figuur 3.4 toont een dergelijk netwerk: de output van een deelnetwerk wordt aan meer dan één poort toegevoerd (het netwerk heeft geen boomstructuur; men noemt dit reconvergente fanout). Dit netwerk kan echter wel voorgesteld worden door een stelsel Boolese vormen (zie figuur 3.4), waarbij de fanout-punten als nieuwe variabelen ingevoerd worden. Bij taknetwerken doet er zich een gelijkaardige situatie voor: ook hier is het perfect mogelijk netwerken te bouwen die geen serie/parallelstructuur hebben, maar die (uiteraard) toch een Boolese functie realiseren (immers, alle terugkoppelvrije taknetwerken realiseren een Boolese functie tussen twee willekeurige knooppunten). Een voorbeeld van een dergelijk netwerk vindt men in figuur 3.5. Men kan dergelijke netwerken verkrijgen door meer dan twee deelnetwerken in één stap te combineren tot een nieuw netwerk. 54

59 3.2 Boolese matrices en de analyse van taknetwerken Boolese matrices zijn een elegant analysehulpmiddel waarmee men voor een willekeurig taknetwerk N met twee klemmen, op symbolische wijze, een Boolese vorm voor f N kan worden afgeleid wanneer men de Boolese vormen van de takken van het netwerk kent. In feite leidt men tegelijkertijd de functies af voor alle paren knopen die het netwerk heeft. Definitie 3.1 Een Boolese matrix A = (a ij ) over V n is een vierkante matrix met elementen in V n waarvan alle diagonaalelementen a ii gelijk zijn aan 1. Gebruik makend van de rekenregels in V n kunnen wij de volgende bijkomende definities geven: 1. A = B a ij = b ij i, j; 2. A + B = (a ij + b ij ); 3. A B = (a ij b ij ); 4. A B = ( k a ikb kj ); 5. A = C c ii = 1 en c ij = a ij, i j. De Boolese matrices kunnen partieel geordend worden door de (partiële) ordening van hun componenten uit te breiden tot de hele matrix: A B a ij b ij i, j {1,..., n}. Opmerking: Noteer dat de natuurlijke partiële ordening op F n is. Waarvoor gebruiken wij de Boolese matrix? Beschouw een taknetwerk N met k knopen, en construeer de k k Boolese matrix A, de connectiematrix van N, als volgt. Het element a ij, i j, wordt gegeven door 0, indien knoop i en j door niets rechtstreeks verbonden zijn; a ij = de som van de lettervormen van de schakelaars die knoop i en j verbinden, anders. Fig. 3.6 geeft een voorbeeld van een connectiematrix. De matrix A stelt dus de rechtstreekse verbindingen voor tussen knopen van N. De machten A 2 = A A; A 3 = A 2 A,..., stellen de rechtstreekse en indirecte paden (via resp. hoogstens 1, 2,... andere knooppunten) voor tussen de knopen van N (overtuig u daar zelf van). Definitie 3.2 De transmissiematrix A van het netwerk N is een k k Boolese matrix die de transmissiefunctie tussen twee willekeurige knooppunten van N voorstelt, d.w.z. via alle mogelijke paden die deze twee knopen verbinden. De transmissiematrix A is de limiet van de macht A p, voor p. De limietwaarde wordt echter effectief bereikt, zoals gegeven door volgende stelling. Stelling 3.1 Weze A de k k connectiematrix van een netwerk N. Dan geldt: 55

60 A = 1 X 0 Y X + Y X 1 X + Z Z Z 0 X + Z 1 Y 0 Y Z Y 1 X X + Y Z 0 X 1 Figuur 3.6: Een taknetwerk en zijn connectiematrix A 1. A A 2 A 3 A 4 2. q < k zodat A (q 1) A q = A (q+1) =, en dus 3. A q = A Bewijs. 1. Noteer A p = (a (p) ij ). Wij vinden dan a (p+1) ij = k m=1 a (p) im a mj = a (p) ij a jj + a (p) im a mj m j a (p) ij (definitie van ) Dus A p A p Uit (1) volgt dat A (k 1) A k. Wij bewijzen nu dat A (k 1) A k. Wij vinden a (k) ij = a im1 a m1 m 2 a mk 2 m k 1 a mk 1 j. m 1,m 2,...,m k 1 Het aantal indices in deze som is k + 1, maar er zijn er slechts k verschillende. Dus in elke term van de som zijn er minstens twee indices gelijk aan elkaar. Wij onderscheiden drie gevallen: (a) stel m l = j. De term kan dan herschreven worden als (a im1 a ml 1 j)(a jml+1 a mk 1 j). 56

61 (b) stel m l = i. De term kan dan herschreven worden als (a im1 a ml 1 i)(a iml+1 a mk 1 j). (c) stel m l = m p. Ook dan kan de term herschreven worden: (a im1 a ml 1 m p )(a mpm l+1 a mp 1 m p )(a mpm p+1 a mk 1 j). Dus elke term in de som voor a (k) ij bestaat uit het product van een term uit de som van a (s) ij, voor een gegeven s k 1, met een andere functie. Daar nu a (s) ij a (s+1) ij vinden wij m 1, m 2,..., m k 1 a im1 a mk 1 j a (k 1) ij. Bijgevolg is A k A k 1, en dus A k = A k 1. Dit bewijst (2) 3. Daar wij in A geen paden moeten includeren waarin een knoop tweemaal voorkomt is A k = A. Uit (2) volgt dan ook dat A q = A. Met deze techniek kan men dus de functies die door een willekeurig taknetwerk gerealiseerd worden, gezamenlijk bepalen. Om de methode concreet op de computer uit te werken, moet men natuurlijk een concrete notatie voor Boolese functies gebruiken. Dit zouden b.v. Boolese vormen kunnen zijn, waarbij men echter moet voorzien in software, die na elke matrixvermenigvuldiging de potentieel zeer ingewikkelde uitdrukkingen die met elk matrixelement overeenkomen, kan vereenvoudigen. Hier zou het gebruik van BDD s al onmiddellijk resultaat opleveren. 3.3 Bouwstenen voor combinatorisch ontwerp Digitale bouwstenen vindt men in grote aantallen en in grote diversiteit. Dus ook hier is er nood aan een zekere methodiek bij de beschrijving van wat bestaat. Wij zullen ons overzicht structureren op basis van de invloed die de ontwerper heeft op de aard van de bouwstenen die hij kan gebruiken. Deze invloed kan gaan van totaal geen, bij gebruik van afgewerkte, standaardcomponenten, over een beperkte aanpasbaarheid bij programmeerbare componenten, tot absolute vrijheid bij full-custom VLSI-ontwerp. Deze termen hebben echter geen absolute betekenis: deze hangt namelijk af van de hoedanigheid van de ontwerper. Voor een chipontwerper die werkt bij een producent van standaardcomponenten zijn in feite alle componenten custom of zelfs full-custom. Aan het andere eind van het spectrum zal, voor de ontwerper die alle chipontwerpen of programmeringen van programmeerbare componenten uitbesteedt, elke component een standaardcomponent zijn. Wij zullen het standpunt innemen van de ontwerper die ergens tussenin zit: hij gebruikt, als eindgebruiker, de bestaande standaardproducten, maar heeft tevens toegang tot ontwerphulpmiddelen om programmeerbare componenten te gebruiken of een eigen maatchip (ASIC, Applicatie-Specifiek IC) te ontwerpen. 57

62 3.3.1 Standaardcomponenten Met standaardcomponenten bedoelen wij componenten waarvan de functionaliteit volledig vast ligt en aanwezig is bij de aankoop van de component. De component is tevens volledig verpakt. 2 Appendix B bevat een aantal voorbeelden van chipverpakkingen. Gedurende lange tijd, dit is vanaf het ontstaan van de geïntegreerde schakelingen in de zestiger jaren, tot vóór de doorbraak van ASIC-ontwerp in de tachtiger jaren (van vorige eeuw), waren standaardcomponenten het voornaamste werkmiddel van de systeemontwerper. Er bestaat een bijzonder groot assortiment in aangeboden functies, en vele functies worden aangeboden in diverse technologieën. De meest uitgebreide collecties vindt men bij TTL en zijn varianten (de 74-reeks), bij CMOS en zijn varianten, en bij ECL. Men vindt uitstekende overzichten van deze componenten in de diverse catalogi van de producenten. 3 Om het overzicht van de standaardcomponenten wat te structureren zullen wij een klassificatie doorvoeren op basis van een conventionele complexiteitsmaat. De complexiteitsklassen die men traditioneel onderscheidt zijn: SSI (Small Scale Integration) de klasse van componenten met minder dan 12 equivalente poorten; MSI (Medium Scale Integration) de klasse van componenten met 12 tot 100 equivalente poorten; LSI (Large Scale Integration) de klasse van componenten met een equivalente complexiteit van meer dan 100 poorten. Deze terminologie is oud, wat blijkt uit de (zeer) geringe integratiedichtheden. Met de voortschrijdende integratiemogelijkheden heeft men nieuwe termen bedacht zoals VLSI (Very Large Scale Integration), ULSI (Ultra Large Scale Integration) en GSI (Giga Scale Integration). Het onderscheid tussen deze klassen is niet scherp. Small Scale Integration In de klasse van combinatorische SSI-componenten vindt men voornamelijk poorten: nietinverterende buffers, invertoren, AND-, NAND-, OR-, NOR-, XOR-poorten, AND-OR- INVERT-poorten, e.d.m. Men vindt ook elementaire bouwblokken voor aritmetische circuits (half-adders, full-adders). Er bestaat een variëteit aan fan-in, het aantal inputs tot de poort. Deze poorten worden verpakt in behuizingen met weinig pinnen (14, 16, 20), zodanig dat het aantal poorten per IC zeer beperkt is (van 1 tot 8). Heel wat functies worden ook in meer dan één uitvoering gemaakt, zoals poorten met open collector, poorten met een extra zware, bufferende outputtrap of met een outputtrap die hogere spanningen kan weerstaan, voor de aansturing van bussen en indicatoren. Voor het verwerken van inputs die zwaar onderhevig zijn aan stoorspanningen worden poorten met Schmitt Trigger -inputs aangeboden. Deze poorten hebben ingangen met hysteresis, dit wil zeggen zij hebben logische drempels die afhankelijk zijn van de zin waarin de ingangsspanning verloopt. De drempel voor 2 Hier vallen in principe ook de niet-verpakte standaardchips onder (naked Chips). 3 Uiteraard ook op het WWW. Neem eens een kijkje op de sites van Texas Instruments Motorola Fairchild National Semiconductor en vele anderen. 58

63 een positieve stoorspanning op een laag niveau ligt dus hoger dan de drempel voor een negatieve storing op een hoog niveau. Bij TTL is dit verschil de hysteresis ongeveer 0,8 V. SSI-bouwblokken zijn de fundamentele en universele bouwblokken voor de realisatie van combinatorische (en zelfs sequentiële) circuits. Men kan namelijk eenvoudig bewijzen dat elke combinatorische schakeling kan gerealiseerd worden enkel met behulp van 2-input NAND- of NOR-poorten. Om dit in te zien vertrekt men van de disjunctieve normaalvorm, de canonische som-van-productenrepresentatie van een willekeurige combinatorische functie. Met interpreteert deze vorm als netwerk. Dit netwerk bestaat dan uit invertoren, n-input EN-poorten en een k-input OF-poort, waarbij n en k willekeurige getallen voorstellen. Wij transformeren dit netwerk eerst naar een vorm waarin alleen invertoren en 2-inputpoorten gebruikt worden, door alle poorten met meer dan 2 inputs te transformeren in boomvormige netwerkjes met 2-inputpoorten, geïllustreerd door de uitdrukking a + b + c + d + e = (a + b) + ((c + d) + e). Nadien gebruikt men o.a. de regels van De Morgan, om invertoren, 2-input EN-poorten en 2-input OF-poorten te transformeren in netwerkjes die louter bestaan uit bv. 2-input NAND-poorten: a = (a a), a + b = (a b ) = ((a a) (b b) ), a b = ((a b) (a b) ). Men verkrijgt een (uiteraard veel groter) netwerk dat alleen bestaat uit 2-input NAND-poorten. Het is duidelijk dat een circuitrealisatie op deze manier, met discrete componenten, economisch totaal onverantwoord is, aangezien het aantal chips hiervoor nodig veel te groot is. Dit betekent echter niet dat de techniek op zich zinloos is. Inderdaad, wanneer men op één enkele chip een groot aantal 2- of 3-input NAND-poorten kan samenbrengen en interconnecteren, kan men op deze manier toch complexe functies realiseren zonder dat dit moet leiden tot een te groot aantal chips. Dit ligt aan de basis van de z.g. semi-custom gate arrays, die wij verder in dit hoofdstuk zullen tegenkomen. Het gebruik van de fysische SSI-chips bij een ontwerp, daarentegen, is totaal voorbijgestreefd. Vrijwel de enige functie waar men discrete SSI-chips nog gebruikt is bij de realisatie van bussen of andere vormen van interconnectie. Het gaat hier meestal om conversiecircuits die de interne spannings- en stroomniveau s in het circuit omzetten naar de elektrische grootheden die een correcte signaaloverdracht op de interconnectiedraden mogelijk maken. Veelgebruikte systemen zijn de bussen met afschakelbare poorten (tristate), open-collector- of open-drainbussen, en differentiële interconnecties zoals CML en LVDS. De term bus wordt in meerdere betekenissen gebruikt. Soms bedoelt men gewoon een bundeling van signaaldraden onder een gemeenschappelijke naam, soms heeft men het over een signaal dat naar vele bestemmingen gevoerd wordt, en soms heeft men het over een signaaldraad die door meerdere poorten aangestuurd kan worden. Soms gaat het over een combinatie van deze elementen. Wij analyseren hier de problematiek van het aansturen van één signaaldraad vanuit meerdere poorten. Dit is bijvoorbeeld het geval bij de uitbreidingssleuven op het moederbord van een PC (de PCI-bus). Op elk ogenblik mag ten hoogste één signaalbron haar gegevens op de draden aanbrengen, en dit kan zo maar niet door meerdere poorten met hun uitgangen te verbinden: bij gewone poorten zou dit leiden tot kortsluiting, tot ongeldige signaalniveau s op de draad, en misschien tot beschadiging van de betrokken poorten. 59

64 Vdd Uit In2 Enable In1 Figuur 3.7: Een CMOS NAND-poort met afschakelbare uitgang. De uitgang wordt hoogimpedant wanneer enable=l 5 V Buslijn R 390 T1 T2 T3 Figuur 3.8: De ingrediënten van een open-collectorbus Afschakelbare uitgangen. Een eerste manier om dit probleem op te lossen is de poorten te voorzien van een controle-ingang waarmee men de uitgang van de poort in een toestand van hoge impedantie kan brengen (afschakelen). Op elk ogenblik mag dan maar één van de poorten verbonden met de buslijn in lage impedantie staan, en haar uitgangswaarde opdringen aan de bus. De aansturende poortuitgang kan dan een symmetrische werking hebben (pull-up en pull-down). Figuur 3.7 toont de interne structuur van een CMOS NAND-poort met afschakelbare uitgang. Open-drainbussen. Een tweede manier vereist geen actieve controle van het impedantieniveau. Men bouwt poorten met een asymmetrische uitgang, die alleen het schakelelement hebben (FET of bipolaire transistor). De drain resp. collector wordt dan als uitgang gebruikt (figuur 3.8). Deze technologie wordt gespecificeerd in IEEE Standard 1284, die de parallelle poort van een PC beschrijft. Men kan zonder problemen meerdere dergelijke uitgangen aan elkaar verbinden, op voorwaarde dat de bus spontaan de hoge signaalwaarde aanneemt wanneer geen enkele transistor geleidt. Dit kan door een weerstand aan te brengen tussen de buslijn en het ho- 60

65 Driver Stroombron 3.5 ma mv + transmissielijn Z0= Ontvanger Figuur 3.9: Het principe van LVDS: een constante stroom van ± 3,5 ma wordt door een transmissielijn van 100 Ω gestuurd De stroom wekt aan het uiteinde een differentiaalspanning op van ±350 mv over een weerstand die de transmissielijn afsluit ge spanningsniveau (passieve pull-up ). In snelle systemen worden buslijnen uitgevoerd als transmissielijnen, en wordt deze pull-upfunctie geïntegreerd met het terminatienetwerk. Wegens de lage karakteristieke impedantie van de transmissielijnen (typisch tussen 50 en 100 Ω) zal men deze bussen niet bedrijven met een spanningszwaai van 5 volt, maar een veel lagere spanningszwaai. De reden hiervoor is de grote statische dissipatie V 2 /R = 25/50 = 0,5 W die zou resulteren wanneer de buslijn laag staat. In appendix C wordt dieper ingegaan op het gedrag van open-collectorbussen met of zonder terminatie. Differentiële interconnectie. Bij langere interconnecties (kabels) met lage spanningszwaai moet men hoge eisen stellen aan de karakteristieken van de transmissielijnen, die zowel asymmetrisch (coaxiaalkabel) als symmetrisch kunnen zijn. Heel vaak worden getwijnde paartjes (Eng. twisted pair) gebruikt, die een karakteristieke impedantie hebben van 100 à 120 Ω. Dit zijn symmetrische transmissielijnen, die het best differentieel aangestuurd worden (figuur 3.9). Men definieert een homopolaire spanning V CM (Eng. common mode voltage) en een differentiaalcomponent V diff. Een logische 1 wordt dan voorgesteld door op een draad de spanning V CM + V diff /2 aan te brengen, op de andere de spanning V CM V diff /2; omgekeerd voor een logische 0. De karakteristieke impedantie vindt men tussen de twee draden. De aansturende poort moet dus twee complementaire signalen afleveren, liefst met een constante gemiddelde waarde V CM. Aan de ontvangerkant moet een poort een differentiële ingang hebben, die het differentieel signaal V diff weer omzet tot een gewoon eendraadssignaal, maar die homopolaire componenten (o.m. extern geïnduceerde stoorspanningen) onderdrukt. Een belangrijk voorbeeld van een dergelijke standaard is LVDS (Low Voltage Differential Signalling). Tabel 3.1 toont de belangrijkste eigenschappen van LVDS. 61

66 Tabel 3.1: Hoofdeigenschappen van LVDS (volgens norm ANSI/TIA/EIA-644) Parameter Beschrijving Min. Max. Eenheid V diff Differentiaalspanning mv V CM Homopolaire spanning V V diff Maximale verandering van V diff 50 mv V CM Maximale verandering van V CM 50 mv I SC Kortsluitstroom 24 ma t r, t f Stijg/daaltijden op de output ( > 200Mb/s) ns Stijg/daaltijden op de output (< 200 Mb/s) 30% van t bit I IN Ingangsstroom 20 µa V IN Spanningsbereik aan ingang V V T H Drempelspanning 100 mv Medium Scale Integration De ruimte van de mogelijke combinatorische functies die men kan realiseren groeit bijzonder snel met het aantal inputs, en dus met het aantal componenten dat men mag gebruiken. Men weet uit hoofdstuk 2 dat het aantal binaire boolese functies van n binaire variabelen gelijk is aan 2 2n. Voor n = 2 is dit 16. Van de 16 bestaande functies worden er een 14-tal als SSI-component aangeboden. Voor n = 4 krijgt men al 64K mogelijke functies. Zelfs indien men hieruit de equivalente functies verwijdert (men elimineert alle functies die in elkaar kunnen getransformeerd worden door permutatie of inversie van de inputs), houdt men nog een zeer groot aantal over. Het is duidelijk dat men voor de realisatie van een zinvol MSI-assortiment heel gerichte keuzen moet maken van de aangeboden functies. MSI-componenten hebben dan ook doelgerichte, specifieke functies, die veel minder universeel inzetbaar zijn dan de elementaire SSI-schakelingen. Nochtans kan men sommige MSI-componenten ook gebruiken als universele bouwstenen voor de realisatie van combinatorische netwerken. Multiplexers zijn hier een bijzonder voorbeeld van, en wij komen terug op dit punt in het hoofdstuk over het ontwerp van meerniveauschakelingen (paragraaf 4.2.5). Evenals met SSI-componenten is het gebruik op grote schaal van MSI-componenten in moderne schakelingen meestal niet meer verantwoord wegens de te grote chipaantallen die nodig zijn om een systeem van enige complexiteit te realiseren. Dit betekent echter niet dat een grondige kennis van de functionaliteit van deze componenten waardeloos is. Het is namelijk zo, dat de MSI-functies ook voorkomen in ontwerpomgevingen van programmeerbare componenten of ASIC s, maar dan als bibliotheekcomponenten. Men kan op die manier goed ingeburgerde ontwerptechnieken en bestaande ontwerpen gebruiken bij de realisatie van complexe chips, zonder dat dit het aantal chips in de hoogte drijft. Combinatorische MSI-componenten zijn de componenten die men typisch terugvindt op het RT-niveau. Functies die frequent voorkomen zijn multiplexers, demultiplexers en decoders, code-convertors (bv. prioriteitsencoders, convertoren voor de aansturing van cijferdisplays, pariteitsencoders), comparatoren, eenvoudige aritmetische circuits zoals optellers, ALU-slices, carry lookahead -circuits, combinatorische vermenigvuldigers, enz. Dit zijn functies die zeer vaak terugkomen in diverse digitale circuits, en daaraan hun reden van bestaan te danken hebben. Andere veel voorkomende functies hebben te maken met bus-interconnectie (8-, 16- en 32-bit bus transceivers en bus drivers). 62

67 Large en Very Large Scale Integration In deze klasse vinden wij haast geen louter combinatorische circuits, de meeste circuits bevatten een zekere hoeveelheid geheugen. Wij zetten deze bespreking verder in hoofdstuk Programmeerbare componenten Programmeerbare componenten zijn componenten die volledig verpakt zijn, maar waarvan de functionaliteit zonder verdere ingrepen van de gebruiker niet volstaat voor een zinvolle toepassing. De gebruiker kan (moet), alvorens de component te gebruiken, vastleggen welk functioneel gedrag de component tijdens gebruik zal vertonen. De vrijheid waarover hij daartoe beschikt, alsook de wijze waarop dit moet gebeuren, kan variëren van component tot component. Programmeerbare componenten vervullen een bijzonder belangrijke rol als bouwsteen in moderne digitale systemen, en dit als gevolg van de zeer interessante combinatie van hun eigenschappen. De programmeerbaarheid van een component biedt een zekere vorm van universele inzetbaarheid, die duidelijk ontbreekt bij de meeste standaard LSI- en VLSIcomponenten (buiten RAM s en processors, uiteraard, zie verder). Heel dikwijls komt het voor dat, door de keuze van de functionaliteit van standaard (V)LSIcomponenten, het grootste gedeelte van een digitaal systeem kan gerealiseerd worden met een klein aantal complexe VLSI-componenten, maar dat voor de realisatie van de restfuncties geen componenten met hoge integratiegraad beschikbaar zijn. Men is dan verplicht deze restfuncties te realiseren met MSI of SSI, de zogenaamde glue logic of random logic. Dit leidt onherroepelijk weer tot hoge componentaantallen. Dank zij de programmeerbaarheid kan men op grote oplage identieke componenten met hoge integratiegraad realiseren, die in staat zijn de hele gewenste functionaliteit te realiseren, ook deze van de glue logic. Men krijgt alle voordelen van massaproductie, hoge integratiegraad en lage chipaantallen. In tegenstelling tot de ASIC-technieken die wij verder bespreken, kan de ontwikkeling van een digitaal systeem tegen een redelijke kostprijs volledig ter plaatse gebeuren, en in zeer korte tijd. Men moet geen contacten onderhouden met ontwerpshuizen en foundries, men houdt eventuele fabrieksgeheimen in huis, en men hoeft geen maanden te wachten op de eerste prototypes van de chips. Hiertegenover staat dan weer dat de componentkost van programmeerbare componenten relatief hoog is, en dat de complexiteit van een programmeerbare component lager is dan de economisch zinvolle complexiteit van een ASIC. Het laat zich aanvoelen dat er een marktsegment bestaat waar de programmeerbare component de beste keus is. Voorbeelden van programmeerbare componenten zijn onder andere PAL s, EPROM s, EPLD s, FPGA s en randchips voor microprocessors. Geen van deze componenten vervult een nuttige functie alvorens men hem op één of andere manier geconfigureerd of geprogrammeerd heeft. Een traditionele PAL kan men maar eens programmeren, en men heeft er een speciaal apparaat voor nodig, een PAL programmer ; voor een EPROM heeft men ook een programmer nodig, maar men kan hem wissen en herprogrammeren. 63

68 Figuur 3.10: Een typisch voorbeeld van glue logic: het processorbord van een Cromemco 8- bitcomputer (1976). Een Z80-microprocessor staat in voor 99% van het werk, maar neemt slechts enkele percenten van de ruimte-inname en dissipatie voor zijn rekening 64

69 Een microprocessor-randchip moet in de schakeling zelf geprogrammeerd worden (door de microprocessor), maar verliest zijn programmeerinformatie bij het afleggen van de voedingsspanning. Men ziet dus dat er weerom een brede variëteit aan programmeerbare componenten en programmeertechnieken en -technologieën bestaat. In de volgende paragrafen zullen wij, weer bij wijze van overzicht, een aantal programmeerbare componenten bespreken, alsook de programmeertechnologieën die gebruikt worden. Wij zullen beginnen met het laatste. Programmeertechnologieën Hoe kan men het gedrag van een component beïnvloeden alvorens hij gebruikt wordt? Hiervoor bestaan een aantal technieken, die grondig van elkaar verschillen op basis van twee belangrijke eigenschappen: reversibiliteit en volatiliteit. Reversibiliteit wil zeggen dat de programmering later ongedaan kan gemaakt worden, zodanig dat de component herprogrammeerbaar en dus herbruikbaar is. Volatiliteit betekent dat de component zijn programmeerinformatie verliest bij het afleggen van de voedingsspanning. Het programmeren van een component kan men beschouwen als het veranderen van zijn interne structuur: alle actieve elementen zijn aanwezig (poorten, flipflops), maar men kan hun interconnectie beïnvloeden. Verbindingen kan men heel letterlijk opvatten (als galvanische verbinding), of eerder als dusdanig modelleren op het functioneel niveau (bijvoorbeeld als multiplexers). Smeltverbindingen en anti-fuses. Dit is een vroege en heel letterlijke vorm van verbindingen die voorkwam in bipolaire technologieën. Men voorziet de chip bij zijn fabricage van een aantal verbindingen in speciale legeringen (platina-silicide, titaan-wolfram). Men legt een overmaat aan verbindingen tussen de actieve onderdelen van de chip, en door selectief een aantal van deze verbindingen ( fusible links ) weg te smelten zal men de functie definiëren die de chip zal realiseren. Het wegsmelten van de verbindingen gebeurt door het toevoeren van stroom aan de component. Op de component moeten uiteraard voorzieningen aanwezig zijn om de programmeerstroom te leiden naar de verbinding die moet verwijderd worden. Het aanleggen van de programmeerstroom en de adressering van de betrokken verbindingen gebeurt niet in situ, maar in een apart programmeerapparaat. Weggesmolten verbindingen kunnen niet hersteld worden, en de enige wijziging die men na de programmering aan de chip kan aanbrengen is het wegsmelten van nog meer verbindingen. Deze vorm van programmeren is dus nietreversibel en niet-volatiel. Sommige componenten maken gebruik van het omgekeerde effect: men kan metallische verbindingen aanbrengen eerder dan verwijderen: de z.g. anti-fuses. Programmeren gebeurt door het aanleggen van spanning, om een isolerende laag te doen doorslaan. De doorslag resulteert in een permanente structuurverandering van het materiaal, en daardoor een drastische reductie van de weerstand (van 100 MΩ van de verbinding naar 100 Ω). Echte smeltverbindingen werden enkel gebruikt bij bipolaire technologie, terwijl de meer recente anti-fuses ook in CMOS-technologie gebruikt worden. FET s met vlottende gate. Een tweede vorm van programmeren bestaat erin dat men als interconnectie-element een veldeffecttransistor gebruikt die tijdens de werking van de component niet gestuurd wordt, maar waarvan men de kanaalweerstand statisch kan instellen op heel hoog of heel laag. Men kan de drempelspanning namelijk zo instellen 65

70 Figuur 3.11: Programmeertechnologie met vlottende gate dat het kanaal ofwel geleidend is, ofwel afgeknepen; op deze manier verkrijgt men het effect van een programmeerbare verbinding. Hoe beïnvloedt men de drempelspanning van de FET? Men doet dit door de FET te voorzien van een dubbele gate-electrode (meestal in poly-silicium). De elektrode dichtst bij het kanaal ligt volledig ingebed in het gate-oxide, en is dus geïsoleerd van de omgeving (fig. 3.11). Wanneer men op één of andere manier erin slaagt om lading aan te brengen op deze vlottende gate, zal dit de drempelspanning van de FET wijzigen. De wijze waarop men lading kan aanbrengen op de vlottende gate hangt af van de dikte van het gate-oxide dat de gate isoleert van haar omgeving. Voor een relatief dik oxide gebeurt dit door het aanleggen van een hoge spanning V P P tussen de buitenste gate en de source en drain van de FET. Men brengt tevens de drain op een relatief hoge spanning V D aan t.o.v. de source. Het kanaal is dan goed geleidend, en de elektronen in het kanaal worden zeer sterk versneld ( hot electrons ). Zij kunnen, dank zij hun energie, en gedreven door het veld van de buitenste gate, doorheen het oxide de vlottende gate bereiken (zij hebben namelijk voldoende energie om in de conductieband van het oxide te komen). Bij het verwijderen van de spanning schuift de conductieband van het oxide weer naar boven t.o.v. de energie van de elektronen en wordt weer isolerend. De lading blijft gevangen op de gate. Wegens de zeer goede eigenschappen van het gate-oxide kan de lading daar in normale omstandigheden jaren blijven zitten. Deze technologie noemt men FAMOS (Floating Gate Avalanche MOS). Ladingen worden weer verwijderd door de component te bestralen met ultraviolet licht, wat elektronen en gaten een energie kan geven om doorheen het oxide weer af te vloeien. Om dit mogelijk te maken moet de component voorzien zijn van een dekseltje in kwartsglas (figuur 3.12, en moet hij uit de schakeling verwijderd worden. Noteer dat het wissen van zo een component niet selectief kan gebeuren, maar dat alle FET s met vlottende gate hun lading verliezen. Figuur 3.18 toont een tweetal programmeerapparaten. Bij een zeer dun oxide (ca. 80 nm of minder in sommige componenten) zal men een overdracht van lading tussen kanaal en vlottende gate realiseren door een tunnelingmechanisme doorheen de dunne oxidelaag. Men doet dit door een hoog veld aan te leggen over het dunne oxide, waardoor de banden steil afbuigen, en waardoor de conductieband van het oxide op geringe afstand al op hetzelfde energieniveau staat als de conductieband van het kanaal van de FET. Hierdoor kunnen elektronen doorheen de isolator (Fowler- 66

71 Figuur 3.12: Twee UV-wisbare programmeerbare componenten: links een 4-Mb EPROM, rechts een EP1810 EPLD (component van het PLA-type) Nordheim-tunneling). Door omkeren van de spanning kan men de lading weer verwijderen door hetzelfde mechanisme. Noteer dat dit in situ kan gebeuren en, waar gewenst, selectief. Deze techniek wordt gebruikt in de z.g. flash eproms (wissen niet selectief) en EEPROMs (Electrically erasable Programmable Read Only Memories, met selectieve uitwissing). Deze geheugens worden zeer intensief gebruikt bij de niet-volatiele configuratie van apparaten, en ook als informatiedrager op bv. chip-kaarten. Beide technieken zijn reversibel en niet-volatiel. Geheugencellen. Een derde programmeertechnologie maakt gebruik van geheugencellen zoals flipflops (zie hoofdstuk 6) om de programmeerinformatie op te slaan. Men kan de spanning op de flipflop dan gebruiken om een FET als transmissiepoort aan te sturen, die op deze manier weerom een programmeerbare verbinding vormt. De spanning kan echter evengoed gebruikt worden als input van combinatorische circuits, waarvan het gedrag dus gecontroleerd wordt door de programmeerinformatie. Of men kan de programmeerinformatie gewoon opslaan in een register of een andere geheugenvorm, zodanig dat het gedrag van de component afhankelijk is van de inhoud van dit geheugen. Noteer dat het onderscheid tussen de laatste vorm en wat er gebeurt in een computer bijzonder vaag wordt. Er is inderdaad geen scherpe lijn te trekken tussen de werking van programmeerbare componenten en computers met oplaadbaar programmageheugen. Een mogelijk punt van onderscheid zou kunnen zijn dat wij veronderstellen dat bij gewoon gebruik van een programmeerbare component de programmeerinformatie niet gewijzigd wordt tijdens de werking. Programmeren met behulp van geheugencellen is uiteraard reversibel en volatiel. Het moet in situ gebeuren (waarom?). 67

72 Figuur 3.13: Doorsnede van een geheugencel met vlottende gate die elektrisch gewist kan worden De architectuur van programmeerbare componenten De interne architectuur van programmeerbare componenten kan diverse vormen aannemen; de laatste twintig jaren is er een werkelijke boom geweest in hun ontwikkeling. Weerom is het zo, dat in het kader van deze cursus slechts een beknopt overzicht kan gegeven worden van het overweldigend aanbod. Programmeerbare componenten vindt men in complexiteiten die variëren tussen MSI en ULSI. Sommige componenten bevatten geen (functionele) geheugencellen; andere hebben wel geheugencellen (soms zeer veel), en zijn dus sequentiële schakelingen, die wij zullen bespreken in hoofdstuk 6. Belangrijke verschillen bestaan er in de wijze waarop men combinatorische functies moet synthetiseren in de interne structuur van de component. Op basis van dit criterium maken wij onderscheid tussen twee nogal extreme vormen: de PLA-achtigen en de Cell Arrays. Wij maken er de lezer attent op dat er veel tussenvormen bestaan. De PLA-achtigen De generieke architectuur van de combinatorische PLA-achtigen staat afgebeeld op figuur Dit was ook de architectuur van de eerste programmeerbare componenten. Men onderscheidt een aantal inputs, die zowel rechtstreeks als gecomplementeerd toegevoerd worden aan een programmeerbare interconnectiematrix. De kolommen van deze matrix zijn inputs naar een aantal EN-poorten. Elke poort kan verbonden worden met elke input. De outputs van deze EN-poorten worden naar een tweede matrix gevoerd, waarvan de rijen de inputs zijn naar een aantal OF-poorten. De outputs van deze poorten vormen de outputs van de component. Men kan eenvoudig inzien dat deze structuur generiek is voor de realisatie van combinatorische functies in een (minimale) som-van-productenvorm. De beperkende factor is het aantal EN-poorten beschikbaar op de chip (waarom?). Op basis van deze generieke architectuur kan men een aantal varianten uitwerken, 68

73 Figuur 3.14: Generieke architectuur van de PLA-achtigen, i.h.b. de PLA zelf die elk hun voor- en nadelen hebben. Wij hebben de volgende mogelijkheden: 1. De eigenlijke PLA s. Dit zijn componenten die beide programmeerbare matrices bevatten. Het acroniem PLA staat voor Programmable Logic Array. De aanwezigheid van beide matrices leidt tot componenten die trager zijn dan vergelijkbare poortnetwerken in dezelfde technologie, en een beperking op het aantal ENpoorten (producttermen). Als programmeerbare component hebben echte PLA s nog slechts een historische betekenis; de PLA-structuur is echter nog steeds van belang in VLSI-ontwerp (zie verder). 2. De PAL s. Het acroniem PAL staat voor Programmable Array Logic. Het is een variant van de zuivere PLA waarin echter de OR-array vast genomen wordt: met elke OF-poort verbindt men de outputs van een vast aantal EN-poorten. Dit aantal kan variëren van OF-poort tot OF-poort. Hierdoor worden uiteraard bijkomende beperkingen opgelegd aan de realiseerbare functies (maximaal aantal termen in de som), en wordt het onmogelijk producttermen te delen tussen meerdere functies. Het voordeel is echter dat de component sneller wordt door het wegvallen van de OR-array, en dat in totaal meer producttermen kunnen aangeboden worden. Voor vele eenvoudige functies is de vastheid van de OF-matrix geen echte beperking. In hun eenvoudigste gedaante hebben PAL s vaste outputs. De meeste gangbare types hebben echter voorzieningen om het afschakelen van outputs controleerbaar te maken via enkele van de aanwezige EN-poorten. Men verkrijgt dan componenten die op een bus kunnen aangesloten worden. Wanneer men bovendien de outputpin terugvoert naar de EN-matrix (rechtstreeks en via een invertor), kan men 69

74 Figuur 3.15: Een eenvoudige combinatorische PAL, de historische 16L8. Merk op dat de uitgangen individueel afschakelbaar zijn, en dat zij bovendien terug in de EN-matrix ingevoerd worden. Dit laat gebruik in een bidirectionele bus toe, en maakt ook de constructie van asynchrone teruggekoppelde poortschakelingen mogelijk 70

75 tijdens het afgeschakeld zijn van de output de pin gebruiken als bijkomende input. Of men kan teruggekoppelde poortnetwerken realiseren (asynchrone schakelingen, zie verder). 3. De ROM-structuur. ROM (Read Only Memory) is een andere particuliere vorm van de algemene PLA-structuur. In plaats van de OF-matrix vast te maken, maakt men nu de EN-matrix vast, maar met n inputs brengt men 2 n EN-poorten aan, die alle mintermen van de n inputs realiseren. De benaming ROM wordt duidelijk wanneer wij de inputs beschouwen als adressen, de 2 n EN-poorten als een adresdecoder, en elke OF-poort als een bit van het gelezen datawoord. Een geadresseerd woord heeft een 1 op een gegeven bitpositie wanneer een input van de corresponderende OF-poort verbonden is met de EN-poort die het adres decodeert. Noot: hiermee is uiteraard niet gezegd dat de interne fysische opbouw van ROM s gebaseerd zou zijn op een vorm van lineaire adressering. Geheugenstructuren worden vrijwel altijd gebouwd rond een tweedimensionale matrix van geheugenelementen, met een tweedimensionale rij- en kolomadressering (zie verder). De volledige decodering van alle adressen werkt ietwat vertragend, en uiteraard ook beperkend op het aantal adreslijnen. Hiertegenover staat dat een ROM met n inputs en k outputs simultaan k willekeurige Boolese functies kan realiseren zonder enige beperking, en zelfs zonder dat enige minimalisatie nodig is. Men hoeft slechts de waarheidstabel van de functie op te slaan in de OF-matrix. Noteer dat de EN-poorten individuele mintermen van de inputs decoderen. Wanneer een functie 1 moet zijn op naburige mintermen, zullen deze 1-en door twee EN-poorten gerealiseerd worden, en niet door één enkele EN-poort zoals in een geminimaliseerd circuit. Dit leidt tot statische hazards (zie verder) in de realisatie van de functies, waarop de gebruiker geen invloed heeft. Hiermee dient men terdege rekening te houden bij het gebruik van ROM s om combinatorische functies te realiseren! Cell Arrays Pure cell arrays hebben een structuur sterk verschillend van deze van de zuivere PLA-achtigen. Zij worden vaak ook FPGA s genoemd ( Field Programmable Gate Arrays ), hoewel de elementaire cellen veel complexer zijn dan eenvoudige poorten!. Men vertrekt van een regelmatige matrix van CLB s, Configureerbare Logische Blokken (dus niet van poorten, zoals de term FPGA verkeerdelijk zou kunnen suggereren). Bij wijze van voorbeeld werd op figuur 3.16 de structuur van een Xilinx 3064 FPGA voorgesteld. De CLB s van deze component bevatten een programmeerbare functiegenerator, waarin men naar keuze één willekeurige Boolese functie van 5 variabelen, of twee van 4 variabelen kan implementeren, door het opladen van de waarheidstabel(len) in een ROM-structuur. De CLB bevat voorts ook twee flankgestuurde flipflops (zie verder) en een aantal configureerbare multiplexers. Hiermee kan men de flipflops in- of uitschakelen, en kiezen hoe de twee outputs van de CLB verbonden worden. De outputs van de flipflops worden intern teruggevoerd naar de functiegenerator. Karakteristiek aan de CLB s is dus de beperkte fan-in (elke CLB ziet veel minder inputs dan een macrocel in een vergelijkbare PLA-achtige component), maar de onbeperkte functiegeneratiecapaciteit binnen de beperking op de fan-in. De CLB s worden op de chip geplaatst, en worden omgeven door een eveneens programmeerbare interconnectiestructuur. De structuur is hiërarchisch: 71

76 Figuur 3.16: De structuur van een programmeerbare component van het cell array-type. Noteer de afwezigheid van een globale interconnectiestructuur die alles met alles verbindt, en de beperkte fan in van de CLB s 72

77 S2 B P1 A P1 S1 (b) S2 P2 B A P1 S1 A P1 S1 S2 P2 B (a) (c) Figuur 3.17: Een geprogrammeerde interconnectie: (a) route op het vloerplan: P is een programmable interconnection point, S is een switch; (b) circuitmodel: de schakelaars zijn FET s; (c) elektrisch equivalent: de kanalen van de FETs vormen een RC-keten samen met de capaciteiten naar het substraat van de metalen baantjes en de source- en draindiffusies van de FET s CLB s zijn vooreerst verbonden via een aantal rechtstreekse verbindingen naar de naaste buren. Deze verbindingen zijn vast en snel, maar gaan niet ver. CLB s zijn ook aangesloten op programmeerbare interconnectieblokken. Dit zijn blokjes die mits enige beperkingen intern verbindingen leggen tussen diverse punten op hun omtrek. De interconnectieblokjes zelf zijn verbonden met hun naaste buren. Op die manier kan men, over een aantal interconnectieblokken heen, een pad definiëren van één CLB naar een andere. Het aantal paden doorheen een interconnectieblok is echter beperkt, en het passeren van een blok brengt een nietverwaarloosbare vertraging mee. De reden hiervan wordt geïllustreerd in figuur 3.17: een geprogrammeerd interconnectiepad is in feite een aaneenschakeling van RC-cellen (de weerstand van de kanalen van de FET s, de condensatoren van de FET s (source- en draindiffusies) en de metalen baantjes die de blokken verbinden. Een verbinding die een aantal blokken moet passeren is veel trager (enkele ns) dan een rechtstreekse verbinding met een metalen baantje. Tenslotte liggen er op de chip een beperkt aantal lange banen, die doorheen een hele kolom of rij van de chip lopen, en op die manier een aantal snelle, verre verbindingen tot stand kunnen brengen. Het distributienet van het kloksignaal bestaat ook uit een net van lange banen. (Dit om klokverschuiving te minimaliseren.) De structuur van dit soort component leent zich niet tot de traditionele som-van-productenrealisatie van Boolese functies waarmee wij volgend hoofdstuk beginnen. Hiervoor is de beperkte fan-in van de CLB s verantwoordelijk. Wil men complexe Boolese functie realiseren, dan moet dit gebeuren onder een meerniveaugedaante, d.w.z. als een lusvrij netwerk van meerdere CLB s (zie hoofdstuk 4). Voorts is de snelheid van de realisatie afhankelijk van de plaatsing van een ontwerp of de diverse CLB s, en de manier waarop de interconnectie gerealiseerd werd (routering). Het efficiënt gebruik van dit soort componenten vraagt goede ondersteunende software voor meerniveausynthese en automatische plaatsing en routering. Manueel ontwerp is nog steeds mogelijk, maar is zeer moeizaam. In Tabel 6.4 worden de karakteristieken van enkele programmeerbare 73

78 IC-voet RS-232-verbinding met computer IC-voet UV-lamp Verbinding met plug-inbord in computer Figuur 3.18: Programmeerapparaten voor programmeerbare componenten. Het apparaat links is uitgerust met een UV-lamp om componenten te wissen; beide apparaten kunnen gekoppeld worden met een computer om het programmeerbestand (JEDEC) uit te kunnen wisselen. componenten weergegeven. Een belangrijk verschil met standaardcomponenten is dat het gerealiseerde systeem veel minder observeerbaar is: verbindingen intern op de chip kunnen niet zomaar bemeten worden tijdens een testfase. Deze situatie heeft veel gelijkenis met de situatie die men vindt bij ASIC-ontwerp. Men moet dus hulpmiddelen hebben om zowel het eigenlijke ontwerp (en de afbeelding ervan op de fysische structuur van de component), als de verificatie en validatie ervan te ondersteunen. De fabrikanten van programmeerbare componenten bieden dan ook diverse ontwerpomgevingen aan, waarin men complexe ontwerpen kan realiseren met hun componenten. Veel van deze omgevingen laten uitwisseling toe met ontwerpinformatie uit andere omgevingen. Men vindt zowel tekstuele als grafische invoer terug. Tekstuele talen zijn o.a. PALASM (AMD), ABEL (Data I/O), AHDL (Altera) en VHDL terwijl wij als grafische vormen (schematische invoer) systemen vinden zoals OrCAD, FurtureNet DASH, of eigen systemen van de chipfabrikant. In toenemende mate wordt automatische synthese en generatie vanuit bv. een VHDL-beschrijving (technology mapping) een valabel alternatief voor manueel ontwerp van de fysische schakeling. Als uitwisselingsformaat tussen de diverse pakketten gebruikt men de standaard EDIF. Figuur 3.18 toont een tweetal programmeerapparaten. Ontwerp met de traditionele middelen gebeurt meestal op logisch niveau en op RTniveau. Ofwel beschrijft men (typisch in een tekstuele taal) het gewenste gedrag van het systeem, met concrete representaties van Boolese functies en eindige automaten, ofwel ontwerpt men onmiddellijk op structureel niveau (schematische invoer). Sommige systemen laten gedeeltelijke invoer toe via tijdsdiagrammen (temporele gedragsbeschrijving). Bij structureel ontwerp heeft men meestal beschikking over bibliotheken van eerder gesynthetiseerde functies. De bibliotheken bevatten componenten die zeer dikwijls overeenkomen, of minstens grote gelijkenis vertonen met de componenten uit standaard componentlijnen voor SSI, MSI, of LSI. De ontwerpomgeving zal de beschrijving lezen en vertalen naar een vorm die past bij het architecturaal model van de component. Het resultaat uit deze stap kan gesimu- 74

79 Figuur 3.19: Ontwerptraject voor Texas Instrument s programmeerbare componenten vanuit een grafische invoer in OrCAD leerd worden. Ofwel bevat de omgeving zelf een simulator, ofwel zal men een bestand in EDIF-formaat genereren dat in een externe simulator gebruikt kan worden. Op dat punt noemt men de simulatie nog logisch, en dient als validatie van het manueel beschreven ontwerp. Ter validatie specificeert de gebruiker typisch een aantal testvectoren. De output van een correcte simulatie kan later gebruikt worden voor testdoeleinden. Nadien wordt het ontwerp geplaatst op de component (dit impliceert toewijzing van pinnen, macrocellen en CLB s), en wordt de interconnectie aangebracht (routering). Op dat punt kan men precieze timing-gegevens verkrijgen over de vertragingstijden van combinatorische functies en interconnectiestructuren. De meeste systemen laten toe deze getallen te extraheren, en ze terug te voeren naar de hogere niveaus van ontwerp, bv. in de simulator. Hier kan men een idee krijgen van het werkelijk tijdsgedrag van de implementatie. Tenslotte wordt een bestand gegenereerd waarmee men de component kan programmeren. Eén van de formaten die daar courant gebruikt worden is het JEDEC-formaat. Dit bestand kan informatie over de testvectoren bevatten, die na het programmeren kan gebruikt worden om een finale test te doen van de geprogrammeerde component. Bij wijze van voorbeeld toont fig 3.19 de werkwijze om, met schematische invoer vanuit OrCAD, componenten uit de lijn van Texas Instruments te programmeren. De TI- ALS-omgeving is specifiek voor de gebruikte componenten; de OrCAD-omgeving is niet hieraan gebonden. Noteer dat, om realiseerbare ontwerpen te kunnen maken, men moet gebruik maken van een bibliotheek in OrCAD die toegeleverd wordt door de fabrikant van de componenten. 75

80 3.3.3 ASIC-bouwstenen ASIC s (applicatie-specifieke IC s) zijn geïntegreerde circuits die niet als kant-en-klare componenten kunnen gekocht worden. De systeemontwerper kan in mindere of meerdere mate de interne opbouw van de chip mee bepalen. Op deze manier kan de chip op maat gemaakt worden voor de toepassing, wat zeer grote voordelen heeft bij het laag houden van het aantal chips waaruit de realisatie van een systeem zal bestaan. Wij hebben gezien dat dit voordeel reeds aanwezig is bij het gebruik van programmeerbare componenten. Daar echter wordt men nog steeds geconfronteerd met twee nadelige eigenschappen: men kan zelden een complexe programmeerbare chip volledig benutten: typisch zal 10 à 20 % van de chip ongebruikt blijven; een programmeerbare chip vereist de aanwezigheid van de programmeerinfrastructuur op de chip. Een op maat gemaakte chip met precies dezelfde functionaliteit als een geprogrammeerde component zal dus een significant lagere siliciumoppervlakte vertonen, en zal ook sneller zijn. Deze nadelen kunnen ten dele geëlimineerd worden door, eens een programmeerbare chip een stabiel ontwerp draagt, deze functionaliteit te vervaardigen in een niet-programmeerbare versie van de chip (de z.g. hard array logic ). Bij grotere oplagen zijn deze vaste chips goedkoper dan hun programmeerbare tegenhangers. Hiermee reduceert men uiteraard niet het aantal chips, omdat dit bepaald wordt door de mogelijkheden van de programmeerbare componenten. Met behulp van applicatie-specifieke chips kan men dus producten bouwen die veel compacter zijn dan vergelijkbare realisaties met standaardcomponenten of programmeerbare componenten. Er zijn echter ook nadelen verbonden aan het gebruik van ASIC s: de looptijd doorheen het ontwerptraject wordt langer. Het gebruik van ASIC s kan de initiële stadia van het traject wellicht inkorten, omdat minder restricties aanwezig zijn in het begin. Eens men de structuur van de te bouwen componenten volledig vast heeft gelegd, moeten de chips echter vervaardigd worden, en dit duurt meestal één tot drie maanden. Elke fout die een nieuwe fabricage vereist, wordt gepenaliseerd met een gelijkaardige tijdsduur en kost. de initiële kost (NRE, non-recurrent engineering cost ) voor de vervaardiging van een ASIC is nog steeds veel hoger dan de initiële kost voor het gebruik van standaardcomponenten of programmeerbare componenten (een belangrijke factor hierin is de vervaardiging van de maskers). Daarentegen is de productiekost van de componenten lager dan de kost van complexe programmeerbare componenten, op voorwaarde dat men de componenten produceert op voldoend grote oplagen. Voorts bestaat het gevaar dat men bij ASIC s minder bestaande ontwerpen (bv. van complexe dingen zoals processors) zal hergebruiken, maar deze eerder opnieuw, en op maat zal bouwen voor de toepassing. Dit impliceert dat ook de programmeerinfrastructuur (assemblers, linkers, compilers, enz.) grotendeels moet herbouwd worden. Dit verhoogt aanzienlijk de initiële kost, alsook de risico s op het laattijdig bereiken van de markt. Recentelijk is echter het gebruik van zg. soft cores gevoelig toegenomen. Dit zijn bibliotheekcomponenten die een volledige processor bevatten, die men mits het betalen van een licentiebedrag mag hergebruiken, en eventueel zelfs aanpassen aan zijn eigen behoeften. 76

81 Men ziet dus dat het gebruik van ASIC s zeker geen garantie biedt op succes in alle mogelijke toepassingen. Indicaties om te denken in de richting van een ASIC zijn grote oplagen, een welomschreven functionaliteit van het gewenste eindproduct, en eventueel andere specifieke eisen op het eindproduct, zoals afmetingen of vermogendissipatie. Noteer dat veel toepassingen in de consumentenbranche deze combinatie van eigenschappen vertonen. Een typisch voorbeeld hiervan zijn de signaalverwerkingschips in televisies en stereoketens (compact disc), de opkomende elektronica in gebouwen (domotica) en voertuigen (automotive electronics), en ook de chipsets voor personal computers en GSM-toestellen. De aanwezigheid reeds geruime tijd van een aantal complexe MOS- en CMOS-IC s voor consumententoepassingen in de catalogi van fabrikanten van standaard-chips bevestigt deze observatie. Applicaties die gekenmerkt worden door een complexe functionaliteit, zonder dat er echter zeer strikte snelheids-, vermogensof plaatseisen gesteld worden op dit ogenblik eerder gerealiseerd met standaard microprocessors, in het bijzonder microcontrollers (zie verder). Er bestaan diverse benaderingen voor de realisatie van ASIC s. Deze benaderingen verschillen in de manier waarop de productie van de component wordt georganiseerd, en, daaraan gekoppeld, de wijze waarop men ontwerpt voor deze componenten. Wij onderscheiden drie klassen: (i) de semi-custom gate arrays, (ii) de standaard-celbenaderingen, en (iii) de full-custom benadering. Wij zullen nu kort deze benaderingen schetsen. Semi-custom Gate Arrays Een semi-custom gate array is een component die bestaat uit een regelmatige structuur van niet-geïnterconnecteerde elementaire bouwstenen. Deze structuur bestaat alvorens een eventuele toepassing erop gerealiseerd wordt, en is er dus onafhankelijk van. Deze onafhankelijkheid maakt het mogelijk de chips gedeeltelijk te realiseren, maar dan in grote oplage: men voert alle diffusie- en implantatiestappen uit voor de realisatie van de bouwstenen, maar men brengt de metaal-interconnecties van deze bouwstenen nog niet aan. De plakken ( wafers ) worden niet-versneden gestockeerd, tot wanneer er een ontwerp moet op gerealiseerd worden. Dit gebeurt door de aanwezige bouwblokken te interconnecteren in één of meerdere metaallagen (van 2 tot 5, zie figuur 3.20), met behulp van metallisatiemaskers die ontworpen zijn op basis van het te realiseren systeem. Nadien worden de plakken versneden en de chips verpakt. De elementaire bouwstenen worden meestal op een rechthoekige of vierkante matrix georganiseerd, vandaar de naam gate array. Een niet-gemetalliseerde plak noemt men soms masterslice, en deze bestaat uit prediffused components. Bouwstenen worden typisch beschreven op logisch niveau: het zijn bv. 2- of 3-input NAND-poorten. Soms biedt men bouwblokken aan op circuitniveau: men voorziet dan in interconnecteerbare transistoren, weerstanden en dioden. Dit soort componenten noemt men soms uncommitted logic arrays (ULA s). Het ontwerp met dit soort componenten kan in principe op logisch niveau gebeuren, maar net zoals bij programmeerbare componenten voorziet men in ontwerpomgevingen die ontwerp op RT-niveau ondersteunen. Deze ontwerpomgevingen bevatten bibliotheken van macro s, dit zijn eerdere gerealiseerde functies met een functionaliteit die te vergelijken is met de standaard SSI-, MSI- en LSI-bouwblokken. Van langsom meer wordt ook hier VHDL als invoertaal gebruikt. Voorbeeld 3.1 Beschouw als voorbeeld de H4C-productlijn van Motorola. Dit is een lijn van 77

82 Figuur 3.20: De drielagenmetallisatie van een gate array uit de H4C-lijn van Motorola (1995). De isolatie tussen de metaallagen werd verwijderd CMOS gate arrays. De grootste componenten bevatten meer dan poorten (2-input NAND). De metallisering gebeurt in drie lagen (waarvan één voor de voedingsdistributie); zij kan over de actieve componenten aangebracht worden, zodanig dat de routering relatief weinig plaats inneemt, en zeker geen afzonderlijke kanalen vereist zoals in sommige programmeerbare componenten. Deze architectuur noemt men een channelless of een sea-of-gates architectuur. In de bibliotheek vindt men macro s die gaan van eenvoudige poorten (1 poort per 2-input NAND- of NOR-functie), over flankgestuurde D-flipflops (10 poorten), aritmetische circuits zoals een combinatorische 8-bitvermenigvuldiger (1106 poorten), tot een tweepoortgeheugen (7798 poorten). Poortvertragingen zijn typisch 0.17 tot 0.8 ns (afhankelijk van de fan out). De toegangstijden tot de geheugens zijn, afhankelijk van de afmetingen en de woordbreedte, van de orde van 2 tot 5 ns. Het ontwerptraject vertoont veel gelijkenis met het traject voor programmeerbare componenten. Men doet eerst een pre-layout-ontwerp, waarin men een netlijst afleidt die de interconnectie van de elementaire bouwblokken beschrijft. Deze netlijst kan ingevoerd worden in een simulator, die het functioneel gedrag simuleert, echter nog zonder rekening te houden met de feitelijke vertragingstijden veroorzaakt door de interconnectie. Deze simulatie kan o.m. gebruikt worden voor het aanmaken van testvectoren. Nadien wordt de netlijst geplaatst en gerouteerd, en kan men de echte (capacitieve) belastingen van de poorten bepalen. Deze cijfers worden teruggevoerd naar de netlijst (Eng. back annotation), waar ze aanleiding geven tot een simulatie die ook het verwachte tijdsgedrag nauwkeurig modelleert. Wanneer deze simulaties voldoening schenken, worden de ontwerpbestanden (in EDIF-formaat) overgedragen aan de fabrikant, zodanig dat de componenten kunnen gefabriceerd worden. Tabel 3.2 geeft een idee van de eigenschappen van enkele semi-custom gate arrays. Standaard-celcomponenten Bij standaard-celcomponenten valt de beperking van de op voorhand gemaakte diffusies weg. De hele chip wordt op maat gemaakt naar de specificaties van de ontwerper. De gebruikte technologie is vrijwel uitsluitend CMOS, met kanaallengten die de dag van 78

83 Tabel 3.2: Enkele semi-custom gate arrays (Motorola) Component Complexiteit Vertragingstijd Technologie I/O- (equiv. poorten) (ns) signalen HDC CMOS 76 HDC CMOS 300 H4C CMOS 188 H4C CMOS 556 MCA750ETL ECL 42 MCA2200ECL ECL 108 MCA10000ECL ECL 256 vandaag (2003) variëren van 0,13 tot 0,6 µm. Om een chip met een aanvaardbare efficiëntie te kunnen ontwerpen op fysisch niveau (layout en routering), zorgt men voor een bibliotheek van eerder gerealiseerde functies, die echter een zeer gelijkende fysische lay-outstructuur hebben. Bijvoorbeeld, alle bibliotheekfuncties zijn qua lay-out rechthoekig, waarbij alle rechthoeken dezelfde hoogte hebben, en waarbij alle inputs en outputs bijvoorbeeld enkel aan de boven- en onderkant van de rechthoek naar buiten gebracht worden. Dit soort van cellen kan men in rijen plaatsen, en de gewenste interconnecties tussen de cellen in bedradingskanalen die tussen de rijen lopen. De plaatsing van de cellen en hun interconnectie kan automatisch verlopen. De oppervlakte van een standaardcel kan kleiner zijn dan deze van een semi-custom macro met dezelfde functionaliteit, omdat ook de diffusies en de bedrading in de polylagen op maat gemaakt wordt. Anderzijds zal men meestal niet toelaten dat interconnectiebanen over de cellen gelegd worden, hoewel ook deze beperking in de meer recente technologieën achterhaald is. De standaardcelbibliotheken bevatten eveneens de gebruikelijke componenten op SSI-, MSI- en LSI-niveau. Een voorbeeld van een dergelijke cel komt uit de SOLO-1400 ontwerpomgeving (ES2, 1995), zie figuur Deze figuur geeft drie zichten op dezelfde cel: het schema (logische structuur op poortniveau), de transistorschakeling (logische structuur op circuitniveau), en de eigenlijke standaardcellayout (fysische structuur op circuitniveau). De basiscel bestaat uit een stage, dit is een koppel transistoren met resp. een n- en een p-kanaal. Stages worden in rijen geplaatst, waarbij waar nodig plaatsen overgelaten worden voor bedrading. Nadien worden de transistoren uit de stages door middel van metaal (2 lagen bij ES2, 4 tot 5 lagen in meer recente technologieën) tot een circuit geïnterconnecteerd (zie figuur 3.22). De omgeving bevat ook standaardcellen met een vooraf gemaakte lay-out, bijvoorbeeld flipflops. Bij deze lay-outs wordt ook polysilicium gebruikt als bijkomende interconnectielaag. Modules of macro s. Naast de eigenlijke standaardcellen, die in functionaliteit vergelijkbaar zijn met standaardcomponenten, bevatten de meeste omgevingen ook modulegeneratoren. Een module is een bouwblok met een veel grotere complexiteit dan een elementaire standaardcel. De bedoeling is dat de lay-outstructuur van een module op voorhand, en misschien niet automatisch, gedefinieerd wordt, maar dat bij effectief gebruik van de module, de lay-outstructuur kan aangepast worden aan de functie die moet gerealiseerd worden. Het op voorhand aanmaken van een (generieke) lay-outstructuur 79

84 Figuur 3.21: Standaard-cellayout van een multiplexer, gerealiseerd als complexe CMOS-poort (ES2): logisch niveau (logische structuur), circuitniveau (fysische en logische structuur) 80

85 Figuur 3.22: Een chipfoto van een standaard-celontwerp (ES2, 0,7 µm). Het getoonde deel meet ca. 2,35 1,6 mm heeft als voordeel dat de lay-out zeer compact kan zijn, veel compacter dan een lay-out die opgebouwd is uit afzonderlijke standaardcellen. Dit heeft niet alleen voordelen op het gebied van oppervlakte, maar ook op het gebied van snelheid en dissipatie (waarom?). De ontwerper van modules wordt dus met dezelfde problemen geconfronteerd als de ontwerper van standaard VLSI-bouwstenen: welke functies moeten aangeboden worden? Het antwoord vindt men eveneens in de wereld van de standaard bouwstenen: ofwel functies waarvan de functie (en dus de structuur) niet afhangt van de complexiteit (bijvoorbeeld geheugens); ofwel vaste functies die universeel bruikbaar zijn (processors); ofwel functies met een programmeerbaar gedrag, zodanig dat de structuur van de module slechts lokaal afhankelijk is van de gerealiseerde functie. Zowel wat betreft processors als geheugens bieden de meeste ontwerphuizen en foundry s mogelijkheden. Processors zijn soms te verkrijgen als zg. IP cores, 4 dit zijn simuleerbare en synthetiseerbare beschrijvingen van standaard-processors (bijvoorbeeld de welbekende SPARC-architectuur). Een ontwerper kan een licentie kopen op het gebruik van de beschrijving, en hiermee dus de volledige processor mee-integreren op hetzelfde chipoppervlak. Voor geheugens biedt men meestal generatoren: de foundry genereert de layout van een geheugenblok naar de specificaties (afmetingen, woordbreedte, aantal poorten) van de klant. In de klasse van functies met een programmeerbaar gedrag vindt men als belangrijkste vertegenwoordiger de PLA (of PLS, wanneer ook flipflops worden aangebracht). Uit 4 IP staat hier voor Intellectual Property, niet voor Internet Protocol! 81

86 figuur 3.14 volgt dat de generieke structuur van een PLA vrijwel onafhankelijk is van de gerealiseerde functie; enkel de detailinhoud van de EN- en OF-matrices is bepalend voor de functie. Deze idee kan doorgetrokken worden tot op geometrisch niveau. Men kan een PLA geometrisch steeds beschrijven als bestaande uit twee rechthoeken (de twee matrices) met een gemeenschappelijke afmeting. In figuur 3.23 wordt een schematisch beeld gegeven hoe er een PLA-module kan uitzien. De interne structuur is een NOR- NOR-structuur, die door gebruik te maken van de regels van De Morgan, en invertoren aan in- en outputs, de standaard EN-OF-structuur verkrijgt (ga dit na!). Het aantal producttermen wordt volledig bepaald door de te realiseren functie. Dit aantal bepaalt de hoogte van de structuur; het minimaliseren van het aantal implicanten is dus van wezenlijk belang voor een reductie van de vereiste oppervlakte en de hiermee geassocieerde eigenschappen. In figuur 3.23 herkent men de invertoren aan de inputs (dubbel uitgevoerd om de inputbelasting op één standaardinput te brengen), die de inputs en hun complement in de EN-array invoeren als verticaal lopende banen. Deze banen worden typisch gebruikt als gate-elektrode voor de transistoren in de matrix. Elke implicant wordt gerealiseerd als een NOR-poort met passieve last. Of een input al dan niet gebruikt wordt, hangt af van het al dan niet aanbrengen van een transistor op de gepaste plaats. Dit kan op diverse manieren, bijvoorbeeld door in te grijpen op de dikte van het oxide (gate-oxide is veel dunner dan isolatie-oxide of field-oxide), of door de drain van een al aanwezige transistor al dan niet te verbinden. De implicanten worden uit de EN-matrix naar buiten gebracht als horizontale banen, die in de OF-matrix opnieuw als gate-electrode zullen gebruikt worden. De structuur van de OF-matrix is gelijkaardig aan de structuur van de EN-matrix. De sommen komen als verticale banen uit de matrix, waar ze geïnverteerd en gebufferd worden, alvorens de module te verlaten. PLA s werden (en worden tot op zekere hoogte) bijzonder frequent gebruikt voor de realisatie van complexe combinatorische functies en eindige automaten (daartoe moeten er natuurlijk extra flipflops worden aangebracht). Eindige automaten komen ofwel rechtstreeks als te realiseren gedrag naar voor, ofwel als bijproduct van een andere synthesestap. Een PLA is over het algemeen sneller en compacter dan een ROM-structuur, maar wat groter en soms trager dan meerlaagse poortnetwerken, althans voor niet te complexe functies. In een CMOS-omgeving vertoont een PLA zoals deze in figuur 3.23, wegens de aanwezigheid van passieve-lastelementen, een statische dissipatie die afwezig zou zijn bij een meerlaagse realisatie van de combinatorische functie d.m.v. complexe CMOSpoorten (zie hoofdstuk 6). Deze statische dissipatie kan deels omzeild worden door het gebruik van dynamische circuittechnieken, waar mogelijk. Full-customcomponenten Full-customontwerp is het ontwerp van ASIC s zonder zich te onderwerpen aan de ontwerpregels en functiebibliotheken van ontwerpomgevingen. Men moet het ontwerp zelf verfijnen tot op het circuitniveau, en men is tevens verantwoordelijk voor de realisatie van de geometrische beschrijving (lay-out en routering). Het zijn precies deze aspecten waar de ontwerper die werkt met standaardcellen en modulegeneratoren van ontslagen wordt. Het hoeft geen betoog dat ontwerp op dit niveau heel andere eisen stelt aan de ont- 82

87 Figuur 3.23: Logische en fysische structuur van een custom PLA (circuitniveau, schematisch) 83

88 Figuur 3.24: Te analyseren taknetwerk werper: deze moet immers zeer goed op de hoogte zijn van de technologische en geometrische beperkingen ( design rules ) van de gebruikte technologie. De realisatie van een complexe schakeling op deze manier is dan ook veel moeilijker en tijdrovender dan op de andere manieren. De te verwachten winst ligt volledig vervat in de eigenschappen van de gerealiseerde chip: men kan nóg compactere lay-outs genereren dan met standaardcellen. Hierdoor zal het siliciumoppervlak verder dalen (de chip wordt goedkoper), en kan de snelheid toenemen. Beide eigenschappen zijn van cruciaal belang voor de realisatie van bouwstenen die in grote aantallen door veel ontwerpers gebruikt worden denk maar aan standaardcomponenten zoals geheugenchips en processors, of bibliotheekmodules in een ASIC-ontwerpomgeving. De economische implicaties (bijzonder grote ontwerpinspanning, typisch vele persoon-jaren voor bv. een processor) sluiten full-customontwerp dan ook uit voor de meeste gewone ontwerpen, waar de marginale toename van de ontwerpkost niet gecompenseerd zou worden door de marginale toename van de opbrengst. Wegens de zeer gespecialiseerde aard van deze ontwerpmethode zullen wij er in deze cursus niet verder op ingaan. 3.4 Opgaven 1. Is het product A B van twee connectiematrices van dezelfde dimensie steeds een connectiematrix? Bewijs of geef een tegenvoorbeeld. 2. Is het product van connectiematrices van dezelfde dimensie associatief? Is het commutatief? Bewijs of geef een tegenvoorbeeld. 3. Beschouw het netwerk in figuur Bepaal de schakelfunctie gerealiseerd tussen de punten 1 en 6 met behulp van de connectiematrix A van het circuit. Vanaf welke macht n is A n = A? Hoe kan men dit rechtstreeks zien op de schakeling? 4. Men wenst poorten te bouwen met behulp van taknetwerken, op de manier geschetst in Figuur Weze N 1 en N 2 taknetwerken met oneindig snelle schakelaars. Men eist dat de output Out steeds verbonden is met ofwel +V ofwel 0; nooit +V verbonden wordt met 0. (a) Wat is de verwantschap tussen de functies gerealiseerd door N 1 en N 2, en tussen de topologieën van hun netwerken? 84

89 Figuur 3.25: Een poort gemaakt met behulp van schakelaars Figuur 3.26: Twee concrete gevallen (b) Bepaal N 2 voor elk van de gevallen in Figuur

90 Hoofdstuk 4 Synthese van combinatorische schakelingen In dit hoofdstuk zullen wij nagaan hoe wij, uitgaande van een willekeurige Boolese vorm, op systematische (en dus ook op computergesteunde) manier een of een stelsel Boolese functies kunnen realiseren d.m.v. een poortnetwerk. Uit de vorige hoofdstukken blijkt dat, zonder bijkomende restricties, dit probleem triviaal is: elke Boolese vorm stelt immers de topologie van een poortnetwerk voor. Het afleiden van de graaf die het netwerk voorstelt, stelt dan ook geen enkel probleem. Anders wordt het wanneer een aantal bijkomende optimaliteitsvoorwaarden worden gesteld, waaraan het resulterend netwerk moet voldoen. Wij stellen gewoonlijk een aantal, soms conflicterende eisen: 1. Het netwerk moet zo snel als nodig zijn. Dit wil zeggen dat de tijd die verloopt tussen het veranderen van een ingangssignaal, en het stabiliseren van de netwerkuitgangen daarna, beneden een vooropgestelde duur moet blijven. De toelaatbare tijd wordt vanzelfsprekend bepaald door de toepassing, en het is niet nodig de schakeling sneller te maken dan nodig. 2. Het netwerk moet zo goedkoop mogelijk zijn. Een aantal factoren beïnvloeden de kostprijs, bijvoorbeeld: Het aantal componenten nodig voor de bouw van het netwerk; De chipoppervlakte die het netwerk inneemt bij een ASIC-implementatie; 3. Het netwerk moet zo weinig mogelijk energie dissiperen per bewerking; 4. Het netwerk moet testbaar zijn na productie; In de loop van de voorbije dertig jaar hebben zich twee netwerkstijlen ontwikkeld die een systematisch ontwerp mogelijk maken. De eerste stijl is de tweeniveaugedaante. In deze stijl moeten de gerealiseerde netwerken een som-van-producten-vorm (SVP) hebben 1. Zij moeten bestaan uit een OF-poort, 1 Of de duale product-van-sommen-vorm. 86

91 waarvan de uitgang de functiewaarde draagt, en waarvan de inputs verbonden zijn met de output van EN-poorten. De inputs van deze EN-poorten zijn de variabelen, in al of niet gecomplementeerde vorm. Door gebruik te maken van de regels van De Morgan kan men de som-van-productenvorm ook onder NAND-NAND- of NOR-NOR-gedaante brengen (zoals bij de PLA in figuur 3.23). Wij zullen hier echter verder werken met de EN-OF-vorm. De EN-OF-vorm leidt tot het netwerken met de geringste padlengte van ingang naar uitgang (maximaal 2, voor willekeurige functies, wanneer wij de invertors niet meerekenen), en dus snelle netwerken, althans voor eenvoudige functies. De gerealiseerde netwerken moeten minimaal zijn volgens volgende criteria: 1. Het aantal EN-poorten moet minimaal zijn. 2. Het gezamenlijk aantal inputs van EN-poorten moet minimaal zijn. De DSV van een Boolese vorm is duidelijk van de goede vorm, maar is niet noodzakelijk minimaal. Wat wij zoeken is een minimale som, een equivalente Boolese vorm die een som van producten is, maar met een minimum aantal lettervormen X i of X i in de uitdrukking. De som-van-productenvorm die wij in het eerste deel van dit hoofdstuk nastreven is uiteraard lang niet de enige gedaante waarin poortnetwerken kunnen voorkomen. Complexe functies kunnen trouwens moeilijk in deze vorm gegoten worden, omdat de bouwstenen waarover men beschikt vaak veel te weinig inputs hebben (het maximaal aantal inputs bij EN- en OFpoorten is van de orde 10 tot 16; hogere waarden zijn mogelijk, maar leiden tot lagere snelheden). Een minstens even belangrijke klasse is daarom de tweede vorm, deze van de meerniveaucircuits, waar men poorten met een beperkte fan-in kan gebruiken, maar waar men paden langer dan 2 toelaat van de inputs naar de outputs. Het totaal aantal poorten en poortinputs kan dan nog lager zijn dan bij de tweelaagse som-van-productenvorm. Het blijkt zelfs dat de langere paden niet noodzakelijk tot tragere netwerken leiden, omdat de gebruikte poorten eenvoudiger en dus sneller kunnen zijn. Wij zullen beide ontwerpstijlen onderzoeken. 4.1 Tweenineausynthese De concrete opgave waar wij voor staan is de volgende: gegeven een of een stelsel Boolese functies over dezelfde variabelen, leid een som-van-productenvorm af van deze functies zodanig dat het totaal aantal termen mininaal is, en vervolgens de totale kost van de termen (aantal factoren) eveneens minimaal is. De Boolese functies kunnen mogelijk partieel zijn (dit wil zeggen, niet voor elk punt in hun domein gespecificeerd), en kunnen op diverse manieren opgegeven worden: als Boolese vorm, als waarheidstabel, als lijst van mintermen,... Sinds de jaren 50 van de vorige eeuw zijn diverse technieken en algoritmen ontwikkeld om dit probleem op een systematische manier op te lossen. Wij zullen nu een aantal van deze technieken bespreken. 87

92 4.1.1 Algebraïsche minimalisatie Wij beginnen met de historische algebraïsche methode van Zissos, bij wijze van introductie in de problematiek. De algebraïsche methode bestaat uit een symbolische manipulatie van functies opgegeven als Boolese vorm. wij beperken ons tot volledig gespecificeerde functies. Wij zullen de Boolese vorm herschrijven in een meer eenvoudige, maar equivalente gedaante. Wij gebruiken hiervoor de diverse gekende reductieregels die de betekenis van de vorm ongemoeid laten. Naast de reeds eerder vernoemde reductieregels (zie afleiding van de DSV) hebben wij behoefte aan twee bijkomende reductieregels: Stelling 4.1 Weze A en B twee Boolese vormen. Dan is A + A B A. Bewijs. A + A B A (1 + B) A 1 A. In een Boolese som-van-productenvorm mag men termen die andere termen volledig bevatten (beschouwd als verzameling van lettervormen) schrappen. Stelling 4.2 Weze A, B en C Boolese vormen. Dan is A B + A C A B + A C + B C Men noemt B C het optioneel product van A B en A C. Bewijs. A B + A C + B C A B + A C + (A + A) B C A B + A C + A B C + A B C A B (1 + C) + A C (1 + B) A B + A C. Opmerking. Vanaf nu zullen wij, om gemakkelijkheidsredenen, het equivalentie-symbool vervangen door =, en het productsymbool weglaten. Noteer echter dat het gebruik van = binnen V n strikt genomen onjuist is, tenzij men effectief letterlijke gelijkheid bedoelt! Wij beschrijven nu een (oude) methode die in 1972 voorgesteld werd door Zissos. De algebraïsche minimalisatiemethode verloopt in twee stadia: 1. de verwijdering van redundantie (reductie); 2. de herleiding tot een minimale vorm. Voor beide stappen zullen wij nu een algoritme presenteren. Algoritme 4.1 (Algebraïsche reductie van Boolese vormen [Zissos72]) 1. Herleid de bv. naar een som van producten door het uitwerken van de haakjes. Verwijder alle termen die X i X i bevatten voor een bepaalde i. Schrap dubbele factoren in een product en dubbele termen in de som. Stop indien geen termen resteren (equivalente vorm is 0) of wanneer twee termen elkaars complement zijn (A + A ; de equivalente vorm is 1). 88

93 2. Verwijder redundante termen d.m.v. Stelling 4.1. Schrap alle termen die een kortere term volledig bevatten, immers A + AB = A. 3. Gebruik Stelling 4.2 om andere termen te schrappen: rangschik de termen naar stijgende lengte. (a) Neem de eerste factor uit de eerste term, en zoek een term die het complement van deze factor bevat; noem deze termen vadertermen. Vorm het optioneel product, en ga na of dit optioneel product niet vervat is in een andere term. Zo ja: indien het niet gaat over één der twee vadertermen, schrap dan deze term. indien het gaat over één der vadertermen, vervang dan de vaderterm door het optioneel product. Zo neen: ga over naar de volgende variabele en, eventueel naar de volgende term, tot wanneer geen combinaties meer mogelijk zijn. (b) Genereer alle hogere-orde optionele producten. Ga na of met een optioneel product en een bestaande term geen nieuw (hoger-orde) optioneel product kan gemaakt worden; gebruik deze hogere-orde optionele producten als voorheen. Voorbeeld 4.1 Reductie met de methode van Zissos. Reduceer de vorm U = A + A C + B + D(B C + A C ). 1. Uitwerken van de haakjes, sorteren, redundante termen en factoren schrappen: 2. Eerste-orde optionele producten: U U = A + A C + B + DB C + DA C = A + B + A C + A C D + B C D = A + A C +B + A } {{ } C D + B C D C A C = C + B + A + A C D +B } {{ } C D C D AC D,B C D = C D + C +A + B } {{ } D C D = D + C + A + B Reduceer de vorm U = AB + A C + B D + C D Er zijn geen eerste-orde optionele producten bruikbaar; probeer hogere-orde producten. U U = AB + A C +B } {{ } D +C D BC } {{ } CD } {{ } D B D,C D = D + AB + A C 89

94 Vormen die gereduceerd werden door Algoritme 4.1 zijn niet-redundant, maar niet noodzakelijk minimaal. Zo is bv. de vorm niet-redundant, maar de vorm P = A BC + A BD + ACD + AB D + AC D P = A BC + BCD + AB D + AC D is hiermee equivalent en heeft minder termen (ga dit na, bijvoorbeeld met behulp van een Karnaughkaart). Het volgend algoritme minimaliseert niet-redundante vormen. Algoritme 4.2 (Algebraïsche minimalisatie [Zissos72]) 1. Vorm een optioneel product R. Indien dit niet mogelijk is, is de vorm reeds minimaal. 2. Vorm optionele producten tussen R en termen die geen vadertermen van R zijn. Indien deze optionele producten beide ouders van R omvatten dan vervangen we beide ouders door R. 3. Herhaal stappen (1) en (2), maar vorm geen nieuwe optionele producten met vorige termen R. Indien maar één van beide ouders van R voorkomt in stap (2) dan mag men deze ouder vervangen door R. Men zal geen besparingen doen in de resulterende vorm, maar er kan een minimalisering mogelijk worden in een later stadium. Noteer dat dit uitstel aanleiding kan geven tot een zeer sterke toename van het aantal te onderzoeken mogelijkheden! Voorbeeld 4.2 Minimalisatie met de methode van Zissos. Minimaliseer de vorm U = A BC + A BD + ACD + AB D + AC D Secundaire optionele producten U = A BC + A BD + ACD +AB } {{ } D + AC D BCD A BC + BCD A BD AB D + BCD ACD } beide vadertermen van BCD Minimale vorm: U = A BC + BCD + AB D + AC D Zissos levert echter geen bewijs van de optimaliteit van bovenstaande algoritmen. 90

95 4.1.2 Implicantenmethoden De mintermrepresentatie van een functie is meestal geen minimale som: men kan een functie gewoonlijk voorstellen door een som van minder termen, die bovendien minder factoren bevatten. Een minterm(functie), en in het algemeen een product van lettervormen, stelt een deelkubus voor van de binaire n-kubus {0, 1} n. Het aantal hoekpunten van een deelkubus is 2 n j, waar j het aantal lettervormen in het corresponderend product is. Een minimalisatie van de vorm moet leiden tot het vinden van een minimaal aantal deelkubussen, die elk maximale grootte hebben en waarvan de som de originele functie realiseert. De hieronder beschreven methoden werden hiervoor ontwikkeld; laat ons hiertoe eerst de noodzakelijke terminologie definiëren. Definitie 4.1 Een implicant van een functie f is een Boolese functie, voorgesteld door een product van lettervormen, die f impliceert: X j 1 i 1 X j k i k f. Definitie 4.2 Een priemimplicant van een functie f is een implicant van f die geen andere implicanten van f impliceert. Implicanten zijn deelkubussen, en de priemimplicanten vormen de grootste kubussen die vervat zijn in de functie. Als in een som-van-productenvorm uit een term geen enkele factor (lettervorm) kan geschrapt worden zonder de equivalentie met de oorspronkelijke vorm te verbreken, dan is deze term een priemimplicant. Definitie 4.3 De complete som van een functie f is de som van alle priemimplicanten van f. De complete som realiseert dus de functie met het grootst mogelijk aantal termen van maximale grootte. Het aantal termen kan gevoelig groter zijn dan het aantal mintermen van de functie! Definitie 4.4 Een niet-redundante som van een functie is een som van priemimplicanten van f die equivalent is met f en waarin geen enkele term mag weggelaten worden zonder deze equivalentie te verbreken. Noteer dat zowel de complete som als een niet-redundante som equivalent zijn met de oorspronkelijke functie, maar dat geen van beide minimaal hoeft te zijn (net zoals de vormen die geproduceerd worden door Algoritme 4.1). Het komt er op aan uit alle nietredundante sommen een minimale te kiezen. Om het aantal te onderzoeken niet-redundante sommen te beperken kunnen wij ons de vraag stellen of er niet een aantal priemimplicanten zijn die in alle niet-redundante vormen van f moeten voorkomen. Het is intuïtief duidelijk dat elke priemimplicant die als enige term in een niet-redundante som een knooppunt van de n-kubus bevat, moet aanwezig zijn in elke niet-redundante som en dus ook in een minimale som. De volgende definities formaliseren deze situatie. Definitie 4.5 Een afgezonderde cel van een functie f is een punt (x 1,..., x n ) {0, 1} n dat deel uitmaakt van slechts één priemimplicant van f. Deze priemimplicant noemt men dan een essentiële priemimplicant. Stelling 4.3 Elke niet-redundante som en elke minimale som van f bevatten alle essentiële priemimplicanten van f. 91

96 Bewijs. (wordt gelaten als oefening voor de lezer). Voor het vinden van een minimale som volstaat het dus (i) alle priemimplicanten te zoeken, en daarin de essentiële priemimplicanten te identificeren, (ii) in alle niet-redundante sommen, de minimale sommen van de niet-essentiële priemimplicanten te zoeken. Tot hiertoe hebben wij verondersteld dat een functie volledig gespecificeerd is. Meestal is dit niet zo, en specificeert men de functie slechts op een strikte deelverzameling S {0, 1} n. De redenen hiervoor zijn legio, en kunnen bijvoorbeeld te maken hebben met inputcombinaties die wegens de aard van de toepassing nooit kunnen optreden. Wij moeten dan enkel een partiële functie realiseren. De waarden van f op de punten in S C = {0, 1} n S zijn dan irrelevant (Eng. don t care, d.c.). Elk stel kubussen van maximale grootte dat alle punten bedekt waar f = 1, en geen enkel punt waar f = 0, is een realisatie van de functie. Hiervan kan men gebruik maken bij de constructie van de priemimplicanten: een geschikte keuze van de functiewaarden op de d.c.-punten maakt het mogelijk de priemimplicanten van maximale grootte te maken. Wij zullen nu de twee stappen in het bepalen van een minimale som, d.i. het vinden van de complete som, gevolgd door het bepalen van een minimale subset, in detail onderzoeken. Wij beginnen met enkelvoudige functies. Het bepalen van de complete som Voor functies van een klein aantal variabelen kan men gebruik maken van de grafische karnaughkaartrepresentatie van de functie (fig. 4.1). Men brengt de functie f in kaart, en bepaalt op zicht de grootste subkubussen bevat in f (priemimplicanten). De subkubussen die als enige een cel van de kaart bedekken zijn de essentiële priemimplicanten. Noteer dat voor 5-variabele functies, sommige kubussen bestaan uit twee identieke subkubussen in elke deelkaart (kubus W XZ in fig. 4.1). Don t care termen mogen (maar moeten niet) in rekening gebracht worden bij het bepalen van de priemimplicanten. De kaartmethode is prima voor handminimalisatie van eenvoudige functies. Wanneer het gaat over functies van 6 of meer variabelen is de kaartmethode waardeloos. Men gebruikt dan Quine en McCluskey s algoritmische tabelmethode. 2 Deze methode gaat als volgt (fig. 4.2). Algoritme 4.3 ( Het vinden van de complete som [McCluskey65]) Men vertrekt van de mintermexpansie van de functie. Het nummer van elke gebruikte mintermfunctie (0-kubus) wordt binair voorgesteld in n bits, en in een eerste tabel geschreven. 1. Orden de mintermnummers volgens stijgend aantal eentjes (gewicht) in een aantal klassen in een eerste tabel. Neem de eerste minterm uit de eerste en de tweede klasse. 2. Onderzoek dit paar mintermen. (a) Wanneer de Hamming-afstand tussen de beschouwde mintermen groter is dan 1 ga naar stap 3. 2 Ook dit is een oude methode, die echter een mijlpaal was in het domein van logisch ontwerp. Intussen zijn er tal van meer verfijnde en veel efficiënter algoritmen uitgedacht, waarvan wij er enkele wat nader zullen bekijken verderop. 92

97 W Z Y X Y W X Z V = 0 V = 1 f(v, w, x, y, z) = (1, 2, 3, 4, 5, 6, 7, 10, 14, 20, 22, 28) complete som f = V W Z + V W Y + V Y Z + V W X + W XZ + V XY Z e.p.i. = V W Z, V Y Z, W XZ, V XY Z Figuur 4.1: De kaartmethode voor het vinden van de complete som. (b) Wanneer de Hamming-afstand precies gelijk is aan 1, vorm dan de 1-kubus die beide mintermen bevat. De 1-kubus wordt ternair voorgesteld. Hij bestaat uit de voorstelling van de eerste minterm, maar met een op de plaats van het Hamming-1 verschil. Schrijf deze 1-kubus in de tweede tabel, en merk beide gebruikte 0-kubussen aan. 3. Selecteer het volgend paar uit de huidige klassen; wanneer de huidige klassen afgewerkt zijn, maar nog niet de hele tabel, schuif een klasse op en neem weer de eerste kubus uit beide klassen; ga naar stap Wanneer alle klassen uit de eerste tabel afgewerkt zijn, verzamel alle niet-gemerkte kubussen: dit zijn reeds een aantal priemimplicanten. 5. Neem de nieuwe tabel als huidige tabel, schrap alle dubbels en herbegin bij stap 1. Gebruik hierbij de volgende interpretatie van Hamming-afstand: de afstand van een met een 1 of 0 is groter dan 1. Enkel kubussen met symbool op dezelfde plaats en Hamming-afstand 1 over de symbolen in {0, 1} mogen worden gecombineerd. 6. Verzamel steeds de niet-gemerkte kubussen, en blijf stappen 1 6 herhalen tot wanneer geen nieuwe tabel meer gevormd kan worden. Ook hier kan men rekening houden met de don t care-termen: men voert ze gewoon in tabel 1 in. Niet-gemerkte don t care-termen moeten echter niet langer beschouwd worden. Het bepalen van een minimale som Eens wij de complete som hebben gevonden moeten wij hieruit een minimale subset van termen selecteren die nog steeds de gewenste functie realiseert. 93

98 V W X Y Z V W X Y Z V W X Y Z * * B * * C * * D * E * * F * * * * * * * * * * * * * * * * * * A f(v, w, x, y, z) = (1, 2, 4, 3, 5, 6, 10, 20, 7, 14, 22, 28) Priemimplicanten: A = V XY Z B = V W Z C = V W Y D = V Y Z E = V W X F = W XZ Figuur 4.2: De tabelmethode voor het vinden van de complete som 94

99 In het geval van de kaartmethode kennen wij reeds de essentiële priemimplicanten. Voor de cellen die nog niet bedekt zijn door e.p.i. s zoeken wij een minimale verzameling uit de resterende p.i. s. Gewoonlijk zijn er niet veel alternatieven, en kan men door eenvoudig nazicht een minimale oplossing vinden. Voor de tabelmethode echter, liggen de zaken anders: de functies kunnen veel complexer zijn, en de essentiële priemimplicanten zijn nog niet gekend. Men kan dan het volgende algoritme gebruiken: Algoritme 4.4 [Bepalen van een minimale som met de tabelmethode] Maak een matrix waarvan de kolommen overeenkomen met de mintermen van de functie (geen don t care termen), en de rijen met de reeds gevonden p.i. s. (fig. 4.3). Zet een merkteken op elke combinatie van minterm en p.i. waarvan de p.i. de minterm bevat. 1. Zoek alle kolommen waarin slechts één merkteken voorkomt. Dat merkteken identificeert de e.p.i. s. Schrap de corresponderende rijen, alsook alle termen (kolommen) die bevat zijn in de e.p.i. s. 2. Indien er nog kolommen overblijven, beschouw dan de resterende rijen. Schrap alle dubbele rijen die mochten ontstaan zijn door het schrappen van kolommen, alsook alle rijen die volledig bevat zijn in andere rijen. Schrap echter geen grotere priemimplicant ten voordele van een kleinere die hem volledig bedekt! Schrap ook alle dominerende kolommen, dit zijn kolommen die minstens overal een teken hebben waar een andere kolom er een heeft. Dit mag omdat de dominerende kolom (minterm) hoe dan ook geïncludeerd wordt wanneer de gedomineerde kolom dit wordt. 3. Na deze schrapoperatie kan het zijn dat er opnieuw kolommen ontstaan met slechts één merkteken (secundaire e.p.i. s). Zo ja, ga weer naar stap (1). Zo neen, ga naar stap (4). 4. Resteren er dan nog kolommen en rijen, dan is de tabel cyclisch. Kies arbitrair een rij, schrap ze en ga naar (1). Werk de oplossing volledig uit. Herbegin dan met de rij wel geïncludeerd in de som (dit wil zeggen, includeer de rij en schrap alle mintermen die ze bedekt). Kies uit beide alternatieven deze met de minimale kost. Een optimalisatie: Branch-and-Bound Noteer dat, wanneer men op een bepaalde plaats een keuze moet maken in stap 4, het meestal zo is dat men ook verderop nog gelijkaardige keuzen moet maken. Per keuze gaat het aantal te onderzoeken mogelijkheden met een factor 2 omhoog, wat leidt tot een exponentiële groei. Voor grote tabellen is er duidelijk nood aan veel effciënter methoden. Een meer efficiënte methode is de zg. branch-and-bound-optimalisatie van het zoekproces. Deze optimalisatie houdt twee verbeteringen in: in stap 4 kiest men niet zomaar een arbitraire rij, maar men gebruikt een heuristiek om de beste rij te kiezen. De beste rij is er een die wellicht in een optimale oplossing opgenomen zal worden. Een bruikbare heuristiek hiervoor is een rij te kiezen die veel eentjes heeft in kolommen waar andere rijen weinig eentjes hebben. (Noteer dat bij elke kolom er minstens twee eentjes moeten staan, anders was de rij (secundair) essentieel.) Men berekent aldus voor elke rij de som van de reciproque aantallen eentjes in die kolommen waar de rij een eentje heeft. De rij met het grootste resultaat is de beste rij; 95

100 Beschouw de functie f(v, w, x, y, z) = (1, 2, 5, 6, 7, 8, 9, 10, 13, 17, 18, 21, 22, 29) met als p.i. A = V X Y Z B = V W X Y C = V W X Z D = V W XZ E = V W XY F = V Y Z G = W Y Z H = W Y Z I = XY Z De eerste tabel levert als e.p.i. s G, H, I: A * * B * * C * * D * * E * * F * * * * G * * * * H * * * * I * * * * De tweede tabel heeft rijdominantie: C > A en E > D (gelijke kost). De secundaire e.p.i. s zijn E (of D) en C. Voor de realisatie van de resterende term 9 is F goedkoper dan B A * B * * C * * D * E * F * De minimale sommen zijn f = G + H + I + (E of D) + C + F. Figuur 4.3: Het vinden van een minimale som 96

101 alvorens men in stap 4 beide alternatieven induikt, probeert men na te gaan of het wel de moeite loont. Stel dat men al een oplossing gevonden heeft, en dat men nu op zoek is naar een betere oplossing. Wanneer echter in stap 4 blijkt dat de som van de kost van de gedeeltelijke oplossing die men op dat punt heeft (de reeds geselecteerde priemimplicanten) en de minimale kost om de resterende tabel te realiseren, hoger ligt dan deze van de eerder gevonden oplossing, dan moet men dit alternatief natuurlijk niet onderzoeken. Het komt er dus op aan een zo scherp mogelijke raming te hebben van de minimale kost om een tabel te realiseren. Hachtel ([Hachtel96]) beschrijft hiervoor de heuristiek MIS (Maximal Independent Set). Deze heuristiek is gebaseerd op de maximale deelverzameling van kolommen in de tabel die niet-overlappende patronen van eentjes hebben. Het is eenvoudig in te zien dat, als twee kolommen geen overlapping hebben in de patronen van hun eentjes, er twee verschillende rijen nodig zijn voor hun realisatie. Indien men op zoek gaat naar de grootst mogelijke deelverzameling van kolommen zonder overlapping, dan is dit een ondergrens op het aantal rijen dat men nodig zal hebben. Als men dan uit elke groep de goedkoopste rij kiest, heeft men een ondergrens op de kost. Beide technieken werden geïmplementeerd in de Maple-suite van de syllabus. Figuur D.9 toont de hoofdprocedure van de minimalisatielus, uitgebreid naar meervoudige functies. Naast de tabelmethode voor het vinden van een minimale som bestaat er ook een algebraïsche methode: de methode van de priemimplicantfuncties. Algoritme 4.5 [Petrick s algebraïsche methode voor de minimale som.] 1. Men schrijft een uitdrukking P, die het product is van evenveel factoren als er mintermen zijn in de functie. Elke factor is de som van de priemimplicanten die deze minterm bevatten. Voor het voorbeeld in fig. 4.2 vinden wij P = (B)(C + D)(B + C)(E + F )(B + E)(C + D + E + F )(B + C + E) (D)(D)(A + F )(F )(A). Men interpreteert P als een Boolese vorm. De vorm P is 1 wanneer alle factoren 1 zijn, d.w.z. wanneer elke minterm gedekt wordt door een minstens één p.i. 2. Wij kunnen deze uitdrukking als Boolese vorm uitwerken en vereenvoudigen: schrappen van dubbele factoren en factoren die andere volledig bevatten (kolomdominantie): P = (B)(F )(D)(A). 3. Wanneer er maar één term rest (zoals in het voorbeeld) dan is dit de minimale som. In het algemeen resteren er meerdere termen. Elke term stelt een niet-redundante som voor. Hieruit kunnen wij de minimale som vinden door exhaustief zoeken. Noteer dat deze methode in principe goed geschikt is voor computermanipulatie. Het probleem is echter de combinatorische explosie van de lengte van de vorm tijdens de uitwerking. Enig soelaas wordt gebracht door het feit dat deze functie unaat is (zie verder). 97

102 Uitbreidingen naar meervoudige functies. Tot nog toe hebben wij slechts enkelvoudige functies onderzocht: functies met één binaire uitgang. Vaak komt het echter voor dat wij meer dan één binaire functie van dezelfde inputs samen moeten realiseren. Dan kan het zijn dat twee sommen één of meer producttermen gemeenschappelijk hebben, wat uiteraard besparend werkt. Het is echter ook mogelijk dat de optimale verzameling van producttermen voor alle m functies samen niet bestaat uit de unie van de optimale sets van de functies, afzonderlijk geoptimaliseerd. Men kan de in secties en beschreven methoden uitbreiden tot het vinden van een globaal optimum. In het geval van de kaartmethode beschouwt men 2 m 1 kaarten, die de functies afzonderlijk, alle koppels, alle triplets, enz. voorstellen. De kaart van een verzameling functies draagt de mintermen en d.c. termen die in alle functies van de verzameling voorkomen. Men begint met de kaart die alle m functies samen beschrijft, en bepaalt de priemimplicanten. In de andere kaarten behandelt men de mintermen die reeds eerder gerealiseerd werden als d.c. termen. Men herhaalt deze stap voor de kaarten van lagere orde, tot alle mintermen gerealiseerd zijn, steeds met gebruik van de don t care termen om priemimplicanten van maximale grootte te verkrijgen. Men selecteert dan de globaal minimale verzamelingvan priemimplicanten voor het stel van m functies. Dit kan meestal op zicht, of met de tabelmethode die hieronder beschreven wordt. Ook de tabelmethode kan worden uitgebreid om gezamenlijke minimalisaties te doen. Daartoe merkt men de rijen (implicanten) van elke tabel met de verzameling van functies waartoe deze implicant behoort. Bij combinaties merkt men de nieuwe implicant met de doorsnede van de functieverzamelingen van de combinerende termen. Men merkt slechts een implicant aan als gebruikt in een combinatie wanneer de nieuwe implicant de hele functieverzameling van de aan te merken implicant bevat. Een implicant is dus een priemimplicant voor een deelverzameling van functies indien deze deelverzameling niet als geheel werd gebruikt in een combinatie. Een gezamenlijk minimale som kan dan met de volgende uitbreiding van algoritme 4.4 gevonden worden. Men brengt de kolommen aan voor alle functies. Een gegeven minterm kan dus meer dan eens optreden. Men zet merktekens op de rijen van de priemimplicanten, maar slechts op de gerealiseerde termen van deze functies waarvoor deze implicant priem is. Men selecteert dan een minimale som door eerst de e.p.i. s op te sporen. De termen gerealiseerd door een e.p.i. mogen slechts geschrapt worden in deze functies waarvoor de priemimplicant essentieel is. Nadien gebruikt men de gewone regels van rij- en kolomdominantie, secundaire e.p.i. s, enz. Noteer dat men, bij het bepalen van de kost van het gebruik van een priemimplicant, men moet rekenen met de incrementele kost: indien deze implicant essentieel is voor een andere functie bestaat hij reeds, en kost zijn gebruik in een andere functie louter één extra ingang aan de OF-poort van deze functie. Deze kost kan kleiner zijn dan het includeren van een nieuwe, maar grotere en dus meer geschikte priemimplicant. Voorbeeld 4.3 Meervoudige minimalisatie Beschouw de functies f 1 (x, y, z, w) = (1, 3, 4, 5) + DC(0) f 2 (x, y, z, w) = (4, 5, 7, 15). 98

103 Afzonderlijke minimalisatie leidt tot f 1 f 2 = X Z + X Y W = X Y Z + Y ZW met een kost van 4 OF-inputs, 11 EN-inputs, en 4 EN-poorten. In fig. 4.4 wordt de gezamenlijke minimalisatie getoond. De gezamenlijke priemimplicanten zijn met als minimale som A = X Y W (f 1 ) B = X Y Z (f 1, f 2 ) C = X Y W (f 2 ) D = Y W Z (f 2 ) E = X Z (f 1 ), f 1 = A + B = X Y W + X Y Z f 2 = B + D = X Y Z + Y ZW. De totale kost van deze realisatie is 4 OF-inputs, 9 EN-inputs en 3 EN-poorten. Deze kost is lager dan de kost van de afzonderlijke minimalisatie. De winst zit in het verschil tussen de incrementele kost voor f 1 van B (essentieel voor f 2 ), en de totale kost van E. De incrementele kost van B is één OF-input, terwijl de kost voor het gebruik van E neerkomt op één OF-input, één EN-poort, en 3 EN-inputs Topologische methoden De implicantenmethoden, zowel het vinden van de complete som, als het vinden van een minimale som, vereisen het expliciet neerschrijven van alle mintermen van de functie. Voor functies van een groot aantal variabelen (meer dan 20) kan dit leiden tot extreem grote ruimte- en rekentijdeisen. De technieken hieronder beschreven (en andere verwante methoden) vertonen dit euvel niet. Een aantal minimalisatiealgoritmen zijn hierop gebaseerd, en laten de behandeling toe van functies tot 30 variabelen (MINI: [Hong74], ESPRESSO: [Brayton84]). Deze methoden vertrekken van een kubuslijstrepresentatie van de functie, en maken gebruik van een veel ruimere klasse van operaties dan de Hamming-1 fusie van kubussen karakteristiek voor de Quine-McCluskey-methode. Laat ons derhalve eerst een aantal nuttige notaties vastleggen. De verzameling van alle (deel)kubussen van {0, 1} n noteren wij C ; de verzameling van alle deelverzamelingen van C noteren wij C. Elke Boolese functie f kan worden gespecificeerd als de som van een aantal deelkubussen van de n- kubus U n = {0, 1} n, die gezamenlijk precies alle mintermen van f bevatten. Wij noemen een dergelijke klasse van deelkubussen ON f C. Op gelijkaardige wijze kunnen wij de klassen DC f C en OFF f C definiëren, die respectievelijk de DON T CARE termen van f bevatten, en de punten (x 1,..., x n ) U n waarvoor f(x 1,..., x n ) = 0. Bewerkingen op kubuslijsten Bij de minimalisatie van Boolese functies moeten wij een aantal operaties kunnen uitvoeren op de representatie die op dat ogenblik beschikbaar is van de functie. Belangrijke operaties in dit verband zijn bijvoorbeeld de complementering (de berekening van een 99

104 Bepaling van de gezamenlijke priemimplicanten X Y Z W X Y Z W X Y Z W f 1 * f 1 * 0 0 f 1 E f 1 * f 1 * f 1 f 2 * f 1 A f 1 * f 1 * f 1 f 2 B f 1 f 2 * f 2 C f 2 * f 2 D f 2 * Bepaling van de minimale sommen f 1 f A * * B * * * * C * * D * * E * * * Figuur 4.4: Gezamenlijke minimalisatie van functies 100

105 representatie van OFF f uitgaande van ON f en DC f ), en het nagaan van de bedekking van een kubus door een verzameling kubussen. Net zoals wij in hoofdstuk 2 gezien hebben over het gebruik van BDD s, zullen wij ook hier de structuur van de manipulatie-algoritmen inspireren op de Shannonexpansie van de gemanipuleerde functie, maar ditmaal zullen wij deze expansie interpreteren in de context van kubusverzamelingen. Wij zullen ons hier beperken tot enkelvoudige functies. Kubusoperaties en de Shannonexpansie Wij hebben in hoofdstuk 2 al gezien hoe de binaire operatoren in F n en functiesamenstelling recursief kunnen gedefinieerd worden op basis van de Shannonexpansie. Wij zullen nu enkele bijkomende voorbeelden onder de loep nemen. Het bepalen van de residufuncties of cofactoren in een kubuslijst. De opgave is, gegeven een functie f(x 1,..., x n ), en een kubusrepresentatie ON f van deze functie, kubusrepresentaties te bepalen van de residufuncties f x i = f xi =0 en f xi = f xi =1. Eenvoudig nazicht leert ons dat de representatie van f x i gevonden wordt door alle kubussen uit ON f te nemen waarin op de i-de plaats een 0 of een staat, en op die plaats een te schrijven (toon dit aan). Wanneer men de decompositie verder zet op basis van andere variabelen, zal men de cofactor van f t.o.v. een kubus c kunnen vinden als de residufunctie die bij c hoort in de expansie op de variabelen aanwezig in c. Men kan de kubusrepresentatie van deze cofactor onmiddellijk vinden door alle kubussen te nemen uit ON f die compatibel zijn met c, in de zin dat geen enkele gekozen kubus een 1 bevat op een plaats waar c een 0 bevat, en omgekeerd. Op die plaatsen waar c een 0 of 1 heeft, wordt in de geselecteerde kubussen een geschreven. Voorbeeld 4.4 Shannondecompositie op kubusnotatie Neem weer de (volledig bepaalde) functie f(a, B, C, D) = AB + A C + B D + C D uit voorbeeld 3.2. Haar kubusrepresentatie is als volgt: f : Haar Shannonexpansie op A levert de volgende residufuncties 1 f A : 0 1 f A : terwijl de cofactor van de kubus BC = { 11 } gegeven wordt door { } 1 f BC : 0 101

106 Complementering De complementering laat zich recursief definiëren door Shannondecompositie als volgt: f (x 1,..., x n ) = (x 1f x 1 + x 1 f x1 ) = (x 1 + f x 1 )(x 1 + f x 1 ) = x 1 f x 1 + x 1f x 1 + f x 1 f x 1 = x 1 f x 1 + x 1f x 1 omdat de term f x 1 f x het optioneel product is van de twee vorige termen. Dit vertaalt 1 zich onmiddellijk naar kubusrepresentaties. De recursie stopt wanneer een kubus hoogstens één symbool 0 of 1 bevat: de kubus stelt dan een lettervorm voor, die onmiddellijk gecomplementeerd kan worden. De vermenigvuldiging in bv. x 1 f x 1 wordt uitgevoerd door het symbool 1 te schrijven op plaats 1 in alle kubussen van f x 1, en de optelling + kan in het meest eenvoudige geval gerealiseerd worden door een unie. Het is echter beter na te gaan of er geen optimalisaties mogelijk zijn, zoals het verwijderen van dubbels, het verwijderen van kleinere deelkubussen ten voordele van de grotere, en het combineren van deelkubussen die op hamming-afstand 1 liggen. Deze optimalisaties mogen overigens overal toegepast worden, ook in de berekening van de cofactoren. Voorbeeld 4.5 Complementering via Shannondecompositie Wij berekenen de representatie van het complement van de functie uit voorbeeld 4.4. f = A A = AB { } + AB { 1 } { } { 1 1 +A B + A B = AB { } + AB { 1 } +A BC { } + A BC { 1 } +A B C { } + A B C { 1 } = AB { 0 } + A BC { 0 } +A B C { 0 } = AB { 0 } +A B { 0 0 } + A B { 0 0 } = A { 0 0 } { } A = A { 0 0 } + A { 0 0 } { } = } Tautologietest Zoals besproken in hoofdstuk 2, bedoelen wij met een tautologie de functie 1, en de tautologietest wil uitmaken of een gegeven kubuslijst deze functie voorstelt. Dit is een veel voorkomende operatie, en wel om de volgende reden. Dikwijls moet 102

107 men de bedekking van een kubus c door een kubusverzameling C nagaan. Dit gebeurt o.m. bij het opsporen van redundante kubussen in een kubuslijst. Men moet dus nagaan of f c f C. Opdat dit het geval zou zijn, moet f C = f c + g waarin g een willekeurige functie is. Hieruit volgt dat de cofactor van c in de Shannonexpansie van f C, de functie 1 moet zijn, de tautologie dus. Bijgevolg zal men de gevraagde bedekking nagaan door een tautologietest op de berekende cofactor. Zoals alle andere operaties die wij tegengekomen zijn, laat ook de tautologietest zich recursief uitdrukken door middel van de Shannonexpansie. Immers, f is een tautologie a.s.a. f x1 en f x 1 beide tautologieën zijn (bewijs dit). Unate functies Diverse technieken bestaan om de basistest voor tautologie te versnellen. Eén ervan is gesteund op het unaat zijn van de functie. Definitie 4.6 Een functie is unaat in een variabele x, wanneer de functie monotoon is in dezelfde zin in die variabele, voor alle mogelijk waarden van de andere variabelen. Definitie 4.7 Een functie is unaat wanneer zij unaat is in al haar variabelen. Unate functies hebben een aantal zeer interessante eigenschappen, die kunnen leiden tot sterke versnellingen van diverse algoritmen. Unaatheid kan men op een aantal manieren detecteren. Zo is het bijvoorbeeld voldoende dat in een Boolese som-van-produktenvorm, een variabele alleen gecomplementeerd of niet-gecomplementeerd voorkomt. Als in een kubuslijst er geen kubussen voorkomen met op een gegeven plaats (variabele) zowel een 0 als een 1, dan is de voorgestelde functie unaat in die variabele. In de matrixvoorstelling betekent dit dat in de kolom die overeenkomt met die variabele, enkel 1 of enkel 0 kan voorkomen, eventueel samen met, maar niet 1 en 0 samen. Weze f unaat in x 1 (stijgend). De Shannonexpansie van f ziet er dan uit als volgt (bewijs dit uit de definitie): f(x 1,..., x n ) = x 1 f x1 + f x 1 De complementering van unate functies kan hierdoor wat versneld worden. Het unaat zijn van een functie versnelt echter de tautologietest op kubuslijsten zeer sterk, en dit wegens de volgende stelling: Stelling 4.4 Een unate kubuslijst stelt een tautologie voor a.s.a. één van de kubussen gelijk is aan { }. Bewijs. De aanwezigheid van de kubus { } is zeker een voldoende voorwaarde voor tautologie. Laat ons dus de noodzaak bewijzen. Veronderstel het tegendeel. Dan bezit elke kubus tenminste één 1 of 0. Aangezien de lijst unaat is, zal op deze plaatsen in de andere kubussen ofwel hetzelfde symbool optreden, ofwel. Men kan dus de variabelen zo kiezen dat geen van de kubussen tot 1 evalueert. De hele functie evalueert dan tot 0, en is dus geen tautologie. 103

108 Het tautologisch zijn van een unate lijst kan dus zonder verdere recursiestappen vastgesteld worden. Andere speciale gevallen zijn bv. wanneer in alle kubussen op dezelfde plaats hetzelfde symbool 0 of 1 staat, dan is de functie zeker geen tautologie. Of nog, stel dat wij de kubuslijst (als matrix) kunnen schrijven als f : A 1 T... T T A 2... T... T T... A n waarin T een matrix met allemaal. De functie f is een tautologie a.s.a. minstens één van de A i een tautologie is (bewijs als oefening)., De complete som uit een kubuslijst Eén van de nadelen van de Quine-McCluskeymethode is dat er gestart wordt vanuit de lijst van mintermen, en dat, op de optimalisering door sortering na, geen reductie plaats grijpt in het aantal combinaties dat men moet uitvoeren. Het blijkt bv. dat éénzelfde implicant op meerdere manieren geproduceerd wordt, wat zeker niet erg efficiënt is. Wij zullen nu een methode uiteenzetten, ESPRESSO EXACT, die op een totaal andere manier de complete som zal bepalen, uitgaande van een kubuslijst. In een eerste stap bepalen wij de OFF-set van de functie: men complementeert ON DC, met behulp van het complementeringsalgoritme dat wij hierboven beschreven hebben. Dan beschouwen wij de lijst van kubussen in OFF. Elke term uit de complete som moet disjunct zijn met elk van deze kubussen. Daarvoor moet elke priemimplicant op minstens één plaats incompatibel zijn met elke kubus uit het complement. Wij drukken deze voorwaarde uit als een Boolese vorm, op een manier die gelijkt op de algebraïsche methode voor het vinden van een minimale som. Geef de variabele c 0 i de volgende betekenis: c 0 i = 1 a.s.a. een 0 op plaats i in de priemimplicant deze disjunct maakt van een kubus uit het complement. De variabelen c 1 i krijgen een gelijkaardige definitie. Kies nu een kubus c uit het complement, die bv. een 0 heeft op plaats i, en een 1 op plaats k. Een product (kubus) is disjunct met c als hij op plaats i een 1 heeft, en/of op plaats k een 0, dus als c 1 i + c0 k = 1. Een implicant van f moet disjunct zijn van alle kubussen in het complement van f, en dus vinden wij een uitdrukking P = (c i k 11 k c i k n1 k n1 ) (c i k 1m k 1m + + c i knm k nm ) die een product is van evenveel factoren als er kubussen voorkomen in de lijst van het complement. Wanneer P evalueert tot 1, zijn alle factoren gelijk aan 1, en zijn dus alle kubussen disjunct van het complement. Wanneer wij de vorm voor P uitwerken en vereenvoudigen, krijgen wij een som van producten. Elk product uit deze som stelt een priemimplicant voor. Noteer dat, bij de vereenvoudiging, wij moeten stellen dat c 1 i c0 i = 0. (Een gegeven plaats kan niet zowel een 1 als een 0 bevatten.) Men zou hier kunnen opwerpen dat wij een minimalisatie vervangen door een andere, misschien met zelfs meer variabelen, en dat wij dus niets gewonnen hebben. Dit is echter niet correct: de winst zit hem voornamelijk in het feit dat P een unate functie is (geen variabele komt gecomplementeerd voor). Hiervan is de minimalisatie veel eenvoudiger (zie oefeningen). 104

109 Voorbeeld 4.6 De complete som met de kubusrepresentatie Wij beschouwen weer de functie uit voorbeeld 4.5. Haar complement werd al afgeleid: Hieruit halen wij onze uitdrukking P : Dit stelt de complete som van f voor: f : { P = (c c c 1 4)(c c c 1 4) = c 1 1c c 1 1c c 0 1c c 1 2c c 1 2c 1 4 +c 0 1c c 1 3c c 1 4 } = c 1 1c c 0 1c c 1 2c c 1 4 f : De kruisoperatie Wij zullen nu een alternatieve methode bespreken om de complete som af te leiden uit een kubuslijst, zonder via de mintermen om te gaan. Dit gebeurt door de definitie van twee nieuwe operatoren op kubuslijsten. De eerste operator is een soort van kubusverschil van deelkubussen a en b. Dit verschil is een stel deelkubussen dat alle mintermen in a bevat, maar niet deze in b. Het gelijkt op het verschil tussen twee verzamelingen, maar verschilt ervan in de concrete representatie. Immers, een deelkubus waaruit door een andere deelkubus een stuk werd weggesneden is niet noodzakelijk nog een kubus; het verschil kan echter wel bedekt worden met een aantal deelkubussen. De bedoeling is deze bedekking te doen met zo groot mogelijke kubussen. De kruisoperatie 3 formaliseert de aftrekking van deelkubussen, en wordt door de volgende definities vastgelegd. Weze a = (a 1 a 2... a n ) en b = (b 1 b 2... b n ) twee deelkubussen in ternaire voorstelling (a i, b i {0, 1, }). Definitie 4.8 De kruisoperatie a i b i op de coördinaten van een deelkubus is een functie gedefinieerd door de operatietabel : {0, 1, } 2 {0, 1,, } a i b i Engels: sharp. 105

110 Definitie 4.9 De kruisoperatie a b tussen twee deelkubussen a, b C is een functie gedefinieerd als volgt: : C 2 C, {a}, indien a i b i = voor minstens één waarde van i, a b = {}, indien a i b i = a i voor alle i, {a 1,..., a i 1, a i b i, a i+1,..., a n : a i b i a i }, anders. Definitie 4.9 zegt dan het volgende: a b = {a} indien a en b disjunct zijn (minstens één van de coördinaten is incompatibel) ; a b is ledig indien a b, wat enkel kan indien a i b i i. In alle andere gevallen is a b een collectie van deelkubussen, één voor elke coördinaat waar a i = en b i, waarin a i dan vervangen wordt door b i. Wanneer men de betekenis van de kruisoperatie nagaat in een Karnaughkaart, dan ziet men dat een kubusbedekking van het verschil gegenereerd wordt met blokken van maximale grootte. Voorbeeld. Drie voorbeelden illustreren de bovenstaande definities. a i 0 1 b i 1 1 a i b i a i 0 b i 1 0 a i b i a i b i a i b i a b = {010} a b = { } a b = Een tweede binaire operatie op C is de kubus-unie A B van twee verzamelingen A, B deelkubussen. Deze operatie genereert een stel deelkubussen van maximale grootte (cfr. priemimplicanten) die alle mintermen in A en B bedekken. Definitie 4.10 De kubus-unie is een functie : C 2 C, zodat A B een stel deelkubussen van maximale grootte bevat die precies de mintermen in A B bedekken. De effectieve berekening van kan gebeuren met de combinatieregels uit het Quine- McCluskey algoritme. Bijvoorbeeld, men zal nagaan of er geen kubussen zijn die volledig bevat liggen in andere kubussen, en of er geen Hamming-1 fusies mogelijk zijn tussen kubussen. Gewapend met deze definitie kunnen wij nu uitbreiden tot verzamelingen van deelkubussen (C). Weze A = {a 1, a 2,..., a m } en B = {b 1, b 2,..., b n } ; a i, b i C. 106

111 Definitie 4.11 De uitbreiding van tot C is als volgt: A {b} = (a 1 b) (a 2 b) (a 3 b) {a} B = (((a b 1 ) b 2 ) b 3 ) A B = ({a 1 } B) ({a 2 } B) Laat ons nu de minimalisatie van een Boolese functie f met deze methode aanvangen. De volgende relaties zijn waar: U n = ON f OFF f DC f = { } ON f = U n (OFF f DC f ) OFF f = U n (ON f DC f ) DC f = U n (ON f OFF f ) Hier nemen wij de gewone setoperaties en, en beschouwen wij de betrokken verzamelingen als mintermverzamelingen. Men kan nu door de operaties en te gebruiken hetzelfde stel mintermen berekenen, maar met een veel compactere bedekking. Voorbeeld. Beschouw de functie f(x, y, z) = X Y + Y Z. Een representatie van ON f volgt onmiddellijk uit een SVP-representatie van f. { } 01 ON f = 11 Daar er geen don t care termen zijn, vinden wij een compacte representatie van OFF f als volgt: { } 01 OF F f = { } 11 = { ({ } {01 }) { 11} } 1 = { 11} 0 = { ({1 } { 11}) } ({ 0 } { 11}) { } 10 0 = { 0 } = De laatste gelijkheid volgt omdat Zoals reeds gezegd heeft de berekening van de -operatie een compacterende invloed: in de uitdrukking {a} B moet B niet noodzakelijk een minimale som, noch een priemimplicantensom zijn. Het verschil {a} B zal echter wel bestaan uit maximale deelkubussen. Dit leidt tot de volgende stelling. Stelling 4.5 De priemimplicanten van een functie f worden gegeven door PI f = U n (U n (ON f DC f )). Bewijs. Het bewijs wordt gegeven in [Dietmeyer71]. Merk op dat in de uitdrukking voor PI f nergens gebruik gemaakt wordt van de verzamelingvan mintermen van f. De verzamelingen ON f en DC f kunnen willekeurige stellen deelkubussen zijn (d.i. niet noodzakelijk priem of minimaal). 107

112 Uit de verzameling PI f moeten wij nog een minimale som afleiden. Men kan hiervoor natuurlijk de methoden uit sectie 3.2 gebruiken, maar deze gebruiken de verzamelingvan mintermen van f, en bieden dus eigenlijk geen oplossing. Wij kunnen echter ook rechtstreeks werken met PI f. Noteer daartoe PI f = {p 1, p 2,..., p n }, en noteer de lijst van de priemimplicanten waaruit één implicant c verwijderd werd als PI f \ {c}. Lemma 4.1 p i is een essentiële p.i. als en slechts als A i = ({p i } (PI f \ {p i })) DC f. Bewijs. A i bevat alle termen die wel door p i, maar niet door de overige priemimplicanten van f worden bedekt, en die ook geen don t care termen zijn; p i is essentieel indien er zulke termen bestaan. Noteer dat dit een variant is op de bedekking van een kubus door een kubuslijst, en dus voor een tautologietest. Zoals men weet, bevat elke minimale som minstens alle essentiële priemimplicanten (stelling 4.3). Een niet-redundante som is niet noodzakelijk minimaal, maar verschilt meestal maar weinig van de optimale oplossing. Het volgende algoritme maakt het mogelijk niet-redundante sommen te genereren vanuit PI f, zonder de lijst van mintermen te moeten genereren. Algoritme 4.6 (Bepalen van een niet-redundante som) 1. Bereken de verzameling PI f zoals aangegeven in stelling 4.5; 2. Voor elke p i (a) Bereken A i = ({p i } (PI f \ {p i })) DC f (b) Indien A i =, zet PI f PI f \ {p i } ; Dit algoritme zal dus geen enkele e.p.i. weglaten, maar wel een aantal redundante p.i. s. De resulterende PI f is niet-redundant, en wijkt meestal weinig af van een minimale som. De resultaten kunnen echter wel sterk afhangen van de volgorde waarin men de PI f doorloopt. Bovenstaand algoritme kan uitgebreid worden tot meervoudige functies. Een verbeterde methode voor het vinden van een minimale som De tabelmethode voor het bepalen van een minimale som, zoals wij ze gezien hebben in paragraaf 4.1.2, vereist dat wij een tabel opzetten met evenveel kolommen als er mintermen zijn, en evenveel rijen als priemimplicanten zijn. Elk van deze lijsten kan zeer lang worden 2 n resp. 3 n /n elementen); de tabel zelf is nog veel groter. Men heeft dus behoefte aan een methode die ons in staat stelt de ruimte-eisen van deze methode gevoelig te verlagen, zonder dat dit ons leidt tot sub-optimale resultaten zoals in paragraaf Men kan vooreerst de complete som opsplitsen in drie deelverzamelingen: de essentiële priemimplicanten, de partieel redundante priemimplicanten, en de totaal redundante 108

113 priemimplicanten. De eerste klasse hebben wij al verschillende keren ontmoet, en kunnen wij detecteren met de methode uit paragraaf 4.1.3, of nog door de test c (PI f \ {c}) DC f die nagaat of een priemimplicant c bedekt wordt door (PI f \{c}) DC f. Deze test herleidt zich tot een tautologietest van de cofactor van c in (PI f \{c}) DC f. Wanneer dit het geval is, wordt elke minterm van c ofwel gerealiseerd door minstens één van de andere p.i. s in PI f \ {c}, ofwel door DC f, en kan c dus niet essentieel zijn; in het andere geval is c essentieel. Wij zullen de e.p.i. s voorstellen door de kubuslijst EPI f. De totaal redundante p.i. s TRI f bevatten enkel mintermen die ofwel reeds bedekt worden door EPI f, ofwel door DC f. Deze termen hoeft men dus niet (nogmaals) te realiseren. Een p.i. c is totaal redundant als hij niet behoort tot EPI f en als c EPI f DC f. Noteer dat een priemimplicant die als enige een dont t care-term bedekt, en voorts enkel don t care-termen, niet zal geselecteerd worden als essentieel, maar wel als totaal redundant (ga dit na). Ook deze test kan men uitvoeren als een tautologietest. De partieel redundante p.i. s PRI f zijn de overblijvende p.i. s. Het is uit deze verzameling dat wij een deelverzameling met minimale kost willen identificeren, die samen met EPI f de functie realiseert. Wij zullen dit doen door een tabel op te stellen die goed lijkt op de secundaire tabel in figuur 4.3, maar waarin de resterende mintermen in principe zelfs gegroepeerd kunnen voorkomen. Een dergelijke tabel is kleiner dan de originele tabel, en vereist niet dat wij alle mintermen enumereren. De methode gaat als volgt. Weze c PRI f. Dan weten wij dat c EPI f (PRI f \ {c}) TRI f, immers, ware dit niet zo dan zou c essentieel geweest zijn. De recursieve tautologietest die de bovenstaande bedekking nagaat moet dus succesvol aflopen. Nu kan men in deze test nagaan welke voorwaarden moeten voldaan zijn opdat c gerealiseerd zou worden, d.w.z. opdat alle mintermen van c aanwezig zouden zijn. Dit kan op de eerste plaats uiteraard door c zelf te includeren, maar het kan ook door een aantal andere PI s op te nemen. Men vindt deze door te kijken naar welke termen aanwezig zijn in de cofactor van c in de bovenstaande bedekkingstest. Uit deze termen, die samen de tautologie moeten vormen, kan men afleiden welke mintermen of verzamelingen van mintermen moeten gerealiseerd worden opdat alle termen van c bedekt zouden worden. Men loopt alle elementen van PRI f af, en verzamelt alle verschillende dergelijke voorwaarden. Deze voorwaarden (te realiseren mintermen of kubussen van mintermen) vormen dan de kolommen van een nieuwe, compactere bedekkingstabel. Wij illustreren dit onmiddellijk met de functie uit figuur 4.3. Wij vinden (volgorde van de variabelen vwxyz): EPI f = (G) (H) (I) PRI f = (A) (B) (C) (D) (E) (F )

114 In dit particulier voorbeeld is TRI f leeg. Wanneer wij nu de bedekking nagaan van term A, bijvoorbeeld, dan bepalen wij eerst de cofactor f A van A in EPI f (PRI f \ {c}): f A = { 0 (H) 1 (C) } = w { (H) } { + w (C) Wij zien dus inderdaad dat f A een tautologie is. Daarvoor volstaat het dat de mintermen A w = {00010} en A w = {01010} aanwezig zijn, en dit is het geval wanneer ofwel A zelf, ofwel H en C aanwezig zijn in de som. Nu weten wij dat H essentieel is, en dus steeds aanwezig moet zijn; de enige overblijvende voorwaarde is dus dat ofwel A zelf, ofwel C aanwezig is om de minterm A w = {01010} te bedekken. Men brengt deze minterm aan in de eerste kolom van een matrix, waarin de rijen gevormd worden door de elementen van PRI f, A t.e.m. F, en men stipt in die kolom de rijen aan die deze kolom realiseren. Men gaat dan verder men de volgende elementen van PRI f. Wij vinden f B = { 0 (C) 1 (F ) = z { (C) } } { + z (F ) Dit levert een voorwaarde op voor de realisatie van mintermen Bz = {01000} en Bz = {01001}, wat kan door ofwel B ofwel C en F te includeren. Men creëert een kolom voor Bz = {01000}, en stipt hierin B en C aan, en een kolom voor Bz = {01001}, en stipt hierin B en F aan. Voor C krijgen we: { } 1 (A) f C = 0 (B) { } { = y (A) + y (B) De voorwaarden voor de realisatie van zowel A als B werden reeds geïncludeerd in de tabel; wij krijgen dus geen bijkomende voorwaarden. Wanneer men op deze manier alle elementen van PRI f onderzoekt, krijgt men de gereduceerde tabel van figuur 4.3 terug. Hier zijn toevallig alle kolommen nog individuele mintermen; in het algemeen geval krijgt men hier echter deelkubussen van p.i s, wat de tabel verder compacteert. Steeds blijft de opdracht alle kolommen te realiseren door een optimale keuze van de rijen. } } } Heuristische Minimalisatie: ESPRESSO Er zijn in de loop van de recente 20 jaar een aantal heuristische technieken ontwikkeld die de behandeling van functies met veel meer variabelen mogelijk maken: functies van tot honderden variabelen, en met tot mintermen. Deze algoritmen garanderen uiteraard geen optimale oplossing meer, maar zij produceren resultaten die heel vaak weinig afwijken van het optimum. Een van de bekendste heuristische algoritmen is ESPRESSO [Brayton84] dat wij nu in wat meer detail gaan analyseren. Wij zullen enkel de concepten bespreken die aan de 110

115 basis liggen van het ESPRESSO-algoritme, en niet ingaan op details van de implementatie, noch op verfijningen van het algoritme. De gedetailleerde beschrijving van ESPRES- SO neemt ongeveer 150 pagina s in beslag, en valt dus duidelijk buiten het bestek van deze cursus. Lezers die het algoritme in meer detail wensen te bestuderen dan beschreven in deze cursus worden met aandrang verwezen naar het boek van Brayton et al. [Brayton84]. ESPRESSO omzeilt de moeilijkheden die optimale algoritmen zoals dat van Quine- McCluskey kenmerken: de noodzaak om de functies op te geven onder mintermgedaante, en het feit dat men via de complete som om moet. Het aantal mintermen van zelfs een triviale functie kan oplopen tot 2 n, en zoals gezegd, kan de complete som een kardinaliteit hebben tot 3 n /n. Het algoritme verloopt iteratief, en bestaat uit een zevental stappen die wij nu bespreken. Stap 1. Opgave van de functies Men begint met een opgave van de te minimaliseren functie(s) onder de vorm van ternair genoteerde kubuslijsten. Men beschrijft afzonderlijk de ON-set S en de DON T CARE-set D. Wij illustreren de functierepresentatie met twee voorbeelden. Het eerste voorbeeld is een enkelvoudige functie. Men geeft de ON-set en de DC-set op door middel van ternair genoteerde kubussen. Voorbeeld 4.7 [Enkelvoudige functie] Een enkele functie f(x, y, z, w) van 4 variabelen kan gerepresenteerd worden als S f = 01 1 (4.1) D f = { 11 1 } (4.2) Het tweede voorbeeld is meer realistisch en gaat over meervoudige functies. De ternaire specificatie bestaat weer uit de ON- en DC-sets, maar deze keer bevatten de representaties ook een outputgedeelte: de opgave van de verzameling functies waartoe een gegeven kubus behoort. Beschouw als voorbeeld de representatie van de toestands- en outputfuncties van de subroutinemachine uit figuur Alvorens wij de Boolese functies kunnen neerschrijven moeten wij eerst de inputs, toestand en outputs binair encoderen. Voorbeeld 4.8 [Meervoudige functies] Er zijn twee inputs I en e, die aangeven of de hoofdmachine zich in toestand I resp. e bevindt. Er zijn 5 toestanden, die gerepresenteerd kunnen worden door middel van drie bits x, y, z. De hoofdmachine moet eenvoudig kunnen observeren of de subroutinemachine zich in toestand 3 bevindt; wij nemen daarom de toestandsassignatie als l = (000), 0 = (001), 1 = (010), 2 = (011) en 3 = (100). De variabele x indiceert dan de aanwezigheid in toestand 3. De machine heeft drie outputlijnen: twee naar de schuifregisters, en één naar de overdrachtsflipflop. Voor de schuifregisters encoderen wij de commando s in twee 111

116 Inputposities Outputposities I e x y z X Y Z SH1 SH2 C Figuur 4.5: Opgave van de ON-set en de DON T CARE-set van de functies nodig voor de realisatie van de subroutinemachine uit het voorbeeld uit figuur 7.16 bits SH1, SH2 als volgt: H = (00), S = (10), L = (01). De overdracht wordt gecontroleerd door het bit C1, met als encodering C = 0 en L = 1. Met de bovenstaande assignaties kan men nu de functies concreet representeren. Figuur 4.5 toont het resultaat. De variabelen I, e, x, y, z zijn de inputs; er moeten 6 functies X, Y, Z, SH1, SH2, en C1 berekend worden; deze vormen de outputposities van de implicanten. De eerste 6 regels uit de tabel geven de gezamenlijke ON-set van de functies op, de laatste twee regels de DON T CARE-set. Hoewel ESPRESSO specifiek uitgedacht werd om meervoudige minimalisatie te doen (van functies zoals opgegeven in voorbeeld 4.8), zullen wij voor de eenvoud de overige stappen waar mogelijk illustreren met de enkelvoudige functie uit voorbeeld 4.7 Stap 2. De expansiefase De bedoeling van ESPRESSO is een bedekking te realiseren van de functie(s) met een zo klein mogelijk aantal priemimplicanten. Bij het begin weet men niet of de opgegeven implicanten priem zijn, noch of er uit de opgegeven lijst kunnen weggelaten worden. Men zal de opgegeven implicanten één voor één laten groeien tot zij hun maximaal toelaatbare afmeting bereikt hebben. Het laten groeien van een implicant gebeurt door het vervangen van een 1 of een 0 door een in één of meerdere inputposities, of een 0 naar een 1 in een outputpositie. Implicanten mogen groeien zolang zij enkel punten in S of D bedekken; van zodra een punt in de OFF-set R bedekt wordt realiseren wij niet langer de gewenste functie(s). Implicanten kunnen vaak in diverse richtingen groeien, en de maximale afmeting die zij kunnen aannemen hangt uiteraard af van de groeirichting. ESPRESSO maakt gebruik van een heuristische regel, die de beste keuze maakt voor de groeirichting. Men zal namelijk proberen zoveel mogelijk implicanten uit de opgegeven lijst te bedekken door het vergroten van een gegeven implicant. De bedekte implicanten kunnen dan verwijderd worden. Dit reduceert uiteraard het aantal termen in de som. Om snel te testen of een implicant na uitbreiding nog implicant blijft, berekent men een representatie van R uit S en D. Bij het vergroten van een implicant i tot i zal men testen of i R =. Deze test kan gebeuren door de doorsnede van de implicant te bepalen met elk element van R. Elk van deze doorsneden moet leeg zijn. Twee kubussen zijn disjunct wanneer zij minstens in één inputpositie conflicteren, d.w.z., wanneer de ene kubus een 0 heeft op die positie, en de andere een 1. Men kan deze definitie uitbreiden om ook de outputgedeelten in beschouwing te nemen. 112

117 De OFF-set van onze functie is R = In ons voorbeeld kan men de initiële implicanten (inclusief deze in D) laten groeien tot F = Men ziet dat elk van deze implicanten nog steeds disjunct is met R. Men ziet tevens dat er maar 5 implicanten meer over zijn, en dat geen implicant nog kan groeien. De expansie van 01 1 tot 1 1 heeft de DON T CARE-implicant 11 1 volledig bedekt; deze laatste kon dus weggelaten worden. Stap 3. Extractie van essentiële priemimplicanten Na de eerste expansiestap verkrijgen wij dus een bedekking F van de functie, die waarschijnlijk minder, maar zeker niet meer, kubussen bevat dan in de originele opgave, en die bovendien alle priemimplicanten zijn. Wij weten echter niet of deze som niet-redundant is, laat staan minimaal. Wel weten wij dat deze som alle essentiële priemimplicanten moet bevatten. Dit komt doordat alle EPI s moeten voorkomen in elke priembedekking van de functie. Wanneer wij de EPI s uit de implicantenlijst verwijderen, en tevens alle termen van f die zij bedekken verder beschouwen als DON T CARE-termen, moeten wij ons verder slechts bekommeren om de lijst van overblijvende niet-essentiële priemimplicanten. Uit deze lijst wensen wij een zo klein mogelijk niet-redundant stel over te houden dat de nog niet bedekte termen bedekt. Het komt er dus eerst op aan alle EPI s te vinden in de verkregen lijst. Een priemimplicant is per definitie essentieel als hij als enige van alle priemimplicanten, één of meerdere termen uit de ON-set van de functie bedekt. Ogenschijnlijk hebben wij dus de complete som nodig om uit te maken of een priemimplicant essentieel is. Het blijkt echter dat dit niet zo is, wanneer men gebruik maakt van het begrip consensus. Definitie 4.12 De consensus van twee kubussen die geen variabele bevatten in verschillende polariteit is het product van die kubussen; bevatten zij wel minstens één variabele in verschillende polariteit, dan is de consensus hun optioneel product. De consensus van een kubus en een lijst van kubussen is de lijst van consensuswaarden van de kubus met de elementen uit de lijst. Brayton et al. [Brayton84] bewijzen dat een priemimplicant c i uit een priembedekking F essentieel is, wanneer F i = (F D {c i }) c i de termen van c i niet volledig bedekt. In het geval van ons voorbeeld vinden wij voor c 1 : F 1 = (F D {c 1 }) c 1 (4.3) 113

118 = = (4.4) (4.5) Hierbij hebben wij gebruik gemaakt van de definitie van consensus: = z w y w = z y = yw y w = = xy w y w = xy w = x zw y w = x y zw De resulterende lijst F 1 bedekt c 1 volledig; c 1 is dus niet essentieel. Men kan nagaan dat ook de andere implicanten niet essentieel zijn. Stap 4. Niet-redundante som Wanneer wij, zoals gezegd, de EPI s verwijderen uit F en de mintermen die zij bedekken voorts behandelen als DON T CARE-termen, houden wij nog een lijst L van priemimplicanten over; in ons voorbeeld is dit de gehele lijst. In deze lijst kan men vooreerst de relatief essentiële implicanten L e identificeren. Een implicant is relatief essentieel wanneer hij niet mag verwijderd worden uit L zonder dat men ophoudt de functie te realiseren. Men realiseert niet langer de functie wanneer L {c i } niet alle te realiseren mintermen bedekt. Men moet dus alle relatief essentiële implicanten L e met betrekking tot L bewaren. Noteer dat relatief essentieel niet hetzelfde is als essentieel (essentieel wordt immers gedefinieerd m.b.t de complete som)! In het voorbeeld realiseert de implicant 10 als enige het punt 1011; het punt 0000 wordt alleen bedekt door 0 0. In feite zijn alle implicanten in het voorbeeld relatief essentieel en moeten zij behouden blijven. In de overige implicanten kan men nog twee andere klassen onderscheiden die wij al eerder tegenkwamen: totaal redundante L t en partieel redundante L p implicanten. De totaal redundante implicanten bedekken enkel DON T CARE-termen (in de uitgebreide set) of termen die reeds bedekt worden door L e. Deze implicanten mogen onmiddellijk weggelaten worden, aangezien alle vereiste termen toch zullen bedekt worden door de weggelaten EPI s en de implicanten in L e. De partieel redundante implicanten L p bedekken ook andere mintermen, en mogen dus niet alle zomaar weggelaten worden. Evenwel is het zo dat steeds minstens één implicant uit L p mag weggelaten worden zonder dat dit de realisatie van de functie in gevaar brengt. Dit is zo omdat geen enkele implicant in L p relatief essentieel is. In ons voorbeeld zijn er geen totaal of partieel redundante implicanten; wij vinden dus L e =

119 L p = { } L t = { } Het doel nu is de verzameling van overblijvende partieel redundante implicanten L p te reduceren tot een zo klein mogelijke kardinaliteit, door er zoveel mogelijk elementen uit weg te laten. Men kan dit op diverse manieren doen. Een implicant kan weggelaten worden wanneer de enige termen die niet door andere, nog aanwezige implicanten, bedekt worden DON T CARE-termen zijn of termen bedekt door de relatief essentiële implicanten. Men kan sequentieel implicanten proberen weg te laten op deze manier, tot wanneer men geen enkele verdere implicant nog mag weglaten zonder de functie niet langer te realiseren. Op dat ogenblik is de resulterende verzameling niet-redundant geworden. Het is duidelijk dat de volgorde waarin men implicanten wil weglaten grote invloed kan hebben op de kwaliteit van het eindresultaat. Brayton et al. beschrijven een verfijnd algoritme om een zo klein mogelijke verzameling over te houden uit L p. Zoals gezegd valt de beschrijving van dit algoritme echter buiten het bestek van deze tekst. Stap 5. Reductie De niet-redundante priembedekking L die wij tot nog toe verkregen hebben is niet noodzakelijk een globaal optimum. Het is wel een lokaal optimum met betrekking tot de gebruikte heuristieken. Wij zullen nu proberen de stappen 2 t.e.m. 4 herhaaldelijk uit te voeren, in de hoop dat wij op deze manier nog kubussen kunnen verwijderen uit L. Daartoe is het uiteraard nodig terug over te gaan tot een niet-priembedekking, anders zou de expansiestap niets kunnen doen. Men gaat dus de implicanten in L terug verkleinen tot hun kleinst mogelijke afmetingen die de realisatie van de functie niet doorbreekt. Een kubus c i kan gereduceerd worden tot c i c i op voorwaarde dat c i alle termen bevat van c i die geen DON T CARE-termen zijn en ook niet bedekt worden door L p {c i }. Men zal de kubussen in L p dan één voor één reduceren, en na elke reductie c i vervangen door c i in L p. Op het einde van deze fase krijgt men nog steeds een bedekking van de functie, maar niet noodzakelijk meer een met priemimplicanten. Het resultaat van de reductiestap hangt uiteraard van de volgorde af waarin wij L p reduceren. De reductiestap maakt het weer mogelijk om de expansie uit te voeren, waarbij de kans nu gestegen is dat expansie volgens andere richtingen gebeurt, en waarbij dus opnieuw (kleine) kubussen uit de lijst bedekt en geabsorbeerd kunnen worden. Men zal derhalve stappen itereren zolang de kardinaliteit van de bedekking daalt. In ons voorbeeldje ziet men dat, wanneer wij reduceren in de volgorde waarin de implicanten opgegeven werden, wij verkrijgen Wanneer wij de expansie opnieuw proberen, volgens dalende afmetingen van de (gere- 115

120 duceerde) implicanten krijgen wij: dit wegens bedekking van 0001 door 00. Wij hebben dus de kardinaliteit met één gereduceerd. Verdere iteraties brengen niets op. Stap 6. Laatste reductiepoging Deze stap poogt nieuwe priemimplicanten te genereren die tot nu toe nog niet opgenomen werden in L. Dit gebeurt door een gewijzigde reductiestap. In plaats van de implicanten achtereenvolgens te reduceren en rekening te houden met het feit dat er al termen gereduceerd zijn zoals in stap 5, gaat men nu alle implicanten reduceren t.o.v. de originele lijst L. De lijst van gereduceerde termen is niet noodzakelijk een bedekking, maar alle kubussen zijn nog steeds implicanten. In ons voorbeeld verkrijgen wij: Men zal nu opnieuw de expansiestap oproepen op de gereduceerde implicanten. Wanneer nu tijdens de expansiestap een andere term bedekt werd, weet men zeker dat men een nieuwe priemimplicant gevonden heeft die men tot dan toe niet gezien had. Men voegt deze implicanten bij de lijst L en voert stap 3 uit. Wanneer de kardinaliteit gereduceerd werd itereert men opnieuw stappen tot wanneer geen verbetering meer optreedt. In het voorbeeld treden geen nieuwe bedekkingen op, en wij genereren dus geen nieuwe priemimplicanten. Stap 7. Outputreductie Speciaal voor de realisatie van meervoudige functies (zoals deze in voorbeeld 4.8) in PLA s (zoals deze beschreven in figuur 3.23), zal men proberen in het verkregen outputgedeelte zoveel mogelijk 1-tjes te vervangen door 0-en, weerom zonder de realisatie van de functies te doorbreken. Deze operatie reduceert het aantal verbindingen in de OF-matrix van de PLA, wat een aantal elektrische en geometrische voordelen heeft: de belastingscapaciteit van de producttermen door poortingangen neemt af, waardoor de snelheid toeneemt. Het ruimtelijk voordeel ligt voor de hand. Bovendien kan het zijn dat een implicant, door het weglaten van een 1-tje in zijn outputgedeelte, niet langer priem is en verder geëxpandeerd kan worden. Dit, op zijn beurt, reduceert het aantal verbindingen in de EN-matrix. Opmerking. Wij hebben het ESPRESSO-algoritme slechts principieel besproken. Het is duidelijk dat een effectieve implementatie veel meer detail vereist, in het bijzonder voor de efficiënte implementatie van de basisoperaties die het algoritme nodig heeft. Dergelijke basisoperaties zijn o.m. het berekenen van het complement R van een stel implicanten S en D, en het testen of een kubus volledig bedekt wordt door een gegeven lijst kubussen. 116

121 Beide operaties werden door Brayton et al. op een efficiënte, recursieve manier geïmplementeerd, gebaseerd op de Shannondecompositie van Boolese functies. Voor meer detail, zie [Brayton84] Circuitrealisaties De minimale som-van-produktenvorm die resulteert uit een tweeniveauminimalisatie kan eenvoudig afgebeeld worden op concrete circuits in de meeste technologieën. Bij het (totaal verouderd) gebruik van standaard SSI-componenten komt men echter snel in de problemen door de beperkingen op fan-in van de poorten (men gaat niet veel verder dan 13 inputs). Men zal dus nooit complexere functies realiseren op deze manier. Veel interessanter en bijzonder geschikt zijn de z.g. PLA-achtigen (zie hoofdstuk 3), die men vindt bij de programmeerbare standaardcomponenten. Gegeven dat een functie de toelaatbare complexiteit van de PLA niet te boven gaat (b.v. het aantal termen in haar minimale som), is haar realisatie vrijwel onmiddellijk. De diverse subvarianten van de PLA-achtigen zoals de echte PLA s, de PAL s, en de ROM s, bestrijken elk een deel van het domein. De ontwerpsomgevingen opgezet voor het gebruik van dit soort componenten bevatten meestal diverse vormen van logische minimalisatie. De ABEL-compiler bevat o.m. het eigenlijke Quine-McCluskey-algoritme, maar bevat ook een aantal varianten van ESPRESSO. Bij ASIC-ontwerp heeft men meestal te doen met volwaardige PLA s. Deze hebben programmeerbare EN- en OF-matrices, en zijn het best gebaat met een gezamenlijke minimalisatie van functies: hun programmeerbare OF-matrix laat het gemeenschappelijk gebruik van termen toe. Gemeenschappelijke minimalisatie is nutteloos voor PALstructuren, daar de OF-matrix voor elke output (functie) vast is. Men moet het aantal termen voor elke functie individueel minimaliseren. Voor ROM-structuren, tenslotte, is er helemaal geen minimalisatie nodig, daar alle 2 n mintermen individueel kunnen gebruikt worden. 4.2 Meerniveausynthese Concept en Motivering Een niet-uitgevlakte Boolese vorm dit is een Boolese vorm die nog haakjes bevat kan rechtstreeks afgebeeld worden op een lusvrij netwerk van invertoren, EN- en OFpoorten (zie paragraaf 3.1.2). Afhankelijk van de vernestingsdiepte van de haakjes kan het zijn dat meer dan één EN-, OF-poort of invertor moet doorlopen worden van input naar output. Dergelijke netwerken noemen wij dan meerlaagse netwerken. In de meeste gevallen zal het netwerk dat men verkrijgt door een rechtstreekse afbeelding van een Boolese vorm niet optimaal zijn volgens de kwaliteitscriteria die men hanteert. Deze criteria zijn, zoals eerder aangehaald, een combinatie van snelheidseisen (beperkingen op de propagatietijd), en ruimte- of kostprijseisen (beperkingen op de oppervlakte of het aantal gebruikte componenten). Eén van de methoden om een bepaalde graad van optimaliteit te bereiken is, zoals reeds gezegd, het gebruik van tweeniveausynthese. Ongelukkiglijk is de realisatie van sommige combinatorische functies als een minimale som van produkten niet steeds de beste keuze. Hiervoor zijn er een aantal redenen. 117

122 Ten eerste, de bewuste keuze van een tweeniveauvorm wordt vaak gemotiveerd door de snelheid van de gerealiseerde circuits: slechts twee poortniveaus zijn nodig wanneer men invertoren niet meetelt. Maar in vele toepassingen is de snelheid (propagatietijd) van een combinatorisch circuit niet de eerste of meest beperkende eis. Vaak wenst men een circuit te realiseren dat niet trager is dan een vooropgegeven waarde, maar dat binnen die snelheidsrestrictie een minimale kostprijs (oppervlakte, aantal chips,...) zal hebben. Wanneer de restrictie op de snelheid meerniveaurealisaties toelaat, beschikt men over een ruimere set vrijheidsgraden voor de realisatie, en kan men qua oppervlakte dus hopen beter te doen dan met een zuivere som-van-productenrealisatie. Ten tweede, sommige technologieën laten geen economische tweeniveaurealisaties toe van complexe functies. De oorzaak hiervan is de grote vereiste fan-in van de EN- en de OF-poorten. Poorten zowel in standaardlogica, FPGA s, als gate arrays hebben een beperking op hun aantal inputs. Soms kan men met kunstgrepen deze beperking wat relaxeren (zoals, in het verleden, het gebruik van expander inputs bij TTL), maar ver geraakt men hiermee toch niet. Wanneer men dan b.v. een EN-poort met een groot aantal inputs moet realiseren, dan kan men b.v. boomvormige netwerken van EN-poorten met een lagere fan-in gebruiken en men verkrijgt automatisch een meerlaags netwerk. Niets zegt ons echter dat deze circuitvorm dan een optimale combinatie zal zijn van snelheid en plaats, wel integendeel. Zelfs bij technologieën die onbeperkte fan-ins toelaten is het zo dat de snelheid van een poort met een grote fan-in lager zal zijn dan deze van een poort met een kleine fanin (waarom is dit zo?). Een geschikte meerlaagse realisatie van de functie zou ook hier kunnen leiden tot een netwerk dat zowel kleiner als sneller is dan zijn tweelaagse tegenhanger. Het doel van meerlaagse synthese is de systematische realisatie van een opgegeven functie of een stel opgegeven functies in de gedaante van een lusvrij netwerk, waarin de knopen willekeurige Boolese functies realiseren van een beperkt aantal inputs. Het doel is dit zo economisch mogelijk te doen, en dit kan o.m. door het aantal knopen zo klein mogelijk te maken, en door de output van een knoop zo vaak mogelijk te hergebruiken. Voorbeeld 4.9 Beschouw de (volledig bepaalde) functie y(a, b, c, d, e, f, g) = abeg + abfg + abe g + aceg + acfg + ace g + deg + dfg + de g Gerealiseerd als tweeniveaucircuit zijn er dus 9 EN-poorten nodig met 3 of 4 inputs, en een 9-input OF-poort (fig. 4.6(d)). Wij kunnen deze vorm herschrijven als volgt: y(a, b, c, d, e, f, g) = (a(b + c) + d)(g(f + e ) + eg ). Wanneer wij de structuur van deze vorm rechtstreeks afbeelden op een poortnetwerk, verkrijgen wij een meerlaags netwerk met 4 2-input EN-poorten en 4 2-input OF-poorten (fig. 4.6(a)). Een eenvoudige toepassing van de regels van De Morgan, waar nodig met het gebruik van geïnverteerde inputs en functie-output, leidt tot een netwerk van 8 2-input NEN-poorten (fig. 4.6(b)). Bij realisaties als complexe CMOS- poort is de tweede vorm ook veruit te verkiezen boven de eerste. Bij een dergelijke realisatie wordt de schakeltransistor vervangen door een (serie-parallel) netwerk van transistoren, elk gecontroleerd door precies één literal. De lasttransistor wordt vervangen door het duaal schakelnetwerk, met de complementaire transistoren. Wanneer de output in niet-geïnverteerde vorm nodig is, zijn er twee bijkomende transistoren vereist. Alternatief kan men gebruik maken van de identiteit f (x 1,..., x n ) = f D (x 1,..., x n) 118

123 waarin f D de functie gerealiseerd door het duaal netwerk voorstelt. Noteer dat dit netwerk precies evenveel literals bevat als het originele! Met de eerste gedaante van de functie hebben wij een parallelschakeling van 9 takken met elk 3 of 4 transistoren nodig (33 transistoren in schakelcircuit). De structuur van de tweede realisatie vindt men in figuur 4.6(c). Zij is duidelijk goedkoper (9 transistoren in het schakelcircuit), zonder daarom echter trager te zijn! Zoals men kan zien in voorbeeld 4.9 is het mogelijk dat een meerniveaurealisatie van een gegeven Boolese functie er eenvoudiger uitziet dan een tweeniveaurealisatie. De kostprijs van een dergelijke realisatie hangt af van van het aantal knopen, hun interne complexiteit, en de interconnectiekost. Voor heel wat technologieën, onder meer CMOS, is de kostprijs van de realisatie van een knoop recht evenredig met het aantal literalinputs van de knoop. Het aantal transistoren in een complexe CMOS- poort is immers sterk gekoppeld met het aantal literals in de Boolese uitdrukking van de functie van die poort. De correspondentie is perfect wanneer de functie voorgesteld wordt door een uitdrukking die rechtstreeks als taknetwerk te realiseren is. 4 De meeste gekende technieken voor meerniveausynthese richten zich dan ook op het voorstellen van de functies door middel van stelsels van Boolese vormen met een zo klein mogelijk totaal aantal literals. Er bestaat op dit ogenblik geen bruikbaar algoritme dat in alle gevallen in redelijke tijd in staat is een stel Boolese functies in een gegarandeerd gezamenlijk minimale vorm te transformeren: de rekenduur van alle gekende optimale algoritmen is exponentieel in het aantal inputs. Er heeft zich gedurende de laatste 10 jaar echter een duidelijke evolutie voorgedaan in bruikbare, heuristische technieken, gebaseerd op de techniek van algebraïsche factorisatie Factorisatie Het aantal literals in een Boolese vorm kan gereduceerd worden door de vorm te herschrijven als een produkt. Voorbeeld 4.10 De onderstaande vorm kan gefactoriseerd worden als volgt: adf + aef + bdf + bef = f(a + b)(d + e) De SVP-vorm heeft 12 literals, maar de gefactoriseerde vorm slechts 5. Wij kunnen onderscheid maken tussen twee vormen van factorisatie: de algebraïsche en de Boolese. Bij Boolese factorisatie gebruikt men de Boolese identiteiten, die vereenvoudiging mogelijk maken na het uitwerken van een produkt. Bijvoorbeeld, louter algebraïsche uitwerking van (a + b)(a + c) leidt tot aa + ac + ba + bc. De Boolese identiteiten aa = a en a + ab = a stellen ons in staat dit te vereenvoudigen tot (a + b)(a + c) = a + bc, wat betekent dat het linkerlid een factorisatie is van het rechterlid in het Boolese domein, wat echter niet waar is wanneer men echter de Boolese identiteiten niet gebruikt. Dit laatste noemt men algebraïsche factorisatie: men zal geen domein-afhankelijke reductieregels gebruiken. Noteer dat Boolese factorisatie en algebraïsche op hetzelfde neerkomen wanneer de factoren uit disjuncte sets variabelen bestaan. Elke algebraïsche factorisatie 4 Zoals men weet volstaat het dat inversies alleen voorkomen op literals. Dan kan men de Boolese vorm rechtstreeks afbeelden op een topologisch corresponderend schakelnetwerk. 119

124 b c f e' a g g e' d y b' c' f' e a g g e' d' y' (a) Meerlaagse realisatie (b) NEN-realisatie d c b g f a Vdd g' e' a f e' e g' e g y' a b e g' a b f g a b e' g a c e g' a c f g a c e' g d e' g y b c d d f g d e g' (c) Complexe CMOS-poort (d) Tweelaagse realisatie Figuur 4.6: Tweeniveau- vs. meerniveaurealisaties 120

125 is een Boolese factorisatie; het omgekeerde is niet waar. De reden waarom men in eerste instantie gebruik maakt van algebraïsche technieken is omdat deze veel minder rekenintensief zijn dan Boolese technieken, hoewel men weet dat Boolese technieken krachtiger zijn. Delers, factoren, kernen en co-kernen Het is jammer genoeg niet zo dat elke Boolese vorm kan geschreven worden als een algebraïsch produkt; vormen waarbij dit niet kan noemen wij priem. Toch kunnen wij een dergelijke vorm herschrijven met minder literals door het toepassen van een zwakkere vorm van factorisatie. Een dergelijke zwakkere (en dus breder toepasbare) vorm is gebaseerd op het begrip algebraïsche deling. Definitie 4.13 De Boolese SVP-vorm d is een algebraïsche deler van de Boolese SVP-vorm f als er een niet-ledige vorm q 0 en een vorm r bestaan zodanig dat f = qd + r in algebraïsche zin. De vorm d is een algebraïsche factor van f als r ledig is. Het volgend algoritme voert een algebraïsche deling uit. Algoritme 4.7 (Het uitvoeren van een algebraïsche deling van f door g) Weze n en m resp. het aantal termen in f en g. Noteer alle SVP-vormen als (multi-)verzamelingen van kubussen. Weze U = {u 1, u 2,..., u n } de SVP-vorm afgeleid uit f door weglating van alle literals die niet optreden in g, en V de gelijkaardige vorm met literals weggelaten die wel optreden in g. Noteer dat f = {u 1 v 1,..., u n v n }. DELING(f,g): for (i = 1 to n) { V i = {v j V : u j = g i } } q = i=1...m V i r = f g q return (q,r) Toegepast op de vorm van 4.10 vinden wij, met F = adf +aef +bdf +bef en G = a+b, dat U = {a, a, b, b} en V = {df, ef, df, ef}. Er volgt V 1 = {df, ef}, V 2 = {df, ef}, V 3 = {df, ef} en V 4 = {df, ef}. Uiteindelijk vinden wij q = i=1...m V i = {df, ef}, wat de representatie is van df + ef, het quotiënt. De rest r is uiteraard leeg, daar g een factor is van f. Eens men een deler gevonden heeft van f kan men recursief verder delers zoeken, door d, q en r verder op te splitsen. De keuze van deler en quotiënt is helemaal niet uniek, en kan op veel manieren gebeuren. Vaak wil men de nuttigste deler vinden, die een zo groot mogelijk reductie van het aantal literals realiseert. Om nuttig te zijn moet een deler zoveel mogelijk termen bevatten. Bovendien moeten eventuele gemeenschappelijke factoren uitgefactoriseerd worden. Vandaar de volgende definitie. Wij noteren de verzameling literals die optreden in een product C als L C. Definitie 4.14 Een Boolese SVP-vorm C 1 + C C k is kubusvrij wanneer de doorsnede van de literalverzamelingen van de termen leeg is: i=1,k L Ci =. Noteer dat een kubusvrije vorm minstens twee termen heeft. 121

126 Definitie 4.15 Een Boolese SVP-vorm d is een maximale deler van een Boolese vorm f wanneer er geen termen kunnen aan toegevoegd worden zonder dat d ophoudt een deler te zijn. Maximale kubusvrije delers van een Boolese vorm spelen een belangrijke rol in systematische factorisatie. Men noemt ze kernen. Definitie 4.16 Een Boolese SVP-vorm k is een kern van een Boolese SVP-vorm f, a.s.a. k een maximale kubusvrije deler is van f, en het corresponderend quotiënt q een kubus is. Het quotiënt heet dan co-kern van k. Wij zullen de verzameling van kernen van een vorm f noteren als K(f). De verzameling K(f) kan op systematische wijze bepaald worden door het volgende (recursieve) algoritme. Algoritme 4.8 (Het bepalen van de kernen van een vorm f) Wij ordenen de j literals l i, i = 1,..., j van f op lexicografische manier, en nummeren ze volgens die ordening. Kubusfactoren c van SVP-vormen worden vergeleken op basis van hun literalverzamelingen L c. KERNEN(f): c = grootste kubusfactor van f K = KERN(1, f/c) return K KERN(m,g): R = g for i = m to j{ if (l i in minstens twee termen van g){ c=grootste kubusfactor van g/l i if (l k / c, k = 1,..., i){ R = R KERN(i, g/(c {l i }))) } } } return R Voorbeeld 4.11 Wanneer wij algoritme 4.8 toepassen op de functie uit voorbeeld 4.9 verkrijgen wij de kernen uit tabel 4.1. Noteer dat kernen andere kernen kunnen bevatten. Zo kunnen wij het niveau van een kern definiëren. Kernen die geen andere kernen bevatten zijn van niveau 0; kernen die kernen van maximaal niveau n bevatten zijn van niveau n + 1. Kernen zijn als het ware de primitieve bouwstenen waarmee de Boolese vorm opgebouwd werd via OF- en EN-operaties; zij spelen dus een uiterst belangrijke rol in het vinden van goede factorisaties. Twee stellingen [Brayton87] staven deze uitspraak. 122

127 Kern Co-kernen Niveau Waarde beg + bfg + be g + ceg + cfg + ce g a 2 5 eg + fg + e g d, ab, ac 1 22 f + e abg, dg, acg 0 12 ab + ac + d eg, fg, e g 1 22 b + c aeg, afg, age 0 11 abf + abe + acf + ace + df + de g 2 5 bf + be + ce + cf ag 1 6 Tabel 4.1: De kernen van de functie uit het voorbeeld Stelling 4.6 Als k een kern is van f en bovendien priem, dan is k een kern van precies één priemfactor van f. Stelling 4.7 (Brayton en McMullen, 1982) Weze f en g twee SVP-vormen, en K(f) resp. K(g) hun kernverzamelingen. De vormen f en g hebben een gemeenschappelijke algebraïsche deler met meer dan één term a.s.a. er minstens één k f K(f) meer dan één term gemeenschappelijk heeft met een kern k g K(g). De laatste stelling impliceert dat wanneer wij op zoek gaan naar factorisaties van een verzameling functies, met de bedoeling zoveel mogelijk gemeenschappelijke delers te identificeren, wij het zoeken kunnen beperken tot de kernverzamelingen, eerder dan de verzameling van alle factoren Realisaties van functies Enkelvoudige functies Het doel is de functie voor te stellen door een gefactoriseerde vorm met een minimaal aantal literals. Een gefactoriseerde vorm is een som van één of meer producten, waarbij elke factor opnieuw een gefactoriseerde vorm is. Een gefactoriseerde vorm kan steeds rechtstreeks afgebeeld worden op een topologisch equivalent poort- of taknetwerk. Uitgaande van een gefactoriseerde vorm kan men overgaan tot een meerniveausynthese of niet. Deze beslissing is uiteraard technologie-afhankelijk. Bijvoorbeeld, in CMOS kan men een gefactoriseerde vorm steeds realiseren als een complexe poort. De beslissing om een functie al dan niet te realiseren als één complexe poort zal afhangen van de complexiteit van het schakelnetwerk in deze poort en haar belasting. Beide factoren beïnvloeden de schakelsnelheid. Wanneer men overgaat naar een decompositie van de knoop naar een meerlaags netwerk, zal met een deelexpressie van de gefactoriseerde vorm nemen, en deze als aparte knoop realiseren. Dit vereist de introductie van een nieuwe interne literal, die de deelexpressie in de originele knoop vervangt. Het totaal aantal literals van de realisatie is dan gestegen met 1, maar de knopen zijn eenvoudiger (en dus sneller) geworden. Zoals besproken in voorbeeld 4.9 kost het realiseren van een functie of haar complement precies evenveel, op voorwaarde dat men de inputs in de geschikte vorm ter beschikking heeft. Met andere technologieën, b.v. met FPGA s en PAL s, gelden andere criteria. Hier weet men dat elke knoop gelijk welke functie kan realiseren, maar dan van een beperkt aantal variabelen (b.v. 5 voor de Xilinx 3000-reeks) of met een beperkt aantal produkttermen (5 in de 22V10). Men zal de vorm dus opsplitsen in een stelsel van vormen, zodanig dat in geen enkel rechterlid meer dan het toegelaten aantal variabelen (niet literals!) of termen voorkomt. 123

128 Bij semi-custom componenten, b.v. gate arrays, gelden nog strictere criteria. Hier kan elke knoop maar één type functie van een gegeven aantal variabelen realiseren, b.v. een 3-input NEN-functie. Het zorgvuldig gebruik van geïnverteerde variabelen en de regels van De Morgan laten toe meerlaagse netwerken in deze technologie te beschrijven door stelsels van 3-argument EN- en OF-functies. In elk geval zal men dus vertrekken van een zo goed mogelijk gefactoriseerde Boolese vorm. Voor het vinden van een optimum zijn er echter geen algoritmen bekend die een aanvaardbare rekentijd hebben in gevallen met een realistische complexiteit (tientallen variabelen), en men moet noodgedwongen zijn toevlucht nemen tot heuristische technieken. Het volgende algoritme (in feite een klasse van algoritmen) bepaalt van een opgegeven Boolese SVP-vorm een factorisatie. Algoritme 4.9 (Het factoriseren van een vorm f) FACTOR(f): if (aantal termen in f = 1) return f k = KIESDELER(f) (q, r) = DEEL(f, k) return FACTOR(q)FACTOR(k) + FACTOR(r) Dit algoritme gebruikt twee subroutines: KIESDELER(f) en DEEL(f, k). De kwaliteit van deze routines bepaalt de kwaliteit van het geheel. Voor de eerste routine, het kiezen van een deler, kan men verschillende wegen uit. Men poogt, met zo weinig mogelijk moeite, een deler te kiezen met een zo groot mogelijk nut. De moeite om te kiezen wordt in belangrijke mate bepaald door de afmeting van de zoekruimte. Het nut van een deler kan men uitdrukken als de besparing in het aantal literals dat hij zal realiseren. Weze k het aantal termen in een deler k, en L(k) het aantal literals. De besparing gemaakt door de keuze van k kan uitgedrukt worden als (bewijs dit) waarde(k) = ( k 1)L(q) + ( q 1)L(k). Als delers volstaat het slechts kubusvrije vormen te onderzoeken, daar het uitfactoriseren van een gemeenschappelijke kubus steeds winst oplevert. Brayton heeft bewezen dat een optimale deler met meer dan 1 term steeds moet bestaan uit een kubusvrije intersectie van een verzameling kernen een subkern. Voor onze heuristische zoektocht zullen wij ons echter beperken tot de eigenlijke kernen van f, en eventueel slechts tot de kernen van niveau 0, daar deze een kleinere verzameling uitmaken. Het quotiënt dat hoort bij een kern is de som van de co-kernen van deze kern, wat toelaat snel de waarde te bepalen van een kern, eens men de kernen van een vorm bepaald heeft. De waarden van de kernen van de vorm uit voorbeeld 4.9 werden aangegeven in tabel 4.1. Stel dat wij enkel de verzameling van de kernen van niveau 0 gebruiken, dan genereert algoritme 4.9 de volgende factorisatie: y = (f + e )(abg + dg + acg) + abeg + aceg + deg (eerste stap) = (f + e )g(a(b + c) + d) + eg (a(b + c) + d) (tweede stap) 124

129 Figuur 4.7: Een stelsel vergelijkingen en het corresponderend netwerk Wanneer echter alle kernen in beschouwing genomen worden, dan krijgen wij: y = (eg + fg + e g)(d + ab + ac) (eerste stap) = (g(f + e ) + eg )(a(b + c) + d) (tweede stap) De beperking tot de kernen van niveau 0 heeft als gevolg dat wij in dit geval niet de beste oplossing vinden. De tweede vrijheidsgraad waarover wij beschikken ligt in de keuze van de routine DEEL. Wij hebben steeds gebruik gemaakt van algebraïsche deling; een routine die Boolese deling uitvoert zal in vele gevallen betere resultaten behalen, zij het ten koste van een sterk toegenomen rekentijd. Boolese netwerken. Meerniveaurealisaties van een of meerdere functies kunnen worden beschreven door een stelsel van Boolese vergelijkingen waarvan het linkerlid bestaat uit één literal, en het rechterlid uit een Boolese vorm. De literals in de rechterleden die niet voorkomen in het linkerlid van één der vergelijkingen noemt men de primaire inputs; de literals uit de linkerleden die niet voorkomen in het rechterlid van een vergelijking zijn de primaire outputs. Het stelsel vergelijkingen moet uiteraard zo zijn dat de intermediaire literals geëlimineerd kunnen worden, waardoor de primaire outputs kunnen geschreven worden als Boolese vormen in de primaire inputs. Dergelijke stelsels vergelijkingen kunnen voorgesteld worden door middel van Boolese Netwerken. Zulk een netwerk is een gerichte, acyclische graaf, waarvan de knopen Boolese functies voorstellen, en waarin de takken overeenkomen met de literals. Gewoonlijk stelt men de primaire inputs zelf ook voor door knopen zonder inkomende takken (figuur 4.7). Boolese netwerken zijn gestileerde representaties van echte circuits; zij kunnen poortnetwerken voorstellen, maar ook netwerken met knopen die veel ingewikkelder functies realiseren dan poorten of invertoren (de z.g. complexe poorten ). In het vervolg zullen wij geen onderscheid maken tussen Boolese netwerken en de stelsels vergelijkingen die zij voorstellen. Meervoudige functies Voor de realisatie van meervoudige functies vertrekken wij van een stel vergelijkingen, één per functie. Wij veronderstellen ook dat wij de functies zowel in gefactoriseerde vorm, als in SVP-vorm ter beschikking hebben. 125

130 De synthesestap is het afsplitsen van een goede gemeenschappelijke deelfunctie (het creëren van een intermediaire variabele en een bijkomende vergelijking). Met goed wordt ook hier bedoeld: een zo sterk mogelijke reductie in het aantal literals realiserend. Goede deelfuncties zijn in eerste instantie functies met meer dan één term in hun SVP-vorm; bij gebrek aan dergelijke deelfuncties moet men gemeenschappelijke kubussen evalueren. Voor het zoeken naar goede, gemeenschappelijke deelfuncties beperken wij ons tot intersecties van kernen uit de verschillende functies, en dit op basis van stelling 4.7. Kernintersecties kunnen zelf met het kernextractiealgoritme gevonden worden, en wel op de volgende manier. Beschouw de kernverzameling K = i=1,...,n K(f i ) van een stel functies f i. Laat met elke verschillende term uit een kern een nieuwe literal overeenstemmen, en noteer een kern (som van termen) als het produkt van de nieuwe literals. De kernverzameling K wordt dus afgebeeld op een verzameling produkten van de nieuwe literals. Deze kan dus geïnterpreteerd worden als de SVP-representatie van een functie F. Wanneer wij de kernen K(F ) bepalen, zullen de co-kernen met meer dan één factor, gemeenschappelijke kubussen uit de termen van F voorstellen, dit wil zeggen gemeenschappelijke sommen met meer dat één term uit de oorsponkelijke kernverzameling K. Dit zijn precies de kernintersecties die wij zoeken. Voorbeeld 4.12 Beschouw de volgende kernverzameling: K = {k 1, k 2, k 3 }, met k 1 = abc + de + fg k 2 = abc + de + fh k 3 = abc + fh + gh Noteren wij abc = A, de = B, fg = C, fh = D en gh = E. De nieuwe functie F wordt dan F = ABC + ABD + ADE met als co-kernen {A, AB, AD}. De gezochte kernintersecties zijn dus A = abc AB = abc + de AD = abc + fh Ook hier zijn compromissen tussen rekenduur en kwaliteit van het resultaat mogelijk. Men zou b.v. kunnen vertrekken van enkel de kernen van niveau 0 uit de oorspronkelijke verzameling K; men zou zich ook kunnen beperken tot co-kernen van kernen van niveau 0 uit de verzameling K(F ). Beide restricties verkleinen de zoekruimte, eventueel ten koste van de kwaliteit van het eindresultaat. Om te beslissen of men een bepaalde kernintersectie k zal afsplitsen als een nieuwe functie, zal men eerst haar waarde bepalen. Weze NF(k) het aantal functies (in gefactoriseerde vorm) waarin k optreedt, en weze L(k) het aantal literals in de gefactoriseerde vorm van k. Per substitutie van k door een nieuwe literal zullen wij dus L(k) 1 literals uitsparen in totaal NF(k)(L(k) 1); wij moeten echter een nieuwe functie voor k invoeren dit kost ons L(k) literals. De totale winst is dus waarde(k) = (NF(k) 1)(L(k) 1)

131 Wij kunnen nu een aantal kernintersecties afsplitsen, waarbij het mogelijk is dat in de originele functies nieuwe kernen ontstaan door de introductie van nieuwe literals. Na een aantal substituties zullen wij derhalve opnieuw de kernverzameling van de functies bepalen, en de hele procedure itereren tot wanneer geen nuttige kernintersecties meer gevonden worden. Deze procedure kan geformaliseerd worden door het volgende algoritme. Algoritme 4.10 (Het afsplitsen van gemeenschappelijke deelfuncties) De input van dit algoritme is een stelsel van Boolese functies F, en twee parameters k en n. De parameter k bepaalt het niveau van de kernen waarvan wij intersecties zullen zoeken; de parameter n begrenst het aantal substituties alvorens wij de nieuwe kernverzameling bepalen. Met K k (f) bedoelen wij de kernen van f tot en met niveau k, en met I 0 (K) de kernintersecties opgeleverd door co-kernen van niveau 0. FROM(x) is de verzameling functies waarin x zal gesubstitueerd worden door een nieuwe literal. De functie SUBSTITUTE(f, x) vervangt in f de vorm x door een nieuwe literal die x benoemt. Het algoritme levert een nieuw stelsel van Boolese functies af met in totaal minder literals. EXTRACT(F, k, n): repeat{ K = f F K k (f) I = I 0 (K) for (i = 1 to n){ x = argmax y I {waarde(y)} if waarde(x) < 0 exit for f FROM(x) { f = SUBSTITUTE(f, x) } F = F {x} } } return F Nadat op deze manier alle nuttige gemeenschappelijke deelexpressies geëxtraheerd werden, kan men ook op zoek gaan naar nuttige gemeenschappelijke kubussen. Gemeenschappelijke kubussen kunnen gevonden worden als co-kernen bij de kernextractie uit de verzameling van alle termen waaruit de SVP-vormen van de beschouwde functies bestaan. Dus in plaats van voor alle functies afzonderlijk de kernen te bepalen, nemen wij alle termen samen in één verzameling, en bepalen daarvan de kernen. De eigenlijke extractie en substitutie kan gebeuren met een algoritme gelijkaardig aan algoritme Nadat deze twee stappen uitgevoerd zijn garandeert niets de optimaliteit van het resultaat het gaat hier immers over heuristische methoden. Het is b.v. nog mogelijk dat bepaalde functies andere functies nog delen (hetzij in algebraïsche, hetzij in Boolese zin). Men voert dan ook nog een derde optimalisatiestap uit, die men de resubstitutie noemt. Men gaat hier na of inderdaad de SVP-vormen geassocieerd met bepaalde knopen een deler zijn van de SVP-vormen geassocieerd met andere knopen. Indien dit het geval is, kan men de deling uitvoeren, en alzo het netwerk verder vereenvoudigen. 127

132 Het gebruik van DON T CARE-termen Bij tweeniveauminimalisatie van een functie maakt men gebruik van de opgegeven DON T CARE-termen in de verzameling D f. Deze verzameling is vast, daar de argumenten van de functie vast zijn. Anders is het gesteld met meerniveauminimalisatie. Hier worden de interne variabelen gegenereerd door gekende functies, en meestal is het zo dat niet alle mogelijke combinaties van de interne variabelen kunnen optreden. Beschouw bijvoorbeeld een Boolese vergelijking die een knoop beschrijft: u = f(x, y, z) = x y + y z In normale werking is het zo dat de relatie tussen u en x, y, z gebonden is door bovenstaande vergelijking, dit wil zeggen dat waarden van u die niet aan deze vergelijking voldoen niet kunnen optreden. Het stel combinaties van u, x, y, z dat aldus niet kan optreden wordt gegeven door u f + uf = u x y + u y z + uxy + uxz + uy z, wat nuttig kan gebruikt worden in elke knoop die gebruikt maakt van de variabelen u, x, y of z. Voor elke knoop in het netwerk kunnen aldus een aantal bijkomende DON T CAREtermen bepaald worden. Noteer met FAN-IN(f) de verzameling van knopen (functies) waarvan de outputs fungeren als input voor de knoop f. Voor j FAN-IN(f), noteer met x j de literal die de output van knoop j benoemt, en weze f j een SVP-representatie van de functie gerealiseerd door deze knoop. De knoop zorgt er dus voor dat de variabele x j en de vorm f j steeds dezelfde waarde aannemen, en de situatie x j f j = 1 kan dus niet voorkomen. De SVP-representatie van de DON T CARE-termen voor knoop k ten gevolge van het feit dat hij zijn inputs uit interne knopen betrekt wordt dan gegeven door DC inp (k) = j FAN-IN(k) x j f j Noteer dat, als j een inputknoop is, f j letterlijk gelijk is aan x j, en er dus geen bijdrage is tot de DON T CARE-set. Op dezelfde wijze kan men ook DON T CARE-sets bepalen die het gevolg zijn van het stroomafwaarts intern gebruik van de literal x k geassocieerd met de knoop k. Laat FAN-OUT(k) de verzameling knopen voorstellen die rechtstreeks gebruik maken van x k. Wanneer de output x j van alle knopen j FAN-OUT(k) niet afhangt van de waarde van x k voor een gegeven stel waarden van de andere inputs van knoop j, is dat stel waarden ook een DON T CARE-configuratie voor knoop k (immers, het geeft niet wat de waarde is die de output van de knoop k dan aanneemt). Een SVP-representatie van deze set wordt verkregen na uitwerking van DC outp (k) = j FAN-OUT(k) (f j xk =1 f j xk =0). Hierin is f j /x k de residufunctie van f j in de Shannon-expansie m.b.t. de variabele x k, en kan gevonden worden door in f j de waarde x k = 1 te stellen. Wanneer f j xk =1 = f j xk =0 hangt de waarde van f j niet af van x k (ga dit na!). Deze bijkomende DON T CARE-termen kunnen nuttig gebruikt worden om de SVPrepresentatie van de functie van een knoop te vereenvoudigen. Noteer echter dat een vereenvoudiging van de SVP-representatie niet altijd gepaard hoeft te gaan met een reductie van het aantal literals in de gefactoriseerde vorm. 128

133 4.2.4 Een wat groter voorbeeld Om het voorgaande te illustreren beschouwen wij een niet al te triviaal voorbeeld. Het gaat om een oplaadbare 4-bits BCD-op/neerteller, waarvan wij de combinatorische functies willen realiseren. Voorbeeld 4.13 Er zijn vier functies X, Y, Z, W, die de inputs van de D-flipflops van de teller voorstellen. De inputs van deze functies zijn de huidige stand van de flipflops x, y, z w, de vier ingangen voor het opladen a, b, c, d, en twee controle-ingangen e en f. De encodering van deze laatste is als volgt: ef = 00 betekent de huidige stand behouden, ef = 01 is optellen, ef = 10 is aftellen, en ef = 11 is opladen. Als DON T-CARE-inputs beschouwen wij alle combinaties van xyzw bij ef 11 die een getal groter dan 9 voorstellen, en alle gelijkaardige combinaties van abcd bij ef = 11. In meer formele notatie, met de volgorde {abcdefxyzw}: D XY ZW = { 001 1, 0011, 011 1, 0111, 101 1, 1011, , } De vergelijkingen werden in ESPRESSO ingebracht. Het inputformaat ziet eruit als volgt:.i 10.o 4.il a b c d e f x y z w.ob X Y Z W.type fdr ; vasthouden (ef =00) ; optellen (ef = 01) ; aftellen (ef = 10)

134 ; opladen (ef = 11) ; don t care-termen Deze functies werden onderworpen aan een tweeniveauminimalisatie door ESPRES- SO, wat het volgende stelsel oplevert: X = aef + ef w x y z + e fwyz + e w x + f wx Y = bef + ef w x + e fwy z + e w y + e yz + f wy + f yz Z = cef + ef w x + ef w yz + e fwx z + e w z + f wz W = def + ef w + e fw + e f w Met het gemeenschappelijk gebruik van de term ef w x vereist de tweeniveaurealisatie van dit stelsel 21 EN-poorten, 4 OF-poorten, en in totaal zijn er 97 poortinputs nodig (EN-poorten en OF-poorten). De maximale fan-in is 6 voor de EN-poorten, en 7 voor de OF-poorten. Voor een realisatie met complexe CMOS-poorten heeft het stelsel 79 literals. Om over te gaan tot een meerniveaurealisatie met een zo klein mogelijk aantal literals (realisatie met complexe CMOS-poorten), bepalen wij eerst de kernverzamelingen van de vier functies. Het resultaat staat in tabel 4.2. Uit deze kernentabel zoeken wij de kernintersecties, als mogelijke kandidaten voor de extractie van gemeenschappelijke factoren met minstens één term. Tevens zoeken wij ook de gemeenschappelijke kubussen (delen van termen). De resultaten van deze operaties vindt men in tabellen 4.3 resp. 4.4 (hier slechts een selectie van de meest nuttige). De kernintersectie f w + e w komt voor in functies X, Y en Z, en wordt dus bij voorkeur genomen als basis voor factorisering. Voorts blijkt bij nazicht dat de kubus ef w meer winst zou opleveren dan de gemeenschappelijke kern-éénterm ef w x. De gemeenschappelijke kubussen e fw en ef reduceren ook het aantal literals bij extractie. Na factorisatie, 5 rekening houdend met de voorgenomen extracties van kernintersecties (dus nog niet van deelkubussen), krijgen wij dan het volgend stel vergelijkingen. X = ef x y z w + f(e yzw + ae) + x(e w + f w) Y = f(e y zw + be) + y(e z + f z + e w + f w) + ef xw 5 De volgende manipulaties werden uitgevoerd met behulp van de SIS-suite. 130

135 Functie Co-kernen Kern W f e w + de W e fw + f w W f ew + e w W w ef + e f W e f w + df W 1 ef w + e fw + e f w + def Z f e wx z + ce Z w e fx z + f z Z z e w + f w Z e fwx z + w z Z f ew yz + ew x + wz Z w ef yz + ef x + e z Z z e fwx + ef w y Z ef w yz + x Z e f w yz + f w x + cf Z 1 e fwx z + ef w yz + ef w x + e w z + f wz + cef Y f e wy z + be Y w e fy z + f y Y f y z + w Y e y z + w Y y e z + e w + f z + f w Y z e fwy + f y Y e yz + fwy z + w y Y f ew x + yz + wy Y w ef x + e y Y e f w x + bf Y 1 e yz + e fwy z + ef w x + e w y + f yz + f wy + bef X f e wyz + ae X w f x + e fyz X x e w + f w X e w x + fwyz X f ew x y z + wx X w ef x y z + e x X e f w x y z + af X 1 ef w x y z + e w x + f wx + e fwyz + aef Tabel 4.2: De kernen van de BCD-teller 131

136 Kern f w f w + e w ef x f y f z ew x e w f w x ef w x yz Functies X, Y, Z, W Z, Y, X Y, Z Y, Y Y, Z Y, Z X, Y, Z, W Y, Z Y, Z Y, Z Tabel 4.3: Gemeenschappelijke termen van kernen Kubus Aantal plaatsen in svp-vorm Winst bij extractie e fw 3 3 ef w 5 9 ef 4 2 e w 4 2 f w 4 2 e f 4 2 ef w x 2 2 Tabel 4.4: Interessante gemeenschappelijke kubussen 132

137 Z = cef + z (ef yw + e fx w) + z(e w + f w) + ef xw W = e f w + def + w (ef + e f) De gemeenschappelijk extraheerbare onderdelen staan in het vetjes. Het aantal literals is door de factorisatie al gereduceerd tot 70. Na extractie krijgen wij X = ef x y z w + f(e yzw + ae) + xg Y = f(e y zw + be) + y(e z + f z + g) + h Z = cef + z (ef yw + e fx w) + zg + h W = e f w + def + w (ef + e f) g = e w + f w h = ef xw wat ons nog 63 literals oplevert. Nu voeren wij een nieuwe minimalisatie en factorisatie uit, rekening houdend met de nieuwe DON T CARE-termen. Wij krijgen: X = aef + g (f y z h + e yz) + xg Y = e y zg + bef + y(e z + f z + g) + h Z = z g (f y + e x ) + cef + zg + h W = g(e w + f) + g (de + f ) g = e w + f w h = f xg wat 54 literals bevat. Na extractie van de gemeenschappelijke kubussen verkrijgen wij het uitgebreid stel vergelijkingen. X = x y z i + yk + aj + xg Y = yi j k + i(yz + x) + y k + bj Z = e x z g + i(yz + x) + cj + zg W = deg + g(e w + f) + i g = e w + f w i = f g j = ef k = e zg Het aantal literals werd teruggebracht op 53. De nog aanwezige factorisatie zou kunnen gebruikt worden om het aantal literals in bepaalde vormen verder te reduceren (b.v. in functie Y ), door de deler ook te extraheren en te realiseren als aparte functie. Noteer dat dit echter het totaal aantal literals weer opvoert. Verdere vereenvoudigingsstappen, zoals het nagaan van deelbaarheid van de functies door elkaar, brengen geen bijkomende winst. Noteer dat deze methode heuristisch is, en geen garantie biedt dat een globaal optimum is bereikt. 133

138 4.2.5 ULM s en Multiplexersynthese In deze sectie zullen wij kort ingaan op een alternatieve methode voor meerniveausynthese. De methode is gesteund op het begrip universele logische module (ULM), een bouwblok waarmee men willekeurige Boolese functies van een beperkt aantal variabelen kan realiseren. Een ULM is gebaseerd op de Shannondecompositie van Boolese functies. Even opfrissen: als f(x 1,..., x n ) een Boolese functie is van n variabelen, dan geldt f(x 1,..., x n ) = x 1f(0, x 2,..., x n ) + x 1 f(1, x 2,..., x n ) waarbij men deze decompositie kan doen voor een willekeurige variabele x i. De functies f(0, x 2,..., x n ) en f(1, x 2,..., x n ) hebben een variabele minder, en worden de residufunctie genoemd van f met betrekking tot x 1. Men kan de Shannondecompositie uitbreiden tot meerdere variabelen, als volgt f(x 1,..., x n ) = x i1 1 x i 2 2 x i k k f(i 1, i 2,..., i k, x k+1,..., x n ), i 1 i 2 i k {0,1} k waarin x i j j = x j, als i j = 1, en x i j j = x j, als i j = 0. Het spreekt vanzelf dat men deze decompositie kan doen voor een willekeurige deelverzameling van de n variabelen. Wanneer men de decompositie doet voor n 1 variabelen, dan bevatten de 2 n 1 residufuncties maar één variabele meer, zeg x n. De residufuncties kunnen dus slechts 4 gedaanten aannemen: 0, 1, x n, of x n. Deze gedaanten noemen wij triviale functies. Men zou equivalent kunnen starten van een BDD-representatie van de functie. Naieve multiplexersynthese Deze laatste decompositie kan onmiddellijk in circuitvorm gegoten worden door middel van een 2 n 1 1-multiplexer: het volstaat dat men de n 1 decompositievariabelen verbindt met de controle-ingangen van de multiplexer, en de triviale residufuncties (die inderdaad op triviale wijze gerealiseerd worden) verbindt met de geschikte data-ingang van de multiplexer. Op deze manier kan men de multiplexer gebruiken als ULM. Wanneer men niet beschikt over multiplexers met voldoende controle-ingangen (k < n 1), kan men een boomvormig netwerk van multiplexers gebruiken. De wortel van de boom doet een decompositie op basis van k variabelen. Elk van de 2 k residufuncties die niet-noodzakelijk triviaal zijn worden door een tweede laag van multiplexers verder gedecomposeerd op k van de overblijvende variabelen. Men kan dit recursief verder doen tot wanneer de residufuncties triviaal geworden zijn. Men ziet in dat men, op deze naieve manier, met behulp van ten hoogste 2 j 1 multiplexers met k controle-ingangen een willekeurige functie van jk + 1 variabelen kan realiseren. Wanneer men start vanuit een BDD-representatie komt men zeer snel tot een realisatie; men legt echter de volgorde van de variabelen vast in elke tak. Men kan echter proberen beter te doen, en het aantal multiplexers te reduceren. De vrijheidsgraad waarover men beschikt is de keuze van de k variabelen die men bij elke multiplexer zal gebruiken voor de decompositie. Door een geschikte keuze kan men er in vele gevallen voor zorgen dat de residufuncties zo snel mogelijk triviaal worden, zodanig dat geen verdere multiplexers nodig zijn voor hun realisatie. Een verdere vrijheidsgraad is uiteraard het gemeenschappelijk gebruik van identieke, niet-triviale residufuncties (het 134

139 netwerk is dan geen boom meer, maar dit is van geen enkel belang). Net zoals bij andere combinatorische minimalisatieproblemen is de zoekruimte ook hier exponentieel: per multiplexer moet men de beste deelverzameling van k variabelen uit de overblijvende variabelen selecteren. Dit probleem werd onderzocht, en door Voith ([Voith77]) werd een systematische methode voorgesteld voor de optimale synthese met behulp van multiplexers. Wij zullen nu deze kort bespreken aan de hand van een voorbeeld. De methode van Voith Als ULM-bouwsteen beschouwen wij een 2-naar-1-multiplexer f(s, x, y) = s x+sy, waarin s de selectie-input is, en x en y de data-inputs. Wanneer een functie gerealiseerd wordt als een multiplexerboom met triviale residufuncties, dan kan men een svp-uitdrukking neerschrijven die de structuur van deze boom weergeeft. Figuur 4.10 toont de realisatie en de svp-vorm van een eenvoudige functie. Karakteristiek aan de svp-vorm is dat de diverse produkten compatibel zijn met elkaar. Hiermee bedoelen wij dat alle termen uit de svp minstens één variabele gemeenschappelijk hebben (de controlevariabele op de wortel van de boom). Wanneer wij deze variabele weglaten, krijgen wij twee residuele svp s, die elk weer een multiplexerboom voorstellen, en dus weer compatibel zijn. Bovendien zal, wanneer de realisatie optimaal is, de diepte van de boom en van elke subboom zo klein mogelijk zijn. Dit betekent dat de termen uit de corresponderende svp zo kort mogelijk moeten zijn (d.w.z., zo weinig mogelijk literals bevatten). Ons doel is dus duidelijk: schrijf de functie als een zo klein mogelijk stel van compatibele kubussen. De methode van Voith zoekt een dergelijk stel produkten. De methode heeft nogal wat gelijkenis met de methode van Quine-McCluskey. In een eerste stap wordt gezocht naar de kortst mogelijke produktvormen, de multiplexerimplicanten, die in aanmerking kunnen komen bij een multiplexersynthese. In een tweede stap zoekt men het grootst mogelijk compatibel stel uit deze produkten, en realiseert men de functie. Als er op dat punt nog niet-triviale residufuncties aanwezig zijn, zal men de methode hierop itereren. Wij zullen de functie realiseren bij wijze van voorbeeld. f(x, y, z, w) = xy z + x yz + zw De multiplexerimplicanten. Schrijf de waarheidstabel van de functie neer, maar geordend volgens gewicht. Achter elke inputcombinatie schrijft men de waarde (0 of 1) die de functie daar aanneemt. Elke regel uit de tabel bestaat dus uit een inputgedeelte I van lengte n, en een outputgedeelte F van lengte 1. Men genereert een tweede tabel, die twee regels met een inputgedeelte op Hamming-afstand 1 combineert tot nieuwe termen. Weze F 1 en F 2 de outputgedeelten van deze regels. Het nieuwe inputgedeelte I wordt bepaald zoals in Quine-McCluskey s tabelmethode. Men vervangt de variabele x i waarin het verschil optreedt door een. Wanneer wij de regel waarin de variabele x i als 0 optreedt regel 1 noemen, voldoet het nieuwe outputgedeelte F aan: F 1, als F 1 = F 2 F = x i, als F 1 = 0 en F 2 = 1 x i, als F 1 = 1 en F 2 = 0 135

140 Deze regels modelleren in feite het laten samenvallen van twee paden in de multiplexerboom. Deze paden worden voorgesteld door de inputgedeelten I 1 en I 2, met de variabele x i helemaal op het eind van het pad. De functie F stelt de functie voor, gerealiseerd door de multiplexer gecontroleerd door x i, en waaraan F 1 resp. F 2 als inputs verbonden worden. De bedoeling is dat de functies F triviale functies blijven. Als dit gebeurt kan de laatste multiplexer (en dus de variabele x i ) wegglaten worden, en de twee paden vervangen door één pad. De tweede tabel kan verder getransformeerd worden in een derde tabel, door verder regels te combineren. Regels zijn nu combineerbaar wanneer de inputgedeelten in ternaire notatie op Hamming-afstand 1 liggen van elkaar, en wanneer de outputgedeelten aanleiding zullen geven tot een nieuwe triviale functie. Hiervoor is nodig dat F 1 = F 2, of dat F 1, F 2 {0, 1}. Men blijft combinaties uitvoeren tot wanneer men niet verder kan. De regels (implicanten) die men niet verder kan combineren noemt men priem. Het resultaat staat weergegeven in figuur 4.8. Maximale Compatibele Implicantverzamelingen. Uit het stel van priemimplicanten zal men nu een zo groot mogelijk stel extraheren dat samen een multiplexerboom kan vormen. De nodige voorwaarde is dat de implicanten compatibel zijn. De definitie van compatibiliteit werd hierboven al gesuggereerd. Wij zullen ze nu concreet formuleren. Definitie 4.17 Het residu van een verzameling produkten die alle een gegeven literal l bevatten, is de originele verzameling produkten, maar waar in elk produkt de literal l werd geschrapt. Definitie 4.18 Een stel produkten is compatibel asa ze alle minstens één gemeenschappelijke variabele bevatten, en de deelverzamelingen produkten die de variabele bevatten in gecomplementeerde resp. niet-gecomplementeerde vorm leeg zijn of compatibele residu s hebben. Met behulp van deze definitie kan men de maximale compatibele verzamelingen van multiplexer-priemimplicanten bepalen. Men begint met de koppels samen te stellen, dan alle compatibele tripels, enz. Figuur 4.9 toont het resultaat van het voorbeeld. De eerste tabel is de representatie van de priemimplicanten uit figuur 4.8, laatste kolom. Functierealisatie. Men vertrekt van een maximale compatibele verzameling. Deze verzameling representeert minstens één multiplexerboom. Wij zullen de opgegeven functie f realiseren met behulp van die multiplexerboom. Daartoe berekenen wij de residu s van de originele functie f op elk van de paden doorheen de boom. Dit gebeurt door Shannondecompositie volgens de variabelen die een pad in de boom vastleggen. Een (liefst zo groot mogelijk) aantal residu s zullen triviaal zijn. Wanneer alle residu s triviaal zijn, is de synthese afgelopen. Wanneer bepaalde residufuncties niet-triviaal zijn moet men de procedure recursief toepassen op deze functies om te komen tot een complete multiplexerrealisatie. In ons voorbeeld, laat ons de eerste verzameling {x z, x z, xy } nemen als maximaal compatibel stel. De gemeenschappelijke variabele is x. De Shannondecompositie op x is f(x, y, z, w) = x (yz + zw) + x(y z + zw) De tweede variabele is z in de tak geselecteerd door x, en y in de andere tak: f(x, y, z, w) = x (z y + zw) + x(y (z + zw) + yzw) = x (z y + zw) + x(y z + yzw) 136

141 Tabel Tabel y z 0-01 y w x z -100 x z x 10-1 z w y z 111- w Tabel y w -0-1 z -10- x 10 z w 1 1 z Figuur 4.8: Het opzoeken van de multiplexer-priemimplicanten 137

142 x z y z x z y w yz xy xz zw yz xw x z,x z x z,xy x z,xz x z,zw x z,yz x z,xw y z,x z y z,yz y z,zw y z,yz x z,yz x z,xy x z,xz x z,xw y w,yz y w,yz yz,xy yz,zw yz,yz xy,yz xz,zw xz,yz x z,x z,xy x z,x z,xz x z,x z,xw x z,xz,zw x z,xz,yz y z,x z,yz y z,yz,zw y z,yz,yz y w,yz,yz yz,xy,yz Figuur 4.9: Het samennemen van produkten in compatibele klassen 138

143 f(x,y,z,w) = xy z + x yz + zw z y x y x 0 1 w z f 0 1 y z f 0 1 y x 0 w 0 z w w Producten: x z y x zw xy z xyzw Producten: z x y zy x w zy x zyw Figuur 4.10: De realisatie van een logische functie door middel van 2-naar-1- multiplexers De residufuncties zijn dus: y voor x z, w voor x z, en z voor xy en zw voor xy. De laatste residufunctie is niet triviaal. Een andere keus is het vijfde stel {yz, xz, x z }. De decompositie volgens dit stel is f(x, y, z, w) = z (x y + x0) + z(y (x + w) + yw) Hier zijn alle residu s triviaal, op x + w na. Figuur 4.10 toont de twee bovenstaande realisaties, waarbij ook de residufuncties verder geëxpandeerd werden. De methode van Voith kan uitgebreid worden tot multiplexers met meer dan één selectie-input. Zij houdt echter geen rekening met gemeenschappelijk gebruik van reeds gerealiseerde deelfuncties, omdat zij enkel zuivere boomstructuren genereert. Deze methode is dus zeker geen globaal optimale methode. In vergelijking met de techniek van factorisatie kunnen wij opmerken dat de multiplexerbouwblokken minder vrijheidsgraden bieden dan de volstrekt vrije functies van de factorisatiemethode. Men kan dus verwachten dat de optimale multiplexerrealisatie minder efficiënt zal zijn dan de oplossing verkregen door factorisatie. Boolese Decisiediagrammen Een minimaal BDD is een functierepresentatie die rechtstreeks aanleiding geeft tot een multiplexerrealisatie van een functie, waarin nu wel reeds gerealiseerde deelfuncties hergebruikt worden in feite wordt elke deelfunctie precies één keer gerealiseerd! Men weet echter dat de complexiteit van een BDD sterk kan afhangen van de ordening van de variabelen; de keuze van een optimale ordening is duidelijk een bezigheid met exponentiële complexiteit (n!). Bovendien is een BDD gestratifieerd, dit wil zeggen dat in elk pad van de wortel naar een blad, de optredende variabelen in dezelfde volgorde voorkomen. Dit is niet het geval in de methode van Voith. Dus opnieuw kan men zeggen dat een op BDD s gebaseerd netwerk geen globaal optimale oplossing zal zijn. 139

144 4.2.6 Spectrale Technieken Spectrale technieken voor de meerniveausynthese van combinatorische netwerken zijn gesteund op lineaire, inverteerbare transformaties van functies, die bijzonder veel formele gelijkenis vertonen met de Fourier-transformatie van reële of complexe functies. In hoofdstuk 2 kwamen twee bruikbare transformaties aan bod: de Hadamard-Walshtransformatie en de Reed-Mullertransformatie. Wij zullen eerst heel bondig enkele eigenschappen van de Hadamard-Walshtransformatie in herinnering brengen. Spectrale Transformaties Wanneer men het domein van een Boolese functie op een gestandaardiseerde manier enumereert, kan men de waarheidstabel van een functie met n variabelen zien als een sequentie met lengte 2 n over {0, 1}. Men kan deze sequentie transformeren op een lineaire, inverteerbare manier in een andere sequentie van dezelfde lengte door haar voor te stellen als een kolommatrix en haar te vermenigvuldigen met een goedgekozen matrix met dimensie 2 n 2 n. De matrixvermenigvuldiging, die bestaat uit vermenigvuldigingen en optellingen, wordt uitgevoerd in een commutatieve ring. Dit vereist o.m. het bestaan van additieve inversen. Men kan de ring van de gehele getallen nemen, of ook het Boolese domein met als additieve operator de exclusieve OF en als multiplicatieve operator de Boolese EN. De Hadamard-Walshtransformatie gebruikt de eerste mogelijkheid, de Reed-Mullertransformatie de tweede. De Hadamard-Walshtransformatie. De Hadamard-Walshmatrix H n van orde n heeft dimensie 2 n 2 n, en bestaat uit de getallen 1 en 1. Hij heeft een recursieve structuur [ ] Hn 1 H n 1 als n > 0, H n = H n 1 H n 1 [1] anders. Deze matrix heeft een aantal interessante eigenschappen. Hij is symmetrisch en niet-singulier, hij is proportioneel met zijn eigen invers met factor 2 n, en zijn rijen en kolommen zijn paarsgewijs orthogonaal. Wanneer men de elementen 1 en 1 als boolese waarden interpreteert, stelt de i-de rij (of kolom) de waarheidstabel voor van de functie b i = j S i x j waarin S i {1, 2,..., n} de plaatsen bevat (variabelenamen) waarin de binaire representatie van i 1 is. De Hadamardtransformatie of spectrum van een functie f F = H n f is een kolomvector van 2 n gehele getallen. Het i-de getal stelt dan de gelijkenis voor met de i-de rij (basisfunctie) uit de matrix. De Hadamardtransformatie heeft een aantal eigenschappen die sterke formele gelijkenis vertonen met de Fouriertransformatie. Zo kan men de volgende convolutiestelling bewijzen. Weze, voor twee natuurlijke getallen i en τ, i τ gedefinieerd als het natuurlijk getal gerepresenteerd door de bitsgewijze exclusieve-of tussen de binaire representaties 140

145 van i en τ. Dan definiëren wij de convolutie of correlatie 6 tussen twee functies f en g van n variabelen als R fg (τ) = f g(τ) = 2 n 1 i=0 f(i)g(i τ). Weze F = Hf en G = Hg de Hadamard-Walshtransformaties van resp. f en g. Dan geldt: of, in componenten uitgeschreven, f = 2 n HF (4.6) g = 2 n HG (4.7) 2 n 1 f(x) = 2 n y=0 2 n 1 g(x) = 2 n y=0 H x,y F (y) (4.8) H x,y G(y) (4.9) Wanneer wij dit in de uitdrukking voor R fg (τ) substitueren vinden wij: R fg (τ) = 2 n 1 i=0 2 n 1 x=0 2 n 1 = 2 n x=0 2 n 1 = 2 n x=0 2 n 1 = 2 n x=0 2 n 1 = 2 n y=0 2 2 n n 1 H i,x F (x) 2 n 1 y=0 2 n 1 y=0 2 n 1 y=0 y=0 2 n 1 F (x)g(y) i=0 2 n 1 H τ,y F (x)g(y) 2 n H i τ,y G(y) (4.10) 2 n H i,x H i τ,y (4.11) i=0 2 n H i,x H i,y (4.12) H τ,y F (x)g(y)2 n 2 n δ x,y (4.13) H τ,y F (y)g(y). (4.14) Hierin hebben wij gebruik gemaakt van de orthogonaliteit van de rijen van H, en van het feit dat H i τ,y = H τ,y H i,y. Dit laatste kan eenvoudig ingezien worden als men gebruik maakt van de betekenis van de rijen van H, en de grootheden i, τ en i τ interpreteert als verzamelingen variabelen. Het blijkt dus dat, net zoals bij de Fouriertransformatie, de correlatie kan berekend worden als een inverse transformatie van een puntsgewijs produkt van getransformeerden. Dit is een zeer nuttige stelling, aangezien de rechtstreekse berekening van de correlatiefunctie O(2 2n ) berekeningen vraagt, terwijl dit via de getransformeerden, mits het gebruik van Fast Fourier-technieken, kan met O(n2 n ) berekeningen. Complexiteit van functies De functie R fg (τ) meet de gelijkenis tussen de ON-set van f en een over τ verschoven versie van g. Wanneer f = g spreken wij over de autocorrelatie R ff (τ) van de functie f. Deze autocorrelatiefunctie heeft een heel bijzondere interpretatie. Voor τ = 0 meet 6 convolutie en correlatie zijn identiek omdat zijn eigen invers is. 141

146 R ff (τ) het gewicht van f (het aantal mintermen). Wanneer wij bovendien τ kiezen als een macht van 2, stelt τ een verschuiving voor over Hamming-afstand 1, en R ff (τ) telt het aantal mintermen gelegen op afstand 1 van een andere minterm in de richting van τ. De binaire representatie voor dergelijke waarde van τ heeft gewicht 1, wat wij noteren als τ = 1. De grootheid G(f) = R ff (τ) τ =1 is een dan maat voor het aantal mintermen die op afstand 1 liggen van een andere minterm, volgens één der basisrichtingen in de n-cubus. Hoe groter G(f), hoe economischer f kan gerealiseerd worden in een som-van-productenvorm, aangezien de ligging van de mintermen de vorming van grote implicanten mogelijk maakt. Voorbeeld 4.14 Beschouw de functie f 1 (x, y, z, w) = x. Deze functie is bijzonder eenvoudig te realiseren. Haar autocorrelatiefunctie wordt gegeven door R f1f 1 (τ) = [8, 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0] t met grote waarden op τ = 0100, 0010, 0001 (binaire representatie). De waarde G(f 1 ) = 24 wijst op een goede implementeerbaardheid. De functie f 2 = x(y z w) daarentegen heeft geen implicanten van dimensie groter dan 0. Haar autocorrelatiefunctie is R f2f 2 (τ) = [4, 0, 0, 4, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0] t en heeft maxima bij τ = 0011, 0101, De waarde G(f 2 ) = 0 wijst op een moeilijke implementeerbaarheid. Lineaire decompositie Zoals het voorbeeld aantoont, kan het zijn dat G(f) niet groot is, maar dat R ff (τ) een grote waarde aanneemt voor waarden van τ die Hamming-afstanden groter dan 1 voorstellen. Dergelijke functies zijn rechtstreeks niet economisch te realiseren, omdat er niet veel grote priemimplicanten kunnen gevonden worden. Stel echter dat wij een soort coördinatentransformatie kunnen toepassen op het domein van de functie f, die neerkomt op een permutatie van de cellen in de Karnaughkaart van f, zodanig dat de mintermen nu in veel grotere clusters gegroepeerd liggen. Denk hierbij een ogenblik aan Rubik s Kubus. Het gebruik van een permutatie zorgt ervoor dat elk punt van het domein bestreken wordt, en dat wij nog steeds de oorspronkelijke functie kunnen realiseren. Het feit dat de nieuwe Karnaughkaart er beter uitziet maakt economischer realisaties mogelijk. Welk soort transformaties leidt tot een permutatie van het definitiedomein? Figuur 4.11 toont hoe het domein van een functie van drie argumenten kan getransformeerd worden, door het gebruik van nieuwe variabelen die exclusieve-of-combinaties zijn van de originele variabelen. Men kan nagaan dat de transformatie die in figuur 4.11 voorgesteld wordt een lineaire transformatie is met betrekking tot de operaties EN en over de coëfficienten {0, 1}: (c 1 x 1 c 2 x 2 ) (c 1 y 1 c 2 y 2 ) = c 1 (x 1 y 1 ) c 2 (x 2 y 2 ). Stel dan dat wij, meer algemeen, voor een gegeven waarde van τ, een lineaire transformatie σ zouden kunnen vinden op de variabelen x = x 1,..., x n, die x afbeeldt op y: y(x) = σx 142

147 x a = x y z y c=z b=y Figuur 4.11: Permutatie van de cellen van een Karnaughkaart door een lineaire transformatie zodanig dat στ in het nieuwe stelsel een verschuiving over Hamming-afstand 1 voorstelt volgens één van de hoofdrichtingen in de y-ruimte. De transformatie σ kan voorgesteld worden door een binaire matrix over {0, 1}, en de matrixvermenigvuldiging maakt gebruik van de EN en de operatie. Dan ligt het punt σ(x τ) = (σx) (στ) op afstand 1 van y = σx. Wij kunnen de transformatie zelfs zo kiezen dat n lineair onafhankelijke vectoren in de x-ruimte τ 1,..., τ n afgebeeld worden op de basisvectoren y 1 y 2... y n van de y-ruimte. De gewenste transformatiematrix σ kan gevonden worden als volgt. Weze de kolommen van de matrix τ gegeven door de n onafhankelijke vectoren τ i, τ = [τ 1 τ 2... τ n ]. Dan is bij constructie [y 1 y 2... y n ] = I = στ, met I de eenheidsmatrix. Hieruit volgt dat σ = τ 1. De inverse bestaat, aangezien de vectoren τ i lineair onafhankelijk verondersteld werden. Met behulp van σ kan de functie f dan gedecomposeerd worden als een samenstelling van de lineaire transformatie σ en een Boolese functie g f(x) = g(y(x)) = g(σx). Wanneer wij de vectoren τ i zodanig kiezen dat i R ff (τ i ) maximaal is, dan zal na transformatie G(g) maximaal worden, en g zal gemakkelijker te realiseren zijn dan de oorspronkelijke f. Het stel vectoren τ i kan gevonden worden als volgt: men kiest als τ 1 een punt (verschillend van 0) waar R ff (x) maximaal is: τ 1 = arg max x 0 R ff (x). Weze L(v 1,..., v n ) de ruimte opgespannen door {v 1,..., v n }, d.w.z L(v 1,..., v n ) = i=1,...,n c i {0,1} c i v i. Dan is en τ 2 = arg max x/ L(τ1 ) R ff (x) τ 3 = arg max x/ L(τ1,τ 2 ) R ff (x) 143

148 enzevoort, dus we kiezen telkens die vector die R ff (x) maximaliseert, en die lineair onafhankelijk is van de reeds gekozen vectoren. De procedure wordt duidelijk aan de hand van de tweede functie uit voorbeeld Als eerste vector τ 1 kunnen wij 3 = 0011 kiezen, en L(3) = {0, 3}. Als tweede vector kiezen wij τ 2 = 5 = 0101, en zetten L(3, 5) = {0, 3, 5, 6}. De twee overige vectoren kunnen nu niet meer gekozen worden op grote waarden van R f2 f 2 (x). Wij kiezen τ 3 = 1, waaruit L(1, 3, 5) = {0, 1, 2, 3, 4, 5, 6, 7}, en τ 4 = 8. Aangezien L(1, 3, 5, 8) = {0, 1,..., 15}, overspannen wij de hele ruimte en zijn onze vectoren lineair onafhankelijk. Wij vinden dan en dus τ = σ = τ 1 = Wanneer wij de coördinaten in de nieuwe ruimte a, b, c, d noemen vinden wij de volgende transformatievergelijkingen:. a = z (4.15) b = y (4.16) c = y z w (4.17) d = x (4.18) De nieuwe functie wordt g 2 (a, b, c, d) = dc, wat eenvoudiger is dan de oorspronkelijke functie f 2 (x, y, z, w) = x(y z w). De realisatie van de functie wordt voorgesteld in figuur De lineaire transformatie σ wordt gerealiseerd door middel van exclusieve- OF-poorten, terwijl de residuele functie h gerealiseerd wordt als een som-van-producten (in dit geval één enkel produkt). Meervoudige functies in kubusvorm De voorgaande uitleg gaat er van uit dat wij maar één functie te realiseren hebben. Bovendien vereist zij de manipulatie van de waarheidstabel, wat voor functies van veel variabelen uitgesloten is. Varma en Trachtenberg [Varma89] hebben een methode voorgesteld om de spectrale techniek rechtstreeks toe te passen op kubusspecificaties van meervoudige functies. De idee is dat wij rechtstreeks schattingen kunnen maken van de plaatsen waar de autocorrelatiefunctie van de opgegeven meervoudige functie maximaal wordt, en dit zonder de berekening van de volledige waarheidstabel of autocorrelatiefunctie. Wanneer wij de definitie van R ff (x) herbekijken R ff (x) = 2 n 1 i=0 f(i)f(i x), dan zien wij dat R ff (x) niet anders is dan het gewicht van de functie f(i)f(i x). Dus wij zullen eerst nagaan hoe wij het gewicht kunnen bepalen van een meervoudige functie die gespecificeerd is door middel van kubussen. 144

149 x a=z 1 z y w c = y z w b=y d=x x y z w x y z w x y z w x y z w f 2 y z w x b a c d f 2 (a) Rechtstreeks (b) Na decompositie Figuur 4.12: Originele realisatie en spectrale decompositie van de functie f 2 uit het voorbeeld Gewichtsbepaling. Wij vertrekken van de representatie gebruikt bij het ESPRESSO-algoritme. Elke regel bestaat uit een inputgedeelte en een outputgedeelte. Het inputgedeelte stelt een binaire kubus voor, met een afmeting gegeven door 2 r, waarin r het aantal vrijheidsgraden van het inputgedeelte is. Het outputgedeelte bevat een 1 voor alle functies waarvan de kubus voorgesteld door het inputgedeelte een implicant is. Definitie 4.19 Het gewicht van een kubus wordt gegeven door het produkt van de afmeting van het inputgedeelte en het gewicht van het outputgedeelte. Definitie 4.20 Het gewicht van de meervoudige functie is de som van de gewichten van de individuele functies. Wij kunnen het gewicht van de meervoudige functie zomaar niet bepalen door de som te nemen van de gewichten van de kubussen. Meestal is het immers zo dat de kubussen niet disjunct zijn voor één of meerdere functies. De mintermen bevat in de intersectie van deze kubussen zouden dubbel (of meer) geteld worden. Geïnspireerd op het inclusie-exclusieprincipe uit de probabiliteitsleer P (A B C) = P (A) + P (B) + P (C) P (A B) P (A C) P (B C) +P (A B C) (4.19) kunnen wij een tot een methode komen om het gewicht te bepalen. Daartoe moeten wij een correctie doorvoeren voor dubbel getelde mintermen. Opdat een minterm dubbel geteld zou kunnen worden moet hij in minstens twee kubussen aanwezig zijn, en dus ook in hun intersectie. 145

150 Definitie 4.21 Twee kubussen zijn disjunct wanneer hun inputgedeelten disjunct zijn (conflicterende coördinaten (0,1) of (1,0) op minstens één positie), of wanneer het resultaat van de bitsgewijze EN-operatie tussen de outputdelen geen 1 meer bevat. Definitie 4.22 De intersectie van de niet-disjuncte kubussen x = (x 1,..., x n ) en y = (y 1,..., y n ) is een kubus z = (z 1,..., z n ) waarvan het outputgedeelte het resultaat is van de bitsgewijze EN tussen de outputgedeelten, en het inputgedeelte op plaats i gegeven wordt door x i, als x i = y i z i = x i, als y i =, anders. y i Gebruikmakend van formule 4.19 en definitie 4.22 kunnen wij nu alle mintermen eenduidig enumereren. Wij bepalen de paarsgewijze intersecties, de intersecties van drietallen, viertallen, enz. De gewichten van de intersecties worden bepaald zoals in definitie 4.19, maar met alternerend teken volgens formule Wanneer wij dubbels tegenkomen laten wij deze weg, maar wij tellen het gewicht van de weggelaten kubus op bij de overblijvende. De algebraïsche som van de gewichten van de zo verkregen gewichten is het gevraagde gewicht van het stel te realiseren functies. Evalueren van de autocorrelatiefunctie. De waarde van de autocorrelatiefunctie in het punt τ is het gewicht van de functie f(x)f(x τ). Wat is echter de representatie van de functie f(x τ)? Om deze te vinden laten wij de translatie τ inwerken op de inputgedeelten van de kubussen in de specificatie van f. Dit gebeurt door de componentsgewijze exclusieve-of te nemen tussen het inputgedeelte en τ, waarbij 1 = 0 = 1 = 0 =. Het produkt f(x)f(x τ) wordt dan berekend door de paarsgewijze intersecties te berekenen van de kubussen in f(x) en f(x τ). Van deze meervoudige functie bepalen wij dan het gewicht met de inclusie-exclusiemethode. Voorbeeld 4.15 Laat ons de voorgaande stappen illustreren met een kort voorbeeld. Weze de meervoudige functie gegeven door f(x) = en weze τ = 1 = Wij vinden en dus f(x (0001)) = f(x)f(x (0001)) = Het gewicht van deze functie wordt bepaald door de lijst f(x)f(x (0001)) =

151 Figuur 4.13: Hazards in combinatorische netwerken waarin wij de algebraïsche gewichten vermeld hebben. Hieruit volgt dat R ff (0001) = = Combinatorische hazards Een combinatorische hazard is een eigenschap van combinatorische netwerken die de mogelijke aanwezigheid van overgangsverschijnselen op de functie-output bij veranderingen van de input aangeeft. Bijvoorbeeld, wanneer een functie de waarde 0 (resp. 1) aanneemt op twee aangrenzende waarden van de inputs (Hamming-afstand 1 van elkaar), kan het zijn dat de output, juist na de verandering van de verschilinputvariabele, kortstondig de waarde 1 (resp. 0) aanneemt. Dit noemt men een statische 0- (resp. 1-) hazard. Statische 1-hazards ontstaan bv. wanneer, in een som-van-produkten realisatie, de 1-output op de twee naburige punten gerealiseerd wordt door verschillende poorten (produkt-termen). Wanneer de verschilinput verandert zal één EN-poort naar 0 gaan, de andere naar 1. Een snelheidsverschil tussen de poorten leidt tot het overgangsverschijnsel. Het netwerk in fig. 4.13a vertoont een statische 1-hazard. Statische 0-hazards hebben een duale definitie. Er bestaan ook dynamische hazards. Een dynamische hazard treedt op wanneer de functiewaarde op twee aangrenzende inputs verschilt, maar de netwerkoutput niet monotoon varieert bij verandering van de input (fig. 4.13b). Noteer dat het netwerk in fig. 4.13b niet in een som-van-produktengedaante is, maar een (deel van een) meerlaagse implementatie. Dynamische hazards kunnen echter ook voorkomen in SVP-netwerken wanneer meer dan twee inputs tegelijk van waarde veranderen. Een belangrijk aspect bij de realisatie van combinatorische schakelingen is het feit of zij al dan niet hazard-vrij moeten zijn bij Hamming-1-transities op hun inputs. Deze eis wordt vaak opgelegd voor combinatorische schakelingen in synchrone automaten met asynchrone inputs (zie paragraaf 7.7), en natuurlijk in asynchrone automaten zelf (zie paragraaf 5.4.2). Hier moeten ROM-structuren met de nodige omzichtigheid gebruikt worden, en moeten wij ook bij poortcircuits of PLA s nakijken of de logische minimalisatie geen aanleiding gegeven heeft tot hazards. Statische hazards moeten opgespoord worden door de combinatorische functies te analyseren. Er bestaan efficiënte methoden gebaseerd op een ternaire analyse (zie o.m. 147

152 [Brzozowski95]). Zo kan men bij de verandering van één enkele input, deze input de waarde φ geven, en alle andere inputs op hun vorige waarde houden. Alle outputs die onder een ternaire interpretatie van het netwerk ook de waarde φ aannemen, kunnen veranderen. Noteer evenwel dat, opdat deze procedure correcte resultaten zou opleveren, men een Boolese vorm die de structuur van het netwerk nog weergeeft moet gebruiken, en niet een geminimaliseerde representatie van dezelfde functie! Wij komen hier wat verder op terug. Combinatorische hazards kunnen verwijderd worden door een zorgvuldig ontwerp van de combinatorische netwerken. Meestal zijn er bijkomende priemimplicanten (ENpoorten) nodig bij de minimale oplossing. Zo levert het gebruik van het optioneel product van twee termen die een hazard veroorzaken, een oplossing (ga dit na door een ternaire analyse). In het geval van figuur 4.13(a) zal de statische hazard weggewerkt worden door inclusie van de term UV, het optioneel product van X U en XV. De inclusie van dit product verandert de functie gerealiseerd door het netwerk niet, en zoals zoëven opgemerkt, zou de minimale represenatie van de functie niet de aanwezigheid van de extra term weergeven. Men kan bewijzen dat het gebruik van de complete som in plaats van een minimale som steeds hazardvrije schakelingen oplevert, althans voor hamming-1 inputveranderingen. In beperkte mate kan men zelfs voor andere inputveranderingen het circuit hazardvrij maken. Meestal vereist dit het afstappen van de optimale realisatie van het combinatorisch netwerk; dit kan uiteraard zeer oneconomisch zijn. Voor een systematische behandeling van de bouw van hazardvrije combinatorische netwerken verwijzen wij naar de literatuur (o.a. naar [Birtwistle95]). 4.4 Opgaven 1. Gegeven de functie van vier variabelen f(x, y, z, w) = x w + xy z + xzw + xz w + xyzw, (a) teken het geminimaliseerd BDD van deze functie (variabelen in opgegeven volgorde); (b) bepaal een minimale SVP-realisatie met de tabelmethode van McCluskey. (c) Teken het resulterend poortnetwerk. 2. Gegeven de functie van vier variabelen f(x, y, z, w) = x wy + xy z + y zw + xyw + x yz + x y w (a) teken het geminimaliseerd BDD van deze functie (variabelen in opgegeven volgorde); (b) minimaliseer de Boolese vorm op algebraïsche wijze (Zissos) (c) complementeer de minimale vorm en minimaliseer opnieuw met de algebraïsche methode (d) zoek met de tabelmethode de complete som van de originele functie (Quine- McCluskey). Duid de essentiële priemimplicanten aan. 3. Doe voor de onderstaande netwerken in figuur 4.14 het volgende: 148

153 Figuur 4.14: Twee combinatorische netwerken Figuur 4.15: Een derde combinatorisch netwerk Zoek de functie gerealiseerd door het netwerk; schrijf deze functie in de DSV; Minimaliseer de functie dmv. de algebraïsche methode en teken het resulterend netwerk. 4. Zoek de functie gerealiseerd door het netwerk in fig Zoek een minimale realisatie (ook als taknetwerk). 5. Minimaliseer met behulp van Karnaughkaarten : T (A, B, C, D, E) = (1, 2, 4, 5, 9, 10, 11, 15, 16, 18, 19, 21, 22, 25, 27, 31) 149

154 DON T CARE = (0, 8, 13, 17, 24, 26, 29) 6. Beschouw de volgende uitspraken: Victor drinkt nooit; Gustaaf drinkt als en slechts als Victor én Louis aanwezig zijn; Jean-Pierre drinkt altijd - zelfs wanneer hij alleen is; Louis drinkt als en slechts als Victor er niet is. Als A Victors aanwezigheid voorstelt in de bar, B Gustaafs aanwezigheid, C Jean- Pierre s en D Louis, stel dan de minimale (som van producten) Boolese vorm op voor de functie die 1 is van zodra 1 of meerdere personen drinken in de bar, en dit door gebruik te maken van een karnaughkaart. 7. Hoeveel termen kan een minimale som van producten maximaal bevatten voor een functie van n inputs? Bestaan er functies die het door u opgeven maximum effectief halen? Zo ja, welke? (a) Teken het taknetwerk voor één zo n functie met 3 inputs x 1, x 2, x 3. Vereenvoudig dit netwerk zoveel mogelijk door het samennemen van schakelaars. (b) Teken hetzelfde taknetwerk van hierboven opnieuw, maar waarbij u aan x 2 een constante waarde toekent. Vereenvoudig opnieuw dit netwerk. Leid door vergelijking van beide netwerken de structuur van een taknetwerk met n inputs af. (c) Geef een dagdagelijkse toepassing voor zo een taknetwerk. 8. Beschouw het taknetwerk in figuur bepaal de functie f(x 0, x 1,..., x n ) gerealiseerd door dit netwerk. (hint: probeer de functie te schrijven als een matrixproduct f = A i B ic. Inspireer u op de connectiematrix.) realiseer f onder een minimale som-van-productenvorm, nog steeds als een taknetwerk. Hoe snel groeit het aantal schakelaars in uw realisatie, en hoe snel is dit in het oorspronkelijke netwerk? Verklaar. realiseer f als een minimaal som-van-producten poortnetwerk. Hoe groeit het aantal poorten met n? zoek een andere realisatie van f met OF-poorten, EN-poorten, en invertoren, waarin het aantal poorten slechts lineair stijgt met n 9. Bepaal de minimale som met behulp van de tabelmethode, voor de functie f(a, B) = 1 A B waarbij A en B 2-bits binaire representaties van natuurlijke getallen voorstellen. Teken de realisatie met poorten. 150

155 Figuur 4.16: Een niet som-van-producten taknetwerk 10. De Gray-code van lengte n is een afstand-1 binaire encodering van de gehele getallen tussen 0 en 2 n 1. Laat Gray(n, x) de encodering voorstellen van een geheel getal x, gedefinieerd als volgt: Gray(1, 0) = 0; Gray(1, 1) = { 1; 0Gray(n 1, x), als x < 2 n 1 Gray(n, x) = 1Gray(n 1, 2 n 1 x), anders. Stel de tabel op voor n = 3 die de getallen 0, 1,..., 7 representeert; Ontwerp een combinatorisch netwerk dat Gray(3, x) berekent, wanneer x aangeboden wordt in de standaard, gewogen binaire representatie. 11. Bepaal de Reed-Müllerrepresentatie van de functie f(x, y, z) = z(y + x ) + xy z. 12. Beschouw de volgende Boolese vorm: f(x, y, z, u) = xy u + x u z + x yz u + yzu + x y zu. (a) Minimaliseer deze vorm met de algebraïsche methode. (b) Verifieer uw resultaat d.m.v. een Karnaugh-kaart. (c) Teken een minimaal twee-niveaupoortcircuit dat deze functie realiseert. (d) Zoek de Reed-Müller expansie van de vorm. 13. Realiseer met poorten, en in minimale som-van-produkten vorm, een modulo-3 opteller, d. w. z. een circuit dat de volgende functies berekent: met X, Y {0, 1, 2}. S(X, Y ) = (X + Y ) mod 3 { 1, X + Y 3 C(X, Y ) = 0, anders 14. Vind een niet-redundante som van priemimplicanten voor de functie f(x, y, z, w) gegeven door { } ON f =, DC f =

156 Gebruik de topologische methode. 15. Zoek een niet-redundante som van de functie { ON = DC = met behulp van de topologische methode. 16. Minimaliseer en realiseer als poortnetwerk } T (A, B, C, D) = (0, 1, 5, 7, 8, 9, 12, 14, 15) met DC(3, 11, 13) 17. Realiseer gezamenlijk in minimale vorm, en als poortnetwerk: f 1 (w, x, y, z) = (1, 4, 5, 7, 13) met DC(3, 6) f 2 (w, x, y, z) = (3, 5, 7) met DC(6) f 3 (w, x, y, z) = (3, 4, 11, 13, 15) met DC(9, 14) 18. Minimaliseer met behulp van de tabelmethode Teken het resulterend netwerk. f 1 (x, y, z, w) = (4, 5, 6, 12) + DC(7, 14) f 2 (x, y, z, w) = (5, 9, 13, 15) + DC(7, 11) 19. Minimaliseer en realiseer onderstaande functie. Gebruik de topologische methode, en beoordeel de efficiëntie van de methode. f(x, y, z, w) = X W + XY W + XY Z W DC = XY Z + XY Z W + X Y Z W 20. Realiseer als een minimale som-van-producten poortschakeling, een twee-bit opteller, d.w.z. een circuit dat de volgende functies berekent: S(X, Y ) = (X + Y ) mod 4 { 1, X + Y 4 C(X, Y ) = 0, anders met X, Y {0, 1, 2, 3}. Gebruik de tabelmethode. 21. Bepaal de Reed-Mullerrepresentatie van de functies S 1, S 2, C in de vorige oefening. 22. Realiseer de schakeling opnieuw, maar dan enkel met 2-input exclusieve-ofpoorten en n-input AND-poorten. Baseer u op de Reed-Mullerrepresentatie. 23. Men wil een twee-bitvermenigvuldiger maken, een combinatorische component met vier inputs (X 1, X 2 ) en (Y 1, Y 2 ), en vier outputs (Z 1, Z 2, Z 3, Z 4 ). Deze bitrijen zijn de voorstelling van natuurlijke getallen x {0,..., 3}, resp. y {0,..., 3} en z {0,..., 15}, waarbij z = xy (meestbeduidend bit heeft laagste index). Leid een optimale twee-niveaurealisatie af van deze schakeling. 152

157 Hoofdstuk 5 Analyse van Sequentiële Netwerken In hoofdstuk 2 hebben wij de klasse van combinatorische netwerken geïdentificeerd als de klasse van poort- of taknetwerken zonder terugkoppelingen. De kenmerkende eigenschappen van deze netwerken is dat ze alle kunnen beschreven worden door een Boolese functie. Deze eigenschap is het gevolg van de afwezigheid van terugkoppelingen in schakelnetwerken. Wij zullen eerst een korte analyse maken van terugkoppelingen en zien hoe deze het gedrag van een netwerk wezenlijk kunnen veranderen. Nadien zullen wij methoden bespreken waarmee het gedrag van bestaande netwerken met terugkoppelingen kan bepaald worden, alsook de problemen die hierbij soms optreden. 5.1 Terugkoppelingen in schakelnetwerken In poortnetwerken ontstaat terugkoppeling door het gebruiken van een poortoutput als input van een stroomopwaarts gelegen poort (fig. 5.1). Het gevolg van deze terugkoppeling is dat het gedrag van de schakeling (d.i., de Boolese waarde van de output Y ) niet noodzakelijk nog langer geschreven kan worden door een Boolese functie van de inputs. Inderdaad, een korte analyse leert dat, in de schakeling van fig. 5.1, zowel de waarde Y = 1 als Y = 0 kan voorkomen wanneer X 1 = 0 en X 2 = 0. Het circuit heeft twee toestanden. De huidige toestand is een vorm van geheugen: de waarde van Y geeft aan welke van beide inputs als laatste de waarde 1 aannam. Indien Y = 1 was dit X 1 ; in het ander geval X 2. Terugkoppelingen in taknetwerken zijn iets complexer: een terugkoppeling moet altijd gebeuren van een netwerkoutput naar een controle-input. Fig. 5.2 toont een teruggekoppeld taknetwerk gelijkaardig aan het poortnetwerk van fig Twee stabiele toestanden Figuur 5.1: Een teruggekoppeld poortnetwerk 153

158 Figuur 5.2: Een teruggekoppeld taknetwerk. Noteer dat een externe stroombron nodig is om de functiewaarde (contact maken of niet) om te vormen naar argumentwaarden (stroom of geen stroom). Figuur 5.3: Een niet-toelaatbare vorm van terugkoppeling. Afhankelijk van de concrete implementatie kan dit circuit diverse gedragingen vertonen; deze kunnen alleen gevonden worden door een analyse op circuitniveau. zijn mogelijk met X 1 = 0 en X 2 = 0 (de schakelaars met opschrift X 1 en X 2 zijn gesloten). De output Y is 1 (het pad van Y in naar Y out is gesloten) wanneer de input X 1 als laatste gelijk aan 1 was (contact X 1 als laatste open). Het is best mogelijk dat een teruggekoppeld schakelnetwerk zich, voor een gegeven stel waarden van sommige inputs, toch combinatorisch gaat gedragen voor de andere inputs. Zo realiseert het netwerk in beide voorbeelden een combinatorische functie van X 2 als X 1 = 1. In tegenstelling met combinatorische netwerken waar elk netwerk een Boolese functie realiseert, zal echter niet elk teruggekoppeld netwerk kunnen beschreven worden door een eindig aantal stabiele toestanden waarin alle poorten of schakelaars Boolese functies voorstellen. Analyseer inderdaad figuur 5.3. Wanneer X = 0 dan is Y = 1. Echter, wanneer X = 1 dan bestaat er in de Boolese algebra geen waarde voor Y die voldoet aan de netwerkvergelijking Y = (XY ) = X + Y = Y Deze vergelijking is, zoals men ziet, strijdig en heeft geen oplossing in B. Dit betekent dat men het gedrag van dit netwerk niet kan beschrijven met de formalismen van de schakelalgebra. Het werkelijk fysisch gedrag van een dergelijk netwerk is, afhankelijk van de technologie, ofwel oscillerend tussen elektrische waarden die de Boolese waarden 0 en 1 voorstellen, ofwel stabiel, maar dan met elektrische waarden die geen der beide Boolese waarden voorstellen. 154

159 + 0 φ φ 1 φ φ φ φ φ 0 φ φ 1 0 φ φ φ 1 0 Figuur 5.4: De ternaire uitbreiding van de Boolese operatoren. Naargelang van de situatie kan φ diverse betekenissen hebben, zoals ongeldig, instabiel,... Men kan het Boolese, binaire model uitbreiden tot een ternair model, waarin men de fenomenen van ongeldige of onstabiele signalen kan representeren. In plaats van zich tot de symboolwaarden {0, 1} te beperken, gebruikt men de waarden in {0, φ, 1}, waarin φ ongeldige of onstabiele waarden voorstelt. Het gedrag van de elementaire poortfuncties wordt dan uitgebreid tot de ternaire waarden, als in figuur 5.4. Men kan aldus de Boole-algebra uitbreiden tot een ternair systeem, waarin een aantal eigenschappen (bv. commutatitiviteit, associativiteit, distributiviteit) blijven gelden. Enkele eigenschappen vervallen echter, o.m. de eigenschappen XX = 0 en X + X = 1. (Ga dit na op de bovenstaande definities van + en, voor de waarde φ.) Het ternair systeem is dus niet langer een Boole-algebra. Met een uitbreiding van de interpretatieregels, kan men ternaire functies blijven voorstellen d.m.v. Boolese vormen; alleen moet men opletten dat men zich bij reductie van een vorm beperkt tot de toegelaten reductieregels. Diverse problemen die wij zullen tegenkomen in dit hoofdstuk kunnen elegant behandeld worden door middel van ternaire methoden. Zo kan men bv. zien dat het pathologisch circuit van figuur 5.3 wel degelijk de oplossing φ heeft in het ternair systeem. Deze inleidende cursus is echter te beperkt om ternaire modellen in het nodige detail te behandelen, en wij verwijzen de geïnteresseerde lezer hiervoor naar de literatuur ([Brzozowski95]). 5.2 Het wiskundig model van sequentiële netwerken Het wiskundig model van een combinatorisch netwerk is een Boolese functie. Dit model is tijdsloos, d.w.z. het verband tussen de inputs en de output van een netwerk is vast en onveranderlijk in de tijd. Dit wil natuurlijk niet zeggen dat het fysiek netwerk oneindig snel is: elk reëel circuit heeft een eindige vertragingstijd. De tijdsloosheid van het model wil enkel zeggen dat, na een circuitafhankelijke vertragingstijd en eventueel een overgangsverschijnsel (zoals hazards), de Boolese waarde op de outputs overeenstemt met de corresponderende functiewaarde. Dit tijds- of evolutieloze karakter is niet langer aanwezig in teruggekoppelde schakelnetwerken. Zoals blijkt uit het voorbeeld in fig. 5.1 is de output van het circuit op een gegeven ogenblik niet enkel afhankelijk van huidige inputwaarden: het circuit heeft geheugen. Deze geheugenwerking kan worden gekarakteriseerd door de inwendige toestand van het netwerk. De inwendige toestand van een netwerk wordt voorgesteld door de Boolese waarden corresponderend met de elektrische grootheden in de knopen van het netwerk. Een eindig netwerk kan zich dan ook maar in een eindig aantal toestanden S 155

160 bevinden. De hele voorgeschiedenis 1 van het netwerk ligt vervat in deze toestand. In een goed gebouwd netwerk zal de toestand op voorspelbare (deterministische) wijze evolueren bij het veranderen van de inputs. Bovendien is de output op elk ogenblik enkel afhankelijk van de huidige toestand van het netwerk en de huidige inputs. Dit betekent dat wij de hele werking van een teruggekoppeld schakelnetwerk kunnen beschrijven door twee functies: de toestandsfunctie en de outputfunctie. Laat ons de inwendige toestand van het netwerk voorstellen door s S, waarin S de eindige verzameling van inwendige toestanden is. Definitie 5.1 De totale-toestandsruimte van een sequentieel netwerk met n inputs en inwendige toestanden S is de verzameling S {0, 1} n, alle combinaties van de inwendige toestanden en de inputwaarden. Definitie 5.2 De toestandsfunctie f s van een sequentieel netwerk met n inputs en m outputs is een eindige functie van de totale toestand f s : S {0, 1} n S De outputfunctie f u van dit netwerk is eveneens een eindige functie van de totale toestand f u : S {0, 1} n {0, 1} m De toestandsfunctie f s bepaalt de toestand waarheen het netwerk evolueert vanuit de huidige toestand wanneer een gegeven input wordt aangelegd. De outputfunctie f u beschrijft de Boolese waarden op de m outputs van het netwerk wanneer dit zich in een gegeven toestand bevindt, en wanneer een gegeven input wordt aangelegd. Een totale toestand (X, s) S {0, 1} n heet stabiel wanneer s = f s (s, X). Noteer dat het ogenblik waarop de transitie naar de volgende toestand wordt uitgevoerd niet bepaald wordt door de functies f s en f u. Dit ogenblik wordt bepaald door de aard van de geheugens in het netwerk. Dit onderscheid bespreken wij verder. Men kan de sequentiële netwerken verder opdelen op basis van hun outputfunctie f u. Een sequentieel netwerk realiseert een MOORE-automaat wanneer de output niet afhangt van de huidige inputs, maar enkel van de huidige toestand. Netwerken waarin de output, volgens definitie 5.2, werkelijk afhangt van de huidige inputs noemt men MEALY-automaten. De beschrijving van het netwerkgedrag door middel van de functies f s en f u vereist het gebruik van de inwendige toestand. De toestand van een netwerk is echter niet steeds rechtstreeks af te lezen op de outputs van het netwerk. Wanneer men, bij een beschrijving, geen gebruik wil maken van de inwendige toestand, kan het gedrag van het netwerk enkel gekenmerkt worden door het opgeven van inputsequenties en de door het netwerk gegenereerde outputsequenties, in de onderstelling dat het netwerk zich vóór het aanleggen van de inputsequenties bevindt in een gekende toestand. Het volledig gedrag van een eindig netwerk kan steeds gekenmerkt worden door de outputsequentie corresponderend met één eindige goed gekozen inputsequentie, op voorwaarde dat men een bovengrens op het aantal toestanden kent [Hennie68]. Deze inputsequentie noemt men een 1 Althans, dat wat men er kan van onthouden. 156

161 identificatiesequentie voor de machine. Hoewel deze sequentie eindig is, kan ze zeer lang worden wanneer het aantal toestanden groot is. De gedragsspecificatie aan de hand van de functies f u en f s is incrementeel, en bijgevolg veel efficiënter. Opmerking. Men kan het gedrag van een automaat ook karakteriseren aan de hand van een eindig aantal verzamelingen inputsequenties. Elk van deze verzamelingen komt overeen met een toestand van de automaat, en bevat alle inputsequenties die leiden van de begintoestand tot de beschouwde toestand. Deze verzamelingen noemt men regulier, en zij kunnen voorgesteld worden door algebraïsche vormen, die men reguliere uitdrukkingen noemt. 2 Men kan op een systematische manier de reguliere uitdrukkingen afleiden die een automaat kenmerken, en men kan ook, uitgaande van een reguliere uitdrukking op systematische manier een automaat afleiden die met deze uitdrukkingen overeenkomt. Andermaal zullen wij, wegens de beperkingen van deze cursus, hierop niet ingaan. 5.3 Analyse van poortnetwerken met terugkoppelingen De analyse van sequentiële netwerken heeft tot doel de functies f u en f s te vinden, om alzo het gedrag van het netwerk op een compacte en gemakkelijk toegankelijke manier voor te stellen. De meest-primitieve sequentiële netwerken zijn de teruggekoppelde poortnetwerken. Bij deze netwerken stelt zich het probleem een aantal knooppunten van het netwerk aan te wijzen waarvan de Boolese waarden de inwendige toestand voorstellen. Deze selectie kan gebeuren door het doorknippen van takken. Met elke tak die wij knippen associëren wij twee letters: een kleine letter stroomopwaarts van de knipplaats, de corresponderende hoofdletter stroomafwaarts. De hoofdletters worden beschouwd als bijkomende circuitinputs, de kleine letters als outputs. Men knipt zolang takken door tot wanneer alle outputs kunnen geschreven worden als combinatorische functies van de inputs. Het verdient zeer sterk de voorkeur de knipplaatsen zo te kiezen dat een minimaal aantal plaatsen volstaat om het netwerk combinatorisch te maken. In figuur 5.5 geven wij twee voorbeelden van hoe netwerken kunnen geknipt worden, en van de resulterende Boolese functies. Noteer dat in de vereenvoudigde Boolese vormen de topologie van de poortnetwerken niet langer terug te vinden is. Men kan uit deze uitdrukkingen dus helemaal geen uitspraken doen over mogelijke dynamische aspecten van het gedrag van de poortnetwerken, die bv. het gevolg zijn van de poortvertragingen. Zoals wij verder zullen zien is het dynamisch gedrag van de netwerken nochtans van essentieel belang. Wanneer men wel ervoor wil zorgen dat de informatie over mogelijk dynamisch gedrag en overgangsverschijnselen niet verloren gaat, dan moet men zich beperken in de vereenvoudigingen die men toepast op de Boolese uitdrukkingen die de netwerken voorstellen. Ruwweg komt het er op neer dat een signaal X zelfs hetzelfde logisch signaal op twee verschillende plaatsen 1 en 2 aanzien dient te worden als verschillend. Dus de uitdrukkingen X 1 + X 2 of X 1 X 2 kunnen niet zonder meer herleid worden tot X! De reden hiervoor is dat de vertragingstijden, die verantwoordelijk zijn voor het gedetailleerd dynamisch gedrag van het netwerk, kunnen verschillen van plaats tot plaats. Deze vertragingstijden kunnen het gevolg zijn van de gebruikte poorten, van de interconnectie tussen de poorten, of van beide. 2 Zie cursus Discrete systemen 157

162 y 1 = (X 2 + (X 1 + Y 1 ) ) = X 2 (X 1 + Y 1 ) = X 2 Y 1 + X 2 X 1 a = (C(A(BD) ) ) = C + AB + AD b = (CA(BD) ) = C + BD + A e = (A(BE) ) = A + BE Q 1 = E Q 2 = B + E Figuur 5.5: Knippen in teruggekoppelde poortnetwerken. Knipplaatsen worden zo gekozen dat men de vergelijkingen acyclisch maakt met een minimum aantal sneden 158

163 X 1 X Y 1 : y 1 CD ABE : abe Figuur 5.6: De transitietabellen van de netwerken in fig 5.5. De knipplaatsen stellen de toestandsvariabelen voor. Indien op n plaatsen geknipt werd betekent dit dat het netwerk maximaal 2 n inwendige toestanden kan hebben. Na het bepalen van de knipplaatsen stellen wij de netwerkfuncties voor in een transitietabel. De kolommen van deze tabel stellen de inputs voor, de rijen de inwendige toestanden van het netwerk (grote letters). De elementen van de tabel zijn de nieuwe waarden van de inwendige toestandsvariabelen (kleine letters), en de netwerkoutputs. De gelijkheid van de Boolese waarden vóór en achter een knipplaats in een taknetwerk betekent dat men deze tak terug mag sluiten zonder dat er verandering optreedt in het netwerk. Kan men dit doen voor alle knipplaatsen dan heeft men een stabiele interne toestand gevonden. In fig. 5.6 werden de transitietabellen voor de voorbeelden uit fig. 5.5 weergegeven; de stabiele interne toestanden werden onderstreept. Opdat een transitietabel een sequentieel netwerk voor zou stellen, moet er minstens één kolom in de tabel meer dan 1 stabiele toestand hebben, en alle kolommen minstens 1. De werking van het netwerk kan in principe worden afgeleid uit de tabel. Men maakt de afspraak dat men slechts 1 inputvariabele per keer wijzigt (de SIC-hypothese, Single Input Change), en dat tussen twee wijzigingen het netwerk de kans krijgt een stabiele toestand te bereiken (indien deze bestaat!). Dit is de werking in z.g. fundamentele mode. De informatie vervat in de transitietabellen kan ook als transitiegraaf of transitiediagram voorgesteld worden (figuur 5.7). Men bouwt een graaf op, waarvan de knopen totale toestanden voorstellen, en de takken de transities tussen de toestanden. Het opschrift bij een tak is de gebeurtenis die de transitie veroorzaakt. Men neemt alleen de uit de begintoestand bereikbare toestanden op, men beschouwt alleen Hamming-1 overgangen aan de inputs, en men bedrijft het circuit in fundamentele mode. Zoals men kan zien, gebeuren sommige transities spontaan (uit de instabiele toestanden). Deze werden gemerkt met een Λ. Tijdens deze overgangen moeten de inputs constant gehouden worden (fundamentele mode). Uit een transitiediagram kan men gemakkelijker het antwoord van het systeem op een bepaalde inputsequentie afleiden. 159

164 Figuur 5.7: De transitiediagrammen afgeleid uit de transitietabellen. Notatie voor de toestanden: X1X2.Y resp. CD.ABE 160

165 5.4 Afwijkingen van het voorspeld gedrag Er bestaat jammer genoeg helemaal geen garantie dat het gedrag dan men zou kunnen aflezen uit de verkregen tabel inderdaad overeenstemt met het werkelijk geobserveerd gedrag in het circuit. Diverse effecten liggen aan de basis van deze mogelijke discrepantie Races en meervoudige overgangen In de tabellen van fig. 5.6 is het zo dat nieuwe toestanden die men met hamming-1- overgangen op de inputs kan bereiken uit stabiele interne toestanden, in hoogstens één symbool verschillen van de stabiele toestand. Dit is uiteraard het gevolg van de particuliere opbouw van het bestudeerde netwerk. In het algemeen is dit niet zo, en vertoont het netwerk een race: twee of meer interne toestandsvariabelen moeten tegelijkertijd veranderen van waarde. Afhankelijk van de werkelijke waarden van de poortvertragingstijden, zullen de overgangen echter (met zeer kleine waarschijnlijkheid) gelijktijdig gebeuren, of in één of andere sequentiële volgorde. Wanneer de variabelen niet simultaan moeten veranderen, maar één per één via een pad van onstabiele toestanden, spreken wij over een meervoudige overgang. Zo is, in fig. 5.7, de overgang van onder C+ naar via en een meervoudige overgang, maar geen race. Bij een race kan het voorkomen dat, op één der paden naar de eindtoestand, men verzeilt in een stabiele toestand die niet voorkomt in een ander pad van deze race. Op dit ogenblik is het gedrag van het netwerk afhankelijk van de wijze waarop de race verloopt, en dus van technologie en de implementatiedetails van het netwerk. De race heet dan kritisch. Wanneer kritische races voorkomen kan men het werkelijk gedrag van een netwerk uitgaand van de transitietabel niet voorspellen zonder een bijkomende tijdsanalyse van de combinatorische functies (de individuele poorten en de verbindingen) in het opgeknipte netwerk Combinatorische hazards Een andere oorzaak van mogelijke afwijkingen tussen het werkelijke gedrag van een sequentieel netwerk en het gedrag dat zou volgen uit de transitietabel is de aanwezigheid van hazards (zie paragraaf 4.3). Zoals gezegd is een hazard een eigenschap van combinatorische netwerken die de mogelijke aanwezigheid van overgangsverschijnselen op de functie-output bij veranderingen van de input aangeeft. Bijvoorbeeld, wanneer een functie de waarde 0 (resp. 1) aanneemt op twee aangrenzende waarden van de inputs (Hamming-afstand 1 van elkaar, de SIC-hypothese), kan het zijn dat de output, juist na de verandering van de verschilinputvariabele, kortstondig de waarde 1 (resp. 0) aanneemt. Aangezien de aanwezigheid van hazards niet af te lezen is uit de toestandstransitietabel, kunnen zij niet-voorspelbare toestandstransities veroorzaken in teruggekoppelde poortnetwerken. Wanneer op één van deze paden een niet-gewenste stabiele toestand voorkomt kan het netwerk verkeerd functioneren, net zoals bij een kritische race. Combinatorische hazards bij SIC-werking kunnen verwijderd worden door een zorgvuldig ontwerp van de combinatorische netwerken. Meestal zijn er bijkomende priemimplicanten (EN-poorten) nodig bij de minimale oplossing. Zo levert het gebruik van het 161

166 y 1 = C Y 2 + CY 1 y 2 = C Y 2 + CY 1 2Y 1 C 0 1 Y 1 Y y 1 y 2 Figuur 5.8: Een netwerk met een essentiële hazard. optioneel product van twee termen die een hazard veroorzaken, een oplossing Essentiële hazards Naast de verwijderbare hazards, afkomstig van de combinatorische netwerken, is er ook een vorm van hazard die louter in sequentiële netwerken met minstens twee terugkoppellussen bestaat. Men noemt ze essentiële hazards. Op fig. 5.8 werd een netwerk met een essentiële hazard voorgesteld. De normale werking volgt uit de transitietabel. Wanneer de input verandert, doorloopt het netwerk de stabiele toestanden C.Y1Y2: Er zijn geen races, geen meervoudige overgangen en ook geen werkzame combinatorische hazards. Noteer dat poort 4 redundant is en enkel dient om een statische hazard te verwijderen (welke?). 162

167 Wanneer wij echter de vertragingstijd van invertor 7 laten toenemen gebeurt het volgende. Veronderstel dat we in toestand 00 zijn. Bij een stijgflank op C zal de output van poort 3 op 1 komen, en dan Y 2. Normaal zou dit moeten leiden naar de toestand 01. Wanneer echter invertor 7 zeer traag is, zal C niet op 0 gekomen zijn vóór de stijgflank op Y 2 gevoeld wordt aan poort 1. Als gevolg wordt ook Y 1 gezet, en de toestand 01 treedt niet langer op als stabiele toestand. Evenmin is 11 stabiel met C = 1. Na een stijgflank op C vinden wij dus De essentiële hazard komt dus voort uit een looptijdsverschil tussen de invertor 7 en de poorten 3 en 6, en is in feite een race tussen een netwerkinput (C), en een interne toestandsveranderlijke (Y 2 ). De essentiële hazard zit dus ingebouwd in de logische structuur van het netwerk: het netwerk werk alleen maar bewijsbaar correct als men bijkomende restricties oplegt aan de vertraging van de individuele bouwstenen. Correcte werking veronderstelt immers dat inputsignalen aanwezig zijn vóór de gewijzigde toestand voelbaar wordt. Dit zou men in dit geval kunnen bereiken door het invoeren van extra vertraging in de terugkoppellussen, die ervoor zorgt dat overal eerst inderdaad de inputwijzigingen waargenomen worden, en pas later de toestandsveranderingen die er het gevolg van zijn Ternaire analyse Zowel statische hazards als essentiële hazards in teruggekoppelde poortnetwerken kan men vinden door een ternaire analyse, zonder dat men de preciese vertragingstijden van de poorten of de interconnectie moet kennen. In feite zijn de resultaten van de analyse onafhankelijk van de vertragingstijden, en daardoor natuurlijk pessimistisch. De analyses gebeuren op de niet-vereenvoudigde Boolese vormen van de netwerken. Statische hazards in een combinatorisch netwerk als gevolg van één enkele inputverandering kunnen gedetecteerd worden door het netwerk ternair te simuleren, waarbij aan de veranderende input het symbool φ aangelegd wordt. Alle outputs die de waarde φ aannemen kunnen veranderen, zelfs wanneer de uiteindelijke waarde niet verschilt van de beginwaarde. Toegepast op het netwerk in figuur 4.13a vinden wij de vergelijking Y = UX + V X. Wanneer wij de inputs X = φ, U = 1 en V = 1 aanleggen, dan Y = 1 φ+1 φ = φ, volgens de ternaire rekenregels uit figuur 5.4. Wanneer wij in hetzelfde netwerk echter het optioneel product UV opnemen, dan wordt dit Y = 1 φ+1 φ+1 1 = 1 Men kan de ternaire analyse ook gebruiken om essentiële hazards op te sporen in het teruggekoppeld netwerk. Dit gebeurt in twee fasen: 1. Men vertrekt uit een stabiele toestand, en legt φ aan de input die men wil doen omslaan. Men berekent de nieuwe toestandsgrootheden, waarvan er sommige de waarde φ kunnen aannemen. Indien er geen zijn, dan zal het netwerk niet reageren op de aangelegde inputverandering. Indien er meerdere zijn, kan dit leiden tot een probleem, omdat het netwerk een race vertoont ofwel een statische hazard in een van zijn combinatorische netwerken. Men legt deze nieuwe waarden opnieuw aan de combinatorische netwerken aan, en blijft dit herhalen tot geen verandering meer optreedt. Men kan aantonen dat deze procedure inderdaad een dekpunt bereikt: het aantal φ-waarden kan immers alleen maar toenemen. Het resultaat van deze eerste stap is dat mogelijks een aantal toestandsgrootheden de waarde φ aangenomen hebben. Dit betekent dat deze signalen inderdaad een verandering kunnen 163

168 Figuur 5.9: Een generiek beeld van een teruggekoppeld circuit tonen in het reëel circuit onder bepaalde veronderstellingen van de vertragingstijden. 2. Men legt de finale waarde aan de veranderende input aan (d.w.z. men vervangt de φ door de finale waarde). Opnieuw rekent men de veranderingen van de toestandsgrootheden door, en men verkijgt na verloop van tijd weer een stabiel resultaat. Het aantal φ-waarden neemt immers monotoon af. Wanneer er echter nog φ-waarden overblijven, dan betekent dit dat de eindwaarde van dat signaal afhankelijk kan zijn van de preciese vertragingen in het netwerk Een korte samenvatting Tot slot van onze korte analyse van onvoorspeld gedrag refereren wij naar figuur 5.9. Uit deze figuur wordt het duidelijk dat wanneer aan de volgende voorwaarden is voldaan, het afgebeelde circuit zich zal gedragen zoals voorspeld door de resultaten van de analyse: De inputs mogen maar één per één veranderd worden (hamming-1 inputs); Alvorens een input veranderd wordt, moet men wachten tot het netwerk gestabiliseerd is (fundamentele mode); De netwerken N i zien eerst de inputverandering, en pas nadien de mogelijke toestandsverandering, en dit nadat het netwerk de inputverandering volledig verwerkt heeft (geen essentiële hazards); Dit kan vereisen dat er extra vertraging aanwezig is in de terugkoppellussen (voorgesteld door de blokjes met een delta); 164

169 Bij elke toestandsverandering zal er maar één toestandsbit veranderen (hamming-1 transities); De netwerken N i zijn hazardvrij voor hamming-1-inputveranderingen, en zullen dus nooit hazards genereren, aangezien de voorgaande eisen impliceren dat de netwerkinputs steeds maar over één symbool zullen veranderen. Zoals men gemakkelijk kan aanvoelen is deze lijst van beperkingen zeer restrictief, en is het ontwerp van dit soort teruggekoppelde netwerken geen sinecure. Er is recentelijk sterke vooruitgang geboekt in het ontwerp van teruggekoppelde poortnetwerken en andere vormen van asynchrone circuits, die zich gegarandeerd correct zullen gedragen onder minder restrictieve omstandigheden. De beschrijving van deze methoden valt echter buiten het bestek van deze cursus; de lezer wordt verwezen naar bv. [Birtwistle95] of [Brzozowski95]. 5.5 Geheugencellen In de vorige paragrafen werd aangetoond hoe geheugenwerking kan ontstaan door terugkoppeling in poortnetwerken. Meestal gebruikt men bij circuitsynthese geen terugkoppelingen maar wel geheugencellen. Een geheugencel is een (intern teruggekoppeld) netwerk dat twee uitwendig observeerbare toestanden bezit, en waarvan de toestand door de inputs kan gewijzigd worden. De twee netwerken in fig. 5.5 zijn beide geheugencellen. Bij het netwerk in fig. 5.5(a) kunnen beide inputs X 1 en X 2 de toestand van de cel wijzigen. Zowel het ogenblik waarop als de zin waarin de output van de cel verandert wordt bepaald door de inputs. Indien de output verandert na het op 1 komen van één der inputs, wordt de nieuwe output bepaald door de identiteit van deze input. Dit gedrag noemen wij inputsynchroon. Het netwerk in fig. 5.5(b) gedraagt zich anders. Uit de transitietabel in fig. 5.6(b) blijkt dat de outputs Q 1, Q 2 slechts kunnen veranderen na het optreden van een stijgflank op de input C. De nieuwe waarde van de output wordt uitsluitend bepaald door de waarde van D juist vóór en tijdens de stijgflank op C. Dit gedrag noemen wij kloksynchroon, waarbij C gewoonlijk klokinput en D data-input worden genoemd. Een klokinput is een input die enkel het tijdstip van observeerbare transitie van de cel vastlegt. Vaak worden inputsynchrone schakelingen asynchroon genoemd, wegens de afwezigheid van een klokinput. Kloksynchrone cellen worden dan kortweg synchroon genoemd. Er bestaan diverse vormen van kloksynchronisme. Deze worden besproken in paragraaf en wij gaan er hier dus niet dieper op in. Om, bij een analyse of ontwerp, gemakkelijk te kunnen werken met geheugencellen moeten wij kunnen beschikken over een formele beschrijving van het gedrag van de cel. Dit noemen wij de karakteristieke vergelijking (k.v.) van de cel. Daar geheugencellen zelf sequentiële netwerken zijn kunnen wij hun gedrag kenmerken door hun functies f u en f s. Bij de asynchrone cel in fig. 5.5(a) vinden wij y 1 = X 2Y 1 + X 2X 1. Deze cel heet een Set/Reset (SR) kipschakeling of flipflop. Normaal zijn de Set (X 1 ) en Reset (X 2 ) input niet samen gelijk aan 1. In deze omstandigheid zijn Y 1 en Y 2 elkaars 165

170 complement. Wanneer echter S = R = 1 dan is Y 1 = Y 2 = 0. Wenst men dit te vermijden dan maakt men bv. S dominant over R (door een wijziging van het netwerk, uiteraard). Een S-dominante SR-flipflop heeft dan als k.v. y 1 = R Y 1 + S ; Y 2 = Y 1. De SR-schakeling is asynchroon, en de k.v. duidt dus zowel het ogenblik als de wijze van veranderen van de output aan. De geheugencel in fig. 5.5(b) heeft een bijzonder eenvoudige karakteristieke vergelijking: q 1 = D ; Q 2 = Q 1. Daar de cel synchroon is (met een flankgestuurde vorm van synchronisme) zal de effectieve overgang slechts gebeuren na de stijgflank op de klokinput C. Noteer dat, hoewel C niet optreedt in de k.v., de kennis van het klokgedrag onmisbaar is bij de beschrijving van de werking van de geheugencel. Deze geheugencel noemen wij een (flankgestuurde) D-flipflop. Het tijdsgedrag en het functioneel gedrag (datagedrag) van geheugencellen kunnen ook anders worden gecombineerd dan de cellen die wij tot nu toe besproken hebben. Zo bestaan er synchrone SR-flipflops, die essentieel dezelfde k.v. hebben als de besproken asynchrone SR-flipflop, maar waarin het ogenblik van de transitie enkel bepaald wordt door een extra klokinput. Een asynchrone D-flipflop is in feite niets anders dan een vertraging een celmodel van de terugkoppellus! Naast het functionele SR- en D-gedrag gebruikt men ook vaak het JK-gedrag, voorgesteld door de volgende k.v. y = JY + Y K Het verschil met het SR-gedrag is dat, wanneer J = K = 1, de cel synchroon met de klok van toestand wisselt. (Waarom is hier een klok noodzakelijk?) 5.6 Analyse van poortnetwerken met geheugencellen Hier beschouwen wij netwerken waarin alle terugkoppellussen minstens één geheugencel bevatten, en waarin alle geheugencellen ofwel asynchroon, ofwel synchroon zijn met een gemeenschappelijke klok. In deze netwerken wordt de interne toestand voorgesteld door de gezamenlijke toestand van de geheugencellen. De analyse van een dergelijk netwerk start met het opstellen van de excitatietabel. Deze tabel brengt de inputs van de geheugencellen in kaart, als functies van de totale toestand. Uit de excitatietabel kan de transitietabel verkregen worden door substitutie van de karakteristieke vergelijkingen van de geheugencellen. Figuur 5.10 toont een netwerk met SR-geheugencellen, en de overeenkomstige excitatietabel en transitietabel. Noteer dat, in het voorbeeld, de excitatie S 2 R 2 = 11 voorkomt. Wij onderstellen S-dominante flipflops. De verdere analyse en interpretatie van het netwerk hangen af van het klokgedrag van de geheugencellen. Met asynchrone geheugencellen hebben wij een interpretatie zoals bij teruggekoppelde poortnetwerken. Zo kan men de stabiele toestanden vinden (onderstreept in fig. 5.11). Het netwerk wordt gekenmerkt door een race, bij de overgang Y 1 Y 2, X 1 X 2 : 00, 00 00, 10. De toestand wijzigt zich in twee symbolen. Deze race is niet kritisch daar er maar één stabiele toestand is in de kolom X 1 X 2 = 10. De overgang Y 1 Y 2, X 1 X 2 : 11, 01 11,

171 Excitatievergelijkingen: S 1 = X 1 R 1 = X 2 Y 2 S 2 = X 1 X 2 + X 1 X 2Y 1 R 2 = Y 1 X 1 X Y 1 Y 2 : 00 00,01 00,11 10,01 10, ,01 00,11 10,01 11, ,00 00,00 10,00 11, ,00 00,00 10,00 10,10 S 1 R 1, S 2 R 2 X 1 X Y 1 Y 2 : y 1 y 2 (a) De excitatietabel (b) De transitietabel Figuur 5.10: Analyse van een netwerk met geheugencellen. 167

172 is meervoudig. Erger wordt het met de overgang Y 1 Y 2, X 1 X 2 : 01, 01 01, 11. De inwendige toestand wijzigt zich weer in twee symbolen (van 01 naar 10). Wanneer de sequentie gevolgd wordt, komen wij in de stabiele toestand 11 terecht. Wanneer echter de sequentie optreedt is de eindtoestand de (gewenste) toestand 10. Deze race is dus kritisch. Ze hangt af van de verschillen in looptijden van de input X 1 naar S 2, en van de toestandsveranderlijke Y 1 naar R 2 (dus van de eerste geheugencel). Wanneer de geheugencellen synchroon zijn is de analyse eenvoudiger. Er is geen onderscheid meer tussen stabiele en onstabiele toestanden: alle toestanden zijn stabiel, en alle overgangen gebeuren synchroon met de (gemeenschappelijke) klok. Er is geen gevaar meer voor verkeerde werking met meer-dan-hamming-1 transities: de race die ontstaat in de combinatorische netwerken speelt zich af na de overgang en geeft zelf geen aanleiding meer tot nieuwe overgangen. Voor een goede werking van een synchroon netwerk moet men nochtans ook een aantal voorzorgen nemen: 1. Er mogen geen kloktransities gegenereerd worden zolang de combinatorische netwerken hun eindwaarde niet bereikt hebben, na de vorige transitie. Dit beperkt de maximale klokfrequentie van het synchroon netwerk. 2. De voorwaarde voor stabiele excitatie-ingangen slaat ook op de inputs van het netwerk. Deze moeten dus stabiel gehouden worden gedurende een zekere tijd vóór de actieve kloktransitie. De analyse van sequentiële netwerken wordt gewoonlijk vervolledigd met de toestandstabel en, eventueel, met de eindtoestandentabel. De toestandstabel wordt afgeleid uit de transitietabel door de binaire representatie van de interne toestand te vervangen door mnemonische symbolen (b.v. letters), en de rijen die niet-bereikte toestanden bevatten te schrappen. De eindtoestandentabel volgt uit de toestandstabel van een asynchroon netwerk door, voor alle meervoudige overgangen, alle onstabiele tussentoestanden te vervangen door de naam van de stabiele eindtoestand. Op fig worden de toestandstabel en de eindtoestandentabel van het netwerk in fig getoond. Noteer dat men, voor Mealy-netwerken, in dezelfde tabel ook de outputs kan voorstellen. Voor een Moore-netwerk heeft men strikt genomen slechts één extra kolom nodig. 5.7 Opgaven 1. Analyseer het gedrag van de poortschakeling in fig (alle poorten zijn NAND = NIET EN poorten). Wat doet dit circuit? 2. Analyseer het netwerk in figuur Dit is een deel van een commerciële chip, een fase-detector. 168

173 X 1 X Toestand A A,00 B,00 D,00 C,00 B A,01 B,01 D,01 C,01 C B,11 C,11 C,11 C,11 D D,10 D,10 D,10 C,10 Nieuwe Toestand, Y 1 Y 2 X 1 X Toestand A A,00 B,00 D,00 C,00 B A,01 B,01 D,01 C,01 C A,11 C,11 C,11 C,11 D D,10 D,10 D,10 C,10 Nieuwe Eindtoestand, Y 1 Y 2 Figuur 5.11: De vervollediging van de analyse Figuur 5.12: Teruggekoppeld poortnetwerk 169

174 Figuur 5.13: Een digitale fasedetector bepaal het aantal toestanden; is het een veilig netwerk, d.w.z., volgt het gedrag uit de transitietabel? bepaal het antwoord (sequentie van U 1, D 1 ) op de inputsequenties in figuur Analyseer de schakeling in figuur (a) Bepaal haar antwoord op de opgegeven inputsignalen. (b) Ga na of het werkelijk gedrag van de schakeling altijd overeenstemt met het voorspelde gedrag. (c) Geef een woordbeschrijving van het gedrag van de schakeling. 4. Analyseer de werking van het circuit in figuur stel de toestands/output-tabel op; vervolledig het tijdsdiagram in figuur 5.15 met de output Y, en met de evolutie van de inwendige toestand (geef de toestanden een 1-letternaam.) 5. (a) Analyseer de schakeling in fig

175 Y Z X X Y Z Figuur 5.14: Te onderzoeken netwerk Figuur 5.15: Een asynchroon poortnetwerk 171

176 Figuur 5.16: Een asynchroon poortnetwerk (b) Bepaal de outputs van de schakeling op de volgende inputs aangeven in de figuur. (c) Geef een woordbeschrijving van het gedrag van de schakeling. 6. (a) Analyseer schakeling van figuur 5.17, d.w.z. stel de ttt op. Kies bij voorkeur de knipplaatsen aangegeven door de letters x, y, z. (b) Bepaal het gedrag van de output voor de opgegeven inputs vertrekkende vanuit out = 0. (c) Geef een woordbeschrijving van het gedrag van de schakeling. (d) Ga na of het gedrag voorspeld door de ttt altijd overeenkomt met het werkelijk gedrag. 7. Analyseer het schema in fig van een teruggekoppeld netwerk met drie inputs X, Y, en C, en twee outputs Q1 en Q2. Noteer dat er hier een mengsel gebruikt wordt van poorten en schakelaars. Bij de analyse mag men veronderstellen dat de schakelaars veel sneller omslaan dan de poorten. Wat doet dit netwerk? (hint: analyseer het circuit eerst met C = 1, en dan met C = 0. Analyseer dan wat er gebeurt als C van waarde verandert.) 8. Analyseer de schakeling in figuur Veronderstel dat bij t = 0, A = 0, B = 0, X = 0, Y = 0 en Z = 0. (a) Bepaal haar antwoord op de opgegeven inputsignalen (veronderstel fundamentele mode). (b) Ga na of het werkelijk gedrag van de schakeling altijd overeenstemt met het voorspelde gedrag. Mocht dit niet het geval zijn, kan je er iets aan doen? (c) Geef een woordbeschrijving van het gedrag van de schakeling. 9. (a) Analyseer de schakeling in fig (b) Geef een woordbeschrijving van het gedrag van de schakeling; omschrijf i.h.b. de voorwaarden waaronder z =

177 Figuur 5.17: Te analyseren teruggekoppeld poortnetwerk Figuur 5.18: Een teruggekoppeld netwerk in gemengde notatie 173

178 Figuur 5.19: Teruggekoppeld poortnetwerk (c) Is deze schakeling vrij van ongewenste effecten wanneer men veronderstelt dat de individuele poortvertragingstijden een spreiding van 1 : 3 kunnen vertonen? Zo er problemen zijn, kan men er iets aan doen? 10. Analyseer de schakeling in figuur 5.20 (vraag1). Veronderstel dat bij t=0, Q=1 en W=1. (a) Bepaal haar antwoord op de opgegeven inputsignalen. (b) Ga na of het werkelijk gedrag van de schakeling altijd overeenstemt met het voorspelde gedrag. (c) Geef een woordbeschrijving van het gedrag van de schakeling. 11. Analyseer de schakeling in figuur Veronderstel dat bij t = 0, D = 0, K = 0, X1 = 0 en X2 = 1. (a) Bepaal haar antwoord op de opgegeven inputsignalen (veronderstel fundamentele mode). (b) Gan na of het werkelijk gedrag van deze schakeling altijd overeenstent met het voorspelde gedrag. Mocht dit niet het geval zijn, kan je er iets aan doen? (c) Geef een woordbeschrijving van het gedrag van de schakeling, in de veronderstelling dat D, zoals getekend, alleen kan veranderen kort na een stijgende overgang op K. 12. (a) Analyseer de schakeling van figuur 7.23 van een synchroon sequentieel netwerk; (b) Geef een woordbeschrijving van het gedrag van de schakeling; omschrijf i.h.b. de voorwaarden waaronder out = 1. (c) Bewijs dat deze schakeling een gedrag vertoont equivalent met het gedrag gegeven door de volgende ttt: 174

179 C X = Y= Aftrekker Z= klok D Vraag 2 W Vraag 1 Q D C Q Figuur 5.20: Figuren bij vraag 10 K A B F D C X1 K D D G X1 E X2 X2 Figuur 5.21: Te analyseren circuit in vraag

180 X=0 X=1 A A,0 B,1 B B,0 C,0 C C,0 D,0 D D,0 E,0 E E,0 F,0 F F,0 A,0 176

181 Hoofdstuk 6 Sequentiële schakelingen en hun bouwstenen Nu wij een eerste kennismaking met het gedrag van sequentiële schakelingen gehad hebben, zullen wij in dit hoofdstuk een kort overzicht geven van concrete sequentiële bassischakelingen en hun gedrag. Dit overzicht heeft een gelijkaardige structuur als het overzicht van de combinatorische bouwblokken uit paragraaf Standaardcomponenten Sequentiële SSI-componenten De sequentiële SSI-componenten zijn in feite elementaire geheugencellen of flipflops. Men vindt ze per één of per twee in een behuizing. Flipflops zijn de basisbouwstenen voor sequentiële schakelingen, en het is dus noodzakelijk een duidelijk beeld te hebben van de diverse soorten flipflops die bestaan. Classificatie. Men kan de flipflops rangschikken volgens twee onafhankelijke criteria: hun klokgedrag en hun datagedrag. Volgens klokgedrag maakt men onderscheid tussen de volgende types 1 : 1. Flipflops zonder klok. Deze flipflops hebben geen aparte klokinput, en zullen hun toestand dus veranderen synchroon met veranderingen op de data-inputs. Wij noemen deze soort asynchroon. 2. Flipflops met niveausturing. Dit zijn flipflops waarvan de toestand de input kan volgen zolang het kloksignaal zich op een bepaald niveau, bv. hoog, bevindt. Wanneer de klokinput laag gebracht wordt, zal de flipflop zijn toestand vergrendelen. Wij noemen hem daarom ook soms grendel (Eng. latch). 3. Flipflops met flanksturing (Eng. edge triggered). Deze flipflops zijn gevoelig aan een overgang op het kloksignaal, bijvoorbeeld een stijgflank. De toestand die aanwezig was op de data-inputs net vóór de flank zal de nieuwe toestand van de flipflop bepalen. De outputs veranderen uiteraard na de klokflank. 1 De terminologie die hier gehanteerd wordt is slechts één van de gebruikte terminologieën. Wij zullen er echter in deze cursus consequent gebruik van maken. 177

182 Tabel 6.1: Een overzicht van de verschillende types flipflops verkrijgbaar als standaardcomponent Asynchroon Niveaugestuurd Flankgestuurd Pulsgestuurd D-gedrag LS75 74LS74 ** MC1402B MC14013B S/R-gedrag 74LS279 ** ** MC1403B T-gedrag ** ** J/K-gedrag 74LS73A 7476 MC14027B 4. Flipflops met pulssturing. Deze flipflops bestaan in feite uit twee in cascade geschakelde niveaugestuurde flipflops, de meester en de slaaf. Beide flipflops worden met een complementair kloksignaal aangestuurd (in tegenfase ). Wanneer de meester de toestand van de data-inputs overneemt, is de slaaf vergrendeld, en de meester vergrendelt zijn toestand op het ogenblik dat de slaaf deze toestand overneemt. De werking van deze flipflop vereist de aanwezigheid van een volledig puls op de klokinput, niet enkel een flank, vandaar de naam. Dit klokgedrag noemt men dan ook meester/slaaf (Eng. master/slave). Volgens datagedrag maakt men onderscheid tussen de volgende mogelijkheden: 1. Het D-gedrag. De input bestaat uit één binair signaal, en bij een activiteit op het kloksignaal zal de flipflop het logisch niveau op de inputlijn opslaan. 2. Het Set/Reset-gedrag (S/R). Er zijn twee inputs. Een actief niveau op de Set-input zal de flipflop op 1 brengen, een actief niveau op de Reset-input zal de flipflop op 0 brengen. Actieve niveaus gelijktijdig op Set en Reset zijn ongeldig, en kunnen aanleiding geven tot onbepaald gedrag. 3. Het T-gedrag. Er is één input (de toggle input). Bij een actief niveau op deze lijn zal de flipflop zijn toestand complementeren tijdens activiteit op het kloksignaal. 4. Het J/K-gedrag. Er zijn twee inputlijnen, zoals bij de S/R-flipflop. J speelt de rol van Set, K van Reset. Hier betekent het gelijktijdig actief zijn van J en K echter dat de flipflop zijn toestand moet complementeren zoals bij een T-flipflop. Men kan de flipflops classificeren volgens deze twee kenmerken. Tabel 6.1 geeft het resultaat van deze classificatie, toegepast op enkele flipflops uit de 74-reeks (TTL) en uit een CMOS-reeks. Noteer dat een aantal combinaties niet kunnen ingevuld worden (waarom?). Andere combinaties zijn redundant, en kunnen eenvoudig uit bestaande combinaties gerealiseerd worden. Bijvoorbeeld, waar zinvol kan een T-flipflop steeds gemaakt worden uit een J/K-flipflop met verbonden data-inputs, en een D-flipflop uit een J/K-flipflop waarvan de K-input het complement is van de J-input. Het S/R-gedrag ligt besloten in het J/K-gedrag. Deze combinaties werden aangegeven met een ** in de tabel. Analyse van het klokgedrag. Om op een correcte manier sequentiële schakelingen op te bouwen uit flipflops is het nodig een meer gedetailleerd inzicht te verwerven in de 178

183 precieze betekenis van het klokgedrag. Wij zullen dit doen aan de hand van twee intervallen: het I-interval en het O-interval. Zij worden als volgt gedefinieerd voor flipflops met een kloksignaal. Definitie 6.1 Het I-interval is het tijdsinterval waarin de inputs de (huidige of latere) outputs van de flipflop kunnen beïnvloeden. Het O-interval is het interval waarin de outputs van de flipflop kunnen veranderen. Het is duidelijk dat de ligging van deze intervallen bepaald wordt door het klokgedrag (figuur 6.1). In deze figuur betekent t s en t h resp. de insteltijd en houdtijd (Eng. setup time en hold time) van de inputs m.b.t. de klok. Het interval dat afgebakend wordt door t s en t h is een deelinterval van het I-interval, en is bepalend voor de volgende toestand die de flipflop zal aannemen. Binnen dit interval moeten de inputs constant gehouden worden, wil men dat de flipflop zich gedraagt volgens zijn nominaal datagedrag. Noteer dat bij sommige pulsgestuurde flipflops de outputs beïnvloed kunnen worden in een ruimer interval dan dat opgespannen door t s en t h, namelijk gedurende de tijd dat de klokinput hoog is (dit is het geval bij bv. de 7476). Het symbool t p stelt de propagatietijd voor, van de klokinput naar de output. Gewoonlijk verschilt de propagatietijd van een opgaande transitie van deze van een neergaande; hiermee werd in de figuur echter geen rekening gehouden. Op figuur 6.2 werden de NAND-poortrealisaties van twee pulsgestuurde flipflops voorgesteld. De deelschakelingen gemerkt als master en als slave zijn in feite asynchrone R/S-flipflops, zoals ook de linkse schakeling in figuur 5.5. De rechtse schakeling in figuur 5.5 is de poortrepresentatie van een flankgestuurde D-flipflop. Wat is nu de betekenis van de I- en O-intervallen? Stel dat wij de flipflops willen gebruiken als geheugenelementen in een synchrone automaat. De generieke structuur van een dergelijke automaat wordt voorgesteld in figuur 6.3, waarbij flankgestuurde geheugencellen worden ondersteld. De flipflops in deze schakeling zullen zich gedragen volgens hun nominaal datagedrag, op voorwaarde dat tijdens het hele I-interval de correcte, stabiele combinatie aangelegd wordt aan de data-inputs. In een automaat zoals deze in de figuur hangt de inputcombinatie op een geven ogenblik af van de huidige toestand van de geheugencellen en van de inputs van de automaat, vertraagd met de looptijd t c doorheen het combinatorisch circuit dat de toestandsfunctie realiseert. Men kan onder- en bovengrenzen bepalen op deze vertragingstijd op basis van de gebruikte combinatorische circuits. De kleinst mogelijke waarde voor de ondergrens is 0, en deze kan, op de gebruikte tijdsschaal, willekeurig dicht benaderd worden wanneer een flipflopoutput rechtstreeks verbonden wordt met een input. Noteer dat dit o.a. het geval is bij schuifregisters. Wil men dat een dergelijke automaat correct functioneert, dan moeten de flipflopinputs stabiel zijn tijdens het I-interval. Dit impliceert dat de unie van vertraagde O-intervallen van de flipflops die een bepaalde input aansturen disjunct moet zijn van het I-interval van de ontvangende flipflop. Bijgevolg 1. moeten alle geheugenelementen hetzelfde kloksignaal toegevoerd krijgen; mogelijke tijdsverschuiving (Eng. clock skew) tussen de kloksignalen aan de diverse geheugenelementen moeten beperkt blijven aangezien zij de relatieve verschuiving van O-intervallen t.o.v. I-intervallen kunnen vergroten; 2. moeten alle geheugenelementen compatibel zijn met elkaars klokgedrag. Dit is nodig wanneer wij outputs van flipflops rechtstreeks aan inputs van andere flip- 179

184 Figuur 6.1: De ligging van de I- en O-intervallen voor diverse klokgedragingen. Afhankelijk van de gedetailleerde realisatie kan de ligging van de intervallen verschillen. Zo ligt bij veel pulsgestuurde flipflops het I-interval rond de daalflank op de klok, en valt dus niet noodzakelijk samen met de tijdsduur dat het kloksignaal hoog is. J Master Slave Q D Qm Slave Qs K klok Qb klok set Qmb Qsb set Figuur 6.2: Modellen op logisch niveau van pulsgestuurde flipflops (master-slave). Links: een JK-flipflop, rechts een D-flipflop. Hebben beide flipflops een gelijkaardig I-interval? 180

185 Input Combinatorisch netwerk Output Input Outputnetwerk Toestandsnetwerk Toestandsnetwerk Output Input Outputnetwerk Output Flipflop output Flipflop Flipflop input Klok Flipflop Klok Flipflop Klok (a) (b) (c) T klok t h t s Klok Fliplopinput Flipflopoutput t p t c,max Figuur 6.3: De generieke structuur van een synchrone automaat (het zg. Huffman-model). (a) algemeen model, (b) een Moore-automaat waar de uitgang enkel afhangt van de toestand, (c) een Mealy-automaat waar de uitgang ook combinatorisch afhangt van de ingang 181

186 flops verbinden. Ingrepen op het kloksignaal zelf (zoals bv. inverteren) verhogen de klokverschuiving, en zijn daarom te mijden. Technieken zoals gated clocks, waarbij men de klok naar een gedeelte van een circuit onderdrukt met de bedoeling de dissipatie van het circuit tijdens perioden van inactiviteit te verlagen, moeten om deze reden uiterst zorgvuldig uitgevoerd en gecontroleerd worden. 3. moet de klokperiode voldoend groot zijn, om ervoor te zorgen dat de inputs gestabiliseerd zijn bij het begin van het I-interval: T klok > t p + t c,max + t s ; 4. moet het I-interval van een geheugencel disjunct zijn van het O-interval, om correctheid te garanderen bij t c = 0; in feite is er zelfs een zekere separatie vereist om het hoofd te bieden aan klokverschuiving; 5. moeten de inputs zodanig aangestuurd worden dat zij nooit een inputverandering teweegbrengen tijdens het I-interval. Men ziet dat de vierde eis het gebruik van niveaugestuurde flipflops uitsluit voor de realisatie van synchrone automaten. 2 Deze eis resulteert in een bepaalde kostprijs: de realisatie van het toegelaten klokgedrag (puls- en flanksturing) is duurder dan dat van eenvoudige niveausturing. Pulssturing vereist het gebruik van twee flipflops per geheugencel; flanksturing wordt meestal verkregen door ingebouwde hazards of meervoudige overgangen in de geheugencel, en vereist daardoor ook meer elementaire poorten dan een niveaugestuurde werking (zie hoofdstuk 6). Dit verschil in kostprijs is nauwelijks te merken bij SSI- en MSI-realisaties; het speelt echter een belangrijker rol in VLSI-ontwerp. Metastabiliteit. Men kan zich de vraag stellen wat er gebeurt wanneer wij de inputs van een flipflop niet constant houden gedurende het I-interval. Dit is een situatie die soms onvermijdelijk is, daar het ordentelijk aanleggen van inputs aan een synchrone automaat (volgens de vijfde eis in bovenstaande opsomming) vereist dat de buitenwereld de fase van het kloksignaal kent. Dit is duidelijk niet het geval voor inputs die effectief uit een ander systeem met een lokaal kloksignaal afkomstig zijn. In de meeste gevallen zal de flipflop een niet-voorspelbaar gedrag vertonen bij een dergelijke aansturing. Een inputsignaal dat een toestandsovergang zou veroorzaken zal dit niet meer met zekerheid doen: ofwel komt de input toch nog vroeg genoeg, en zal de toestandsovergang plaatsvinden, ofwel komt hij te laat, en blijft de toestand van de flipflop onveranderd. Dit gedrag kan verschillen van component tot component. Bij het ontwerp van digitale systemen moet men met deze onzekerheid terdege rekening houden; op dit punt komen wij in meer detail terug in het volgende hoofdstuk. In zeldzame gevallen zal er zich een heel ander scenario voordoen. Signalen zowel het kloksignaal en het datasignaal veranderen niet oneindig snel, en het kan dus gebeuren dat zij beide ongeveer tegelijkertijd door de verboden zone lopen. Op dat ogenblik kunnen dan in het inwendige van de flipflop verschillende signalen waarden aannemen in de omgeving van het drempelpunt (in de verboden zone). Voor de flipflop, die een teruggekoppeld systeem is, is dit punt een onstabiel evenwichtspunt, en in de onmiddellijke omgeving van dit punt gedraagt de flipflop zich als een onstabiel teruggekoppeld 2 Althans wanneer aangestuurd met een éénfasige klok. Met een tweefasige klok met niet-overlappende fasen kan men, mits gebruik van twee flipflops per geheugenbit, een correcte werking realiseren. Noteer de gelijkenis hiervan met de pulsgestuurde flipflop. 182

187 Figuur 6.4: Opgemeten metastabiel gedrag van een 74LS74 flankgestuurde flipflop lineair systeem. Wanneer wij eenvoudigheidshalve aannemen dat de flipflop daar gemodelleerd kan worden als een eerste-ordesysteem, volgt dat de spanning volgens een exponentiële wet weg zal evolueren van het onstabiel evenwichtspunt. De snelheid van deze evolutie is des te trager naarmate men van dichter bij het evenwichtspunt vertrekt. De tijd die verloopt alvorens de flipflop een logische waarde bereikt heeft (hetzij hoog of laag) kan dus veel groter zijn dan de nominale propagatietijd; in theorie is er zelfs geen bovengrens op deze tijd. Dit gedrag noemen wij metastabiel: het kan een ongewoon lange tijd duren alvorens de flipflop een geldige eindwaarde bereikt, veel langer zelfs dan de duur van een klokperiode bij hoge klokfrequenties. Een gedetailleerde analyse van het fenomeen wordt gemaakt in Appendix C.3. Zulk gedrag kan tot fouten leiden in de schakelingen die gebruik maken van de flipflop-output. Figuur 6.4 geeft een idee van het metastabiel gedrag van een 74LS74 flankgestuurde flipflop. Noteer dat de gewone vertragingstijd van deze flipflop ongeveer 14 ns is; er zijn echter vertragingstijden van 30 ns en meer opgemeten voor overgangen op de data-input in een heel nauw gebied (ong. 1 ns) in het I-interval. Een meer gedetailleerde analyse van de optredende fenomenen vindt men in appendix C.3. Men kan inzien dat dit fenomeen fundamenteel is, en dat men het nooit volledig kan elimineren. Men kan echter wel de kans dat het optreedt bijzonder laag maken. Invloedsfactoren hierop zijn vooreerst de bouw van de flipflop. De kringwinst van de flipflop, beschouwd als lokaal lineair systeem, is een belangrijke parameter. Een hoge winst leidt tot kleine tijdsconstanten en dus een lage kans op metastabiliteit. Voorts spelen ook de gebruikte signaalfrequenties een rol: metastabiliteit kan immers enkel ontstaan wanneer een klokovergang en een datasignaalovergang te dicht bij elkaar liggen. Hoe hoger de frequentie van beide, hoe hoger de kans op metastabiliteit. Men mag de frequentie van de systeemklok dus niet nodeloos hoog maken, en men moet ervoor zorgen dat asynchrone inputs eveneens een zo laag mogelijk frequentie hebben. Het optreden van metastabiliteit kan gekarakteriseerd worden a.d.h. van de zg. MTBF, de Mean Time Between Failures van een flipflop wanneer deze aangestuurd wordt met een kloksignaal met frequentie f c en een asynchroon datasignaal dat verandert met frequentie f d. Met failure bedoelt men het verlopen van meer dan een tijd t na de 183

188 jaar 74F 74AC jaar 74ABT 74BCT MTBF seconden dag 1 uur 1 minuut 74ALS 74Standard S HC 74LS AS fclk = 1 MHz fin = 500 khz tx ns Figuur 6.5: MTBF voor TTL-soorten ten gevolge van metastabiel gedrag (Texas Instruments,1997. De datafrequentie is de helft van de aangegeven klokfrequentie) actieve klokflank alvorens de flipflop zijn definitief logisch niveau bereikt. Men vindt ([Breuninger85]) MTBF = C 1 f c f d exp(c 2 t), waarin C 1 en C 2 technologie-afhankelijke constanten zijn. Bijvoorbeeld, voor ALS-TTL vindt men, met frequenties in MHz en tijden in ns, C 1 = 0, 4 en C 2 = 1, 151. Met een klokfrequentie van 10 Mhz en een datafrequentie van 5 Mhz, en met t = 40 ns, wordt MTBF = 7, s, wat overeenkomt met ongeveer 2,6 jaar. Dezelfde frequenties en een t = 50 ns leiden bij LS-TTL echter tot MTBF = 657 s, slechts ongeveer 11 minuten dus! De karakteristieken gepubliceerd door Texas Instruments ([Breuninger85]) vindt men in figuur Sequentiële MSI-componenten. Sequentiële componenten van MSI-complexiteit zijn eenvoudige sequentiële automaten, zoals registers, schuifregisters, tellers, frequentiedelers, al dan niet voorzien van afschakelbare uitgangen, bedoeld voor de aansluiting op een bus. Kleine, snelle statische geheugens, registerbestanden en FIFO s zijn andere voorbeelden. Het klokgedrag van registers is meestal niveaugestuurd of flankgestuurd; tellers vindt men in volledig synchrone vorm (met flanksturing), in gedeeltelijk synchrone vorm (bv. met asynchrone clear), of in asynchrone vorm, als zg. doorsijpeltellers ( ripple counters ). 184

189 Alles wat gezegd werd over het klokgedrag van individuele flipflops blijft uiteraard van toepassing op de sequentiële MSI-componenten Sequentiële LSI- en VLSI-componenten Vrijwel alle circuits van deze complexiteit bevatten een zekere hoeveelheid geheugen. Generieke VLSI-circuits die in zeer grote oplagen verkocht worden zijn uiteraard de geheugens, microprocessors, en de randchips voor microprocessors (coprocessors, I/Ochips voor video, communicatie, enz.). Hiernaast bestaat er een grote diversiteit aan specifieke chips voor de consumentenmarkt. LSI- en VLSI-schakelingen worden voornamelijk in MOS en CMOS gemaakt, hoewel er uiteraard ook complexe TTL- en ECL-componenten te vinden zijn. Geheugens Geheugenwerking in digitale schakelingen kan op diverse manieren verwezenlijkt worden. In de gebruikelijke technologieën (TTL, ECL, MOS, CMOS) maakt men ofwel gebruik van niet-lineaire teruggekoppelde systemen, zoals flipflops, ofwel gebruikt men een passieve vorm van ladingsopslag op een geïsoleerde condensator. Het laatste kan uiteraard enkel in MOS-gebaseerde families. De eerste vorm is een actieve vorm, en het in stand houden van de geheugentoestand vraagt een permanente toevoering van vermogen (die soms wel heel klein kan zijn, bv. bij flipflops in CMOS). In principe vraagt de passieve vorm geen toevoering van energie. Uiteraard is het zo dat elke condensator een zekere lekstroom heeft, en dat dus ook daar vermogen nodig is voor de vervanging van de weggelekte lading. Wanneer echter de periode waarover de geheugenwerking moet gerealiseerd worden klein is (enkele ms), kan men de passieve vorm met voordeel gebruiken, daar een geheugencel bijzonder klein en eenvoudig is. Hierop steunt trouwens het gebruik van dynamische logica in NMOS en CMOS. Op basis van deze twee principes vinden wij twee grote klassen van geheugencomponenten: statische geheugens, gebaseerd op de actieve vorm, en dynamische geheugens, gebaseerd op de passieve vorm. Wij zullen beide klassen bespreken. Statische geheugens. Statische geheugens gebruiken flipflops als geheugenelementen. Elk bit vereist dus minstens twee actieve circuitelementen (transistoren); vaak zijn het er meer. Dit heeft als gevolg dat de geheugencapaciteit per eenheidsoppervlakte van statische geheugens veel kleiner is dan dat van dynamische. Statische geheugens kunnen echter in alle technologieën gerealiseerd worden. Men gebruikt de statische techniek voornamelijk voor de realisatie van relatief kleine maar snelle geheugens. De snelste vormen zijn ongetwijfeld de registers, waar elk bit parallel toegankelijk is, en waar lees- en schrijfopdrachten in zekere zin simultaan kunnen gebeuren. 3 Registers hebben natuurlijk een zeer kleine capaciteit. Wanneer men meer capaciteit wil inbouwen kan men niet langer elk bit parallel toegankelijk maken. Men organiseert de geheugenbits dan in een matrix van woorden. Met behulp van een binair 3 Dit moet men als volgt interpreteren: Het lezen kan gelijktijdig gebeuren met het aanleggen van nieuwe gegevens die moeten ingeschreven worden. De kortste periode hiervoor bruikbaar is in feite het I-interval van de flipflops. Het kloksignaal dat het I-interval, en dus de schrijfoperatie, beëindigt zal meteen ook de leesoperatie beëindigen. 185

190 gecodeerd adres kan men een woord selecteren, en op dit geselecteerde woord kan men lees- of schrijfoperaties uitvoeren. De geheugenvorm die het dichtst bij de registers staat is het zg. meerpoortgeheugen of registerbestand. Men voorziet het geheugen van meer dan één adres, bijvoorbeeld 2 of 3, en organiseert het geheugen zodanig dat tegelijkertijd twee locaties kunnen gelezen worden, en een derde geschreven (met de bovenstaande definitie van gelijktijdigheid). Het is duidelijk dat de geheugencapaciteit van dit soort geheugens beperkt moet zijn wegens het groot aantal adreslijnen. Een 3-poortgeheugen met 64 locaties vereist immers al 18 adreslijnen. Wanneer men hierbij ook het aantal datalijnen voegt (3 maal de woordbreedte) en de controlesignalen komt men tot een relatief groot aantal pinnen wanneer het geheugen uitgevoerd wordt als een afzonderlijke chip. Dit soort van geheugens vormt meestal de kern van de CVE van een processor, of wordt gebruikt om twee digitale systemen te koppelen via een gemeenschappelijk communicatiegeheugen (de zg. Dual Port Memories). De meer gebruikelijke vorm van statisch geheugen, RAM (Random Access Memory) voorziet in één adres, waarop ofwel een lees-, ofwel een schrijfoperatie uitgevoerd kan worden. Beide operaties zijn mutueel exclusief. Van het adres worden tegelijkertijd alle bits aan het geheugen aangelegd. Bij een schrijfoperatie worden ook de te schrijven gegevens aangelegd, samen met een selectiesignaal dat de chip selecteert, en een schrijfsignaal dat de eigenlijke schrijfoperatie uitvoert. Bij een leesoperatie moet men enkel het selectiesignaal aanleggen, met het schrijfsignaal inactief. De chip zal dan na verloop van de toegangstijd de gevraagde gegevens naar buiten brengen. Het gebruiksprotocol van statische geheugens is dus bijzonder eenvoudig, wat ook de aansturende circuits eenvoudig houdt. Sommige statische geheugens hebben gescheiden data-in- en uitgangen; bij de meeste echter worden deze connecties gecombineerd tot bidirectionele draden, wat het aantal aansluitingen reduceert. Dit vereist uiteraard dat zowel het geheugen als de gegevensbron die de schrijfgegevens aanbrengt afschakelbare uitgangen bezitten. Een geheugenchip zal de datalijnen slechts aansturen wanneer hij geselecteerd is en het schrijfsignaal inactief is. Men kan zich de vraag stellen hoe men de woordbreedte van een geheugenchip moet kiezen opdat het aantal aansluitpinnen minimaal zou zijn voor een gegeven geheugencapaciteit. Het antwoord is eenvoudig: als men n = 2 k bits capaciteit heeft, en woorden van w = 2 j bits, dat heeft men a = log 2 (n/w) = k j adreslijnen nodig, en w datalijnen. De grootheid 2 j j is minimaal wanneer j = 0 of j = 1, dus de chip heeft het minste aansluitdraden bij een woordbreedte van 1 of 2 bit. Nochtans vindt men statische geheugens ook in woordbreedten van 4 en 8 bit, omdat dit het aantal chips reduceert voor de realisatie van een geheugen met een beperkte capaciteit en een gegeven woordbreedte. Wanneer men bv. een geheugen moet realiseren van 1024 woorden van 32 bit met geheugenchips die een capaciteit hebben van 8 K bit, dan heeft men 32 chips nodig met een woordbreedte van 1 bit, maar slechts 4 met een woordbreedte van 8 bit. De chips met een woordbreedte van 1 bit zullen 4 draden minder hebben (13 adreslijnen en 1 datalijn) dan hun collega s van 8 bit (10 adreslijnen en 8 datalijnen), maar het totaal aantal draden is kleiner bij de 8-bit chips. Moet men echter een geheugen van 8 K woorden van 32 bit (in totaal 256 Kbit) realiseren met dezelfde chips, zal men in beide gevallen 32 chips nodig hebben, en de eerste oplossing (1-bit chips) is beter. De interne organisatie van geheugenchips is meestal als een rechthoekige of vierkante 186

191 Figuur 6.6: Structuur en aansturing van een statische RAM-chip Tabel 6.2: De eigenschappen van enkele commerciële statische geheugenchips. De chip gemerkt met (*) is een tweepoortgeheugen Type capaciteit woordbreedte toegangstijd technologie pinnen (bit) (bit) (ns) CY10E K 4 7 ECL 28 HM K 4 11 ECL 32 HM M 8 70 CMOS 32 HM K 4 20 Bi-CMOS 24 MCM M 4 10 Bi-CMOS 32 CY7B134(*) 32 K 8 20 Bi-CMOS 48 MCM63F733A 4 M CMOS 100 matrix van geheugencellen (figuur 6.6). Elke cel heeft een rij- en een kolomadres, die elk afhangen van een gedeelte van de adreslijnen (bv. elk de helft bij adressen van even lengte). De adresdecoder bestaat dus uit twee kleinere decoders, die resp. de rijen en de kolommen decoderen. Waar bij een zg. lineaire decodering op de chip a lijnen moeten lopen, is hun aantal nu gereduceerd tot ruwweg 2 a. Dit beperkt aanzienlijk de interconnectie-oppervlakte op de chip. Volgens figuur 6.6 is het gedrag van de component asynchroon, en moeten het adres en de controlesignalen constant gehouden worden tijdens een operatie. De net beschreven interface is asynchroon (fig. 6.6): er is geen sprake van een kloksignaal. Recentelijk zijn er ook de zg. Synchrone Statische RAM s bijgekomen, die het adres, de controle-informatie, en de eventuele schrijfdata opslaan in een intern register bij de stijgflank op een kloksignaal. Men kan dan het nieuwe adres al klaar zetten terwijl men de (lees)data van de vorige cyclus opneemt tijdens de volgende stijgflank. Dit is een vorm van gepijplijnde werking, die heel frequent gebruikt wordt in de geheugenhiërarchie van moderne microprocessors. Tabel 6.2 geeft een idee van de eigenschappen van bestaande statische geheugens. 187

192 W' CAS' data in buffer D Klokgen. nr. 2 data out buffer Q kolomadres buffer kolomdecoder refresh controller senseversterkers woordlijn A0..A9 refresh teller Geheugencondensator RAS' Klokgen. nr. 1 rijadresbuffer rijdecoder matrix 512 x 2048 bitlijn Gnd Figuur 6.7: Interne opbouw van een dynamisch geheugen Dynamische geheugens. Wil men geheugens maken met veel grotere capaciteiten dan mogelijk met statische geheugens, dan moet men zijn toevlucht nemen tot een geheugentechnologie gebaseerd op passieve geheugenwerking. Met deze technologie kan men geheugenmatrices bouwen waarin elk bit bestaat uit één (veldeffect-)transistor, en een kleine condensator (figuur 6.7). Figuur 6.8 toont een fysieke realisatievorm van een dynamische RAM. Om redenen van pinnenaantal aan de geheugenchip zal men de woordbreedte van grote geheugens dikwijls op 1 bit nemen. Bovendien zal men het adres opsplitsen in twee (waar mogelijk gelijke) helften, die, in tegenstelling met de statische geheugens, niet tegelijkertijd worden aangelegd. Een helft noemt men het rijadres, de andere het kolomadres. Het aanleggen van een adres wordt dus een sequentiële operatie, wat de aanwezigheid van kloksignalen vereist. Men brengt twee extra (klok)signalen aan, RAS (Row Address Strobe) en CAS (Column Address Strobe), die dienen voor het inklokken van resp. het rijadres en het kolomadres. Een dergelijk geheugen werkt als volgt (zie ook figuur 1.4). Eerst zal men een gedeelte van het adres het rijadres aanleggen, en dit aangeven door RAS laag te brengen. Het laag brengen van RAS schrijft het rijadres in een register op de chip. Dit heeft als gevolg dat in de geheugenmatrix alle cellen op de geselecteerde rij worden gelezen. Het lezen bestaat erin dat men de spanning op de bitlijnen, dit zijn de banen die kolomsgewijs de geheugencellen verbinden met de inputs van de leesversterkers, op een vooropgegeven waarde brengt (precharge). Deze spanning komt overeen met het metastabiel evenwichtspunt van flipflops in de technologie. Deze banen hebben een strooicapaciteit en zijn dus capacitief. Dan verbindt men de geselecteerde geheugencondensatoren met de bitlijnen door de woordlijn op de hoge spanning te brengen; de geheugenfets gaan dan geleiden en er grijpt een ladingsherverdeling plaats. De eindspanning op de bitlijnen hangt af van de originele spanning op de geheugencondensator. De eindspanning, die enkele tientallen millivolt afwijkt van het metastabiel punt, wordt versterkt tot logische 188

193 1,5 m gateoxide van FET 0,8 m woordlijn bitlijn geheugencondensator elektroden bitlijn snijvlak 1 doorheen woordlijn n+-diffusie snijvlak 2 parallel met bitlijn woordlijn geheugencondensator dielektricum geheugencondensator elektrode 2 geheugencondensator elektrode 1 woordlijn bitlijn geleidend steeltje contact met source van FET contact van bitlijn met drain van FET Figuur 6.8: Fysieke structuur van een 64 Mbit dynamisch geheugen (Samsung, 1995). De geheugencondensatoren worden hier gevormd door paddestoeltjes in polysilicium. Een geheugencel meet 0,8 1,5 µm (in bovenzicht). De woordlijnen vormen in feite de gates van de geheugen-fets door het oxide lokaal dunner te maken. 189

194 niveaus door de leesversterkers (Eng. Sense Amplifiers). De versterkers zijn niets anders dan asynchrone flipflops waarvan de voedingsspanning afgeschakeld is tot net vóór de leesoperatie. Elke bitlijn is verbonden met een flipflop, en de spanning erop spanning vormt de begintoestand van de flipflop. Op het opgenblik dat de voedingsspanning over de leesflipflops aangeschakeld wordt, evolueren zij snel naar de corresponderende spanning in het L- of H-interval op de wijze die in appendix C.3 in detail wordt beschreven. Noteer dat het lezen van een cel de geheugencondensator ontlaadt, het is destructief. De uitgelezen informatie zal dus terug moeten ingeschreven worden. Na het aanbrengen van het rij-adres zal men op de adreslijnen het kolomadres aanbrengen, en ook CAS laag brengen. Het kolomadres zal uit de gelezen rij één bit selecteren, en dit naar buiten brengen. Tegelijkertijd worden de gelezen bits weer ingeschreven in de geheugencellen. Dit kan door op de bitlijnen een spanning aan te brengen die de versterkte versie is van de spanning die werd verkregen. Aangezien het rijadres nog aan ligt, worden de ontladen condensatoren selectief weer opgeladen, en dit van uit het register van de leesversterkers op de chip dat de net uitgelezen bits bevat. Na verloop van tijd brengt men RAS en CAS weer hoog, en de leesoperatie is afgelopen. Men ziet dat de cyclustijd groter is dan de toegangstijd. Bij het schrijven gaat men op dezelfde manier tewerk. Enkel wordt nu bij de geselecteerde kolom niet de uitgelezen waarde teruggeschreven, maar de informatie die door de gebruiker op de datalijn werd aangebracht, en vadaar op de bitlijnen. Het sequentieel aanleggen van het adres reduceert het aantal pinnen aan de geheugenchip. Zo hebben wij voor een 4 Mbit-geheugen met een woordbreedte van 1 bit 11 adreslijnen nodig, 1 datalijn (of 2, bij gescheiden in- en outputs), RAS, CAS, het schrijfsignaal en het selectiesignaal. Bij een niet-gemultiplexeerd adres is het aantal pinnen onmiddellijk 11 hoger. Tegelijkertijd resulteert deze sequentialiteit echter in een tragere werking (hogere toegangstijd) en een complexere aansturing (controle van het tijdsverloop op RAS en CAS). De complexiteit wordt nog verder verhoogd door de noodzaak tot opfrissen (Eng. refresh). Gezien de passieve aard van de geheugenopslag, zal na verloop van tijd (enkele tientallen ms tot ettelijke seconden) de informatie van de geheugencondensatoren weglekken. De gebruiker van de chip is verantwoordelijk voor het regelmatig opfrissen van de lading op de condensatoren. Dit kan bv. door regelmatig een leesoperatie te doen. Hierbij volstaat het systematisch door alle rijadressen te lopen: wanneer men alle 2 11 rijadressen afloopt tegen een tempo van één per 16 µs, wordt ééns per 32 ms elke cel opgefrist. Sommige geheugens laten toe dit te doen door een verkorte cyclus, die enkel voor het aanleggen van het rijadres één puls op RAS vereist. Voor deze en andere details verwijzen wij naar de componentspecificaties. De toegangstijd van dynamische geheugens kan sterk verkort worden door gebruik te maken van de zg. paginamode (Eng. page mode). Hierbij wil men lezen op adressen die alle behoren tot dezelfde rij. Zoals men kan inzien moet men het rijadres maar éénmaal aanleggen, en dan de kolomadressen binnen die rij, elk voorzien van een signaal op CAS. Bij sommige dynamische geheugens hoeft men zelfs geen CAS-signaal meer aan te leggen bij een verandering van het kolomadres. Dit noemt men static column mode. Wanneer de adressen louter sequentieel oplopen kan een teller op de geheugenchip er zelfs voor zorgen dat men de kolomadressen niet zelf moet aanleggen (Eng. nibble mode), voor 4 opeenvolgende bits). Lezen op deze manier zal de toegangstijd ongeveer halveren, en hem reduceren tot een waarde die vergelijkbaar is met de toegangstijd tot statische geheugens uit dezelfde technologie. Tabel 6.3 geeft enkele karakteristieken van hedendaagse 190

195 Tabel 6.3: De eigenschappen van enkele commerciële dynamische geheugenchips. (*): dynamisch geheugen zonder adresmultiplexering; (**): EDRAM. Noteer dat de geheugenafmetingen exponentieel snel groeien in de tijd, en dat een dergelijke tabel snel achterhaald is. Gigabitgeheugens (4 Gb) zijn in onwikkeling Type capaciteit cyclustijd toegangstijd (ns) pinnen (woorden bit) (ns) volledige cyclus page mode HM K MCM M MCM M HM (*) 1M DM (**) 1M / dynamische geheugenchips. Speciale vormen. Naast de geheugens met de gewone structuur die wij hierboven beschreven hebben bestaan er een aantal speciale vormen, die bijzonder nuttig zijn in geavanceerde digitale systemen. Ons overzicht zal echter zeer beperkt zijn: een diepere behandeling valt buiten het kader van de cursus. Wij raden de geïnteresseerde lezer aan hiervoor de catalogi van de diverse fabrikanten te raadplegen. Een eerste speciale vorm is een vorm die gebruikt wordt als communicatiehulpmiddel tussen asynchroon werkende digitale systemen: de zg. FIFO-geheugens (van First In, First Out). De bedoeling van dit soort geheugens is het maken van een soort wachtlijn tussen twee systemen. Het eerste systeem schrijft woorden in het geheugen, echter zonder een adres op te geven: de ingangspoort ziet eruit als een register. Intern worden de ingeschreven gegevens in individuele plaatsen weggeschreven. Aan de leeskant kan men, ook zoals bij een register, de gegevens teruglezen in de volgorde waarin ze werden ingeschreven. Aan de schrijfkant heeft men een signaal dat aangeeft of het geheugen al dan niet vol zit; aan de leeskant een indicatie over het al dan niet leeg zijn. Lees- en schrijfkant kunnen simultaan (en asynchroon van elkaar) actief zijn. Een tweede speciale vorm is de VRAM (Video RAM). Dit is in feite een gewone dynamische RAM, waarbij men een gelezen rij volledig kan transfereren naar een ingebouwd schuifregister. Hiervoor volstaat het een controlelijn te activeren gedurende een RAS-cyclus. De gegevens in dit schuifregister kan men dan verder naar buiten schuiven, onafhankelijk van de werking van de rest van de chip. Omgekeerd kan men ook gegevens inschuiven in het schuifregister, die nadien in één schrijfoperatie kunnen gedeponeerd worden in een rij van de geheugenmatrix. Dit soort geheugens werd ontworpen voor de aansturing van beeldschermen. Het herhaaldelijk lezen van het geheugen volgens de door de beeldbuis vereiste scanvolgorde gebeurt via het ingebouwd schuifregister, en laat de toegang tot het geheugen voor de processor(en) die het beeld moeten aanbrengen vrijwel volledig beschikbaar. Af en toe zal een extra geheugencyclus moeten ingelast worden die een rij leest en transfereert naar het schuifregister. Een derde speciale geheugenvorm is deze van de enhanced DRAM, EDRAM. Hier maakt men ook gebruik van een ingebouwd register dat de gegevens van één rij uit de matrix kan bevatten. Wanneer het geheugen gelezen wordt op een gegeven rijadres zal de chip nagaan of dit niet een rij is waarvan een kopie opgeslagen ligt in het rijregister. Wanneer dit het geval is kan men de informatie uit het rijregister lezen; dit kan gebeuren 191

196 met de snelheid van een statisch geheugen. Wanneer de rij niet bevat zit in een rijregister, moet ze gelezen worden met een intern gegenereerde RAS-cyclus. Het rijregister vormt een soort cache voor de eigenlijke geheugenmatrix (voor een behandeling van caches, zie cursus Computerarchitectuur ). Processors (Micro-)processors zijn een tweede vorm van een heel complexe component, die, ondanks zijn complexiteit, in zeer grote oplagen gemaakt kan worden. De reden hiervoor moet weer gezocht worden in de universele inzetbaarheid van de component in een zeer ruime klasse van toepassingen. Microprocessors dit zijn processors die bestaan uit één of een zeer klein aantal chips zijn uiteraard de bouwstenen voor computers. De structuur en eigenschappen van computers komen gedetailleerd aan bod in andere cursussen, en zullen hier dus niet behandeld worden. Wel is het nuttig hier de processor te bekijken vanuit het gezichtspunt van de ontwerper van digitale systemen: de processor is een component die als bouwsteen kan gebruikt worden voor de realisatie van een klasse digitale problemen. In het bijzonder komen de syntheseproblemen die gekenmerkt worden door een complexe functionaliteit waar echter geen extreme eisen gesteld worden aan de uitvoeringssnelheid in aanmerking voor realisatie met (onder meer) processors. Microprocessors vormen een familie van componenten, die een ruim gebied overspannen gekenmerkt door uiteenlopende compromissen tussen snelheid en complexiteit. Niettemin is de basisstructuur van de meeste processors zeer stereotiep: zij hebben een Von Neumann- of een Harvard-architectuur. Processors bestaan uit een controlegedeelte en een datapad. Het datapad zelf bestaat uit een aantal registers en één of meerdere combinatorische operatoren, die onderling geconnecteerd worden door één of meerdere bussen. Het controlegedeelte zelf bestaat ook uit een aantal registers en een hoeveelheid combinatorische functies. Samen vormen zij een automaat die instaat voor de controle van het datapad. Een processor moet aangevuld worden met een geheugen (twee in het geval van machines met een Harvard-architectuur), waarin de programma s en de gegevens worden opgeslagen die in feite een realisatie vormen van het te synthetiseren gedrag. De connectie met de buitenwereld gebeurt via I/O-voorzieningen, die in vele gevallen eveneens extra aangebracht moeten worden. Van componentzijde uit bekeken zijn er belangrijke verschillen tussen de diverse types microprocessors. Deze verschillen hebben vooral betrekking op de fysische vorm die de processor zal aannemen (bv. het aantal chips), en de prestaties die hiermee overeenstemmen. Wij zullen nu kort enkele voor digitale synthese belangrijke vormen analyseren. Wij laten bewust de processors voor algemeen gebruik weg uit ons overzicht, omdat deze elders voldoend aan bod komen. Microcontrollers. De eenvoudigste processorvorm voor wat betreft digitaal ontwerp is zeker de microcontroller. Microcontrollers bieden complete oplossingen, in de zin dat vele eenvoudige syntheseproblemen integraal met één controllerchip kunnen opgelost worden. Dit vereist uiteraard dat alle nodige systeemonderdelen geïntegreerd werden op één chip, en zulk een chip noemt men een microcontroller. Een microcontroller bevat dus, naast een eigenlijke processor, een zekere hoeveelheid geheugen waarin programma s en data kunnen opgeslagen worden, een klokgenerator, en een aantal I/O-poorten. De I/Opoorten worden verbonden met de pinnen van de chip. 192

197 Het is duidelijk dat het samenbouwen van al deze onderdelen op dezelfde chip sterke restricties oplegt aan de prestaties van de component. Zo zal men meestal relatief kleine woordlengten hebben (4, 8 en 16 bit zijn de meest voorkomende; 32 bit bestaat echter ook). Het aantal bussen in het datapad van de processor is meestal zeer beperkt, wat de snelheid van de component relatief laag houdt. Tevens is de hoeveelheid programmaen datageheugen op de chip beperkt, zodat alleen relatief eenvoudige problemen een oplossing krijgen onder de vorm van één chip. Uitbreidingen van de geheugenafmetingen zijn echter meestal mogelijk door een gedeelte van de I/O-kanalen (pinnen van het IC) te gebruiken als toegangspad tot een extern geheugen. De meeste microcontrollers bevatten ook een aantal zeer specifieke en probleemgerichte I/O-voorzieningen, vaak onder de vorm van wat men een coprocessor zou kunnen noemen. Voorbeelden zijn: één of meerdere tellers, die kunnen gebruikt worden als timer (ware-tijdstoepassingen), als teller van externe gebeurtenissen of als generator van pulsbreedte-gemoduleerde signalen; communicatie-interfaces, bv. voor seriële asynchrone of synchrone communicatie (RS232 en aanverwante protocollen zoals de Fieldbusprotocollen CAN, ProfiBus, FIP, enz.); A/D- en D/A-convertoren die interfaces met de analoge buitenwereld mogelijk maken. De instructierepertoires van microcontroller zijn ook aangepast aan de beoogde toepassing. Vaak vindt men instructies die logische bewerkingen op signalen van één bit vergemakkelijken (bijvoorbeeld voor toepassingen in digitale controle, zoals de realisatie van PLC s). Figuur 6.9 geeft ter illustratie een beeld van de structuur van een klassieke, maar veelgebruikte microcontroller. Processors voor speciaal gebruik. Er bestaan een groot aantal processors die speciaal gericht zijn op de uitvoering van programma s die voorkomen in een specifieke klasse problemen. Voorbeelden van dergelijke probleemklassen zijn digitale signaalverwerking en grafische toepassingen. Digitale signaalverwerking (DSP) vereist architecturen die snel de primitieve stappen van digitale filters kunnen uitvoeren en andere veel voorkomende operaties zoals bv. Fouriertransformatie. De aard van de toepassing vereist het gebruik van reële getallen in één of andere voorstelling. De basisstap in vele digitale filters is de evaluatie van de uitdrukking y = a 1 X 1 + a 2 X a n X n waarin de a i coëfficienten zijn, en de X j vertraagde versies van een signaal. De grootheid y laat zich berekenen door een opeenvolging van vermenigvuldigingen en accumulaties met het reeds berekende partieel resultaat. Vele signaalprocessors bevatten dan ook voorzieningen om deze multiply/accumulate operation bijzonder snel uit te voeren. Meestal voorziet men ook in een manier om de coëfficiënten en de signaalwaarden gelijktijdig uit een geheugen te halen. Voorbeelden van dergelijke processors zijn de TMS320C40 en de MC Grafische processors zijn gericht op de snelle generatie van beelden in een beeldgeheugen, zoals nodig voor een beeldscherm of printer. Speciale eisen gesteld aan grafische processors zijn bv. het snel kunnen genereren van digitale rechten (Bresenham s algoritme), het copiëren van bitmaps ( bitblt ), het genereren van rechthoeken en meer algemene polygonen, het opvullen van een gesloten gebied met een opgegeven kleur (flooding), het uitvoeren van berekeningen voor het vinden van verborgen oppervlakken, het berekenen van de kleur van objecten (Gouraud en Phong shading), het combineren en converteren 193

198 P P0.7 P P2.7 Data Address Register Port 0 Drivers Port 2 Drivers Voorziening voor extern geheugen RAM Port 0 Latch Port 2 Latch EPROM B-register Accumulator Temp2 Temp1 Stack Pointer Program Address Register Buffer klok Timing, controle instructieregister PSW ALU Interrupt, seriele poort, timers PC Incrementer Program Counter DPTR Port 1 Latch Port 3 Latch Port 1 Drivers Port 3 Drivers P P1.7 P P3.7 Figuur 6.9: De structuur van Intel s bit microcontroller 194

199 Figuur 6.10: De architectuur van de Programmable Logic Sequencer van kleurwaarden, enz. Soms bieden grafische processors een tweedimensionele adressering van hun geheugenruimte. Grafische processors zijn ook vaak verantwoordelijk voor de CRT-functie, dit is het genereren van de controlesignalen voor het gesynchroniseerd uitlezen van het beeldgeheugen, en het generen van synchronisatiesignalen voor de beeldbuis. Een voorbeeld van een grafische processor is de TMS Andere toepassingen slaan op de snelle interpretatie van PostScript in printers. Processors voor speciaal gebruik hebben heel vaak specifieke architecturale aspecten voor de efficiënte ondersteuning van hun instructieset. De meest recente aanvulling gaat in de richting van multi-media-extensies. 6.2 Programmeerbare componenten De meeste hedendaagse programmeerbare componenten bevatten geheugenelementen, en zijn dus sequentiële componenten. Toen men een combinatorische PLA voorzag van een aantal flipflops, en men voerde de toestand van de flipflops terug in de EN-matrix, verkreeg men de structuur van een PLS (Programmable Logic Sequencer). Veel variaties zijn mogelijk: men kan bv. de flipflop-outputs ook naar buiten brengen, of men kan de overige outputs ook voorzien van een register (dat dan niet teruggevoerd wordt). De structuur van de historische PLS in figuur 6.10 roept onmiddellijk associaties op met de generieke structuur van een synchrone automaat (fig. 6.3). Inderdaad, een PLS is een beperkt universele component voor de realisatie van eenvoudige, eindige automaten (Eng. state machines). De toestand van de automaat wordt bijgehouden in het register, en de toestand- en outputfuncties worden gezamenlijk geminimaliseerd en geprogrammeerd in de PLA. 195

200 De PLS is beperkt universeel omdat er uiteraard beperkingen zijn zowel in het aantal flipflops als in de PLA bij de realisatie van willekeurige functies. Voor eenvoudige controle-automaten vallen de beperkingen nogal mee, omdat de complexiteit van het toestandstransitiediagram (het aantal takken) bepalend is voor het aantal EN-poorten dat men zal nodig hebben. Ook PAL s kan men uitbreiden met registers. Men schakelt achter de OF-poorten flankgestuurde flipflops met een gemeenschappelijke klok. Hun toestand wordt zowel naar buiten gebracht als teruggekoppeld. De automaten die men op deze manier verkrijgt zijn Moore-automaten met directe toestandsoutput (de outputfunctie is triviaal de identiteitsfunctie). Ook dit is een beperking, die gelukkig ook niet ernstig is. Rechtstreekse output van de toestanden leidt natuurlijk tot snelle circuits, en heeft een aantal voordelen bij de interconnectie van automaten die in het volgend hoofdstuk aan bod zullen komen. PAL s voorzien van flipflops noemt men registered PALs. Sommige van deze PAL s brengen een aantal outputs rechtstreeks (zonder flipflop) naar buiten, en de rest via een flipflop. Gaandeweg is men de flipflop van een registered PAL beginnen uitbreiden met een aantal configuratiemogelijkheden. Een uitgebreide flipflop noemt men een macrocel. Figuur 6.11 toont de structuur van een typische macrocel. De cel bezit een aantal ENpoorten, die alle aangesloten zijn op de programmeerbare EN-matrix. Een aantal ENpoorten worden vast naar een OF-poort gevoerd. Deze OF-poort berekent een combinatorische functie van de variabelen in de EN-matrix. Door programmeerbare multiplexers kan men nu de macrocel configureren. Men kan kiezen of men de flipflop al dan niet gebruikt. Wanneer men de flipflop gebruikt kan men vastleggen welk klokgedrag hij heeft (flank- of niveausturing). Men kan kiezen met welk kloksignaal hij zal aangestuurd worden: de globale klok (synchroon) of een kloksignaal afgeleid uit een EN-poort. Men kan de flipflop asynchroon zetten of wissen, met termen uit de EN-matrix. De macrocel heeft ook een multiplexer voor de outputcontrole, en een voor de keuze van het feedbacksignaal (de pin of de flipflop). Noteer dat, door een geschikte instelling van de multiplexers, men de flipflop als ingangsflipflop kan gebruiken: men kan het signaal op de pin aan de ingang van de flipflop brengen, en de output van de flipflop terugvoeren naar de matrix. Hedendaagse programmeerbare componenten kunnen steeds grotere ontwerpen bevatten (bijvoorbeeld een volledige processor) en halen kloksnelheden tot enkele honderden MHz (zie tabel 6.5). In deze componenten is er een trend naar hiërarchisch opgebouwde structuren (i.p.v. de oorspronkelijke vlakke, regelmatige roosters). De basisblokken worden groter en bestaan nu bijvoorbeeld uit 4 functiegeneratoren, die bovendien gecombineerd kunnen worden om tot 6 verschillende functies te genereren (bv. de Xilinx Spartan componenten). Ook de interconnectiestructuur wordt steeds complexer en is hiërarchisch opgebouwd. Ook voorziet men FPGA s steeds vaker van een aantal componenten die er eerder op gericht zijn om specifieke applicaties te versnellen. Daarmee wijkt men dus af van het oorspronkelijke concept van algemene bruikbaarheid. Een typisch voorbeeld hiervan zijn de speciale verbindingen om de carry-propagatie te versnellen (carry chains) die in veel recente componenten aanwezig zijn, of diverse vormen van geheugen. Dit zijn zijn uitbreidingen die zich situeren op het RT-niveau. Zo worden vaak grotere blokken RAM (blokgeheugen) in de FPGA aangeboden, ter 196

201 Figuur 6.11: De structuur van een macrocel in een PLA-achtige programmeerbare component. Noteer dat de EN-matix alle macrocellen voorziet van dezelfde inputs 197

202 Tabel 6.4: Enkele complexe programmeerbare componenten; kijk ook naar voor meer recente informatie Component Complexiteit CLB s of Type I/O- Programmeer- (equiv. poorten) Macrocellen signalen techniek Am Cell Array 144 Geheugen EPM PLA-achtig 72 Vlottende gate EPM PLA-achtig 124 Vlottende gate CY7C PLA-achtig 60 Vlottende gate CY7C PLA-achtig 328 Antifuse TPC1020B Cell Array 69 Antifuse TPC Cell Array 140 Antifuse XC Cell Array 240 Geheugen XC40125EX Cell Array 544 Geheugen Tabel 6.5: Recente complexe programmeerbare componenten met extra geheugenblokken Component Complexiteit Functie- Geheugen (equiv. poorten) generatoren flipflops blok (bits) ProASIC APA1000 (Actel) 1M Spartan-IIE XC2S300E (Xilinx) Virtex-E XCV812E (Xilinx) Apex II EP2A70 (Altera) aanvulling van de flipflops die in de CLBs aanwezig zijn (gedistribueerd geheugen). Deze geheugens zijn vaak tweepoortgeheugens, en ook zij situeren zich voornamelijk op RTniveau. Tenslotte bieden FPGA-fabrikanten ook vaak reeds ontworpen (sequentiële) bouwblokken (zogenaamde Intellectual Property of IP-blokken) te koop aan. Deze zijn vergelijkbaar met standaard cellen en kunnen rechstreeks in een FPGA geprogrammeerd worden. Zo kan men hele processorontwerpen kopen die men als zg. soft core mee kan realiseren op de FPGA, samen met de eigen circuits. 198

203 Hoofdstuk 7 Sequentiële synthese op logisch niveau Dit hoofdstuk heeft als doel in detail de stappen van het syntheseproces van sequentiële netwerken te bespreken, op een manier gelijkaardig aan wat wij gedaan hebben voor combinatorische schakelingen. Ook hier is het zo dat in de dagelijkse ontwerppraktijk deze algoritmen niet expliciet, laat staan manueel, moeten uitgevoerd worden, maar dat zij ingebouwd zijn in de computergebaseerde ontwerpomgevingen. Zoals bij elke synthese-opdracht vertrekken wij ook bij de synthese van sequentiële netwerken vanuit een beschrijving van het gewenste gedrag. De synthese heeft dan als doel een sequentieel netwerk te realiseren, bestaande uit geheugenelementen en combinatorische netwerken, dat minstens het gewenst gedrag vertoont maar bovendien aan een aantal optimaliteitscriteria voldoet. De eerste stap in een synthese is altijd het herformuleren van het gewenst gedrag in één of andere formele gedaante, zodanig dat men nadien systematische ontwerpsmethoden kan gebruiken. Bij de synthese van combinatorische netwerken hebben wij hiervoor gebruik gemaakt van Boolese vormen, mintermlijsten (eventueel aangevuld met DON T CARE termen) of subkubuslijsten. Deze vormen zijn gemakkelijk af te leiden uit een verbale beschrijving van het gewenste combinatorisch gedrag. Maar hoe gaan wij tewerk bij sequentiële netwerken? In Hoofdstuk 4 hebben wij gezien dat een incrementele beschrijving, die gebruik maakt van de interne toestand en de twee functies f u en f s, compact en efficiënt is. Het probleem is echter dat de beschrijving van het gewenst gedrag meestal handelt over het input/outputgedrag, en niet over de interne structuur van de automaat. De synthese van een sequentieel netwerk moet dus beginnen bij de beschrijving van het gewenste gedrag, en deze zo snel mogelijk omzetten in een vorm waaruit een incrementele beschrijving kan worden afgeleid. Aangezien de beschrijving van het gewenste gedrag informeel is (gesteld in natuurlijke taal, gedeeltelijk grafisch, onvolledig), kan deze eerste ontwerpsstap zelf niet anders zijn dan informeel, en moet dus door de ontwerper zelf uitgevoerd worden. 199

204 7.1 Incrementele gedragsbeschrijvingen Laat ons vertrekken van een input/output gedragsbeschrijving. Deze beschrijving legt dus op welke outputsequenties het netwerk moet genereren wanneer een gegeven stel inputsequenties wordt aangelegd. Wij zullen de procedure uiteenzetten aan de hand van een voorbeeld. Voorbeeld 7.1 Ontwerp een synchroon netwerk met één input X en één output Y. De output moet steeds 0 zijn, tenzij wanneer in de inputsequentie juist de deelsequentie is opgetreden : X : Y : (Noteer dat wij ervoor gekozen hebben de 1-output te laten komen de klokperiode nadat het laatste symbool van de inputsequentie werd gezien; wij hadden dit ook tijdens het laatste symbool kunnen kiezen.) Een incrementele realisatie van dit gedrag komt neer op het opstellen van een algoritme dat stap voor stap de outputs berekent, gegeven de vorige inputs. Het algoritme bestaat uit een eindig aantal stappen. Wanneer het in een bepaalde stap zit, en er doet zich een nieuwe gebeurtenis voor (het optreden van een actieve klokflank in een synchrone automaat, het veranderen van een input in een asynchrone automaat), dan zal in die stap bepaald worden welke output moet gegenereerd worden, en welke volgende stap van het algoritme aangesproken wordt. Wij illustreren nu het opstellen van zo n algoritme aan de hand van voorbeeld 7.1. De eerste stap van het algoritme komt overeen met het begin van de sequentie. Hier weten wij dat er nog geen inputs aangelegd zijn; de output moet 0 zijn voor elke input. Afhankelijk van het eerste inputsymbool gaan we naar verschillende stappen: wij moeten immers een aantal voorbije inputs onthouden om te kunnen beslissen of we net een sequentie gezien hebben. Het is dus duidelijk dat elke stap in het algoritme een bepaalde vorm van kennis inhoudt over de reeds geziene inputsymbolen. Algoritme [Begin van sequentie] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap [Enkel 0 gezien] Output 0; Als X = 0, ga dan naar stap 4, anders naar stap [Enkel 1 gezien] Output 0; Als X = 0, ga dan naar stap 6, anders naar stap 7. Nu moeten wij stap 4 neerschrijven. Stap 4 zou overeenstemmen met de kennis Enkel 00 gezien. Het is niet moeilijk om in te zien dat, indien wij moeten herkennen in de inputsequentie, van de laatst geziene 0 enkel moet onthouden worden of ze voorafgegaan wordt door 11 of In de andere gevallen hebben wij geen deel gezien van de te 200

205 herkennen sequentie, en moeten wij dus niet onthouden wat vóór de 0 kwam. Mits wij stap 2 wijzigen kunnen wij dus stap 4 laten samenvallen met stap 2. Zo verder gaand vinden wij : Algoritme [Begin van sequentie] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap [Een 0 gezien, niet voorafgegaan door 11 of 1101] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap [Een 1 gezien, niet voorafgegaan door 1 of 110] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap [11 gezien] Output 0; Als X = 0, ga dan naar stap 5, anders naar stap [110 gezien] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap [1101 gezien] Output 0; Als X = 0, ga dan naar stap 7, anders naar stap [11010 gezien: herkenning] Output 1; Als X = 0, ga dan naar stap 2, anders naar stap 3. Dit proces stopt dus nadat we 7 algoritmestappen gevonden hebben. In het algemeen zal, wanneer de opgegeven gedragsbeschrijving realiseerbaar is met een (eindig) sequentieel netwerk, het creatieproces van nieuwe stappen termineren na een eindig aantal stappen. Elk van de stappen representeert een stuk informatie dat afkomstig is uit de reeds geziene inputsymbolen. De stappen uit het algoritme zijn dus in feite de toestanden van een sequentieel netwerk. De corresponderende functies liggen vervat in de acties ondernomen in elke stap. De primitieve toestandstransitietabel Men kan het bovenstaand algoritme voorstellen op diverse manieren. Een in onderzoeksmiddens veel gebruikt formaat is het zg. Blif-formaat (figuur 7.1). In de praktijk zal men de eerste concrete gedragsbeschrijving van de automaat formuleren in een taal zoals VHDL of VERILOG, waarbij men dan meteen ook, naast de opgave van de functies f s en f u moet aangeven wat het klokgedrag van de automaat moet zijn, en of het over een Moore- of Mealy-variant gaat. Men kan dezelfde informatie, voor verdere verwerking, opslaan in een zg. primitieve toestands-transitietabel (ttt) waaruit de toestanden en de netwerkfuncties kunnen worden afgelezen (fig. 7.2). De tabel in deze figuur is volledig bepaald. In het algemeen is dit echter niet zo, omdat b.v. bepaalde inputwaarden niet kunnen of mogen optreden, of omdat men gewoonweg niet opgeeft wat er dan moet gebeuren. Laat ons dit illustreren aan de hand van een tweede voorbeeld. 201

206 .model.inputs X.outputs Y.start_kiss.i 1.o 1.p 14.s 7 0 A B 0 0 B B 0 0 C B 0 0 D E 0 0 E B 0 0 F G 0 0 G B 1 1 A C 0 1 B C 0 1 C D 0 1 D D 0 1 E F 0 1 F D 0 1 G C 1.end_kiss library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity herkenner is port ( clock: in STD_LOGIC; init: in STD_LOGIC; data: in STD_LOGIC; output: out STD_LOGIC ); end herkenner; architecture gedrag of herkenner is type statevalue is (A,B,C,D,E,F,G); signal state: statevalue; begin process(clock)is begin if clock event and clock = 1 then -- positieve flanksturing if init= 1 then state<=a; -- initialisatie else -- operatie case state is when A => -- begintoestand if data= 0 then state<=b; else state<=c; end if; when B => -- 0 niet voorafgegaan door 11 of 110 if data= 0 then state<=b; else state<=c; end if; when C => -- 1 niet voorafgegaan door 1 of 110 if data= 1 then state<=d; else state<= B; end if; when D => gezien if data= 0 then state<=e; else state<=d; end if; when E => gezien if data= 1 then state<=f; else state<=b; end if; when F => gezien if data= 0 then state<=g; else state<=d; end if; when G => gezien : herkenning! if data= 1 then state<=c; else state<=b; end if; when others => -- Dit zou moeten leiden tot don t care-termen null; end case; end if; end if; end process; -- assigneer output op basis van nieuwe toestand (Moore-automaat) output<= 1 when (state=g) else 0 ; end gedrag; Figuur 7.1: Concrete representaties van het algoritme dat het gewenste gedrag weergeeft. Het formaat links is het zg. Blif-formaat, met een ingebedde Kiss-beschrijving, en wordt gebruikt in de SIS-suite van de Universiteit van Berkeley. Men ziet dat de inputs en outputs van het systeem opgegeven worden, alsook het het aantal toestanden en het aantal regels die transities weergeven. Elke transitie geeft achtereenvolgens de inputwaarden, de huidige toestand, de nieuwe toestand en de output weer. Het formaat rechts is een gedragsbeschrijving in VHDL, die echter rijker is dan de Blif-beschrijving links. Ondermeer de initialisatie en het klokgedrag worden hier expliciet weergeven 202

207 Toestand X Y Informatie over vorige inputs 0 1 A B C 0 initiële toestand B B C 0 0 niet voorafgegaan door 11 of 1101 C B D 0 1 niet voorafgegaan door 1 of 110 D E D 0 11 E B F F G D G B C Figuur 7.2: Primitieve transitietabel voor Voorbeeld 7.1 Toestand X 1 X 2 Y Informatie over vorige inputs X 1 tijdens X 2 X 1 X 2 A A B C B D B E C A F C D D B G E B E G F H F I G D F G H J H F I J F I J J B I Figuur 7.3: Primitieve transitietabel voor Voorbeeld 7.2 Voorbeeld 7.2 Ontwerp een asynchroon circuit met twee inputs X 1 en X 2, en één output Y. De output verandert enkel na een stijgende flank op X 2 ; de output is 1 resp. 0 na een stijgflank op X 2 met X 1 = 1 resp. X 1 = 0. (Noteer dat dit een gedragsomschrijving is van de flankgestuurde geheugencel met D-gedrag in fig. 5.5.) Laat ons beginnen met X 1 = 0, X 2 = 0, en Y = 0. Deze keuze is arbitrair, maar wordt niet tegengesproken door de gedragsbeschrijving. Wij zullen meteen het incrementeel algoritme voorstellen in een tabel. Bij het opstellen van deze tabel zorgen wij ervoor dat er maar één stabiele toestand per rij optreedt. Voorts laten wij slechts Hammingafstand-1 overgangen toe aan de inputs. De tabel die wij zo verkrijgen is onvolledig gespecificeerd. Wij noemen hem de primitieve toestands-transitietabel (fig. 7.3). 7.2 Het minimaliseren van het aantal toestanden Eens men de (primitieve) toestands-transitietabel (ttt) heeft opgesteld kan men de verdere stappen ondernemen om te komen tot een concrete realisatie van het netwerk. De primitieve ttt werd op een zeer informele manier opgesteld, soms met arbitraire 203

208 keuzen, en op basis van een informele beschrijving. Het is dan ook niet te verwonderen dat er meestal veel mogelijke primitieve ttt n kunnen gevonden worden die hetzelfde gedrag formaliseren. Sommige daarvan hebben minder toestanden nodig dan andere, en wij vragen ons af of wij, op een systematische wijze, een formalisering kunnen vinden met een minimaal aantal toestanden. Het antwoord op deze vraag is JA: men kan een algoritme opstellen dat, in eindige tijd, elke ttt kan herleiden tot een gelijkwaardige ttt met een minimum aantal toestanden. Wij zullen nu zulk een algoritme beschrijven. Daar er een verschil bestaat tussen volledig en partieel bepaalde ttt n, zullen wij elk apart behandelen. Volledig bepaalde transitietabellen Laat ons eerst definiëren wat wij bedoelen met gelijkwaardige ttt n en toestanden. Definitie 7.1 Twee toestandstransitietabellen P en Q zijn gelijkwaardig, P Q, indien een van beide voorwaarden is voldaan: 1. (wanneer P en Q elk vanuit een gegeven begintoestand starten) P en Q genereren identieke outputsequenties voor alle toegelaten inputsequenties. 2. (wanneer geen begintoestanden opgegeven zijn) voor elke begintoestand p van P bestaat er minstens één begintoestand q van Q, en omgekeerd, van waaruit P en Q identieke outputsequenties genereren bij alle toegelaten inputsequenties. Het is duidelijk dat een equivalentierelatie voorstelt (waarom?). Definitie 7.2 Een interne toestand p van een ttt P is gelijkwaardig met een toestand q van een ttt Q, p q, wanneer P Q vanuit de begintoestanden p resp. q. Noteer dat bovenstaande definitie ook mag toegepast worden op toestanden van dezelfde ttt. De equivalentierelatie induceert dus een partitie op de toestandsverzameling S. Wanneer wij in een ttt met twee gelijkwaardige toestanden p en q, de rij corresponderend met q schrappen, en voorts alle referenties naar q vervangen door p, dan verkrijgen wij een nieuwe ttt die gelijkwaardig is met de originele (waarom?), maar minder toestanden heeft. Wij kunnen dit blijven doen tot wanneer de ttt geen gelijkwaardige toestanden meer bevat. De ttt die we dan verkrijgen heeft precies één toestand per equivalentieklasse in de oorspronkelijke ttt. Om deze procedure effectief te kunnen uitvoeren moeten wij echter beschikken over een eindige test die kan uitmaken of twee toestanden equivalent zijn. De definitie van is immers niet zonder meer berekenbaar (men zou een onbegrensd aantal sequenties van onbegrensde lengte moeten testen). Laat ons hiertoe wat notatie invoeren. Weze X {0, 1} n het inputalfabet van de ttt, dit zijn alle mogelijke binaire patronen op de n inputlijnen. Het aantal outputs is m. Weze S de toestandsruimte (de verzameling regels in de ttt). Weze tenslotte f u f s : S {0, 1} n {0, 1} m : S {0, 1} n S respectievelijk de output- en toestandsfuncties gedefinieerd door de ttt. 204

209 Stelling 7.1 Twee toestanden p en q S zijn gelijkwaardig a.s.a. 1. f u (p, X) = f u (q, X), X {0, 1} n (p en q zijn outputcompatibel). 2. f s (p, X) f s (q, X), X {0, 1} n. Bewijs. Het bewijs is bijzonder eenvoudig en wordt overgelaten aan de lezer. Stelling 7.1 herfraseert de definitie van in een recursieve vorm. Dit garandeert echter nog geen equivalentietest in een eindig aantal stappen. De volgende stelling toont aan dat dit evenwel mogelijk is. Stelling 7.2 Er bestaat een algoritme dat, gegeven een willekeurige eindige ttt, in een eindige tijd kan uitmaken welke toestanden gelijkwaardig zijn. Bewijs. Het bewijs is constructief en bestaat uit het volgende algoritme. 1 Algoritme 7.3 (Het vinden van gelijkwaardige toestanden in een ttt) 1. Stel een lijst op van alle koppels (p, q) S 2, p q. Merk deze koppels aan die outputincompatibel zijn, d.i. waarvoor X {0, 1} n : f u (p, X) f u (q, X) 2. Doe voor alle koppels (p, q) die wel outputcompatibel zijn het volgende: zoek alle opvolgerkoppels (f s (p, X), f s (q, X)), X {0, 1} n, van (p, q) in de lijst van stap 1. Schrijf (p, q) achter elk zulk opvolgerkoppel. Men verkrijgt dus een lijst van koppels (p, q), elk gevolgd door een (mogelijk lege) lijst van koppels die voorafgaan aan het koppel (p, q):. (p, q). : {(p, q ) : X {0, 1} n : p = f s (p, X) en q = f s (q, X)} 3. Loop sequentieel door de lijst. Voor elk gemerkt koppel (p, q), merk ook de voorgangerkoppels aan als incompatibel. Merk (p, q) aan als gebruikt. 4. Herhaal stap 3 tot wanneer alle gemerkte koppels ook gebruikt zijn. Alle gemerkte koppels zijn dus niet-gelijkwaardig, hetzij rechtstreeks, omdat ze outputincompatibel zijn, of onrechtstreeks, omdat ze leiden tot een ander niet-gelijkwaardig koppel. Nu rest er ons nog te bewijzen dat de toestanden in alle niet-gemerkte koppels wel paarsgewijs gelijkwaardig zijn, en dat bovenstaand algoritme termineert. 1. Elk niet-gemerkt koppel (p, q) is gelijkwaardig (a) Bij constructie van de tabel zijn p en q outputcompatibel; 1 Ons bewijs bevat één algoritme; er bestaan echter diverse verwante algoritmen hiervoor, zie o.m. cursus Discrete systemen. 205

210 (b) Stel dat f s (p, X 0 ) f s (q, X 0 ), voor een gegeven X 0 {0, 1} n. Uit de definitie van volgt dan dat er een eindige sequentie van inputs X 1, X 2,..., X k, k > 0, bestaat waarvoor er een verschil in outputs waargenomen wordt, d.i., Hierin is 2. Terminatie f u (F s (p, X 0 X 1 X k 1 ), X k ) f u (F s (q, X 0 X 1 X k 1 ), X k ). F s (p, X 0 X 1 X k 1 ) = f s (f s ( f s (p, X 0 ), X 1 ), X k 1 ), de toestand die bereikt wordt vanuit p na aanleggen van X 0 X 1 X k 1. Wij veronderstellen dat X 0 X 1 X k 1 een kortst mogelijke zulke sequentie is. De toestanden F s (p, X 0 X 1 X k 1 ) en F s (q, X 0 X 1 X k 1 ) zijn niet outputcompatibel, en werden dus zeker aangemerkt in stap 1 van het algoritme. Alle tussentoestanden F s (p, X 0 X 1 X j ) en F s (q, X 0 X 1 X j ), j = 0, 1,..., k 2, zijn wel outputcompatibel. Stap 2 zorgt er dus voor dat zij alle voorkomen in de lijsten achter hun respectieve opvolgerkoppels. Het k maal toepassen van stap 3 zorgt dan voor de propagatie van het merkteken, vanuit het koppel (F s (p, X 0 X 1 X k 1 ), F s (q, X 0 X 1 X k 1 )) tot aan het koppel (p, q). De onderstelling dat (p, q) niet gemerkt was leidt dus tot een tegenspraak, waaruit volgt dat en dus, samen met (a), dat p q. f s (p, X 0 ) f s (q, X 0 ), Het aantal gemerkte, en het aantal gebruikte en gemerkte koppels is begrensd, en neemt nooit af. Beide aantallen bereiken dus na een eindig aantal stappen hun limietwaarde, waarna het algoritme termineert. Uit bovenstaand algoritme volgt een lijst van koppels die gelijkwaardig zijn. Door gebruik te maken van de transitiviteit ( is een equivalentierelatie) kunnen wij hieruit de partitie afleiden van S geïnduceerd door. Figuur 7.4 toont de toepassing van bovenstaand algoritme op voorbeeld 7.1, en de resterende minimale ttt. Onvolledig bepaalde transitietabellen Uit voorbeeld 7.2 blijkt dat, i.h.b. bij het ontwerpen van asynchrone netwerken, de primitieve ttt niet volledig bepaald is omdat bepaalde inputtransities niet mogen optreden. Alvorens wij een concreet netwerk kunnen afleiden moeten de onvolledige specificaties vervolledigd worden. Net zoals bij don t care termen in combinatorisch ontwerp is het nuttig een vervollediging te kiezen die leidt tot het kleinste aantal toestanden in de geminimaliseerde ttt. 206

211 koppel M U voorgangers AB AC AD AE AF AG BC BD BE AD, BD, CD, DE BF BG AF, BF, CF, EF koppel M U voorgangers CD AC, AD, AF, BC, BD, BF CE CF AE, BE CG DE DF CE, DE, EF DG EF EG DF F G Hierin staat M voor gemerkt, en U voor gebruikt. Het resulterend gelijkwaardig koppel is (A, B). Minimale ttt: X Y 0 1 A A C 0 C A D 0 D E D 0 E A F 0 F G D 0 G A C 1 Figuur 7.4: De minimalisatie van de volledig gespecificeerde ttt van Voorbeeld

212 Hoe kan men deze vervollediging doorvoeren? Een mogelijke manier zou zijn alle S d mogelijke aanvullingen van de d don t care plaatsen te minimaliseren, en een globaal minimum te kiezen. Dit is uiteraard onbegonnen werk, gezien het aantal mogelijkheden. Wij zullen nu een meer economische manier voorstellen. Compatibele koppels Men past het algoritme uit stelling 7.2 toe, waarbij wij een als gelijkwaardig met elke toestand beschouwen. Dit betekent dat geen enkel koppel met moet opgenomen worden. In feite nemen wij dus impliciet aan dat automatisch de op elk ogenblik passende waarde aanneemt; de tabel en de lijst van de compatibele koppels die men verkrijgt zijn dus niet afkomstig van één enkele aanvulling, maar van een (ongekend) mengsel van alle nuttige aanvullingen. De resulterende compatibele koppels die men verkrijgt zijn dus niet afkomstig van één enkele equivalentierelatie (die zou ontstaan zijn bij één enkele aanvulling), maar van verschillende equivalentierelaties. Zij stellen gezamenlijk geen equivalentierelatie meer voor, i.h.b. ontbreekt transitiviteit. Laat ons dit illustreren aan de hand van fig. 7.5: de lijst van compatibele koppels bevat (A, B) en (A, C), maar niet (B, C). Opmerking. Bovenstaande methode vertrekt van een Moore-representatie van de machine. Men kan de Moore-automaat in fig. 7.3 ook als Mealy-automaat voorstellen. Immers, zolang de outputs in de stabiele totale toestanden dezelfde blijven kan men de outputs op de instabiele totale toestanden zo kiezen dat er minder outputincompatibiliteiten zijn (fig. 7.7). De lijst van compatibele koppels zou op deze manier langer kunnen worden. Men kiest de output op een instabiele toestand ofwel gelijk aan de output in de toestand waarheen de machine evolueert (dit geeft een output die snel zijn eindwaarde aanneemt), ofwel gelijk aan de output van de stabiele toestand in de huidige rij. Andere output-assignaties kunnen leiden tot hazards. Compatibele klassen Uit de lijst van compatibele koppels kunnen wij klassen identificeren die wel gesloten zijn onder transitiviteit; wij zoeken de grootst mogelijke zulke klassen. Deze worden de maximale compatibele klassen genoemd. Voor Voorbeeld 7.2 vinden wij, door manueel nazicht, (A, B, D, E), (A, C, D, G), (F, H, I), (I, J) als maximale compatibele klassen. Het vinden van de maximale compatibele klassen staat in de graaftheorie bekend als het vinden van een z.g. kliekbedekking van de compatibiliteitsgraaf. De compatibiliteitsgraaf is een graaf waarvan de knopen de toestanden van de automaat zijn, en elke tak stelt de afwezigheid van een incompatibiliteit voor. Een kliek van een graaf is een volledig geconnecteerde deelgraaf. Maximale klieken zijn dus maximale, volledig geconnecteerde deelgrafen, en deze komen overeen met de maximale compatibele klassen (figuur 7.8). Het zoeken naar klieken is een gekend moeilijk (NP-compleet) probleem. Een derde, meer systematische manier om uit de lijst van compatibele koppels de lijst van maximale compatibele klassen af te leiden is gelijkaardig aan de algebraïsche methode voor het vinden van een minimale som (Algoritme 4.5, [Marcus64]). Algoritme 7.4 (Het vinden van de maximale compatibele klassen) 208

213 koppel M U voorgangers AB AC AD AB, AG, BC, CD, CG AE AF AG AH AI AJ BC BD BE BF BG BH F J, HJ BI BJ CD CE CF CG AD, AE, AG, CD, CE CH CI koppel M U voorgangers CJ DE DF DG DH DI DJ EF BC, BG, CE, EG EG EH EI EJ F G F H F I F J GH GI GJ HI HJ IJ Compatibele koppels: (A, B), (A, C), (A, D), (A, E), (A, G) (B, D), (B, E) (C, D), (C, G) (D, E), (D, G) (F, H), (F, I) (H, I) (I, J) Maximale Compatibele Klassen : (A, B, D, E), (A, C, D, G) (I, J), (F, H, I) Figuur 7.5: De minimalisatie van de onvolledig gespecificeerde ttt van Voorbeeld

214 Minimale ttt (met a = (A, B, D, E), b = (A, C, D, G), c = (F, H, I), d = (I, J)): X 1, X 2 Y (ABDE) (AD) (B) (E) (CG) 0 (ACDG) (AD) (B) (F ) (CG) 0 (F HI) (J) (H) (F ) (I) 1 (IJ) (J) (B) (F ) (I) 1 X 1, X 2 Y a a of b a a b 0 b a of b a c b 0 c d c c c of d 1 d d a c d of c 1 Figuur 7.6: De minimalisatie van de onvolledig gespecificeerde ttt van Voorbeeld 7.2 vervolg Toestand X 1 X A A,0 B,0, C,0 B D,0 B,0 E,0, C A,0, F,1 C,0 D D,0 B,0, G,0 E, B,0 E,0 G,0 F, H,1 F,1 I,1 G D,0, F,1 G,0 H J,1 H,1 F,1, I J,1, F,1 I,1 J J,1 B,0, I,1 Volgende toestand, Y Figuur 7.7: Primitieve transitietabel voor Voorbeeld 7.2 als Mealy Machine Figuur 7.8: De compatibiliteitsgraaf, waarin men de klieken kan terugvinden 210

215 1. Schrijf een Boolese vorm waarin de incompatibele paren voorkomen als sommen, b.v. voor voorbeeld 7.2, MI = (A + F )(A + H)(A + I)(A + J)(B + C)(B + F )(B + G)(B + H) (B + I)(B + J) (G + J)(H + J) 2. Herleid deze vorm onder de gebruikelijke Boolese rekenregels. Men vindt: MI = (A + F HIJ)(B + CF GHIJ)(C + EF HIJ)(D + F HIJ) (E + F GHIJ)(F + GJ)(G + HIJ)(H + J) = (ABCDE + CF HIJ + BEF HIJ)(F G + GJ + F HIJ + GHIJ) (H + J) = ABCDEF GH + ABCDEGJ + CF GHIJ + BEF HIJ 3. Van elk van deze termen neemt men de ontbrekende factoren. Deze vormen de maximale compatibele klassen: M = (IJ)(F HI)(ABDE)(ACDG) Waarom deze methode doet wat ze moet doen kan als volgt ingezien worden. Wij geven de variabelen A,..., J de volgende betekenis: A = 1 a.s.a. de toestand A niet opgenomen wordt in een klasse. De eerste factor (A + F ) is 1 a.s.a. minstens 1 van de incompatibele toestanden A of F niet opgenomen wordt. Het product neemt de waarde 1 aan indien geen enkel incompatibel paar opgenomen werd. Alle keuzen voor de variabelen die MI 1 maken zijn dus compatibele klassen. De uitwerking tot een som van producten vereist dat minstens één product 1 is, en dit kan wanneer de toestanden die corresponderen met de optredende variabelen in het product, niet opgenomen worden in de klasse. De niet-vermelde variabelen vormen dus een maximale en compatibele klasse. De maximale compatibele klassen vormen geen partitie van S (zij zijn niet disjunct!). Elke klasse stelt een aantal consistente aanvullingen voor van de don t care transities. Zo mag men voor de klasse (ABDE) de don t care toestanden in de rijen van fig. 7.3 aanvullen tot op rij A met A, B, D, E B A, C, D, G D A, B, D, E E A, B, D, E terwijl voor de klasse (ACDG) men vindt: op rij A C D G F, H, I A, B, D, E F, H, I A, B, D, E Wanneer een toestand voorkomt in verschillende klassen is dit onder verschillende, niet compatibele aanvullingen. Het is net alsof men in de originele tabel van fig. 7.3 sommige toestanden (b.v. A) ontdubbeld heeft en in deze ontdubbelde rijen de don t care plaatsen verschillend ingevuld. 211

216 De Geminimaliseerde ttt Hoe vinden wij hieruit een minimale ttt? Net zoals in het geval van een volledig bepaalde ttt laten wij de toestanden van de gereduceerde ttt overeenstemmen met de verkregen maximale compatibele klassen. Echter, in het huidige geval kunnen er teveel klassen zijn. Wij moeten een minimaal stel compatibele klassen S 1, S 2,..., S k vinden dat voldoet aan: 1. het gekozen stel moet alle toestanden van S omvatten: k j=1 S k = S. 2. het gekozen stel moet stabiel zijn onder f s. Dit wil zeggen dat, voor elke gegeven input X, alle opvolgertoestanden van een klasse S j in dezelfde klasse S l(x,j) moeten vallen: j {1, 2,..., k} en X {0, 1} n l {1, 2,..., k}: {f s (s, X): s S j } S l Ook het vinden van een minimaal stel compatibele klassen is een moeilijk (NP-compleet) probleem. Men kan boven- en ondergrenzen afleiden op het aantal toestanden van de gereduceerde machine. Een bovengrens wordt uiteraard gevormd door het aantal maximale compatibele klassen. Een ondergrens wordt gevormd door het aantal elementen in de maximale incompatibele klasse. (Een incompatibele klasse is een deelverzameling van S waarin alle paren incompatibel zijn.) Voor het voorbeeld in fig. 7.6 hadden wij geluk: er zijn slechts vier klassen, en geen drie van hen bevatten alle toestanden. Een methode om op systematische manier uit een verzameling maximaal compatibele klassen een stabiele bedekking met minimale kardinaliteit af te leiden, wordt door Hachtel ([Hachtel96]) gegeven. De methode bestaat uit twee stappen: Men bepaalt eerst de verzameling priemcompatibelen. Om te definiëren wat priemcompatibelen zijn, moeten wij eerst opmerken dat het soms nodig kan zijn deelverzamelingen van maximale compatibele klassen te analyseren. Immers, wanneer men een verzameling als geheel beschouwt, vereist de stabiliteit dat haar opvolgerverzamelingen onder de diverse inputs alle bevat zitten in een geselecteerde klasse. Wanneer men vertrekt van deelverzamelingen kunnen de opvolgerverzamelingen kleiner zijn, en daardoor minder restrictief. Wanneer echter een deelverzameling precies dezelfde opvolgerverzameling heeft als de originele verzameling, dan is het niet nuttig deze deelverzameling in beschouwing te nemen, want zij bedekt een kleiner aantal toestanden. Dergelijke deelverzamelingen noemt men niet-priem. Bijgevolg zijn alle maximaal compatibele klassen priem, alsook hun deelverzamelingen die een strict kleinere opvolgerverzameling hebben. Nadien zoekt men uit deze klasse van priemverzamelingen een minimale klasse die de toestandruimte volledig bedekt, en die stabiel is. De stabiliteitsvoorwaarde wordt uitgedrukt via de opvolgerverzamelingen. Deze selectie kan op een aantal manieren gebeuren; onze Maple-suite bevat een een algebraïsche Maple-implementatie, die beide voorwaarden als een Boolese vorm formuleert, en deze vorm minimaliseert. De methode is sterk verwant met de methoden van Petrick en Marcus die wij eerder gezien hebben, alleen zijn de Boolese vormen die wij nu verkrijgen niet unaat, en is hun minimalisatie daardoor veel omslachtiger. Eens men een aanvaardbaar stel klassen gevonden heeft stelt men een transitietabel op in deze klassen (fig. 7.5). Met elke klasse laat men een toestand in de minimale ttt 212

217 overeenstemmen. Sommige opvolgerklassen kunnen tot meer dan één klasse behoren. Men heeft dan vrijheid in de keuze van de opvolgertoestand. Deze keuze kan gericht zijn op de minimalisatie van f s en f u, of op het vermijden van races (zie verder). Opmerking. In moderne technologieën heeft het weinig zin tot het uiterste te willen gaan in toestandsminimalisatie. Inderdaad, het aantal binaire geheugenelementen nodig voor de realisatie groeit slechts logaritmisch met het aantal toestanden. Bovendien spelen andere aspecten een rol. Het bijvoegen van één of meerdere geheugenelementen in de realisatie kan soms grote besparingen met zich brengen bij de realisatie van de combinatorische functies f s en f u. Wat uiteindelijk telt in een realisatie, is de totale afmeting en de maximale snelheid van het netwerk. Deze hangt uiteraard ook wezenlijk af van de combinatorische netwerken. In technologieën waar geheugenelementen goedkoop (klein) zijn, valt het globaal optimum dan ook niet noodzakelijk samen met een minimaal aantal geheugenelementen. Bovendien kan het wegwerken van hazards en kritische races in asynchrone netwerken ook het aantal geheugencellen weer opdrijven. 7.3 De assignatie van toestanden aan binaire geheugencellen De volgende stap in de concrete realisatie van het sequentieel netwerk is de keuze van een aantal geheugencellen, en het voorstellen van elke toestand door een verschillend bitpatroon in de geheugencellen. Voor een ttt met r rijen heeft men minimaal n = log 2 r binaire geheugencellen nodig. Het aantal mogelijke assignaties van de r rijen aan de 2 n mogelijke bitpatronen wordt gegeven door N = r! ( 2 n r ) = (2n )! (2 n r)!, een zeer snel groeiend aantal. De gekozen assignatie beïnvloedt tal van factoren, o.m. de complexiteit van de te realiseren combinatorische functies f s en f u en, in asynchrone netwerken, de aanwezigheid van hazards en kritische races. Strikt genomen mogen wij, m.b.t. f s en f u, alle 2 n mogelijke complementeringen van de n toestandsvariabelen als gelijkwaardig beschouwen, evenals hun n! permutaties. Dit reduceert N tot het aantal wezenlijk verschillende assignaties N D N D = (2n 1)! (2 n r)!n!, echter nog steeds een zeer snel groeiende grootheid. Er bestaan op dit ogenblik geen efficiënte algoritmische methoden die, gegeven het type geheugencellen dat men gebruikt, een optimale assignatie opleveren. Er bestaan echter wel een aantal goede heuristische methoden. 213

218 7.4 Toestandsassignatie in synchrone netwerken In synchrone netwerken spelen hazards in de combinatorische functies f s en f u geen rol, en zijn bovendien meer-dan-hamming-1 overgangen niet gevaarlijk. De keuze van de toestandsassignatie kan dus ten volle gericht zijn op de minimalisatie van de functies f s en f u. Laat ons veronderstellen dat wij met D-type geheugencellen werken, en laat ons de complexiteit van de toestandsfunctie f s analyseren. De functie f s bestaat uit n Boolese functies, één per D-geheugencel. Intuïtief kan men aanvoelen dat deze functies eenvoudiger zullen zijn naarmate er minder input- of toestandsvariabelen in optreden, of, anders gezegd, naarmate de functie bestaat uit grotere deelkubussen. Voor de machine uit fig. 7.4 kunnen wij zonder nadenken een eerste assignatie voorstellen. De assignatie Y 1 Y 2 Y 3 A C D E F G en het feit dat de toestandscodes 110 en 111 niet kunnen voorkomen, en dus kunnen behandeld worden als don t care-termen, leidt tot de volgende functies in f s : x Y 1 Y 2 Y 3 y 1 y 2 y 3 A A C C D D E E F F G G don t care Na minimalisatie vinden wij het volgend resultaat: y 1 = Y 2 Y 3 X + Y 1 Y 3 y 2 = Y 2 Y 3 1Y X y 3 = Y Y 3 + Y 1 Y 3 + Y 1 Y 3 X, met een totale kost van 3 OF-poorten, 9 OF-inputs, 8 EN-poorten, en 25 EN-inputs. Wij zullen nu twee heuristische methoden presenteren die leiden naar eenvoudiger Boolese functies in f s. De Afstandsmethode Het toekennen van bitpatronen aan toestanden kunnen wij doen door de toestandsnamen in een Karnaughkaart van inputs en toestanden in te schrijven. Wanneer wij nu 214

219 toestanden die, onder een gegeven input, leiden naar dezelfde toestand zoveel mogelijk op naburige cellen plaatsen (d.w.z. op Hamming-afstand 1), dan zullen de functies in f s dezelfde waarden aannemen op naburige cellen. Deze cellen kunnen dus samengenomen worden tot een grotere sub-kubus, en zullen de functies in f s eenvoudiger maken. Om dezelfde reden is het ook nuttig de opvolgertoestanden van een gegeven toestand onder naburige inputwaarden naburig te maken. Men kan nabuurregels uitbreiden tot de outputfuncties f u. Deze regels werden geformaliseerd door [Armstrong62] als volgt. Assignatieregels van Armstrong 1. Wanneer f s (p, X) = f s (q, X) voor een gegeven X {0, 1} n dan geeft men p en q best naburige coderingen. 2. Wanneer, voor een gegeven input X, f s (p, X) = p en f s (q, X) = q, of f s (p, X) = q en f s (q, X) = p, dan geeft men p en q best naburige coderingen. 3. Wanneer f s (p, X 1 ) = p 1 en f s (p, X 2 ) = p 2, en X 1 en X 2 zijn naburig, dan geeft men p 1 en p 2 best naburige coderingen. 4. Wanneer f u (p, X) = f u (q, X) voor een gegeven input X, dan geeft men p en q best naburige coderingen. Deze regels spreken elkaar soms tegen. Wanneer dit gebeurt primeert (1); dan komt (2), en dan (3) en (4). Door geschikte gewichten te associëren aan de regels (1) tot (4) kan men het toestandsassignatieproces implementeren als een globaal optimalisatievraagstuk dat de som van de gewichten van de gebruikte regels moet maximaliseren. Voor de machine in fig. 7.4 vinden wij de volgende gewenste nabuurschappen volgens de regels van Armstrong: Regel 1: (A, C, E, G)(A, G)(C, D, F ) Regel 2: geen Regel 3: (A, C)(A, D)(A, F )(E, D)(G, D) Regel 4: (A, C, D, E, F ). Hieruit kunnen wij (manueel, en dus misschien niet optimaal) de assignatie Y 1 Y 2 Y 3 A C D E F G afleiden, die leidt tot de volgende functies in f s : y 1 = Y 2 X y 2 = Y 2 X + Y 3 X y 3 = Y 3 2Y 3 + Y 1 met een totale kost van 2 OF-poorten, 5 OF-inputs, 6 EN-poorten, en 12 EN-inputs. Dit is reeds een hele besparing t.o.v. de eerste, willekeurige assignatie. 215

220 In onze Maple-suite wordt een variant op deze methode gerealiseerd, die de toestanden opneemt in een attractiegraaf. Dit is een graaf waarin de knopen de toestanden zijn, en de takken de aantrekkingskracht voorstellen die volgt uit de gewogen regels van Armstrong. Regel 1 krijgt een gewicht n, als n het aantal toestandsbits is, regel 4 n 1, en de overige regels 2 1. Eens men de graaf heeft zoekt men de sterkst door de andere knopen aangetrokken knoop uit, en kent deze een code toe (bijvoorbeeld allemaal nullen). De n sterkst verbonden knopen krijgen een code op afstand 1. Men verwijdert deze knopen uit de graaf, en herbegint met de volgende vrije code. De partitiemethode De partitiemethode is ook gericht op het groeperen van toestanden in de encoderingsruimte, op een zulkdanige wijze dat de functies in f s zo eenvoudig mogelijk worden. Een groepering van toestanden in S in mutueel disjuncte klassen S j noemen wij een partitie van S. Wij herhalen een definitie die al eerder aan bod is gekomen bij de toestandsminimalisatie: Definitie 7.3 Een partitie π van een ttt is stabiel wanneer ze bewaard blijft onder f s, d.w.z. wanneer de opvolgertoestanden van elke klasse S j onder elk inputsymbool alle in dezelfde klasse van π liggen. Stel dat wij van een ttt met r rijen een stabiele partitie π in p blokken gevonden hebben. Weze q het aantal toestanden in het grootste blok van π. Wij kunnen dan de volgende encodering voorstellen: gebruik log 2 p bits voor de identificatie van een blok, en log 2 q bits voor de bijkomende identificatie van de toestand binnen een blok. Het is duidelijk dat de n = log 2 p + log 2 q bits elke toestand ondubbelzinnig voorstellen. Indien n = n = log 2 r, dan hebben wij een potentieel interessante encodering gevonden. Inderdaad, daar π stabiel is, zijn de functies in f s die betrekking hebben op de blokidentificatiebits enkel afhankelijk van de inputbits en dezelfde blokindentificatiebits, en niet van de overige bits van de toestandsencodering (verklaar dit). Deze functies kunnen dus relatief eenvoudig gerealiseerd worden. De overige log 2 q functies zijn verder nog afhankelijk van de wijze waarop de toestanden binnen elke klasse gecodeerd worden. Het aantal mogelijkheden dat hier onderzocht moet worden is kleiner dan het oorspronkelijke aantal omdat q < r. Het komt er dus op aan zoveel mogelijke stabiele partities te vinden van een gegeven ttt, en op basis daarvan de gunstigste encodering te zoeken van de r toestanden. Een ttt heeft steeds stabiele partities: de triviale partities π max = {S} en π min = {{i} i S} zijn beide stabiel (bewijs dit). De verzameling van alle stabiele partities van een ttt is partieel geordend onder de verfijningsrelatie. Definitie 7.4 Een stabiele partitie π 1 is fijner dan een andere stabiele partitie π 2, π 1 π 2, indien elk blok van π 1 vervat zit in een blok van π 2. Definitie 7.5 De som π 1 + π 2 van twee stabiele partities is de partitie van S gevormd door de maximale paarsgewijze unies van niet disjuncte blokken van π 1 en π 2. Het product π 1 π 2 van 2 Noteer dat deze gewichten niet overeenkomen met de eerder opgegeven volgorde van de regels: diverse auteurs stellen andere volgordes voor het gaat immers over een heuristiek, en men mag gerust de gewichten wijzigen wanneer dit zou leiden tot betere resultaten, afhankelijk van de klasse problemen die men beschouwt. 216

221 twee stabiele partities is de partitie van S die gevormd wordt door de paarsgewijze doorsneden van de blokken uit π 1 en π 2. Onder de partiële ordening bezit elk paar stabiele partities π 1 en π 2 een kleinste bovengrens en een grootste benedengrens, die beide partities zijn van S. Net zoals bij de natuurlijke ordening op Boole-algebra s bestaat er hier ook een verband tussen de ordening en de constructoren + en. Dit verband wordt geformaliseerd door het volgende lemma. Lemma 7.1 Wanneer π 1 en π 2 stabiele partities zijn van een ttt dan geldt: l.u.b.(π 1, π 2 ) = π 1 + π 2 g.l.b.(π 1, π 2 ) = π 1 π 2 Bewijs. Wordt als oefening gelaten voor de lezer. Stelling 7.3 Gegeven een ttt met stabiele partities π 1 en π 2. Dan zijn l.u.b.(π 1, π 2 ) en g.l.b.(π 1, π 2 ) ook stabiele partities van de ttt, d.w.z. de klasse van de stabiele partities van een ttt is gesloten onder + en. Bewijs. Weze B een blok van g.l.b.(π 1, π 2 ), en weze q B en X {0, 1} n. Uit de definitie van g.l.b.(π 1, π 2 ) volgt dat er twee blokken B 1 π 1 en B 2 π 2 bestaan zodanig dat B = B 1 B 2, en dus dat q B 1 en q B 2. Weze f s (B 1, X) de verzameling opvolgertoestanden van toestanden in B 1 onder input X. Daar π 1 en π 2 stabiel zijn volgt B 1 π 1 f s (B 1, X) B 1 en Bijgevolg is B 2 π 2 f s (B 2, X) B 2. f s (B 1, X) f s (B 2, X) B 1 B 2 g.l.b.(π 1, π 2 ), en dus f s (q, X) f s (B 1 B 2, X) f s (B 1, X) f s (B 2, X) B 1 B 2 g.l.b.(π 1, π 2 ). Hieruit volgt dat g.l.b.(π 1, π 2 ) stabiel is. Het bewijs dat ook l.u.b.(π 1, π 2 ) stabiel is wordt gelaten voor de lezer als oefening. Zoals reeds eerder gezegd zijn ook de triviale partities π min en π max van een ttt stabiel. Samen met de bovenstaande stelling impliceert dit dat de verzameling stabiele partities van een ttt een tralie vormen onder. Hoe vinden wij nu de stabiele partities van een ttt? Vooreerst gaan wij de minimale niet-triviale partities zoeken, die elk minstens één koppel toestanden bevatten (zie fig. 7.9). Algoritme 7.5 (Het vinden van niet-triviale minimale stabiele partities) 1. Kies een koppel toestanden (p, q) uit de ttt. 2. Zoek de opvolgerkoppels van (p, q) onder alle inputsymbolen. 217

222 Opvolgerboom Beginkoppel Partitie CE CE (ACDEFG) AA DF DF (AGE)(DCF) EG DD EG (AGE)(CF)(D) AA FC FC (AG)(CF)(D)(E) AG DD AG (AG)(C)(D)(E)(F) AA CC Figuur 7.9: Het vinden van stabiele partities van een ttt 3. Markeer alle opvolgerkoppels die maar één toestand bevatten, en de opvolgerkoppels waarvan reeds eerder de opvolgers onderzocht werden. 4. Voor alle niet-gemerkte koppels, herhaal recursief stappen (2),(3), en (4), tot wanneer geen niet-gemerkte koppels meer ontstaan. 5. Verzamel alle onderzochte koppels, en bereken hun transitieve sluiting. 6. Herhaal vanaf (1) voor een ander koppel, tot wanneer alle koppels onderzocht zijn. Eens al de minimale stabiele partities gekend, kan men door het toepassen van de operaties + en (of g.l.b. en l.u.b.) de hele tralie terugvinden. De hele tralie van de machine in Voorbeeld 7.1 wordt voorgesteld in figuur Opmerking. In principe moet het bovenstaand algoritme uitgevoerd worden voor elk koppel toestanden uit de ttt. Het is echter duidelijk dat, wanneer een bepaald koppel (p, q) reeds onderzocht is tijdens de analyse van een koppel (a, b), men de opvolgerboom van (p, q) kan hergebruiken. Bijvoorbeeld, in figuur 7.9 wordt enkel de opvolgerboom van het koppel (C, E) voorgesteld. Hij bevat echter ook de opvolgerbomen van (D, F ), (E, G), (F, C), en (A, G). Bovendien is het in dit geval zo dat geen van de takken uit de opvolgerbomen uitloopt op een reeds onderzocht paar. De sub-bomen die ontstaan op de knopen (D, F ), enz. zijn dus zelf volwaardige opvolgerbomen. LET OP: in het algemeen is de situatie ingewikkelder. Het kan b.v. voorkomen dat in de boom voor een koppel (a, b) een koppel (p, q) voorkomt, en dat een tak in de deelboom van (p, q) 218

223 Partitie π max = (ACDEF G) (AGE)(CDF ) (AGE)(CF )(D) (AG)(CF )(D)(E) (AG)(C)(D)(E)(F ) π min = (A)(C)(D)(E)(F )(G) Gegenereerd door AC, AD, AF, CE, CG, DE, DG, EF, F G CD, DF AE, EG CF AG Figuur 7.10: De tralie van stabiele partities van Voorbeeld 7.1 uitloopt op een koppel dat reeds onderzocht werd buiten de deelboom van (p, q). Voor de exploratie van de opvolgerboom van (a, b) mag men het verder onderzoek hier stoppen; voor de exploratie van de opvolgerboom van (p, q) echter mag men alleen stoppen op herhalingen van koppels die reeds voorgekomen zijn in de deelboom van (p, q) zelf. Om gemakkelijk de opvolgerboom van een koppel op te stellen kan men gebruik maken van een z.g. opvolgergraaf, zoals dit gebeurt in de Maple-suite (zie figuur D.17). Voor het vinden van een gunstige encodering kiest men een niet-triviale partitie met zo weinig mogelijk blokken (zo er een bestaat!), en gaat te werk zoals hierboven reeds uiteengezet. In het geval van Voorbeeld 7.1 laten wij het bit Y 1 afhangen van de partitie (AGE)(CDF ), en het bit Y 2 van de partitie (AG)(CF )(D)(E). Dit wil zeggen dat de combinatie Y 1 Y 2 de blokken van (AG)(CF )(D)(E) eenduidig identificeert. Het onderscheid tussen de toestanden A, G en C, F kan verder gemaakt worden door bit Y 3. Wij verkrijgen de assignatie Y 1 Y 2 Y 3 A G E C F D

224 die leidt tot de volgende functies in f s : y 1 y 2 = X = Y 1 Y 2 + Y 1 X y 3 = Y 1 Y 2X + Y 1 Y 3 X, met een totale kost van 2 OF-poorten, 4 OF-inputs, 4 EN-poorten, en 10 EN-inputs. Dit is nogmaals een besparing t.o.v. de vorige assignatie. Een interessant speciaal geval treedt op wanneer er partities π 1, π 2,..., π k bestaan, met elk twee blokken, waarvoor π 1 π 2 π k = π min. Elke partitie stelt dan precies één bit voor in de toestandsencodering. De functie in f s die dat bit moet berekenen hangt enkel af van datzelfde bit en, uiteraard, van de inputs. De partitiemethode kan verder verfijnd worden tot de methode van de Partitiepaaralgebra [Hartmanis61], maar dit ligt buiten het kader van deze cursus. 7.5 Toestandsassignatie in asynchrone netwerken Bij synchrone netwerken konden we bij de toestandsassignatie de nadruk leggen op economie in de realisatie van de functies f s en f u. Bij asynchrone netwerken ligt de situatie geheel anders: wij moeten eerst zorgen dat wij een betrouwbaar en correct werkend netwerk realiseren. De toestandsassignatie moet er in eerste instantie over waken dat er geen kritische races of essentiële hazards ontstaan in het netwerk. Een zekere methode voor het vermijden van races is het vermijden van overgangen met een hamming-afstand groter dan 1. Dit kan gerealiseerd worden door alle toestanden waartussen overgangen kunnen gebeuren naburige assignaties te geven. Zo zijn de overgangen in de machine van fig. 7.6 Het blijkt dat met de assignatie (a, b), (b, c), (c, d), (d, a). a = 00 d = 10 b = 01 c = 11 alle toegelaten overgangen precies afstand-1 zijn. In het algemeen gaat het uiteraard niet zo eenvoudig: tussen r toestanden kunnen er maximaal r(r 1)/2 transities bestaan. In de hyperkubus (met r een macht van 2), die alle afstand-1 relaties voorstelt, kunnen er slechts r(log 2 r)/2 transities bestaan, en elke toestand heeft slechts log 2 r naburen. Men zal dus meestal meer transities nodig hebben dan er afstand-1 paren bestaan in de gekozen assignatie met een minimaal aantal geheugencellen. Men zal dus het aantal geheugencellen moeten vergroten. Wanneer er geen oplossing gevonden wordt met directe afstand-1 overgangen, kan men overwegen afstand-d overgangen te gebruiken met d > 1 (races). Men moet dan uiteraard nagaan of geen van de geïntroduceerde races kritisch is. Alternatief kan men ook zoeken naar meervoudige overgangen, d.w.z. sequenties van afstand-1 overgangen die een grotere afstand overbruggen via niet-gebruikte of ongevaarlijke tussentoestanden. De methode die races toelaat leidt uiteraard tot een snellere realisatie dan de methode 220

225 X 1, X a a a d b b c b d b c c d e c d a d d c e c b e e Figuur 7.11: Toestandsassignatie in asynchroon transitiediagram met meervoudige overgangen, omdat de transitie van meerdere geheugencellen simultaan verloopt. De laatste methode biedt louter afstand-1 overgangen (belangrijk voor de functies in f s ), ten koste van een tragere werking. Wij zullen nu kort twee methoden bespreken, één voor elk van de bovenstaande benaderingen. Methode 1: Rechtstreekse overgangen. Deze methode wordt in het Engels de Single Transition Time (STT) assigment genoemd. De methode steunt essentieel op de definitie van een kritische race. Beschouw een kolom in een ttt, en weze S i S j en S p S q rechtstreekse overgangen (mogelijk over afstand d > 1). In de overgang S i S j zal een aantal d 1 bits van waarde veranderen. De overige n d toestandsvariabelen veranderen niet. Dit zijn precies de variabelen die dezelfde waarde aannemen in de encodering van S i en S j. De race tussen de d variabelen die veranderen leidt tot een aantal paden van S i naar S j. De race is kritisch wanneer 1. ofwel een stabiele toestand S k voorkomt op één van de paden van S i naar S j ; 2. ofwel een pad van S i S j kruist met een pad van S p S q. Het optreden van de gevallen (1) of (2) hierboven kan voorkomen worden wanneer de waarde van minstens één niet-veranderende toestandsvariabele in een transitie S i S j verschilt van de waarde die deze variabele aanneemt in een stabiele toestand of als nietveranderende waarde in een andere transitie. Op deze observatie is de techniek van Tracey gesteund [Tracey66]. Wij zullen de techniek uiteenzetten aan de hand van een eenvoudig voorbeeld (fig ) Tracey s methode begint met het aanleggen van een lijst van (partieel gespecificeerde) partities van de toestandsruimte van het ttt, volgens het volgende criterium: Tracey s Criterium voor Partitielijst: Wanneer in dezelfde kolom van een ttt S i S j en S p S q transities zijn, en S k een stabiele toestand naar waar geen overgang gebeurt, dan moet de partitielijst de partiële partities (S i, S j )(S p, S q ) (S i, S j )(S k ) bevatten. 221

226 De partiële partities die wij volgens dit kriterium vinden voor Voorbeeld 5.3 zijn π 1 : (ad)(bc) π 6 : (bd)(ce) π 2 : (ad)(ce) π 7 : (ab)(cd) π 3 : (be)(cd) π 8 : (ab)(e) π 4 : (a)(be) π 9 : (cd)(e) π 5 : (a)(cd). Het komt er nu op aan een zo klein mogelijk aantal n toestandsvariabelen en een encodering te vinden zodanig dat 1. alle toestanden een unieke encodering krijgen; 2. elke partitie uit bovenstaande lijst door minstens één toestandsvariabele moet geïnduceerd worden. Het is duidelijk dat, wegens de partiële specificatie van de partities, vele combineerbaar zijn met andere zonder elkaar tegen te spreken. Zo zijn π 1, π 2, en π 4 combineerbaar tot (ad)(bce). Wanneer wij Y 1 laten overeenkomen met deze gecombineerde partitie, dan zal Y 1 tegelijk π 1, π 2, en π 4 induceren. Wij zoeken dus een minimaal aantal partities dat alle voorwaarden bevat uitgedrukt door π 1, π 2,..., π 9. Dit kan op een systematische manier gebeuren. Algoritme 7.6 (Methode van Tracey voor Toestandsassignatie) 1. Stel de initiële partitielijst van de toestandsruimte van het ttt voor op een ternaire manier: stel toestanden in één klasse arbitrair voor door 1, toestanden in de andere klasse door 0, en niet-vermelde toestanden door, b.v. π 1 : (0110 ). 2. Zoek alle combineerbare partitieparen. Een koppel (π i, π j ) is combineerbaar wanneer (a) overeenstemmende symbolen in de ternaire representaties van π i en π j alle ofwel gelijk zijn, ofwel minstens één van beide gelijk is aan. (b) (π i, π j ) combineerbaar is, waarbij π j 0 bevat i.p.v. 1, en 1 i.p.v Zoek de maximale compatibele klassen uit de lijst van combineerbare koppels. 4. Zoek een minimale set van maximale compatibele klassen die alle initiële partities representeert, b.v. met de tabelmethode voor het vinden van een minimale som. Bovenstaand algoritme toegepast op Voorbeeld 5.3 leidt tot het volgende. Ternaire voorstelling van partities: π 1 : (0110 ) π 6 : ( 0101) π 2 : (0 101) π 7 : (0011 ) π 3 : ( 0110) π 8 : (00 1) π 4 : (01 1) π 9 : ( 001) π 5 : (0 11 ). 222

227 Combineerbare koppels (enkel de partitienummers werden geschreven): (1, 2)(1, 4) (2, 4)(2, 6)(2, 8) (3, 4 )(3, 5)(3, 7)(3, 9 ) (4, 5)(4, 9) (5, 7)(5, 8)(5, 9 ) (6, 8) (7, 8)(7, 9 ) (8, 9) Maximale compatibele klassen: A (1, 2, 4) E (4, 5) B (2, 6, 8) F (4, 9) C (3, 5, 7, 9 ) G (5, 7, 8) D (3, 4 ) H (8, 9) Minimale cover: A B C D E F G H Hierin zijn A en B essentieel, en C is dominant over de overblijvende kolommen. Wij verkrijgen dus 3 corresponderende toestandsvariabelen, en de volgende encodering: Y 1 Y 2 Y 3 a b c d e Noteer dat er afstand-2 transities toegelaten worden, maar dat er bij constructie geen kritische races aanwezig zijn. De methode van Tracey heeft nog een aantal varianten, maar daar gaan wij hier niet dieper op in. Opmerking. De bovenstaande methode steunt op het constant blijven van een aantal toestandsvariabelen tijdens een verre overgang: bij de overgang b c in de kolom X 1 X 2 = 00 is het essentieel dat Y 1 = 1 blijft, zoniet komen wij in het pad van de overgang d a. Het is duidelijk dat men hiermee in de realisatie van de functies in f s terdege moet rekening houden. De combinatorische functie y 1 b.v. moet constant 1 blijven, zelfs wanneer 2 inputs veranderen! 223

228 Methode 2: 1-uit-r assignaties. Wanneer wij in een ttt met r rijen elke toestand voorstellen door een binaire combinatie van lengte r met één enkele 1, dan hebben alle transities afstand 2. Deze transities kunnen gerealiseerd worden als een meervoudige overgang van lengte 2, b.v. voor r = 4: als Wij gebruiken dus een intermediaire onstabiele toestand eigen aan de transitie. Wanneer men deze assignatie toepast krijgen de functies y i, i = 1, 2,..., r in f s een speciale vorm: y i = T i + H i Y i. Hierin noemt men T i de transitieterm en H i de houdterm. De transitieterm is 1 op alle rijen van waaruit men een transitie naar rij i kan uitvoeren. De houdterm zorgt ervoor dat bij een transitie van rij i naar rij j, eerst Y j op 1 komt, en pas dan Y i op 0. Noteer dat deze functies sterk gelijken op de karakteristieke vergelijking van een S-dominante SR-flipflop (zie Hoofdstuk 6). Laat ons het voorbeeld in figuur 7.11 uitwerken met de assignatie Voor y 2 vinden wij: Y 1 Y 2 Y 3 Y 4 Y 5 a b c d e transities naar b: vanuit e voor X 1 X 2 = 01, en vanuit a voor X 1 X 2 = 10. Dus T 2 = X 1X 2 Y 5 + X 1 X 2Y transities vanuit b: naar c en naar d. De variabele Y 2 moet 1 blijven zolang de tussentoestanden (01100) of (01010) niet bereikt werden, dus Hieruit volgt: H 2 = (Y 3 + Y 4 ) = Y 3Y 4. y 1 = X 1 X 2 Y 4 + Y 2 Y 4 Y 1 y 2 = X 1 X 2Y 5 + X 1 X 2 Y 1 + Y 3 Y 4 Y 2 y 3 = X 1 X 2 (Y 2 + Y 5 ) + X 1 X 2 Y 4 + Y 4 Y 5 Y 3 y 4 = X 1 X 2Y 3 + X 1 X 2 (Y 1 + Y 2 ) + Y 1 Y 3 Y 4 y 5 = X 1 X 2 Y 3 + Y 2 Y 3 Y 5 Deze uitdrukkingen zouden overigens ook volgen uit een globale minimalisatie. (Noteer dat dit reeds 5 functies van 7 inputs vereist!) Bovenstaande vergelijkingen moeten nog nagekeken worden op statische hazards. De uitdrukking voor y 1 b.v. heeft een statische 1-hazard voor X 1 = X 2 = 0, Y 1 = 1, Y 2 = 0, en Y 4 : 0 1. Deze hazard is gevaarlijk bij de transitie d a in de kolom X 1 X 2 = 00. Inderdaad, wanneer Y 4 0 moet de transitieterm Y 2 Y 4 Y 1 eerst op 1 komen alvorens de 224

229 houdterm X 1 X 2 Y 4 op 0 mag komen, zoniet komt men in een foutieve toestand (00000). Dit kunnen wij verhinderen door toevoeging van de term (priemimplicant) X 1X 2Y 1 Y 2. Voor de functie y 3 zijn er twee hazards: één op Y 5 en één op Y 4. Beide hazards kunnen weggewerkt worden door toevoeging van de termen Deze hazards zijn het gevolg van de cyclus X 1X 2Y 4Y 3 en X 1 X 2Y 3 Y 5. a 11 d 00 a; telkens wanneer dergelijke cycli optreden in een ttt moet men de geassocieerde hazards verwijderen. De 1-uit-r assignatiemethode is eenvoudig toe te passen en leidt tot eenvoudige combinatorische functies in f s. Het (veel) groter aantal toestandselementen dat nodig is t.o.v. andere methoden wordt hierdoor in zekere mate gecompenseerd. Slotopmerking In dit hoofdstuk hebben wij de synthese van sequentiële gedragingen in de vorm van een teruggekoppeld poortcircuit of een circuit met geheugenelementen besproken. Wij hebben zowel synchrone als asynchrone circuits bekeken, weze het zeer oppervlakkig. De benadering die wij besproken hebben wordt aanzien als klassiek, i.h.b. voor wat betreft de asynchrone circuits. Hier past het dan ook op te merken dat, voor de synthese en optimalisatie van zowel synchrone netwerken als asynchrone, in de voorbije 10 jaar bijzonder veel onderzoek is verricht, en er een aantal resultaten geboekt werden die elk professioneel ontwerper hoort te kennen. Een inleidende cursus zoals deze is echter veel te beperkt om op deze recente ontwikkelingen in te gaan. 7.6 Compositie en decompositie van synchrone automaten Cascade- en paralleldecompositie Wanneer wij een automaat opsplitsen in twee geïnterconnecteerde automaten, kunnen wij drie gevallen onderscheiden (fig. 7.12). In de algemene vorm lopen er verbindingen van beide machines naar elkaar; in de parallelvorm valt de automaat uit elkaar in twee, totaal gescheiden machines; en in de cascadevorm valt de machine uit elkaar in een meestermachine M 1 en een slaafmachine M 2, zodanig dat de meestermachine geen inputs ontvangt van de slaafmachine. Een automaat met meer dan twee toestanden kan steeds gedecomposeerd worden in twee deelmachines: het volstaat dat men het toestandsregister opsplitst in twee delen, en dat men de originele toestandsfunctie opsplitst volgens de opsplitsing van het geheugen (fig. 7.13). Deze opsplitsing is echter zelden nuttig, omdat beide machines in het algemeen zeer sterk geïnterconnecteerd zullen blijven: zij moeten elkaars toestand kunnen zien; bovendien kan de opsplitsing van de toestandsfunctie in twee gescheiden delen C 1 en C 2 een globaal minder efficiënte realisatie tot gevolg hebben (minder gemeenschappelijke implicanten). Een decompositie is slechts nuttig wanneer het aantal verbindingen 225

230 Input Output C S (a) Origineel Inputs C3 Output C1 C2 S1 S2 (b) Algemene decompositie Inputs C3 Output C1 C2 S1 S2 (c) Cascadedecompositie Inputs C3 Output C1 C2 S1 S2 (d) Paralleldecompositie Figuur 7.12: Spatiale decompositievormen van een automaat 226

231 Input Output Input Output C C1 C2 S1 S1 S2 S2 (a) Origineel (b) Decompositie Figuur 7.13: Triviale opsplitsing van willekeurige automaat tussen beide componenten beperkt kan worden; elk van de componenten is dan eenvoudiger dan de oorspronkelijke machine, en kan dus gemakkelijker gerealiseerd worden. In dat opzicht zijn de parallel- en de cascadevorm interessant. Noteer dat deze vormen van decompositie niet leiden tot een reductie van het aantal geheugencellen en bovendien blijft het zo dat alle geheugencellen gelijktijdig gelezen en geschreven blijven worden. De winst die men doet met een spatiale decompositie bestaat erin dat men het toestandsregister distribueert over de ruimte, wat leidt tot kortere verbindingen naar de combinatorische circuits, en dat de combinatorische toestands- en outputfuncties over het algemeen minder argumenten hebben, en daardoor compacter en dus sneller zijn. Er bestaat een systematische procedure, daterend uit de jaren 60, om na te gaan of een gegeven automaat een cascade- of paralleldecompositie heeft. Deze methode is gesteund op de aanwezigheid van stabiele partities (zie paragraaf 7.4). Zoals men weet vormen de stabiele partities van een automaat (voorgesteld door zijn toestandstransitietabel ttt) een tralie, met als minimumelement de triviale partitie π 0 waarin de blokken singletons zijn, en als maximumelement de triviale partitie π die bestaat uit één blok. Gewoonlijk vertoont een gegeven ttt meerdere stabiele partities. Paralleldecompositie. Wanneer een ttt twee stabiele partities π 1 en π 2 bevat zodanig dat π 0 = glb(π 1, π 2 ), dan bestaat er een paralleldecompositie in twee machines M 1 en M 2, respectievelijk gebaseerd op π 1 en π 2. De machine M 1 resp. M 2 wordt verkregen door als toestanden de blokken van π 1 resp. π 2 te nemen. Aangezien π 1 stabiel is, weten wij dat de toestandsfunctie van M 1 enkel de (systeem)inputs en de toestand van M 1 als argumenten heeft. De systeemoutputs kunnen zeker bepaald worden uit de kennis van de toestand van beide machines en de systeeminput. Een bijzonder eenvoudig voorbeeld van een dergelijke decompositie is de modulo-6 teller van figuur 7.14, die uit elkaar valt in een modulo-2 en een modulo-3 teller. Cascadedecompositie. Wanneer de tralie van de stabiele partities van een ttt een ketting van minstens lengte 3 tussen π 0 en π bevat, kan men een cascadedecompositie van de automaat vinden. Veronderstel dat wij de volgende ketting hebben: π 0 < π 2 < π 1 < π (figuur 7.15). Met π 1 = (ACEG)(BDF H) correspondeert een autonoom werkende machine M 1 (toestanden {a, b}). Met autonoom bedoelen wij onafhankelijk van de 227

232 Machine M A A B B B C C C D D D E E E F F F A (ABCDEF) M1: (ACE)(BDF) M2: (AD)(BE)(CF) (A)(B)(C)(D)(E)(F) Machine M ACE ACE BDF BDF BDF ACE Machine M AD AD BE BE BE CF CF CF AD (a) Originele Machine (b) Stabiele Partities (c) Paralleldecompositie Figuur 7.14: Paralleldecompositie gebaseerd op de partitiemethode toestand van de andere deelmachines. Met π 2 = (AE)(BF )(CG)(DH) correspondeert eveneens een autonome machine M2, die een cascadeverbinding is van M 1 en M 2. Wij kunnen M 2 vinden op basis van een partitie π (niet-stabiel!), die π 1 verfijnt tot π 2 : glb(π, π 1 ) = π 2. De keuze π = (ABEF )(CDGH) voldoet hieraan. Machine M 2 is uiteraard niet autonoom, aangezien zij de toestand van M 1 moet binnenkrijgen als inputs (π is niet stabiel). De triviale partitie π 0 tenslotte, correspondeert met de originele machine. Wij hebben een tweede extra partitie π (en een corresponderende machine M 3 ) nodig om de toestand van π 2 verder te verfijnen tot π 0. Wij vinden π = (ABCD)(EF GH). De machine M 3 heeft de toestand van M 1 en M 2 als bijkomende inputs. Het voorbeeld is bijzonder eenvoudig: het is een gewone binaire 3-bitteller, die inderdaad een cascade is van drie flipflops. In de praktijk komt men zelden zuivere cascade- of paralleldecomposities tegen, en bovendien is de bovenbeschreven methode (het vinden van de stabiele partities) bijzonder rekenintensief. Het nut van deze methode voor grote automaten is dan ook beperkt. Er bestaan uitbreidingen naar minder restrictieve stabiele bedekkingen. Een stabiele bedekking is, net zoals een partitie, een klasse van verzamelingen toestanden die alle toestanden bedekken, maar die niet noodzakelijk disjunct zijn. Een stabiele bedekking kan gezien worden als een stabiele partitie van een ttt waarin sommige toestanden gedupliceerd werden. Wij gaan hier niet verder op in. Factorisering of subroutinedecompositie Een meer recente decompositievorm van automaten is sterk geïnspireerd op de creatie van subroutines 3 in software: men zal een aantal statements die als groep herhaaldelijk voorkomen isoleren, en ze aanroepen van op de plaats waar men ze nodig heeft. Men kan een gelijkaardige techniek toepassen op eindige automaten. Beschouw daartoe het transitiediagram voorgesteld in figuur 7.16(a). Wanneer men dit diagram nauwkeurig onderzoekt, ziet men dat de opeenvolgingen van 4 toestanden die een volledige optelling uitvoeren sterk gelijkaardig zijn. Met gelijkaardig bedoelen wij dat de outputs onder dezelfde inputsignalen dezelfde zijn, en dat gesprongen wordt naar andere, even- 3 In feite zijn het remote procedure calls. 228

233 Machine M A A B B B C C C D D D E E E F F F G G G H H H A (a) Originele Machine (ABCDEFGH) M1: (ACEG)(BDFH) M1,M2: (AE)(BF)(CG)(DH) M1,M2,M3: (A)(B)(C)(D)(E)(F)(G)(H) (b) Stabiele Partities Machine M ACEG=a a b BDFH=b b a Machine M2 0,- 1,a 1,b ABEF=c c c d CDGH=d d d c Machine M3 0,- 1,a,c 1,a,d 1,b,c 1,b,d ABCD=e e e e e f EFGH=f f f f f e (c) Cascadedecompositie Figuur 7.15: Cascadedecompositie gebaseerd op de partitiemethode 229

234 eens gelijkaardige toestanden. Een dergelijk stel toestanden dat meer dan eens voorkomt in een diagram noemt men een perfecte factor. Men kan het diagram nu opsplitsen als volgt: men vervangt elke factor door een wachttoestand (de gearceerde toestanden in figuur 7.16(b)). Men splitst de factor af, en realiseert hem in een aparte machine M 2. Hier vinden wij de toestanden terug, aangevuld met een extra wachttoestand w. Beide machines kunnen elkaars toestand (gedeeltelijk) lezen. In het voorbeeld zal enkel machine M 1 ook de input start gebruiken. Dit komt tot uiting in de opschriften van de transities. De transitievoorwaarde in het opschrift 0,-/HC1 bij toestand W betekent: onder inputvoorwaarden start = 0 en om het even welke toestand van M 2. De transitievoorwaarde in het opschrift -,not(3)/--- betekent: bij gelijk welke waarde op start, maar met M 2 niet in toestand 3. De output van beide machines worden gecombineerd tot één output (bv. door een OF-functie). Op elk ogenblik zal slechts één machine zich niet in een wachttoestand bevinden. De wachttoestanden van M 1 kunnen geïnterpreteerd worden als de terugkeeradressen voor de oproep naar M 2. Machine M 2 gebruikt precies die informatie om te weten hoe zij uit toestand 3 moet terugkeren. 4 Men kan in het voorbeeld zien dat het aantal toestanden in elk van de deelmachines kleiner is dan in de oorspronkelijke machine. Het totaal aantal geheugencellen is echter groter geworden. Wanneer de koppeling tussen beide machines voldoend zwak is, zullen ook de toestands- en outputfuncties eenvoudiger zijn, en kan men de machine dus compacter en sneller maken. Hoewel de decompositie spatiaal is, is de werking eerder te vergelijken met een temporele decompositie, dit wegens het hergebruik van dezelfde machine op verschillende ogenblikken, en wegens de alternerende activiteit van beide deelmachines. Er bestaan systematische methoden om op zoek te gaan naar perfecte factoren, alsook naar niet-perfecte factoren, die bijna hetzelfde gedrag hebben ([Devadas94]) Compositieregels voor synchrone automaten: synchrone interconnecties In wat voorafgaat hebben wij diverse voorbeelden ontmoet van synchrone automaten die geïnterconnecteerd worden tot een groter geheel. Wij zijn ervan uitgegaan dat wij het gedrag van de compositie eenvoudig kunnen afleiden uit het synchroon gedrag van de samenstellende onderdelen. Wij zullen nu kort onderzoeken onder welke voorwaarden deze veronderstelling stand houdt. Beschouw daartoe de samenstelling van twee automaten zoals afgebeeld op figuur De werking van elk van de machines kan voorgesteld worden met behulp van hun toestands- en outputfuncties: s 1 = f s1 (S 1, I 11, I 12 ) O 11 = f o11 (S 1, I 11, I 12 ) O 12 = f o12 (S 1, I 11, I 12 ) s 2 = f s2 (S 2, I 21, I 22 ) O 21 = f o21 (S 2, I 21, I 22 ) O 22 = f o22 (S 2, I 21, I 22 ) 4 Noteer dat hiermee dus uiteraard geen directe of indirecte recursie mogelijk is: echte recursie is niet mogelijk met een beperkte hoeveelheid geheugen. 230

235 0/HC1 W 1/LC0 I -/SL0 ab0 c0 d0 e0 -/SL0 -/SL0 -/SL0 -/SL0 ab1 c1 d1 e1 -/SL0 -/SL0 -/SL0 -/SL0 ab2 c2 d2 e2 -/SC0 -/SC0 -/SC0 -/SC0 ab3 -/SL0 c3 -/SL0 -/SL0 d3 e3 -/HC1 (a) originele automaat. Legende: start/schuifregisters carry done not(i)/--- w I/ ,-/HC1 -,not(3)/--- -,not(3)/--- -,not(3)/--- -,not(3)/--- -/SL0 W 1,-/LC0 I -,-/SL0 -,3/--- -,3/--- -,3/--- ab c d e e/hc1 1 -/SL0 2 not(e)/sl0 -,3/--- -/SC0 M1 3 M2 (b) Decompositie Figuur 7.16: Decompositie gebaseerd op factorisering 231

236 I I11 I12 O11 O12 I21 I22 O21 O22 O S1 S2 klok Figuur 7.17: Synchrone compositie van synchrone automaten De samenstelling wordt beschreven door de volgende vergelijkingen: I 11 = I I 21 = I I 12 = O 22 I 22 = O 12 O = (O 11, O 21 ) S = (S 1, S 2 ) Uiteraard impliceert dit dat men voldoet aan de regels voor de interne opbouw van synchrone automaten, opgesomd in vorig hoofdstuk: men zal geheugenelementen gebruiken met identiek klokgedrag en kloksignaal, men zal de klokverschuiving beperken, men zal de klokperiode voldoend groot kiezen, en men zal de inputs op een synchrone manier aanbieden. Nu is de vraag of wij onder deze voorwaarden de toestandsfunctie f s en de outputfunctie f o van de resulterende automaat kunnen afleiden, waarbij de toestandsruimte van de nieuwe machine gevormd wordt door het cartesisch product van de afzonderlijke toestandsruimten. Wij kunnen dit proberen door de interne variabelen O 12 en O 22 te elimineren. Wij krijgen echter vergelijkingen van de vorm O 12 = f o12 (S 1, I 11, O 22 ) O 22 = f o22 (S 2, I 21, O 12 ) en dus O 12 = f o12 (S 1, I 11, f o22 (S 2, I 21, O 12 )) met een gelijkaardige uitdrukking voor O 22. Het optreden van symbolen zowel in het linker- als rechterlid maakt het echter in het algemeen onmogelijk om O 12 en O 22 uit te drukken als functies van S en I. 232

237 De fundamentele reden hiervoor is dat wij gestart zijn met een Mealy-model van de automaten: de output kan combinatorisch afhangen van de inputs. Het is dus perfect mogelijk door de afgebeelde interconnectie combinatorische terugkoppellussen te creëren. Deze lussen kunnen aanleiding geven tot de creatie van extra toestanden (naast de toestanden in S). Deze toestanden en hun overgangen zijn niet kloksynchroon; de resulterende machine is het dus ook niet. Een voldoende voorwaarde om toch tot een bona fide synchrone automaat te komen, is te vertrekken van een (gedeeltelijke) Moore-machine, waarin O 12 en/of O 22 niet afhangen van I 12 resp. I 22. In deze veronderstelling krijgen wij: S = (S 1, S 2 ) = (f s1 (S 1, I 11, I 12 ), f s2 (S 2, I 21, I 22 )) = (f s1 (S 1, I 11, f o22 (S 2, I 21 )), f s2 (S 2, I 21, f o12 (S 1, I 11 ))) = f s (S, I). Als conclusie kunnen wij zeggen dat men bij het stel ontwerpregels voor synchrone automaten de volgende regel moet toegevoegd worden: Er moet voor gezorgd worden dat de interconnectie van automaten niet leidt tot de invoering van extra combinatorische terugkoppellussen. In de praktijk betekent dit dat men in elke terugkoppellus minstens één flipflop opneemt, bijvoorbeeld door outputs rechtstreeks uit een flipflop te betrekken. 7.7 Asynchrone interconnecties en aansturingen Asynchrone interconnecties Tot nu toe hebben wij verondersteld dat de buitenwereld, die de inputs voor de automaat aanbrengt, dit doet op een synchrone manier. In de praktijk wil dit zeggen dat de inputsignalen slechts mogen veranderen gedurende het O-interval van de geheugencellen. Dit impliceert uiteraard dat de buitenwereld de fase van de klok kent. Aan deze voorwaarde is duidelijk niet voldaan wanneer het lokaal kloksignaal niet naar buiten gebracht wordt, of zelfs wanneer de looptijd van de signalen tussen de buitenwereld en de inputs van de automaat niet goed gekend is. Het laatste komt voor bij de realisatie van grote machines (groot kan hier de betekenis hebben: met de afmetingen van enkele vierkante millimeter als het gaat over ASIC-ontwerp met hoge klokfrequenties). In zulke gevallen mag men niet langer aannemen dat de inputs synchroon aangeboden worden, en moet men de vraag stellen wat het verband nog is tussen het gedragsmodel van de machine en het werkelijk gedrag van de implementatie. Wij zullen dit doen in een aantal stadia. De input bevat meerdere bits die samenhoren Met bits die samenhoren bedoelen wij een geëncodeerde meerwaardige input, bijvoorbeeld een 8-bit ASCII karakter in een parallelle interconnectie. Een aantal individuele binaire inputs die onderling niet gerelateerd zijn en van diverse bronnen afkomstig zijn horen volgens deze definitie niet samen. Samenhorende bits komen voor wanneer men 233

238 bv. twee automaten wil koppelen die aangedreven worden door verschillende kloksignalen. Een verandering op een dergelijke input-bitrij kan dus bestaan uit een verandering op meer dan één binair signaal; dit kan toestandstransities veroorzaken in meer dan één geheugencel, dus met Hamming-afstand groter dan 1. Wanneer de input synchroon aangelegd wordt, zullen de betrokken geheugencellen betrouwbaar de gewenste transitie maken, omdat hun inputs stabiel zijn gedurende het I-interval. Wanneer echter de input asynchroon aangelegd wordt, kan de feitelijke toestandstransitie verschillen van de gewenste, omdat sommige geheugencellen de overgang wel doen, andere niet. Het is dus net of de automaat een andere code gelezen heeft dan diegene die door de bron via de bitrij verstuurd werd; dit is een ontoelaatbare situatie. Om betrouwbare (gelijktijdige) communicatie van bitrijen mogelijk te maken tussen onderling asynchrone automaten moet men er dus voor zorgen dat zij slechts transities kunnen veroorzaken in de automaat op ogenblikken waarop de bitrij voldoend lang en gegarandeerd stabiel is. Dit vereist de invoering van een communicatie- en synchronisatieprotocol tussen zender en ontvanger. Hierop komen wij verder terug. De input bestaat uit één binair signaal Hier kunnen wij twee gevallen onderscheiden: ofwel kan de input interne toestandstransities veroorzaken op meer dan één geheugencel, ofwel is dit niet het geval. In het eerste geval, dus wanneer de asynchrone input transities kan veroorzaken tussen toestanden waarvan de encodering verschilt in meer dan één bit, geraken wij in dezelfde moeilijkheden als bij bitrij-inputs. Het kan inderdaad voorkomen dat, bij een asynchrone overgang op het inputsignaal, niet alle geheugenelementen die een overgang zouden moeten maken, dit effectief ook doen. 5 We maken dan een transitie naar een niet-gewenste toestand, en de automaat werkt ook niet volgens zijn gedragsmodel. Wanneer wij het echter zo aan boord leggen dat de input slechts Hammingafstand-1 overgangen kan induceren in de automaat, en zodanig dat een verandering op de input geen hazards veroorzaakt in het circuit dat de toestandsfunctie realiseert, dan kunnen wij een betrouwbare werking verkrijgen. Nog steeds is het zo dat wij onzekerheid hebben of de overgang effectief gebeurt op een bepaald ogenblik. Deze onzekerheid kan echter geen kwaad, zolang wij met observeerbare signalen te maken hebben. Observeerbare signalen zijn signalen waarvan de verblijfsduur in een logisch niveau groter is dan de klokperiode van de automaat. In dit geval zal, bij het niet uitvoeren van de gewenste overgang op een bepaalde klokflank, dit met zekerheid 6 plaats vinden bij de volgende klokflank. De enige onzekerheid die wij dus nog hebben is het tijdstip waarop de overgang gebeurt, niet de overgang zelf Synchronisatieflipflops en -protocollen De eis tot hazardvrije Hammingafstand-1 overgangen voor asynchrone binaire inputs kan eenvoudig worden voldaan door het inputsignaal te synchroniseren met behulp van een synchronisatieflipflop: figuur In feite bouwt men een cascadecompositie van twee machines M 1 en M 2. Wanneer in de resulterende machine M een wachtlus voorkomt 5 In feite is het erger dan dat: wanneer de combinatorische schakelingen in de toestandsfunctie niet hazardvrij zijn, kunnen zelfs andere geheugencellen een niet-gewenste overgang maken! 6 Wij maken hier abstractie van de kans op metastabiliteit, die wij verwaarloosbaar klein veronderstellen. 234

239 } } } asynchroon gesynchroniseerd I I* A I=0 A en B verschillen in 1 bit I=1 klok B M1 M2 M Figuur 7.18: Het gebruik van een synchronisatieflipflop. De globale toestand in M wordt voorgesteld door S = (S 1, S 2 ). Hierdoor wordt A = (0.XXX) en B = (1.XXX) (Hamming-afstand 1). zoals getoond in de figuur, dan verschillen de toestanden A en B slechts in de waarde van de toestand van M 1, en dus over één bit. Dit is zo, aangezien de originele machine M 2 op zich eveneens in een wachtlus moet zitten, en de transitie op input I slechts gewaar wordt in toestand B. Vanuit B mogen dan terug transities over een willekeurige Hammingafstand gebeuren. Als synchronisatieflipflop (of -schakeling) kiest men uiteraard best een circuit met uitstekende metastabiliteitseigenschappen. Op basis van een dergelijke flipflop kan men nu betrouwbare communicatie opzetten tussen onderling asynchrone automaten: figuur Wij voorzien in twee extra binaire signalen dav (van data available) en ack (van acknowledge), die zender en ontvanger verbinden, naast de eigenlijke communicatiesignalen data. Het protocol verloopt als volgt: 1. De zender observeert het ack-signaal van de ontvanger. Wanneer dit op 0 staat, betekent het dat de ontvanger klaar is voor nieuwe gegevens; 2. De zender brengt de nieuwe gegevens aan op data; deze verandering zal echter geen toestandstransities veroorzaken in de ontvanger; 3. De zender brengt het dav-signaal op 1, om aan te geven dat de gegevens stabiel zijn; 4. Wanneer de ontvanger de overgang van 0 naar 1 op dav gedetecteerd heeft, kan hij een toestandstransitie uitvoeren die afhankelijk is van data, bv. de gegevens opslaan in een intern register. Hoewel deze overgang meer dan Hamming-1 is, kan dit nu op een betrouwbare manier, aangezien de gegevens gegarandeerd stabiel zijn; 5. De ontvanger signaleert het opnemen van de gegevens door ack op 1 te brengen; 6. De zender wacht op het op 1 komen van ack; wanneer dit gebeurt mag hij de gegevens van data verwijderen, en brengt hij dav laag; opnieuw veroorzaakt dit geen toestandstransities in de ontvanger; 7. Wanneer de ontvanger klaar is voor nieuwe gegevens brengt hij ack weer op 0 235

240 klok1 dav data ack klok2 ack=1 ack=0 data out dav=0 dav<-1 dav=1 ack=0 ack<-1 lees ack=1 dav=1 dav<-0 dav=0 data weg ack<-0 zender ontvanger Figuur 7.19: Synchronisatieprotocol tussen asynchroon gekoppelde automaten. De gearceerde opeenvolgende toestanden verschillen in één bit. 236

241 Figuur 7.20: Een seriële opteller Dit schema heet in het Engels het 4-phase signalling protocol. Uiteraard zijn er varianten op mogelijk. Het zijn precies de synchronisatiesignalen dav en ack die als asynchrone inputs behandeld moeten worden, dav bij de ontvanger en ack bij de zender. Wanneer deze signalen lokaal gesynchroniseerd worden, zullen zij in beide automaten betrouwbare Hamming-1 overgangen induceren, die de bemonstering van de gegevens op data slechts toelaten wanneer de gegevens reeds meer dan één klokperiode stabiel zijn. Wanneer deze synchronisatiegebeurtenissen zeer frequent plaatsgrijpen kan het aangewezen zijn de synchronisatieflipflop dubbel uit te voeren, ten einde de kans op metastabiele werking tot onbeduidende niveaus terug te dringen (bv. MTBF > 10 jaar). 7.8 Opgaven 1. Ontwerp een synchrone automaat naar volgende specificaties (fig. 7.20). (a) Hij heeft een klokingang C met positieve flanksturing, 3 binaire inputs X 1, X 2, en R, en 1 binaire uitgang Y. (b) Een logische 1 op R brengt de automaat steeds naar zijn begintoestand. Wanneer R = 0 berekent de automaat bitserieel de som van de sequenties aangeboden aan X 1 en X 2. Deze sequenties zijn de binaire representaties van niet-negatieve gehele getallen. Het minstbeduidend bit komt eerst, ook op de output. 2. Ontwerp een synchroon sequentieel netwerk met 3 inputs X, Y, R, en 1 output Z dat Wanneer R = 1 naar een begintoestand gaat met Z = 0; Wanneer R = 0, na elke actieve klokflank k indiceert of X(k) > Y (k), waarin X(k) en Y (k) de getallen zijn, binair gepresenteerd door resp. de bitrijen x k, x k 1,..., x 0 en y k, y k 1,..., y 0 (Fig. 7.21). Ontwerp en minimaliseer de machine. Realiseer ze met poorten en flankgestuurde D-flipflops. 3. Beschouw het onderstaand (minimale) ttt van een synchrone automaat. 237

242 Figuur 7.21: Een seriële comparator 0 1 A B C B A D C E C D E B E C D Realiseer deze machine met behulp van flankgestuurde geheugencellen, OF-poorten, EN-poorten en invertoren. Teken de realisatie. Uw antwoord wordt gequoteerd op basis van (a) de correctheid, en (b) de economie. Voor de economie wordt rekening gehouden met het aantal geheugencellen, het aantal poorten, het aantal poortinputs, en het aantal invertoren. 4. Onderstaande tabel is de ttt van een minimale synchrone automaat. Realiseer deze automaat zo economisch mogelijk, en teken het schema van de realisatie. X=0 X=1 A D E B E F C F D D A B E B C F C A 5. Stel een minimaal TTT op voor een synchrone automaat die de sequenties herkent (hier betekent 0 nul of meer herhalingen van 0). Kan je hieruit snel een (eveneens minimaal) TTT afleiden voor een automaat die zowel als herkent? 6. Ontwerp een synchrone automaat met (naast de klokinput), één input X, en één output Y. Initieel is Y = 1. Op X worden achtereenvolgens, en synchroon met de klok, enen en nullen aangelegd. Op elk ogenblik stelt de sequentie bits die men tot dan toe op de input gezien heeft, een natuurlijk getal voor, waarbij de minstbeduidende bits het laatst (meest recent) werden aangebracht. De output Y moet op elk ogenblik indiceren of het getal een veelvoud is van 3. Volg de volgende stappen: (a) stel de primitieve ttt van dit probleem op; (b) minimaliseer deze ttt; (c) kies een willekeurige toestandsassignatie; (d) realiseer de combinatorische functies; (e) teken het circuitdiagram. 238

243 X Xb Zb B X p X X Y q A B B Ab A X Bb Y r s Zb B A B Yb X Z A Z f c Z Xb Ab B g Yb A X Y Zb Y Xb Xb A B Zb Y A Zb j k h m Y A B X Figuur 7.22: Figuur bij vraag 8 7. Beschouw de onderstaande (minimale) ttt van een synchrone automaat. (a) Zoek alle stabiele partities van deze ttt. (b) Stel een toestandsassignatie voor (zelfs indien je het vorig punt niet naar behoren hebt opgelost). (c) Ontwerp een circuit met behulp van poorten en flankgestuurde geheugencellen dat het gewenste gedrag vertoont. 0 1 A A E B B F C C G D D H E B F F C G G D H H A E 8. Her-realiseer het circuit van figuur 7.23 op een zo economisch mogelijke manier, en teken het resulterend schema. Probeer een zo economisch mogelijke oplossing te vinden, maar gedenk dat correctheid gaat boven economie. 9. Beschouw het taknetwerk uit figuur

244 Figuur 7.23: Te verbeteren netwerk (a) Welke functies f 0,..., f n berekent dit netwerk voor n variabelen x i? groeit het netwerk met n? Hoe (b) Realiseer dezelfde functies als serie-parallelnetwerken van schakelaars. Hoe groeit de complexiteit van deze netwerken met n? (c) Realiseer dezelfde functies als minimale 2-niveau poortnetwerken, en beantwoord dezelfde vraag als onder (b). (d) Realiseer de functies als een meerlaags poortnetwerk waarvan de groei minder snel is dan het netwerk uit (c). Hoe groot is deze groei? Hoe snel is het netwerk? (Hint: gebruik als primitief element de 2-naar-1 multiplexer y = x 1 x + x 2 x.) 10. Ontwerp een synchroon circuit met één input X en één output Y dat bij een serieel toegevoerd 2-bitgetal, 3 optelt. De getallen worden in groepen van 3 bit toegevoerd, minstbeduidend bit eerst, en hoogste bit op 0. De output moet eveneens naar buiten komen met het minstbeduidend bit eerst, dat verschijnt wanneer het middelste bit aangelegd wordt aan de input: X: a0 a1 0 b0 b Y: 0 c0 c1 c2 d0 d1... Zorg ervoor dat uw realisatie naast correct zo economisch mogelijk is. 240

245 Figuur 7.24: Te analyseren taknetwerk 11. Ontwerp een synchroon circuit met twee inputs X en Y, één output Z. Dit circuit moet het verschil uitrekenen van twee binaire getallen (Z = X Y ) die bit per bit aangeboden worden, het minst beduidend bit eerst (figuur 5.20 vraag 2). Zorg ervoor dat uw realisatie naast correct zo economisch mogelijk is, en gebruik steeds methoden uit de cursus in de diverse stadia van het ontwerp. Gedenk dat correctheid gaat boven economie. Vergeet het circuit niet te tekenen. 12. (LRU-schakeling) Ontwerp een synchroon circuit met twee inputs X, Y en drie outputs U, V, W dat de LRU-ordening bijhoudt van drie gebeurtenissen A, B, C. De inputs encoderen de drie mutueel exclusieve gebeurtenissen A, B, C, als volgt: X, Y = (0, 1), als A optreedt (1, 1), als B optreedt (1, 0), als C optreedt (0, 0), als geen van de drie optreedt Bits U, V moeten aangeven welk van de drie gebeurtenissen het meest recentelijk is opgetreden; bit W geeft aan of de overige gebeurtenissen in lexicale volgorde opgetreden zijn of niet. Bijvoorbeeld, men zou kunnen kiezen (keuze is niet eenduidig bepaald): UV W volgorde (van meest recent naar minst recent) 000 ABC 001 ACB 110 BAC 111 BCA 100 CAB 101 CBA Wanneer een signaal (nog) niet is opgetreden nemen wij aan dat de lexicografische orde geldt, dus bij het opstarten geldt de output 000. Hints: stel een transitiediagram op waarop je de TTT baseert, en probeer de minimalisatiestap overbodig te 241

246 maken. Als je de partitiemethode zou gebruiken voor toestandsassignatie, probeer dan niet de volledige tralie op te stellen. Je kan goede assignaties vinden op basis van de minimale partities. Gebruik, om het schrijfwerk te beperken, Karnaughkaartjes en afzonderlijke minimalisatie. 242

247 Bijlage A Concrete representatievormen voor digitale systemen Wil men de computer gebruiken bij het ontwerp en de realisatie van complexe digitale systemen, dan heeft men computerleesbare representaties nodig van de diverse aspecten die de systemen in opbouw kenmerken, en die wij in de vorige hoofdstukken geïdentificeerd hebben. Deze appendix bespreekt de eigenschappen van enkele historische en hedendaagse beschrijvingsvormen. Er bestaat een grote diversiteit in de concrete representatievormen van de aspecten van digitale systemen. Men kan hierin een zekere systematiek creëren door gebruik te maken van de terminologie gehanteerd in het Gajskidiagram: het onderscheid tussen gedrag, logische structuur en fysische structuur; en het onderscheid in beschrijvingsniveau (van systeemniveau tot circuitniveau). Een bijkomend punt van onderscheid is de aard van de beschrijving: grafisch of tekstueel. Onze behandeling zal gestructureerd zijn op het laatste aspect. Wij zullen slechts enkele systemen beschrijven van de zeer veel bestaande systemen; wij streven dus geenszins een vorm van volledigheid na. In dit hoofdstuk zullen wij wat tijd spenderen aan een van de belangrijkste hedendaage systeemrepresentaties: beschrijvingen in VHDL. Wij zullen de essenties van deze systeembeschrijvingstaal toelichten, en enkele voorbeelden geven van typische representatiestijlen. A.1 Tekstuele vormen Goede beschrijvingssystemen voor digitale systemen zouden in staat moeten zijn alle aspecten van een systeem te representeren, en dit op het gewenste niveau van detail. Bovendien zouden zij een aantal bijkomende eigenschappen moeten hebben: zij zouden een stevige, ondubbelzinnige formele definitie moeten hebben, zodanig dat automatische verificatie en bewijsvoering mogelijk wordt. Voorts zou het beschrijvingssysteem een grote expressiviteit moeten hebben, om de rijkheid van aspecten die digitale systemen kenmerken, tot uiting te brengen. Zij zouden idealiter zowel declaratieve als procedurale stijlen moeten ondersteunen, en de mogelijkheid moeten bieden om de notie tijd in zijn diverse verschijningsvormen te representeren. 243

248 Een belangrijk aspect hierin is de uitdrukking van het intrinsiek parallellisme dat aanwezig is in digitale systemen, en de expliciete aanwezigheid van de tijd in de beschrijving van hun werking. Wanneer men beschrijvingssysteem wil inspireren op bestaande programmeertalen, merkt men op dat precies deze aspecten afwezig zijn. Het gebruik van een programmeertaal voor de beschrijving van digitale systemen op een voldoend algemene manier vereist dus steevast uitbreidingen van de taal om de specifieke eigenheden van digitale systemen te kunnen beschrijven. Zo zijn er uitbreidingen gedefinieerd van APL (AHPL), C, Pascal, en vele andere talen. Wij zullen nu enkele tekstuele representaties presenteren, waarvan de eerste van historische betekenis is omdat zij diverse concepten heeft aangebracht die men terugvindt in de hedendaagse talen zoals VHDL. A.1.1 ISPS ISPS (van Instruction Set Processing System) is, zoals gezegd, een oudere notatie die nu niet meer gebruikt wordt 1. Zij werd speciaal uitgedacht om het gedrag van computers of onderdelen van computers te beschrijven op machineniveau, in het bijzonder de uitvoering van machine-instructies. Dit is het niveau dat in de Gajski-terminologie het RT-niveau genoemd wordt. ISPS is in het verleden dikwijls gebruikt om de precieze betekenis van de instructieset van diverse computers te beschrijven; deze beschrijvingen hadden het belangrijk voordeel van compact en ondubbelzinnig te zijn, wat niet het geval is met de traditionele verbale beschrijvingen die men gewoonlijk vindt in de databoeken die een processor beschrijven. Een typische ISPS-beschrijving van de uitvoering van instructies bestond uit een drietal delen: (1) de declaratie van het geheugenmodel van de machine, waarin de processorregisters beschreven werden, alsook het extern geheugen; (2) de declaratie van het instructieformaat en de effectieve-adresberekening, en (3) de eigenlijke interpretatieve lus. Typische beschrijvingen van een computerarchitectuur in ISPS zijn ettelijke bladzijden lang 2 ; diverse voorbeelden ervan vindt men in [Siewiorek82] en [Bell71]. Om toch een idee te kunnen geven van hoe een ISPS-beschrijving eruit ziet, beschouwen wij het voorbeeld van een AM2909 sequencer, een component die gebruikt werd bij de bouw van gemicroprogrammeerde architecturen. Figuur A.1 geeft een (grafisch) structuurbeeld op RT-niveau van deze component, terwijl fig. A.2 een gedragsbeschrijving op RT-niveau geeft. Een ISPS-beschrijving lijkt sterk op een gewoon programma. Nochtans zijn er enkele belangrijke verschillen met de courante semantiek van programmeertalen. Zo bemerkt men het sleutelwoord next. Dit woord duidt erop dat de statements die het scheidt na elkaar uitgevoerd worden; zonder dit sleutelwoord wordt verondersteld dat de statements in gelijk welke volgorde, dus ook tegelijkertijd, kunnen uitgevoerd worden. Noteer dat dit een uiting is van het onderliggend parallellisme in de werking van de beschreven hardware. Een tweede verschilpunt met programmeertalen zijn de datatypes. Het meest-gebruikte datatype in ISPS-beschrijvingen is de bitrij, aangegeven met de haakjes < en >. Indexeringen in een bitrij of het extraheren van een veld worden genoteerd 1 Hoewel een zoektoch op het WWW met de vraag +ISPS -internet +language +simulator nog heel wat oplevert! 2 Maar veel korter dan de traditionele beschrijvingen die men vindt in databoeken

249 Figuur A.1: De (logische) structuur van de AM2909 Sequencer (RT-niveau) 245

250 AM2909 := begin! ISPS description of AMD AM2909 bit slice microprogram sequencer. **PC.State** upc<3:0> := incr<3:0>, REG<3:0>, SP<1:0>, STACK[0:3]<3:0> **External.State** Cn<>, Cn4<> := incr<4>, D<3:0>, FE<>, OE<>, OR.<3:0>, PUP<>, R<3:0>, RE<>, S<1:0>, ZERO<>, **Implementation.Variables** incr<4:0>, macro z := 1111,! microprogram counter! Address Register! Stack Pointer! Stack Register File! Carry in! Cary out! Direct inputs! Stack Register File Enable! Output Enable Control Line! Logical OR inputs! Push/Pop Control Line! Address Register Inputs! Register Enable Control! Address select control Lines! Zero-out control line! Incrementor! High Impedance constant **Operation.Cycle**{us} start(main) := begin OE = FE = 0; RE = ZERO = 1 next run :=! Basic Operation Loop begin Y() next! put out selected address If not FE =>! Perform any stack operations begin DECODE PUP => begin 0\pop := (SP = SP -1) 1\push := (SP = SP +1 next STACK[SP] = upc) end end next If not RE => REG <- R;! Load register if enabled incr = upc + Cn next! Increment PC RESTART run end end. **Adress.Source.Selection**{us} Y()<3:0> := begin DECODE OE denotes concatenation begin 00 := Y = upc = 0000, [ 01, 11] := Y = z, 10 := DECODE S => begin 00 := Y = upc = upc or OR., 01 := Y = upc = REG or OR., 10 := Y = upc = STACK[SP] or OR., 11 := Y = upc = D or OR. end end end, end! OF AM2909 description Figuur A.2: De ISPS-beschrijving van de AM2909 sequencer 246

251 door middel van een getallenpaar, bv. <1:4>. Natuurlijke getallen kunnen worden gerepresenteerd in binaire ( 1100), octale (#14), decimale (12) of hexadecimale notatie ("C). Bijkomende interpretatie wordt gegeven door wijzigingstekens zoals {us}, wat staat voor unsigned. Geheugenstructuren, dit zijn regelmatige structuren van bitrijen, worden aangegeven met de rechte haakjes [ ]. ISPS-beschrijvingen waren uitvoerbaar. Via een simulatie kon men hierdoor een goed idee krijgen over de aard en de prestaties van een instructieset, of kon men een te ontwerpen systeem op RT-niveau simuleren. Merk op dat echter nergens spraak is van tijdswaarden: het model was zeker geen compleet model dat het gedetailleerde tijdsgedrag weergeeft. A.1.2 ABEL, ALTERA Voor de programmering van programmeerbare standaardcomponenten werden er programmeeromgevingen opgezet door de fabrikanten van deze componenten. Deze omgevingen bevatten tekstuele beschrijvingstalen die de ontwerper in staat stellen het gewenste gedrag van de component te beschrijven. Gezien de aard van de componenten situeren de beschrijvingen zich essentieel op logisch niveau. De talen bevatten dus onder meer technieken om Boolese functies en eindige automaten op een concrete manier te denoteren. Deze talen bestaan reeds geruime tijd, maar worden nog steeds gebruikt voor het programmeren van kleinere programmeerbare componenten. 3 Evenmin als ISPS bevatten deze modellen een concreet tijdsmodel van het gedrag. Het tijdsaspect van het gedrag wordt bepaald door de component zelf, en door de frequentie van het (extern aangelegde) kloksignaal in het geval van synchrone automaten. Deze talen bevatten wel mogelijkheden om partiële functies voor te stellen, door partiële opgave van een waarheidstabel. Bovendien kunnen irrelevante inputs of outputs voorgesteld worden door het symbool.x. in ABEL, en afgeschakelde outputs door het symbool.z.. Een beschrijving bevat, naast het pure gedrag, ook informatie over de component waarin het gedrag moet gerealiseerd worden, alsmede de plaatsing van inputs en outputs op de pinnen van deze component. Dit gedeelte van de beschrijving is duidelijk structurele informatie ( technology mapping ). Bovendien kan de ontwerper, naast de beschrijving van het gedrag door middel van Boolese functies of eindige automaten, een tweede (partiële) beschrijving geven van het gedrag, onder de vorm van een rechtstreekse opgave van het verband tussen inputs en outputs voor een beperkt stel inputs (een sequentie voor automaten). Deze tweede beschrijving, de testvectoren, kan gebruikt worden als een validatie van de eerste beschrijving, en tevens als testinformatie om te zien of de component, na de programmering, correct functioneert. Wij zullen een en ander illustreren aan de hand van twee korte voorbeelden in ABEL. Het eerste voorbeeld is een louter combinatorische functie: een multiplexer die drie groepen (a3,a2,a1,a0), (b3,b2,b1,b0) en (c3,c2,c1,c0) van vier bits multiplexeert naar 4 bits (y3,y2,y1,y0) onder controle van de selectielijnen (s1,s0). De beschrijving begint met een identificatie van de functie, de ontwerper(s) en de datum. Nadien volgen declaraties van de te gebruiken component, de signaalnamen en hun associatie met pinnen van het IC, en veelgebruikte constanten. Noteer dat men de mogelijkheid heeft om geor- 3 Een definitie van de syntaxis van Abel vindt men bv. op /abel/abel.primer.html 247

252 module mux12t4 title 12 to 4 multiplexer 24 Feb 1984 Charles Olivier & Dave Pellerin Data I/O Corp. "declarations IC1 device P14H4 ; a0,a1,a2,a3 pin 1,2,3,4; b0,b1,b2,b3 pin 5,6,7,8; c0,c1,c2,c3 pin 9,11,12,13; "define select inputs s1,s0 pin 18,19 "define output y0,y1,y2,y3 pin 14,15,16,17; H = [1,1,1,1]; L = [0,0,0,0]; X = [.X.,.X.,.X.,.X.]; Select = [s1,s0]; y = [y3,y2,y1,y0]; a = [a3,a2,a1,a0]; b = [b3,b2,b1,b0]; c = [c3,c2,c1,c0]; equations y = (select == 0) & a # (select == 1) & b # (select == 2) & c # (select == 3) & c; test_vectors ([select, a, b, c] -> y) [0, 1, X, X] -> 1; [0,10, X, X] ->10; [0, 5, X, X] -> 5; [1, H, 3, H] -> 3; [1,10, 7, H] -> 7; [1, L,15, L] ->15; [2, L, L, 8] -> 8; [2, H, H, 9] -> 9; [2, L, L, 1] -> 1; end mux12t4 [3, H, H, 0] -> 0; [3, L, L, 9] -> 9; [3, H, L, 0] -> 0; Figuur A.3: Een 12-naar-4 multiplexer in ABEL v2.0. Nu is men toe aan ABEL v7.0 zie bv. dende rijen van symbolen of signalen een korte naam te geven. De Boolese vergelijkingen zelf zijn vergelijkingen in deze namen, waarbij de logische operatoren == (gelijkheid, met (x == y) = xy + x y ),! (niet), & (en) en # (of) uitgebreid worden tot bitrijen. Het tweede voorbeeld betreft een synchrone decimale op/neerteller (figuur A.4). Weer volgt het bovenstaande stramien, maar het gedrag wordt nu beschreven door een tekstuele representatie van een toestandstransitiediagram. De 10 toestanden krijgen een symbolische naam, en van elke toestand wordt gezegd welke toestand erop volgt bij de volgende klokflank, afhankelijk van het Mode-signaal. De programmeeromgeving bevat een compiler, die de ingegeven beschrijving optimaliseert (logische minimalisatie), en afbeeldt op een interne configuratie van de component. Deze configuratie wordt gesimuleerd op basis van de meegegeven testvectoren. Op die manier gebeurt een gedeeltelijke validatie van de beschrijving. Verder wordt een 248

253 module count10 flag -r3 title decimal Up/Down counter with Synchronous Clear Michael Holley Data I/O Corp 24 Febr 1984 uc3 device P16R4 Clk,Clr,Dir,OE pin 1,2,3,11 Q3,Q2,Q1,Q0 pin 14,15,16,17 Cl,X,Z =.C.,.X.,.Z. " Counter States S0 = ^b1111; S4 = ^b1011; S8 = ^b0111; S1 = ^b1110; S5 = ^b1010; S9 = ^b0110; S2 = ^b1101; S6 = ^b1001; S2 = ^b1100; S7 = ^b1000; " Counter Modes Mode = [Clr,Dir]; Up = [ 1, 1 ]; Down = [ 1, 0 ]; Clear = [ 0, X ]; test_vectors ( [Clk, OE, Mode ] -> [Q3,Q2,Q1,Q0]) [ Ck, 0, Clear] -> S0; [ Ck, 0, Up] -> S1; [ Ck, 0, Up] -> S2; [ Ck, 0, Up] -> S3; [ Ck, 0, Up] -> S4; [ Ck, 0, Up] -> S5; [ Ck, 0, Up] -> S6; [ Ck, 0, Up] -> S7; [ Ck, 0, Up] -> S8; [ Ck, 0, Up] -> S9; [ Ck, 0, Up] -> S0; [ Ck, 0, Up] -> S1; [ Ck, 0, Down] -> S0; [ Ck, 0, Down] -> S9; [ Ck, 1, Down] -> Z; [ Ck, 0, Down] -> S7; [ Ck, 0, Clear] -> S0; state_diagram [Q3,Q2,Q1,Q0] State S0: Case (Mode == Up) : S1; (Mode == Down) : S9; (Mode == Clear): S0; endcase; State S1: Case (Mode == Up) : S2; (Mode == Down) : S0; (Mode == Clear): S0; endcase; State S2: Case (Mode == Up) : S3; (Mode == Down) : S1; (Mode == Clear): S0; endcase; Figuur A.4: Een synchrone decimale op/neerteller in ABEL v2.0 bestand gegenereerd dat de configuratie-informatie bevat. Met dit bestand (in feite een structuurbeschrijving, gedeeltelijk op fysisch niveau) kan de chip geprogrammeerd worden. A.1.3 VHDL De afkorting VHDL komt van Very high speed integrated circuits Hardware Description Language. Deze taal kwam tot leven in het begin van de jaren 80. Sindsdien (1987) werd zij aanvaard als een standaard (IEEE 1076), en is nu in snel tempo bezig de vele ad hoc hardware-beschrijvingstalen te verdringen. Zij heeft sinds haar introductie in 1987 al 249

254 State S3: Case (Mode == Up) : S4; (Mode == Down) : S2; (Mode == Clear): S0; endcase; State S4: Case (Mode == Up) : S5; (Mode == Down) : S3; (Mode == Clear): S0; endcase; State S5: Case (Mode == Up) : S6; (Mode == Down) : S4; (Mode == Clear): S0; endcase; State S6: Case (Mode == Up) : S7; (Mode == Down) : S5; (Mode == Clear): S0; endcase; State S7: Case (Mode == Up) : S8; (Mode == Down) : S6; (Mode == Clear): S0; endcase; State S8: Case (Mode == Up) : S9; (Mode == Down) : S7; (Mode == Clear): S0; endcase; State S9: Case (Mode == Up) : S0; (Mode == Down) : S8; (Mode == Clear): S0; endcase; end count10 Figuur A.5: Een synchrone decimale op/neerteller in ABEL v2.0 (vervolg) diverse uitbreidingen ondergaan. VHDL is een taal gericht op de concrete representatie van een aantal aspecten van digitale systemen, en dit op een aantal hiërarchische beschrijvingsniveaus. Zij bevat dus een aantal voorzieningen die specifiek zijn voor deze taak: de mogelijkheid om diverse vormen van parallellisme uit te drukken; de mogelijkheid om zowel gedragsbeschrijvingen als structuurbeschrijvingen te geven; de mogelijkheid om een aantal voorwaarden uit te drukken waaraan signalen moeten voldoen voor een correcte werking; en de mogelijkheid om tot op zekere hoogte het tijdsgedrag van digitale systemen te beschrijven. De betekenis van een VHDL-beschrijving wordt impliciet gedefinieerd door een simulator, die in feite het programma uitvoert en daardoor een simulatie is van het te ontwerpen circuit. Wij zullen nu wat dieper ingaan op enkele bijzondere aspecten van VHDL; dit is uiteraard niet voldoende om de taal te beheersen, en wij verwijzen de lezer met aandrang naar een complete definitie (zie bv. [Lipsett89]). Wij zullen onze bespreking baseren op de beschrijving van een 74ls160-teller. 250

255 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity f160 is port ( clock: in STD_LOGIC; d: in STD_LOGIC_VECTOR (3 downto 0); en_p: in STD_LOGIC; en_t: in STD_LOGIC; load_b: in STD_LOGIC; ); end f160; clear_b: in STD_LOGIC; q: inout STD_LOGIC_VECTOR (3 downto 0); c_out: out STD_LOGIC Figuur A.6: De entity-declaratie van de teller: grafisch en tekstueel Structuur van een VHDL-beschrijving Algemene Structuur. Een VHDL-beschrijving van een systeem(onderdeel) bestaat uit twee gedeelten: een entity-declaratie en een architecture-declaratie. De entity-declaratie definieert in feite de externe verbindingen van het beschreven object. Alle verbindingen naar buiten zijn ports, en dragen een bepaald type. De richting van de informatiestroom wordt aangegeven (figuur A.6). Een architecture-declaratie specificeert wat zich binnen het object bevindt. Bij één enkele entity-declaratie kunnen er meerdere architecture-declaraties horen. Sommige declaraties specificeren gedrag, andere specificeren structuur. Een voorbeeld van een architecture-declaratie die het gedrag van de teller specificeert vindt men in figuur A.7; een structurele beschrijving vindt men in figuur A.8. Noteer dat de regelnummers niet behoren tot de VHDL-beschrijving, zij werden er enkel ter referentie bijgezet. Wij zullen onze verdere bespreking baseren op deze fragmentjes. Datatypes. VHDL is een sterk getypeerde taal. Daar het de bedoeling is VHDL te gebruiken op diverse niveaus in de Gajski-hiërarchie, verwondert het niet dat men een ruim assortiment datatypes vindt in VHDL. Op topniveau worden gedragsbeschrijvingen meestal gegeven onder de vorm van processen, procedures en algoritmen. De datatypes die daar veel gebruikt worden zijn de numerieke types (integer, floating) en de enumeratietypes. Speciaal de enumeratietypes maken het mogelijk types te definiëren die bruikbaar zijn op de lagere niveaus van de systeembeschrijving. Zo is de definitie van het datatype std ulogic (unresolved state system) in de standaard IEEE 1164 pack- 251

256 1 architecture gedrag of f160 is 2 begin 3 Teller: 4 --Geeft een model van de correcte werking van de teller. 5 --Er zijn geen voorzieningen om het gedrag bij verkeerd gebruik 6 --te simuleren. 7 process(clock, clear_b) 8 begin 9 if clear_b= 0 then --asynchrone reset 10 q <= "0000" after 20 ns; 11 elsif clock event and clock= 1 then --stijgflank van de klok 12 if load_b = 0 then --synchrone load 13 q <= d after 20 ns; 14 elsif (en_t and en_p)= 1 then --teloperatie 15 if q /= "1001" then 16 q <= q + "1" after 20 ns; 17 else 18 q <= "0000" after 20 ns; 19 end if; 20 end if; 21 end if; 22 end process; process(q,en_t) --carry-generatie op basis 25 begin --van huidige toestand en en_t input 26 c_out <= (q(0) and q(3) and en_t) after 3 ns; --(mealy output) 27 end process; *********************** asserties ***************************************** 30 --check klokbreedte 31 assert clock stable or (clock= 1 ) or clock delayed stable(25ns) 32 report "klokbreedte te klein" 33 severity warning; 34 --check setup 35 assert clock stable or (clock = 0 ) or d stable(15 ns) 36 report "Data setup niet gerespecteerd" 37 severity warning; 38 assert clock stable or (clock = 0 ) or load_b stable(25 ns) 39 report "load setup niet gerespecteerd" 40 severity warning; 41 assert clock stable or (clock = 0 ) or (en_p stable(20 ns) and en_t stable(20 ns)) 42 report "enable setup niet gerespecteerd" 43 severity warning; 44 --check breedte clearpuls 45 assert clear_b stable or (clear_b= 0 ) or clear_b delayed stable(20 ns) 46 report "clearbreedte te klein" 47 severity warning; 48 --check klokfrequentie 49 process 50 variable previous:time:=0 ns; 51 begin 52 wait until clock event and (clock= 1 ); 53 previous := now; 54 while true loop 55 wait until clock event and (clock= 1 ); 56 assert (now - previous)>40ns 57 report "Klokfrequentie te hoog" 58 severity warning; 59 previous := now; 60 end loop; 61 end process; 62 end gedrag; Figuur A.7: Een gedragsspecificatie van de teller 252

257 1 architecture structuur of f160 is 2 3 component jk 4 port ( 5 clock : in std_logic; 6 clear_b : in std_logic; 7 l,e,d : in std_logic; 8 q,q_b : inout std_logic 9 ); 10 end component; 11 signal load, cl, clk : std_logic; 12 signal j, k, en, q_b : std_logic_vector (0 to 3); begin 15 --interne controlesignalen 16 load <= not load_b after 1 ns; 17 clk <= not clock after 1 ns; 18 cl <= clear_b after 2 ns; array van jk-flipflops met load/toggle logica 21 g1: 22 for M in 0 to 3 generate 23 FF :jk port map ( clk, cl, load, en(m), d(m), q(m), q_b(m)); 24 end generate; enable en carry signaal 27 en(0) <= (en_t and en_p) after 3 ns; 28 en(1) <= (q(0) and en(0) and q_b(3)) after 3 ns; 29 en(2) <= (q(1) and q(0) and en(0)) after 3 ns; 30 en(3) <= (q(2) and q(1) and q(0) and en(0)) 31 or (q(0) and en(0) and q(3)) after 7 ns; 32 c_out <= (q(0) and q(3) and en_t) after 3 ns; end structuur; Figuur A.8: Een structuurdefinitie van de teller age als volgt: type std_ulogic is ( U, -- uninitialised X, -- forcing unknown 0, -- strong 0 1, -- strong 1 Z, -- high impedance W, -- weak unknown L, -- weak 0 H, -- weak 1 - ); -- don t care Deze definitie geeft een fijner zicht op een digitaal signaal dan gebruikelijk; 9 niveaus worden onderscheiden. Hiermee kan men o.a. vertragingen door capacitieve effecten relatief nauwkeurig modelleren, en de effecten van een sterke poort of schakelaar parallel aan een zwakke poort of een businterconnectie. Een voorbeeld van het gebruik van deze datatypes vindt men in de beschrijving van de werking van een open-collectorbus (figuur A.11). De buslijn neemt een lage spanning aan wanneer tenminste één van de transistors geleidt; anders zorgt de weerstand R ervoor dat de buslijn hoog komt. Dit kunnen wij modelleren door de weerstand permanent de waarde H te laten genereren; de transistors genereren 0 wanneer zij geleiden, en Z wanneer zij afgeknepen zijn. 253

258 1 architecture gates of f160 is 2 component jk 3 port ( 4 clock : in std_logic; 5 clear_b : in std_logic; 6 l,e,d : in std_logic; 7 q,q_b : inout std_logic 8 ); 9 end component; component inv 12 port ( 13 inp : in std_logic; 14 outp : out std_logic 15 ); 16 end component; component buf 19 port ( 20 inp : in std_logic; 21 outp : out std_logic 22 ); 23 end component; component and2 27 port ( 28 inp1 : in std_logic; 29 inp2 : in std_logic; 30 outp : out std_logic 31 ); 32 end component; component and3 35 port ( 36 inp1 : in std_logic; 37 inp2 : in std_logic; 38 inp3 : in std_logic; 39 outp : out std_logic 40 ); 41 end component; component and4 44 port ( 45 inp1 : in std_logic; 46 inp2 : in std_logic; 47 inp3 : in std_logic; 48 inp4 : in std_logic; 49 outp : out std_logic 50 ); 51 end component; component or2 54 port ( 55 inp1 : in std_logic; 56 inp2 : in std_logic; 57 outp : out std_logic 58 ); 59 end component; Figuur A.9: Een fijnere structuurdefinitie van de teller; nu op poortniveau. 254

259 60 61 signal load, cl, clk, xx, yy : std_logic; 62 signal j, k, en, q_b : std_logic_vector (0 to 3); begin 65 --interne controlesignalen 66 --cl <= clear_b after 2 ns; 67 buf1: buf 68 port map(clear_b,cl); inv1 : inv 70 port map(load_b, load); inv2 : inv 73 port map(clock, clk); array van jk-flipflops met load/toggle logica 76 g1: 77 for M in 0 to 3 generate 78 FF :jk port map ( clk, cl, load, en(m), d(m), q(m), q_b(m)); 79 end generate; enable en carry signaal 82 --en(0) <= (en_t and en_p) after 3 ns; 83 anda: and2 84 port map(en_t,en_p,en(0)); en(1) <= (q(0) and en(0) and q_b(3)) after 3 ns; 87 andb: and3 88 port map(q(0),en(0),q_b(3),en(1)); en(2) <= (q(1) and q(0) and en(0)) after 3 ns; 91 andd: and3 92 port map(q(1),q(0),en(0),en(2)); en(3) <= (q(2) and q(1) and q(0) and en(0)) or (q(0) and en(0) and q(3)) after 7 ns; 96 ande: and4 97 port map(q(2),q(1),q(0),en(0), xx); 98 andf: and3 99 port map(q(0),en(0),q(3),yy); 100 ora: or2 101 port map(xx,yy,en(3)); c_out <= (q(0) and q(3) and en_t) after 3 ns; 105 andc: and3 106 port map(q(0),q(3),en_t,c_out); end gates; Figuur A.10: Een fijnere structuurdefinitie van de teller; nu op poortniveau vervolg. 5 V Buslijn R 390 T1 T2 T3 Figuur A.11: De ingrediënten van een open-collectorbus 255

260 Een resolutiefunctie (zie verder) combineert deze waarden tot de finale waarde op de buslijn. De sterke 0 domineert de H van de weerstand en de Z van de afgeschakelde transistors. Wanneer echter alle transistors afgeknepen zijn, zal de zwakke H van de weerstand domineren over de Z-waarden. VHDL geeft de ontwerper ook de mogelijkheid eenheden van fysische grootheden te definiëren, waarbij aan een getaltype een eenheid geassocieerd wordt: type time is range -(2**31-1) to (2**31-1) units fs; -- femtoseconden: de basiseenheid ps = 1000 fs; -- picoseconden ns = 1000 ps; -- nanoseconden end units; Ook dit is een uitbreiding t.o.v. traditionele programmeertalen. In VHDL kan men samengestelde types definiëren uit de basistypes. De constructoren zijn record en array, net zoals bij programmeertalen. Variabelen en signals. VHDL kent, zoals gewone programmeertalen, ook objecten: 4 constant, variable en signal. De betekenis van een constante of variabele in VHDL komt overeen met deze in een programmeertaal. Variabelen kunnen gebruikt worden om informatie op te slaan bij de uitvoering van algoritmen. Variabelen hebben echter geen fysische interpretatie in het systeem dat beschreven wordt; het zijn louter interne hulpmiddelen van de beschrijving zelf. Sterk verschillend van programmeertalen is de definitie van signal. Een signal is een model voor een verbinding tussen twee onderdelen van het beschreven systeem, en stelt de tijdsevolutie van een logische of fysische grootheid voor. Aan elk dergelijk signal is een tijdsdimensie verbonden die de toekomstige evolutie van het signaal op het gedefinieerde signal beschrijft. Deze tijdsevolutie wordt opgeslagen in een structuur die men een driver noemt voor het signaal: een lijst van gebeurtenissen, die de toekomstige waarden van het signaal aangeven, en de tijdstippen waarop deze waarden zullen aangenomen worden. De toekomstige evolutie van het signaal wordt bepaald door acties die nu plaatsvinden (het heden, in gesimuleerde tijd 5 ). Deze acties kunnen, na verloop van een zekere tijdsduur in gesimuleerde tijd (causaliteit), wijzigingen tot gevolg hebben in de waarde die zal aangenomen worden door het signaal of door andere signalen. Bemerk het verschil met een gewone variabele: bij een toewijzing aan een variabele (:=) komt het begrip gesimuleerde tijd niet tussen. In de programmatekst die na de toewijzing komt kan men veronderstellen dat de variabele de nieuwe waarde heeft aangenomen, terwijl de gesimuleerde tijd niet is veranderd. Bij toewijzing aan een signaal (<=) krijgt het signaal slechts de waarde nadat de opgegeven gesimuleerde tijd verlopen is. Het statement na de toewijzing kan conceptueel gelijktijdig (in gesimuleerde tijd) uitgevoerd worden met de toewijzing, zodat het signaal daar nog zijn oude waarde moet hebben. De toewijzing 4 Object niet te interpreteren in de object-georiënteerde betekenis. 5 Wij zullen op verschillende plaatsen verwijzen naar begrippen zoals tijd en volgorde. Het is voor een goed begrip nuttig een duidelijk onderscheid te maken tussen de gesimuleerde tijd, dit is de tijd die de werking van het gesimuleerde circuit weergeeft, en de simulatietijd. Deze laatste is de tijd die verloopt tijdens de simulatie, en die kenmerkend is voor de volgorde waarin de statements van de VHDL-beschrijving worden uitgevoerd. Simulatietijd heeft tijdsduur nul in gesimuleerde tijd. 256

261 q <= "0000" after 20 ns; brengt het signaal q op de opgegeven waarde na 20 ns. Attributen. Bepaalde objecten in VHDL, zoals bv. signalen, hebben bijkomende attributen. Dit zijn eigenschappen van het voorwerp die kunnen opgevraagd worden en gebruikt in een VHDL-beschrijving. De syntaxis van een attribuut is naam attribuutnaam waarin naam de naam is van het voorwerp, en attribuutnaam de naam van de eigenschap die men wil kennen. Sommige attributen zijn ingebouwd, andere kunnen gedefinieerd worden door de gebruiker. Voorbeelden van attributen van signalen vindt men in fig. A.7. Bijvoorbeeld, de uitdrukking clock event (regel 11) is waar wanneer er juist een transitie waargenomen wordt op het signaal clock. De uitdrukking d stable(15 ns) (regel 35) is waar wanneer het signaal d niet veranderde gedurende de laatste 15 ns. Clock delayed(25 ns) (regel 31) is een met 25 ns vertraagde versie van het signaal Clock. Gedragsmodellen in VHDL In de declaratie van een architecture van een entity kan men het gedrag van de entiteit beschrijven. Parallellisme. De code-fragmenten die men op het bovenste syntactisch niveau plaatst in een architecture-declaratie worden geacht gelijktijdig uitgevoerd te worden. Voorbeelden van dergelijke fragmenten (samengestelde instructies) zijn o.m. processen, blokken, toewijzingen aan signalen en asserties. Binnen deze instructies kan men verdere verfijningen aanbrengen, ofwel opnieuw met gelijktijdige activiteiten (blokken of signaalassignaties binnen blokken), ofwel met sequentiële acties met gesimuleerde tijdsduur 0 (instructies binnen een proces). De keuze van de beschrijvingstechniek hangt zeer sterk af van het beschrijvingsniveau. Op systeemniveau gebruikt men het begrip proces. Een proces is in feite de uitvoering van een algoritme of procedure. Het is een lijst van instructies, die conceptueel na elkaar uitgevoerd zullen worden, maar waarvan de uitvoering geen gesimuleerde tijd vergt. Deze instructies gebeuren dus conceptueel op het zelfde ogenblik, maar in de neergeschreven volgorde (simulatietijd). De enige instructie die wel invloed kan hebben op het tijdsverloop in gesimuleerde tijd is de wait-instructie. Deze instructie schort de uitvoering van de erop volgende instructies op tot wanneer er aan een opgegeven voorwaarde voldaan is. Dergelijke voorwaarden kunnen zijn het verloop van een opgegeven tijdsduur (gesimuleerde tijd), het optreden van een gebeurtenis, of het waar worden van een opgegeven predikaat. Combinaties van deze voorwaarden zijn mogelijk (zie regel 55 van figuur A.7). Processen die naast elkaar in dezelfde architecture voorkomen worden parallel uitgevoerd, zoals de procesbeschrijvingen op regels 7, 24 en 49. De asserties op regels 31, 35, 38, 41 en 45 worden gelijktijdig met de processen uitgevoerd. de assertie op regel 56 daarentegen, wordt uitgevoerd na de wait-instructie. Processen kunnen in principe enkel communiceren via signalen, en niet via variabelen. 6 Variabelen mogen niet gemeenschappelijk gebruikt worden door meerdere processen. Processen kunnen een interne fijnstructuur hebben die sterke gelijkenis vertoont 6 Er werden inmiddels uitbreidingen gedefinieerd van VHDL waarin dit wel mogelijk is. 257

262 met programma s in gewone programmeertalen. Gestructureerde iteraties (de while-lus op regel 54), subroutines en functies behoren tot de mogelijkheden. Dit soort van gedragsbeschrijving maakt het mogelijk complexe functies te beschrijven door middel van algoritmen of procedures. Zoals reeds eerder gezegd is deze beschrijving niet declaratief, maar ze heeft het grote voordeel uitvoerbaar te zijn in een zeer vroeg stadium van de formalisering. Op logisch niveau worden vaak blokken en signaalassignaties gebruikt. Een blok is een groepering van instructies die zelf ook gelijktijdig uitgevoerd worden, maar die enkel geactiveerd worden wanneer aan een opgegeven voorwaarde voldaan is (dit is een soort van triggervoorwaarde). Deze voorwaarde noemt men een guard, en wordt vermeld bij de hoofding van het blok. Een typisch gebruik van blokken is bij de voorstelling van eindige automaten: met elke toestand van de automaat kan men een blok laten overeenstemmen waarvan de guard uitdrukt dat men in de toestand zit, en dat men dus de acties die horen bij deze toestand mag uitvoeren. Voor de voorstelling van het gedrag van combinatorische netwerken maakt men vaak gebruik van concurrente signaalassignaties. Bijvoorbeeld, de werking van een enkelvoudige EN-poort met inputs X en Y en output Z kan men beschrijven als signal X,Y,Z : std_logic; Z <= (X and Y) after 10 ns; terwijl men een netwerk van poorten kan beschrijven door de gelijktijdige uitvoering van een aantal dergelijke instructies, één per poort. Een dergelijke beschrijving noemt men een dataflowbeschrijving. Een gedeeltelijke dataflowbeschrijving vindt men in figuur A.8, regels Asserties. Asserties zijn instructies die testen of aan een bepaalde voorwaarde voldaan is, bijvoorbeeld of de timingvereisten van een gebruikte component niet overtreden worden. Wanneer dit wel gebeurt kan men tijdens de simulatie een foutbericht genereren, wat bijzonder handig is voor de validatie van een beschrijving. Figuur A.7 bevat diverse asserties die de timingvereisten van de teller voorstellen. Resolutiefuncties. Aan een signaal kunnen maar waarden geassigneerd worden door één proces of parallel statement. Dit is een uiting van het feit dat men in een circuit outputs van poorten zomaar niet kan verbinden met elkaar. Echter, de meeste digitale systemen gebruiken bussen, waarbij wel outputs gekoppeld worden. Om dit te modelleren definieert men speciale signaaltypes, waaraan een resolutiefunctie geassocieerd is, de z.g. resolved types. De resolutiefunctie heeft als rol de signaalwaarden die door de verschillende bronnen aan een signaal tegelijkertijd toegewezen worden met elkaar te combineren tot één waarde. Sommige combinaties zijn legaal, bv. deze die maar één component verschillend van Z bevatten; andere, die twee sterke verschillende waarden bevatten zoals een 0 en een 1, geven aanleiding tot fouten. Deze fouten kunnen gedetecteerd worden door de resolutiefunctie. Een model van de tijd. Het tijdsaspect van een VHDL-representatie is al herhaaldelijk aan bod gekomen. Gesimuleerde tijd wordt geassocieerd met wait-instructies en 258

263 signaalassignaties die een expliciete vertraging meegeven. Alle andere instructies kennen hoogstens een volgorde(in de simulatietijd) maar geen tijdsduur (in de gesimuleerde tijd). Signaalassignments zonder expliciete tijdsvermelding worden beschouwd als niet tijdsloos in de gesimuleerde tijd: er wordt aangenomen dat er een infinitesimale tijdsvertraging optreedt tussen het uitvoeren van de assignment en het beschikbaar komen van de nieuwe waarde. Het berekenen van de nieuwe waarde gebeurt tijdsloos; de geassigneerde waarde is echter niet beschikbaar op het ogenblik van uitvoering (gesimuleerde tijd). Functies en procedures in zoverre zij geen wait-instructies bevatten zijn tijdsloos. Meerdere assignaties kunnen in één proces uitgevoerd worden op eenzelfde signaal. Wanneer tussen twee opeenvolgende assignaties geen wait-instructie staat, dan gebeuren de assignaties op hetzelfde ogenblik in gesimuleerde tijd, maar in de opgegeven volgorde in simulatietijd. Dit wil zeggen: de rechterleden van de assignaties worden in de volgorde voorgeschreven door de tekst geëvalueerd. Het eindresultaat is dan afhankelijk van deze volgorde, en het type vertraging dat met de assignatie geassocieerd is. Bij de toewijzing aan signalen in VHDL kan men immers de twee modellen van tijdsvertraging gebruiken: inertiaal en transport. De inertiale mode is de verzuimwaarde (default value); wil met het transportmodel gebruiken moet men het sleutelwoord transport gebruiken. Opeenvolgende toewijzingen binnen één proces aan hetzelfde signaal hebben betrekking op dezelfde driver, en zullen elkaar dus beïnvloeden. Een toewijzing die een signaalverandering zal teweegbrengen, zal alle latere veranderingen die al met het signaal geassocieerd waren, wegvegen uit de driver. Evenzeer zal een verandering met een inertiaal delay alle voorgaande veranderingen filteren. Transities naar dezelfde waarde blijven behouden; wanneer in de driver al een transitie naar een andere waarde aanwezig is op een vroeger tijdstip (d.i. tussen het heden en na afloop van het opgegeven delay), dan moet deze transitie weggeveegd worden om te voldoen aan het inertiaalmodel (ga dit na). Deze interacties kunnen zeer subtiel zijn, en voor meer detail wordt verwezen naar [Lipsett89]. Structuurmodellen in VHDL Het resultaat van een synthese is een structuur die een samenstelling is van componenten met een meer primitief gedrag. Men kan deze structuur ook representeren in een architecture (figuren A.8 en A.9). Een dergelijke beschrijving bestaat uit de interfacedefinitie van de componenten die men als primitieven gebruikt (waarvan het gedrag elders ook in VHDL kan beschreven worden). Op regels 3 9 van figuur A.8 staat de definitie van de gebruikte flipflop. Dan worden een aantal interne signalen gedefinieerd (regels 11, 12) die zullen dienen om de geïnstantieerde componenten te verbinden. Tenslotte worden de instantiëringen zelf neergeschreven, waarbij men op de plaats van de componentpoorten nu de feitelijke verbindingssignalen invult (regels 21 24). De beschrijving in figuur A.8 is niet zuiver structureel: de verbindingspoorten (EN-poorten en invertoren) die de afzonderlijke flipflops van de teller verbinden worden door middel van parallelle signaalassignaties voorgesteld (dataflow-model). Een zuiver structurele definitie zou louter bestaan uit instantiëringen (figuur A.9). Repetitieve structuren kunnen elegant beschreven worden door iteratieve constructies zoals de generate-instructie (regel 22 in figuur A.8). Er zijn voorzieningen om structuur- of componentdefinities in zekere mate generiek te maken, door ze te laten afhangen 259

264 van parameters die pas ingevuld worden bij de instantiëring van een component. Zo is het bv. gemakkelijk een generiek register te definiëren, zonder op voorhand de lengte ervan op te geven. Een groot gedeelte van het gedrag van het register is immers onafhankelijk van de precieze lengte ervan. Dezelfde definitie kan dan gebruikt worden om verschillende instantiëringen met verschillende lengte te maken. A.2 Grafische beschrijvingsvormen In de ingenieurswereld worden van oudsher grafische representaties gebruikt voor het weergeven van de structuur of het gedrag van systemen. Denk maar aan constructietekeningen in de bouw of de werktuigkunde, aan diagrammen van regelsystemen, aan flowcharts van programma s, aan grafische voorstellingen van sommige berekeningen door dataflowgrafen, enz. Ook bij de representatie van (sommige aspecten van) digitale systemen maakt men dikwijls gebruik van grafische notaties. Hiervan zijn elektrische schema s, tijdsdiagrammen en toestandstransitiediagrammen courante voorbeelden. Initieel werden deze grafische voorstellingen vooral gebruikt als documentatiehulpmiddel, d.w.z. als drager van informatie voor de communicatie tussen mensen. Met de opkomst van computergesteunde tekenpakketten echter, is men de grafische representaties ook machineleesbaar gaan maken, waarbij men gedwongen werd een ondubbelzinnige interpretatie te hechten aan een tekening. Deze tekening kon dan ook fungeren als inputmedium voor de computer, voor verdere computergesteunde behandeling van de ingevoerde informatie. Wij zullen even onvolledig als bij de tekstuele vormen een korte beschrijving geven van enkele grafische representaties die werden of worden gebruikt bij het ontwerp van digitale systemen. Het eerste voorbeeld, PMS, is van historische betekenis 7 ; de twee andere voorbeelden zijn nog zeer actueel. A.2.1 PMS PMS, van Processor/Memory/Switch, is een grafische representatie uitgedacht voor de voorstelling van de structuur van computersystemen. Het niveau waarop dit gebeurde was het niveau van grote systeemonderdelen, zoals de CVE, het geheugen, de bussen, de controllers en randapparaten, enz. Dit niveau wordt conventioneel het PMS-niveau genoemd, en komt in de Gajski-terminologie overeen met het algoritmisch niveau en/of het systeemniveau. Een PMS-diagram geeft de topologie weer van de interconnectie van deze systeemonderdelen. Elk onderdeel heeft een rechthoekige vorm, en wordt geannoteerd met tekst. Gestandaardiseerde termen zijn: P een processor. De centrale verwerkingseenheid wordt Pc genoteerd; S een switch, een interconnectiestructuur zoals bv. een bus; K een controller, een adaptor voor een randapparaat; M een geheugen; T een transducer, een omzetter van informatie, bv. een drukker. 7 Een korte zoektocht op het Internet leert echter dat de term PMS nog vaak gebruikt wordt wanneer over computers of digitale systemen gesproken wordt, en dat sommige auteurs de notatie tot op vandaag gebruiken, zie bv

265 M.dcs[Diagnostic Control Store; 1Kw; 96 b/w] P.c 1 P.console 4 M.Cache[8 Kbyte] K S M[Floppy Disk] T[Console Teletype] K.Memory M[128 Kbyte; MOS; ECC] M 2 K.uba S.unibus K M.Disk K M.Tape 3 K T K.mba S.Massbus K M.Disk K M.Tape Notes 1. P.c[0-5 addresses/instruction; technology: TTL MSI; options: floating point accelerator] 2. K.uba['Unibus Adaptor; 1.5 Mbyte/s] 3. K.mba['Massbus Adaptor; 2.0 Mbyte/s] 4. P.console['LSI-11; technology NMOS LSI] Figuur A.12: Een voorbeeld van PMS: de structuur van de VAX-11/780 minicomputer Bij elk van deze notaties kan men een aantal attributen opgeven die de voornaamste kenmerken van het element kwantificeren. Zo geeft men bij geheugens bv. de afmetingen op en de technologie waaruit ze gemaakt zijn; bij bussen wordt bv. de bandbreedte aangegeven, enz. Als voorbeeld verwijzen wij naar figuur A.12, waar een sterk vereenvoudigd diagram van de VAX-11/780 minicomputer weergegeven wordt. Bemerk dat men uit deze figuur snel kan afleiden wat er aanwezig is in het systeem, en hoe de diverse onderdelen met elkaar gekoppeld zijn. Dit is o.a. nuttig voor het beschrijven van een configuratie, om hieruit een misschien ruwe idee te krijgen van de prestaties van de installatie. PMS-diagrammen geven echter maar een klein gedeelte van de totale informatie weer, en 261

266 aangezien zij niet machineverwerkbaar zijn is hun rol feitelijk beperkt tot documentatiehulpmiddel. In deze rol is de PMS-notatie intensief gebruikt geweest bij de vergelijkende studie van computersystemen ([Siewiorek82, Bell71]). A.2.2 Tijdsdiagrammen Tijdsdiagrammen zijn een grafische representatie van een gedragsaspect van digitale systemen op lagere niveaus zoals het logisch niveau en het RT-niveau. Tijdsdiagrammen worden gelijktijdig gebruikt voor twee doelen: 1. voor de weergave van de snelheid en het dynamisch gedrag van digitale circuits; 2. voor de weergave van de temporele vereisten waaraan de inputs van een circuit moeten voldoen opdat dit circuit zich zou gedragen volgens zijn logisch model. Beide aspecten worden door elkaar op dezelfde figuur en met gelijkaardige notationele technieken weergegeven. Dit betekent dat, naargelang het gaat over een input of over een output, een gegeven grafisch symbool een verschillende interpretatie kan hebben. Wij kunnen dit best illustreren aan de hand van een voorbeeld (figuur A.13). Men onderscheidt hier de volgende notaties: Eén lijn bovenaan, één lijn in het midden, één lijn onderaan. In dit geval gaat het om een signaal dat niet verandert op het aangegeven ogenblik, op resp. hoog niveau, met hoge impedantie (afgeschakeld of zwevend), op laag niveau. Voor een output is dit de situatie die gerealiseerd wordt door het circuit; voor een input is het de situatie die door de omgeving van het circuit moet gerealiseerd worden (een vereiste). Twee of meer lijnen boven elkaar. Dit denoteert weer een stabiele situatie, die echter niet nader bepaald is (alle getekende niveaus kunnen voorkomen). Het onderscheid tussen inputs en outputs is zoals hierboven. Een gearceerd gebied in opgaande richting, in neergaande richting of gekruist. Dit duidt op de aanwezigheid van overgangen op de manier gesuggereerd door de arcering. Voor een output betekent dit dat de output kan veranderen, voor een input dat hij mag veranderen. Wanneer de arcering vertrekt van een lijn in het midden gaat het over een overgang van of naar een afgeschakeld niveau. Voorts wordt een tijdsdiagram aangevuld met horizontale pijlen die karakteristieke tijdsduren aangeven. Deze intervallen hebben een naam, en worden vaak gekenmerkt door drie getallen: een minimumwaarde, een typische waarde en een maximumwaarde. Deze waarden worden meestal aangegeven in een tabel die de grafische representatie vergezelt. Ook worden er in een tijdsdiagram soms pijlen getekend tussen de diverse sporen. Deze pijlen geven causale verbanden aan tussen signaalovergangen. Veel simulatiepakketten voor digitale systemen, en ook sommige implementaties van VHDL, presenteren de resultaten onder een grafische vorm die veel gelijkenis vertoont met de hierboven beschreven notatie. Recentelijk zijn er ook softwarepakketten op de markt gebracht (bv. Chronology s Timing Designer) die het mogelijk maken de informatie vervat in een tijdsdiagram op systematische manier in te voeren, grafisch te representeren, en een aantal elementaire verificatiestappen erop uit te voeren. Gegevensbladen van componenten bevatten steevast een aantal tijdsdiagrammen die de werking van de 262

267 Figuur A.13: Een voorbeeld van een timingdiagram: specificatie van een geheugenchip component (gedeeltelijk) specificeren. Dergelijke diagrammen kunnen een groot aantal sporen bevatten, en daardoor zeer complex worden. A.2.3 Schema-editors Heel wat omgevingen voor digitaal ontwerp bevatten één of andere vorm van schemainvoer, die de ontwerper in staat stelt een aspect van het systeem dat hij aan het ontwerpen is, grafisch te beschrijven. Voorbeelden van dergelijke systemen zijn Pspice, OrCad, UltiCap, de schematic entry-vormen van programmeeromgevingen voor programmeerbare componenten, zoals XACT en ALTERA, of VLSI-omgevingen zoals Cadence, Mentor Graphics, enz. Andere systemen, zoals synthesepakketten die vertrekken van een tekstuele gedragsbeschrijving, genereren automatisch een grafische structurele representatie (bv. de synthese vanuit VHDL in de Mentor Graphics-omgeving of vanuit Synopsys). Schema s (logic diagrams) zijn in essentie representaties van de logische structuur van het systeem. Goede schema-editors worden gekenmerkt door een aantal eigenschappen, zoals De aanwezigheid van uitgebreide bibliotheken. Deze bibliotheken bevatten de primitieve componenten waaruit een te ontwerpen systeem kan samengesteld worden. De bibliotheek bevat minstens de grafische representatie van de component, met aanduiding van de verbindingspunten met hun eigenschappen (bv. input, output, bus,...). Wanneer deze beschrijving aangevuld wordt met een (onzichtbare) beschrijving van het gedrag van de component, kan men van correcte en zinvolle schema s het gedrag bepalen op basis van het gedrag van de primitieven en hun interconnectie. Dit maakt het mogelijk een simulator te schrijven, die dan kan gebruikt worden bij de validatie van het getekende schema. De aanwezigheid van een middel om hiërarchie uit te drukken. Hiermee bedoelen wij de mogelijkheid om in een schema bepaalde blokken aan te brengen zonder 263

268 interne fijnstructuur, maar die geen bibliotheekcomponenten zijn. Deze blokken zijn in feite aparte schema s, die gekoppeld worden met het topschema waar zij gebruikt worden. Het gebruik van hiërarchie stelt ons in staat heel complexe systemen grafisch te representeren op een zeer efficiënte, leesbare manier. Het maakt het ook mogelijk systemen te beschrijven op een brede waaier van hiërarchische niveaus, vanaf het logisch poortniveau tot het systeemniveau. De aanwezigheid van een verificatiehulpmiddel, dat minstens de syntactische correctheid van de tekening kan nagaan. Regels die kunnen nagegaan worden zijn o.a. de afwezigheid van kortsluitingen (verbindingen van outputs die niet mogen verbonden worden), fanout-overtredingen, en de verbinding van alle inputs. (Open gelaten inputs, zelfs indien logisch onschadelijk, kunnen bij sommige technologieën voor problemen zorgen in reële systemen.) Een goed uitgedachte gebruikersinterface, die het tekenen van schema s tot een valabel alternatief kan maken van tekstuele invoer. Typische eisen die men daar kan stellen zijn o.a. een goede roosterfunctionaliteit (grid snap), het meeslepen van verbindingen bij verplaatsingen (line drag), het automatisch schikken van de componenten op het blad (pretty printing), en hulp bij repetitieve operaties, zoals het nummeren van verbindingen aan bussen, het plaatsen van groepen van componenten, enz. Schema s zijn uitstekende representaties van de structuur van een systeem. Zij geven snel een inzicht in de interconnectie (en daardoor in de werking) van het systeem, althans voor een persoon die vertrouwd is met de gebruikte bouwstenen. Schema s van systemen die met discrete bouwblokken gemaakt worden zijn bovendien een gedeeltelijke representatie van de fysische structuur. Vaak zal men, nadat het circuit gerealiseerd werd, het schema annoteren met bijkomende informatie, zoals de effectieve allocatie van poorten aan chips, pinnummers van verbindingen, en de plaatsing van de chips op het bord volgens een coördinaatsysteem op het bord. Deze informatie is essentieel voor de persoon die testen of reparaties uitvoert op het systeem. Goedgetekende schema s zijn een vertrekpunt voor verdere automatische verwerking. Uit een schema wordt een net list geëxtraheerd. Een net is een lijst van punten die met elkaar verbonden moeten worden. Deze netlijst wordt dan gebruikt als invoer voor programma s gebruikt voor het ontwerp van de fysische structuur van het systeem (Floorplanners, Autorouters). A.3 Beschrijvingen van fysische structuur Ook voor het ontwerp van de fysische structuur van systemen bestaan er beschrijvingen en computergesteunde omgevingen die deze beschrijvingen kunnen verwerken. Het fysisch ontwerp van een systeem komt vaak neer op de plaatsing van primitieve bouwblokken in een vlak, en het ontwerpen van de interconnectie van deze blokken. Aangezien de netlijst meestal niet de representatie is van een planaire graaf, moet de interconnectie (bedrading) aangebracht worden in verschillende vlakken, waarbij banen in verschillende lagen op bepaalde punten moeten verbonden worden (via s) of elkaar moeten kruisen (cross-overs). Meestal is er een beperking op het aantal lagen, hetzij om technologische redenen (VLSI: men heeft maar een beperkt aantal poly- en metaallagen), of om rede- 264

269 nen van kostprijs (PC-borden met meer dan 6 lagen, voedingsdistributie inbegrepen, zijn duur). Bij het ontwerp van de fysische structuur moet aan een aantal regels voldaan worden die men de design rules noemt. Deze regels leggen vast hoever componenten of bedradingsonderdelen van elkaar moeten liggen, hoe bedrading moet gedimensioneerd worden, hoe via s er moeten uit zien, enz. Sommige geavanceerde pakketten bevatten hulpmiddelen die de ontwerper in staat stellen om verbindingen te maken die een welbepaalde kaakteristieke impedantie vertonen (transmissielijnen), of die uitspraken kunnen doen over de elektromagnetische straling die gegenereerd zal worden door de bedrading (EMC). Typische voorbeelden van softwarepaketten voor het fysisch ontwerp van digitale systemen zijn lay-outomgevingen zoals Ultiboard, Racal Redac, Mentor Graphics, Cadence, XACT, enz. Wanneer deze pakketten gevoed worden met een netlijst uit een ander pakket, moeten zij over bibliotheken beschikken die de fysische gedaante van de gebruikte bouwblokken bevatten (de shapes). De plaatsing van bouwblokken (floorplanning) gebeurt meestal nog semi-automatisch, het leggen van de interconnecties (routing) gebeurt overwegend automatisch; men noemt het dan autorouting. De output van lay-outgeneratoren is een beschrijving van de geometrie, bijvoorbeeld van de maskers voor het vervaardigen van de chip, of van de verschillende lagen en het boorpatroon van een PCB. Ook deze informatie kan onder de vorm van diverse echte of ad hoc standaarden gerepresenteerd worden. Voorbeelden van dergelijke formaten zijn GSDII, CIF (Caltech Intermediate Form), een formaat voor de representatie van maskers, Gerber Plot Format en DPF (Disc Plot Format), veelgebruikte formaten voor de beschrijving van PCB s. A.4 Het uitwisselingsformaat EDIF Fysische systeemaspecten worden vaak gerepresenteerd in het sinds 1985 gestandaardiseerde EDIF-formaat (Electronic Design Interchange Format), dat nu aan versie toe is. Dit ASCII-formaat, met een op LISP geïnspireerde syntaxis, kan in principe systemen representeren op een veelheid van manieren: louter netlijst, in schemavorm, in lay-outgedaante (zie verder), volgens gedrag, of zelfs nog op andere, niet vastgelegde manieren. EDIF wordt courant gebruikt als representatie van netlijsten, en als representatie van de output van programmeeromgevingen voor programmeerbare componenten. De uitbreidingen in versie maken ook de uitwisseling van de geometrische lay-outgegevens mogelijk. 265

270 Bijlage B Chipverpakkingen Deze appandix bevat, louter ter illustratie, enkele afbeeldingen van veelgebruikte chipverpakkingen. Er bestaan veel meer verpakkingen dan deze die getoond werden. Voor hun mechanische, thermische en elektrische eigenschappen moet men het WWW of de catalogi van de fabrikanten consulteren. De drie volgende figuren slaan op hermetische verpakkingen. Hermeticiteit is een belangrijke eigenschap, die verhindert dat gassen en dampen (o.m. waterdamp) in contact komen met de chip. Chips worden wel gepassiveerd, maar elke bijkomende barrière is welkom. Hermetische verpakkingen worden in keramische materialen gemaakt en in metaal, en daardoor kunnen zij hogere temperaturen aan dan de goedkopere plasticverpakkingen. 266

271 PLASTIC DUAL-IN-LINE PACKAGE DIM PINS ** A A MAX (19,69) (19,69) (23.37) (24,77) 16 9 A MIN (18,92) (18,92) (21.59) (23,88) (6,60) (6,10) (1,78) MAX (0,89) MAX (0,51) MIN (7,87) (7,37) (5,08) MAX (3,18) MIN Seating Plane (2,54) (0,53) (0,38) (0,25) M (0,25) NOM 14/18 PIN ONLY Figuur B.1: De afmetingen van de overbekende DIP-verpakking (afmetingen in mm tussen haakjes). Het gaat over eenn verpakking voor gatmontage (Eng. through-hole mount). Gegevens afkomstig van Texas Instruments 267

272 0,65 0,38 0,22 0,15 M PLASTIC SMALL-OUTLINE PACKAGE 5,60 5,00 8,20 7,40 0,15 NOM Gage Plane ,25 A 0 8 1,03 0,63 2,00 MAX 0,05 MIN Seating Plane 0,10 DIM PINS ** A MAX 3,30 6,50 6,50 7,50 8,50 10,50 10,50 12,90 A MIN 2,70 5,90 5,90 6,90 7,90 9,90 9,90 12,30 Figuur B.2: De afmetingen van een SSOP-verpakking (afmetingen in mm). Het gaat over eenn verpakking voor oppervlaktemontage (Eng. surface mount) met zg. meeuwenvleugelpootjes (Eng. gull wing leads). Gegevens afkomstig van Texas Instruments. 268

273 CeramicSidebrazedDual-In-line Package (SB) Through Hole Package Brazed Straight Leads to Pads on Package Side Gold Plate or Solder Dip Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with Cerdip and MDIP Ceramic Leadless Chip Carrier (LCC) Surface/Socket Mount Package Terminal Pads Instead of Leads Gold Plate or Solder Dip Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with CQJB and PLCC Ceramic Quad J-Bend (CQJB) Surface Mount Package J-Bend Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with LCC and PLCC Ceramic Quad Flatpack (CQFP) Surface Mount Package Straight Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Figuur B.3: Enkele hermetische verpakkingen van National Semiconductors 269

274 Ceramic Flatpack Surface Mount or Through Hole Package Straight Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with Cerpack Ceramic Dual-In-Line Package (Cerdip) Through Hole Package Straight Lead Configuration Solder Dip Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with SB and MDIP Ceramic Small Outline Package Surface Mount Package Gull Wing Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with Wide Body Plastic SOP Ceramic Pin Grid Array (CPGA) Through Hole Package Straight Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with PPGA Figuur B.4: Enkele hermetische verpakkingen van National Semiconductors (vervolg) 270

275 Cerpack Surface Mount or Through Hole Package Straight Lead Configuration Solder Dip Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with Flatpak Cerquad Surface Mount Package Straight Lead Configuration Solder DIP or Tin Plate Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with PQFP Can be Electrically and/or Thermally Enhanced Cerquad EIAJ Surface Mount Package Gull Wing Lead Configuration Solder DIP or Tin Plate Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with PQFP Can be Electrically and/or Thermally Enhanced Figuur B.5: Enkele hermetische verpakkingen van National Semiconductors (vervolg) 271

276 Bijlage C Enkele aanvullingen op circuitniveau: CMOS, flipflops en interconnectie In deze appendix gaan wij in op een aantal essentiële aspecten op circuitniveau, die de basis vormen voor de opbouw van hedendaagse digitale systemen. Deze materie staat enigszins aan de rand van deze cursus, en werd of wordt in andere vakken uit de opleiding elektrotechniek aangebracht. Voor studenten die geen opleiding elektrotechniek volgen of gevolgd hebben is dit nuttig naslagmateriaal. Wij beginnen met het in herinnering brengen van de werking van het basiselement voor digitale schakelingen: de veldeffecttransistor (FET: Field Effect Transistor). Wij zijn voornamelijk geïinteresseerd in het gedrag als schakelaar, en dit zowel statisch als dynamisch. Vervolgens bouwen wij de klassieke CMOS-poorten met behulp van FET s. In een volgende paragraaf analyseren wij kort een teruggekoppeld poortnetwerk op circuitniveau. Dit netwerk vormt immers de basis van flipflops, en men moet afdalen tot het circuitniveau om relevante aspecten van het gedrag, zoals schakelsnelheid en metastabiliteit bloot te leggen. Tenslotte bespreken wij enkele belangrijke aspecten van interconnectie in snelle digitale systemen. Bij hoge schakelsnelheden gedragen verbindingen zich steeds minder als signaaloverbrengers die zonder enige vertraging of vervorming een signaal van één plaats naar een andere overbrengen. C.1 Een korte herhaling: de veldeffecttransistor en CMOS C.1.1 De veldeffecttransistor De FET is een basiselement met drie aansluitpunten genoemd Source (S), Gate (G) en Drain (D); de betekenis van deze termen zal gaandeweg duidelijk worden. De gate is een controle-ingang. Door middel van de extern aangelegde spanning V GS tussen gate en source, kan men de stroom/spanningskarakteristiek tussen de aansluitingen drain/source beïnvloeden. 272

277 Deze karakteristiek is niet-lineair, en kan dus niet door één weerstandswaarde worden weergegeven. Toch kan men als eerste benadering zeggen dat de gemiddelde weerstand tussen drain en source kan veranderd worden tussen zeer hoog en zeer laag, door het kiezen van een geschikte V GS. De FET is op deze manier een (imperfecte) implementatie van een schakelaar. Hoe dit alles in zijn werk gaat zullen wij nu kort in herinnering brengen. Opbouw Een eenvoudige FET is opgebouwd volgens figuur C.1. In een p-gedoteerd monokristallijn halfgeleidersubstraat (silicium) worden twee sterk n-gedoteerde gebieden (source en drain) als evenwijdige parallellepipeda ingebracht met dezelfde kristalsttructuur als het substraat. De precieze techniek die men hiervoor gebruikt doet hier niet terzake, maar zorgt ervoor dat de parallellepipeda afgeronde hoeken en randen krijgen. Deze gebieden worden diffusies genoemd, naar één van de technieken waarmee men ze kan aanbrengen. Metalen (aluminium of koper) verbindingen met source en drain zorgen voor elektrische aansluiting. De strook p-materiaal die source en drain van elkaar scheidt noemt men het kanaal. Tijdens de werking wordt er steeds voor gezorgd dat de source en drain nooit negatievere spanningen aannemen dan het substraat. Dit betekent dat de p/n-juncties die gevormd worden tussen source en drain resp. substraat steeds invers gepolariseerd zijn, en dus isolerend. er vormt zich bijgevolg een isolerende sperlaag tussen de source- en draindiffusies en het substraat. De afstand tussen source en drain noemt men de kanaallengte L, en de afstand waarover ze evenwijdig lopen de kanaalbreedte W. Noteer dat kanalen, zoals weergegeven, typisch veel breder zijn dan lang. De kanaallengte is een technologische basisparameter die een sterke invloed heeft op diverse gedragseigenschappen van de FET (schakelsnelheid, dissipatie). Minimale kanaallengten zijn de voorbije jaren sterk afgenomen, van meerdere tientallen µm tot 0,13 µm nu; een verdere daling tot ca. 0,06 µm tegen 2007 wordt voorspeld door de ITRS Roadmap ([ITRS01]). Een dergelijke structuur heeft een zeer grote weerstand tussen S en D; de aandachtige lezer herkent trouwens dat wij hier twee in anti-serie geschakelde dioden gevormd hebben, waarvan er steeds minstens één in sperrichting staat. De geleidbaarheid van de structuur zou veel beter zijn mocht men als substraat n-gedoteerd materiaal gebruikt hebben i.p.v. p-materiaal. Er vormen zich dan geen echt sperrende diodejuncties meer met het substraat, en elektronen kunnen stromen van S naar D. Dit is het principe waarop de werking van de FET steunt: men zal tijdens de werking een dunne laag aan het oppervlak van het kanaal tijdelijk de eigenschappen geven van n-materiaal, en zo een veel beter geleidende brug tot stand brengen tussen S en D. Hoe gaat men te werk om dit te bereiken? De techniek die men hiervoor gebruikt is het zogenaamd veldeffect. Wanneer men namelijk loodrecht op het p-materiaal een elektrisch veld laat invallen (gericht naar binnen), dan zal in eerste instantie (wanneer niet al te sterk) dit veld de mobiele positief geladen gaten wegdrijven uit een dunne laag aan het oppervlak. In deze laag zijn er dan zeer weinig mobiele ladingsdragers, zowel elektronen als gaten. Het p-materiaal wordt daar effectief ongevormd tot (bijna) een isolator, en men noemt deze laag dan ook een sperlaag. Deze sperlaag sluit aan bij de sperlaag die aanwezig is rond de diffusies. Wanneer men echter de veldsterkte verder opdrijft, krijgt men in een nog dunnere laag aan het oppervlak een sterke aanrijking van mobiele elektronen. In deze dunne laag, 273

278 n+-diffusies voor source en drain kanaal L W p-substraat source- en draindiffusies in substraat (pijlen geven stroomrichting aan) gate-elektrode in poly-silicium, hangt afstand d boven siliciumoppervlak (isolator niet getekend) source gate source gate drain kanaal draindiffusie gateoxide (isolator) sourcediffusie drain Geheel met isolator en metaalverbindingen (isolator boven gate niet getekend) doorsnede; de isolator is het dunste onder de gate-elektrode (dikte d) Figuur C.1: De schematische opbouw van een n-fet. Typische waarden voor L in hedendaagse digitale schakelingen zijn L = µm; over het algemeen is W daar een veelvoud van. 274

279 de inversielaag, vertoont het materiaal de eigenschappen van een n-materiaal: veel mobiele elektronen, zeer weinig mobiele gaten. De inversielaag slaat een geleidende brug tussen source en drain, die ook rijk zijn aan mobiele elektronen. De dikte van de laag, en vooral de concentratie aan mobiele elektronen, bepaalt de weerstand ervan. Deze concentratie kan gecontroleerd worden door de sterkte van het invallend veld te wijzigen. Aangezien het geleidend kanaal gevormd wordt door elektronen, noemt men een dergelijke FET een n-kanaalsfet of kort een n-fet. Het elektrisch veld wordt gecreëerd door een zeer dunne laag (enkele nanometer tot enkele tientallen nanometer) isolator (meestal SiO 2 ) aan te brengen boven het kanaal en daarbovenop een elektrode, in de vorm van een laag sterk gedoteerd halfgeleidermateriaal (goed geleidend poly-kristallijn silicium). Deze poly-laag noemt men de gate, en de derde metalen aansluiting is hiermee verbonden. Door nu aan de gate-elektrode een positieve spanning V GS aan te leggen t.o.v. de source (en het substraat, wanneer wij dit laatste verbinden met de source), creëren wij een veld met sterkte V GS /d volt/m, wanneer d de dikte van de isolator voorstelt. Een spanning V GS = 1 V en een dikte d = 0,01 µm leiden aldus tot een veldsterkte van 10 8 V/m. Zoals al gezegd is een FET met geleidend kanaal volledig omhuld door een sperlaag, en is op deze manier in feite geïsoleerd van het p-substraat waarin hij is opgebouwd, en dus ook van de andere elementen die in hetzelfde substraat worden gemaakt. Elektrische karakteristiek De elektrische karakteristiek (gelijkstroomwerking) bestaat uit de stroom/spanningskarakteristiek tussen D en S als functie van V GS. Een sterk vereenvoudigde analyse, die buiten het raam van onze behandeling valt, van de FET leidt tot de volgende benaderde karakteristiek 1 I DS (V GS, V DS ) = 0, V GS < V t W ɛ µ 0 ɛ I n L d ((V GS V t )V DS 1 2 V DS 2 ), V GS > V t, V DS < V GS V t W ɛ µ 0 ɛ I n L 2d (V GS V t ) 2, elders. (C.1) Hierin stelt I DS de stroom voor die binnenkomt bij D en de FET verlaat bij S; V DS stelt de spanning voor die men aanlegt tussen D en S. De spanning V t is de z.g. drempelspanning, dit is de waarde van V GS waarbij de inversielaag zich begint te vormen, en er dus stroom kan beginnen vloeien. De grootheid µ n is de mobiliteit van de elektronen in de inversielaag (ongeveer 800 cm 2 /Vs), ɛ 0 en ɛ I zijn resp. de permittiviteit van het vacuüm ( F/m) en diëlektrische constante van de isolator (3.9). Figuur C.2 geeft deze relatie grafisch weer. Zoals eerder vermeld, is voor een gegeven V GS de stroom/spanningskarakteristiek geen rechte (die dan een constante weerstand zou voorstellen). Naarmate V DS vanaf 0 V toeneemt, ziet men de helling van de raaklijn aan de karakteristiek dalen. Het reciproque van deze helling stelt de incrementele weerstand van de FET voor (dit is de toename van V DS gedeeld door de toename van I DS ). Voor kleine waarden van V DS (0 < V DS < (V GS V t )/2) kan men de FET dus vervangen door een weerstand R DS0 = L W d µ n ɛ 0 ɛ I (V GS V t ) (C.2) 1 FET s met zeer korte kanalen hebben karakteristieken die hier redelijk sterk van afwijken; voor onze behandeling volstaan de eenvoudige modellen. 275

280 I DS (ma) 0.1 triodegebied pentodegebied V GS = 5 volt volt 3 volt 0 2 volt V DS (volt) Figuur C.2: De karakteristiek van een n-fet met een drempelspanning V t = 1 volt. Het gebied waar de karakteristieken een kleine, maar toenemende incrementele weerstand vertonen noemde men vaak het triodegebied, het gebied waar de drainstroom constant wordt het pentodegebied. Deze termen zijn historisch, en verwijzen nog naar de voorloper van de FET, de vacuümbuis. Deze gebieden worden steeds vaker het lineair en het saturatiegebied genoemd. die afhangt van V GS. Voor grotere waarden V DS > V GS V t wordt de stroom I DS onafhankelijk van V DS ; de FET kan dan aanzien worden als een stroombron I DS = µ n W L ɛ 0 ɛ I 2d (V GS V t ) 2 (C.3) (beter: een constante stroomafname) met een sterkte gecontroleerd door V GS. Wanneer n-fet stroom voert, is S de meest negatieve aansluiting, zijn V GS > 0 en V DS > 0, en de conventionele positieve stroom vloeit binnen langs D. N-FET s en p-fet s. De hele bovenstaande redenering kan herhaald worden vertrekkend van een n-gedoteerd substraat. Men brengt dan sterk p-gedoteerde S- en D-gebieden aan, en keert alle aangelegde spanningen van teken om. Men verkrijgt dan een p- FET. In geleidende toestand is S de meest positieve aansluiting, V GS < 0 en V DS < 0. De conventionele positieve stroom komt binnen langs S en verlaat de FET langs D. Technologisch kan men n-fet s en p-fet s samenbrengen op dezelfde chip (figuur C.5). In het basismateriaal van het substraat maakt men dan badkuipjes (Eng. tubs of wells) van p-materiaal waarin men n-fet s vervaardigt, en badkuipjes van n-materiaal waarin men de p-fet s maakt. Elektrisch zorgt men ervoor dat de p-badkuipen op de laagste spanning gehouden worden, en de n-kuipjes op de hoogste, dit om de onderlinge isolatie van de FET s te waarborgen. Deze opbouw vormt de basis van CMOS. Capaciteiten. De diverse onderdelen van een FET zijn capacitief gekoppeld met elkaar en met het substraat. Aangezien de source- en draindiffusies nooit negatief (n-fet) worden t.o.v. het substraat, zijn deze gebieden capacitief gekoppeld met het substraat via de 276

281 V dd C GD C DB G D G S G D S D S V ss C GS C SB n-fet p-fet Parasitaire capaciteiten in een FET Figuur C.3: Veelgebruikte symbolische voorstellingen voor FET s. De spanning V ss is de laagste spanning in het circuit en wordt aan het substraat aangelegd (de badkuip van de n-fet). De spanning V dd is de hoogste spanning, en wordt aan de badkuip van de p-fet gelegd. Het pijltje wijst conventioneel van een p-gebied naar een n-gebied. zogenaamde sperlaagcapaciteit. Wanneer een FET gebruikt wordt als schakelaar zal minstens de drain, maar soms ook de source (afhankelijk van de schakeling) van spanning veranderen t.o.v. het substraat, en zullen er ladingen moeten toe- of afgevoerd worden om de capaciteiten op te laden. Voorts vormt de gate bij constructie een condensator met het kanaal (zeker wanneer er zich een geleidende inversielaag heeft gevormd). De nominale waarde van deze capaciteit is ɛ 0 ɛ I W L/d. Het kanaal staat tijdens de werking echter niet op gelijke potentiaal: de kant aan de source staat op source-potentiaal, die aan de drain op drainpotentiaal, en de plaatselijke waarde verloopt continu tussen deze waarden. Daarom verdeelt men conventioneel het kanaal in twee delen, één dat eerder bij de source hoort, en één dat eerder bij de drain hoort. Aldus definieert men de capaciteiten C GS tussen gate en source (en het bijhorend deel van het kanaal), C GD tussen gate en drain (en het bijhorend deel van het kanaal), C SB tussen source (en het bijhorend deel van het kanaal) en substraat (Eng: bulk) en C DB tussen drain (en het bijhorend deel van het kanaal) en substraat. Deze capaciteitswaarden zijn niet constant, omdat sperlaagcapaciteiten spanningsafhankelijk zijn, en omdat de capaciteit van de gate met de andere onderdelen sterk afhankelijk is van de aanwezigheid van de inversielaag. Voor onze zeer oppervlakkige analyse zullen wij deze capactiteiten echter constant veronderstellen. Een belangrijke opmerking die hier reeds kan gemaakt worden is dat de capaciteit van de gate naar de andere onderdelen evenredig stijgt met de breedte W van de FET. De stroom/spanningkarakteristiek is echter ook lineair afhankelijk van dezelfde W (vgl. C.1). Dit heeft een belangrijke consequentie: wanneer men een FET wil maken die veel stroom kan voeren, zal men W groot maken. Maar dan maakt men automatisch de ingangscapaciteit C GS + C GD groot, wat betekent dat de schakeling die de FET aanstuurt een hogere capacitieve belasting zal moeten aandrijven. Figuur C.3 toont een van de mogelijke representaties van FET s in circuitdiagrammen; soms wordt bij een p-fet ook een invertorbolletje aangebracht aan de gate. De figuur rechts toont tussen welke klemmen de conventionele parasitaire capaciteiten zich voordoen. 277

282 Figuur C.4: Een poort gemaakt met behulp van schakelaars C.1.2 C.1.3 CMOS-poorten De invertor De principiële structuur van een CMOS-poort is weergegeven in figuur C.4. De poort bestaat uit twee schakelnetwerken gevormd door FETs, het netwerk N 1 dat de uitgang verbindt met de 0-spanning en het netwerk N 2 dat de uitgang verbindt met de voedingsspanning. De geleidingstoestand van beide netwerken wordt gecontroleerd door hetzelfde stel inputs. De essentie nu is dat N 1 geleidt a.s.a. N 2 niet geleidt. Wanneer precies één van beide netwerken geleidt, is de uitgangsspanning een goed gedefinieerde 0 volt (logische 0) of voedingsspanning (logische 1). Wanneer geen van beide geleidt, zweeft de uitgang, en wordt er geen interpreteerbaar signaal aangeboden. Wanneer tenslotte beide netwerken simultaan geleiden, vloeit er een potentieel grote stroom van de voedingsspanning naar de 0-referentie, die de schakeling kan doen oververhitten en stuk maken. Bovendien zal de uitgang een spanning aannemen die midden in het verboden gebied ligt, en dus geen interpreteerbare informatie voorstelt. Dit gewenste gedrag kan men realiseren door een geschikte keuze en interconnectie van de FETS in beide netwerken. Het meest eenvoudige netwerk is de invertor (figuur C.5), waarbij beide netwerken bestaan uit elk één transistor. Het netwerk N 1 wordt gevormd door een n-fet, N 2 door een p-fet. De drains van de p- en de n-fet worden met elkaar verbonden, evenals de gates. De source van de n-fet wordt aan de 0-spanning gelegd, de source van de p- FET aan de positieve voedingsspanning. In figuur C.5 hebben wij aan de n-fet een drempelspanning van 1 V gegeven, en aan de p-fet 1 V. Wij veronderstellen dat de W/L-verhouding van de p-fet ca. 3 maal groter is dan deze van de n-fet, omdat de p-fet minder goed geleidt als gevolg van de lagere mobiliteit van de gaten: µ p 0.3µ n. Statische karakteristiek. De analyse van de schakeling is eenvoudig. Wanneer wij de inputspanning vanaf 0 V laten oplopen zien wij dat initieel de n-fet afgeknepen is (beneden drempelspanning), en de p-fet in geleiding. De uitgangsspanning is hoog, en de p-fet bevindt zich in het triodegebied. Er vloeit geen stroom. Wanneer de inputspanning hoger wordt dan de drempelspanning van de n-fet, zal 278

283 5V oxide n-fet p-fet n+ n+ p+ p+ S G D D G S p-well n-well substraat (n of p) Vin S D D S p-fet W=30 m L=10 m n-fet W=10 m L=10 m 1 pf V out dwarsdoorsnede van twin-tub CMOS CMOS-invertor Id ( A) 30 Transferkarakteristiek en voedingsstroom Vout (V) 4.0 Schakelgedrag Vout (V) t (ns) V in (V) Figuur C.5: De structuur en werking van CMOS. Bovenaan een dwarsdoorsnede (vereenvoudigd) van een twintub-technologie, waar aparte badkuipjes worden aangebracht op een gemeenschappelijk substraat. Rechts de basis-invertor in CMOS. De condensator aan de uitgang stelt de capacitieve belasting voor van de bedrading en de poortingangen die deze invertor aanstuurt. Onderaan de ingangs/uitgangskarakteristiek en het stroomverbruik tijdens het omschakelen van de invertor. Het dynamisch schakelgedrag houdt rekening met de kleine capacitieve belasting. 279

284 ook de n-fet beginnen geleiden, initieel in het pentodegebied wegens de hoge spanning aan de uitgang. Eerst is de stroom klein, en de p-fet blijft in het triodegebied. Naarmate de ingangsspanning toeneemt, neemt de stroom door beide FETs toe, en komen beide in hun pentodegebied 2. De uitgangsspanning daalt dan bijzonder snel (afhankelijk van de helling van de karakteristiek in het pentodegebied). Wanneer de inputspanning hoger wordt daalt de stroom weer aangezien de p-fet dan in zijn pentodegebied werkt en zijn gate-spanning dichter en dichter komt bij zijn drempelspanning. Wanneer de inputspanning hoger wordt dan de voedingsspanning plus de (negatieve) drempelspanning van de p-fet, 4 V in het voorbeeld, zal deze laatste afknijpen, en de stroom en de uitgangsspanning vallen op 0. De transferkarakteristiek benadert de ideale curve, en de ruismarges van CMOS zijn dus groot. Noteer dat in beide grenstoestanden, de uitgangsspanning onafhankelijk is van de slankheidsverhouding W/L van de FETs, en dat er geen statische dissipatie is. Tijdens het omschakelen vloeit er gedurende een korte tijd een stroom door beide FETs. De energie die hierbij gedissipeerd wordt kan klein gehouden worden door de omschakeling snel te laten verlopen. Deze stroom stelt een dissipatie voor die per omschakeling optreedt, naast de dissipatie die het gevolg is van het op- en ontladen van de capaciteiten (de eigen ingang, de interconnectie en de ingangen van de aangestuurden poorten). Wij zullen hier nu een korte blik op werpen. Dynamische karakteristiek. Veronderstel een CMOS-invertor die met andere, identieke invertors geïntegreerd werd op dezelfde chip. Veronderstel dat de bestudeerde invertor mt zijn uitgangs een aantal invertors aanstuurt. Wat is dan de invloed van de belasting op de schakelsnelheid? Vooreerst identificeren wij de belasting: deze is louter capacitief, en bestaat uit de capaciteit van de metalen verbinding van de uitgang naar de aangestuurde ingangen t.o.v. het substraat, en de som van de ingangscapaciteiten van de aangestuurde invertors. Hierbij moet opgemerkt worden dat de in aanmerking te nemen ingangscapaciteit niet gewoon C GS + C GD is, maar eerder C GS + 2C GD. Men kan dit als volgt inzien: stel dat de ingang van de aangestuurde invertor op 0 V staat. Op de condensator C GS staat dan ook 0 V. De uitgang van de invertor staat echter hoog, op de voedingsspanning V CC. Deze spanning staat dan over C GD. Na de omschakeling zijn de rollen omgekeerd: over C GS staat nu V CC, terwijl over C GD nu V CC staat, omdat de uitgang op 0 V gekomen is. De totale lading die moest worden aangeleverd vanuit de aansturende invertor is bijgevolg V CC (C GS + 2C GD ), en de waargenomen capaciteitswaarde is C GS + 2C GD. De som van alle capaciteitswaarden, samen met de eigen C DB van de aansturende invertor vormt de capacitieve belasting. Hoe snel schakelt de uitgang nu van 1 naar 0 en omgekeerd? Wij gaan ervan uit dat op t = 0 de ingang van de aansturende FET zeer snel van 0 naar 1 gebracht wordt.de uitgang van deze FET (en dus alles wat hij aanstuurt) moet dan een transitie maken van 1 naar 0. Uitgaande van vergelijking C.1 kunnen wij deze transitie analytisch berekenen. Het ontlaadproces wordt beschreven door de differentiaalvergelijking dv out dt = I DS,n(V out ), (C.4) C 2 Op voorwaarde dat de voedingsspannning groter is dan de som van de absolute waarden van de drempelspanningen; anders komen beide FET s in hun triodegebied. 280

285 waarbij I DS,n (V out ) de stroom door de n-fet voorstelt als functie van de uitgangsspanning bij V GS,n = V CC. Het ontlaadproces begint met de n-fet in zijn pentodegebied. Wanneer de uitgangsspanning gedaald is tot V CC V t gaat de n-fet over naar het triodegebied. Gedurende heel het traject staat de p-fet afgeknepen en speelt dus geen actieve rol. De volledige oplaadcurve kan stuksgewijze analytisch bepaald worden. Deze eenvoudige oefening (bijvoorbeeld met Maple) wordt overgelaten aan de student. Wij kunnen om wat inzicht te verkrijgen het begin en het einde van de oplading rechtstreeks bepalen. Vlak na het op 1 komen van de ingang staat de uitgang nog op 1, maar staat de p-fet afgeknepen, terwijl zoals gezegd de n-fet in zijn pentodegebied werkt. De n-fet zal dan geleidelijk de totale belastingscapaciteit C ontladen. Eerst gebeurt dit met constante stroom (vgl. C.3), zolang de n-fet in zijn pentodegebied werkt. De uitgangsspanning daalt lineair in de tijd. Op het ogenblik dat de n-fet overgaat naar zijn triodegebied, wanneer de uitgangsspanning gedaald is tot V CC V t (4 V in het voorbeeld), gaat de ontlaadcurve geleidelijk over naar een exponentiële curve, omdat de p-fet zich steeds beter gaat gedragen als een weerstand (vgl. C.2). Het tijdstip waarop de overgang gebeurt is t = V C I = µ n W L 2CV t ɛ 0 ɛ I d (V (C.5) CC V t ) 2 (dit is ongeveer 13 ns in het voorbeeld van figuur C.5). De tijdconstante waarmee de eindwaarde benaderd wordt is τ = R DS0 C = L W p d C, (C.6) µ n ɛ 0 ɛ I (V CC V t ) ongeveer 26 ns in het voorbeeld. Men kan een relatief goede benadering verkrijgen door heel de curve te vervangen door een exponentiële die de ontlading over een constante weerstand voorstelt. Men kan relatief eenvoudig de weerstand uitrekenen die in dezelfde tijd als de FET de uitgangsspanning terugbrengt tot V t. Het resultaat is 2 3β ) α = R equiv = ( ln( β R DS0 ln β 2β ln β(1 β) ). Hierin is β = V t /V CC. Deze formule levert waarden op voor α tussen 1.3R DS0 en 2.2R DS0 voor 0.1V CC V t 0.4V CC. De tijd die het dan duurt om de spanning V t te bereiken wordt gegeven door t Vt = α ln βr DS0 C en varieert tussen 2R DS0 C en 5R DS0 C voor 0.1V CC V t 0.4V CC. Voor hogere waarden van V t relatief t.o.v. V CC neemt deze waarde toe, omdat de FET dan langer in zijn pentodegebied werkt en hierdoor zijn gemiddelde effectieve weerstand stijgt. Het oplaadgedrag (de transitie van 0 naar 1) is gelijkaardig aan het ontlaadgedrag, alleen moeten dan de data van de p-fet gebruikt worden. Men streeft ernaar om beide transities zou gelijk mogelijk te maken. Als effectieve schakeltijd neemt men het gemiddelde van beide waarden. C.1.4 Complexe poorten Bij de realisatie van complexere poorten wil men de gunstige eigenschappen van de invertor zoveel mogelijk bewaren. Deze eigenschappen zijn het gevolg van het feit dat de 281

286 5V Z p-netwerk X U Y f(x,y,z,u) = (Z + U(X+Y))' U n-netwerk X Y Z Figuur C.6: Een complexe CMOS-poort p- en de n-fet alleen samen geleiden gedurende een overgang, en daaarbuiten complementair in geleiding zijn. Wanneer wij, zoals bij n-mos, de n-fet vervangen door een netwerk (b.v. serie-parallel) van n-fets, moeten wij ook de p-fet vervangen door een netwerk van p-fets dat niet geleidt a.s.a. het n-netwerk geleidt. Men kan eenvoudig bewijzen (zie sectie 2.1.3) dat het hiervoor volstaat het p-netwerk precies de duale structuur te geven van het n-netwerk, en corresponderende FETs in beide netwerken aan te sturen met hetzelfde signaal. Dualiteit betekent: serieschakelingen worden parallelschakelingen, en vice versa (figuur C.6). Er bestaan een aantal technieken om de verdubbeling van het aantal FETs bij de realisatie van complexere functies tegen te gaan, in schakelingen die met een kloksignaal werken. Een particulier voorbeeld staat afgebeeld in figuur C.7. Tijdens de lage fase van de klok wordt de strooicondensator C onvoorwaardelijk opgeladen tot de voedingsspanning. Wanneer het kloksignaal hoog wordt, kan het n-netwerk deze condensator terug ontladen indien dit vereist wordt door de inputs. Wanneer men dergelijke poorten met elkaar verbindt, zullen tijdens de lage klokfase alle condensatoren opgeladen worden. Tijdens de berekeningsfase zullen de condensatoren voorwaardelijk ontladen worden, en deze ontlading loopt als een golf doorheen het circuit, van de eerste trap naar de laatste. Dit soort schakeling krijgt zijn naam door de gelijkenis hiervan met het omvallen van een rijtje domino s. C.1.5 Standaardcomponenten in CMOS Men kan CMOS-poorten maken die voorzien zijn van een voldoend krachtige buffertrap die geschikt is om relatief grote externe capacitieve belastingen aan te sturen. Hierdoor kan men CMOS gebruiken voor de vervaardiging van een familie standaardcomponenten. Men verkrijgt aldus een logische familie met een excellente ruismarge, snelheden die te vergelijken zijn met deze van TTL, en een statische dissipatie die bijzonder klein is. Het hoeft dan ook niet te verwonderen dat CMOS, naast een zeer verspreid gebruik als VLSI-technologie, ook gebruikt wordt om een uitgebreide lijn van standaard-bouw- 282

287 5V f(x,y,z,u) = Z + U(X+Y) U C klok X Y Z n-netwerk Figuur C.7: Het p-netwerk wordt vervangen door een condensator, die bij elke klokperiode opgeladen wordt, en daaarna selectief ontladen door het n-netwerk. Om de poort de mogelijkheid te geven een externe (capacitieve) belasting een te sturen, wordt er een conventionele CMOSinvertor als uitgangstrap aan toegevoegd. 5 V Input polyweerstand Figuur C.8: Beveiliging van inputs tegen elektrostatische ontlading blokken te realiseren die een grote gelijkenis vertonen met het assortiment van TTL-componenten, en die er zelfs compatibel mee zijn. Diverse varianten van de basis-cmos bestaan. Bijzonder aan CMOS-componenten is de zeer hoge ingangsimpedantie van de poort. Dit zorgt vaak voor problemen: elektrostatische spanningen, opgewekt door wrijving e.d.m. kunnen zeer hoge waarden aannemen. Hoewel de ladingen die hiermee overeenkomen klein zijn, zijn ze toch voldoend groot om te grote spanningen op de gate van een FET te brengen, als gevolg waarvan het gate-oxide doorslaat en meestal irreversibel beschadigd wordt. Dit noemt men beschadiging door ESD (ElectroStatic Discharge). Speciaal voor standaardcomponenten, die moeten gemanipuleerd worden bij de assemblage van de schakeling, zorgt dit voor problemen. Men zorgt er dan ook voor dat de inputs van een standaardcomponent beveiligd zijn tegen elektrostatische doorslag. Dit doet men bijvoorbeeld door, in serie met een input, een stroombegrenzende weerstand op te nemen, en twee dioden in sperrichting, resp. naar de massa en de voedingsspanning (fig. C.8). Deze schakeling verlaagt uiteraard de ingangsimpedantie, aangezien nu de lekstroom van de dioden zal vloeien, en de dioden uiteraard ook een eigen capaciteit vertonen. 283

288 Figuur C.9: Een elementaire bistabiele schakeling: (a) Twee in een kring geschakelde CMOSinvertors; (b) Transfercurven en evenwichtspunten. Punt B is labiel. C.2 Teruggekoppelde circuits en metastabiliteit Naast de poortcircuits, die via de digitale abstractiefunctie D een logische functie realiseren, bestaan er onnoemelijk veel circuits die dit niet doen. Niet elk van deze circuits is echter onnuttig bij de opbouw van digitale schakelingen, en er is zelfs een klasse van digitale circuits die bijzonder nuttig zijn, ondanks het feit dat zij geen functies realiseren in de strikte betekenis van het woord. Het gaat hier in het bijzonder om de bi-stabiele circuits die steunen op een interne, positieve terugkoppeling. Dergelijke bouwstenen vormen één van de manieren waarop men in digitale netwerken een vorm van geheugen kan realiseren. Deze circuits die wij gewoonlijk flipflops of geheugencellen genoemd hebben. Wij zijn reeds ingegaan op hun eigenschappen op logisch niveau. Maar zoals ook het geval is bij de eenvoudige poorten, steunen de logische eigenschappen van deze circuits duidelijk op hun elektrische eigenschappen op circuitniveau, en het is het doel van de volgende paragrafen om hier even op in te gaan. Wij zullen onze behandeling beperken tot een elementaire bi-stabiele schakeling uitgevoerd in CMOS, omdat wij hier een kans hebben om bepaalde aspecten nog min of meer op analytische (en dus inzichtelijke) manier te behandelen. Wij vertrekken van een analyse van de CMOS-invertor. Wij beschouwen twee in cascade geschakelde CMOS-invertors (figuur C.9(a)), en bepalen de transfercurve van de resulterende schakeling. Deze kan eenvoudig gevonden worden door de functie die de transfercurve van één invertor voorstelt samen te stellen met zichzelf (wij nemen immers aan dat de input van een CMOS-poort geen statische belasting betekent voor de output die haar aanstuurt, het is immers een condensator). Het resultaat is een curve die heel goed een stapfunctie benadert (fig. C.9(b)). Laat ons hier nu terugkoppeling in introduceren. Wij verbinden de output van de tweede invertor met de input van de eerste, en vragen ons af wat de spanningen zijn die zullen optreden in dit circuit. Grafisch kunnen wij dit doen, door de hoofddiagonaal V out = V in te tekenen in het diagram, en de snijpunten met de transfercurve op te zoeken. 284

289 In al deze snijpunten is uiteraard voldaan aan de voorwaarde dat de inputspanning gelijk moet zijn aan de outputspanning. Een oppervlakkig onderzoek leert echter snel dat het middelste snijpunt B een labiel evenwicht voorstelt: zolang er absoluut niets verandert aan om het even welke spanning in het circuit, blijft deze situatie inderdaad bewaard 3. Dit is echter geen reëel optredende fysische situatie: elke component produceert een zekere hoeveelheid ruis, en ook de bedrading wordt door de elektrische en magnetische velden in de omgeving beïnvloed. Elke afwijking van de evenwichtsspanning geeft aanleiding tot het terugkoppelen van een veel grotere afwijking in dezelfde zin. Het circuit loopt naar het dichtstbijzijnde stabiele evenwichtspunt, waar spontane afwijkingen onderdrukt worden. Het weglopen uit het labiel evenwichtspunt is een dynamisch proces, en de snelheid waarmee dit gebeurt is van zeer groot belang voor de snelheid van de geheugencellen die men ermee zal maken. Wij zullen nu een benaderde analyse doorvoeren van het overgangsverschijnsel. Om deze analyse te kunnen doen moeten wij uiteraard rekening houden met de parasitaire capaciteiten die in de FET s aanwezig zijn, en die bepalend zullen zijn voor de snelheid van de overgang. De capaciteiten die wij in rekening zullen brengen zijn C GS, C GD, en C DB. De capaciteit C SB tussen source en bulk treedt niet op omdat wij de source zullen geaard houden. De capaciteit C GB tussen gate en bulk is klein omdat gedurende het beschouwde deel van het overgangsverschijnsel alle FET s in hun pentode-gebied zullen opereren. Wij nemen aan dat de n- en de p-fet s identieke eigenschappen hebben, en dat alle capaciteiten constant zijn gedurende de overgang. Dit is uiteraard niet het geval, en de werkelijke spanningsverlopen zullen dus wat afwijken van onze analytische resultaten. Wij laten het circuit starten in het labiel evenwichtspunt, en gaan op zoek naar de differentiaalvergelijking die het systeem beschrijft in de onmiddellijke omgeving van dit punt. In dit punt zijn alle FET s geleidend, en werken bovendien bij V GS = V DS = V DD /2. Alle FET s werken dus in hun pentodegebied, en (de absolute waarde van) de drainstroom door de ideale FET in het vervangingsmodel wordt gegeven door I D = K(V GS V t ) 2 /2, met als beginwaarde I D0 = K(V DD /2 V t ) 2 /2. Laat ons, zoals voorheen, alle signalen refereren t.o.v. de onstabiele evenwichtswaarden, en deze afwijkingen voorstellen met een kleine letter: i D = I D I D0 = Kv GS (v GS + V DD 2V t )/2. Wij passen nu de knooppuntwet van Kirchoff toe op de ingangsknoop en op de uitgangsknoop, en behouden alleen de termen van de eerste orde. Wij vinden (som van ingaande stromen = 0): Knoop 1: 0 = v 2 (2C GS + 2C GD ) v 1 2C GD v 1 (2C DB + 2C GD ) + v 2 2C GD Kv 2 (V DD 2V t )/2 Knoop 1: 0 = v 1 (2C GS + 2C GD ) v 2 2C GD v 2 (2C DB + 2C GD ) + v 1 2C GD Herschreven wordt dit Kv 1 (V DD 2V t )/2 (C.7) (C.8) v 1 (4C GD + 2C DB ) + v 2 (2C GS + 4C GD ) = Kv 2 (V DD 2V t )/2 (C.9) v 1 (2C GS + 4C GD ) v 2 (4C GD + 2C DB ) = Kv 1 (V DD 2V t )/2 (C.10) 3 Zelfs realistische circuitsimulatoren zoals Spice geven dit resultaat: doe zelf eens de oefening door dit circuit in te voeren en te simuleren. Wanneer men de n- en p-fets identieke (symmetrische) eigenschappen geeft, zal het circuit zich inderdaad permanent ophouden op precies de helft van de voedingsspanning

290 Figuur C.10: (a) Het dynamisch overgangsverschijnsel in een elementaire flipflop. Als simulatiewaarden werden genomen V t = 1 V, L = 4 µm, W = 20 µm, C GS = 26, 4 ff, C GD = 8 ff, C DB = 55 ff, K = 75 µa/v 2 ; (b) De gebieden waarin de FET s in een bepaald werkingsgebied zitten: A=afgeknepen, T=triode, P=pentode; eerste letter = n-fet, tweede letter = p-fet. Dit is een stelsel van twee lineaire differentiaalvergelijkingen met constante coëfficiënten; de algemene oplossing ervan bestaat uit een lineaire combinatie van exponentiële functies (modes) met als tijdsconstanten: τ 1 = 2(C GS + C DB ) K(V DD 2V t ) τ 2 = 2(C GS + C DB + 4C GD ) K(V DD 2V t ) (C.11) (C.12) De eerste tijdsconstante is negatief, en komt dus overeen met een stabiele mode waarin v 1 = v 2. De tweede tijdsconstante is echter positief en komt overeen met de onstabiele mode v 1 = v 2. Deze mode domineert na zeer korte tijd, en doet de spanning V 1 op knoop 1 exponentieel snel weglopen van haar beginwaarde V DD /2. Uiteraard loopt V 1 niet naar oneindig; snel wordt de waarde bereikt waar in een trap ofwel de p-fet ofwel de n-fet in zijn triodegebied komt (vanaf 3 V voor de stijgende kant) en de andere FET afknijpt (vanaf 4 V voor de stijgende kant). Het circuit verandert daardoor in een RC-netwerk. Dit verandert de differentiaalvergelijking, die twee stabiele modes krijgt rond V 1 = 0 resp. V DD op knoop 1. Figuur C.10(a) toont de resultaten van een simulatie in Spice. Wat hier weergegeven wordt zijn de spanningen op de knopen 1 en 2, eens met een relatief grote initiële storing rond t = 4 ns, en eens met een heel kleine initiële storing. De respons op de grotere storing komt eerder dan deze op de kleinere. Men ziet duidelijk dat het antwoord uit twee delen bestaat: een exponentieel stijgend deel (positieve tijdsconstante) van ongeveer 1,07 ns, dat overgaat in een exponentieel dalend deel (negatieve tijdsconstante) naar het stabiele evenwichtspunt. Figuur C.10(b) toont de werkingsgebieden waarin de n- resp. de p-fet van een invertortrap verkeren als functies van de spanningen die aan deze trap liggen. De gevolgde trajectorie ligt volgens de dalende diagonaal (v 1 = v 2 ). Rond de stabiele evenwichtspunten is steeds één van de FET s afgeknepen, en de andere bevindt zich in zijn triodegebied. Merkwaardig maar niet verwonderlijk is het feit dat de respons op een kleine initiële 286

291 Figuur C.11: Het schema van de zestransistorcel gebruikt in statische RAMs. Transistors T 1 en T 2 zijn breder dan de transistors in de invertors (bijvoorbeeld 100 µm i.p.v. de 20 µm die wij in ons voorgaand voorbeeld gebruikt hebben. Gewoonlijk verbindt men S 1 en S 2 tot een rijselectiesignaal. verstoring zeer goed lijkt op deze van een grotere storing, maar enkel verschoven lijkt in de tijd. Dit is natuurlijk te wijten aan de initieel exponentiële aard van de curve: een amplitudevergroting komt neer op een tijdverschuiving. In theorie leiden onbeperkt kleine initiële verstoringen naar onbeperkt grote vertragingen. De beschouwde cel is het basiselement van heel wat flipflops en statische geheugencellen. Figuur C.11 toont de zestransistorcel die veel gebruikt wordt voor de realisatie van statische RAM s. Men herkent uiteraard de teruggekoppelde CMOS-invertors. Om de inhoud van de cel te kunnen wijzigen en observeren heeft men twee bijkomende passtransistors T 1 en T 2 aangebracht. Deze transistors gaan in geleiding wanneer op hun gates S 1 resp. S 2 een hoge spanning ( bijvoorbeeld V DD = 5 V) wordt aangebracht. Afhankelijk van wat men opdringt op de twee verticale bitlijnen zal men de cel lezen of schrijven. Ingeval men de bitlijnen eerst op een gelijke initiële spanning brengt, bijvoorbeeld V DD /2 (de z.g. precharge) en dan laat vlotten, dan zullen zij na verloop van tijd complementaire spanningen aannemen, gelijk aan de spanningen op de knopen 1 en 2: men leest de inhoud van de cel. Ingeval men echter op voorhand complementaire spanningen opdringt, en de bitlijnen via spanningbronnen met voldoend lage uitgangsimpedantie op deze spanningen houdt, dan zal men deze spanningen opdringen op de knopen 1 en 2, tenminste wanneer de transistors T 1 en T 2 sterker (breder) gemaakt worden dan de transistors in de invertors. De cel wordt dan geschreven. Men kan ook asymmetrisch werken, door bijvoorbeeld enkel van één kant een 0 op te dringen. Dit werd geïllustreerd in figuur C.12. Op t = 25 ns wordt een kort puls van 5 V, met een stijg- en daaltijd van 1 ns en een duur van 2 ns aangelegd op S 1. Zeer snel wordt V 1 laag gebracht door T 1, als gevolg V 2 gaat hoog, en de terugkoppeling zorgt ervoor dat V 1 laag blijft. In ca. 4 ns is het hele overgangsverschijnsel afgelopen. De labiele of metastabiele aard van het evenwichtspunt halverwege V DD kan zich ook hier manifesteren. Wanneer men de cel zeer dicht bij het labiel evenwichtspunt brengt, kan het in principe onbeperkt lang duren alvorens de eindtoestand bereikt wordt. Figuur C.12 toont hiervan een voorbeeld. Op t = 50 ns leggen wij op S 2 een zeer kort puls aan 287

292 Figuur C.12: Metastabiel gedrag van een eenvoudige statische RAM-cel bij onvoldoende aansturing dat bovendien maar een amplitude heeft van ca. 3,9 V. Dit puls brengt V 2 laag en V 1 wat hoger, zodanig dat V 1 V 2 na afloop van het puls. Het netwerk zal dan spontaan naar een stabiel evenwicht evolueren. Eerst ziet men V 1 en V 2 samen evolueren tot aan het metastabiel evenwichtspunt (volgens de stabiele mode van het systeem); de onstabiele mode manifesteert zich later, doordat V 1 en V 2 exponentieel snel van elkaar beginnen weg te evolueren. Het uitstel van deze evolutie hangt van de grootte van de initiële onbalans, en kan in theorie onbeperkt groot worden. Op de figuur is het al duidelijk dat de cel nu meer dan 10 ns nodig heeft om haar eindtoestand te bereiken. Dit is het van metastabiliteit dat wij in deze cursus al besproken hebben. C.3 Interconnecties en bussen Op logisch niveau hebben verbindingen tussen componenten en schakelingen als rol ervoor te zorgen dat een signaal op één plaats gelijk wordt aan een signaal op een andere plaats. In de fysische werkelijkheid wegen er duidelijk een aantal beperkingen op deze functie, aangezien de logische interconnectiefunctie gerealiseerd wordt door elektronische overdracht van signalen. Hiervoor geldt om te beginnen de beperking van de lichtsnelheid: een signaalverandering kan niet zonder vertraging overgebracht worden naar een andere plaats. Er is echter veel meer aan de hand op elektrisch circuitniveau. In reële elektrische interconnecties is het signaal aan het uiteinde van een verbinding immers nooit een precieze, vertraagde replica is van het signaal dat aan het andere uiteinde van de verbinding aangelegd werd. In tegendeel, de elektrische interconnectie zelf is een dynamisch elektrisch systeem dat een eigen ingangs/uitgangsgedrag vertoont, en waarvan de eigenschappen terdege in rekening dienen gebracht bij het ontwerp van digitale schakelingen. In de volgende paragrafen gaan wij daarom kort in op de belangrijkste eigenschappen van elektrische verbindingen zoals zij gebruikt worden in digitale circuits: verbindingen tussen circuits op hetzelfde chipoppervlak, verbindingen tussen chips op dezelfde drager (PCB, Printed Circuit Board, of multi-chipmodule) en verbindingen tussen systemen in aparte behuizingen. Voorts zullen wij ook het onderscheid maken tussen verbindingen tussen twee punten, en verbindingen waar meer dan twee aansturende componenten op 288

293 aangesloten zijn, de bussen. C.3.1 Punt-tot-puntverbindingen Resistieve versus verliesloze transmissielijnen Punt-tot-puntverbindingen zijn verbindingen tussen twee circuits, waarvan er een de elektrische grootheden opdringt aan de interconnectiegeleider, en het ander de elektrische grootheden die zich manifesteren aan het andere uiteinde van de geleider als input nemen. In strikte zin bestaat de interconnectie uit de eigenlijke geleider (een draad, een metaallaag of een laag hooggedopeerd polykristallijn silicium) en uit de omgeving van deze geleider, die bestaat uit andere geleiders en diëlektrica. De andere geleiders kunnen andere interconnectieverbindingen zijn, maar ook (en vaak) volledig geleidende vlakken op een PCB, multichipmodule of chip: de aard- en voedingsvlakken van een PCB of de bulk van de plak. In een draadverbinding tussen elektrische systemen is de andere geleider meestal de afscherming (co-axiale kabel) of een draad die samen met de signaaldraad getwijnd wordt tot een paartje (bijvoorbeeld in UTP, Unshielded Twisted Pair). Dit heeft als gevolg dat om het gedrag van de verbinding elektrisch correct te modelleren, men de aanwezigheid van deze geleiders, en hun de elektrische koppeling met de signaalgeleider in rekening moet brengen; het geëigende model hiervoor is natuurlijk de transmissielijn. De eigenschappen van de transmissielijn worden bepaald door de geometrie van de betrokken geleiders, hun materiële eigenschappen, en de eigenschappen van het diëlectricum waardoor zij gescheiden worden. Geen van deze materialen is ideaal: de geleiders hebben weerstand, en de diëlektrica hebben een eindige lekweerstand en diëlektrische verliezen bij hogere frequenties. Dit heeft als gevolg dat het transmissielijnmodel dat men zal hanteren in principe dat van een verlieshebbende transmissielijn moet zijn. Het algemeen model van een verlieshebbende transmissielijn met (constante) langsweerstand r, zelfinductie l, capaciteit c en dwarsconductantie g per lengte-eenheid in het Laplacedomein wordt gegeven door V (x, s) = A(s)e γ(s)x + B(s)e +γ(s)x (C.13) I(x, s) = A(s) Z 0 (s) e γ(s)x B(s) Z 0 (s) e+γ(s)x, (C.14) waarin γ(s) = (r + sl)(g + sc) de propagatiefunctie is van de lijn, en de grootheid Z 0 (s) = (r + sl)/(g + sc) de karakteristieke impedantie. Het behandelen van deze vergelijkingen in hun algemeenheid is complex, en voor concrete toepassingen van de theorie op de gevallen die ons hier interesseren kunnen wij overgaan op eenvoudiger, speciale gevallen. Om te beginnen is er de belangrijke parameter van de totale lengte van de verbinding in verhouding tot het spectrum van de signalen die wij in beschouwing nemen. Het criterium dat wij daarvoor hanteren is de maximale waarde aangenomen door de grootheid γ(s)l, met L de lengte van de lijn, voor waarden van s waar er nog voldoende signaalamplitude aanwezig is. De spectrale breedte van digitale signalen hangt zeer sterk af van de stijg- en daaltijden. Een gekende vuistregel is dat de 3-dB bandbreedte B en de stijgtijd t r van systemen met een dominant eerste-ordegedrag gegeven wordt door t r B = 0,

294 Figuur C.13: Spectrum van een symmetrische golf met periode 22 ns en stijg- en daaltijden van 1 ns. De amplitude was 1 V Moderne discrete logische families halen stijgtijden van de orde 0,3 tot 5 ns, wat overeenkomt met bandbreedten van 64 MHz tot 1,1 GHz. In figuur C.13 werd dit geïllustreerd met het spectrum van een blokgolf met een periode van 22 ns, en stijg- en daaltijden van 1 ns. Met ziet de initiële 1/f-afval van 20 db/decade in de oneven harmonischen, die overgaat in een 40 db/decade voorbij 320 MHz, zoals bepaald door de flanksteilheid. Wanneer γ(s)x (veel) kleiner is dan 1, kan men e γ(s)x goed benaderen door 1, of beter door 1 + γ(s)x, en men benadert de transmissielijn als een circuit met gelokaliseerde parameters, zoals de totale weerstand R = rl, haar totale capaciteit C = cl, enzovoort. Een tweede belangrijke vereenvoudiging volgt uit de vaststelling dat men in de praktijk hoofdzakelijk twee soorten transmissielijnen tegenkomt als model voor interconnecties: dat van vrijwel verliesloze lijnen (lijnen met zeer kleine r en g relatief tot ωl resp. ωc in de interessante frequentieband), en dat van lijnen met hoge langsweerstand maar kleine zelfinductie (r >> ωl). Het eerste type lijn komt men hoofdzakelijk tegen in bedrading op PCB s en in afzonderlijke kabels (bijvoorbeeld netwerkbedrading of interconnectiekabels van computer-randapparaten); uiteraard bedoelen wij hier niet de werking bij zeer lage frequenties of in gelijkstroomvoorwaarden, aangezien dan de resistieve component in de langsimpedantie domineert, en aan onze veronderstellingen niet is voldaan. Het tweede type vindt men in de verbindingen op het oppervlak van chips in de moderne submicrontechnologieën of in geavanceerde multi-chipmodules. Als gevolg van de zeer kleine dwarsdoorsneden van de geleiders wordt de resistiviteit van de gebruikte materialen wel zeer belangrijk. Bovendien worden de zelfinductiecomponent relatief klein en de dwarscapaciteit groot. Korte lijnen versus lange, en verliesloze versus verlieshebbende Laat ons eerst even onderzoeken wat de benadering voor korte lijnen inhoudt. Beschouw de schakeling in figuur C.14. Veronderstel voor de eenvoud de lijn verliesloos. Wij veronderstellen dat de belasting aan het uiteinde puur resistief is, en dat de lijn niet afgesloten 290

295 Figuur C.14: Reflecties aan een niet-afgesloten bijna verliesloze lijn met een lengte van 1 m. Bovenste grafiek: repons van de lijn, en van het benaderend LRC π-netwerk. Onderste figuur: benadering van het macroscopisch gedrag door enkel de dwarscapaciteit. De parameters van de lijn zijn: r =1 mω/m, l = 250 nh/m, c =0,1 nf/m en g = 10 6 Siemens/m. Hieruit volgt een karakteristieke impedantie van 50 Ω en een golfsnelheid van 0,2 m/ns is op haar karakteristieke impedantie, maar op een veel hogere waarde. Wij sturen de lijn ook aan vanuit relatief grote impedantie (2 Z 0 ). Wij leggen een puls aan met grote flanksteilheid: 1 ns stijgtijd, terwijl de lijn een doorlooptijd heeft van ca. 5 ns (de lijn is 1 m lang). Het antwoord van het systeem bestaat duidelijk uit een superpositie van golven, en de spanning aan het uiteinde gaat stapsgewijs naar haar eindwaarde. De verhouding van de stapgrootte van de opeenvolgende stappen wordt bepaald door de reflectiecoëfficiënten aan beide uiteinden. Een merkwaardige vaststelling is de volgende. Wanneer wij de lijn vervangen door een π-netwerk met de totale zelfinductie als langsimpedantie, en de helft haar totale capaciteit als dwarsimpedanties, dan verkrijgen wij een oscillatorisch overgangsverschijnsel, waarvan de periode nauw verwant is met de looptijd doorheen de lijn. Wanneer wij nog verder vereenvoudigen, en enkel de dwarscapaciteit overhouden als vervanging van de transmissielijn, dan krijgen wij een zuiver RC-gedrag dat ruwweg overeenkomt met het gedrag van de werkelijke lijn, maar gefilterd door een laagdoorlaatfilter. Het macroscopisch gedrag van de lijn het opladen van de geleider tot de eindspanning over de parallelschakeling van bron- en belastingsimpedanties wordt microscopisch gerealiseerd door 291

296 Figuur C.15: Reflecties aan een niet-afgesloten bijna verliesloze lijn met een lengte van 0.1 m Repons van de lijn, en van het benaderend RC π-netwerk. De parameters van de lijn zijn: r =1 mω/m, l = 250 nh/m, c =0,1 nf/m en g = 10 6 Siemens/m. Hieruit volgt een karakteristieke impedantie van 50 Ω en een golfsnelheid van 0,2 m/ns. heen- en weerlopende golven van afnemende amplitude die de spanning op de lijn iteratief naar haar eindwaarde brengen. Deze uitspraak kan bevestigd worden door een analytische benadering van de vergelijkingen; wij laten dit over aan de lezer. Dit betekent dat in veel gevallen waar de bandbreedte van de circuits of signalen die gebruik maken van de lijn, niet hoog is, de vervanging van een niet-getermineerde lijn door haar totale capaciteit een aanvaardbare eerste benadering kan zijn. De karakteristieke duur van het overgangsverschijnsel wordt niet bepaald door de looptijd door de lijn, maar wel door de tijd die men nodig heeft om de totale lijncapaciteit op te laden over de aanwezige bron- en belastingsimpedanties. Deze benadering wordt des te beter naarmate de lijn korter wordt. Wanneer wij als tweede voorbeeld een lijn van 10 cm lang nemen (doorlooptijd 0,5 ns), en die ook aansturen met een flank met stijgtijd 1 ns, dan verkrijgen wij figuur C.15. Het vervangen van de lijn door enkel haar totale capaciteit geeft nu excellente resultaten. Beschouwen wij nu als derde voorbeeld een sterk verlieshebbende lijn, met langsweerstand r en dwarscapaciteit c. Wij veronderstellen dat de bronimpedantie 0 is, en de belastingsimpedantie. De reflectiecoëfficiënten zijn dan 1 resp. 1, en na enkele eenvoudige berekeningen volgt de uitdrukking voor de Laplace-getransformeerde van de spanning op de lijn, wanneer wij een stap met amplitude V aanleggen op t = 0: V (x, s) = V s e srcx + e src(2l x) 1 + e src2l = V s cosh( src(l x)) cosh(. srcl) Men kan deze uitdrukking iverteren naar het ijdsdomein. Figuur C.16(a) toont de resultaten van de inversie. De tijdsas werd genormaliseerd op τ = L 2 rc, de tijdsconstante die men zou krijgen door de totale lijncapaciteit op te laden over de totale lijnweerstand. Belangrijk om op te merken is dat de curven nergens echte exponentiëlen zijn, en dat de spanning aan het open uiteinde 90 % van de eindwaarde bereikt na ongeveer τ seconden. Noteer dat deze tijdsconstante echter kwadratisch afhangt van de lengte van de lijn! In tegenstelling tot een verliesloze transmissielijn, waar men mits correcte afsluiting vertragingstijden kan verkrijgen die proportioneel zijn met de lijnlengte, zijn deze voor verlieshebbende lijnen 292

297 Figuur C.16: Het gedrag van een zuivere RC-lijn aangestuurd met een spanningsbron, en open aan het andere uiteinde; (a) de respons op diverse plaatsen in de lijn. De karakteristieke tijd is τ = L 2 rc; (b)de tijd die nodig is om 90 % van de eindwaarde te bereiken, en de vergelijking met een oneindig lange RC-lijn met dezelfde parameters. Het feit dat de lijn aan het uiteinde open is, maakt haar veel sneller dan hetzelfde stuk uit een oneindig lange lijn. kwadratisch in de lengte. De lijn wordt goed benaderd door een R/C π-netwerk, met als langsweerstand de totale lijnweerstand, en als dwarscapaciteiten de helft van de totale lijncapaciteit. Figuur C.16(b) toont de tijdstippen waarop 90 % van de eindwaarde bereikt wordt op diverse plaatsen in de lijn van lengte L, alsook in een oneindig lange lijn met dezelfde r- en c-waarden. In beide gevallen werden de afstanden genormaliseerd op L, en de tijden op τ. Men ziet dat, naarmate men verder gaat in de oneindige lijn, het heel lang begint te duren alvorens de 90 %-grens bereikt wordt, en dat de stijging van deze tijdsduur ook sneller is dan lineair. Getermineerde versus niet-getermineerde lijnen Verliesloze transmissielijnen hebben een reële karakteristieke impedantie, en door een geschikte keuze van de bron- en belastingsimpedanties kan men de reflectiecoëfficiënten aan één of beide zijden 0 maken. Dit noemt men het termineren of afsluiten van de lijn. Een terminatie zorgt ervoor dat de aankomende golf niet weerkaatst wordt, en dat dus het overgangsverschijnsel dat incrementeel de spanning op de lijn opbouwt, sterk kan ingekort worden, en zelfs kan beperkt worden tot de looptijd doorheen de lijn. Bovendien kan de aanwezigheid van reflecties ingeval van niet-terminatie soms leiden tot onverwachte problemen. Wanneer men de lijn aanstuurt met signalen waarvan de periode een veelvoud is van de looptijd doorheen de lijn, dan kunnen resonanties optreden, zodanig dat spanningen kunnen ontstaan die helemaal niet overeenkomen met de gewenste logische spanningswaarden. Een tweede probleem kan zich stellen met logische circuits: wanneer een flipflop rechtstreeks een lijn aandrijft die een sterke reflectie vertoont, kan deze reflectie in sommige gevallen de flipflop ongewenst doen omkippen. En reflecties zelf kunnen in sommige gevallen zo groot zijn dat zij aanleiding geven tot spanningen in het verboden gebied, en eventueel ook aanleiding geven tot verkeerde interpretatie. Al deze redenen wijzen erop dat lange lijnen, waar de reflecties belangrijk kunnen zijn, dienen getermineerd te worden voor een betrouwbare werking. 293

298 Bij punt-tot-puntverbindingen kan men op twee manieren een lijn termineren: door parallelterminatie en door serieterminatie. Bij parallelterminatie sluit men de lijn aan het ontvangende uiteinde af op een resistief netwerk, bijvoorbeeld een spanningsdeler, die aan twee voorwaarden moet voldoen: de impedantie van parallelschakeling van de twee takken moet gelijk zijn aan de karakteristieke impedantie van de lijn (wij veronderstellen dat de ingangsimpedantie van het circuit dat aangesloten is aan de lijn groot is t.o.v. Z 0 ); de openklemspanning van de spanningsdeler moet zo zijn dat de ruismarges van de gebruikte componenten optimaal benut worden, en dat bovendien de dissipatie in de afsluitweerstanden zo klein mogelijk is. Bij een parallelterminatie bestaat het hele overgangsverschijnsel uit één enkele looptijd doorheen de lijn. Dit is dus een methode om snelle circuits te maken. Het probleem is natuurlijk de dissipatie: de impedantie van de gebruikte transmissielijnen is zelden groter dan 200 Ω, en dikwijls maar 50 Ω. Wanneer de spanningszwaai van de logische signalen dan 5 Volt zou bedragen, en de openklemspanning van de terminatieschakeling is 2,5 Volt, dan bestaat de spanningdeler bijvoorbeeld uit twee weerstanden van 100 Ω, of uit één weerstand van 50 Ω naar 2,5 Volt. De gemiddelde dissipatie in de weerstanden is in het eerste geval V 2 /R = 25/0,1 = 250 mw, omdat steeds over één van de weerstanden de volle 5 Volt staat. In tweede geval staat over de weerstand steeds 2,5 Volt, en is de dissipatie (2, 50) 2 /50 = 125 mw, maar men heeft een extra voedingsspanning nodig. Andere technieken maken gebruik van een serieschakeling van een terminatieweerstand en een voldoend grote condensator als terminatiecircuit, maar hier moet men opletten dat de mogelijk variabele gelijkstroomcomponent van de signalen niet gaat zorgen voor problemen. De vermelde dissipaties zijn zeer grote waarden vergeleken met de eigendissipatie van de poorten zelf. Bij deze dissipatie moet bovendien nog de dynamische component bijgeteld worden die nodig is om de lijn repetitief op te laden en te ontladen. De statische dissipatie kan sterk gereduceerd worden door gebruik te maken van serieterminatie. Hier zorgt men ervoor dat men een extra impedantie opneemt aan de aanstuurkant, in serie met de lijn, zodanig dat de totale impedantie van waaruit men de lijn stuurt gelijk is aan de karakteristieke impedantie. Wanneer men op deze manier een golf op de lijn stuurt, zal de heenlopende golf (ter grootte van de helft van de openklemspanning van de bron) het uiteinde bereiken, en afhankelijk van de impedantie op die plaats al dan niet reflecteren. Het eindpunt neemt in elk geval een waarde aan gegeven door de grootte van de openklemspanning van de bron, gedeeld door de spanningsdeler gevormd door de karakteristieke impedantie en de belastingsimpedantie (ga dit na). De golf die eventueel weerkaatst wordt (indien de belastingsimpedantie verschilt van de karakteristieke impedantie), loopt terug tot aan de bron, en wordt daar volledig geabsorbeerd. Het hele overgangsverschijnsel duurt nu twee looptijden doorheen de lijn, maar de ontvanger heeft zijn eindwaarde al bereikt na één enkele lijntijd. Wanneer de belastingsimpedantie hoofdzakelijk capacitief is (b.v. een CMOS-poort), dan valt de statische dissipatie op nul na het overgangsverschijnsel, ook bij grote spanningszwaai op de lijn. De drie gevallen worden getoond in figuur C.17. Zoals al gesuggereerd vormt, vooral bij hoge schakelfrequenties, de dynamische component van de dissipatie een belangrijke bijdrage. Wanneer men bijvoorbeeld de lijn uit 294

299 Figuur C.17: Het belang van terminatie van lange verliesloze lijnen. Bovenaan: nietgetermineerde lijn. Bemerkt de grote opslingeringen, en de lange duur van het hele verschijnsel. Midden: parallelterminatie. Onder: serieterminatie. figuur C.14 neemt, dan is haar totale capaciteit gelijk aan 0,1 nf. Het op- en ontladen (tot 5 V) dissipeert een energie van CV 2 =2,5 nj, wat opnieuw veel groter is dan de schakelenergie van een poort (orde 1 tot 100 pj). Het versturen van een signaal van 100 MHz op de lijn zou een vermogen vragen van 250 mw, evenveel als de statische dissipatie. Bij korte lijnen (t.o.v. de frequentie van de signalen) neemt de dynamische component toe met de lengte van de lijn: een steeds grotere capaciteit moet dynamisch opgeladen en ontladen worden om de signaalwisselingen over te brengen. Om beide vormen van dissipatie gevoelig te reduceren moet men de spanningszwaai over de lijn terugbrengen van veel lagere waarden. Bij ECL gebeurt dit van nature uit, omdat ECL zelf al een kleine spanningszwaai heeft. Bij TTL zal men de zwaai geen 5 Volt nemen, maar hoogstens 3,5 V. Moderne vormen van CMOS gaan steeds meer naar lagere spanningen (3,3 V, 2,5 V en lager); draad- en kabelverbindingen (bijvoorbeeld de populaire SCSI kabelverbindingen) maken gebruik van LVDS, waarbij men zich beperkt tot een spanningzwaai van 0,25 0,40 V rond een centrale spanning van 1,2 V, over getwijnde paren met karakteristieke impedantie van Ω. Op backplanes en moederborden maakt men gebruik van BTL en GTL, die een spanningszwaai hebben van 2,1 V resp. 1,2 V. C.3.2 Meerpuntconnecties en bussen Tot nu toe hebben wij het gehad over punt-tot-puntverbindingen, dit zijn verbindingen waar er geen bijkomende aftakkingen zijn aan de interconnectie. In heel wat gevallen is dit een goed model, omdat in de meeste normale elektrische circuits het aantal tweepuntverbindingen veruit de meerderheid vormt. Nochtans zijn er in de meeste circuits ook een aantal verbindingen die meer (en sommige veel meer) dan twee punten verbinden. In deze verbindingen onderkennen wij twee sub-klassen: deze waarbij er één enkel aansturingspunt is, en meer dan een ontvanger (bijvoorbeeld de distributie van een kloksignaal 295

300 vanuit een centraal punt), en deze van de bussen 4. Bussen komen bijzonder veel voor in computersystemen, waar men de diverse onderdelen (processor, geheugen, randapparaten) met elkaar wil verbinden via een gemeenschappelijk medium (op het moederbord of via een passieve backplane). Maar ook de coaxiale Ethernetkabel is een elektrische bus. Bij een digitale bus is het zo dat er op dezelfde geleider meerdere poortoutputs aangesloten zijn, wat vereist dat men speciale voorzorgen neemt om interferentie tussen deze outputs te vermijden. De elektrische eigenschappen van de outputs die men daarvoor kan gebruiken zijn in eerdere hoofdstukken al aan bod gekomen: men gebruikt poorten met open collector (of open drain in de moderne GTL MOS-familie), ofwel poorten met afschakelbare output (tri-state). Op elk ogenblik, wanneer de aansturing van de poorten correct verloopt, zal hoogstens één enkele output het niveau op de bus dicteren; op deze geleider zullen dan een aantal luisterende inputs, en een aantal afgeschakelde outputs aangesloten zijn. Er zijn dus geen grote verschillen met de andere soort meerpuntsconnecties, en wij kunnen beide vormen gelijktijdig behandelen. Meerpuntconnecties verschillen dus van punt-tot-puntverbindigen op drie vlakken: (i) er zijn meerdere belastingen aangesloten op de geleider, op verschillende plaatsen; (ii) het aanstuurpunt bevindt zich niet langer altijd op een uiteinde van de lijn, en de lijn kan vertakkingen vertonen; en (iii) de poorten die de lijn aansturen hebben speciale eigenschappen. Wij zullen nu kort deze punten in wat meer detail overlopen. Het effect van meerdere aansluitpunten Elk aansluitpunt op een transmissielijn betekent een gelokaliseerde belasting. De logische families die wij bestudeerd hebben vertonen alle een hoge tot zeer hoge resistieve ingangsimpedantie vergeleken met de karakteristieke impedantie van de lijn. Elke poortingang heeft echter ook een capaciteit, en voor snelle verschijnselen vertoont deze een transiënte impedantie die wel vergelijkbaar wordt met de lijnimpedantie. Deze ingangscapaciteiten zullen een complex patroon van reflecties veroorzaken bij elke transitie op de bus, en zullen bovendien de totale macroscopische capacitieve belasting van de aanstuurpoort verhogen. Wegens de complexiteit van de reflectiepatronen is hun nauwkeurige berekening meestal uitgesloten, maar zolang de signaalamplitudes van deze reflecties klein blijven m.b.t. de ruismarges hoeven wij ze ook niet in detail te kennen. Hoe groot kunnen de reflecties dan wel worden? Om hiervan een idee te krijgen beschouwen wij een input met een capaciteit van 10 pf (een zeer courante waarde). Een voorbijlopende golf met een (grote) flanksteilheid van 5 V/ns op een lijn van 50 Ω zal deze capaciteit opladen, en hiervoor een stroom vereisen van CdV/dt = 50 ma. Als deze capaciteit niet op het uiteinde van de lijn staat, ziet zij aan weerszijden een omgeving van 50 Ω, wat in totaal dus 25 Ω uitmaakt (parallelschakeling). De capacitieve stroom veroorzaakt dus een verstoring van ca. 25 0,05 =1,25 Volt. In dit geval is de opgewekte verstoring eerder groot. Met een meer realistische waarde van de flanksteilheid (b.v. 2 V/ns) blijft de verstoring beperkt tot 0,5 V, en wordt in de praktijk beschouwd als ruis. Een effect dat wel merkbaar blijft, en waarmee rekening moet gehouden worden wanneer er aantal capacitieve belastingen op de lijn aangesloten worden, is de schijnbare ver- 4 De term bus wordt in meer dan één betekenis gebruikt: soms bedoelt men alleen maar een bundel draden; op andere ogenblikken bedoelt men interconnecties die kunnen aangestuurd worden door meer dan één bron, en daardoor een vorm van arbitrage nodig hebben. Dit is de betekenis die wij hier hanteren. 296

301 hoging van c, de capaciteit van de lijn per lengte-eenheid. Deze verhoging uit zich door een verlaging van de effectieve karakteristieke impedantie, en een evenredige verlaging van de golfsnelheid. Een andere topologie De distributie van een signaal naar meerdere plaatsen vereist een meerpuntnet. In sommige gevallen, zoals de verdeling van een kloksignaal naar verschillende plaatsen, wenst men dat de tijdsverschuiving van dat gedistribueerde signaal op de diverse plaatsen minimaal is, m.a.w. men wil dat de flanken van het kloksignaal zich overal tegelijkertijd voordoen. Om dit mogelijk te maken op een PCB zorgt men ervoor dat de afstand van de gemeenschappelijke bron tot aan de eindpunten waar het kloksignaal moet afgeleverd worden, gelijk zijn (in de veronderstelling dat de loopsnelheid van de golven in elk deel van de lijn dezelfde is). Dit kan natuurlijk niet door de verbinding als één transmissielijn via alle bestemmingen te loodsen; men maakt in de plaats een geometrisch boomvormige structuur, die op een symmetrische manier zoveel takken afsplitst als er eindpunten zijn, en zodanig dat de afstanden naar alle eindpunten even groot zijn. Dit schept natuurlijk het probleem van de vertakkingen. Wanneer men voor het heengaande signaal een impedantiesprong wenst te vermijden (wat reeds zou leiden tot reflecties in de heengaande golf), moet de parallelschakeling van de takken voorbij de splitsing precies de zelfde karakteristieke impedantie hebben als de tak vóór de splitsing. Is het aantal af te splitsen takken groot, dan zal de impedantie aan de wortel van de boom zeer laag worden wil men nog realiseerbare impedantie aan de eindpunten overhouden 5. Bovendien zal elke reflectie die terugkomt van een eindpunt weerkaatsen tegen de impedantiesprong aan de splitsingen. Men moet de lijnen dus op hun eindpunt termineren. Klokbomen op het chipoppervlak zijn van een totaal andere aard, omdat de interconnecties hier niet gezien kunnen worden als bijna verliesloze transmissielijnen, en omdat de verbindingen kort zijn gegeven het signalspectrum. Hier zal men meestal gebruik maken van zg. actieve klokbomen, waar bij elke vertakking een versterke opgenomen is die de signalen herstelt en bovendien in een kleinere belasting resulteert voor de versterker stroomopwaarts. Het ontwerp van dergelijke klokdistributiecircuits voor hoge snelheid staat bekend als een moeilijke opgave, en wij gaan er hier niet verder op in. Figuur C.18 toont hoe een klokdistributienetwerk op een PCB er zou kunnen uit zien. Voor een goede werking is vereist dat de uiteinden parallelgetermineerd worden. Een buslijn op een backplane of moederbord heeft een veel eenvoudiger topologie: het is een lijn zonder aftakkingen. Maar het is wel zo dat zowel de bronnen als de ontvangers niet noodzakelijk aan het uiteinde van de verbinding staan. Dit heeft als gevolg dat, zoals daarnet al opgemerkt, zowel de bronnen als de ontvangers ingebed liggen in een omgeving die maar de helft van de karakteristieke impedantie vertoont van de originele lijn. Wanneer er bovendien veel ontvangers zijn aangesloten moet men rekening houden met de bijkomende verlaging van de karakteristieke impedantie door hun ingangscapaciteit. 5 Het is immers zeer moeilijk om verbindingen met hoge karakteristieke impedantie te maken op een PCB: de baantjes zouden veel te smal moeten worden. 297

302 Figuur C.18: Een geëtste passieve klokboom. De karakteristieke impedantie van een baantje boven een aardvlak is ruwweg omgekeerd evenredig met de breedte van de baan. Open-collectorbussen versus tri-state-bussen Laat ons nu even concreet onderzoeken hoe wij met open-collectorpoorten (of hun moderne variant, open-drainpoorten) een bus kunnen maken. Beschouw daartoe figuur C.19. Wij hebben een viertal segmenten van 10 cm elk, met een karakteristieke impedantie van 132 Ω. Op de punten tussen de segmenten staat telkens een bron (bijvoorbeeld een standaard TTL 7406 open-collector driver) en een ontvanger (bijvoorbeeld een standaard TTL 7404 invertor). Zowel de bron als de ontvanger vormen een capacitieve belasting voor de bus. Hoewel standaard TTL duidelijk niet langer gebruikt wordt voor dit soort functies, zijn de conclusies die wij eruit zullen trekken perfect overdraagbaar op de moderne varianten BTL en GTL, gebruikt in hedendaagse bussen. Er werd gekozen voor standaard TTL wegens de beschikbaarheid van simulatiemodellen in de Spice-omgeving voor het uitwerken van dit voorbeeld. Wij onderscheiden twee gevallen: één met niet-getermineerde bus, waarbij een z.g. pull-up weerstand van 220 Ω er wel voor zorgt dat de bus een hoog niveau aanneemt wanneer geen enkele bron in geleiding staat, maar niet echt zorgt voor een busterminatie; en één met een echte parallelterminatie aan beide uiteinden van de bus. De terminatie zorgt tevens voor het hoge logische niveau. De weerstandsdelers bestaan uit resp. 220 en 330 Ω, wat een openklemspanning oplevert van 3 V, en een impedantie van 132 Ω. Figuur C.19 toont de resultaten van beide simulaties samen. Er vallen een aantal dingen op: De spanningszwaai van de niet-getermineerde bus is 5 Volt; deze van de getermineerde is lager (3 V). De spanningsvormen van de getermineerde bus zijn properder, en hebben een grotere flanksteilheid. De niet-getermineerde versie doorloopt het verboden gebied 298

303 Figuur C.19: Een getermineerde versus een niet-getermineerde open-collectorbus. 299

304 rond de logische drempel op een oscillerende manier, wat fouten kan veroorzaken bij ontvangers in CMOS. Bij de niet-getermineerde bus is bovendien de asymmetrie tussen de opgaande en de neergaande flank duidelijk merkbaar. Deze hangt uiteraard af van de grootte van de pull-up weerstand. De weerstand verder verlagen zou de flanken verbeteren, maar tegelijk de dissipatie opdrijven. De niet-getermineerde bus kan niet gebruikt worden tot dezelfde frequenties als de getermineerde bus. Geen van beide busuiteinden is getermineerd in het eerste geval. Dit resulteert in negatieve spanningen na een neerwaartse transitie (reflectie), en in oscillatieverschijnselen (ringing) met een periode die bepaald wordt door de lengte van het uiteinde. De negatieve spanningen worden weggewerkt door de dioden die aanwezig zijn aan de ingangen van de 7404 zonder de ontvangerchips zouden zij veel meer uitgesproken zijn. De periode van de oscillaties is ruwweg viermaal de enkelvoudige doorlooptijd van het bussegment; voor een buseind van 10 cm met de gegeven golfsnelheid is dit 4 0,45 ns = 1,8 ns, wat een frequentie oplevert van 550 MHz. Omdat het hier gaat over open-collectorpoorten wordt het vermogen dat gedissipeerd wordt in de terminatieweerstanden, en door het op- en ontladen van de capaciteiten verbonden met de bus, geleverd door de bronnen verbonden met de terminatienetwerken of pull-up, en is dus eenvoudig te meten. Wat betreft de vermogendissipatie is de niet-getermineerde oplossing duidelijk beter (ca. 45 mw versus 127 mw). De dynamische component van de dissipatie is hier wegens de eerder lage signaalfrequentie nog zeer beperkt, en de grotere spanningszwaai weegt nog lang niet op tegen de statische dissipatie in het terminatiecircuit van de getermineerde versie. Een terminatie met één enkele weerstand van 132 Ω aan elke kant naar 3 V zou echter al een hele verbetering zijn: de dissipatie daalt dan tot 36 mw! Hedendaagse bussen worden ook vaak gemaakt met behulp van poorten met afschakelbare uitgang. Ook hier kan men opteren voor al dan niet gebruiken van terminatie. In het bijzonder voor korte bussen (gemeten naar de stijgtijd van de signalen) ziet men af van terminatie; en is dan overigens ook geen pull-up weerstand nodig, wat de bus veel efficiënter maakt. Langere bussen moet men ook hier termineren. De simulatie en analyse van deze gevallen wordt overgelaten aan de lezer. Het is duidelijk dat deze korte behandeling van de interconnectieproblematiek niet meer is dan een eerste kennismaking. Voor een diepgaander behandeling van de interconnectieen EMC-problematiek in snelle digitale schakelingen kan de lezer terecht in [Johnson93] en [Montrose99], alsook in cursussen in de Masteropleiding. 300

305 Bijlage D Maple-fragmenten en - voorbeelden D.1 Representaties in Maple De volgende voorbeelden (figuren D.1, D.2, D.3, D.4, D.5, D.6, D.7) tonen hoe men in Maple de diverse representatievormen kan voorstellen, en hoe men kan converteren tussen deze vormen. 301

306 Definitie van een Boolese vorm als streng > bv1:="(x + YZ ) (A + B)"; variabelen(bv1); bv1 := (X + YZ ) (A + B) Conversie naar intern inert formaat over de operatoren &or, &and en &not > l1:=bv2logic(bv1); l1 := &not( V 3 &or ( V 4 &and &not( V 5 ))) &and ( V 1 &or V 2 ) Met de functie bv2set vertalen wij een Boolese vormrechtstreeks naar een ternaire representatie van ternaire subkubussen (niet-minimale representatie!). > bv2set(bv1); [[1,, 0,, 1], [1,, 0, 0, ], [, 1, 0,, 1], [, 1, 0, 0, ]] Uit de logic-representatie kan men ook de lijst van mintermen van de functie halen met behulp van de functie logic2mintermen. Dit is een hierarchische lijst, gesorteerd volgensgewicht. Alle variabelen in _V worden in aanmerking genomen. > m1:=logic2mintermen(l1); m1 := [[[0, 1, 0, 0, 0], [1, 0, 0, 0, 0]], [[1, 1, 0, 0, 0], [1, 0, 0, 0, 1], [0, 1, 0, 0, 1]], [[0, 1, 0, 1, 1], [1, 1, 0, 0, 1], [1, 0, 0, 1, 1]], [[1, 1, 0, 1, 1]]] Toepassing van mintermen2decimaal op de representatie van de mintermen: > dec1:=mintermen2decimaal(m1); lijst geeft de decimale dec1 := [[8, 16], [24, 17, 9], [11, 25, 19], [27]] Omgekeerde conversies zijn ook mogelijk: van kubuslijst of mintermlijst naar Boolese vorm met som2bv: > bv1_2:=som2bv(m1); bv1 2 := A BX Y Z + AB X Y Z + ABX Y Z + AB X Y Z + A BX Y Z + \ A BX YZ + ABX Y Z + AB X YZ + ABX YZ Noteer dat de laatste vorm een disjunctieve standaardvorm is, gesorteerd volgens de decimale waarde van de mintermen. Men kan ook de Reed-Mullergedaante afleiden, door de functie logic2rm. De operator "+" is hier uiteraard de exclusieve-of: > Reed_muller1:=logic2rm(l1); Reed muller1 := A + B + A B + A X + B X + A B X + A Y + B Y + A B Y + A X Y + B X Y + A B X Y + A Y Z + B Y Z + A B Y Z + A X Y Z + B X Y Z + A B X Y Z Figuur D.1: Een fragmentje uit een Maple-sessie die gebruik maakt van enkele representaties van Boolese functies. Een sequentie van operaties: de definitie van een Boolese vorm, de extractie van de variabelen, de conversie naar het intern logic-formaat, de conversie naar een ternaire representatie, de conversie naar mintermrepresentatie (een hiërarchische lijst ingedeeld volgens gewicht), en tot slot de decimale representatie. 302

307 Wij kunnen functies met minstens 2 en ten hoogste 5 variabelen met behulp van de functie Karnaugh ook in een Karnaugh-kaart tonen, dit via een voorstelling door middel van mintermlijsten van de ON-set en de DC-set: > bv_on:="(x+y )Z+W (X +U)"; > bv_dc:="xyz W"; > variabelen(cat(bv_on,bv_dc)); > Karnaugh(logic2mintermen(bv2logic(bv_on)), > logic2mintermen(bv2logic(bv_dc)),varnames); Y bv on := (X+Y )Z+W (X +U) bv dc := XYZ W W W Z Y d 1 1 d X X Z U=0 U=1 Figuur D.1: vervolg. Een karnaugh-kaart met vijf variabelen en met don t care-termen (zie hoofdstuk 3). D.2 Combinatorische minimalisatie in Maple Figuren D.8, D.9, D.10, D.11 tonen implementaties in Maple van een aantal minimalisatiealgoritmen. 303

308 SA/logic2rm := proc(lf ) local res, x, y, rep, z, varnos, allfalse; global &not, &and, &or, V ; &not := proc(x) not x end proc ; &and := proc() convert([args], and ) end proc ; &or := proc() convert([args], or ) end proc ; unassign( V ) ; varnos := [seq(i, i = 1..nops(vars))] ; rep := [] ; for x in combinat powerset (varnos) do z := false ; for y in combinat powerset (x) do V := map(x member(x, y), varnos) ; if eval(lf ) then z := not z end if end do; if z then rep := [op(rep), x] end if end do; unassign( V ) ; unassign( &and, &or, &not ) ; convert(map(x if (x = [], 1, convert(map(z vars z, x), )), rep), + ) end proc Figuur D.2: De transformatie naar de Reed-Mullerrepresentatie in Maple. De inerte interne representatie van de functie in lf wordt geïnterpreteerd over het Boolese domein, door een concrete tijdelijke definitie van de inerte operatoren &and, &or, en &not. De coëfficiënten in de expansie worden berekend door herhaalde functie-evaluatie in een dubbele iteratie over machtsverzamelingen van variabelen. De buitenste lus loopt gewoon over alle deelverzamelingen x van de variabelen; de binnenste lus doorloopt alle deelverzamelingen y van de gekozen deelverzameling x, en evalueert de functie wanneer de variabelen in y waar zijn. Telkens een waar resulteert, wordt z gecomplementeerd (initieel vals). De eindwaarde van z is de gewenste coëfficiënt. 304

309 SA/elimnot := proc() local ff, ff1, opf, nn; nn := nargs ; ff := args 1 ; opf := op(0, ff ) ; ff1 := op(ff ) ; if opf = &not then if nn = 2 then if op(0, ff1 ) = &and then &and (op(map(elimnot, [op(ff1 )]))) elif op(0, ff1 ) = &or then &or (op(map(elimnot, [op(ff1 )]))) else ff1 end if else if op(0, ff1 ) = &and then &or (op(map(elimnot, [op(ff1 )], true))) elif op(0, ff1 ) = &or then &and (op(map(elimnot, [op(ff1 )], true))) elif ff1 = true then false elif ff1 = false then true else ff end if end if else if nn = 1 then if opf = &and then &and (op(map(elimnot, [ff1 ]))) elif opf = &or then &or (op(map(elimnot, [ff1 ]))) else ff end if else if opf = &and then &or (op(map(elimnot, [ff1 ], true))) elif opf = &or then &and (op(map(elimnot, [ff1 ], true))) elif ff = true then false elif ff = false then true else &not (ff ) end if end if end if end proc Figuur D.3: De implementatie van stap 1 uit algoritme 2.1. De interne inerte representatie van de Boolese vorm wordt op een recursieve manier doorlopen, tot wanneer alle inversies &not enkel op lettervormen staan. 305

310 SA/distribute := proc(ff ) local ff1, opf, nn, literals, orterms, andterms, x, y, res, newterm, v, result, literalsets; opf := op(0, ff ) ; ff1 := op(ff ) ; if ff = true then return {{}} end if ; if ff = false then return {} end if ; if opf = &or then res := {} ; for x in {ff1 } do result := distribute(x) ; for y in result do res := selectiveadd(y, res) end do end do elif opf = &and then literals := {} ; andterms := {} ; orterms := {} ; for x in ff1 do if not member(op(0, x), { &and, &or }) then if not member(x, {true, &not (false)}) then literals := literals union {x} end if elif op(0, x) = &or then orterms := orterms union {x} else andterms := andterms union {x} end if end do; if literals = {} then literalsets := [] elif isnil(literals) then literalsets := [{}] else literalsets := [literals] end if; Figuur D.4: Stap 2 van algoritme 2.1. Opnieuw wordt, recursief, de inerte Boolese vorm doorlopen, en worden haakjes uitgewerkt door gebruik te maken van distributiviteit. De verkregen productvormen worden voorgesteld door verzamelingen lettervormen, wat automatisch herhaalde symbolen elimineert. Bovendien test de hulpprocedure isnil voor het gelijktijdig optreden van X en X, en zorgt de routine selectiveadd ervoor dat producten niet dubbel voorkomen, of elkaar kunnen bevatten. 306

311 if member( &or, map(x op(0, x), {ff1 })) then literalsets := [op(literalsets), op(map(distribute, orterms))] end if; if member( &and, map(x op(0, x), {ff1 })) then andterms := union (map(distribute, andterms)) ; literalsets := [op(literalsets), op(andterms)] end if; if 1 < nops(literalsets) then x := combinat cartprod (literalsets) ; res := {} ; while not x finished do newterm := x nextvalue () ; newterm := collapse({op(newterm)}) ; if not isnil(newterm) then res := selectiveadd(newterm, res) end if end do; res else if (op(literalsets) = {}, {}, {op(literalsets)}) end if else {{ff }} end if end proc Figuur D.4: vervolg. Stap 2 van algoritme 2.1. SA/expand2minterms := proc() local s, v, s1, s2, varno; s := args 1 ; if nargs = 1 then varno := 1 else varno := args 2 end if ; v := V varno ; if not (member(v, s) or member( &not (v), s)) then s1 := s union {v} ; s2 := s union { &not (v)} ; if varno < nops(vars) then expand2minterms(s1, varno + 1), expand2minterms(s2, varno + 1) else s1, s2 end if else if varno < nops(vars) then expand2minterms(s, varno + 1) else s end if end if end proc Figuur D.5: De stappen 5 en 6 in algoritme 2.1. Deze recursieve procedure wordt toegepast op elk product dat overblijft na de voorgaande stap. Nadien worden de resulterende, aangevulde producten verzameld in een verzameling, wat automatisch eventuele dubbels elimineert. 307

312 SA/mkBDD := proc(l) local Gl, root; global G, &not, &and, &or, V ; &not := proc(x) not x end proc ; &and := proc() convert([args], and ) end proc ; &or := proc() convert([args], or ) end proc ; unassign( V ) ; G := graph({}, {}) ; root := mkbddrec(eval(l), 1) ; Gl := eval(g) ; G := G ; unassign( V ) ; unassign( &and, &or, &not ) ; [root, eval(gl)] end proc SA/mkBDDrec := proc(l, lev) local vv, n, level, leftson, rightson, varnos, ll; global V ; varnos := [seq(i, i = 1..nops(vars))] ; level := nops(vars) lev + 1 ; if evalb(l = true) then if not member(2, vertices(g)) then addvertex(2, weights = 0, G) end if ; 2 elif evalb(l = false) then if not member(1, vertices(g)) then addvertex(1, weights = 0, G) end if ; 1 else V lev := false ; ll := evalb(l) ; leftson := mkbddrec(eval(ll), lev + 1) ; V lev := true ; ll := evalb(l) ; rightson := mkbddrec(eval(ll), lev + 1) ; unassign( V lev ) ; if leftson = rightson then leftson else n := searchnode(g, level, leftson, rightson) ; if n = {} then n := {insertnode(g, level, leftson, rightson)} end if ; op(n) end if end if end proc Figuur D.6: Een Maple-routine voor het opstellen van een BDD uitgaande van een Boolese vorm in interne logic-representatie. Het algoritme zorgt impliciet voor de reductie van de BDD, doordat erover gewaakt wordt dat knopen niet dubbel ingevoerd worden. De BDD wordt opgeslagen in een MAPLE graph, waarin het gewicht van een knoop het niveau in de boom voorstelt. De knopen 1 en 2 worden gereserveerd voor de constanten. 308

313 SA/comBDDrec := proc(bdd1, BDD2, hoe) local newnode, root1, root2, G1, G2, vv, n, level, level1, level2, leftson, rightson; root1 := BDD1 1 ; root2 := BDD2 1 ; G1 := BDD1 2 ; G2 := BDD2 2 ; level1 := G1 ( Vweight) root1 ; level2 := G2 ( Vweight) root2 ; if level1 + level2 = 0 then if hoe = and then newnode := if (root1 = 1, 1, root2 ) elif hoe = or then newnode := if (root1 = 2, 2, root2 ) elif hoe = exor then newnode := if (root1 = 1, root2, 3 root2 ) end if; if not member(newnode, vertices(g)) then addvertex(newnode, weights = 0, G) end if; newnode else if level2 < level1 then level := level1 ; leftson := combddrec([lefts(g1, root1 ), G1 ], [root2, G2 ], hoe) ; rightson := combddrec([rights(g1, root1 ), G1 ], [root2, G2 ], hoe) elif level1 < level2 then level := level2 ; leftson := combddrec([root1, G1 ], [lefts(g2, root2 ), G2 ], hoe) ; rightson := combddrec([root1, G1 ], [rights(g2, root2 ), G2 ], hoe) else level := level1 ; leftson := combddrec([lefts(g1, root1 ), G1 ], [lefts(g2, root2 ), G2 ], hoe) ; rightson := combddrec([rights(g1, root1 ), G1 ], [rights(g2, root2 ), G2 ], hoe) end if; if leftson = rightson then leftson else n := searchnode(g, level, leftson, rightson) ; if n = {} then n := {insertnode(g, level, leftson, rightson)} end if ; op(n) end if end if end proc Figuur D.7: Een Maple-routine voor de combinatie van twee BDD s via een logische operator. Opnieuw zorgen de laatste statements voor het vermijden van redundante knopen. 309

314 SA/McCluskey1 := proc(mt ) local i, j, term1, term2, fn1, fn2, newtable, p, p1, p2, u, π, tt, ttt, fff, newt, groups; π := [] ; newt := [] ; groups := nargs ; u := [ seq(array(1..rowdim(args i ), [seq(, j = 1..rowdim(args i ))]), i = 1..groups)]; for p to groups 1 do if gewicht(args p1, 1 ) + 1 = gewicht(args p+11, 1 ) then tt := [] ; for p1 to rowdim(args p ) dofor p2 to rowdim(args p+1 ) do term1 := args pp1, 1 ; fn1 := args pp1, 2 ; term2 := args p+1p2, 1 ; fn2 := args p+1p2, 2 ; fff := [seq(fn1 i fn2 i, i = 1..nops(fn1 ))] ; if distance(term1, term2 ) = 1 and 0 < add(i, i = fff ) then ttt := comb(term1, term2 ) ; if fn1 = fff then u pp1 := end if ; if fn2 = fff then u p+1p2 := end if ; if not member([ttt, fff ], tt) then tt := [op(tt), [ttt, fff ]] end if end if end do end do; if 0 < nops(tt) then newtable := array(1..nops(tt), 1..2) ; for p1 to nops(tt) do newtable p1, 1 := tt p1 1 ; newtable p1, 2 := tt p1 2 end do; newt := [op(newt), eval(newtable)] end if end if; for p1 to rowdim(args p ) do if u pp1 then π := [op(π), [args pp1, 1, args pp1, 2 ]] end if end do; end do; for p1 to rowdim(args groups ) do if u groups p1 then π := [op(π), [args groups p1, 1, args groups p1, 2 ]] end if end do; if 0 < nops(newt) then [op(π), op(mccluskey1(op(newt)))] else π end if end proc Figuur D.8: De eerste stap in de tabelmethode van McCluskey in Maple. De input is een rij van mintermen, geordend volgens gewicht. De procedure doorloopt de lijst, extraheert priemimplicanten, en maakt de volgende lijst aan. Wanneer deze laatste niet leeg is, roept de procedure zichzelf recursief aan. 310

315 SA/McCluskey2bb := proc(c, s, t) localselected, newpis, residu, temp, mincost, currcost, i, j, r, rr, cc, weights, bestweight, withcost, withsol, cost, p, withoutsol, sol, tempwith, tempwithout, fnwith, withselected, fnset; global bestcost, bestsol if nargs = 1 then residu := args 1 ; currcost := [0, 0] ; fnset := {} ; for i from 3 to coldim(residu) do fnset := fnset union {residu 1, i } end do ; selected := [seq([], i = 1..nops(fnset))] ; bestcost := [rowdim(residu) 2, (rowdim(residu) 2) nops(residu 3, 1 )] ; else residu := t ; selected := s ; currcost := c end if; do newpis := [seq([], i = 1..nops(selected))] ; cost := [seq([0, 0], i = 1..nops(selected))] ; temp := essentiele PI(cost, newpis, elim dominantie(residu) 2 ) ; residu := temp 3 ; if 0 < add(nops(i), i = temp 2 ) then selected := [seq([op(selected i ), op(temp 2i )], i = 1..nops(selected))] ; currcost := currcost + add(i, i = temp 1 ) else break end if end do; if 2 < coldim(residu) then rr := rowdim(residu) ; cc := coldim(residu) ; weights := seq( add( if (residu i, j = 1, 1/add(residu k, j, k = 3..rr), 0), j = 3..cc), i = 3..rr); bestweight := max(weights) ; member(bestweight, [weights], p ) ; tempwithout := delrows(residu, 2 + p..2 + p) ; fnwith := residu 1, min(op(select(x residu2+p, x =1, [seq(i, i=3..cc)]))) ; tempwith := concat(col(residu, 1), col(residu, 2), seq(col(residu, j), j = select(x residu 2+p, x = 0 or not (residu 1, x = fnwith), [seq(i, i = 3..cc)]))); tempwith 2+p, 2 := [0, 1] ; withselected := selected ; withselected fnwith := [op(withselected fnwith ), residu 2+p, 1 ] ; withcost := currcost + residu 2+p, 2 ; Figuur D.9: De tweede stap in de tabelmethode van McCluskey in Maple. 311

316 if costsless(withcost + MinimalCost(tempwith), bestcost) then withsol := McCluskey2bb(withcost, withselected, tempwith) ; if costsless(withsol 1, bestcost) then bestcost := withsol 1 ; bestsol := withsol 2 end if; end if; if costsless(currcost + MinimalCost(tempwithout), bestcost) then withoutsol := McCluskey2bb(currcost, selected, tempwithout) ; if costsless(withoutsol 1, bestcost) then bestcost := withoutsol 1 ; bestsol := withoutsol 2 end if; end if else sol := [currcost, selected] ; if costsless(sol 1, bestcost) then bestcost := sol 1 ; bestsol := sol 2 end if end if; [bestcost, bestsol] end proc Figuur D.9: vervolg. De tweede stap in de tabelmethode van McCluskey in Maple. De input bestaat uit de kost (initieel zeer hoog, het aantal rijen in de tabel met alle inputs aanwezig), de reeds geselecteerde priemimplicanten (initieel leeg), en de resterende tabel (initieel de bedekkingstabel).in de bedekkingstabel werd, naast de ternaire representatie, ook de kost van een priemimplicant opgenomen in de tweede kolom. De procedure elimineert eerst herhaaldelijk gedomineerde rijen en dominerende kolommen, en extraheert de essentiële en de secundair, tertiar,... essentiële p.i. s. Wanneer dit niets meer oplevert, dan wordtde beste rij geselecteerd, en twee deeltabellen berekend: een waarbij de beste rij gewoon geschrapt wordt, en eenwaarbij de rij aanzien wordt als geselecteerd (wat leidt tot het schrappen van kolommen, en eventueel ook de rij zelf). Wanneer de geraamde kost (currcost + MinimalCost) lager is dan de laagste kost tot nu toe, dan wordt het alternatief onderzocht door een recursieve oproep naar zichzelf. Nadien worden de mogelijke deeloplossingen vergeleken met de beste oplossing totnu toe, die eventueel aangepast wordt. 312

317 SA2 /compl := proc(vv, set) local b, CFU, CFU1, CFU2, i, j, variab, VV, commons; VV := vv ; member(vv 1, vars, b) ; if nops(vv) = 1 then if 1 < nops(set) then {} elif nops(set) = 0 then {[seq(, i = vars)]} elif set 1b = 1 then {subsop(b = 0, set 1 )} elif set 1b = 0 then {subsop(b = 1, set 1 )} else {} end if else variab := VV 1 ; VV := subsop(1 = NULL, VV ) ; CFU := cofactors(variab, set) ; CFU1 := compl(vv, CFU 1 ) ; CFU2 := compl(vv, CFU 2 ) ; commons := CFU1 intersect CFU2 ; CFU1 := CFU1 minus commons ; CFU2 := CFU2 minus commons ; for i in CFU1 dofor j in CFU2 do if bedekt(i, j) then CFU2 := CFU2 minus {j} ; commons := commons union {j} end if end do end do; for i in CFU2 dofor j in CFU1 do if bedekt(i, j) then CFU1 := CFU1 minus {j} ; commons := commons union {j} end if end do end do; (map(x subsop(b = 0, x), CFU1 ) union map(x subsop(b = 1, x), CFU2 )) union commons end if end proc Figuur D.10: De Maple-implementatie van het complement van een verzameling ternaire kubussen. De inputs zijn een lijst van variabelenamen en een verzameling ternaire kubussen. Eerst worden de speciale gevallen opgevangen (één variabele over). Dan worden de cofactoren berekend op de eerste variabele, en de routine wordt recursief opgeroepen. De resulterende verzamelingen worden gecombineerd, waarbij de gemeenschappelijke termen onmiddellijk samengenomen worden, en waarbij er getest wordt op mutuele bedekking van termen uit de twee deelverzamelingen. 313

318 SA2 /kruis := proc(s1, s2 ) local k, i, j, kr1, kr2, diffs, res; if s2 = {} then s1 elif s1 = {} then {} elif s1 ::set then res := {} ; for i in s1 do res := if (res = {}, kruis(i, s2 ), Vee(res, kruis(i, s2 ))) end do ; res else if s2 ::set then res := s1 ; for i in s2 do res := kruis(res, i) end do ; res else k := [seq(kr s1 i, s2 i, i = 1..nops(s1 ))] ; if member( X, k) then {s1 } elif s1 = k then {} else diffs := select(x s1 x k x, [seq(j, j = 1..nops(s1 ))]) ; union (seq({subsop(i = k i, s1 )}, i = diffs)) end if end if end if end proc SA2 /Vee := proc(ss1, ss2 ) local i, j, s1, s2 ; s1 := ss1 ; s2 := ss2 ; for i in s1 dofor j in s2 do if bedekt(i, j) then s2 := s2 minus {j} end if ; if bedekt(j, i) then s1 := s1 minus {i} end if end do end do; s1 union s2 end proc SA2 /kr := table([(, 1) = 0, (0, ) = 0, (1, ) = 1, (0, 0) = 0, (, ) =, (1, 0) = X, (, 0) = 1, (0, 1) = X, (1, 1) = 1 ]) Figuur D.11: De Maple-implementatie van de kruisoperatie. De tabel kr bevat de operatietabel voor individuele bits; de operatie Vee combineert twee verzamelingen kubussen, en gaat na of er geen mutele bedekkingen zijn. De eigenlijke routine kruis gaat, afhankelijk van het type van de operands (verzamelingen of enkelvoudige kubussen) een verschillend verloop volgen; uiteindelijk valt men terug op de definitie van de combinatie van twee kubussen. 314

319 D.3 Sequentiële analyse in Maple Figuren D.12, D.13, D.14 tonen implementaties in Maple van een aantal technieken voor de analyse van teruggekoppelde poortnetwerken. 315

320 SA3 /Zoekfuncties := proc(ttt) local ft, nodes, leesfunctie, vv, n, G; leesfunctie := proc(nn) local argum; if not assigned(ft nn ) then argum := map(leesfunctie, [op(arrivals(nn, G))]) ; if nops(argum) = 1 then ft nn := &not (argum 1 ) else ft nn := &not ( &and (op(argum))) end if end if; ft nn end proc; unassign( V ) ; G := ttt OPENNET ; if not islusvrij(g) then print( Circuit is niet lusvrij ) ; RETURN( procname(argum) ) end if; ft := table([]) ; vv := select(x arrivals(x, G) = {}, convert(g( Vertices), list)) ; for n in vv do ft n := V n end do ; ft inputs := select(x vweight(x, G) 1, vv) ; ft huidige := select(x vweight(x, G) 1 =, vv) ; ft volgende := map( x op(select(y cat(, vweight(y, G)) = vweight(x, G), G( Vertices))), ft huidige ); nodes := select(x arrivals(x, G) {}, convert(g( Vertices), list)) ; for n in nodes do if not assigned(ft n ) then leesfunctie(n) end if end do ; ttt FUNCTIES := eval(ft) end proc Figuur D.12: Een Maple-fragment dat de functies geassocieerd met netwerkknopen bepaalt in een netwerk dat opgeslagen ligt in een graaf. Er wordt verondersteld dat de knopen van de graaf NAND-functies of invertors voorstellen. De functies worden voorgesteld in logic-formaat, en worden niet vereenvoudigd. De resultaten worden opgeslagen in de tabel ft. In het veld inputs komen de primaire circuit-inputs, in het veld huidige de namen van de toestandsvariabelen voorbij de knipplaatsen (deze namen beginnen met een ), in het veld volgende de toestandsvariabelen voor de knipplaatsen (dezelfde namen, maar zonder ). De functie leesfunctie stelt recursief de logische uitdrukking op die hoort bij een knoop met niet-ledige fan-in. De uiteindelijke argumenten zijn de primaire circuit-inputs en de waarden voorbij de knipplaatsen. 316

321 SA3 /mkttt := proc(circuit) local ttt, Toest, Inp, r, c, ssize, isize, svars, svals, ivars, ns, ff, x, values, G, rijnummer; if not assigned(circuit OPENNET ) then print( Knip eerst het netwerk open ) ; RETURN() end if; G := circuit OPENNET ; if not assigned(circuit FUNCTIES ) then Zoekfuncties(circuit) end if ; ff := circuit FUNCTIES ; if not type(ff, table) then print( knip meer lussen ) ; RETURN() end if ; ssize := nops(ff huidige ) ; isize := nops(ff inputs ) ; ivars := op(map(x ff x, ff inputs )) ; svars := op(map(x ff x, ff huidige )) ; svals := map(x logic2bool(ff x ), ff volgende ) ; Toest := map(x gray(ssize, x), [seq(i, i = 0..2 ssize 1)]) ; Inp := map(x gray(isize, x), [seq(i, i = 0..2 isize 1)]) ; ttt := array(1..2 ssize, 1..2 isize ) ; for r to 2 ssize dofor c to 2 isize do values := map(x evalb(x = 1), [op(inp c ), op(toest r )]) ; for x to isize + ssize do assign([ivars, svars] x, values x ) end do ; unassign( rijnummer ) ; member(map(x if (x = true, 1, 0), eval(svals)), Toest, rijnummer) ; ttt r, c := rijnummer end do end do; for x to isize do unassign(parse(vweight(ff inputs x, circuit OPENNET ))) end do; for x to ssize do unassign(parse(vweight(ff huidige x, circuit OPENNET ))) end do; circuit TTT := eval(ttt) ; circuit Toestandsvariabelen := svars ; := Toest ; circuit Toestanden circuit Inputvariabelen circuit Inputs unassign( V ) end proc := Inp ; := ivars ; Figuur D.13: Een Maple-fragment dat de TTT van een netwerk berekent. Dit gebeurt door de evaluatie van de netwerkfuncties over het Boolese domein (binair), voor alle waarden van de inputs en van de toestandsgrootheden. Deze worden geënumereerd volgens een Gray-sequentie, om voornamelijk hamming-1-transities te kunnen tonen. Met de resultaten van de analyse wordt de TTT ingevuld. 317

322 SA3 /Zoekhazards := proc(circuit) localttt, Toest, Inp, r, c, ssize, isize, svars, svals, ivars, ns, ff, x, values, G, ttd, s, ss, sss, cc, rr, diff, newstate, newerstate, Shazardstate, rrr, fanin, fanout; global &and, &not ; if not assigned(circuit OPENNET ) then RETURN( procname(args) ) end if ; G := circuit OPENNET ; if not assigned(circuit FUNCTIES ) then Zoekfuncties(circuit) end if ; ff := circuit FUNCTIES ; if not type(ff, table) then print( knip meer lussen ) ; RETURN() end if ; ttd := circuit TTD ; ttt := circuit TTT ; ssize := nops(ff huidige ) ; isize := nops(ff inputs ) ; ivars := op(map(x ff x, ff inputs )) ; svars := op(map(x ff x, ff huidige )) ; svals := map(x ff x, ff volgende ) ; Toest := circuit Toestanden ; Inp := circuit Inputs ; &and := proc(x) local a; a := [args] ; if nargs = 1 then x elif member(0, a) then 0 elif not member(, a) then 1 else end if end proc; &not := proc(x) if x = 1 then 0 elif x = then else 1 end if end proc ; Figuur D.14: Maple-code voor ternaire analyse van een poortnetwerk. Het voorbereidend werk: het klaarzetten van de datastructuren, en de tijdelijke herdefinitie van de logische operatoren and en not voor gebruik in het ternaire domein. 318

323 for ss in ttd( Vertices) do cc := vweight(ss, ttd) 3 ; fanin := select(x vweight(x, ttd) 1, map(x ttd( Tail) x, select(x ttd( Head) x = ss, ttd( Edges)))); for s in fanin do r := vweight(s, ttd) 2 ; c := vweight(s, ttd) 3 ; values := [op(comb(inp c, Inp cc )), op(toest r )] ; for x to isize + ssize do assign([ivars, svars] x, values x ) end do ; newstate := Toest r ; newerstate := eval(svals) ; Shazardstate := newerstate ; while newstate newerstate do newstate := newerstate ; for x to ssize do assign([svars] x, newstate x ) end do ; newerstate := eval(svals) end do; newstate := newerstate ; for x to isize do assign([ivars] x, Inp ccx ) end do ; newerstate := eval(svals) ; while newstate newerstate do newstate := newerstate ; for x to ssize do assign([svars] x, newstate x ) end do ; newerstate := eval(svals) end do; Figuur D.14: vervolg. Hier wordt eerst de veranderende input op - gezet, en de resulterende nieuwe toestand (zonder terugvoer) wordt in Shazardstate opgeslagen. Nadien wordt newstate geïtereerd tot wanneer geen verandering meer optreedt. Dan wordt de input op zijn eindwaarde gebracht, en de eindwaarde komt in newerstate. 319

324 if not vweight(ss, ttd) 1 then sss := op(map(x ttd( Head) x, select(x ttd( Tail) x = ss, ttd( Edges)))) ; rrr := coords(sss, circuit) 2 ; if0 < add( if (Toest rx = Toest rrr x and Shazardstate x =, 1, 0), x = 1..ssize) then printf( %s %a %s %a %s %a \n %s %a %s %a %s %a\n, Statische Hazard :, coords(s, circuit), >, coords(ss, circuit), >, coords(sss, circuit), =, totale toestand(s, circuit), >, totale toestand(ss, circuit), >, totale toestand(sss, circuit)); printf( %s %a\n, Overgang =, Shazardstate) end if; if member(, newerstate) then printf( %s %a %s %a %s %a \n %s %a %s %a %s %a\n, Essentiele hazard :, coords(s, circuit), >, coords(ss, circuit), >, coords(sss, circuit), =, totale toestand(s, circuit), >, totale toestand(ss, circuit), >, totale toestand(sss, circuit)); printf( %s %a\n, Eindwaarde =, newerstate) end if else if member(, Shazardstate) then printf( %s %a %s %a \n %s %a %s %a\n, Statische hazard :, coords(s, circuit), >, coords(ss, circuit), =, totale toestand(s, circuit), >, totale toestand(ss, circuit)); printf( %s %a\n, Overgang =, Shazardstate) end if end if end do end do; for x to isize do unassign(parse(vweight(ff inputs x, circuit OPENNET ))) end do; for x to ssize do unassign(parse(vweight(ff huidige x, circuit OPENNET ))) end do; unassign( &and, &not ) end proc Figuur D.14: einde. De resultaten worden onderzocht, en meldigen van statische en essentiële hazards worden uitgeschreven. De starttoestand is s, de onstabiele tussentoestand ss, en de eindtoestand sss. De operatoren &and en &not worden weer vrijgegeven. 320

325 D.4 Sequentiële synthese in Maple Figuren D.15, D.16, D.17 illustreren de basistappen in de synthese van sequentiële schakelingen op logisch niveau. 321

326 SA4 /compatibele toestanden := proc(c) local comptab, ns, iocompat, i, j, l, opvolgers, sn, list; sn := c Toestandsnamen ; ns := nops(sn) ; comptab := table() ; list := [] ; for i to ns dofor j from i + 1 to ns do iocompat := iocompatibel(c, i, j) ; if assigned(comptab {sni, sn j }) then comptab {sni, sn j } 1 := iocompat else comptab {sni, sn j } := [iocompat, false, {}] end if; if iocompat thenfor l from 2 to coldim(c POT ) do opvolgers := {c PTTT i+1, l, c PTTT j+1, l } ; if 1 < nops(opvolgers) and not member(, opvolgers) then if assigned(comptab opvolgers ) then comptab opvolgers 3 := comptab opvolgers 3 union {{sn i, sn j }} else comptab opvolgers := [true, false, {{sn i, sn j }}] end if end if end do else list := [op(list), {sn i, sn j }] end if end do end do; while list [] do opvolgers := list 1 ; list := subsop(1 = NULL, list) ; comptab opvolgers 2 := true ; for j in comptab opvolgers 3 do if comptab j1 = true then comptab j1 := false ; list := [op(list), j] end if end do end do; select(x comptab x1, map(op, {indices(comptab)})) end proc Figuur D.15: Het equivalentie-algoritme in Maple. Eerst wordt de tabel van voorgangers opgesteld, en die koppels aangemerkt die output-incompatibel zijn. Nadien worden iteratief de voorgangers van incompatibele koppels aangemerkt. 322

327 SA4 /MaxComp := proc(c) local cc, n, m, seen, neigh; if c( Edges) {} then cc := complement(c) ; m := [] ; seen := {} ; for n in cc( Vertices) do neigh := cc( Neighbors) n minus seen ; if 1 < nops(neigh) then m := [op(m), &or (n, &and (op(neigh)))] elif nops(neigh) = 1 then m := [op(m), &or (n, op(neigh))] end if; seen := seen union {n} end do; m := [distribute( &and (op(m)))] ; if nops(m) = 1 then [cc( Vertices) minus op(m)] else sort(map(x cc( Vertices) minus x, m), (x, y) evalb(nops(y) < nops(x))) end if else {seq({n}, n = c( Vertices))} end if end proc Figuur D.16: Een Maple-fragment voor het opzoeken van de maximale compatibele klassen met de methode van Marcus. De input is een compatibiliteitsgraaf. Deze wordt gecomplementeerd, en op basis van die graaf wordt een logic-vorm m opgesteld, die geminimaliseerd wordt. De ontbrekende literals uit de termen worden als resultaat teruggegeven. 323

328 SA4 /StabPart := proc(x, G) local visited, tovisit, part, newpair, curr, nxt, newblock, b, i, statenames, notin; part := {} ; tovisit := {x} ; visited := {} ; while tovisit {} do curr := tovisit 1 ; tovisit := tovisit minus {curr} ; visited := visited union {curr} ; nxt := map(y G( Head) y, select(x curr = G( Tail) x, G( Edges))) ; for i in nxt do NULL ; if not member(i, visited) then tovisit := tovisit union {i} end if end do; newpair := vweight(curr, G) ; newblock := newpair ; for b in part do if b intersect newpair {} then part := part minus {b} ; newblock := newblock union b end if end do; part := part union {newblock} end do; statenames := union (op(map(x vweight(x, G), G( Vertices)))) ; notin := statenames minus union (op(part)) ; part := part union seq({{i}}, i = notin) ; part end proc Figuur D.17: Het bepalen van de minimale stabiele partitie die hoort bij een toestandspaar. Inputs: x is een toestandspaar, en G is een opvolgergraaf, een graaf gedefinieerd over de toestandsparen van de automaat. Een knoop leidt naar een andere knoop indien de tweede knoop het opvolgerpaar voorstelt van de eerste onder een inputwaarde. De input x is een te onderzoeken paar. Wij houden twee lijsten bij: de nog te onderzoeken paren (opvolgers), en de paren die al onderzocht werden. Wij doorlopen de graaf, en verzamelen alle koppels die wij tegen komen, tot wanneer de te onderzoeken lijst leeg is. Dan worden de overlappende koppels samengevoegd tot grotere gehelen, en de ontbrekende toestanden worden eraan toegevoegd als singletons. Het resultaat is een minimale stabiele partitie. 324

329 Bibliografie [Abram90] [Armstrong62] [Armstrong89] [Ashar92] Abramovici, M., Breuer, M.A., Friedman, A.D. (1990), Digital Systems Testing and Testable Design, IEEE Press: Piscataway, New Jersey. Armstrong, D. (1962), On the efficient assignment of internal codes to sequential machines, IRE Transactions on Electronic Computers, Vol. EC- 11, pp Armstrong, J.R. (1989), Chip-level modeling with VHDL, Prentice Hall: Englewood Cliffs, New Jersey. Ashar, A., Devadas, S., Newton, R. (1992), Sequential Logic Synthesis, Kluwer Academic Publishers: Boston. [Bell71] Bell, C.G., Newell, A. (1971), Computer Structures: Readings and Examples, McGraw-Hill: New York. [Birtwistle95] [Borrione91] [Brayton84] [Brayton87] [Breuninger85] [Bryant86] [Brzozowski95] [Clare73] Birtwistle, G., en Davis, A., editors, (1995) Asynchronous Digital Circuit Design, Springer Verlag: London. Borrione, E., Waxman R. (eds.) (1991), Computer Hardware Description Languages and their Applications, North-Holland: Amsterdam. Brayton, R.K., Hachtel, G.D., McMullen, C.T., Sangiovanni-Vincentelli, A.L (1984), Logic Minimization Algorithms for VLSI Synthesis, Kluwer Academic Publishers: Boston. Brayton, R.K., Rudell, R., Sangiovanni-Vincentelli, A., Wang, A.R. (1987), MIS: A Multiple-Level Logic Optimization System, IEEE Transactions on Computer Aided Design, Vol. CAD-6, No. 6, pp Breuninger, R.K., Frank, K. (1985), Metastable Characteristics of Texas Instruments Advanced Bipolar Logic Families, TTL Advanced Low- Power Schottky, Advanced Schottky Data Book, Vol 2., Texas Instruments. R. Bryant (1986), Graph-Based Algorithms for Boolean Function Manipulation, IEEE Transactions on computers, Vol. C-35, No. 8, pp Brzozowski, J., en Seger, C., (1995) Asynchronous Circuits, Springer Verlag: New York. Clare, C.R. (1973), Designing Logic Systems Using State Machines, McGraw-Hill: New York. 325

330 [DeMicheli94] [Devadas94] [Dietmeyer71] [Green86] [Hachtel96] [Hartenstein87] [Hartmanis61] [Hennie68] [Hong74] [Hurst85] [Johnson93] [Lewin92] [Lipsett89] De Micheli, G. (1994), Synthesis and Optimization of Digital Circuits, McGraw-Hill: New York. Devadas, S., Ghosh, A., Keutzer, K. (1994), Logic Synthesis, McGraw- Hill: New York. Dietmeyer, D. (1971), Logical Design of Digital Systems, Allyn & Bacon. D. Green (1986), Modern Logic Design, Addison-Wesley: Wokingham. G. D. Hachtel, F. Somenzi (1996), Logic Synthesis and Verification Algorithms, Kluwer: Boston. Hartenstein, R.W. (ed.) (1987), Hardware Description Languages, North- Holland: Amsterdam. Hartmanis, J. (1961), On the state assignement problem for sequential machines I, IRE Trans. Electron. Comput., Vol. EC-10, pp Hennie, F. (1968), Finite-State Models for Logical Machines, Wiley: New York. Hong, S., Cain, R., en Ostapko, D. (1974), MINI: A heuristic approach for Logic Minimization, IBM J. Res. Dev., sept., S. L. Hurst, D. M. Miller, en J. C. Muzio (1985), Spectral Techniques in Digital Logic, Academic Press: London. H. Johnson, M. Graham (1993), High-Speed Digital Design A Handbook of Black Magic, Prentica Hall: Upper Saddle River, New Jersey. Lewin, D., Protheroe, D. (1992), Design of Logic Systems, Chapman & Hall: London. Lipsett, R., Schaefer, C., Ussery, C. (1989), VHDL: Hardware Description and Design, Kluwer Academic Publishers: Boston. [Marcus64] Marcus, M. (1964), Derivation of Maximum Compatibles using Boolean Algebra, IBM J. Res. Developm., Vol. 8, pp [McCluskey65] [McCluskey86] [Michel92] [Montrose99] [Navabi93] [Parker92] McCluskey, E. (1965), Introduction to the Theory of Switching Circuits, McGraw-Hill: New York. McCluskey, E.J. (1986), Logic Design Principles, Prentice-Hall: Englewood Cliffs, N.J. Michel, P., Lauther, U., Duzy, P. (eds.), (1992), The Synthesis Approach to Digital System Design, Kluwer Academic Publishers: Boston. M. Montrose (1999), EMC and the Printed Circuit Board. Design, Theory and Layout Made Simple, IEEE: New York. Navabi, Z. (1993), VHDL, Analysis and Modeling of Digital Systems, Prentice-Hall: Englewood Ciffs, NJ. Parker, K.P. (1992), The Boudary Scan Handbook, Kluwer: Boston. 326

331 [ITRS01] [Siewiorek82] [Stone73] [Tracey66] [Varma89] [Voith77] [White81] [Wilkins86] [Zissos72] Sematech (2001), International technology road map for semiconductors. Zie Siewiorek, D.P., Bell, C.G., Newell, A. (1982), Computer Structures: Principles and examples, McGraw-Hill: Auckland. H. S. Stone (1973), Discrete Mathematical Structures and Their Applications, SRA: Chicago. Tracey, J. (1966), Internal state assignment for asynchronous sequential machines, IEEE Trans. Electron. Comput., Vol. EC-15, pp Varma, D., and Trachtenberg, E.A. (1989) Design Automation Tool for Efficient Implementation of Logic Functions by Decomposition, IEEE Transactions on Computer-Aided Design, Vol. 8, No. 8, pp Voith, R.P. (1977), ULM Implicants for Minimization of Universal Logic Module Circuits, IEEE Transactions on Computers, Vol. C 26, pp White, D. (1981), Bit-Slice Design: Controllers and ALUs, Garland STPM Press: New York. Wilkins, B.R. (1986), Testing Digital Circuits An Introduction, Van Nostrand Zissos, D. (1972), Logic Design Algorithms, Oxford University Press. 327

332 Index Asynchrone inputs, 9, 182, 233 Hamming-afstand, 234 hazards, 234 synchronisatieflipflop, 234 synchronisatieprotocol, 235 BDD s, 40, 57 compositie, 44 ITE-compositie, 46 reductie, 43 Boole-algebra, 20 alternatieve definitie, 21 atomen, 26 dualiteit, 22 eigenschappen, 21 exclusieve-of, 29 Boolese functies, 23 complementering, 41 don t care-termen, 92 functiecompositie, 24, 41 gelijkheidstest, 41 gewicht, 24, 92 monotone, 48 ON-set, DC-set en OFF-set, 99 pseudo-functies, 49 representatie, 24 Boolese decisiediagrammen, zie BDD s Boolese vormen, 31 Hadamard-transformatie, 28 karnaughkaart, 25 mintermfuncties, 27 Reed-Muller, 29 ternaire kubuslijsten, 40, 92 waarheidstabel, 25 satisfaiseerbaarheid, 41 symmetrische, 47 tautologietest, 41, 108 unaatheid, 48, 97, 103, 104, 208 zelfduale, 49 Boolese matrices, 55 Boolese vormen, 31, assignatie en valuatie, 33 disjunctieve normaalvorm, 36 algoritme, 39 dualiteit, 34 equivalentie, 33 minimalisatie, 88 algebraïsch, 88 implicantenmethode, 91 methode van Zissos, 88 niet-redundant, 90 optioneel product, 88 som-van-producten, 88 verband met poortnetwerken, zie Poortnetwerken verband met taknetwerken, zie Taknetwerken Bouwstenen, 58 ASIC s, 76 full custom, 82 gate arrays, 77, 123 IP cores, 81 PLA s, 82, 116, 117 soft core, 76 standaard-celcomponenten, 78 programmeerbare componenten, 63 architectuur, 67 FPGA s, 71, 123 macrocel, 196 ontwerpshulpmiddelen, 198 PAL, 69, 117, 123, 247 PLA, 68, 117 PLS, 195 programmeertechnologie, 65 PROM, 71 standaardcomponenten, 58 LSI en VLSI, 62, 185 MSI, 61 SSI, 58 Bus, 59 differentieel, 61

333 drivers en transceivers, 62 open-collector, 253 open-drain, 60 tri-state, 59 Complete som karnaughkaartmethode, 92 kubuslijsten, 104 meervoudige functies, 98 tabelmethode van Quine en McCluskey, 92 topologische methode, 99 verwijdering van hazards, 148 Compositie en decompositie, 225 logisch niveau cascade, 227 factorisering, 228 parallel, 227 synchrone compositie, 230 DRAM, 187 speciale vormen, 191 werking, 188 Fieldbus, 193 Flipflops, 177 datagedrag, 178 D-flipflop, 178 J/K-gedrag, 178 S/R-fliflop, 178 T-gedrag, 178 klokgedrag, 177 asynchroon, 177 flanksturing, 177 I-interval, 179 master-slave, 177 metastabiliteit, zie Metastabilteit niveausturing, 177 O-interval, 179 pulssturing, 177 Fysische beschrijving, 13 layout, 13 Gedrag algoritmisch niveau, 10 asynchroon, 187 circuitniveau, 3 combinatorisch versus sequentieel, 9, 247 declaratieve beschrijving, logisch niveau, 4, 74, 77, 247 BDD, 139 procedurale beschrijving, 15 RT-niveau, 10, 74, 77 synchroon, 8, 179 systeemniveau, 11 uitvoerbare beschrijving, 15 Geheugens, 185 dynamisch, 187 registers, 185 statisch, 186 Grafische beschrijvingen, 260 circuitschema s, 263 OrCAD, DASH, 74 PMS, 260 tijdsdiagrammen, 262 Gray-code, 151 Hazards statische, 71 Hyperkubus, 25, 91 deelkubus, 91 Hammingafstand, 25, 92 implicant, zie Implicant Implicant, 91 complete som, 91 essentieel, 91, 95, 107, 108 niet-redundante som, 91, 108 partieel redundant, 108 priem, 91, 108 meervoudige functies, 98 totaal redundant, 108 Implicantentabel, 95 branch-and-bound, 95 cyclisch, 95 kolomdominantie, 95 meervoudige functies, 98 methode van Petrick, 97 rijdominantie, 95 verbeterde methode, 108 Kronecker-produkt, 28 Kruisoperatie, 105 Kubuslijsten, 99 complete som, zie Complete som Espresso Exact, 104 functierepresentatie, zie Boolese functies kruisoperatie, zie Kruisoperatie

334 minimale som, zie Minimale som Shannonexpansie, 101 cofactoren, 101 complementering, 101 residufuncties, 101 tautologietest, 102 unaatheid, 103 Lettervorm, 36, 87, 91 Logische drempelspanningen, 4 Logische functies MSI aritmetische circuits, 62 busdrivers, 62 decoder, 62 multiplexer, 62, 134, 247 registers, 184 teller, 184, 248 SSI flipflops, 177 poorten, 58 ULM s, 134 VLSI geheugens, 185 processors, 192 Logische Synthese boolese netwerken, 125 meerniveau, 117 algebraïsche deling, 121 algoritme van Voith, 135 factorisatie, 119 kernen, 121 multiplexersynthese, 133, 134 spectrale technieken, 139 tweeniveau ESPRESSO, 110 circuitrealisaties, 117 Möbius-inversie, 31 Metastabiliteit, 182, 235 Microprocessors, 192 DSP s, 193 grafische, 193 microcontrollers, 192 Minimale som, 92 kubuslijsten, 107 tabelmethode, 95 Minterm, 36, 92 Ontwerpruimte, 2 Gajskidiagram, 2 gedragsbeschrijving, 3 Ontwerpstraject fysisch ontwerp technology mapping, 247 valideren, verifiëren en testen, 247 Ontwerptraject, 13, 75 bibliotheek, 74, 77, 79 modulegeneratoren, 79 decompostie en verfijning, 16 formalisering van gedragsbeschrijving, 14 fysisch ontwerp, 17 back annotation, 17, 75, 78 technology mapping, 17, 74 plaatsing en routering, 17 synthese, 16 valideren, verifiëren en testen, 18 LVS-verificatie, 18 Optioneel product, 88 Parallellisme pijplijnen, 187 Partiële ordening, 22, 49 tralie, 22, 48, 217 Poorten, 52 CMOS, 84 vertragingstijden, 157, 161, 162 Poortnetwerken algemenere interconnecties, 53 meerniveau, 87 synthese, 86, 87 teruggekoppeld, 157 analyse, zie Sequentiële netwerken TTD, zie Toestandstransitiediagram TTT, zie Toestandstransitietabel twee-niveau, som-van-producten, 86, 87 verband met Boolese vormen, 52 Poortnewerken verband met Boolese vormen, 155 RAM, 186 synchroon, 187 Schakelaars, 50 Schakelnetwerken, 50 combinatorisch, 154, 157 hazards, 147, 161,

335 poortnewerken, zie Poortnetwerken sequentieel, 154 taknetwerken, zie Taknetwerken terugkoppeling, 153 Sea of gates, 78 Sequentiële netwerken, 155 analyse, 157 fundamentele mode, 159, 164 Hamming-1-inputveranderingen, 159, 164 asynchroon, 165 flip-flop, 165 geheugencellen, 165 incrementele gedragsbeschrijving, 199, 200 MEALY versus MOORE, 156 outputfunctie, 156 reguliere uitdrukkingen, 157 synchroon, 165 datagedrag, 165 kloksignaal, 165 synthese, 199 toestand, 156 onstabiele, 156 stabiele, 156 totale, 156 toestandsassignatie, uit-r-assignaties, 224 afstandsmethode, 214 partitiemethode, 216 vermijden van races, 220 toestandsfunctie, 156 toestandsminimalisatie, 203 compatibele klassen, 208 compatibele koppels, 205, 208 kliekbedekking, 208 methode van Marcus, 208 onvolledig bepaalde tabellen, 206 volledig bepaalde tabellen, 206 Shannondecompositie, Shannonexpansie, 37, 48, 101 Stabiele partitie, 216 algoritme, 217 Structuur, 11 beschrijving EDIF, 78, 265 JEDEC, 75 circuitniveau, 11 logisch niveau, 12, 74 netlijst, 78 PMS-niveau, 12 RT-niveau, 12, 74 Synchroon ontwerp asynchrone inputs, 233 klokverschuiving, 179 ontwerpregels, 179 toelaatbaar klokgedrag, 182 Taknetwerken algemenere interconnecties, 53 connectiematrix, 55, 84, 150 serie-parallel, 51 systematische analyse, 55 transmissiematrix, 55 verband met Boolese vormen, 52 Tekstuele representaties, 243 ABEL, ALTERA, 74, 247 ISPS, 244 VHDL, 74, 77, 249 Ternaire interpretatie, 154, 163 detectie van hazards, 148, 161 Testen testvectoren, 75, 247 Toestandstransitiediagram, 159 Toestandstransitietabel, 159 eindtoestandentabel, 168 exitatietabel, 168 hazards combinatorisch, 147, 161 essentiële, 162 races, 161 ternaire analyse, zie Ternaire interpretatie, zie Ternaire interpretatie meervoudige overgangen, 161 Vertragingstijd inertiaalmodel, 4, 259 transportmodel, 4, 259 VHDL, 251 algemene structuur, 251 architecture, 251 entity, 251 datatypes, 251 parallellisme, 257 asserties,

336 blocks, 258 data-flow statements, 258 interagerende processen, 257 resolutiefunctie, 253, 258 signals, 256 attributes, 257 driver, 259 inertiaalvertraging, 259 transportvertraging, 259 simulatie, 250 structuurbeschrijving, 259 generics, 259 instantiëringen, 259 tijdsmodellering, 258 deltavertraging, 258 simulatietijd versus gesimuleerde tijd, 258 volgorde en tijdsloosheid,

Practica bij het vak. Inleiding tot de Elektrotechniek: Practicum 2 Analoge versus digitale signalen en hun overdracht

Practica bij het vak. Inleiding tot de Elektrotechniek: Practicum 2 Analoge versus digitale signalen en hun overdracht Elektronica en Informatiesystemen Practica bij het vak Inleiding tot de Elektrotechniek: Practicum 2 Analoge versus digitale signalen en hun overdracht door Prof. dr. ir. J. Van Campenhout ir. Sean Rul

Nadere informatie

Combinatorische schakelingen

Combinatorische schakelingen Practicum 1: Combinatorische schakelingen Groep A.6: Lennert Acke Pieter Schuddinck Kristof Vandoorne Steven Werbrouck Inhoudstabel 1. Doelstellingen... 2 2. Voorbereiding... 3 3. Hardware-practicum...

Nadere informatie

Hoofdstuk 6: Digitale signalen

Hoofdstuk 6: Digitale signalen Hoofdstuk 6: Digitale signalen 6. Algemeenheden Het decimale talstelsel is het meest gebruikte talstelsel om getallen voor te stellen. Hierin worden symbolen gebruikt ( t.e.m. 9 ) die ondubbelzinning de

Nadere informatie

HOOFDSTUK 6: Logische Schakelingen

HOOFDSTUK 6: Logische Schakelingen HOOFDSTUK 6: Logische Schakelingen 1. Inleiding combinatorisch vs. sequentieel gedrag gedrag v/e circuit = relatie tussen binaire waarden uit uitgangen en binaire waarden op ingangen combinatorisch gedrag

Nadere informatie

Labo digitale technieken

Labo digitale technieken .. Het gebied "elektronica" is reeds geruime tijd onderverdeeld in twee specialiteiten, namelijk de analoge en de digitale technieken. Binnen analoge schakelingen gebeurt de signaalverwerking met lineaire

Nadere informatie

Samenvatting Field programmabale gate arrays (FPGA s) Dynamische herconfiguratie.

Samenvatting Field programmabale gate arrays (FPGA s) Dynamische herconfiguratie. Samenvatting Field programmabale gate arrays (FPGA s) zijn heel aantrekkelijk als ontwerpplatform voor digitale systemen. FPGA s zijn geïntegreerde schakelingen die geprogrammeerd of geconfigureerd kunnen

Nadere informatie

Deel I Hoofdstuk 4: Modelleren van Toestand

Deel I Hoofdstuk 4: Modelleren van Toestand Deel I Hoofdstuk 4: Modelleren van Toestand 2005 Prof Dr. O. De Troyer Toestandsmodel pag. 1 Berichten of boodschappen OO is gebaseerd op hoe de reële wereld werkt 2005 Prof. Dr. O. De Troyer Toestandsmodel

Nadere informatie

Digitaal is een magisch woord

Digitaal is een magisch woord Digitaal is een magisch woord Hieronder leest u over digitale logica. De theorie en de praktijk. Dit werk moet nog uitgebreid worden met meer informatie over TTL, CMOS en varianten. Daarnaast kunnen de

Nadere informatie

1 Rekenen in eindige precisie

1 Rekenen in eindige precisie Rekenen in eindige precisie Een computer rekent per definitie met een eindige deelverzameling van getallen. In dit hoofdstuk bekijken we hoe dit binnen een computer is ingericht, en wat daarvan de gevolgen

Nadere informatie

math inside Model orde reductie

math inside Model orde reductie math inside Model orde reductie Model orde reductie Met het voortschrijden van de rekenkracht van computers en numerieke algoritmen is het mogelijk om steeds complexere problemen op te lossen. Was het

Nadere informatie

Overgangsverschijnselen

Overgangsverschijnselen Hoofdstuk 5 Overgangsverschijnselen Doelstellingen 1. Overgangsverschijnselen van RC en RL ketens kunnen uitleggen waarbij de wiskundige afleiding van ondergeschikt belang is Als we een condensator of

Nadere informatie

VERZAMELINGEN EN AFBEELDINGEN

VERZAMELINGEN EN AFBEELDINGEN I VERZAMELINGEN EN AFBEELDINGEN Het begrip verzameling kennen we uit het dagelijks leven: een bibliotheek bevat een verzameling van boeken, een museum een verzameling van kunstvoorwerpen. We kennen verzamelingen

Nadere informatie

Basisschakelingen en poorten in de CMOS technologie

Basisschakelingen en poorten in de CMOS technologie asisschakelingen en poorten in de CMOS technologie Jan Genoe KHLim Universitaire Campus, Gebouw -359 Diepenbeek www.khlim.be/~jgenoe In dit hoofdstuk bespreken we de basisschakelingen en poorten in de

Nadere informatie

HOOFDSTUK 7: Interconnectie

HOOFDSTUK 7: Interconnectie HOOFDSTUK 7: Interconnectie situering verbinding tuss compont schakeling elektrische netwerk signaal aan beide kant steeds idtiek => ge ruis => onmiddellijke overdracht fysische wereld beperking van lichtsnelheid

Nadere informatie

Vandaag. Uur 1: Differentiaalvergelijkingen Uur 2: Modellen

Vandaag. Uur 1: Differentiaalvergelijkingen Uur 2: Modellen Vandaag Uur 1: Differentiaalvergelijkingen Uur 2: Modellen Diferentiaalvergelijkingen Wiskundige beschrijving van dynamische processen Vergelijking voor y(t): grootheid die in de tijd varieert Voorbeelden:

Nadere informatie

Steeds betere benadering voor het getal π

Steeds betere benadering voor het getal π Wiskunde & Onderwijs 38ste jaargang (2012 Steeds betere benadering voor het getal π Koen De Naeghel Samenvatting. We bespreken een oplossing voor de (veralgemeende opgave Noot 4 uit Wiskunde & Onderwijs

Nadere informatie

Populaties beschrijven met kansmodellen

Populaties beschrijven met kansmodellen Populaties beschrijven met kansmodellen Prof. dr. Herman Callaert Deze tekst probeert, met voorbeelden, inzicht te geven in de manier waarop je in de statistiek populaties bestudeert. Dat doe je met kansmodellen.

Nadere informatie

De dynamica van een hertenpopulatie. Verslag 1 Modellen en Simulatie

De dynamica van een hertenpopulatie. Verslag 1 Modellen en Simulatie De dynamica van een hertenpopulatie Verslag Modellen en Simulatie 8 februari 04 Inleiding Om de groei van een populatie te beschrijven, kunnen vele verschillende modellen worden gebruikt, en welke meer

Nadere informatie

STEEDS BETERE BENADERING VOOR HET GETAL π

STEEDS BETERE BENADERING VOOR HET GETAL π STEEDS BETERE BENADERING VOOR HET GETAL KOEN DE NAEGHEL Samenvatting. We bespreken een oplossing voor de (veralgemeende) opgave Noot 4 uit Wiskunde & Onderwijs nr.139. Onze inspiratie halen we uit het

Nadere informatie

IJkingstoets Industrieel Ingenieur. Wiskundevragen

IJkingstoets Industrieel Ingenieur. Wiskundevragen IJkingstoets Industrieel Ingenieur Wiskundevragen juli 8 Deel. Basiskennis wiskunde Vraag Het gemiddelde van de getallen 7 4 6, en 4 is Vraag en g met voorschrift g() =. Waaraan is Beschouw de functie

Nadere informatie

Inhoud. Introductie tot de cursus

Inhoud. Introductie tot de cursus Inhoud Introductie tot de cursus 1 Inleiding 7 2 Voorkennis 7 3 Het cursusmateriaal 7 4 Structuur, symbolen en taalgebruik 8 5 De cursus bestuderen 9 6 Studiebegeleiding 10 7 Huiswerkopgaven 10 8 Het tentamen

Nadere informatie

2 Elementaire bewerkingen

2 Elementaire bewerkingen Hoofdstuk 2 Elementaire bewerkingen 19 2 Elementaire bewerkingen 1 BINAIRE GETALLEN In het vorige hoofdstuk heb je gezien dat rijen bits worden gebruikt om lettertekens, getallen, kleuren, geluid en video

Nadere informatie

Digitale systemen. Hoofdstuk 6. 6.1 De digitale regelaar

Digitale systemen. Hoofdstuk 6. 6.1 De digitale regelaar Hoofdstuk 6 Digitale systemen Doelstellingen 1. Weten dat digitale systemen andere stabiliteitsvoorwaarden hebben In deze tijd van digitalisatie is het gebruik van computers in regelkringen alom.denk maar

Nadere informatie

De overgang van een gelineariseerde schakeling naar signaalverwerkingsblok

De overgang van een gelineariseerde schakeling naar signaalverwerkingsblok De overgang van een gelineariseerde schakeling naar signaalverwerkingsblok Stefan Cosemans ([email protected]) http://homes.esat.kuleuven.be/~scoseman/basisschakelingen/ Voorwoord In deze

Nadere informatie

Projectieve Vlakken en Codes

Projectieve Vlakken en Codes Projectieve Vlakken en Codes 1. De Fanocode Foutdetecterende en foutverbeterende codes. Anna en Bart doen mee aan een spelprogramma voor koppels. De ene helft van de deelnemers krijgt elk een kaart waarop

Nadere informatie

Sequentiële Logica. Processoren 24 november 2014

Sequentiële Logica. Processoren 24 november 2014 Sequentiële Logica Processoren 24 november 2014 Inhoud Eindige automaten Schakelingen met geheugen Realisatie van eindige automaten Registers, schuifregisters, tellers, etc. Geheugen Herinnering van week

Nadere informatie

Uitleg van de Hough transformatie

Uitleg van de Hough transformatie Uitleg van de Hough transformatie Maarten M. Fokkinga, Joeri van Ruth Database groep, Fac. EWI, Universiteit Twente Versie van 17 mei 2005, 10:59 De Hough transformatie is een wiskundige techniek om een

Nadere informatie

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III Combinatorische Algoritmen: Binary Decision Diagrams, Deel III Sjoerd van Egmond LIACS, Leiden University, The Netherlands [email protected] 2 juni 2010 Samenvatting Deze notitie beschrijft een nederlandse

Nadere informatie

Verslag: Computer. Naam: Tyrone Ste Luce. Klas: M4B

Verslag: Computer. Naam: Tyrone Ste Luce. Klas: M4B Verslag: Computer Naam: Tyrone Ste Luce Klas: M4B Inhoud 1. Inleiding 2. Binaire taal 3. Besturingssysteem 4. Hardware 5. Cmos en Bios 6. De processor 7. Internet 1. Inleiding Wanneer is de computer uitgevonden?

Nadere informatie

Examenprogramma wiskunde D vwo

Examenprogramma wiskunde D vwo Examenprogramma wiskunde D vwo Het eindexamen Het eindexamen bestaat uit het schoolexamen. Het examenprogramma bestaat uit de volgende domeinen: Domein A Vaardigheden Domein B Kansrekening en statistiek

Nadere informatie

Bespreking Examen Analyse 1 (Augustus 2007)

Bespreking Examen Analyse 1 (Augustus 2007) Bespreking Examen Analyse 1 (Augustus 2007) Vooraf: Zoals het stilletjes aan een traditie is geworden, geef ik hier bedenkingen bij het examen van deze septemberzittijd. Ik zorg ervoor dat deze tekst op

Nadere informatie

LANDSEXAMEN VWO Het examenprogramma Het examenprogramma voor het commissie-examen Wiskunde D bestaat uit de volgende (sub)domeinen:

LANDSEXAMEN VWO Het examenprogramma Het examenprogramma voor het commissie-examen Wiskunde D bestaat uit de volgende (sub)domeinen: LANDSEXAMEN VWO 2017-2018 Examenprogramma WISKUNDE D (V.W.O. ) (nieuw programma) 1 Het eindexamen Wiskunde D kent slechts het commissie-examen. Er is voor wiskunde D dus geen centraal schriftelijk examen.

Nadere informatie

Helden van de wiskunde: L.E.J. Brouwer Brouwers visie vanuit een logica-informatica perspectief

Helden van de wiskunde: L.E.J. Brouwer Brouwers visie vanuit een logica-informatica perspectief Helden van de wiskunde: L.E.J. Brouwer Brouwers visie vanuit een logica-informatica perspectief Herman Geuvers Radboud Universiteit Nijmegen Technische Universiteit Eindhoven 1 Helden van de wiskunde:

Nadere informatie

Digitale Systemen (ET1 410)

Digitale Systemen (ET1 410) Digitale Systemen (ET1 410) Arjan van Genderen Stephan Wong Faculteit EWI Technische Universiteit Delft Cursus 2011 28-4-2011 EE1 410 (Stephan Wong) Pagina 1 Verschil simulatie en synthese Simulatie: functioneel

Nadere informatie

IJkingstoets Wiskunde-Informatica-Fysica juli 2018: algemene feedback

IJkingstoets Wiskunde-Informatica-Fysica juli 2018: algemene feedback IJkingstoets wiskunde-informatica-fysica juli 8 - reeks - p. IJkingstoets Wiskunde-Informatica-Fysica juli 8: algemene feedback Positionering ten opzichte van andere deelnemers In totaal namen 8 studenten

Nadere informatie

Referentieniveaus uitgelegd. 1S - rekenen Vaardigheden referentieniveau 1S rekenen. 1F - rekenen Vaardigheden referentieniveau 1F rekenen

Referentieniveaus uitgelegd. 1S - rekenen Vaardigheden referentieniveau 1S rekenen. 1F - rekenen Vaardigheden referentieniveau 1F rekenen Referentieniveaus uitgelegd De beschrijvingen zijn gebaseerd op het Referentiekader taal en rekenen'. In 'Referentieniveaus uitgelegd' zijn de niveaus voor de verschillende sectoren goed zichtbaar. Door

Nadere informatie

In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen.

In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen. Leerlijn programmeren In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen. Deze leerlijn is opgebouwd aan de

Nadere informatie

III.2 De ordening op R en ongelijkheden

III.2 De ordening op R en ongelijkheden III.2 De ordening op R en ongelijkheden In de vorige paragraaf hebben we axioma s gegeven voor de optelling en vermenigvuldiging in R, maar om R vast te leggen moeten we ook ongelijkheden in R beschouwen.

Nadere informatie

Fig. 5.1: Blokschema van de 555

Fig. 5.1: Blokschema van de 555 5 Timer IC 555 In de vorige drie hoofdstukken hebben we respectievelijk de Schmitt-trigger, de monostabiele en de astabiele multivibrator bestudeerd. Voor ieder van deze schakelingen bestaan in de verschillende

Nadere informatie

Getallensystemen, verzamelingen en relaties

Getallensystemen, verzamelingen en relaties Hoofdstuk 1 Getallensystemen, verzamelingen en relaties 1.1 Getallensystemen 1.1.1 De natuurlijke getallen N = {0, 1, 2, 3,...} N 0 = {1, 2, 3,...} 1.1.2 De gehele getallen Z = {..., 4, 3, 2, 1, 0, 1,

Nadere informatie

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c Een Minimaal Formalisme om te Programmeren We hebben gezien dat Turing machines beschouwd kunnen worden als universele computers. D.w.z. dat iedere berekening met natuurlijke getallen die met een computer

Nadere informatie

HOOFDSTUK 3: Netwerkanalyse

HOOFDSTUK 3: Netwerkanalyse HOOFDSTUK 3: Netwerkanalyse 1. Netwerkanalyse situering analyseren van het netwerk = achterhalen van werking, gegeven de opbouw 2 methoden manuele methode = reductie tot Thévenin- of Norton-circuit zeer

Nadere informatie

Oefening 4.3. Zoek een positief natuurlijk getal zodanig dat de helft een kwadraat is, een derde is een derdemacht en een vijfde is een vijfdemacht.

Oefening 4.3. Zoek een positief natuurlijk getal zodanig dat de helft een kwadraat is, een derde is een derdemacht en een vijfde is een vijfdemacht. 4 Modulair rekenen Oefening 4.1. Merk op dat 2 5 9 2 = 2592. Bestaat er een ander getal van de vorm 25ab dat gelijk is aan 2 5 a b? (Met 25ab bedoelen we een getal waarvan a het cijfer voor de tientallen

Nadere informatie

Sequentiële schakelingen

Sequentiële schakelingen Gebaseerd op geheugen elementen Worden opgedeeld in synchrone systemen» scheiding tussen wat er wordt opgeslagen (data) wanneer het wordt opgeslagen (klok) asynchrone systemen» Puls om geheugen op te zetten

Nadere informatie

WISKUNDE D VWO VAKINFORMATIE STAATSEXAMEN 2016 V15.7.0

WISKUNDE D VWO VAKINFORMATIE STAATSEXAMEN 2016 V15.7.0 WISKUNDE D VWO VAKINFORMATIE STAATSEAMEN 2016 V15.7.0 De vakinformatie in dit document is vastgesteld door het College voor Toetsen en Examens (CvTE). Het CvTE is verantwoordelijk voor de afname van de

Nadere informatie

Praktisch bestaan er enkele eenvoudige methoden om een decimaal getal om te zetten naar een binair getal. We bespreken hier de twee technieken.

Praktisch bestaan er enkele eenvoudige methoden om een decimaal getal om te zetten naar een binair getal. We bespreken hier de twee technieken. Talstelsels 1 Algemeenheden Digitale systemen werken met nullen en enen omdat dit elektronisch gemakkelijke te verwezenlijken is. De transistor kent enkel twee toestanden (geleiden of sperren) Hierdoor

Nadere informatie

V.2 Limieten van functies

V.2 Limieten van functies V.2 Limieten van functies Beschouw een deelverzameling D R, een functie f: D R en zij c R. We willen het gedrag van f in de buurt van c bestuderen. De functiewaarde in c is daarvoor niet belangrijk, de

Nadere informatie

Departement industriële wetenschappen en technologie

Departement industriële wetenschappen en technologie Departement industriële wetenschappen en technologie Universitaire Campus, gebouw B B-3590 DIEPENBEEK Tel.: 011-23 07 90 Fax: 011-23 07 99 Aansturen en testen van een hybride infrarood beeldopnemer Abstract

Nadere informatie

8. Complexiteit van algoritmen:

8. Complexiteit van algoritmen: 8. Complexiteit van algoritmen: Voorbeeld: Een gevaarlijk spel 1 Spelboom voor het wespenspel 2 8.1 Complexiteit 4 8.2 NP-problemen 6 8.3 De oplossing 7 8.4 Een vuistregel 8 In dit hoofdstuk wordt het

Nadere informatie

Klas : 5 Industriële ICT Herhalingsvragen reeks 1 PC-techniek

Klas : 5 Industriële ICT Herhalingsvragen reeks 1 PC-techniek Klas : 5 Industriële ICT Herhalingsvragen reeks 1 PC-techniek VTI St.- Laurentius Neem eerst de tekst in het boek door, doe dit enkele keren en probeer uiteraard te onthouden wat je leest. Los nadien de

Nadere informatie

ling van die eigenschap binnen het model geldt. In het bijzonder bij het wiskundig modelleren van een programma kan een eigenschap met wiskundige zeke

ling van die eigenschap binnen het model geldt. In het bijzonder bij het wiskundig modelleren van een programma kan een eigenschap met wiskundige zeke De Nederlandse samenvatting van een proefschrift is bij uitstek het onderdeel van het proefschrift dat door familie en vrienden wordt gelezen. Voor hen wil ik deze samenvatting dan ook schrijven als een

Nadere informatie

Machten, exponenten en logaritmen

Machten, exponenten en logaritmen Machten, eponenten en logaritmen Machten, eponenten en logaritmen Macht, eponent en grondtal Eponenten en logaritmen hebben alles met machtsverheffen te maken. Een macht als 4 is niets anders dan de herhaalde

Nadere informatie

Bouwstenen voor PSE. Datatypes en Datastructuren

Bouwstenen voor PSE. Datatypes en Datastructuren Bouwstenen voor PSE Datatypes en Datastructuren Definitie Datatype Klasse van dataobjecten tesamen met operaties om ze te construeren, te manipuleren en te verwijderen. Een datatype omvat een specificatie

Nadere informatie

Het warmteverlies van het lichaamsoppervlak aan de wordt gegeven door de volgende formule:

Het warmteverlies van het lichaamsoppervlak aan de wordt gegeven door de volgende formule: Opgave 1. (4 punten) Inleiding: Een vleermuis is een warmbloedig zoogdier. Dat wil zeggen dat hij zijn lichaamstemperatuur op een konstante waarde moet zien te houden. Als de omgeving kouder is dan de

Nadere informatie

Domein A: Vaardigheden

Domein A: Vaardigheden Examenprogramma Wiskunde A havo Het eindexamen bestaat uit het centraal examen en het schoolexamen. Het examenprogramma bestaat uit de volgende domeinen: Domein A Vaardigheden Domein B Algebra en tellen

Nadere informatie

Analoge en Digitale Elektronica

Analoge en Digitale Elektronica Analoge en Digitale Elektronica 14 september 2007 1 2 de zit 2006-2007 Bespreek het potentiaalverloop en de stroomcomponenten doorheen een PN junctie in ongepolariseerde toestand, bij voorwaartse polarisatie,

Nadere informatie

LANDSEXAMEN VWO Het examenprogramma Het examenprogramma voor het commissie-examen Wiskunde D bestaat uit de volgende (sub)domeinen:

LANDSEXAMEN VWO Het examenprogramma Het examenprogramma voor het commissie-examen Wiskunde D bestaat uit de volgende (sub)domeinen: LANDSEXAMEN VWO 2019-2020 Examenprogramma WISKUNDE D (V.W.O. ) 1 Het eindexamen Wiskunde D kent slechts het commissie-examen. Er is voor wiskunde D dus geen centraal schriftelijk examen. Het commissie-examen

Nadere informatie

Inleiding Digitale Techniek

Inleiding Digitale Techniek 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.

Nadere informatie

Theory DutchBE (Belgium) Niet-lineaire dynamica in elektrische schakelingen (10 punten)

Theory DutchBE (Belgium) Niet-lineaire dynamica in elektrische schakelingen (10 punten) Q2-1 Niet-lineaire dynamica in elektrische schakelingen (10 punten) Neem voor het begin van deze opgave de algemene instructies uit de aparte enveloppe door! Inleiding Bistabiele niet-lineaire halfgeleider

Nadere informatie

Schriftelijk examen 2e Ba Biologie Fysica: elektromagnetisme 2011-2012

Schriftelijk examen 2e Ba Biologie Fysica: elektromagnetisme 2011-2012 - Biologie Schriftelijk examen 2e Ba Biologie 2011-2012 Naam en studierichting: Aantal afgegeven bladen, deze opgaven niet meegerekend: Gebruik voor elke nieuwe vraag een nieuw blad. Zet op elk blad de

Nadere informatie

Digitale technieken Deeltoets II

Digitale technieken Deeltoets II Digitale technieken Deeltoets II André Deutz 11 januari, 2008 De opgaven kunnen uiteraard in een willekeurige volgorde gemaakt worden geef heel duidelijk aan op welke opgave een antwoord gegegeven wordt.

Nadere informatie

HOOFDSTUK VII REGRESSIE ANALYSE

HOOFDSTUK VII REGRESSIE ANALYSE HOOFDSTUK VII REGRESSIE ANALYSE 1 DOEL VAN REGRESSIE ANALYSE De relatie te bestuderen tussen een response variabele en een verzameling verklarende variabelen 1. LINEAIRE REGRESSIE Veronderstel dat gegevens

Nadere informatie

De Arduino-microcontroller in de motorvoertuigentechniek (2)

De Arduino-microcontroller in de motorvoertuigentechniek (2) De Arduino-microcontroller in de motorvoertuigentechniek (2) E. Gernaat (ISBN 978-90-79302-11-6) 1 Procescomputer 1.1 Microprocessoren algemeen De informatie-verwerking zoals is behandeld, is vrijwel geheel

Nadere informatie

3 De stelling van Kleene

3 De stelling van Kleene 18 3 De stelling van Kleene Definitie 3.1 Een formele taal heet regulier als hij wordt herkend door een deterministische eindige automaat. Talen van de vorm L(r) met r een reguliere expressie noemen we

Nadere informatie

Slimme schakelingen (2)

Slimme schakelingen (2) Slimme schakelingen (2) Technische informatica in de zorg Thijs Harleman Modulecode: TMGZ-AMAL23 23 februari 2015 1 Overzicht college Doel van dit college: Verdiepen van kennis en inzicht van het ontwerpen

Nadere informatie

Bekijk nog een keer het stelsel van twee vergelijkingen met twee onbekenden x en y: { De tweede vergelijking van de eerste aftrekken geeft:

Bekijk nog een keer het stelsel van twee vergelijkingen met twee onbekenden x en y: { De tweede vergelijking van de eerste aftrekken geeft: Determinanten Invoeren van het begrip determinant Bekijk nog een keer het stelsel van twee vergelijkingen met twee onbekenden x en y: { a x + b y = c a 2 a 2 x + b 2 y = c 2 a Dit levert op: { a a 2 x

Nadere informatie

Tentamen Elektronische Schakelingen (ET1205-D2)

Tentamen Elektronische Schakelingen (ET1205-D2) Vul op alle formulieren die je inlevert je naam en studienummer in. Tentamen Elektronische chakelingen (ET1205-2) atum: donderdag 30 augustus 2007 Tijd: 09.00 12.00 uur Naam: tudienummer: Cijfer Lees dit

Nadere informatie

Antwoorden vragen en opgaven Basismodule

Antwoorden vragen en opgaven Basismodule Antwoorden vragen en opgaven Basismodule Antwoorden van vragen en opgaven van hoofdstuk 1 1. Is elke combinatorische schakeling een digitale schakeling? Zo nee, waarom niet? Antwoord: Elke combinatorische

Nadere informatie

Hoofdstuk 5: Signaalverwerking

Hoofdstuk 5: Signaalverwerking Hoofdstuk 5: Signaalverwerking Natuurkunde VWO 2011/2012 www.lyceo.nl Hoofdstuk 5: Signaalverwerking Natuurkunde 1. Mechanica 2. Golven en straling 3. Elektriciteit en magnetisme 4. Warmteleer Rechtlijnige

Nadere informatie

Aanvullingen bij Hoofdstuk 8

Aanvullingen bij Hoofdstuk 8 Aanvullingen bij Hoofdstuk 8 8.5 Definities voor matrices De begrippen eigenwaarde eigenvector eigenruimte karakteristieke veelterm en diagonaliseerbaar worden ook gebruikt voor vierkante matrices los

Nadere informatie

Zomercursus Wiskunde. Module 4 Limieten en asymptoten van rationale functies (versie 22 augustus 2011)

Zomercursus Wiskunde. Module 4 Limieten en asymptoten van rationale functies (versie 22 augustus 2011) Katholieke Universiteit Leuven September 20 Module 4 Limieten en asymptoten van rationale functies (versie 22 augustus 20) Inhoudsopgave Rationale functies. Inleiding....................................2

Nadere informatie

Primitieve functie Als f : R --> R continu is op een interval, dan noemt men F : R --> R een primiteive functie of

Primitieve functie Als f : R --> R continu is op een interval, dan noemt men F : R --> R een primiteive functie of Enkelvoudige integralen Kernbegrippen Onbepaalde integralen Van onbepaalde naar bepaalde integraal Bepaalde integralen Integratiemethoden Standaardintegralen Integratie door splitsing Integratie door substitutie

Nadere informatie

2 Algemene opbouw van een computersysteem

2 Algemene opbouw van een computersysteem Procescomputer E. Gernaat 1 Microprocessoren algemeen Informatie-verwerking zoals behandeld is momenteel vrijwel geheel overgenomen door microprocessoren. Wanneer we voortborduren op het idee van combinatorische

Nadere informatie

Problemen herformuleren Leerlingen drukken de probleemstelling uit in eigen woorden.

Problemen herformuleren Leerlingen drukken de probleemstelling uit in eigen woorden. ACTIVITEITEN NAAM activiteit Leeftijdsgroep Markeer de optie. Tijdsduur: Vaardigheden computationeel denken Markeer de opties. Programmeren met Scratch 1 graad secundair onderwijs (12 14 jaar) > project

Nadere informatie

DEC SDR DSP project 2017 (2)

DEC SDR DSP project 2017 (2) DEC SDR DSP project 2017 (2) Inhoud: DSP software en rekenen Effect van type getallen (integer, float) Fundamenten onder DSP Lezen van eenvoudige DSP formules x[n] Lineariteit ( x functie y dus k maal

Nadere informatie

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel. Grafen Grafen Een graaf bestaat uit een verzameling punten (ook wel knopen, of in het engels vertices genoemd) en een verzameling kanten (edges) of pijlen (arcs), waarbij de kanten en pijlen tussen twee

Nadere informatie

VOOR HET SECUNDAIR ONDERWIJS. Kansmodellen. 3. Populatie en steekproef. Werktekst voor de leerling. Prof. dr. Herman Callaert

VOOR HET SECUNDAIR ONDERWIJS. Kansmodellen. 3. Populatie en steekproef. Werktekst voor de leerling. Prof. dr. Herman Callaert VOOR HET SECUNDAIR ONDERWIJS Kansmodellen. Werktekst voor de leerling Prof. dr. Herman Callaert Hans Bekaert Cecile Goethals Lies Provoost Marc Vancaudenberg . Populatie: een intuïtieve definitie.... Een

Nadere informatie

Fractale dimensie. Eline Sommereyns 6wwIi nr.9

Fractale dimensie. Eline Sommereyns 6wwIi nr.9 Fractale dimensie Eline Sommereyns 6wwIi nr.9 Inhoudstabel Inleiding... 3 Gehele dimensie... 4 Begrip dimensie... 4 Lengte, breedte, hoogte... 4 Tijd-ruimte... 4 Fractale dimensie... 5 Fractalen... 5 Wat?...

Nadere informatie

2. Syntaxis en semantiek

2. Syntaxis en semantiek 2. Syntaxis en semantiek In dit hoofdstuk worden de begrippen syntaxis en semantiek behandeld. Verder gaan we in op de fouten die hierin gemaakt kunnen worden en waarom dit in de algoritmiek zo desastreus

Nadere informatie

Materialen in de elektronica Verslag Practicum 1

Materialen in de elektronica Verslag Practicum 1 Materialen in de elektronica Verslag Practicum 1 Academiejaar 2014-2015 Groep 2 Sander Cornelis Stijn Cuyvers In dit practicum zullen we de diëlektrische eigenschappen van een vloeibaar kristal bepalen.

Nadere informatie

Onderwijsbehoeften: - Korte instructie - Afhankelijk van de resultaten Test jezelf toevoegen Toepassing en Verdieping

Onderwijsbehoeften: - Korte instructie - Afhankelijk van de resultaten Test jezelf toevoegen Toepassing en Verdieping Verdiepend Basisarrange ment Naam leerlingen Groep BBL 1 Wiskunde Leertijd; 5 keer per week 45 minuten werken aan de basisdoelen. - 5 keer per week 45 minuten basisdoelen toepassen in verdiepende contexten.

Nadere informatie

Gaap, ja, nog een keer. In één variabele hebben we deze formule nu al een paar keer gezien:

Gaap, ja, nog een keer. In één variabele hebben we deze formule nu al een paar keer gezien: Van de opgaven met een letter en dus zonder nummer staat het antwoord achterin. De vragen met een nummer behoren tot het huiswerk. Spieken achterin helpt je niets in het beter snappen... 1 Stelling van

Nadere informatie

Hoofdstuk 4: Ontwerpen van combinatorische schakelingen Nand - nor logica

Hoofdstuk 4: Ontwerpen van combinatorische schakelingen Nand - nor logica Hoofdstuk 4: Ontwerpen van combinatorische schakelingen Nand - nor logica Na de geziene leerstof zijn we stilaan in staat om praktisch toepasbare digitale schakelingen de ontwerpen en te realiseren. ij

Nadere informatie

Opdracht week 4 INLDIG 1

Opdracht week 4 INLDIG 1 Opdracht week 4 Binair-naar-BCD omzetting Inleiding In de digitale techniek worden getallen opgeslagen in het binaire talstelsel. Rekenschakelingen zijn zo eenvoudig te ontwerpen. Helaas is het aflezen

Nadere informatie

Van Poort tot Pipeline. Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam

Van Poort tot Pipeline. Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam Van Poort tot Pipeline Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam Van Poort tot Pipeline Pipeline processor One cycle machine Calculator File of registers Assembly

Nadere informatie

Deeltoets Digitale technieken

Deeltoets Digitale technieken Deeltoets Digitale technieken André Deutz 22 oktober, 2007 De opgaven kunnen uiteraard in een willekeurige volgorde gemaakt worden geef heel duidelijk aan op welke opgave een antwoord gegegeven wordt.

Nadere informatie

Zomercursus Wiskunde. Katholieke Universiteit Leuven Groep Wetenschap & Technologie. September 2008

Zomercursus Wiskunde. Katholieke Universiteit Leuven Groep Wetenschap & Technologie. September 2008 Katholieke Universiteit Leuven September 2008 Limieten en asymptoten van rationale functies (versie juli 2008) Rationale functies. Inleiding Functies als f : 5 5, f 2 : 2 3 + 2 f 3 : 32 + 7 4 en f 4 :

Nadere informatie

Combinatorisch tegenover sequentieel

Combinatorisch tegenover sequentieel PBa ELO/ICT Combinatorisch tegenover sequentieel soorten digitale schakelingen : combinatorisch of sequentieel combinatorische schakelingen combinatie van (al dan niet verschillende) (basis)poorten toestand

Nadere informatie

Ijkingstoets industrieel ingenieur UGent/VUB, september 2015

Ijkingstoets industrieel ingenieur UGent/VUB, september 2015 IJkingstoets 4 september 05 - reeks - p. /0 Ijkingstoets industrieel ingenieur UGent/VUB, september 05 Oefening De evolutie van een bepaalde radioactieve stof in de tijd volgt het wiskundig model N (t)

Nadere informatie

Hoofdstuk5. 1 Hoofdstuk5: Praktische realisatie van logische schakelingen. Peter Slaets () Digitale en analoge technieken October 6, 2005 1 / 19

Hoofdstuk5. 1 Hoofdstuk5: Praktische realisatie van logische schakelingen. Peter Slaets () Digitale en analoge technieken October 6, 2005 1 / 19 Hoofdstuk5 1 Hoofdstuk5: Praktische realisatie van logische schakelingen Inleiding Bestaande poortschakelingen Hoog- en laagactieve signalen Poorten en hun waarheidstabel Praktische realisaties Ingangsschakelingen

Nadere informatie

Oefening 4.3. Zoek een positief natuurlijk getal zodanig dat de helft een kwadraat is, een derde is een derdemacht en een vijfde is een vijfdemacht.

Oefening 4.3. Zoek een positief natuurlijk getal zodanig dat de helft een kwadraat is, een derde is een derdemacht en een vijfde is een vijfdemacht. 4 Modulair rekenen Oefening 4.1. Merk op dat 2 5 9 2 2592. Bestaat er een ander getal van de vorm 25ab dat gelijk is aan 2 5 a b? (Met 25ab bedoelen we een getal waarvan a het cijfer voor de tientallen

Nadere informatie

II. ZELFGEDEFINIEERDE FUNCTIES

II. ZELFGEDEFINIEERDE FUNCTIES II. ZELFGEDEFINIEERDE FUNCTIES In Excel bestaat reeds een uitgebreide reeks van functies zoals SOM, GEMIDDELDE, AFRONDEN, NU enz. Het is de bedoeling om functies aan deze lijst toe te voegen door in Visual

Nadere informatie