Elektronica en Informatiesystemen
Digitale Elektronica
door
Prof. dr. ir. J. Van Campenhout
Syllabus bij de gelijknamige Cursus Academiejaar 2004—2005
Inhoudsopgave 1
2
3
De ontwerpruimte van digitale schakelingen 1.1 De ontwerpruimte . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 De gedragshi¨erarchie . . . . . . . . . . . . . . . . . . 1.1.2 Structuurbeschrijvingen . . . . . . . . . . . . . . . . 1.1.3 Fysische beschrijvingen: de verpakkingshi¨erarchie 1.2 Het Ontwerptraject . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Formalisering . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Decompositie, abstractie en verfijning . . . . . . . . 1.2.3 Synthese en analyse . . . . . . . . . . . . . . . . . . 1.2.4 Fysisch ontwerp: generatie en extractie . . . . . . . 1.2.5 Valideren, verifi¨eren en testen . . . . . . . . . . . . . Systeemmodellen op logisch niveau 2.1 Boole-algebra’s . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Onmiddellijke eigenschappen . . . . . . . . . . . 2.1.2 Een alternatieve definitie gebaseerd op ordening 2.1.3 Andere eigenschappen . . . . . . . . . . . . . . . 2.2 Boolese functies . . . . . . . . . . . . . . . . . . . . . . . 2.3 Representaties van Boolese functies . . . . . . . . . . . . 2.3.1 Grafische representaties . . . . . . . . . . . . . . 2.3.2 Basisfuncties voor Boolese functies . . . . . . . . 2.3.3 Tekstuele representaties: Boolese vormen . . . . 2.3.4 Ternaire representaties van Boolese SVP-vormen 2.3.5 Boolese decisiediagrammen of BDD’s . . . . . . 2.4 Opgaven . . . . . . . . . . . . . . . . . . . . . . . . . . . Combinatorische schakelingen en hun bouwstenen 3.1 De relatie tussen Boolese vormen en schakelnetwerken 3.1.1 Modellen van schakelaars . . . . . . . . . . . . . 3.1.2 Modellen van poorten en poortnetwerken . . . 3.1.3 Andere interconnecties . . . . . . . . . . . . . . . 3.2 Boolese matrices en de analyse van taknetwerken . . . 3.3 Bouwstenen voor combinatorisch ontwerp . . . . . . . 3.3.1 Standaardcomponenten . . . . . . . . . . . . . . 3.3.2 Programmeerbare componenten . . . . . . . . . 3.3.3 ASIC-bouwstenen . . . . . . . . . . . . . . . . . 3.4 Opgaven . . . . . . . . . . . . . . . . . . . . . . . . . . .
i
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
2 2 3 11 13 13 14 16 16 17 18
. . . . . . . . . . . .
20 20 21 21 22 23 24 25 26 31 40 40 47
. . . . . . . . . .
50 50 50 52 53 55 57 58 63 76 84
4
5
6
7
Synthese van combinatorische schakelingen 4.1 Tweenineausynthese . . . . . . . . . . . . . . . 4.1.1 Algebra¨ısche minimalisatie . . . . . . . 4.1.2 Implicantenmethoden . . . . . . . . . . 4.1.3 Topologische methoden . . . . . . . . . 4.1.4 Heuristische Minimalisatie: ESPRESSO 4.1.5 Circuitrealisaties . . . . . . . . . . . . . 4.2 Meerniveausynthese . . . . . . . . . . . . . . . 4.2.1 Concept en Motivering . . . . . . . . . . 4.2.2 Factorisatie . . . . . . . . . . . . . . . . 4.2.3 Realisaties van functies . . . . . . . . . 4.2.4 Een wat groter voorbeeld . . . . . . . . 4.2.5 ULM’s en Multiplexersynthese . . . . . 4.2.6 Spectrale Technieken . . . . . . . . . . . 4.3 Combinatorische hazards . . . . . . . . . . . . 4.4 Opgaven . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
86 87 88 91 99 110 117 117 117 119 123 129 134 140 147 148
Analyse van Sequenti¨ele Netwerken 5.1 Terugkoppelingen in schakelnetwerken . . . . . . . 5.2 Het wiskundig model van sequenti¨ele netwerken . 5.3 Analyse van poortnetwerken met terugkoppelingen 5.4 Afwijkingen van het voorspeld gedrag . . . . . . . . 5.4.1 Races en meervoudige overgangen . . . . . . 5.4.2 Combinatorische hazards . . . . . . . . . . . 5.4.3 Essenti¨ele hazards . . . . . . . . . . . . . . . 5.4.4 Ternaire analyse . . . . . . . . . . . . . . . . . 5.4.5 Een korte samenvatting . . . . . . . . . . . . 5.5 Geheugencellen . . . . . . . . . . . . . . . . . . . . . 5.6 Analyse van poortnetwerken met geheugencellen . 5.7 Opgaven . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
153 153 155 157 161 161 161 162 163 164 165 166 168
. . . . .
177 177 177 184 185 195
Sequenti¨ele schakelingen en hun bouwstenen 6.1 Standaardcomponenten . . . . . . . . . . . . . 6.1.1 Sequenti¨ele SSI-componenten . . . . . . 6.1.2 Sequenti¨ele MSI-componenten. . . . . . 6.1.3 Sequenti¨ele LSI- en VLSI-componenten 6.2 Programmeerbare componenten . . . . . . . .
. . . . . . . . . . . . . . .
. . . . .
. . . . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Sequenti¨ele synthese op logisch niveau 7.1 Incrementele gedragsbeschrijvingen . . . . . . . . . . . . . . . . . . . . . . 7.2 Het minimaliseren van het aantal toestanden . . . . . . . . . . . . . . . . . 7.3 De assignatie van toestanden aan binaire geheugencellen . . . . . . . . . . 7.4 Toestandsassignatie in synchrone netwerken . . . . . . . . . . . . . . . . . 7.5 Toestandsassignatie in asynchrone netwerken . . . . . . . . . . . . . . . . . 7.6 Compositie en decompositie van synchrone automaten . . . . . . . . . . . 7.6.1 Cascade- en paralleldecompositie . . . . . . . . . . . . . . . . . . . 7.6.2 Compositieregels voor synchrone automaten: synchrone interconnecties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ii
199 200 203 213 214 220 225 225 230
7.7
7.8
Asynchrone interconnecties en aansturingen . 7.7.1 Asynchrone interconnecties . . . . . . . 7.7.2 Synchronisatieflipflops en -protocollen Opgaven . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . .
A Concrete representatievormen voor digitale systemen 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 . . . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
. . . . . . . . . .
. . . .
233 233 234 237
. . . . . . . . . .
243 243 244 247 249 260 260 262 263 264 265
B Chipverpakkingen
266
C Enkele aanvullingen op circuitniveau: CMOS, flipflops en interconnectie 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 . . . . . . . . . . . . . . . . . . .
. . . . . . . . . .
272 272 272 278 278 281 282 284 288 289 295
. . . .
301 301 303 315 321
D Maple-fragmenten en - voorbeelden D.1 Representaties in Maple . . . . . . . . . . D.2 Combinatorische minimalisatie in Maple D.3 Sequenti¨ele analyse in Maple . . . . . . . D.4 Sequenti¨ele synthese in Maple . . . . . . .
iii
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . . . . .
. . . .
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¨evolueerd 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 e´ e´ 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 2003
1
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¨erarchie. In elk van de beschrijvingsdimensies heeft men een vorm van hi¨erarchie 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¨erarchie exploreren in de drie dimensies van het Y-diagram. 2
Figuur 1.1: De ontwerpruimte: Gajski’s Y-diagram
1.1.1
De gedragshi¨erarchie
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 e´ e´ n input precies e´ e´ 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 aanscha¨ kelen van het apparaat nemen deze grootheden waarden aan in een continuum, voor ¨ beschouwd wordt. elke waarde van de tijd die ook als continuum Input/outputrelaties. Om het gedrag van een circuit te beschrijven op dit niveau moet men in het algemeen (niet-lineaire en/of parti¨ele) 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
outputs zijn dan eindige1 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¨ele 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 IL = [0, VIL ] en IH = [(VIH , Vcc ], 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¨eel 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 e´ e´ 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
5V
Vcc
4.44
VOH
3.5
VIH
5V
Vcc
3.3 V 2.5
1.5
Vt
VIL
2.4
VOH
2.4
2.0
VIH
2.0
1.5
Vt
1.5
0.8 0.5
VOL
0
GND
5V CMOS HC, AHC,AC
0.8
Vcc VOH VIH Vt
0.4
VIL VOL
0.4
VIL VOL
0
GND
0
GND
5V TTL Standaard TTL ABT, AHCT, HCT
LVTTL LVT, LVC, ALVC LV, ALVT
2.5 V 2.2
Vcc VOH
1.7
VIH
1.2
Vt
0.7
VIL
0.2 0
VOL GND
2.5V CMOS ALVC, ALVT
Figuur 1.2: De ligging van de logische niveaus in moderne discrete logische families (TTL en CMOS). Vt =drempelspanning, VIL = maximale spanning aan de ingang die herkend wordt als een ’L’, VOL = maximale spanning aan de uitgang bij een ’L’,VIH = minimale spanning aan de ingang die herkend wordt als een ’H’,VOH = 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 ≤ tp ≤ 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
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 gekoppeld2 . 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 tp 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¨eren 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) 6= α 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
Poortmodel exitatie X(t)
ideale poort
output x(t)
delay
td 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) 6= α ∈ {L, H} voor τ ≤ t < τ +D, dan moet er een τ˜ bestaan, met τ˜ < τ +D, zodanig dat y(t) 6= α 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
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) ti , 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
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 e´ e´ 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¨ele) 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¨ele 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¨ele 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 tempore3
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
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 e´ e´ 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¨ente 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 beschrijvingen5 ) 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 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. 5
10
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 ´ of na een andere gebeurtenis komt. De precieze duur van de operatie (het aantal vo´ or 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¨ele 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¨ele 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 e´ e´ 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).
1.1.2
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¨erarchische lagen uit de logische structuur, die goed overeenkomen met de lagen uit de gedragshi¨erarchie. Figuur 1.5 geeft een beeld van deze hi¨erarchie. 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
Figuur 1.5: Een visueel beeld van de logische structuurhi¨erarchie
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´en 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
1.1.3
Fysische beschrijvingen: de verpakkingshi¨erarchie
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¨erarchie is lang niet zo duidelijk en welgedefinieerd als tussen de logische structuurhi¨erarchie en de gedragshi¨erarchie. Dit komt omdat de constante en snelle evolutie van de integratietechniek ervoor gezorgd heeft dat steeds grotere systemen (of systeemonderdelen) op e´ e´ 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¨erarchie waarop de chipgrens zich bevindt in de verpakkingshi¨erarchie. 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 e´ e´ 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¨eigende 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
Figuur 1.6: Het ontwerptraject
1.2.1
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 e´ e´ 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
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 si 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 ´ geldige output O: I = {s1 , . . . , sn }, bestaat er precies e´ en O = min{s1 , . . . , sn }, 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
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¨erarchisch 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¨erarchie 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¨erarchisch 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¨ele 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.
1.2.3
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
ti¨ele 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.
1.2.4
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¨eren 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¨erarchische 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
1.2.5
Valideren, verifi¨eren 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 formalisering7 . 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 e´ e´ 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¨eren. Verifi¨eren is een verzamelterm voor het nagaan van de correctheid van een vertalingsstap uit de ontwerpshi¨erachie, 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¨eren. 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
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
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 = {b1 , . . . , bm } 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 x0 waarvoor geldt x+x0 = 1 en x·x0 = 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
• Voor een eindige verzameling S noteren wij met P(S) de verzameling van alle deelverzamelingen van S (de machtsverzameling, eveneens eindig). Dan is < P(S), ∪, ∩, ∅, S > een Boole-algebra. • Weze B = {0, 1} . Dan is B1 =< {0, 1}, +, ·, 0, 1 > een Boole-algebra, de binaire Boolese algebra. De definitie van +, ·, en 0 volgt rechtstreeks uit definitie 2.1. • Weze B = {0, 1}n . Dan is Bn =< {0, 1}n , +, ·, 0n , 1n > een Boole-algebra. De operaties +, · en 0 zijn de componentsgewijze uitbreiding van de operaties in B1 .
2.1.1
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. 00 = 1 en 10 = 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. a0
is uniek (Uniciteit van invers);
9. (a0 )0 = a; 10. (a + b)0 = a0 · b0
(Stelling van De Morgan);
11. (a · b)0 = a0 + b0
(Stelling van De Morgan);
12. a + a0 · b = a + b; 13. a · (a0 + b) = a · b.
2.1.2
Een alternatieve definitie gebaseerd op ordening
Men kan een Boole-algebra over een verzameling B ook defini¨eren op basis van een ordening van de elementen van B. Een binaire relatie op B is een parti¨ele 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
Koppels x, y die niet tot behoren zijn niet vergelijkbaar. Zo kan men b.v. in Bn de elementen componentsgewijze ordenen: weze x = (x1 , . . . , xn ) en x0 = (x01 , . . . , x0n ) elementen van Bn . We hebben dan dat x x0 indien xi ≤ x0i ∀i. Men kan dus zeggen dat (0010) (0110), maar (0010) en (0100) zijn niet vergelijkbaar. Hoewel dus slechts partieel is hebben x en x0 wel steeds een gemeenschappelijke grootste ondergrens glb(x, x0 ) en een kleinste bovengrens lub(x, x0 ) in Bn . 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¨eren 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 bmax en bmin kunnen gevonden worden in B heet de tralie begrensd. Wanneer tenslotte voor elk element b ∈ B een ander element b0 ∈ B kan gevonden worden waarvoor geldt dat bmax = b + b0 = lub(b, b0 ) en bmin = b · b0 = glb(b, b0 ) 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¨ele ordening , gedefinieerd door de operaties + en ·. Bijvoorbeeld, in de algebra < P(S), ∪, ∩, ∅, S > is de natuurlijke ordening de setinclusie ⊆; in Bn =< {0, 1}n , +, ·,0 , 0n , 1n > is het de componentsgewijze ordening hierboven beschreven.
2.1.3
Andere eigenschappen
Dualiteit Zowel de definitie van een Boole-algebra, als de eigenschappen die eruit volgen, bezitten een kenmerkende dualiteit onder de afbeelding + 7→ · · → 7 + d 0 → 7 1 1 7→ 0
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
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 e´ e´ n enkele eindige Boole-algebra bestuderen. Atomen van Boole-algebra’s Definitie 2.2 (Atomen van een Boole-algebra) Een element x 6= 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 e´ e´ n element. Een Boole-algebra met 2n 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 2n 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 (x1 , . . . , xn ) van n Boolese veranderlijken is een afbeelding van B n op B: f (x1 , . . . , xn ) : 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 n functies van n binaire variabelen 22 bedraagt. Definitie 2.4 De verzameling {0, 1}n → {0, 1} van alle binaire Boolese functies van n binaire variabelen noemen wij Fn .
23
In Fn kunnen wij ook interne samenstellingswetten + en · defini¨eren op de volgende wijze. Definitie 2.5 Weze g, f ∈ Fn . De functiesom h(·) = (f + g)(·) wordt gegeven door (
h(x1 , . . . , xn ) =
0, als g(x1 , . . . , xn ) = 0 en f (x1 , . . . , xn ) = 0 1, in alle andere gevallen.
Het functieproduct h(·) = (f · g)(·) wordt gegeven door (
h(x1 , . . . , xn ) =
1, als f (x1 , . . . , xn ) = 1 en g(x1 , . . . , xn ) = 1 0, in alle andere gevallen.
Definitie 2.6 De nulfunctie f0 en de e´ e´ nfunctie f1 worden gedefinieerd als f0 (x1 , . . . , xn ) = 0 , ∀(x1 , . . . , xn ) ∈ {0, 1}n f1 (x1 , . . . , xn ) = 1 , ∀(x1 , . . . , xn ) ∈ {0, 1}n Wij zullen f0 (x1 , . . . , xn ) ook schrijven als 0, en f1 (x1 , . . . , xn ) als 1. Uit definities 2.5 t.e.m. 2.6 volgt dat Fn =< Fn , +, ·, f0 , f1 > een Boole-algebra is (bewijs dit). Wat is de natuurlijke ordening op Fn ? Definitie 2.7 Het gewicht van een functie f (x1 , . . . , xn ) is het aantal waarden van (x1 , . . . , xn ) ∈ {0, 1}n waarvoor f (x1 , . . . , xn ) = 1. Een functie f (x1 , . . . , xn ) is monotoon (niet-dalend) als (x1 , . . . , xn ) ≤ (y1 , . . . , yn ) ⇒ f (x1 , . . . , xn ) ≤ f (y1 , . . . , yn ). Een functie f (x1 , . . . , xn ) is symmetrisch als f (x1 , . . . , xn ) = 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¨ele 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 representatien lengte moet hebben die exponentieel groeit in n. De reden hiervoor is dat er 2(2 ) objecten moeten kunnen gerepresenteerd worden met een eindig alfabet; dit vraagt nu eenmaal namen met een gemiddelde lengte van O(2n ). Wat er echter wel zo is dat, afhankelijk van het soort representatie, ’eenvoudige’ of ’veel voorkomende’ functies een beduidend kortere representatie hebben. 24
x1 x2 x3
f (x1 , x2 , x3 )
000 001 010 011 100 101 110 111
1 0 1 0 0 0 1 1
Figuur 2.1: De waarheidstabel van een Boolese functie
• De toegankelijkheid van de representatie. Een representatie is des te beter naarmate zij de essenti¨ele 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.
2.3.1
Grafische representaties
De waarheidstabel Deze representatie is een tabel waarvan de linkerkolom bestaat uit de 2n mogelijke elementen van {0, 1}n , lexicografisch geordend. De rechterkolom bevat de functiewaarde f (x1 , . . . , xn ) voor dat element (fig. 2.1). Noteer dat deze representatie een lengte heeft die groeit als n2n (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 (x1 , . . . , xn ) beschouwen als de coordinaten van een punt in de n-din n mensionale ruimte, zien wij dat de 2 elementen uit {0, 1} de hoekpunten voorstellen van een n-dimensionale kubus met zijde 1. Een functie f (x1 , . . . , xn ) 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 natuur¨ lijke ordening, en dat de coordinaten van verbonden hoekpunten slechts in e´ e´ n positie verschillen. 25
1(111)
0(011)
XXX X1(110) XXX X1(010)
0(101)
0(001)
XXX X0(100) XXX X1(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 (x1 , . . . , xn ) en (y1 , . . . , yn ) 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 (x1 , . . . , xn ) en (y1 , . . . , yn ) 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 2n . 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.
2.3.2
Basisfuncties voor Boolese functies
Daar Fn een Boole-algebra is, geldt dat elke functie in Fn kan geschreven worden als het resultaat van een binaire operatie (+ of ·) tussen twee functies uit Fn . 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
1(000)
1(010)
1(110)
0(100)
0(001)
0(011)
1(111)
0(101)
x1 x3
1
1
1
0
0
0
1
0
x2
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 Fn . Het zijn de 2n functies met gewicht 1 (zie def. 2.7). D.w.z., een mintermfunctie m(·) wordt volledig beschreven door die ene waarde van (x1 , . . . , xn ) ∈ {0, 1}n waarvoor m(x1 , . . . , xn ) = 1. Er zijn 2n mintermfuncties in Fn (waarom?). Een eenvoudige naamgeving van de mintermfuncties kan verkregen worden door de combinaties (x1 , . . . , xn ) af te beelden op de gehele getallen als volgt : ν : {0, 1}n → {0, 1, . . . , 2n − 1} met ν(x1 , . . . , xn ) = ni=1 xi 2n−i , waarin xi 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 ≤ 2n − 1, is niets anders dan de binaire representatie van i. De 2n mintermfuncties m0 , . . . , m2n −1 kunnen dan worden benoemd als volgt : P
(
mk (x1 , . . . , xn ) =
1, als ν(x1 , . . . , xn ) = k 0, anders.
De mintermfuncties vormen een complete basis voor Fn , 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
Bewijs.
Volgt onmiddellijk uit stelling 2.2.
Voorbeeld 2.2 Voorbeeld van mintermcompositie. Beschouw de functie f als gedefinieerd door haar waarheidstabel x1 x2 x3
ν(x1 , x2 , x3 ) f (x1 , x2 , x3 )
000 001 010 011 100 101 110 111
0 1 2 3 4 5 6 7
1 0 1 0 0 0 1 1
De mintermfunctierepresentatie is f (x1 , x2 , x3 ) = (m0 + m2 + m6 + m7 )(x1 , x2 , x3 ). P Meestal wordt deze notatie ingekort tot f = (0, 2, 6, 7). Noteer dat deze notatie niet steeds een ¨ lengte heeft in n. exponentiele
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¨ele functies kan men ook representaties uitdenken in termen van een ander orthonormaal stel basisfuncties, zoals b.v. de re¨ele 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: T0 T1
Tn
= [1] "
1 1 1 −1
"
T n−1 T n−1 T n−1 −T n−1
=
=
"
=
T n−1
⊗
#
1 1 1 −1
#
#
= T n−1 ⊗ T.
Hierin zijn 1 en −1 gehele getallen en is ⊗ het Kronecker-produkt. Noteer dat T n dimensie 2n × 2n 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: ( n −1 2X 2n , j = l tjk tlk = 0, in alle andere gevallen. k=0 28
De matrix T n is inverteerbaar, en men kan nagaan dat (T n )−1 = 2−n T n . n De Hadamard-matrix definieert een transformatie op {0, 1}2 : n
n
T n : {0, 1}2 7→ Z 2 , n
d.w.z. ook op de waarheidstabellen van functies uit Fn . Weze fb ∈ {0, 1}2 de waarheidstabel van f (x1 , . . . , xn ), gerepresenteerd als kolommatrix. De Hadamard-transformatie van fb wordt dan gegeven door fH = T n fb , eveneens een kolommatrix, maar met gehele elementen. De getallenrij fH is een unieke representatie van f (x1 , . . . , xn ). Elk element uit fH zegt echter iets over het globale gedrag van f (x1 , . . . , xn ) op {0, 1}n , en niet het lokale gedrag zoals vastgelegd door de mintermfuncties. Wanneer men de betekenis van de co¨effici¨enten van fH nauwkeuriger onderzoekt, dan vindt men dat zij kunnen ge¨ınterpreteerd worden als de gelijkenis (correlatie) van de functie f (x1 , . . . , xn ) met respectievelijk de volgende functies (de notatie wordt verderop geformaliseerd): 1 de ‘DC-term’, het gewicht van f 1 ⊕ x3 de functie die 1 is wanneer x3 = 0 is 1 ⊕ x2 1 ⊕ x3 ⊕x2 de functie die 1 is wanneer x2 = x3 1 ⊕ x1 1 ⊕ x1 ⊕x1 1 ⊕ x2 ⊕x1 1 ⊕ x1 ⊕x2 ⊕x3 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 Bn kunnen wij de operatie ⊕, die wij al eerder tegenkwamen, defini¨eren als volgt: x ⊕ y = x0 · y + x · y 0 . Met deze definitie van ⊕ wordt Bn een eindige, commutatieve groep met 0 als eenheidselement. Het interessante hieraan is dat, onder ⊕ inversen2 bestaan. Dit wil zeggen: ∀x∃x0 : x ⊕ x0 = 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
fH
=
1 1 1 1 1 1 1 1
1 −1 1 −1 1 −1 1 −1
1 1 −1 −1 1 1 −1 −1
1 −1 −1 1 1 −1 −1 1
1 1 1 1 −1 −1 −1 −1
1 −1 1 −1 −1 1 −1 1
1 1 −1 −1 −1 −1 1 1
1 −1 −1 1 −1 1 1 −1
1 0 1 0 0 0 1 1
=
4 2 −2 0 0 2 2 0
1 1 ⊕ x3 1 ⊕ x2 1 ⊕ x3 ⊕x2 1 ⊕ x1 1 ⊕ x1 ⊕x1 1 ⊕ x2 ⊕x1 1 ⊕ x1 ⊕x2 ⊕x3
Figuur 2.4: De Hadamard-matrix en de hadamard-transformatie van de functie f (x1 , x2 , x3 ) = P (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 = ν(y1 , y2 , . . . , yn ) zoals hierboven gedefinieerd, de verzameling Si = {k : yk = 1} overeenkomen. Si is dus niets anders dan de verzameling van posities waar de binaire representatie van i een 1 heeft. De basisfuncties gi worden dan gegeven door3 Y xj , i = 0, 1, . . . , 2n − 1. gi (x1 , . . . , xn ) = j∈Si
Men gebruikt als basisfuncties dus de 2n produkten van mogelijke deelverzamelingen Si van de variabelen {x1 , x2 , . . . , xn }. De representatiestelling luidt dan als volgt: elke functie f (x1 , . . . , xn ) kan op een unieke wijze geschreven worden als: =
n −1 2M
Ci gi (x1 , . . . , xn ) =
i=0
n −1 2M
Ci
i=0
Y
xj ,
j∈Si
waarbij de som nu staat voor de n-aire uitbreiding van ⊕, en waarbij Ci ∈ {0, 1}. De basisfuncties zijn dus niet de mintermfuncties. Noteer overigens dat telkens wanneer de basisfunctie gi (x1 , . . . , xn ) de waarde 1 aanneemt, dit ook het geval is voor alle functies gk waarvoor Sk ⊆ Si . Meer formeel: Si ⊇ Sk ⇒ gi (x1 , . . . , xn ) ≤ gk (x1 , . . . , xn ). Deze representatie is uniek en compleet, d.w.z. , voor elke functie f kan een uniek stel co¨effici¨enten Ci ∈ B, i = 0, 1, . . . , 2n − 1 gevonden worden zodanig dat de functie inderdaad wordt voorgesteld door de bovenstaande uitdrukking. De co¨effici¨enten kunnen berekend worden door de inversie van deze uitdrukking als volgt. Noteer dat voor elk punt (x1 , . . . , xn ) ∈ {0, 1}n geldt: L
M
f (x1 , . . . , xn ) =
Ci ,
i:Si ⊆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¨obius-inversie 3
Een product over de ledige verzameling levert de functie 1 op.
30
heet. Volgens deze techniek wordt de oplossing van het bovenstaande stelsel gegeven door M Ci = (−1)|Si |−|Sj | f (ν −1 (j)), j:Sj ⊆Si
waarin ν −1 (j) de binaire representatie is van j, en | Si | de cardinaliteit is van Si . 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 Bn elk element zijn eigen invers is, kunnen wij de inversie gewoon weglaten: Ci =
M
f (ν −1 (j)).
j:Sj ⊆Si
Voorbeeld 2.3 Voorbeeld van Reed-muller-representatie. Neem de functie uit bovenstaand voorbeeld. Wij verkrijgen het stel vergelijkingen f (000)
=1
= C0
f (001)
=0
= C0 ⊕ C1
f (010)
=1
= C0 ⊕ C2
f (011)
=0
= C0 ⊕ C1 ⊕ C2 ⊕ C3
f (100)
=0
= C0 ⊕ C4
f (101)
=0
= C0 ⊕ C1 ⊕ C4 ⊕ C5
f (110)
=1
= C0 ⊕ C2 ⊕ C4 ⊕ C6
f (111)
=1
= C0 ⊕ C1 ⊕ C2 ⊕ C3 ⊕ C4 ⊕ C5 ⊕ C6 ⊕ C7 .
¨ Door Mobius-inversie wordt hieruit verkregen: C0 C1 C2 C3 C4 C5 C6 C7
= f (000) = f (001) ⊕ f (000) = f (010) ⊕ f (000) = f (011) ⊕ f (010) ⊕ f (001) ⊕ f (000) = f (100) ⊕ f (000) = f (101) ⊕ f (100) ⊕ f (001) ⊕ f (000) = f (110) ⊕ f (100) ⊕ f (010) ⊕ f (000) = f (111) ⊕ f (110) ⊕ f (101) ⊕ f (100) ⊕ f (011) ⊕ f (010) ⊕ f (001) ⊕ f (000)
=1 =1 =0 =0 =1 =1 =1 = 0,
of f (x1 , x2 , x3 ) = 1 ⊕ x3 ⊕ x1 ⊕ x1 x3 ⊕ x1 x2 .
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]).
2.3.3
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 2n co¨effici¨enten nodig. 31
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¨eren, die de essenti¨ele aspecten van Boolese vormen vat, en bruikbaar is bij de concrete representaties.
Definitie 2.9 De verzameling Vn van Boolese vormen (BV) over X1 , . . . , Xn 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. Xi en Xi0 , i ∈ {1, . . . , n} zijn BVn; 4. indien A een BV is, dan zijn ook (A) en (A)0 BVn; 5. indien A en B BVn zijn, dan zijn ook A + B en A · B BVn. Hoewel Vn slechts sequenties van eindige lengte bevat is Vn niet eindig; Vn is echter wel een aftelbare verzameling (waarom?). Voorbeeld 2.4 Voorbeelden van Boolese vormen. De sequenties X1 ((X1 + X3 ) · X3 )0 (((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
elke variabelenaam nu precies e´ e´ 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 n dat Boolese vormen elementen uit Fn voorstellen. In Fn zijn er slechts 22 verschillende elementen. Een zinvolle interpretatie vereist dus dat wij op Vn een equivalentierelatie defini¨eren 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 α : {X1 , . . . , Xn } → {0, 1}. De assignatie ‘kent een waarde 0 of 1 toe’ aan elke variabele Xi , i = 1, . . . , n. Er bestaan 2n assignaties voor de variabelen Xi , i = 1, . . . , n. Definitie 2.11 Een valuatie onder de assignatie α is een functie | · |α : Vn → {0, 1} die voldoet aan de volgende regels: 1. |Λ|α = 0; 2. |0|α = 0;
|1|α = 1;
3. |Xi |α = α(Xi ),
i = 1, . . . , n;
4. |(A)0 |α = (|A|α )0 ; 5. |A + B|α = |A|α + |B|α ; 6. |A · B|α = |A|α · |B|α . Een valuatie interpreteert de symbolen +, · en 0 uit Vn als de corresponderende operatoren uit Fn , en interpreteert de variabelen Xi als hun Boolese waarde onder de assignatie α. Elke Boolese vorm v stelt een Boolese functie |v| of fv voor, gedefinieerd door: ∀α : fv (α(X1 ), . . . , α(Xn )) = |v|α Definitie 2.12 Twee Boolese vormen v1 en v2 zijn equivalent, v1 ∼ v2 , indien ∀α : |v1 |α = |v2 |α , d. w. z. indien fv1 = fv2 . n
Daar er 22 verschillende functies zijn in Fn , induceert de relatie ∼ klassen in Vn . Er bestaat een bijectie tussen deze klassen en Fn .
n
22 equivalentie-
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 vmin van minimale lengte kan bepalen. Dit is mogelijk dank zij de eenvoud van Fn . 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 Godel en Church). 33
Dualiteit van Boolese vormen Als gevolg van definitie 2.1 is het niet te verwonderen dat op Vn 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 : Vn → Vn die voldoet aan: 1. D(0) = 1 en D(1) = 0 2. D(Xi ) = Xi , voor i = 1, . . . , n 3. D(A + B) = D(A) · D(B) 4. D(A · B) = D(A) + D(B) 5. D(A0 ) = (D(A))0
Voorbeeld 2.5 Dualiteit in Boolese vormen. v D(v)
=
((X1 + X2 ) · X3 )0
= (D((X1 + X2 ) · X3 ))0 = (D(X1 + X2 ) + D(X3 ))0 = ((D(X1 ) · D(X2 )) + D(X3 ))0 = ((X1 · X2 ) + X3 )0
(5) (4) (3) (2)
Wij moeten nu echter nog nagaan of deze definitie inderdaad correspondeert met de eigen dualiteit in de Boole-algebra Fn . Dat dit zo is volgt uit de volgende lemma’s en stelling. Lemma 2.1 De complementering van de variabelen in een mintermfunctie mj leidt tot de mintermfunctie m2n −1−j : mj (x01 , . . . , x0n ) = m2n −1−j (x1 , . . . , xn ). Bewijs.
Het bewijs volgt onmiddellijk uit de definitie van mj en ν(x1 , . . . , xn ).
Het volgende lemma is eveneens zeer nuttig. Lemma 2.2 Indien f (x1 , . . . , xn ) =
P
j∈Sf
mj (x1 , . . . , xn ), dan is
f 0 (x1 , . . . , xn ) =
X j∈Sf
mj (x1 , . . . , xn )
C
waarbij Sf C = {0, 1, . . . , 2n − 1} − Sf .
34
Bewijs.
Het bewijs is triviaal.
Met deze lemma’s kunnen wij nu de volgende stelling bewijzen. Stelling 2.4 De functie fD(v) , voorgesteld door de duale vorm van v, is het functie-complement van fv toegepast op gecomplementeerde variabelen, fD(v) (x1 , . . . , xn ) = fv 0 (x01 , . . . , x0n ). Bewijs. Het bewijs steunt op een inductie op de lengte van v.
1. v bestaat uit e´ e´ n symbool: 0, 1, of Xi .
|D(0)|
X
|1| =
=
mj (x1 , . . . , xn )
j∈{0,1,...,2n −1}
X
=
m2n −1−j (x1 , . . . , xn )
j∈{0,1,...,2n −1}
X
=
mj (x01 , . . . , x0n )
j∈{0,1,...,2n −1}
j∈∅C f0 0 (x01 , . . . , x0n );
= |D(1)| = |0|
mj (x01 , . . . , x0n )
X
=
X
=
mj (x01 , . . . , x0n ) = f1 0 (x01 , . . . , x0n );
j∈∅
|D(Xi )| = |Xi |
X
=
mj (x1 , . . . , xn ).
j∈SXi
Hierin is SXi = {ν(x1 , . . . , xi−1 , 1, xi+1 , . . . , xn ) : xj ∈ {0, 1} en j 6= i} en C SX = SXi 0 = {ν(x1 , . . . , xi−1 , 0, xi+1 , . . . , xn ) : xj ∈ {0, 1} en j 6= i}. i
Noteer dat j ∈ SXi ⇒ 2n − 1 − j ∈ SXi 0 . Wij vinden dus
|D(Xi )| =
X
mj (x1 , . . . , xn )
j∈SXi
=
m2n −1−j (x01 , . . . , x0n )
X j∈SXi
=
C j∈SX
=
mj (x01 , . . . , x0n )
X i
0 fX (x01 , . . . , x0n ). i
35
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 0 )|
|D(v1 + v2 )|
|D(v1 v2 )|
=
|(D(v))0 | = (|D(v)|)0 = (fv0 (x01 , . . . , x0n ))0
=
fv (x01 , . . . , x0n ) = fv0 0 (x01 , . . . , x0n );
=
|D(v1 )D(v2 )| = |D(v1 )| · |D(v2 )|
=
(fv0 1 · fv0 2 )(x01 , . . . , x0n )
=
(fv1 + fv2 )0 (x01 , . . . , x0n )
=
fv0 1 +v2 (x01 , . . . , x0n );
=
fv0 1 v2 (x01 , . . . , x0n ).
(volgens 2.11(3))
(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 fD(v) te duur is om te realiseren in een bepaalde technologie, en dat fv veel goedkoper is. De relatie fD(v) (x1 , . . . , xn ) = fv0 (x01 , . . . , x0n ) laat dan toe fD(v) te realiseren als een functiesamenstelling van fv en n + 1 complementeringen, wat veel eenvoudiger kan uitvallen dan de rechtstreekse realisatie van fD(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 n
Elk van de 22 equivalentieklassen onder ∼ in Vn is een aftelbaar oneindige verzameling van sequenties. Wij hebben dus veel meer Boolese vormen dan functies, de equivalentie tussen twee vormen v1 en v2 kan vastgesteld worden door de valuatie van v1 en v2 te vergelijken over alle 2n assignaties. Dit is een exponentieel, en voor grote n en lange v1 , v2 dus een zeer langdurig proces. Een rechtstreekse vaststelling van equivalentie in Vn (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 Xi of zijn complement Xi0 .
36
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 2n verschillende mintermen (waarom?). De mintermen van V3 zijn: X1 X2 X3 X10 X2 X3 X1 X20 X3 X10 X20 X3 X1 X2 X30 X10 X2 X30 X1 X20 X30 X10 X20 X30 Een systematische notatie voor mintermen is als volgt: X1i1 X2i2 X3i3 · · · Xnin waarin
i Xj j
(
=
Xj , Xj0 ,
indien ij = 1 indien ij = 0.
Uit deze definitie volgt dat mintermen voorstellingen zijn van mintermfuncties, en dat het verband tussen vorm en functie gegeven wordt door: |X1i1 X2i2 · · · Xnin | = mν(i1 ,i2 ,...,in ) (x1 , . . . , xn ). Lemma 2.3 (Shannon-decompositie) Weze v(X) een Boolese vorm in e´e´n veranderlijke X. Dan geldt fv (x) = |X · v(1) + X 0 · 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)| = fv (0), en |v(1)| = fv (1) . Wij vinden dan |Xv(1) + X 0 v(0)|α = |Xv(1)|α + |X 0 v(0)|α = |X|α |v(1)|α + |X 0 |α |v(0)|α = α(X)fv (1) + (α(X))0 fv (0) (
=
fv (1), fv (0),
α(X) = 1 α(X) = 0
wat het lemma bewijst. Lemma 2.4 Weze v(X1 , . . . , Xn ) een Boolese vorm, en α een assignatie. Definieer de Boolese vormen ij ∈ Vn als ( 0, indien α(Xj ) = 0 ij = 1, indien α(Xj ) = 1. Dan is v(i1 , . . . , in ) equivalent met de e´e´nlettervorm 0 of 1 gegeven door (
v(i1 , . . . , in ) ∼
0, 1,
indien |v|α = 0 indien |v|α = 1.
Bewijs. Passen wij de definitie van een valuatie (2.11) toe op de vormen v(X1 , . . . , Xn ) en v(i1 , . . . , in ). Aangezien, bij onderstelling, |Xj |α = |ij |α
37
volgt dat de constante waarde van de functie |v(i1 , . . . , in )| gegeven wordt door |v(i1 , . . . , in )|α = ( |v(X1 , . . . , Xn )|α |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 (x1 , . . . , xn ) kan uniek gerepresenteerd worden door een Boolese vorm in de Disjunctieve Normaalvorm, als volgt f (x1 , . . . , xn ) =
X1i1 X2i2 X3i3
X
i1 , . . . , in ∈ {0, 1} v(i1 , . . . , in ) ∼ 1
· · · Xnin
Hierin is v(X1 , . . . , Xn ) om het even welke Boolese vorm die f voorstelt, en v(i1 , . . . , in ) de Boolese vorm v waarin alle variabelen Xj vervangen werden door hun assignatie ij . Bewijs.
(Inductie op n)
1. Het geval n = 1 volgt uit lemma’s 2.3 en 2.4. 2. (Inductiestap) Veronderstel de stelling correct voor n − 1 variabelen. Kies een willekeurige maar vaste waarde voor X2 , . . . , Xn . De functie fv (x1 , . . . , xn ) hangt dan ook enkel af van X1 . Volgens lemma 2.3 kunnen wij dus schrijven fv (x1 , . . . , xn ) = |X1 v(1; X2 , . . . , Xn ) + X10 v(0; X2 , . . . , Xn )|. Anderzijds stelt de vorm v(1, X2 , . . . , Xn ) ook een functie voor van n−1 variabelen. Volgens de hypothese is dus X2i2 · · · Xnin
X
v(1; X2 , . . . , Xn ) ∼
i2 , . . . , in ∈ {0, 1} v(1; i2 , . . . , in ) ∼ 1 met een gelijkaardige uitdrukking voor v(0; X2 , . . . , Xn ). Substitutie leidt tot f (x1 , . . . , xn ) = X1
X2i2 · · · Xnin
X
i2 , . . . , in ∈ {0, 1} v(1; i2 , . . . , in ) ∼ 1
+ X10
X
i2 , . . . , in ∈ {0, 1} v(0; i2 , . . . , in ) ∼ 1 =
X
i1 , . . . , in ∈ {0, 1} v(i1 , . . . , in ) ∼ 1
38
X1i1
X2i2 · · · Xnin
· · · Xnin .
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 Vn 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)0 = (A0 · B 0 ) en (A · B)0 = (A0 + B 0 ); 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 Xi en Xi0 bevatten voor een gegeven i (X · X 0 = 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 e´e´n lettervorm, zeg Xj . Vul het product aan met de factor (Xj + Xj0 ), voor alle ontbrekende j (X + X 0 = 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 Xj < Xj0 (commutativiteit van +).
Voorbeeld 2.6 Reductie naar DSV. v(X1 , X2 , X3 ) (na stap 2) (na stap 3) (na stap 4) (na stap 5) (na stap 6) (na stap 7)
∼ (X1 + X2 )(X1 + X30 ) ∼ X1 X1 + X2 X1 + X1 X30 + X2 X30 ∼ X1 X1 + X1 X2 + X1 X30 + X2 X30 ∼ X1 + X1 X2 + X1 X30 + X2 X30 ∼ X1 (X2 + X20 )(X3 + X30 ) + X1 X2 (X3 + X30 ) +X1 (X2 + X20 )X30 + (X1 + X10 )X2 X30 ∼ X1 X2 X3 + X1 X20 X3 + X1 X20 X30 + X1 X2 X30 + X10 X2 X30 ∼ X1 X2 X3 + X1 X2 X30 + X1 X20 X3 + X1 X20 X30 + X10 X2 X30
De DSV-procedure maakt het dus mogelijk elke vorm naar een standaard gedaante te herleiden (deze is niet noodzakelijk minimaal in lengte !). Equivalentie in Vn kan dus rechtstreeks en louter door symbolische manipulatie van de Boolese vorm worden getest. 39
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 e´ e´ 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 y1 = x1 x2 + x02 x4
(2.1)
y2 = x3 x4
(2.2)
y3 = x1 x2 + x3 x4
(2.3)
Hierin is dus n = 4 en k = 3. Wij representeren dit als 1
1 − − − 0 − 1 − − 1 1
1 0 1 1 0 0 0 1 1
Uiteraard bevat de voorstelling van e´ e´ 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.
2.3.5
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
veel kleiner dan de exponenti¨ele 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 (x1 , . . . , xn ) = x1 ) 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¨ent 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 Fn ; • het samenstellen van functies door functiecompositie. Niet al deze operaties kunnen altijd effici¨ent 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 e´ e´ 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 e´ e´ n argument van de functie.
41
Figuur 2.5: BDD-voorstelling van de functie f (x1 , x2 , x3 ) = x1 x02 + x3 (x01 + x2 ).
• als een interne knoop v1 een andere interne knoop v2 als opvolger heeft, dan is de index van de opvolger steeds groter dan deze van de beschouwde knoop: v2 ∈ {L(v1 ), R(v1 )} ⇒ I(v2 ) > I(v1 ); • als de verzameling van interne knopen niet-ledig is, dan is er precies e´ e´ 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 (x1 , . . . , xn ) 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 (x1 , . . . , xn ) = x0i f |xi =0 + xi 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 f (x1 , x2 , x3 ) = x1 x02 + x3 (x01 + x2 ). Opeenvolgende decomposities leiden tot f (x1 , x2 , x3 ) = x01 x3 + x1 (x02 + x2 x3 ) = x01 (x02 x3 + x2 x3 ) + x1 (x02 + x2 x3 ) = x01 (x02 (x03 0 + x3 1) + x2 (x03 0 + x3 1)) +x1 (x02 (x03 1 + x3 1) + x2 (x03 0 + x3 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
een representatie van exponenti¨ele 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 e´ e´ 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 e´ e´ 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 x0j g + xj g = 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 e´ e´ 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¨ente 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 e´ e´ 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
Algoritme 2.2 (BDD-reductie) 1. doorloop de BDD breedte-eerst, en plaats de knopen op niveau i in een lijst Li (de eindknopen zitten op niveau n + 1); 2. doorloop elk van de lijsten Li , 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 e´e´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 e´e´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 e´ e´ 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: e´ e´ n dat twee functies combineert m.b.v. de operatoren in Fn , en e´ e´ 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
gebaseerd op een recursie, die volgt uit de shannondecompositie op x1 : f1 (x1 , . . . , xn ) ? f2 (x1 , . . . , xn ) 0 x1 (f1 |x1 =0 ? f2 |x1 =0 ) + x1 (f1 |x1 =1 ? f2 |x1 =1 ), als x1 optreedt in f1 en f2 = x01 (f1 ? f2 |x1 =0 ) + x1 (f1 ? f2 |x1 =1 ), als x1 enkel optreedt in f2 f1 ? f2 , als x1 optreedt in geen van beide (Bewijs dat dit correct is voor ? = + of ·.) De berekening van het linkerlid kan effectief gebeuren als f1 en f2 beide constante functies zijn; wanneer e´ e´ n van beide constant is, kan men in sommige gevallen ook nog de berekening doen (b.v. wanneer ? = · en f1 = 0, is het resultaat steeds 0, ongeacht f2 ). Dit stopt de recursie. Uit deze regels kunnen wij rechtstreeks een algoritme distilleren. Start het algoritme met de oorsprongen v1 en v2 van de BDD’s als argumenten. Algoritme 2.3 (Combinatie d.m.v. de operator ?: bereken g = f1 ? f2 ) COMB(v1 , v2 , ?): 1. indien e´e´n van beide argumenten v1 of v2 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¨eer een interne knoop u met index min(I(v1 ), I(v2 )); (b) als I(v1 ) = I(v2 ), stel R(u) ← COMB(R(v1 ), R(v2 ), ?) L(u) ← COMB(L(v1 ), L(v2 ), ?). Hierin is COMB(R(v1 ), R(v2 ), ?) het resultaat van een recursieve oproep naar de huidige routine. (c) als I(v1 ) < I(v2 ), stel R(u) ← COMB(R(v1 ), v2 , ?) L(u) ← COMB(L(v1 ), v2 , ?). (d) als I(v1 ) > I(v2 ), doe dan als hierboven, maar met de rollen van v1 en v2 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 e´ e´ 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¨eindigd 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
Figuur 2.6: De combinatie van twee grafen door middel van een operator
Voorbeeld 2.7 Weze f1 (x1 , x2 , x3 ) als in figuur 2.5, weze f2 = x2 + x03 , 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 f1 · f2 niet minimaal is, en dat dus een extra minimalisatiestap nodig is. Het algoritme heeft een complexiteit van O(|G1 | · |G2 |).
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 f1 (x1 , . . . , xn ) en f2 (x1 , . . . , xn ), bereken de functie g(x1 , . . . , xn ) = f1 (x1 , . . . , xj−1 , f2 (x1 , . . . , xn ), xj+1 , . . . , xn ). Het is niet moeilijk aan te tonen dat men g(x1 , . . . , xn ) kan schrijven als g(x1 , . . . , xn ) = if f2 (x1 , . . . , xn ) = 0 then f1 (x1 , . . . , xn )|xj =0 else f1 (x1 , . . . , xn )|xj =1 . = ITE(f2 , f1 |xj =0 , f1 |xj =1 ) Deze vorm laat zich recursief uitdrukken door middel van Shannondecompositie, net zoals voor een gewone binaire operatie: g(x1 , . . . , xn ) = x01 ITE(f2 , f1 |xj =0 , f1 |xj =1 )|x1 =0 46
+x1 ITE(f2 , f1 |xj =0 , f1 |xj =1 )|x1 =1 , waarin ITE(f2 , f1 |xj =0 , f1 |xj =1 )|x1 =0 = ITE(f2 |x1 =0 , f1 |x1 =0,xj =0 , f1 |x1 =0,xj =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(|G1 |2 |G2 |) heeft, waarin G1 de graaf is die f1 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¨elimineerd. 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 2.1.1. 2. 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 0 als volgt: + 0 1 2 3
0 0 1 2 3
1 1 1 1 1
2 2 1 2 1
3 3 1 1 1
’ 1 0 3 2
· 0 1 2 3
0 0 0 0 0
1 0 1 2 3
2 0 2 2 0
3 0 3 0 3
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 x1 + x2 is symmetrisch; de functie x01 + x2 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
6. Een Boolese functie is monotoon niet-dalend (monotoon, om kort te zijn) wanneer, als (x1 , x2 , . . . , xn ) ≤ (y1 , y2 , . . . , yn ), dan f (x1 , x2 , . . . , xn ) ≤ f (y1 , y2 , . . . , yn ), 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¨ele getallen ai , b bestaan zodanig dat ( P 1 als i ai xi ≥ b, f (x1 , x2 , . . . , xn ) = 0 anders. Toon aan dat, als ai ≥ 0, f monotoon niet-dalend is. 7. Toon aan dat de functie f (x, y, z, u, w) = yzu0 w + xuw + x0 yzuw + xzu + xz 0 uw0 monotoon niet-dalend is (baseer u op oefening 6). 8. Een functie f (x1 , x2 , . . . , xn ) is monotoon niet-dalend in een variabele xj als geldt, ∀(x1 , x2 , . . . , xj−1 , xj+1 , . . . , xn ) ∈ {0, 1}n−1 , f (x1 , x2 , . . . , xj−1 , 0, xj+1 , . . . , xn ) ≤ f (x1 , x2 , . . . , xj−1 , 1, xj+1 , . . . , xn ). 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. Is het omgekeerde ook waar? Bewijs of geef een tegenvoorbeeld. (b) Het complement van een unate functie is unaat. (c) Een functie is unaat (niet-dalend) in x a.s.a. haar shannonexpansie kan geschreven worden als f = xfx=1 + fx=0 (d) De shannonexpansie van het complement van een niet-dalende functie in x kan geschreven worden als 0 0 f 0 = x0 fx=0 + fx=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
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 = x0 f g + x(f + g) f × g = x0 (f + g) + xf g 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¨ele 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¨eren + 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 e´ e´ 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¨eren als volgt: [a, b] = {x : a ≤ x ≤ b en x ∈ V }. Beschouw de Boole-algebra Fn van Boolese functies van n binaire variabelen, en beschouw het interval I = [fl , fh ] met fl < fh . (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 F3 , door de atomen te bepalen (en enkel de atomen) van I = [xyz, x + yz] 12. Weze fk (x1 , x2 , . . . , xn ) de functie die 1 is wanneer precies k van de variabelen de waarde 1 aannemen. Stel het canonisch BDD op voor f3 (x1 , x2 , . . . , x5 ). Probeer dit te doen zonder een exponenti¨ele explosie van de tussenvormen die je gebruikt.
49
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.
3.1.1
Modellen van schakelaars
Een schakelaar realiseert een elementaire Boolese functie van e´ e´ n argument xj . 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
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 xj , realiseert de elementaire functies f (x1 , . . . , xn ) = xj of f (x1 , . . . , xn ) = x0j . Elke schakelfunctie van meer variabelen die meer is dan louter een inversie of identiteitsfunctie van e´ e´ 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 N1 en N2 , 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 f1 (x1 , . . . , xn ) resp. f2 (x1 , . . . , xn ) de functies voorstellen van de netwerken, dan zal het resulterend netwerk de functie f (·) = (f1 · f2 )(·) resp. f (·) = (f1 + f2 )(·) realiseren. De interconnectie van schakelaars kan dus gemodelleerd worden door de operaties · en + uit Fn . 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
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 (x1 + x2 )0 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.
3.1.2 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 e´ e´ n argument xj , en de functies f (x1 , . . . , xn ) = xj of f (x1 , . . . , xn ) = x0j 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 (xi , xj ) = xi · xj ). 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 B1 . 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 e´ e´ n der basispoorten uit figuur 3.2 kan niet rechtstreeks gemodelleerd worden door een operator in Fn , 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 (fi52
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 vorm1 . 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.
3.1.3 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 e´ e´ 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 e´ e´ 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 A1 , A2 , ... An
53
Figuur 3.4: Een poortnetwerk dat niet overeenkomt met e´ e´ n enkele Boolese vorm
Figuur 3.5: Een niet serie/parallel netwerk
ook meer dan e´ e´ 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 e´ e´ 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¨ele 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 e´ e´ n Boolese vorm gegeven wordt. Figuur 3.4 toont een dergelijk netwerk: de output van een deelnetwerk wordt aan meer dan e´ e´ 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 e´ e´ n stap te combineren tot een nieuw netwerk.
54
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 fN 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 = (aij ) over Vn is een vierkante matrix met elementen in Vn waarvan alle diagonaalelementen aii gelijk zijn aan 1. Gebruik makend van de rekenregels in Vn kunnen wij de volgende bijkomende definities geven: 1. A = B ⇐⇒ aij = bij
∀i, j;
2. A + B = (aij + bij ); 3. A ∗ B = (aij · bij ); 4. A · B = (
P
k
aik bkj );
5. A0 = C ⇐⇒ cii = 1 en cij = a0ij , i 6= j . De Boolese matrices kunnen partieel geordend worden door de (parti¨ele) ordening van hun componenten uit te breiden tot de hele matrix: A ≤ B ⇐⇒ aij ≤ bij Opmerking:
∀i, j ∈ {1, . . . , n} .
Noteer dat ≤ de natuurlijke parti¨ele ordening op Fn 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 aij , i 6= j, wordt gegeven door 0,
indien knoop i en j door niets rechtstreeks verbonden zijn; aij = 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 A2 = A · A; A3 = A2 · 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 Ap , 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
A=
1 X 0 Y X0 + Y
X 0 Y X0 + Y 1 X0 + Z Z0 Z 0 0 X +Z 1 Y 0 Z0 Y0 1 X0 Z 0 X0 1
Figuur 3.6: Een taknetwerk en zijn connectiematrix A
1. A ≤ A2 ≤ A3 ≤ A4 ≤ · · · 2. ∃q < k zodat A(q−1) ≤ Aq = A(q+1) = · · · , en dus 3. Aq = A∞ Bewijs. (p)
1. Noteer Ap = (aij ). Wij vinden dan (p+1) aij
=
k X
(p)
aim amj
=
m=1 (p) aij ajj
≥
(p) aij
+
X
(p)
aim amj
m6=j
(definitie van ≥)
Dus Ap ≤ Ap+1 . 2. Uit (1) volgt dat A(k−1) ≤ Ak . Wij bewijzen nu dat A(k−1) ≥ Ak . Wij vinden (k)
aij =
X
aim1 am1 m2 · · · amk−2 mk−1 amk−1 j .
m1 ,m2 ,...,mk−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` = j. De term kan dan herschreven worden als (aim1 · · · am`−1 j )(ajm`+1 · · · amk−1 j ) . 56
(b) stel m` = i. De term kan dan herschreven worden als (aim1 · · · am`−1 i )(aim`+1 · · · amk−1 j ) . (c) stel m` = mp . Ook dan kan de term herschreven worden: (aim1 · · · am`−1 mp )(amp m`+1 · · · amp−1 mp )(amp mp+1 · · · amk−1 j ) . (k)
Dus elke term in de som voor aij bestaat uit het product van een term uit de som (s)
van aij , voor een gegeven s ≤ k − 1, met een andere functie. Daar nu (s)
(s+1)
aij ≤ aij
≤ ···
vinden wij (k−1)
∀m1 , m2 , . . . , mk−1 aim1 · · · amk−1 j ≤ aij
.
Bijgevolg is Ak ≤ Ak−1 , en dus Ak = Ak−1 . Dit bewijst (2) 3. Daar wij in A∞ geen paden moeten includeren waarin een knoop tweemaal voorkomt is Ak = A∞ . Uit (2) volgt dan ook dat Aq = 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
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 ´ de doorbraak van ASIC-ontwerp in de tachtiger jaren (van in de zestiger jaren, tot vo´ or 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¨en. 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-ORINVERT-poorten, e.d.m. Men vindt ook elementaire bouwblokken voor aritmetische circuits (half-adders, full-adders). Er bestaat een vari¨eteit 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 e´ e´ 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). Uiteraard ook op het WWW. Neem eens een kijkje op de sites van Texas Instruments http://www.ti.com, Motorola http://www.motorola.com, Fairchild http://www.fairchild.com, National Semiconductor http://www.national.com, en vele anderen. 3
58
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¨ele) 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: a0 = (a · a)0 , a + b = (a0 · b0 )0 = ((a · a)0 · (b · b)0 )0 , a · b = ((a · b)0 · (a · b)0 )0 . 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 e´ e´ 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¨ele 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 e´ e´ 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 e´ e´ 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
Vdd
Uit
In2
Enable
In1
Figuur 3.7: Een CMOS NAND-poort met afschakelbare uitgang. De uitgang wordt hoogimpedant wanneer enable=L 5V R
390 W
Buslijn
T2
T1
T3
Figuur 3.8: De ingredi¨enten 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 e´ e´ 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
Driver Stroombron -
3.5 mA +
transmissielijn Z0=100W
+
100 W
350 mV
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¨ele 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 a` 120 Ω. Dit zijn symmetrische transmissielijnen, die het best differentieel aangestuurd worden (figuur 3.9). Men definieert een homopolaire spanning VCM (Eng. common mode voltage) en een differentiaalcomponent Vdif f . Een logische 1 wordt dan voorgesteld door op een draad de spanning VCM + Vdif f /2 aan te brengen, op de andere de spanning VCM − Vdif f /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 VCM . Aan de ontvangerkant moet een poort een differenti¨ele ingang hebben, die het differentieel signaal Vdif f 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
Tabel 3.1: Hoofdeigenschappen van LVDS (volgens norm ANSI/TIA/EIA-644) Parameter Vdif f VCM ∆Vdif f ∆VCM ISC tr , t f IIN VIN VT H
Beschrijving Differentiaalspanning Homopolaire spanning Maximale verandering van Vdif f Maximale verandering van VCM Kortsluitstroom Stijg/daaltijden op de output ( > 200Mb/s) Stijg/daaltijden op de output (< 200 Mb/s) Ingangsstroom Spanningsbereik aan ingang Drempelspanning
Min. 247 1.125
0.26
0
Max. 454 1.375 50 50 24 1.5 30% van tbit 20 2.4 100
Eenheid mV V mV mV mA ns µA V 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 binain re variabelen gelijk is aan 22 . 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
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 6.
3.3.2
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¨eren 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 e´ e´ 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
Figuur 3.10: Een typisch voorbeeld van glue logic: het processorbord van een Cromemco 8bitcomputer (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
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¨eteit aan programmeerbare componenten en programmeertechnieken en -technologie¨en bestaat. In de volgende paragrafen zullen wij, weer bij wijze van overzicht, een aantal programmeerbare componenten bespreken, alsook de programmeertechnologie¨en die gebruikt worden. Wij zullen beginnen met het laatste. Programmeertechnologie¨en 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¨en. 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¨eren 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
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 e´ e´ 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 VP P tussen de buitenste gate en de source en drain van de FET. Men brengt tevens de drain op een relatief hoge spanning VD 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 (Fowler66
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
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¨eren tussen MSI en ULSI. Sommige componenten bevatten geen (functionele) geheugencellen; andere hebben wel geheugencellen (soms zeer veel), en zijn dus sequenti¨ele 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 3.14. 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
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¨eren 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
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
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 2n EN-poorten aan, die alle mintermen van de n inputs realiseren. De benaming ‘ROM’ wordt duidelijk wanneer wij de inputs beschouwen als adressen, de 2n 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 e´ e´ 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 e´ e´ 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¨erarchisch:
71
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
B
S2
P1
P1
S1
S2
P2
S2
P2
A
B
(b) S1 A
P1
A
P1
(a)
S1
B
(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¨eren van e´ e´ 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¨ent 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
IC-voet
RS-232-verbinding met computer
IC-voet
Verbinding met plug-inbord in computer
UV-lamp
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 gesimu74
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´en 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 TIALS-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
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 a` 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¨elimineerd 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¨ele 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 e´ e´ n tot drie maanden. Elke fout die een nieuwe fabricage vereist, wordt gepenaliseerd met een gelijkaardige tijdsduur en kost. • de initi¨ele kost (NRE, ‘non-recurrent engineering cost’) voor de vervaardiging van een ASIC is nog steeds veel hoger dan de initi¨ele 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¨ele 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
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 e´ e´ 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
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 300 000 poorten (2-input ´ voor de voedingsdistributie); zij NAND). De metallisering gebeurt in drie lagen (waarvan e´ en 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 32×72 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
Tabel 3.2: Enkele semi-custom gate arrays (Motorola) Component HDC003 HDC105 H4C027 H4C318 MCA750ETL MCA2200ECL MCA10000ECL
Complexiteit (equiv. poorten) 3 036 104 832 27 048 317 968 848 2 200 10 000
Vertragingstijd (ns) 0.25 0.25 0.18 0.18 0.15 0.12 0.12
Technologie CMOS CMOS CMOS CMOS ECL ECL ECL
I/Osignalen 76 300 188 556 42 108 256
vandaag (2003) vari¨eren van 0,13 tot 0,6 µm. Om een chip met een aanvaardbare effici¨entie 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¨en 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 3.21. 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¨en) 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
Figuur 3.21: Standaard-cellayout van een multiplexer, gerealiseerd als complexe CMOS-poort (ES2): logisch niveau (logische structuur), circuitniveau (fysische en logische structuur)
80
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
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 NORNOR-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 e´ e´ 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 ont82
Figuur 3.23: Logische en fysische structuur van een custom PLA (circuitniveau, schematisch)
83
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 ´ compactere lay-outs genereren dan met standaardde gerealiseerde chip: men kan nog cellen. 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 3.24. Bepaal de schakelfunctie gerealiseerd tussen de punten 1 en 6 met behulp van de connectiematrix A van het circuit. Vanaf welke macht n is An = 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 3.25. Weze N1 en N2 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 N1 en N2 , en tussen de topologie¨en van hun netwerken ? 84
Figuur 3.25: Een poort gemaakt met behulp van schakelaars
Figuur 3.26: Twee concrete gevallen
(b) Bepaal N2 voor elk van de gevallen in Figuur 3.26.
85
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; 5. ... 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) hebben1 . Zij moeten bestaan uit een OF-poort, 1
Of de duale product-van-sommen-vorm.
86
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 Xi of Xi0 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
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 + A0 · C ∼ A · B + A0 · C + B · C Men noemt B · C het optioneel product van A · B en A0 · C. Bewijs. A · B + A0 · C + B · C ∼ A · B + A0 · C + (A0 + A) · B · C ∼ A · B + A0 · C + A0 · B · C + A · B · C ∼ A · B · (1 + C) + A0 · C · (1 + B) ∼ A · B + A0 · C.
Opmerking. Vanaf nu zullen wij, om gemakkelijkheidsredenen, het equivalentie-symbool ∼ vervangen door =, en het productsymbool · weglaten. Noteer echter dat het gebruik van = binnen Vn 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 Xi Xi0 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 + A0 ; de equivalente vorm is 1).
88
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 e´e´n der twee vadertermen, schrap dan deze term. • indien het gaat over e´e´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 + A0 C + B + D(B 0 C 0 + A0 C 0 ). 1. Uitwerken van de haakjes, sorteren, redundante termen en factoren schrappen: U
= A + A0 C + B + DB 0 C 0 + DA0 C 0 = A + B + A0 C + A0 C 0 D + B 0 C 0 D
2. Eerste-orde optionele producten: = A + A0 C +B + A0 C 0 D + B 0 C 0 D | {z }
U
C≥A0 C
=C +B+
A + A0 C 0 D | {z }
+B 0 C 0 D
C 0 D≥AC 0 D,B 0 C 0 D 0
= C D + C +A + B | {z } D≥C 0 D
=D+C +A+B Reduceer de vorm U = AB + A0 C + B 0 D + C 0 D Er zijn geen eerste-orde optionele producten bruikbaar; probeer hogere-orde producten. U
= AB + A0 C +B 0 D +C 0 D | {z } BC | {z } CD | {z }
U
= D + AB + A0 C
D≥B 0 D,C 0 D
89
Vormen die gereduceerd werden door Algoritme 4.1 zijn niet-redundant, maar niet noodzakelijk minimaal. Zo is bv. de vorm P = A0 BC 0 + A0 BD + ACD + AB 0 D + AC 0 D0 niet-redundant, maar de vorm P ∗ = A0 BC 0 + BCD + AB 0 D + AC 0 D0 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 e´ e´ 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 = A0 BC 0 + A0 BD + ACD + AB 0 D + AC 0 D0
U = A0 BC 0 + A0 BD + ACD +AB 0 D + AC 0 D0 | {z } BCD
Secundaire optionele producten A0 BC 0 + BCD → A0 BD AB 0 D + BCD → ACD
beide vadertermen van BCD
Minimale vorm: U = A0 BC 0 + BCD + AB 0 D + AC 0 D0
Zissos levert echter geen bewijs van de optimaliteit van bovenstaande algoritmen.
90
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 2n−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¨eren. Definitie 4.1 Een implicant van een functie f is een Boolese functie, voorgesteld door een product van lettervormen, die f impliceert: Xij11 · · · Xijkk ≤ 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 (x1 , . . . , xn ) ∈ {0, 1}n dat deel uitmaakt van slechts e´e´n priemimplicant van f . Deze priemimplicant noemt men dan een essenti¨ele priemimplicant. Stelling 4.3 Elke niet-redundante som en elke minimale som van f bevatten alle essenti¨ele priemimplicanten van f . 91
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¨ele priemimplicanten te identificeren, (ii) in alle niet-redundante sommen, de minimale sommen van de niet-essenti¨ele 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¨ele 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¨ele priemimplicanten. Noteer dat voor 5-variabele functies, sommige kubussen bestaan uit twee identieke subkubussen in elke deelkaart (kubus W 0 XZ 0 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¨enter algoritmen uitgedacht, waarvan wij er enkele wat nader zullen bekijken verderop.
92
W
W
1 Y
1
1
1
1
1
1
1
1
Z
Z Y
1
1
1
X
X
V =0
V =1
P
f (v, w, x, y, z) = (1, 2, 3, 4, 5, 6, 7, 10, 14, 20, 22, 28) complete som f = V 0 W 0 Z + V 0 W 0 Y + V 0 Y Z 0 + V 0 W 0 X + W 0 XZ 0 + V XY 0 Z 0 e.p.i. = V 0 W 0 Z, V 0 Y Z 0 , W 0 XZ 0 , V XY 0 Z 0
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 2. 4. 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
V W X Y Z
V W X Y Z
0 0 0 0 0 0
0 0 1 * 0 1 0 * 1 0 0 *
0 0 0 0 1
0 1 1 0 1
0 0 0 0 0 0 0 –
0 0 0 0 – 0 0 0
0 – 0 – 0 1 1 1
– 0 1 1 1 0 – 0
1 1 – 0 0 – 0 0
* * * * * * * *
0 0 0 0 – 0 1 1
0 0 0 – 0 1 0 –
– 1 1 1 1 – 1 1
1 – 1 1 1 1 – 0
1 1 – 0 0 0 0 0
* * * * * * * A
0 0 1 1
0 0 0 1 0 0 1 0 1
1 1 1 1
1 0 1 1 0 1 1 1 0
1 1 0 0 0 1 0 0 0
* * * * * * * * *
f (v, w, x, y, z) =
V W X Y Z 0 0 0 0 –
0 0 – 0 0
– – – 1 1
– 1 1 – –
1 – 0 – 0
B C D E F
P
(1, 2, 4, 3, 5, 6, 10, 20, 7, 14, 22, 28)
Priemimplicanten: A B C D E F
= V XY 0 Z 0 = V 0W 0Z = V 0W 0Y = V 0Y Z 0 = V 0W 0X = W 0 XZ 0
Figuur 4.2: De tabelmethode voor het vinden van de complete som
94
In het geval van de kaartmethode kennen wij reeds de essenti¨ele 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¨ele 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 e´e´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 e´e´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¨ele groei. Voor grote tabellen is er duidelijk nood aan veel effci¨enter methoden. Een meer effici¨ente 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
Beschouw de functie f (v, w, x, y, z) =
X
(1, 2, 5, 6, 7, 8, 9, 10, 13, 17, 18, 21, 22, 29) met als p.i.
A = V 0X 0Y Z 0 D = V 0 W 0 XZ G = W 0Y 0Z
B = V 0W X 0Y 0 E = V 0 W 0 XY H = W 0Y Z 0
C = V 0W X 0Z 0 F = V 0Y 0Z I = XY 0 Z
De eerste tabel levert als e.p.i.’s G, H, I:
1 A B C D E F →G →H →I
2
5
6
7
8
9
* *
*
*
13
17
18
21
22
29
*
* * * *
10
* * *
*
* * *
* *
*
* *
*
*
* *
*
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.
7 A B →C D →E F
8
9
10 *
* *
* *
* * *
De minimale sommen zijn f = G + H + I + (E of D) + C + F.
Figuur 4.3: Het vinden van een minimale som
96
• 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 e´e´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 e´e´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
Uitbreidingen naar meervoudige functies. Tot nog toe hebben wij slechts enkelvoudige functies onderzocht: functies met e´ e´ n binaire uitgang. Vaak komt het echter voor dat wij meer dan e´ e´ n binaire functie van dezelfde inputs samen moeten realiseren. Dan kan het zijn dat twee sommen e´ e´ 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 4.1.2 en 4.1.2 beschreven methoden uitbreiden tot het vinden van een globaal optimum. In het geval van de kaartmethode beschouwt men 2m −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 e´ e´ 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 P f1 (x, y, z, w) = (1, 3, 4, 5) + DC(0) P f2 (x, y, z, w) = (4, 5, 7, 15).
98
Afzonderlijke minimalisatie leidt tot f1 f2
= X 0Z 0 + X 0Y 0W = X 0 Y Z 0 + 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 A B C D E
= X 0 Y 0 W (f1 ) = X 0 Y Z 0 (f1 , f2 ) = X 0 Y W (f2 ) = Y W Z (f2 ) = X 0 Z 0 (f1 ) ,
met als minimale som
f1
= A + B = X 0Y 0W + X 0Y Z 0
f2
= B + D = X 0 Y Z 0 + 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 f1 van B (essentieel voor f2 ), en de totale kost van E. De incrementele ´ OF-input, terwijl de kost voor het gebruik van E neerkomt op e´ en ´ OF-input, e´ en ´ kost van B is e´ en EN-poort, en 3 EN-inputs.
4.1.3
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 nkubus Un = {0, 1}n , die gezamenlijk precies alle mintermen van f bevatten. Wij noemen een dergelijke klasse van deelkubussen ONf ∈ C. Op gelijkaardige wijze kunnen wij de klassen DCf ∈ C en OFFf ∈ C defini¨eren, die respectievelijk de DON’T CARE termen van f bevatten, en de punten (x1 , . . . , xn ) ∈ Un waarvoor f (x1 , . . . , xn ) = 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
Bepaling van de gezamenlijke priemimplicanten
X Y Z W
X Y Z W
0 0 0 0
f1
0 0 0 1 0 1 0 0
f1 * f1 f2 *
0 0 1 1 0 1 0 1
f1 * f1 f2 *
0 1 1 1
f2
*
1 1 1 1
f2
*
X Y Z W
0 0 0 − f1 0 − 0 0 f1
*
0 − 0 − f1 E
* *
0 0 − 1 f1 A 0 − 0 1 f1 * 0 1 0 − f1 f2 B 0 1 − 1
f2
C
− 1 1 1 f2
D
Bepaling van de minimale sommen
→A →B C →D E
1
3
*
*
*
f1 4
5
4
5
*
*
*
* *
*
f2 7
* *
15
*
*
Figuur 4.4: Gezamenlijke minimalisatie van functies
100
representatie van OFFf uitgaande van ONf en DCf ), 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 Fn 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 (x1 , . . . , xn ), en een kubusrepresentatie ONf van deze functie, kubusrepresentaties te bepalen van de residufuncties fx0i = f |xi =0 en fxi = f |xi =1 . Eenvoudig nazicht leert ons dat de representatie van fx0i gevonden wordt door alle kubussen uit ONf 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 ONf 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 + A0 C + B 0 D + C 0 D uit voorbeeld 3.2. Haar kubusrepresentatie is als volgt: 1 1 − − 0 − 1 − f: − 0 − 1 − − 0 1
Haar Shannonexpansie op A levert de volgende residufuncties − 1 − − − − 1 − fA : fA0 : − 0 − 1 − 0 − 1 − − 0 1 − − 0 1 terwijl de cofactor van de kubus BC = {−11−} gegeven wordt door 1 − − − fBC : 0 − − −
101
Complementering De complementering laat zich recursief defini¨eren door Shannondecompositie als volgt: f 0 (x1 , . . . , xn ) = (x01 fx01 + x1 fx1 )0 = (x1 + fx0 0 )(x01 + fx0 1 ) 1
= x1 fx0 1 + x01 fx0 0 + fx0 1 fx0 0 1
1
= x1 fx0 1 + x01 fx0 0
1
omdat de term fx0 1 fx0 0 het optioneel product is van de twee vorige termen. Dit vertaalt 1 zich onmiddellijk naar kubusrepresentaties. De recursie stopt wanneer een kubus hoogstens e´ e´ n symbool 0 of 1 bevat: de kubus stelt dan een lettervorm voor, die onmiddellijk gecomplementeerd kan worden. De vermenigvuldiging in bv. x1 fx0 1 wordt uitgevoerd door het symbool 1 te schrijven op plaats 1 in alle kubussen van fx0 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.
f0
0 0 − − − 1 − + A0 − 0 − 1 1 − − 0 1 1 0 0 + AB 0 − − − 1 − − − 0 0 − − 1 − − − 1 − + A0 B 0 − − 0 1 − − − 1 0 0 0 AB − − − − + AB − − − 1 0 0 +A0 BC − − − − + A0 BC 0 − − − 1 0 0 +A0 B 0 C − − − − + A0 B 0 C 0 − − − 1 AB 0 − − − 0 + A0 BC 0 − − − 0 +A0 B 0 C 0 − − − 0 AB 0 − − − 0 +A0 B − − 0 0 + A0 B 0 − − 0 0 − 1 0 0 0 A − 0 − 0 +A − 0 0 0 A − 0 − 0 + A0 − − 0 0 1 0 − 0 0 − 0 0
− = A − − = AB − +A0 B =
= =
= = =
1 − 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
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 fc ≤ fC . Opdat dit het geval zou zijn, moet fC = fc + g waarin g een willekeurige functie is. Hieruit volgt dat de cofactor van c in de Shannonexpansie van fC , 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. fx1 en fx01 beide tautologie¨en zijn (bewijs dit). Unate functies Diverse technieken bestaan om de basistest voor tautologie te versnellen. E´en 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 x1 (stijgend). De Shannonexpansie van f ziet er dan uit als volgt (bewijs dit uit de definitie): f (x1 , . . . , xn ) = x1 fx1 + fx01 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. e´e´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 e´ e´ 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
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
A1 T . . . T T A2 . . . T f : ... T T . . . An
,
waarin T een matrix met allemaal −. De functie f is een tautologie a.s.a. minstens e´ e´ n van de Ai een tautologie is (bewijs als oefening). De complete som uit een kubuslijst E´en 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 e´ e´ nzelfde implicant op meerdere manieren geproduceerd wordt, wat zeker niet erg effici¨ent is. Wij zullen nu een methode uiteenzetten, E SPRESSO E XACT, 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 e´ e´ 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 c0i de volgende betekenis: c0i = 1 a.s.a. een 0 op plaats i in de priemimplicant deze disjunct maakt van een kubus uit het complement. De variabelen c1i 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 c1i + c0k = 1. Een implicant van f moet disjunct zijn van alle kubussen in het complement van f , en dus vinden wij een uitdrukking ik
ik
ik
i
nm n1 1m P = (ck1111 + · · · + ckn1 ) · · · (ck1m + · · · + ckknm )
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 c1i c0i = 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
Voorbeeld 4.6 De complete som met de kubusrepresentatie Wij beschouwen weer de functie uit voorbeeld 4.5. Haar complement werd al afgeleid: 1 0 − 0 0 f : 0 − 0 0 Hieruit halen wij onze uitdrukking P : P
=
(c01 + c12 + c14 )(c11 + c13 + c14 )
= c11 c12 + c11 c14 + c01 c13 + c12 c13 + c12 c14 +c01 c14 + c13 c14 + c14 = c11 c12 + c01 c13 + c12 c13 + c14 Dit stelt de complete som van f voor: 1 1 − − 0 − 1 − f: − 1 1 − − − − 1
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 kruisoperatie3 ] formaliseert de aftrekking van deelkubussen, en wordt door de volgende definities vastgelegd. Weze a = (a1 a2 . . . an ) en b = (b1 b2 . . . bn ) twee deelkubussen in ternaire voorstelling (ai , bi ∈ {0, 1, −}). Definitie 4.8 De kruisoperatie ai ]bi op de co¨ordinaten van een deelkubus is een functie ] : {0, 1, −}2 → {0, 1, −, ∅} gedefinieerd door de operatietabel ai
bi
3
] 0 1 −
0 0 ∅ 0
Engels: sharp.
105
1 ∅ 1 1
− 1 0 −
Definitie 4.9 De kruisoperatie a]b tussen twee deelkubussen a, b ∈ C is een functie ] : C2 → C , gedefinieerd als volgt:
a]b =
{a}, indien ai ]bi = ∅ voor minstens e´ e´ n waarde van i,
{}, indien ai ]bi = ai voor alle i, {a1 , . . . , ai−1 , ai ]bi , ai+1 , . . . , an : ai ]bi 6= ai }, anders.
Definitie 4.9 zegt dan het volgende: a]b = {a} indien a en b disjunct zijn (minstens e´ e´ n ¨ van de coordinaten is incompatibel) ; a]b is ledig indien a ≤ b, wat enkel kan indien ai ≤ bi ∀i. In alle andere gevallen is a]b een collectie van deelkubussen, e´ e´ n voor elke ¨ coordinaat waar ai = − en bi 6= −, waarin ai dan vervangen wordt door b0i . 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. ai bi
0 −
1 1
− 1
]
ai bi
− 1
0 −
− 0
]
ai bi
− 1
− 1
− 0
ai ]bi
0
1
0
ai ]bi
0
0
1
ai ]bi
0
0
1
]
↓
↓ (
a]b = {010}
a]b =
↓
00− −01
)
a]b =
0−−
−0− −−1
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 ∨ : C2 → 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 QuineMcCluskey 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 = {a1 , a2 , . . . , am } en B = {b1 , b2 , . . . , bn } ; ai , bi ∈ C.
106
Definitie 4.11 De uitbreiding van ] tot C is als volgt: A]{b} = (a1 ]b) ∨ (a2 ]b) ∨ (a3 ]b) ∨ · · · {a}]B = (((a]b1 )]b2 )]b3 )] · · · A]B = ({a1 }]B) ∨ ({a2 }]B) ∨ · · · Laat ons nu de minimalisatie van een Boolese functie f met deze methode aanvangen. De volgende relaties zijn waar: Un ONf OFFf DCf
= ONf ∪ OFFf ∪ DCf = {− − − · · · −} = Un − (OFFf ∪ DCf ) = Un − (ONf ∪ DCf ) = Un − (ONf ∪ OFFf )
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 0 Y + Y Z. Een representatie van ONf volgt onmiddellijk uit een SVP-representatie van f . (
ONf =
01− −11
)
Daar er geen don’t care termen zijn, vinden wij een compacte representatie van OFFf als volgt: ( ) 01− OF Ff = {− − −}] −11 =( ({− − −}]{01−})]{−11} ) 1−− = ]{−11} −0− =( ({1 − −}]{−11}) ∨ ({−0−}]{−11}) ) ( ) 10− −0− = ∨ {−0−} = . 1−0 1−0 De laatste gelijkheid volgt omdat 10− ≤ −0−. 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 PIf = Un ](Un ](ONf ∨ DCf )). Bewijs.
Het bewijs wordt gegeven in [Dietmeyer71].
Merk op dat in de uitdrukking voor PIf nergens gebruik gemaakt wordt van de verzamelingvan mintermen van f . De verzamelingen ONf en DCf kunnen willekeurige stellen deelkubussen zijn (d.i. niet noodzakelijk priem of minimaal). 107
Uit de verzameling PIf 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 PIf . Noteer daartoe PIf = {p1 , p2 , . . . , pn }, en noteer de lijst van de priemimplicanten waaruit e´ e´ n implicant c verwijderd werd als PIf \ {c}. Lemma 4.1 pi is een essenti¨ele p.i. als en slechts als Ai = ({pi }](PIf \ {pi }))]DCf 6= ∅.
Bewijs. Ai bevat alle termen die wel door pi , maar niet door de overige priemimplicanten van f worden bedekt, en die ook geen don’t care termen zijn; pi 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¨ele 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 PIf , zonder de lijst van mintermen te moeten genereren. Algoritme 4.6 (Bepalen van een niet-redundante som) 1. Bereken de verzameling PIf zoals aangegeven in stelling 4.5; 2. Voor elke pi (a) Bereken Ai = ({pi }](PIf \ {pi }))]DCf (b) Indien Ai = ∅, zet PIf ← PIf \ {pi } ; Dit algoritme zal dus geen enkele e.p.i. weglaten, maar wel een aantal redundante p.i.’s. De resulterende PIf 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 PIf 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 2n resp. 3n /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 4.1.3. Men kan vooreerst de complete som opsplitsen in drie deelverzamelingen: de essenti¨ele priemimplicanten, de partieel redundante priemimplicanten, en de totaal redundante 108
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 ≤ (PIf \ {c}) ∪ DCf die nagaat of een priemimplicant c bedekt wordt door (PIf \{c})∪DCf . Deze test herleidt zich tot een tautologietest van de cofactor van c in (PIf \{c})∪DCf . Wanneer dit het geval is, wordt elke minterm van c ofwel gerealiseerd door minstens e´ e´ n van de andere p.i.’s in PIf \ {c}, ofwel door DCf , 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 EPIf . De totaal redundante p.i.’s TRIf bevatten enkel mintermen die ofwel reeds bedekt worden door EPIf , ofwel door DCf . Deze termen hoeft men dus niet (nogmaals) te realiseren. Een p.i. c is totaal redundant als hij niet behoort tot EPIf en als c ≤ EPIf ∪ DCf . 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 PRIf zijn de overblijvende p.i.’s. Het is uit deze verzameling dat wij een deelverzameling met minimale kost willen identificeren, die samen met EPIf 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 ∈ PRIf . Dan weten wij dat c ≤ EPIf ∪ (PRIf \ {c}) ∪ TRIf , 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 PRIf 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):
−
0 − 0 1 (G) EPIf = − 0 − 1 0 (H) − − 1 0 1 (I)
0 − 0 1 0 1
0 1 0 (A) 0 0 − (B) 0 − 0 (C) PRIf = 0 0 1 − 1 (D) 0 0 1 1 − (E) 0 − − 0 1 (F )
109
In dit particulier voorbeeld is TRIf leeg. Wanneer wij nu de bedekking nagaan van term A, bijvoorbeeld, dan bepalen wij eerst de cofactor fA van A in EPIf ∪ (PRIf \ {c}): (
)
− 0 − − − (H) − 1 − − − (C)
fA =
n
= w0
o
− − − − − (H)
+w
n
− − − − − (C)
o
Wij zien dus inderdaad dat fA een tautologie is. Daarvoor volstaat het dat de mintermen A · w0 = {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 PRIf , 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 PRIf . Wij vinden (
fB = = z0
− − − − 0 (C) − − − − 1 (F ) n
)
o
− − − − − (C)
+z
n
− − − − − (F )
o
Dit levert een voorwaarde op voor de realisatie van mintermen Bz 0 = {01000} en Bz = {01001}, wat kan door ofwel B ofwel C en F te includeren. Men cre¨eert een kolom voor Bz 0 = {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: (
fC
= = y
− − − 1 − (A) − − − 0 − (B)
n
)
− − − − − (A)
o
+ y0
n
− − − − − (B)
o
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 PRIf 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.
4.1.4
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 20 000 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
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 QuineMcCluskey 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 2n , en zoals gezegd, kan de complete som een kardinaliteit hebben tot 3n /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
Sf
Df
00 − 0 0 − 01 = 01 − 1 10 − − 0110 = 11 − 1
(4.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 7.16. 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 ´ naar de overdrachtsflipflop. Voor de schuifregisters encoderen wij de commando’s in twee e´ en
111
I 1 -
Inputposities e x y 0 0 0 0 0 1 0 1 0 1 0 1 1 1 -
z 0 1 0 1 0 1
X 0 0 0 1 0 1 1
Y 0 1 1 0 0 1 1
Z 1 0 1 0 1 1 1
Outputposities SH1 SH2 0 0 1 0 1 0 1 0 1 0 1 1 1 1
C1 0 1 1 0 1 1 1
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 e´ e´ n voor e´ e´ 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 e´ e´ 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 e´ e´ 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
De OFF-set van onze functie is R=
−100
0011 1110
In ons voorbeeld kan men de initi¨ele implicanten (inclusief deze in D) laten groeien tot
F=
−0 − 0 − − 01
10 − −
−1 − 1 0 − 10
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¨ele 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¨ele 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¨ele 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, e´ e´ 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 e´e´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 ci uit een priembedekking F essentieel is, wanneer Fi = (F ∪ D − {ci }) ci de termen van ci niet volledig bedekt. In het geval van ons voorbeeld vinden wij voor c1 :
F1 = (F ∪ D − {c1 }) c1
113
(4.3)
− − 01 −0 − 0 −1 − 1 −0 − 0 = 10 − − −0 − 0 0 − 10 −0 − 0 −00−
=
(4.4)
10 − 0 0010
(4.5)
Hierbij hebben wij gebruik gemaakt van de definitie van consensus: − − 01 −0 − 0 = z 0 w y 0 w0 = z 0 y 0 −1 − 1 −0 − 0 = yw y 0 w0 = ∅ 10 − 0 −0 − 0 = xy 0 w0 y 0 w0 = xy 0 w0 0 − 10 −0 − 0 = x0 zw0 y 0 w0 = x0 y 0 zw0 De resulterende lijst F1 bedekt c1 volledig; c1 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¨ele implicanten Le 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 − {ci } niet alle te realiseren mintermen bedekt. Men moet dus alle relatief essenti¨ele implicanten Le 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 Lt en partieel redundante Lp implicanten. De totaal redundante implicanten bedekken enkel DON’T CARE-termen (in de uitgebreide set) of termen die reeds bedekt worden door Le . Deze implicanten mogen onmiddellijk weggelaten worden, aangezien alle vereiste termen toch zullen bedekt worden door de weggelaten EPI’s en de implicanten in Le . De partieel redundante implicanten Lp bedekken ook andere mintermen, en mogen dus niet alle zomaar weggelaten worden. Evenwel is het zo dat steeds minstens e´ e´ n implicant uit Lp mag weggelaten worden zonder dat dit de realisatie van de functie in gevaar brengt. Dit is zo omdat geen enkele implicant in Lp relatief essentieel is. In ons voorbeeld zijn er geen totaal of partieel redundante implicanten; wij vinden dus
Le =
−0 − 0 − − 01
−1 − 1
10 − −
0 − 10
114
Lp = {
}
Lt = {
}
Het doel nu is de verzameling van overblijvende partieel redundante implicanten Lp 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¨ele 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 Lp . 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 ci kan gereduceerd worden tot c∗i ⊂ ci op voorwaarde dat c∗i alle termen bevat van ci die geen DON’T CARE-termen zijn en ook niet bedekt worden door Lp − {ci }. Men zal de kubussen in Lp dan e´ e´ n voor e´ e´ n reduceren, en na elke reductie ci vervangen door c∗i in Lp . 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 Lp 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 5-2-3-4 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 −0 − 0 − − 01
10 − −
−1 − 1 0 − 10
→
0000 0001 01 − 1 10 − − 0 − 10
Wanneer wij de expansie opnieuw proberen, volgens dalende afmetingen van de (gere-
115
duceerde) implicanten krijgen wij: 10 − − 0 − 10
10 − − 0 − 10 → 01 − 1 −1 − 1 0000 −00−
0001
dit wegens bedekking van 0001 door −00−. Wij hebben dus de kardinaliteit met e´ e´ 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: 10 − − 0 − 10 −1 − 1 −00−
→
101− 0 − 10 01 − 1 000−
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 4-5-2-3 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¨expandeerd 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¨ente 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
Beide operaties werden door Brayton et al. op een effici¨ente, recursieve manier ge¨ımplementeerd, gebaseerd op de Shannondecompositie van Boolese functies. Voor meer detail, zie [Brayton84].
4.1.5
Circuitrealisaties
De minimale som-van-produktenvorm die resulteert uit een tweeniveauminimalisatie kan eenvoudig afgebeeld worden op concrete circuits in de meeste technologie¨en. 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 2n mintermen individueel kunnen gebruikt worden.
4.2
Meerniveausynthese
4.2.1
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 e´ e´ 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´en 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
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¨en 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¨en 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 0 + abf g + abe0 g + aceg 0 + acf g + ace0 g + deg 0 + df g + de0 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 + e0 ) + eg 0 ). 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) ´ literal. De lasttransistor wordt vernetwerk van transistoren, elk gecontroleerd door precies e´ en vangen 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 0 (x1 , . . . , xn ) = fD (x01 , . . . , x0n )
118
waarin fD 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¨en, 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.
4.2.2
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
b c
b' c'
a
a d
f e'
y
d'
g
f' e
g
y'
g
e'
g e'
(a) Meerlaagse realisatie
(b) NEN-realisatie
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
Vdd g'
d
c
e
e' a
b
g f y'
g
f
g'
e'
e
c
d
a
b
y
d f g d e g'
(d) Tweelaagse realisatie
(c) Complexe CMOS-poort
Figuur 4.6: Tweeniveau- vs. meerniveaurealisaties
120
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 6= 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 = {u1 , u2 , . . . , un } 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 = {u1 v1 , . . . , un vn }. DELING(f ,g): for (i = 1 to n) { Vi = {vj ∈ V : uj = gi } } q = ∩i=1...m Vi 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 V1 = {df, ef }, V2 = {df, ef }, V3 = {df, ef } en V4 = {df, ef }. Uiteindelijk vinden wij q = ∩i=1...m Vi = {df, ef }, wat de representatie is van df + ef , het quoti¨ent. 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¨ent 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 LC . Definitie 4.14 Een Boolese SVP-vorm C1 + C2 + · · · + Ck is kubusvrij wanneer de doorsnede van de literalverzamelingen van de termen leeg is: ∩i=1,k LCi = ∅. Noteer dat een kubusvrije vorm minstens twee termen heeft. 121
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¨ent q een kubus is. Het quoti¨ent 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 li , 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 Lc . 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 (li in minstens twee termen van g){ c=grootste kubusfactor van g/li if (lk ∈ / c, k = 1, . . . , i){ R = R ∪ KERN(i, g/(c ∪ {li }))) } } } 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 definieren. 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
Kern beg 0 + bf g + be0 g + ceg 0 + cf g + ce0 g eg 0 + f g + e0 g f + e0 ab + ac + d b+c abf + abe0 + acf + ace0 + df + de0 bf + be0 + ce0 + cf
Co-kernen a d, ab, ac abg, dg, acg eg 0 , f g, e0 g aeg 0 , af g, age0 g ag
Niveau 2 1 0 1 0 2 1
Waarde 5 22 12 22 11 5 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 e´e´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 e´e´n term a.s.a. er minstens e´e´n kf ∈ K(f ) meer dan e´e´n term gemeenschappelijk heeft met een kern kg ∈ 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.
4.2.3
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 e´ e´ 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 e´ e´ 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¨en, 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
Bij semi-custom componenten, b.v. gate arrays, gelden nog strictere criteria. Hier kan elke knoop maar e´ e´ 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¨ent 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 + e0 )(abg + dg + acg) + abeg 0 + aceg 0 + deg 0 0
0
= (f + e )g(a(b + c) + d) + eg (a(b + c) + d)
124
(eerste stap)
(tweede stap)
Figuur 4.7: Een stelsel vergelijkingen en het corresponderend netwerk
Wanneer echter alle kernen in beschouwing genomen worden, dan krijgen wij: y = (eg 0 + f g + e0 g)(d + ab + ac) = (g(f + e0 ) + eg 0 )(a(b + c) + d)
(eerste stap) (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 e´ e´ n literal, en het rechterlid uit een Boolese vorm. De literals in de rechterleden die niet voorkomen in het linkerlid van e´ e´ 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¨elimineerd 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, e´ e´ n per functie. Wij veronderstellen ook dat wij de functies zowel in gefactoriseerde vorm, als in SVP-vorm ter beschikking hebben.
125
De synthesestap is het afsplitsen van een ‘goede’ gemeenschappelijke deelfunctie (het cre¨eren 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 e´ e´ 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(fi ) van een stel functies fi . 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 e´ e´ n factor, gemeenschappelijke kubussen uit de termen van F voorstellen, dit wil zeggen gemeenschappelijke sommen met meer dat e´ e´ n term uit de oorsponkelijke kernverzameling K. Dit zijn precies de kernintersecties die wij zoeken. Voorbeeld 4.12 Beschouw de volgende kernverzameling: K = {k1 , k2 , k3 }, met k1
= abc + de + f g
k2
= abc + de + f h
k3
= abc + f h + gh
Noteren wij abc = A, de = B, f g = C, f h = 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 + f h
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) − 1. 126
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 = argmaxy∈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¨extraheerd 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 e´ e´ n verzameling, en bepalen daarvan de kernen. De eigenlijke extractie en substitutie kan gebeuren met een algoritme gelijkaardig aan algoritme 4.10. 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
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 Df . 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) = x0 y + y 0 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 u0 f + uf 0 = u0 x0 y + u0 y 0 z + uxy + uxz 0 + uy 0 z 0 , 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 xj de literal die de output van knoop j benoemt, en weze fj een SVP-representatie van de functie gerealiseerd door deze knoop. De knoop zorgt er dus voor dat de variabele xj en de vorm fj steeds dezelfde waarde aannemen, en de situatie xj ⊕ fj = 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 X
DCinp (k) =
xj ⊕ fj
j∈FAN-IN(k)
Noteer dat, als j een inputknoop is, fj letterlijk gelijk is aan xj , 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 xk geassocieerd met de knoop k. Laat FAN-OUT(k) de verzameling knopen voorstellen die rechtstreeks gebruik maken van xk . Wanneer de output xj van alle knopen j ∈ FAN-OUT(k) niet afhangt van de waarde van xk 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 DCoutp (k) =
(fj |xk =1 ⊕ fj |xk =0 )0 .
Y j∈FAN-OUT(k)
Hierin is fj /xk de residufunctie van fj in de Shannon-expansie m.b.t. de variabele xk , en kan gevonden worden door in fj de waarde xk = 1 te stellen. Wanneer fj |xk =1 = fj |xk =0 hangt de waarde van fj niet af van xk (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
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 6= 11 die een getal groter dan 9 voorstellen, en alle gelijkaardige combinaties van abcd bij ef = 11. In meer formele notatie, met de volgorde {abcdef xyzw}: DXY ZW
={
− − − − 001 − 1−, − − − − 0011 − −, − − − − 011 − 1−, − − − − 0111 − −, − − − − 101 − 1−, − − − − 1011 − −, 1 − 1 − 11 − − − −, 11 − −11 − − − −}
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) ----000000 0000 ----000010 0010 ----000011 0011 ----000100 0100 ----000101 0101 ----000110 0110 ----000001 0001 ----000111 0111 ----001000 1000 ----001001 1001 ; optellen ----010000 ----010010 ----010011 ----010100 ----010101 ----010110 ----010001 ----010111 ----011000 ----011001
(ef = 01) 0001 0011 0100 0101 0110 0111 0010 1000 1001 0000
; aftellen ----100000 ----100010 ----100011 ----100100 ----100101 ----100110 ----100001 ----100111 ----101000
(ef = 10) 1001 0001 0010 0011 0100 0101 0000 0110 0111
129
----101001 1000 ; opladen (ef = 11) 000011---- 0000 000111---- 0001 001011---- 0010 001111---- 0011 010011---- 0100 010111---- 0101 011011---- 0110 011111---- 0111 100011---- 1000 100111---- 1001 ; don’t care-termen ----001-1- -------0011-- -------011-1- -------0111-- -------101-1- -------1011-- ---1-1-11---- ---11--11---- ----
Deze functies werden onderworpen aan een tweeniveauminimalisatie door SO, wat het volgende stelsel oplevert:
ESPRES -
X = aef + ef 0 w0 x0 y 0 z 0 + e0 f wyz + e0 w0 x + f 0 wx Y
= bef + ef 0 w0 x + e0 f wy 0 z + e0 w0 y + e0 yz 0 + f 0 wy + f 0 yz
Z = cef + ef 0 w0 x + ef 0 w0 yz 0 + e0 f wx0 z 0 + e0 w0 z + f 0 wz W
= def + ef 0 w0 + e0 f w0 + e0 f 0 w
Met het gemeenschappelijk gebruik van de term ef 0 w0 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 e´ e´ 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 0 w + e0 w0 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 0 w0 meer winst zou opleveren dan de gemeenschappelijke kern-´ee´ nterm ef 0 w0 x. De gemeenschappelijke kubussen e0 f w 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 0 x0 y 0 z 0 w0 + f (e0 yzw + ae) + x(e0 w0 + f 0 w) Y 5
= f (e0 y 0 zw + be) + y(e0 z 0 + f 0 z + e0 w0 + f 0 w) + ef 0 xw0
De volgende manipulaties werden uitgevoerd met behulp van de SIS-suite.
130
Functie W W W W W W Z Z Z Z Z Z Z Z Z Z Y Y Y Y Y Y Y Y Y Y Y X X X X X X X X
Co-kernen f e’ f’ w’ e 1 f w z e’ f’ w’ z’ ef’w’ e 1 f w f’y e’y y z e’ f’ w’ e 1 f w x e’ f’ w’ e 1
Kern e’w’ + de fw’ + f’w ew’ + e’w ef’ + e’f f’w’ + df ef’w’ + e’fw’ + e’f’w + def e’wx’z’ + ce e’fx’z’ + f’z e’w’ + f’w fwx’z’ + w’z ew’yz’ + ew’x + wz ef’yz’ + ef’x + e’z e’fwx’ + ef’w’y yz’ + x f’w’yz’ + f’w’x + cf e’fwx’z’ + ef’w’yz’ + ef’w’x + e’w’z + f’wz + cef e’wy’z + be e’fy’z + f’y z+w z’ + w’ e’z’ + e’w’ + f’z + f’w e’fwy’ + f’y yz’ + fwy’z + w’y ew’x + yz + wy ef’x + e’y f’w’x + bf e’yz’ + e’fwy’z + ef’w’x + e’w’y + f’yz + f’wy + bef e’wyz + ae f’x + e’fyz e’w’ + f’w w’x + fwyz ew’x’y’z’ + wx ef’x’y’z’ + e’x f’w’x’y’z’ + af ef’w’x’y’z’ + e’w’x + f’wx + e’fwyz + aef Tabel 4.2: De kernen van de BCD-teller
131
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 e’fw ef’w’ ef e’w’ f’w’ e’f ef’w’x
Aantal plaatsen in svp-vorm 3 5 4 4 4 4 2
Winst bij extractie 3 9 2 2 2 2 2
Tabel 4.4: Interessante gemeenschappelijke kubussen
132
Z = cef + z 0 (ef 0 yw0 + e0 f x0 w) + z(e0 w0 + f 0 w) + ef 0 xw0 W
= e0 f 0 w + def + w0 (ef 0 + e0 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 0 x0 y 0 z 0 w0 + f (e0 yzw + ae) + xg = f (e0 y 0 zw + be) + y(e0 z 0 + f 0 z + g) + h
Y
Z = cef + z 0 (ef 0 yw0 + e0 f x0 w) + zg + h = e0 f 0 w + def + w0 (ef 0 + e0 f )
W
g = e0 w0 + f 0 w h = ef 0 xw0 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 0 (f 0 y 0 z 0 h0 + e0 yz) + xg Y
= e0 y 0 zg 0 + bef + y(e0 z 0 + f 0 z + g) + h
Z = z 0 g 0 (f 0 y + e0 x0 ) + cef + zg + h W
= g(e0 w + f ) + g 0 (de + f 0 )
g = e0 w0 + f 0 w h = f 0 xg 0 wat 54 literals bevat. Na extractie van de gemeenschappelijke kubussen verkrijgen wij het uitgebreid stel vergelijkingen. X = x0 y 0 z 0 i + yk + aj + xg Y
= yi0 j 0 k 0 + i(yz + x) + y 0 k + bj
Z = e0 x0 z 0 g 0 + i(yz 0 + x) + cj + zg W
= deg 0 + g(e0 w + f ) + i
g = e0 w0 + f 0 w i = f 0g0 j = ef k = e0 zg 0 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
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 (x1 , . . . , xn ) een Boolese functie is van n variabelen, dan geldt f (x1 , . . . , xn ) = x01 f (0, x2 , . . . , xn ) + x1 f (1, x2 , . . . , xn ) waarbij men deze decompositie kan doen voor een willekeurige variabele xi . De functies f (0, x2 , . . . , xn ) en f (1, x2 , . . . , xn ) hebben een variabele minder, en worden de residufunctie genoemd van f met betrekking tot x1 . Men kan de Shannondecompositie uitbreiden tot meerdere variabelen, als volgt xi11 xi22 · · · xikk f (i1 , i2 , . . . , ik , xk+1 , . . . , xn ),
X
f (x1 , . . . , xn ) =
i1 i2 ···ik ∈{0,1}k i
i
waarin xjj = xj , als ij = 1, en xjj = x0j , als ij = 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 2n−1 residufuncties maar e´ e´ n variabele meer, zeg xn . De residufuncties kunnen dus slechts 4 gedaanten aannemen: 0, 1, xn , of x0n . 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 2n−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 2k 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 2j − 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
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) = s0 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 e´ e´ 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 f (x, y, z, w) = xy 0 z + x0 yz 0 + zw realiseren bij wijze van voorbeeld. 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 F1 en F2 de outputgedeelten van deze regels. Het nieuwe inputgedeelte I wordt bepaald zoals in Quine-McCluskey’s tabelmethode. Men vervangt de variabele xi waarin het verschil optreedt door een ‘−’. Wanneer wij de regel waarin de variabele xi als 0 optreedt regel 1 noemen, voldoet het nieuwe outputgedeelte F aan:
F =
F1 , als F1 = F2
xi , x0i ,
als F1 = 0 en F2 = 1 als F1 = 1 en F2 = 0
135
Deze regels modelleren in feite het laten samenvallen van twee paden in de multiplexerboom. Deze paden worden voorgesteld door de inputgedeelten I1 en I2 , met de variabele xi helemaal op het eind van het pad. De functie F stelt de functie voor, gerealiseerd door de multiplexer gecontroleerd door xi , en waaraan F1 resp. F2 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 xi ) wegglaten worden, en de twee paden vervangen door e´ e´ 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 F1 = F2 , of dat F1 , F2 ∈ {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 e´e´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 e´ e´ 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 {x0 z 0 , x0 z, xy 0 } nemen als maximaal compatibel stel. De gemeenschappelijke variabele is x. De Shannondecompositie op x is f (x, y, z, w) = x0 (yz 0 + zw) + x(y 0 z + zw) De tweede variabele is z in de tak geselecteerd door x0 , en y in de andere tak: f (x, y, z, w) = x0 (z 0 y + zw) + x(y 0 (z + zw) + yzw) = x0 (z 0 y + zw) + x(y 0 z + yzw) 136
Tabel 1 0000 0001 0010 0100 1000 0011 0101 1001 0110 1010 1100 0111 1011 1101 1110 1111
0 0 0 1 0 1 1 0 0 1 0 1 1 0 0 1
Tabel 2 00000-0 0-00 -000 00-1 0-01 -001 0010-10 -010 01001-0 -100 10010-0 1-00 0-11 -011 01-1 -101 10-1 1-01 011-110 1011-10 11011-0 -111 1-11 11-1 111-
0 0 y 0 z y 0 w 0 x 1 z’ x’ 0 z 0 1 1 0 x’ z 0 w’ 0 1 y’ 0 0 1 1 z w
Tabel 3 0-0-000-1-0-1 -1010– 1-0–11 -111–1
y 0 w z x’ z 0 1 w z
Figuur 4.8: Het opzoeken van de multiplexer-priemimplicanten
137
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
f(x,y,z,w) = xy’z + x’yz’ + zw z
x
y 0
x f
1
0 z f
y
1
z
x y
w 0 1
0
0
1
1
0 1
0
0 1
z 0
1
w
0 1
y
w
w
Producten:
Producten:
x’z’y x’zw xy’z xyzw
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 x0 z 0 , w voor x0 z, en z voor xy 0 en zw voor xy. De laatste residufunctie is niet triviaal. Een andere keus is het vijfde stel {yz, xz 0 , x0 z 0 }. De decompositie volgens dit stel is f (x, y, z, w) = z 0 (x0 y + x0) + z(y 0 (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¨expandeerd werden. De methode van Voith kan uitgebreid worden tot multiplexers met meer dan e´ e´ 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¨ent 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 e´ e´ 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¨ele 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
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¨ele 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 2n 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 2n × 2n . 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 Hn van orde n heeft dimensie 2n × 2n , en bestaat uit de getallen 1 en −1. Hij heeft een recursieve structuur
Hn =
" Hn−1
Hn−1
Hn−1 −Hn−1
[1]
#
als n > 0, anders.
Deze matrix heeft een aantal interessante eigenschappen. Hij is symmetrisch en niet-singulier, hij is proportioneel met zijn eigen invers met factor 2n , 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 bi =
M
xj
j∈Si
waarin Si ⊂ {1, 2, . . . , n} de plaatsen bevat (variabelenamen) waarin de binaire representatie van i 1 is. De Hadamardtransformatie of spectrum van een functie f F = Hn f is een kolomvector van 2n 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
van i en τ . Dan defini¨eren wij de convolutie of correlatie6 tussen twee functies f en g van n variabelen als n Rf g (τ ) = f ∗ g(τ ) =
2X −1
f (i)g(i ⊕ τ ).
i=0
Weze F = Hf en G = Hg de Hadamard-Walshtransformaties van resp. f en g. Dan geldt: = 2−n HF
(4.6)
g = 2−n HG
(4.7)
f
of, in componenten uitgeschreven, f (x) = 2
−n
n −1 2X
Hx,y F (y)
(4.8)
Hx,y G(y)
(4.9)
y=0
g(x) = 2
−n
n −1 2X
y=0
Wanneer wij dit in de uitdrukking voor Rf g (τ ) substitueren vinden wij: Rf g (τ ) =
n −1 2n −1 2X X
2−n Hi,x F (x)
i=0 x=0
= 2
−n
n −1 2X
= 2
n −1 2n −1 2X X
F (x)G(y)
n −1 2n −1 2X X
= 2
n −1 2n −1 2X X
n −1 2X
2−n Hi,x Hi⊕τ,y
(4.11)
i=0
Hτ,y F (x)G(y)
x=0 y=0 −n
(4.10)
y=0
x=0 y=0 −n
2−n Hi⊕τ,y G(y)
n −1 2X
2−n Hi,x Hi,y
(4.12)
i=0
Hτ,y F (x)G(y)2−n 2n δx,y
(4.13)
x=0 y=0
= 2
−n
n −1 2X
Hτ,y F (y)G(y).
(4.14)
y=0
Hierin hebben wij gebruik gemaakt van de orthogonaliteit van de rijen van H, en van het feit dat Hi⊕τ,y = Hτ,y Hi,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(22n ) berekeningen vraagt, terwijl dit via de getransformeerden, mits het gebruik van Fast Fourier-technieken, kan met O(n2n ) berekeningen. Complexiteit van functies De functie Rf g (τ ) meet de ‘gelijkenis’ tussen de ON-set van f en een over τ ‘verschoven’ versie van g. Wanneer f = g spreken wij over de autocorrelatie Rf f (τ ) 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
Rf f (τ ) 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 Rf f (τ ) 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 X G(f ) = Rf f (τ ) |τ |=1
is een dan maat voor het aantal mintermen die op afstand 1 liggen van een andere minterm, volgens e´ e´ 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 f1 (x, y, z, w) = x. Deze functie is bijzonder eenvoudig te realiseren. Haar autocorrelatiefunctie wordt gegeven door Rf1 f1 (τ ) = [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(f1 ) = 24 wijst op een goede implementeerbaardheid. De functie f2 = x(y ⊕ z ⊕ w) daarentegen heeft geen implicanten van dimensie groter dan 0. Haar autocorrelatiefunctie is Rf2 f2 (τ ) = [4, 0, 0, 4, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0]t en heeft maxima bij τ = 0011, 0101, 0110. De waarde G(f2 ) = 0 wijst op een moeilijke implementeerbaarheid.
Lineaire decompositie Zoals het voorbeeld aantoont, kan het zijn dat G(f ) niet groot is, maar dat Rf f (τ ) 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 coordinatentransformatie 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¨efficienten {0, 1}: (c1 x1 ⊕ c2 x2 ) ⊕ (c1 y1 ⊕ c2 y2 ) = c1 (x1 ⊕ y1 ) ⊕ c2 (x2 ⊕ y2 ). Stel dan dat wij, meer algemeen, voor een gegeven waarde van τ , een lineaire transformatie σ zouden kunnen vinden op de variabelen x = x1 , . . . , xn , die x afbeeldt op y: y(x) = σx 142
a=x⊕y
x
z
c=z y
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 e´ e´ 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 y1 y2 . . . yn 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 [y1 y2 . . . yn ] = 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). P
Wanneer wij de vectoren τi zodanig kiezen dat i Rf f (τ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 Rf f (x) maximaal is: τ1 = arg maxx6=0 Rf f (x). Weze L(v1 , . . . , vn ) de ruimte opgespannen door {v1 , . . . , vn }, d.w.z L(v1 , . . . , vn ) =
M
ci vi .
i=1,...,n
ci ∈{0,1}
Dan is τ2 = arg maxx∈L(τ R (x) / 1) f f en τ3 = arg maxx∈L(τ R (x) / 1 ,τ2 ) f f 143
enzevoort, dus we kiezen telkens die vector die Rf f (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 4.14. 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 Rf2 f2 (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 0 0 0 1 0 1 0 0 τ = 1 0 0 0 1 1 1 0 en dus
σ=τ
−1
=
0 0 0 1
0 1 1 0
1 0 1 0
0 0 1 0
.
¨ Wanneer wij de coordinaten 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 g2 (a, b, c, d) = dc, wat eenvoudiger is dan de oorspronkelijke functie f2 (x, y, z, w) = x(y ⊕ z ⊕ w). De realisatie van de functie wordt voorgesteld in figuur 4.12. De lineaire transformatie σ wordt gerealiseerd door middel van exclusieveOF-poorten, terwijl de residuele functie h gerealiseerd wordt als een som-van-producten (in dit geval e´ e´ n enkel produkt). Meervoudige functies in kubusvorm De voorgaande uitleg gaat er van uit dat wij maar e´ e´ 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 Rf f (x) herbekijken Rf f (x) =
n −1 2X
f (i)f (i ⊕ x),
i=0
dan zien wij dat Rf f (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
x
a=z
1 1 w
d=x
1 z
c = y⊕z⊕w
1
1
1
1
1 y
b=y
x y’ z’ w x y’ z w’
y z
b a
w
c
x
d
f2
x y z’ w’ x y z w
f2
(a) Rechtstreeks
(b) Na decompositie
Figuur 4.12: Originele realisatie en spectrale decompositie van de functie f2 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 2r , 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 e´ e´ 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
Definitie 4.21 Twee kubussen zijn disjunct wanneer hun inputgedeelten disjunct zijn (conflicterende co¨ordinaten (0,1) of (1,0) op minstens e´e´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 = (x1 , . . . , xn ) en y = (y1 , . . . , yn ) is een kubus z = (z1 , . . . , zn ) waarvan het outputgedeelte het resultaat is van de bitsgewijze EN tussen de outputgedeelten, en het inputgedeelte op plaats i gegeven wordt door zi =
xi
xi yi
, als xi = yi , als yi = − , anders.
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 4.19. 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 −10− 011 f (x) = 00 − − 101 1 − −0 110 en weze τ = 1 = 0001. Wij vinden −10− 011 f (x ⊕ (0001)) = 00 − − 101 1 − −1 110 en dus −10− 1101 f (x)f (x ⊕ (0001)) = 00 − − 1100 Het gewicht van deze functie wordt bepaald door de lijst −10− 1101 00 − − f (x)f (x ⊕ (0001)) = 1100 1101 1100
146
011 010 101 010
011 8 010 1 101 8 010 1
010 −1 010 −1
Figuur 4.13: Hazards in combinatorische netwerken
waarin wij de algebra¨ısche gewichten vermeld hebben. Hieruit volgt dat Rf f (0001) = 8 + 1 + 8 + 1 − 1 − 1 = 16
4.3
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 e´ e´ 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¨ente methoden gebaseerd op een ternaire analyse (zie o.m. 147
[Brzozowski95]). Zo kan men bij de verandering van e´ e´ 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 U V , het optioneel product van X 0 U en XV . De inclusie van dit product verandert de functie gerealiseerd door het netwerk niet, en zoals zo¨even 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) = x0 w0 + xy 0 z 0 + xzw0 + xz 0 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) = x0 wy 0 + xy 0 z + y 0 zw0 + xyw0 + x0 yz 0 + x0 y 0 w0 (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 (QuineMcCluskey). Duid de essenti¨ele priemimplicanten aan. 3. Doe voor de onderstaande netwerken in figuur 4.14 het volgende: 148
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. 4.15. Zoek een minimale realisatie (ook als taknetwerk). 5. Minimaliseer met behulp van Karnaughkaarten : T (A, B, C, D, E) =
X
(1, 2, 4, 5, 9, 10, 11, 15, 16, 18, 19, 21, 22, 25, 27, 31) 149
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 e´ 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 JeanPierre’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 e´ e´ n zo’n functie met 3 inputs x1 , x2 , x3 . Vereenvoudig dit netwerk zoveel mogelijk door het samennemen van schakelaars. (b) Teken hetzelfde taknetwerk van hierboven opnieuw, maar waarbij u aan x2 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 4.16. • bepaal de functie f (x0 , x1 , . . . , xn ) gerealiseerd door dit netwerk. (hint: proQ beer de functie te schrijven als een matrixproduct f = A i Bi C. 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
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 2n − 1. Laat Gray(n, x) de encodering voorstellen van een geheel getal x, gedefinieerd als volgt: Gray(1, 0) Gray(1, 1)
= 0; = ( 1;
Gray(n, x) =
0Gray(n − 1, x), als x < 2n−1 1Gray(n − 1, 2n − 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-Mullerrepresentatie van de functie f (x, y, z) = z(y + x0 ) + xy 0 z 0 . 12. Beschouw de volgende Boolese vorm: f (x, y, z, u) = xy 0 u0 + x0 u0 z 0 + x0 yz 0 u + yzu + x0 y 0 zu0 . (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-Muller 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: S(X, Y ) = (X + Y ) mod 3 (
C(X, Y ) =
1, 0,
X +Y ≥3 anders
met X, Y ∈ {0, 1, 2}. 14. Vind een niet-redundante som van priemimplicanten voor de functie f (x, y, z, w) gegeven door 0 − 0 1 ( 0 1 0 0 0 0 1 ONf = , DCf = 1 0 0 1 0 1 1 0 1 1 1
151
1 0
)
Gebruik de topologische methode. 15. Zoek een niet-redundante som van de functie 0 1
0 0 0 1 − 1 ON = 1 − 1 1 1 1 1 0
DC =
n
1 0 0 −
o
met behulp van de topologische methode. 16. Minimaliseer en realiseer als poortnetwerk X
T (A, B, C, D) = met
(0, 1, 5, 7, 8, 9, 12, 14, 15)
DC(3, 11, 13)
17. Realiseer gezamenlijk in minimale vorm, en als poortnetwerk: f1 (w, x, y, z) =
X
(1, 4, 5, 7, 13) met DC(3, 6)
f2 (w, x, y, z) =
X
(3, 5, 7) met DC(6)
f3 (w, x, y, z) =
X
(3, 4, 11, 13, 15) met DC(9, 14)
18. Minimaliseer met behulp van de tabelmethode f1 (x, y, z, w) =
X
(4, 5, 6, 12) + DC(7, 14)
f2 (x, y, z, w) =
X
(5, 9, 13, 15) + DC(7, 11)
Teken het resulterend netwerk. 19. Minimaliseer en realiseer onderstaande functie. Gebruik de topologische methode, en beoordeel de effici¨entie van de methode. f (x, y, z, w) = X 0 W + XY 0 W 0 + XY Z 0 W 0 DC = XY Z + XY Z 0 W + X 0 Y 0 Z 0 W 0 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 (
C(X, Y ) =
1, 0,
X +Y ≥4 anders
met X, Y ∈ {0, 1, 2, 3}. Gebruik de tabelmethode. 21. Bepaal de Reed-Mullerrepresentatie van de functies S1 , S2 , 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 (X1 , X2 ) en (Y1 , Y2 ), en vier outputs (Z1 , Z2 , Z3 , Z4 ). 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
Hoofdstuk 5
Analyse van Sequenti¨ele 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 X1 = 0 en X2 = 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 X1 ; in het ander geval X2 . 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. 5.1. Twee stabiele toestanden
Figuur 5.1: Een teruggekoppeld poortnetwerk
153
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 X1 = 0 en X2 = 0 (de schakelaars met opschrift X10 en X20 zijn gesloten). De output Y is 1 (het pad van Yin naar Yout is gesloten) wanneer de input X1 als laatste gelijk aan 1 was (contact X10 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 X2 als X1 = 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 )0 = X 0 + Y 0 = Y 0 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
+ 0 φ 1
0 0 φ 1
φ φ φ 1
1 1 1 1
· 0 φ 1
0 0 0 0
φ 0 φ φ
1 0 φ 1
0
0 1 φ φ 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 = 0 en X + X 0 = 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¨ele 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¨eel 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
bevinden. De hele voorgeschiedenis1 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 fs van een sequentieel netwerk met n inputs en m outputs is een eindige functie van de totale toestand fs : S × {0, 1}n → S De outputfunctie fu van dit netwerk is eveneens een eindige functie van de totale toestand fu : S × {0, 1}n → {0, 1}m De toestandsfunctie fs bepaalt de toestand waarheen het netwerk evolueert vanuit de huidige toestand wanneer een gegeven input wordt aangelegd. De outputfunctie fu 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 = fs (s, X). Noteer dat het ogenblik waarop de transitie naar de volgende toestand wordt uitgevoerd niet bepaald wordt door de functies fs en fu . Dit ogenblik wordt bepaald door de aard van de geheugens in het netwerk. Dit onderscheid bespreken wij verder. Men kan de sequenti¨ele netwerken verder opdelen op basis van hun outputfunctie fu . 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 fs en fu 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 ´ het netwerk gegenereerde outputsequenties, in de onderstelling dat het netwerk zich vo´ or 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 e´ e´ 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
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 fu en fs is incrementeel, en bijgevolg veel effici¨enter. 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¨ele netwerken heeft tot doel de functies fu en fs te vinden, om alzo het gedrag van het netwerk op een compacte en gemakkelijk toegankelijke manier voor te stellen. De meest-primitieve sequenti¨ele 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¨eren 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 X1 + X2 of X1 X2 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
a = (C(A(BD)0 )0 )0 = C 0 + AB 0 + AD0 b = (CA(BD)0 )0 = C 0 + BD + A0 e = (A(BE)0 )0 = A0 + BE Q1 = E Q2 = B 0 + E 0
y1 = (X2 + (X1 + Y1 )0 )0 = X20 (X1 + Y1 ) = X20 Y1 + X20 X1
Figuur 5.5: Knippen in teruggekoppelde poortnetwerken. Knipplaatsen worden zo gekozen dat men de vergelijkingen acyclisch maakt met een minimum aantal sneden
158
X1 X2 00 01 11 10 Y1 : 0 0 1 1
0 0 0 0 y1
1 1
ABE : 000 001 010 011 100 101 110 111
00
CD 01 11
10
111 111 111 111 110 110 110 111
111 111 111 111 110 110 110 111
011 011 011 011 100 100 100 101
011 011 011 011 100 100 010 011
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 2n 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 ´ en achter een knipplaats in een taknetwerk betekent dat van de Boolese waarden vo´ or 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 e´ e´ 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
Figuur 5.7: De transitiediagrammen afgeleid uit de transitietabellen. Notatie voor de toestanden: X1X2.Y resp. CD.ABE
160
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.
5.4.1
Races en meervoudige overgangen
In de tabellen van fig. 5.6 is het zo dat nieuwe toestanden die men met hamming-1overgangen op de inputs kan bereiken uit stabiele interne toestanden, in hoogstens e´ e´ 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 e´ e´ n of andere sequenti¨ele volgorde. Wanneer de variabelen niet simultaan moeten veranderen, maar e´ e´ n per e´ e´ n via een pad van onstabiele toestanden, spreken wij over een meervoudige overgang. Zo is, in fig. 5.7, de overgang van 00.111 onder C+ naar 10.100 via 10.111 en 10.101 een meervoudige overgang, maar geen race. Bij een race kan het voorkomen dat, op e´ e´ 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.
5.4.2
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 e´ e´ 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
y1 = C 0 Y2 + CY1 y2 = C 0 Y2 + CY10 + Y2 Y10
C Y1 Y2
00 01 11 10
0
1
00 11 11 00
01 01 10 10 y1 y 2
Figuur 5.8: Een netwerk met een essenti¨ele hazard.
optioneel product van twee termen die een hazard veroorzaken, een oplossing.
5.4.3
Essenti¨ele hazards
Naast de verwijderbare hazards, afkomstig van de combinatorische netwerken, is er ook een vorm van hazard die louter in sequenti¨ele netwerken met minstens twee terugkoppellussen bestaat. Men noemt ze essenti¨ele hazards. Op fig. 5.8 werd een netwerk met een essenti¨ele hazard voorgesteld. De ‘normale’ werking volgt uit de transitietabel. Wanneer de input verandert, doorloopt het netwerk de stabiele toestanden C.Y1Y2:
0.00 → 1.00 → 1.01 → 0.01 → 0.11 → 1.11 → 1.10
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
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 Y2 . Normaal zou dit moeten leiden naar de toestand 01. ´ de stijgflank Wanneer echter invertor 7 zeer traag is, zal C 0 niet op 0 gekomen zijn vo´ or op Y2 gevoeld wordt aan poort 1. Als gevolg wordt ook Y1 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 0.00 → 1.00 → 1.11 → 1.10 De essenti¨ele 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 (Y2 ). De essenti¨ele 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 ´ de gewijzigde toewerking veronderstelt immers dat inputsignalen aanwezig zijn vo´ or stand 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.
5.4.4
Ternaire analyse
Zowel statische hazards als essenti¨ele 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 e´ e´ 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 = U X 0 + 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 U V opnemen, dan wordt dit Y = 1·φ+1·φ+1·1 = 1 Men kan de ternaire analyse ook gebruiken om essenti¨ele 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
Figuur 5.9: Een generiek beeld van een teruggekoppeld circuit
tonen in het re¨eel 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.
5.4.5 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 e´ e´ n per e´ e´ n veranderd worden (hamming-1 inputs); • Alvorens een input veranderd wordt, moet men wachten tot het netwerk gestabiliseerd is (fundamentele mode); • De netwerken Ni zien eerst de inputverandering, en pas nadien de mogelijke toestandsverandering, en dit nadat het netwerk de inputverandering volledig verwerkt heeft (geen essenti¨ele hazards); Dit kan vereisen dat er extra vertraging aanwezig is in de terugkoppellussen (voorgesteld door de blokjes met een delta); 164
• Bij elke toestandsverandering zal er maar e´ e´ n toestandsbit veranderen (hamming-1 transities); • De netwerken Ni zijn hazardvrij voor hamming-1-inputveranderingen, en zullen dus nooit hazards genereren, aangezien de voorgaande eisen impliceren dat de netwerkinputs steeds maar over e´ e´ 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 X1 en X2 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 e´ e´ 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 Q1 , Q2 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 ´ en tijdens de stijgflank op C. Dit gedrag noemen wij kloksynchroon, waarvan D juist vo´ or bij 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 6.1.1 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¨ele netwerken zijn kunnen wij hun gedrag kenmerken door hun functies fu en fs . Bij de asynchrone cel in fig. 5.5(a) vinden wij y1 = X20 Y1 + X20 X1 . Deze cel heet een Set/Reset (SR) kipschakeling of flipflop. Normaal zijn de Set (X1 ) en Reset (X2 ) input niet samen gelijk aan 1. In deze omstandigheid zijn Y1 en Y2 elkaars 165
complement. Wanneer echter S = R = 1 dan is Y1 = Y2 = 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. y1 = R0 Y1 + S ;
Y2 = Y10 .
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: q1 = D ; Q2 = Q01 . 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 0 + Y K 0 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 e´ e´ 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 S2 R2 = 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 Y1 Y2 , X1 X2 : 00, 00 → 00, 10 . De toestand wijzigt zich in twee symbolen. Deze race is niet kritisch daar er maar e´ e´ n stabiele toestand is in de kolom X1 X2 = 10 . De overgang Y1 Y2 , X1 X2 : 11, 01 → 11, 00 166
Excitatievergelijkingen: S1 = X 1
R1 = X20 Y2
S2 = X1 X20 + X10 X2 Y10
R2 = Y10
00 Y1 Y2 : 00 01 11 10
00,01 01,01 01,00 00,00
X1 X2 01 11 00,11 00,11 00,00 00,00
10,01 10,01 10,00 10,00
X1 X2 00 01 11 10
10 10,11 11,11 11,10 10,10
Y1 Y2 : 00 01 11 10
00 00 01 10
01 01 11 10
10 10 11 10
y1 y2
S1 R1 , S 2 R2
(a) De excitatietabel
(b) De transitietabel
Figuur 5.10: Analyse van een netwerk met geheugencellen.
167
11 11 11 11
is meervoudig. Erger wordt het met de overgang Y1 Y2 , X1 X2 : 01, 01 → 01, 11 . De inwendige toestand wijzigt zich weer in twee symbolen (van 01 naar 10). Wanneer de sequentie 01 → 11 → 10 gevolgd wordt, komen wij in de stabiele toestand 11 terecht. Wanneer echter de sequentie 01 → 00 → 10 optreedt is de eindtoestand de (gewenste) toestand 10. Deze race is dus kritisch. Ze hangt af van de verschillen in looptijden van de input X1 naar S2 , en van de toestandsveranderlijke Y10 naar R2 (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 net´ werk. Deze moeten dus stabiel gehouden worden gedurende een zekere tijd vo´ or de actieve kloktransitie. De analyse van sequenti¨ele 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. 5.11 worden de toestandstabel en de eindtoestandentabel van het netwerk in fig. 5.10 getoond. Noteer dat men, voor Mealy-netwerken, in dezelfde tabel ook de outputs kan voorstellen. Voor een Moore-netwerk heeft men strikt genomen slechts e´ e´ n extra kolom nodig.
5.7
Opgaven
1. Analyseer het gedrag van de poortschakeling in fig. 5.12 (alle poorten zijn NAND = NIET–EN poorten). Wat doet dit circuit ? 2. Analyseer het netwerk in figuur 5.13. Dit is een deel van een commerci¨ele chip, een fase-detector. 168
X1 X2 Toestand
A B C D
00
01
11
10
A,00 A,01 B,11 D,10
B,00 B,01 C,11 D,10
D,00 D,01 C,11 D,10
C,00 C,01 C,11 C,10
Nieuwe Toestand, Y1 Y2
X1 X2 Toestand
A B C D
00
01
11
10
A,00 A,01 A,11 D,10
B,00 B,01 C,11 D,10
D,00 D,01 C,11 D,10
C,00 C,01 C,11 C,10
Nieuwe Eindtoestand, Y1 Y2
Figuur 5.11: De vervollediging van de analyse
Figuur 5.12: Teruggekoppeld poortnetwerk
169
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 U1 , D1 ) op de inputsequenties in figuur 5.13. 3. Analyseer de schakeling in figuur 5.14. (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 5.15. • 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. 5.16
170
Y
Z
X X Y Z
Figuur 5.14: Te onderzoeken netwerk
Figuur 5.15: Een asynchroon poortnetwerk
171
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. 5.18 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 7.22. 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. 5.19. (b) Geef een woordbeschrijving van het gedrag van de schakeling; omschrijf i.h.b. de voorwaarden waaronder z = 1.
172
Figuur 5.17: Te analyseren teruggekoppeld poortnetwerk
Figuur 5.18: Een teruggekoppeld netwerk in gemengde notatie
173
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 5.21. 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
X = ...01101 Z= ..1010 Y= ..00011 C
Aftrekker
klok D
Vraag 2 W
Vraag 1
Q
D C Q
Figuur 5.20: Figuren bij vraag 10
K
A
B
F X1 K
C D D D
X1
G
X2
X2 E
Figuur 5.21: Te analyseren circuit in vraag 11
175
A B C D E F
X=0 A,0 B,0 C,0 D,0 E,0 F,0
X=1 B,1 C,0 D,0 E,0 F,0 A,0
176
Hoofdstuk 6
Sequenti¨ele schakelingen en hun bouwstenen Nu wij een eerste kennismaking met het gedrag van sequenti¨ele schakelingen gehad hebben, zullen wij in dit hoofdstuk een kort overzicht geven van concrete sequenti¨ele bassischakelingen en hun gedrag. Dit overzicht heeft een gelijkaardige structuur als het overzicht van de combinatorische bouwblokken uit paragraaf 3.3.
6.1 6.1.1
Standaardcomponenten Sequenti¨ele SSI-componenten
De sequenti¨ele SSI-componenten zijn in feite elementaire geheugencellen of flipflops. Men vindt ze per e´ e´ n of per twee in een behuizing. Flipflops zijn de basisbouwstenen voor sequenti¨ele 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 types1 : 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 ´ de flank zal de nieuwe toestand van de flipflop was op de data-inputs net vo´ or bepalen. De outputs veranderen uiteraard na de klokflank. 1
De terminologie die hier gehanteerd wordt is slechts e´ e´ n van de gebruikte terminologie¨en. Wij zullen er echter in deze cursus consequent gebruik van maken.
177
Tabel 6.1: Een overzicht van de verschillende types flipflops verkrijgbaar als standaardcomponent D-gedrag S/R-gedrag T-gedrag J/K-gedrag
Asynchroon 7431 74LS279 MC1403B — —
Niveaugestuurd 74LS75 MC1402B
— —
Flankgestuurd 74LS74 MC14013B **
Pulsgestuurd **
** 74LS73A MC14027B
** 7476
**
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 e´ e´ 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 e´ e´ 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¨ele schakelingen op te bouwen uit flipflops is het nodig een meer gedetailleerd inzicht te verwerven in de
178
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 ts en th 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 ts en th 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 ts en th , namelijk gedurende de tijd dat de klokinput hoog is (dit is het geval bij bv. de 7476). Het symbool tp 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 tc 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 flip179
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.
Master J
K
Slave
Slave Q
D
Qm
Qb Qmb
Qs
Qsb
klok set
klok 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
Outputnetwerk
Output
Input Combinatorisch netwerk
Flipflop output
Flipflop
Input
Output
Outputnetwerk
Flipflop
Klok
Klok
Klok
(a)
Output
Toestandsnetwerk
Toestandsnetwerk
Flipflop
Flipflop input
Input
(b)
(c)
Tklok th
ts
Klok
Fliplopinput
Flipflopoutput tp
tc,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
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: Tklok > tp + tc,max + ts ; 4. moet het I-interval van een geheugencel disjunct zijn van het O-interval, om correctheid te garanderen bij tc = 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 e´ e´ 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
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¨ele 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 fc en een asynchroon datasignaal dat verandert met frequentie fd . Met ‘failure’ bedoelt men het verlopen van meer dan een tijd ∆t na de 183
1000 jaar 1010 74F
74AC
109 108 1 jaar
74ABT
107
74BCT
MTBF – seconden
106 105
1 dag
74Standard
104
74ALS 1 uur
103 102
1 minuut
101
74S
100 10-1 74HC
10-2
74LS fclk = 1 MHz fin = 500 kHz
10-3 74AS
10-4 0
2
4
6
8
10
12
4
16
18
20
22
24 4
26
28
30
32
34
36
38
40
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]) C1 MTBF = exp(C2 ∆t), fc fd waarin C1 en C2 technologie-afhankelijke constanten zijn. Bijvoorbeeld, voor ALS-TTL vindt men, met frequenties in MHz en tijden in ns, C1 = 0, 4 en C2 = 1, 151. Met een klokfrequentie van 10 Mhz en een datafrequentie van 5 Mhz, en met ∆t = 40 ns, wordt MTBF = 7, 84 · 107 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 6.5.
6.1.2
Sequenti¨ele MSI-componenten.
Sequenti¨ele componenten van MSI-complexiteit zijn eenvoudige sequenti¨ele 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
Alles wat gezegd werd over het klokgedrag van individuele flipflops blijft uiteraard van toepassing op de sequenti¨ele MSI-componenten.
6.1.3
Sequenti¨ele 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¨en (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¨en 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¨eindigt zal meteen ook de leesoperatie be¨eindigen.
185
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 e´e´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 e´ e´ 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 = 2k bits capaciteit heeft, en woorden van w = 2j bits, dat heeft men a = log2 (n/w) = k − j adreslijnen nodig, en w datalijnen. De grootheid 2j − 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
Figuur 6.6: Structuur en aansturing van een statische RAM-chip Tabel 6.2: De eigenschappen van enkele commerci¨ele statische geheugenchips. De chip gemerkt met (*) is een tweepoortgeheugen Type capaciteit woordbreedte (bit) (bit) CY10E494-7 64 K 4 HM100506 256 K 4 HM828128-7 1M 8 HM6708-20 256 K 4 MCM67282 1M 4 CY7B134(*) 32 K 8 MCM63F733A 4M 32
toegangstijd (ns) 7 11 70 20 10 20 11
technologie ECL ECL CMOS Bi-CMOS Bi-CMOS Bi-CMOS CMOS
pinnen 28 32 32 24 32 48 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¨erarchie van moderne microprocessors. Tabel 6.2 geeft een idee van de eigenschappen van bestaande statische geheugens.
187
W' CAS' Klokgen. nr. 2
A0..A9
data in buffer
D
data out buffer
Q
kolomadres buffer
kolomdecoder
refresh controller
senseversterkers
woordlijn Geheugencondensator
refresh teller
Gnd
bitlijn
rijadresbuffer RAS'
Klokgen. nr. 1
matrix 512 x 2048
rijdecoder
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 e´ e´ 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¨ele 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
1,5 mm 0,8 mm
gateoxide van FET
geheugencondensator elektroden bitlijn
bitlijn woordlijn
n+-diffusie snijvlak 1 doorheen woordlijn
woordlijn
snijvlak 2 parallel met bitlijn
geheugencondensator elektrode 2 geheugencondensator dielektricum
geheugencondensator elektrode 1
woordlijn geleidend steeltje contact met source van FET
bitlijn
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
niveaus door de leesversterkers (Eng. Sense Amplifiers). De versterkers zijn niets anders ´ de dan asynchrone flipflops waarvan de voedingsspanning afgeschakeld is tot net vo´ or 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 e´ e´ 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 211 rijadressen afloopt tegen een tempo van e´ e´ n per 16 µs, wordt e´ e´ 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 e´ e´ 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 e´ e´ 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
Tabel 6.3: De eigenschappen van enkele commerci¨ele 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 HM51256-8 256 K × 1 155 85 40 16 MCM516100-60 16 M × 1 130 60 30 24 MCM516400-60 4M×4 130 60 30 24 HM571000-35 (*) 1M × 1 75 35 25 28 DM2202-15 (**) 1M × 4 65 35/15 15 28
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 e´ e´ 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 e´ e´ 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
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 e´ e´ 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 e´ e´ n of meerdere combinatorische operatoren, die onderling geconnecteerd worden door e´ e´ 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 e´ e´ n controllerchip kunnen opgelost worden. Dit vereist uiteraard dat alle nodige systeemonderdelen ge¨ıntegreerd werden op e´ e´ 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
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 e´ e´ 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: e´ e´ 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¨ele 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 e´ e´ 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¨ele getallen in e´ e´ n of andere voorstelling. De basisstap in vele digitale filters is de evaluatie van de uitdrukking y = a1 X1 + a2 X2 + · · · + an Xn waarin de ai co¨efficienten zijn, en de Xj 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¨effici¨enten en de signaalwaarden gelijktijdig uit een geheugen te halen. Voorbeelden van dergelijke processors zijn de TMS320C40 en de MC56000. 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¨eren 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
P0.0 ... P0.7
Data Address Register
Port 0 Drivers
P2.0 ... P2.7
Port 2 Drivers Voorziening voor extern geheugen
Port 0 Latch
RAM
Port 2 Latch
EPROM
Program Address Register
Accumulator Stack Pointer
B-register
klok
Temp2
Temp1
Timing, controle
Interrupt, seriele poort, timers
ALU
instructieregister
Buffer PC Incrementer Program Counter
PSW DPTR
Port 1 Latch
Port 1 Drivers
P1.0 ... P1.7
Port 3 Latch
Port 3 Drivers
P3.0 ... P3.7
Figuur 6.9: De structuur van Intel’s 8031 8-bit microcontroller
194
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 TMS34020. Andere toepassingen slaan op de snelle interpretatie van PostScript in printers. Processors voor speciaal gebruik hebben heel vaak specifieke architecturale aspecten voor de effici¨ente 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¨ele 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
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¨erarchisch 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¨erarchisch 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
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
Tabel
6.4: Enkele complexe programmeerbare componenten; kijk ook http://www.asicdsn.com/vendors.html voor meer recente informatie Component Complexiteit CLB’s of Type I/O- Programmeer(equiv. poorten) Macrocellen signalen techniek Am3090 9 000 320 Cell Array 144 Geheugen EPM5192 3 750 192 PLA-achtig 72 Vlottende gate EPM7192 20 000 192 PLA-achtig 124 Vlottende gate CY7C342 5 000 128 PLA-achtig 60 Vlottende gate CY7C38020 20 000 1 440 PLA-achtig 328 Antifuse TPC1020B 2 000 547 Cell Array 69 Antifuse TPC1280 8 000 1 232 Cell Array 140 Antifuse XC4020 20 000 900 Cell Array 240 Geheugen XC40125EX 125 000 4 624 Cell Array 544 Geheugen
naar
Tabel 6.5: Recente complexe programmeerbare componenten met extra geheugenblokken Component ProASIC APA1000 (Actel) Spartan-IIE XC2S300E (Xilinx) Virtex-E XCV812E (Xilinx) Apex II EP2A70 (Altera)
Complexiteit (equiv. poorten) 1M 300 000 254 016 3 000 000
Functiegeneratoren 6 912 21 168 67 200
Geheugen flipflops blok (bits) 198 000 88 × 256×9 98 304 16 × 4 096 301 056 280 × 4 096 67 200 280 × 4 096
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¨ele) 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
Hoofdstuk 7
Sequenti¨ele synthese op logisch niveau Dit hoofdstuk heeft als doel in detail de stappen van het syntheseproces van sequenti¨ele 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¨ele 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 e´ e´ 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¨ele netwerken? In Hoofdstuk 4 hebben wij gezien dat een incrementele beschrijving, die gebruik maakt van de interne toestand en de twee functies fu en fs , compact en effici¨ent 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
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. ´ input X en e´ en ´ output Y . De output Voorbeeld 7.1 Ontwerp een synchroon netwerk met e´ en moet steeds 0 zijn, tenzij wanneer in de inputsequentie juist de deelsequentie 11010 is opgetreden : X : 0 0 1 0 1 1 0 1 0 0 1 1 1··· Y : 0 0 0 0 0 0 0 0 0 1 0 0 0··· (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 11010 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 7.1 1. [Begin van sequentie] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap 3. 2. [Enkel 0 gezien] Output 0; Als X = 0, ga dan naar stap 4, anders naar stap 5. 3. [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 11010 moeten herkennen in de inputsequentie, van de laatst geziene 0 enkel moet onthouden worden of ze voorafgegaan wordt door 11 of 1101. In de andere gevallen hebben wij geen deel gezien van de te 200
´ de 0 kwam. Mits wij herkennen sequentie, en moeten wij dus niet onthouden wat vo´ or stap 2 wijzigen kunnen wij dus stap 4 laten samenvallen met stap 2. Zo verder gaand vinden wij : Algoritme 7.2 1. [Begin van sequentie] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap 3. 2. [Een 0 gezien, niet voorafgegaan door 11 of 1101] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap 3. 3. [Een 1 gezien, niet voorafgegaan door 1 of 110] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap 4. 4. [11 gezien] Output 0; Als X = 0, ga dan naar stap 5, anders naar stap 4. 5. [110 gezien] Output 0; Als X = 0, ga dan naar stap 2, anders naar stap 6. 6. [1101 gezien] Output 0; Als X = 0, ga dan naar stap 7, anders naar stap 4. 7. [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 fs en fu 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
.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 => --...11 gezien if data=’0’ then state<=E; else state<=D; end if; when E => -- ...110 gezien if data=’1’ then state<=F; else state<=B; end if; when F => -- ...1101 gezien if data=’0’ then state<=G; else state<=D; end if; when G => -- ...11010 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
Toestand A B C D E F G
X 0 B B B E B G B
1 C C D D F D C
Y
Informatie over vorige inputs
0 0 0 0 0 0 1
initi¨ele toestand 0 niet voorafgegaan door · · · 11 of · · · 1101 1 niet voorafgegaan door · · · 1 of · · · 110 · · · 11 · · · 110 · · · 1101 · · · 11010
Figuur 7.2: Primitieve transitietabel voor Voorbeeld 7.1 Toestand A B C D E F G H I J
00 A D A D – – D J J J
X1 X2 01 11 B – B E – F B – B E H F – F H F – F B –
Y 10 C – C G G I G – I I
0 0 0 0 0 1 0 1 1 1
Informatie over vorige inputs X1 tijdens X2 ↑ X1 X2 – 0 0 0 0 1 – 1 0 0 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 1 0 0
Figuur 7.3: Primitieve transitietabel voor Voorbeeld 7.2
´ output Y. De Voorbeeld 7.2 Ontwerp een asynchroon circuit met twee inputs X1 en X2 , en e´ en output verandert enkel na een stijgende flank op X2 ; de output is 1 resp. 0 na een stijgflank op X2 met X1 = 1 resp. X1 = 0. (Noteer dat dit een gedragsomschrijving is van de flankgestuurde geheugencel met D-gedrag in fig. 5.5.)
Laat ons beginnen met X1 = 0, X2 = 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 e´e´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
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¨eren 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 e´e´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 e´ e´ 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 fu : S × {0, 1}n 7→ {0, 1}m fs : S × {0, 1}n 7→ S respectievelijk de output- en toestandsfuncties gedefinieerd door de ttt. 204
Stelling 7.1 Twee toestanden p en q ∈ S zijn gelijkwaardig a.s.a. 1. fu (p, X) = fu (q, X), ∀X ∈ {0, 1}n (p en q zijn outputcompatibel). 2. fs (p, X) ∼ fs (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 6= q. Merk deze koppels aan die outputincompatibel zijn, d.i. waarvoor ∃X ∈ {0, 1}n : fu (p, X) 6= fu (q, X) 2. Doe voor alle koppels (p, q) die wel outputcompatibel zijn het volgende: zoek alle opvolgerkoppels (fs (p, X), fs (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) : {(p0 , q 0 ) : ∃X ∈ {0, 1}n : p = fs (p0 , X) en q = fs (q 0 , 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 e´ e´ n algoritme; er bestaan echter diverse verwante algoritmen hiervoor, zie o.m. cursus ‘Discrete systemen’.
205
(b) Stel dat fs (p, X0 ) 6∼ fs (q, X0 ), voor een gegeven X0 ∈ {0, 1}n . Uit de definitie van ∼ volgt dan dat er een eindige sequentie van inputs X1 , X2 , . . . , Xk , k > 0, bestaat waarvoor er een verschil in outputs waargenomen wordt, d.i., fu (Fs (p, X0 X1 · · · Xk−1 ), Xk ) 6= fu (Fs (q, X0 X1 · · · Xk−1 ), Xk ). Hierin is Fs (p, X0 X1 · · · Xk−1 ) = fs (fs (· · · fs (p, X0 ), X1 ) · · · , Xk−1 ), de toestand die bereikt wordt vanuit p na aanleggen van X0 X1 · · · Xk−1 . Wij veronderstellen dat X0 X1 · · · Xk−1 een kortst mogelijke zulke sequentie is. De toestanden Fs (p, X0 X1 · · · Xk−1 ) en Fs (q, X0 X1 · · · Xk−1 ) zijn niet outputcompatibel, en werden dus zeker aangemerkt in stap 1 van het algoritme. Alle tussentoestanden Fs (p, X0 X1 · · · Xj ) en Fs (q, X0 X1 · · · Xj ), 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 (Fs (p, X0 X1 · · · Xk−1 ), Fs (q, X0 X1 · · · Xk−1 )) tot aan het koppel (p, q). De onderstelling dat (p, q) niet gemerkt was leidt dus tot een tegenspraak, waaruit volgt dat fs (p, X0 ) ∼ fs (q, X0 ), en dus, samen met (a), dat p ∼ q. 2. Terminatie 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
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 FG ∗ ∗
Hierin staat M voor gemerkt, en U voor gebruikt. Het resulterend gelijkwaardig koppel is (A, B). Minimale ttt: X A C D E F G
0 A A E A G A
Y 1 C D D F D C
0 0 0 0 0 1
Figuur 7.4: De minimalisatie van de volledig gespecificeerde ttt van Voorbeeld 7.1
207
Hoe kan men deze vervollediging doorvoeren? Een mogelijke manier zou zijn alle 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.
|S|d
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 e´ e´ n enkele aanvulling, maar van een (ongekend) mengsel van alle nuttige aanvullingen. De resulterende compatibele koppels die men verkrijgt zijn dus niet afkomstig van e´ e´ n enkele equivalentierelatie (die zou ontstaan zijn bij e´ e´ 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
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 ∗ ∗ FG ∗ ∗ FH FI FJ ∗ ∗ 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 7.2
209
Minimale ttt (met a = (A, B, D, E), b = (A, C, D, G), c = (F, H, I), d = (I, J)):
(ABDE) (ACDG) (F HI) (IJ)
00 (AD) (AD) (J) (J)
X1 , X 2 Y 01 11 10 (B) (E) (CG) 0 (B) (F ) (CG) 0 (H) (F ) (I) 1 (B) (F ) (I) 1
a b c d
X1 , X 2 Y 00 01 11 10 a of b a a b 0 a of b a c b 0 d c c c of d 1 d a c d of c 1
Figuur 7.6: De minimalisatie van de onvolledig gespecificeerde ttt van Voorbeeld 7.2 – vervolg
Toestand A B C D E F G H I J
X1 X2 00 01 11 10 A,0 B,0 –,– C,0 D,0 B,0 E,0 –,– A,0 –,– F,1 C,0 D,0 B,0 –,– G,0 –,– B,0 E,0 G,0 –,– H,1 F,1 I,1 D,0 –,– F,1 G,0 J,1 H,1 F,1 –,– J,1 –,– F,1 I,1 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
1. Schrijf een Boolese vorm waarin de incompatibele paren voorkomen als sommen, b.v. voor voorbeeld 7.2, M I = (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: M I = (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 M I 1 maken zijn dus compatibele klassen. De uitwerking tot een som van producten vereist dat minstens e´ e´ 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
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 S1 , S2 , . . . , Sk vinden dat voldoet aan: 1. het gekozen stel moet alle toestanden van S omvatten:
Sk
j=1 Sk
= S.
2. het gekozen stel moet stabiel zijn onder fs . Dit wil zeggen dat, voor elke gegeven input X, alle opvolgertoestanden van een klasse Sj in dezelfde klasse Sl(X,j) moeten vallen: ∀j ∈ {1, 2, . . . , k} en ∀X ∈ {0, 1}n ∃l ∈ {1, 2, . . . , k}: {fs (s, X): s ∈ Sj } ⊆ Sl 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¨eren 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
overeenstemmen. Sommige opvolgerklassen kunnen tot meer dan e´ e´ n klasse behoren. Men heeft dan vrijheid in de keuze van de opvolgertoestand. Deze keuze kan gericht zijn op de minimalisatie van fs en fu , of op het vermijden van races (zie verder). Opmerking. In moderne technologie¨en 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 e´ e´ n of meerdere geheugenelementen in de realisatie kan soms grote besparingen met zich brengen bij de realisatie van de combinatorische functies fs en fu . 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¨en 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 = dlog2 re binaire geheugencellen nodig. Het aantal mogelijke assignaties van de r rijen aan de 2n mogelijke bitpatronen wordt gegeven door N = r!
2n r
!
=
(2n )! , (2n − r)!
een zeer snel groeiend aantal. De gekozen assignatie be¨ınvloedt tal van factoren, o.m. de complexiteit van de te realiseren combinatorische functies fs en fu en, in asynchrone netwerken, de aanwezigheid van hazards en kritische races. Strikt genomen mogen wij, m.b.t. fs en fu , alle 2n mogelijke complementeringen van de n toestandsvariabelen als gelijkwaardig beschouwen, evenals hun n! permutaties. Dit reduceert N tot het aantal wezenlijk verschillende assignaties ND ND =
(2n − 1)! , (2n − r)!n!
echter nog steeds een zeer snel groeiende grootheid. Er bestaan op dit ogenblik geen effici¨ente algoritmische methoden die, gegeven het type geheugencellen dat men gebruikt, een optimale assignatie opleveren. Er bestaan echter wel een aantal goede heuristische methoden.
213
7.4
Toestandsassignatie in synchrone netwerken
In synchrone netwerken spelen hazards in de combinatorische functies fs en fu 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 fs en fu . Laat ons veronderstellen dat wij met D-type geheugencellen werken, en laat ons de complexiteit van de toestandsfunctie fs analyseren. De functie fs bestaat uit n Boolese functies, e´ e´ 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 A C D E F G
Y1 Y2 Y3 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1
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 fs : A A C C D D E E F F G G don’t care
x Y1 Y2 Y3 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 − 1 1 −
y1 y 2 y3 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 1 1 1
Na minimalisatie vinden wij het volgend resultaat: y1 = Y2 Y3 X + Y1 Y30 X 0 y2 = Y2 Y30 + Y1 Y30 X + Y10 Y20 Y3 X y3 = Y10 Y20 Y30 X + Y2 Y30 X 0 + Y1 Y30 X 0 + Y1 Y3 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 fs . 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
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 fs dezelfde waarden aannemen op naburige cellen. Deze cellen kunnen dus samengenomen worden tot een grotere sub-kubus, en zullen de functies in fs 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 fu . Deze regels werden geformaliseerd door [Armstrong62] als volgt. Assignatieregels van Armstrong 1. Wanneer fs (p, X) = fs (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, fs (p, X) = p en fs (q, X) = q, of fs (p, X) = q en fs (q, X) = p, dan geeft men p en q best naburige coderingen. 3. Wanneer fs (p, X1 ) = p1 en fs (p, X2 ) = p2 , en X1 en X2 zijn naburig, dan geeft men p1 en p2 best naburige coderingen. 4. Wanneer fu (p, X) = fu (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¨eren 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
A C D E F G
Y1 Y2 Y3 0 0 0 0 0 1 0 1 1 1 0 1 0 1 0 1 0 0
afleiden, die leidt tot de volgende functies in fs : y1 = Y2 X 0 y2 = Y2 X + Y3 X y3 = Y30 X + Y2 Y3 + Y10 X, 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
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 regels2 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 fs zo eenvoudig mogelijk worden. Een groepering van toestanden in S in mutueel disjuncte klassen Sj 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 fs , d.w.z. wanneer de opvolgertoestanden van elke klasse Sj 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 dlog2 pe bits voor de identificatie van een blok, en dlog2 qe bits voor de bijkomende identificatie van de toestand binnen een blok. Het is duidelijk dat de n∗ = dlog2 pe + dlog2 qe bits elke toestand ondubbelzinnig voorstellen. Indien n∗ = n = dlog2 re, dan hebben wij een potentieel interessante encodering gevonden. Inderdaad, daar π stabiel is, zijn de functies in fs 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 dlog2 qe 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
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¨ele 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 B1 ∈ π1 en B2 ∈ π2 bestaan zodanig dat B = B1 ∩ B2 , en dus dat q ∈ B1 en q ∈ B2 . Weze fs (B1 , X) de verzameling opvolgertoestanden van toestanden in B1 onder input X. Daar π1 en π2 stabiel zijn volgt ∃B10 ∈ π1 fs (B1 , X) ⊆ B10 en ∃B20 ∈ π2 fs (B2 , X) ⊆ B20 . Bijgevolg is fs (B1 , X) ∩ fs (B2 , X) ⊆ B10 ∩ B20 ∈ g.l.b.(π1 , π2 ), en dus fs (q, X) ∈ fs (B1 ∩ B2 , X) ⊆ fs (B1 , X) ∩ fs (B2 , X) ⊆ B10 ∩ B20 ∈ 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 e´ e´ 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
Opvolgerboom CE | | AA
| DF | | EG |
| AA
| DD | FC |
| AG | | AA
| DD
Beginkoppel
Partitie
CE
(ACDEFG)
DF
(AGE)(DCF)
EG
(AGE)(CF)(D)
FC
(AG)(CF)(D)(E)
AG
(AG)(C)(D)(E)(F)
| CC
Figuur 7.9: Het vinden van stabiele partities van een ttt
3. Markeer alle opvolgerkoppels die maar e´e´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 7.10. 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
Partitie
Gegenereerd door
πmax = (ACDEF G) AC, AD, AF, CE, CG, DE, DG, EF, F G | (AGE)(CDF ) CD, DF | (AGE)(CF )(D) AE, EG | (AG)(CF )(D)(E) CF | (AG)(C)(D)(E)(F ) AG | πmin = (A)(C)(D)(E)(F )(G)
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 Y1 afhangen van de partitie (AGE)(CDF ), en het bit Y2 van de partitie (AG)(CF )(D)(E). Dit wil zeggen dat de combinatie Y1 Y2 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 Y3 . Wij verkrijgen de assignatie
A G E C F D
Y1 Y2 Y3 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0
219
die leidt tot de volgende functies in fs : y1 = X y2 = Y1 Y2 + Y1 X y3 = Y10 Y2 X + Y1 Y3 X 0 , 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 e´ e´ n bit voor in de toestandsencodering. De functie in fs 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 fs en fu . 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¨ele 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 (a, b), (b, c), (c, d), (d, a). Het blijkt dat met de assignatie a = 00 b = 01
d = 10 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(log2 r)/2 transities bestaan, en elke toestand heeft slechts log2 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
X1 , X 2 00 01 11 10 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 fs ), ten koste van een tragere werking. Wij zullen nu kort twee methoden bespreken, e´ e´ 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 Si → Sj en Sp → Sq rechtstreekse overgangen (mogelijk over afstand d > 1). In de overgang Si → Sj 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 Si en Sj . De race tussen de d variabelen die veranderen leidt tot een aantal paden van Si naar Sj . De race is kritisch wanneer 1. ofwel een stabiele toestand Sk voorkomt op e´ e´ n van de paden van Si naar Sj ; 2. ofwel een pad van Si → Sj kruist met een pad van Sp → Sq . Het optreden van de gevallen (1) of (2) hierboven kan voorkomen worden wanneer de waarde van minstens e´ e´ n niet-veranderende toestandsvariabele in een transitie Si → Sj 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. 7.11.) 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 Si → Sj en Sp → Sq transities zijn, en Sk een stabiele toestand naar waar geen overgang gebeurt, dan moet de partitielijst de parti¨ele partities (Si , Sj )(Sp , Sq ) (Si , Sj )(Sk ) bevatten.
221
De parti¨ele partities die wij volgens dit kriterium vinden voor Voorbeeld 5.3 zijn π1 π2 π3 π4 π5
: (ad)(bc) : (ad)(ce) : (be)(cd) : (a)(be) : (a)(cd).
π6 π7 π8 π9
: (bd)(ce) : (ab)(cd) : (ab)(e) : (cd)(e)
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 e´ e´ n toestandsvariabele moet ge¨ınduceerd worden. Het is duidelijk dat, wegens de parti¨ele 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 Y1 laten overeenkomen met deze gecombineerde partitie, dan zal Y1 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¨ele partitielijst van de toestandsruimte van het ttt voor op een ternaire manier: stel toestanden in e´e´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 e´e´n van beide gelijk is aan ‘–’. (b) (πi , πj0 ) combineerbaar is, waarbij πj0 0 bevat i.p.v. 1, en 1 i.p.v. 0. 3. Zoek de maximale compatibele klassen uit de lijst van combineerbare koppels. 4. Zoek een minimale set van maximale compatibele klassen die alle initi¨ele 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 π2 π3 π4 π5
: (0110−) : (0 − 101) : (−0110) : (01 − −1) : (0 − 11−)
π6 π7 π8 π9 . 222
: (−0101) : (0011−) : (00 − −1) : (− − 001)
Combineerbare koppels (enkel de partitienummers werden geschreven): (1, 2)(1, 4) (2, 4)(2, 6)(2, 8) (3, 40 )(3, 5)(3, 7)(3, 90 ) (4, 5)(4, 9) (5, 7)(5, 8)(5, 90 ) (6, 8) (7, 8)(7, 90 ) (8, 9) Maximale compatibele klassen: A B C D
(1, 2, 4) E (2, 6, 8) F (3, 5, 7, 90 ) G (3, 40 ) H
(4, 5) (4, 9) (5, 7, 8) (8, 9)
Minimale cover: 1 2 3 4 5 6 7 8 9 → 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: a b c d e
Y1 Y2 Y3 0 0 0 1 0 0 1 1 1 0 0 1 1 1 0
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 X1 X2 = 00 is het essentieel dat Y1 = 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 fs terdege moet rekening houden. De combinatorische functie y1 b.v. moet constant 1 blijven, zelfs wanneer 2 inputs veranderen! 223
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 e´ e´ 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: 0010 → 0001 als 0010 → 0011 → 0001. Wij gebruiken dus een intermediaire onstabiele toestand eigen aan de transitie. Wanneer men deze assignatie toepast krijgen de functies yi , i = 1, 2, . . . , r in fs een speciale vorm: yi = Ti + Hi Yi . Hierin noemt men Ti de transitieterm en Hi 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 Yj op 1 komt, en pas dan Yi 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
a b c d e
Y1 Y2 Y3 Y4 Y5 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
Voor y2 vinden wij: 1. transities naar b: vanuit e voor X1 X2 = 01, en vanuit a voor X1 X2 = 10. Dus T2 = X10 X2 Y5 + X1 X20 Y1 . 2. transities vanuit b: naar c en naar d. De variabele Y2 moet 1 blijven zolang de tussentoestanden (01100) of (01010) niet bereikt werden, dus H2 = (Y3 + Y4 )0 = Y30 Y40 . Hieruit volgt: y1 y2 y3 y4 y5
= X10 X20 Y4 + Y20 Y40 Y1 = X10 X2 Y5 + X1 X20 Y1 + Y30 Y40 Y2 = X10 X20 (Y2 + Y5 ) + X1 X20 Y4 + Y40 Y50 Y3 = X10 X2 Y3 + X1 X2 (Y1 + Y2 ) + Y10 Y30 Y4 = X1 X2 Y3 + Y20 Y30 Y5
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 y1 b.v. heeft een statische 1-hazard voor X1 = X2 = 0, Y1 = 1, Y2 = 0, en Y4 : 0 → 1. Deze hazard is gevaarlijk bij de transitie d → a in de kolom X1 X2 = 00. Inderdaad, wanneer Y4 → 0 moet de transitieterm Y20 Y40 Y1 eerst op 1 komen alvorens de
224
houdterm X10 X20 Y4 op 0 mag komen, zoniet komt men in een foutieve toestand (00000). Dit kunnen wij verhinderen door toevoeging van de term (priemimplicant) X10 X20 Y1 Y20 . Voor de functie y3 zijn er twee hazards: e´ e´ n op Y5 en e´ e´ n op Y4 . Beide hazards kunnen weggewerkt worden door toevoeging van de termen X10 X20 Y40 Y3 en X1 X20 Y3 Y50 . Deze hazards zijn het gevolg van de cyclus 11
00
a → d → 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 fs . 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¨ele 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 7.6.1
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 M1 en een slaafmachine M2 , 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 C1 en C2 een globaal minder effici¨ente realisatie tot gevolg hebben (minder gemeenschappelijke implicanten). Een decompositie is slechts nuttig wanneer het aantal verbindingen 225
Input
Output C
S
(a) Origineel
Inputs C3 C1
C2
S1
S2
Output
(b) Algemene decompositie Inputs
Output C3 C1
C2
S1
S2
(c) Cascadedecompositie
Inputs C3 C1
C2
S1
S2
Output
(d) Paralleldecompositie
Figuur 7.12: Spatiale decompositievormen van een automaat
226
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 e´ e´ 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 M1 en M2 , respectievelijk gebaseerd op π1 en π2 . De machine M1 resp. M2 wordt verkregen door als toestanden de blokken van π1 resp. π2 te nemen. Aangezien π1 stabiel is, weten wij dat de toestandsfunctie van M1 enkel de (systeem)inputs en de toestand van M1 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 M1 (toestanden {a, b}). Met autonoom bedoelen wij onafhankelijk van de 227
Machine M1 Machine M
0 1 -----A A B B B C C C D D D E E E F F F A
(ABCDEF)
M1: (ACE)(BDF)
0 1 -----------ACE ACE BDF BDF BDF ACE
M2: (AD)(BE)(CF) Machine M2
(A)(B)(C)(D)(E)(F)
(a) Originele Machine
(b) Stabiele Partities
0 1 --------AD AD BE BE BE CF CF CF AD (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 M1 en M2 . Wij kunnen M2 vinden op basis van een partitie π ∗ (niet-stabiel!), die π1 verfijnt tot π2 : glb(π ∗ , π1 ) = π2 . De keuze π ∗ = (ABEF )(CDGH) voldoet hieraan. Machine M2 is uiteraard niet autonoom, aangezien zij de toestand van M1 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 M3 ) nodig om de toestand van π2 verder te verfijnen tot π0 . Wij vinden π ∗∗ = (ABCD)(EF GH). De machine M3 heeft de toestand van M1 en M2 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 subroutines3 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, even3
In feite zijn het remote procedure calls.
228
Machine M
0 1 -----A A B B B C C C D D D E E E F F F G G G H H H A
(ABCDEFGH)
M1: (ACEG)(BDFH) M1,M2: (AE)(BF)(CG)(DH)
M1,M2,M3: (A)(B)(C)(D)(E)(F)(G)(H) (b) Stabiele Partities
(a) Originele Machine
Machine M1
0 1 ----------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
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 M2 . 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 M1 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 M2 . De transitievoorwaarde in het opschrift -,not(3)/--- betekent: bij gelijk welke waarde op start, maar met M2 niet in toestand 3. De output van beide machines worden gecombineerd tot e´ e´ n output (bv. door een OF-functie). Op elk ogenblik zal slechts e´ e´ n machine zich niet in een wachttoestand bevinden. De wachttoestanden van M1 kunnen ge¨ınterpreteerd worden als de ‘terugkeeradressen’ voor de oproep naar M2 . Machine M2 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]).
7.6.2
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 7.17. De werking van elk van de machines kan voorgesteld worden met behulp van hun toestands- en outputfuncties: s1 = fs1 (S1 , I11 , I12 ) O11 = fo11 (S1 , I11 , I12 ) O12 = fo12 (S1 , I11 , I12 ) s2 = fs2 (S2 , I21 , I22 ) O21 = fo21 (S2 , I21 , I22 ) O22 = fo22 (S2 , I21 , I22 ) 4
Noteer dat hiermee dus uiteraard geen directe of indirecte recursie mogelijk is: echte recursie is niet mogelijk met een beperkte hoeveelheid geheugen.
230
0/HC1
1/LC0 W
-/SL0 ab0
I
c0
d0
ab1
c1
-/SL0
-/SL0
d2
-/SC0
e2
-/SC0
-/SL0
ab3
e1
-/SL0
c2
-/SC0
-/SL0
d1
-/SL0
ab2
e0
-/SL0
-/SL0
-/SL0
-/SL0 c3
-/SC0 -/SL0
d3
e3
-/HC1
(a) originele automaat. Legende: start/schuifregisters carry done
not(I)/--I/--w
0 -/SL0
-,not(3)/--- -,not(3)/--- -,not(3)/--- -,not(3)/---
0,-/HC1
1 e/HC1 1,-/LC0 W
-,-/SL0 I
-,3/--ab
-,3/--c
-/SL0
-,3/--d
e
not(e)/SL0
2
-,3/---
-/SC0 3
M1
(b) Decompositie
Figuur 7.16: Decompositie gebaseerd op factorisering
231
M2
I O I11
I21 O11
I12
O21 I22
O12
S1
O22
S2
klok
Figuur 7.17: Synchrone compositie van synchrone automaten
De samenstelling wordt beschreven door de volgende vergelijkingen: I11 = I I21 = I I12 = O22 I22 = O12 O = (O11 , O21 ) S = (S1 , S2 ) 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 fs en de outputfunctie fo 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 O12 en O22 te elimineren. Wij krijgen echter vergelijkingen van de vorm O12 = fo12 (S1 , I11 , O22 ) O22 = fo22 (S2 , I21 , O12 )
en dus O12 = fo12 (S1 , I11 , fo22 (S2 , I21 , O12 )) met een gelijkaardige uitdrukking voor O22 . Het optreden van symbolen zowel in het linker- als rechterlid maakt het echter in het algemeen onmogelijk om O12 en O22 uit te drukken als functies van S en I. 232
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¨eren. 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 O12 en/of O22 niet afhangen van I12 resp. I22 . In deze veronderstelling krijgen wij: S = (S1 , S2 ) = (fs1 (S1 , I11 , I12 ), fs2 (S2 , I21 , I22 )) = (fs1 (S1 , I11 , fo22 (S2 , I21 )), fs2 (S2 , I21 , fo12 (S1 , I11 ))) = fs (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 e´ e´ n flipflop opneemt, bijvoorbeeld door outputs rechtstreeks uit een flipflop te betrekken.
7.7 7.7.1
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¨encodeerde 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
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 e´ e´ n binair signaal; dit kan toestandstransities veroorzaken in meer dan e´ e´ 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 e´ e´ n binair signaal Hier kunnen wij twee gevallen onderscheiden: ofwel kan de input interne toestandstransities veroorzaken op meer dan e´ e´ 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 e´ e´ 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 zekerheid6 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.
7.7.2
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 7.18. In feite bouwt men een cascadecompositie van twee machines M1 en M2 . 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
asynchroon I
gesynchroniseerd I* I=0
A A en B verschillen in 1 bit
klok
I=1
} }
B M2
}
M1 M
Figuur 7.18: Het gebruik van een synchronisatieflipflop. De globale toestand in M wordt voorgesteld door S = (S1 , S2 ). 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 M1 , en dus over e´ e´ n bit. Dit is zo, aangezien de originele machine M2 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 7.19. 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
klok1
dav
data ack
klok2
ack=1 ack=0 data out
dav=0 dav<-1 dav=1 ack<-1 lees
ack=0
ack=1
dav=1
dav<-0 dav=0
ack<-0 data weg
ontvanger
zender
Figuur 7.19: Synchronisatieprotocol tussen asynchroon gekoppelde automaten. De gearceerde opeenvolgende toestanden verschillen in e´ e´ n bit.
236
Figuur 7.20: Een seri¨ele 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 e´ e´ 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 X1 , X2 , 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 X1 en X2 . 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 xk , xk−1 , . . . , x0 en yk , yk−1 , . . . , y0 (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
Figuur 7.21: Een seri¨ele comparator
A B C D E
0 B A E E C
1 C D C B 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. A B C D E F
X=0 D E F A B C
X=1 E F D B C A
5. Stel een minimaal TTT op voor een synchrone automaat die de sequenties 10∗ 10 herkent (hier betekent 0∗ nul of meer herhalingen van 0). Kan je hieruit snel een (eveneens minimaal) TTT afleiden voor een automaat die zowel 10∗ 10 als 01∗ 01 herkent? 6. Ontwerp een synchrone automaat met (naast de klokinput), e´ e´ n input X, en e´ e´ 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
X Zb B X
Xb
p
X
X
q
Y Ab A
B
r
X
A
Bb
B
s
Y A B
B
Yb X Zb
c Z Z
Z
f
A Xb Ab B
Yb
A X Y Zb Y Xb Xb A B Zb
g
A j Y
B k h
X
m
Y A Zb
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.
A B C D E F G H
0 A B C D B C D A
1 E F G H F G H 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 7.24. 239
Figuur 7.23: Te verbeteren netwerk
(a) Welke functies f0 , . . . , fn berekent dit netwerk voor n variabelen xi ? Hoe groeit het netwerk met n? (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 = x1 · x0 + x2 · x.) 10. Ontwerp een synchroon circuit met e´ e´ n input X en e´ e´ 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 Y: 0
a1 c0
0 c1
b0 c2
b1 d0
0 d1
... ...
Zorg ervoor dat uw realisatie – naast correct – zo economisch mogelijk is.
240
Figuur 7.24: Te analyseren taknetwerk
11. Ontwerp een synchroon circuit met twee inputs X en Y , e´ e´ 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: (0, 1), (1, 1), X, Y = (1, 0), (0, 0),
als A optreedt als B optreedt als C optreedt 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 000 001 110 111 100 101
volgorde (van meest recent naar minst recent) ABC ACB BAC BCA CAB 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
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
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¨eren 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
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 wordt1 . 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 lang2 ; 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...
244
Figuur A.1: De (logische) structuur van de AM2909 Sequencer (RT-niveau)
245
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>
! ! ! !
microprogram counter Address Register Stack Pointer Stack Register File
**External.State** Cn<>, Cn4<> := incr<4>, D<3:0>, FE<>, OE<>, OR.<3:0>, PUP<>, R<3:0>, RE<>, S<1:0>, ZERO<>,
! ! ! ! ! ! ! ! ! ! !
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
**Implementation.Variables** incr<4:0>, macro z := |’1111|,
! 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 ZERO @ 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
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¨ele functies voor te stellen, door parti¨ele 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¨ele) 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 geor3
Een definitie van de syntaxis van Abel vindt men bv. op http://www.ee.upenn.edu/rca/software /abel/abel.primer.html
247
module mux12t4 title ’12 to 4 multiplexer 24 Feb 1984 Charles Olivier & Dave Pellerin Data I/O Corp.’ "declarations IC1
device
a0,a1,a2,a3 pin b0,b1,b2,b3 pin c0,c1,c2,c3 pin
’P14H4’; 1,2,3,4; 5,6,7,8; 9,11,12,13;
"define select inputs s1,s0
pin
18,19
"define output y0,y1,y2,y3 pin H L X Select y a b c
14,15,16,17;
= = = = = = = =
[1,1,1,1]; [0,0,0,0]; [.X.,.X.,.X.,.X.]; [s1,s0]; [y3,y2,y1,y0]; [a3,a2,a1,a0]; [b3,b2,b1,b0]; [c3,c2,c1,c0];
equations y = (select (select (select (select
== == == ==
0) 1) 2) 3)
& & & &
a # b # c # c;
test_vectors ([select, a, [0 , 1, [0 ,10, [0 , 5,
b, X, X, X,
c] X] X] X]
-> y) -> 1; ->10; -> 5;
[1 [1 [1
, H, 3, H] -> 3; ,10, 7, H] -> 7; , L,15, L] ->15;
[2 [2 [2
, L, L, 8] -> 8; , H, H, 9] -> 9; , L, L, 1] -> 1;
[3 [3 [3
, H, H, 0] -> 0; , L, L, 9] -> 9; , H, L, 0] -> 0;
end mux12t4
Figuur A.3: Een 12-naar-4 multiplexer in ABEL v2.0. Nu is men toe aan ABEL v7.0 – zie bv. http://www.synario.com
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 + x0 y 0 ), ! (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
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 Q3,Q2,Q1,Q0
pin 1,2,3,11 pin 14,15,16,17
Cl,X,Z = .C., .X., .Z. " Counter States S0 = ^b1111; S1 = ^b1110; S2 = ^b1101; S2 = ^b1100; " Counter Mode Up Down Clear
S4 S5 S6 S7
= = = =
^b1011; ^b1010; ^b1001; ^b1000;
S8 = ^b0111; S9 = ^b0110;
Modes = [Clr,Dir]; = [ 1 , 1 ]; = [ 1 , 0 ]; = [ 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
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¨erarchische 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
library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity f160 is port ( clock: d: en_P: en_T: load_b: clear_b: q: c_out: ); end f160;
in STD_LOGIC; in STD_LOGIC_VECTOR (3 downto 0); in STD_LOGIC; in STD_LOGIC; in STD_LOGIC; in STD_LOGIC; inout STD_LOGIC_VECTOR (3 downto 0); out STD_LOGIC
Figuur A.6: De entity-declaratie van de 74160 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 e´ e´ 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¨erarchie, 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¨eren 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 pack251
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; 23 24 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; 28 29 -- *********************** 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 74160 teller
252
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); 13 14 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; 19 20 --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; 25 26 --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; 33 34 end structuur;
Figuur A.8: Een structuurdefinitie van de 74160 teller
age als volgt: type std_ulogic is (
’U’, ’X’, ’0’, ’1’, ’Z’, ’W’, ’L’, ’H’, ’-’
);
----------
uninitialised forcing unknown strong 0 strong 1 high impedance weak unknown weak 0 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 e´ e´ 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
architecture gates of f160 is component jk port ( clock : in std_logic; clear_b : in std_logic; l,e,d : in std_logic; q,q_b : inout std_logic ); end component; component inv port ( inp : in outp : out ); end component;
std_logic; std_logic
component buf port ( inp : in outp : out ); end component;
std_logic; std_logic
component and2 port ( inp1 : in inp2 : in outp : out ); end component;
std_logic; std_logic; std_logic
component and3 port ( inp1 : inp2 : inp3 : outp : ); end component;
in in in out
std_logic; std_logic; std_logic; std_logic
component and4 port ( inp1 : inp2 : inp3 : inp4 : outp : ); end component;
in in in in out
std_logic; std_logic; std_logic; std_logic; std_logic
component or2 port ( inp1 : in inp2 : in outp : out ); end component;
std_logic; std_logic; std_logic
Figuur A.9: Een fijnere structuurdefinitie van de 74160 teller; nu op poortniveau.
254
60 61 signal load, cl, clk, xx, yy : std_logic; 62 signal j, k, en, q_b : std_logic_Vector (0 to 3); 63 64 begin 65 --interne controlesignalen 66 --cl <= clear_b after 2 ns; 67 buf1: buf 68 port map(clear_b,cl); 69 60 inv1 : inv 70 port map(load_b, load); 71 72 inv2 : inv 73 port map(clock, clk); 74 75 --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; 80 81 --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)); 85 86 --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)); 89 90 --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)); 93 94 --en(3) <= (q(2) and q(1) and q(0) and en(0)) 95 -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)); 102 103 104 -- 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); 107 108 109 end gates;
Figuur A.10: Een fijnere structuurdefinitie van de 74160 teller; nu op poortniveau – vervolg.
5V R
390 W
Buslijn
T2
T1
Figuur A.11: De ingredi¨enten van een open-collectorbus
255
T3
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¨eren, 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¨eren 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 tijd5 ). 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¨enteerde betekenis. 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. 5
256
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¨ele 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
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, e´ e´ n per poort. Een dergelijke beschrijving noemt men een dataflowbeschrijving. Een gedeeltelijke dataflowbeschrijving vindt men in figuur A.8, regels 27 – 32. 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 e´ e´ 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 e´ e´ n waarde. Sommige combinaties zijn legaal, bv. deze die maar e´ e´ 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
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 e´ e´ 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¨evalueerd. 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 e´ e´ 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¨eringen 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¨eringen (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
van parameters die pas ingevuld worden bij de instanti¨ering van een component. Zo is het bv. gemakkelijk een generiek register te defini¨eren, 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¨eringen 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 betekenis7 ; 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. http://www.rulabinsky.com/cavd/.
260
1 M.dcs[Diagnostic Control Store; 1Kw; 96 b/w]
P.c
4 P.console
K
M[Floppy Disk]
M.Cache[8 Kbyte]
S
T[Console Teletype]
K.Memory
M[128 Kbyte; MOS; ECC]
M 2 K.uba
S.unibus
K
M.Disk
K
M.Tape
K
T
K
M.Disk
K
M.Tape
3 K.mba
S.Massbus
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
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´en lijn bovenaan, e´ e´ n lijn in het midden, e´ e´ 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
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 e´ e´ 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¨erarchie uit te drukken. Hiermee bedoelen wij de mogelijkheid om in een schema bepaalde blokken aan te brengen zonder 263
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¨erarchie stelt ons in staat heel complexe systemen grafisch te representeren op een zeer effici¨ente, leesbare manier. Het maakt het ook mogelijk systemen te beschrijven op een brede waaier van hi¨erarchische 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¨en voor problemen zorgen in re¨ele 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 coordinaatsysteem 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¨extraheerd. 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
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 4.0.0 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 4.0.0 maken ook de uitwisseling van de geometrische lay-outgegevens mogelijk.
265
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`ere is welkom. Hermetische verpakkingen worden in keramische materialen gemaakt en in metaal, en daardoor kunnen zij hogere temperaturen aan dan de goedkopere plasticverpakkingen.
266
PLASTIC DUAL-IN-LINE PACKAGE
PINS **
14
16
18
20
A MAX
0.775 (19,69)
0.775 (19,69)
0.920 (23.37)
0.975 (24,77)
A MIN
0.745 (18,92)
0.745 (18,92)
0.850 (21.59)
0.940 (23,88)
DIM A 16
9
0.260 (6,60) 0.240 (6,10)
1
8 0.070 (1,78) MAX
0.035 (0,89) MAX
0.310 (7,87) 0.290 (7,37)
0.020 (0,51) MIN
0.200 (5,08) MAX Seating Plane 0.125 (3,18) MIN
0.100 (2,54) 0.021 (0,53) 0.015 (0,38)
0.010 (0,25) M
05– 155 0.010 (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
0,38 0,22
0,65 28
PLASTIC SMALL-OUTLINE PACKAGE
0,15 M
15
0,15 NOM 8,20 7,40
5,60 5,00
Gage Plane 1
14
0,25
A
05– 85
1,03 0,63
Seating Plane 2,00 MAX
0,10
0,05 MIN
PINS **
8
14
16
20
24
28
30
38
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
DIM
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
CeramicSidebrazedDual-In-line Package (SB)
• • • • • •
Through Hole Package
• • • • • •
Surface/Socket Mount Package
• • • • • •
Surface Mount Package
• • • • •
Surface Mount 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)
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)
J-Bend Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal Footprint Compatible with LCC and PLCC
Ceramic Quad Flatpack (CQFP)
Straight Lead Configuration Gold Plate Lead Finish Multilayer Ceramic Package Solder Seal
Figuur B.3: Enkele hermetische verpakkingen van National Semiconductors
269
Ceramic Flatpack
• • • • • •
Surface Mount or Through Hole Package
• • • • • •
Through Hole Package
• • • • • •
Surface Mount Package
• • • • • •
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)
Straight Lead Configuration Solder Dip Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with SB and MDIP
Ceramic Small Outline 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)
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
Cerpack
• • • • • •
Surface Mount or Through Hole Package
• • • • • • •
Surface Mount Package
• • • • • • •
Surface Mount Package
Straight Lead Configuration Solder Dip Lead Finish Pressed Ceramic Package Glass Seal Footprint Compatible with Flatpak
Cerquad
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
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
Bijlage C
Enkele aanvullingen op circuitniveau: CMOS, flipflops en interconnectie In deze appendix gaan wij in op een aantal essenti¨ele 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 e´ e´ 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 VGS tussen gate en source, kan men de stroom/spanningskarakteristiek tussen de aansluitingen drain/source be¨ınvloeden.
272
Deze karakteristiek is niet-lineair, en kan dus niet door e´ e´ 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 VGS . 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 e´ e´ 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 e´ e´ 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
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
source
gate
gate
sourcediffusie
drain
gateoxide (isolator)
kanaal draindiffusie
drain
doorsnede; de isolator is het dunste onder de gate-elektrode (dikte d)
Geheel met isolator en metaalverbindingen (isolator boven gate niet getekend)
Figuur C.1: De schematische opbouw van een n-FET. Typische waarden voor L in hedendaagse digitale schakelingen zijn L = 0.13 − 0.25 µm; over het algemeen is W daar een veelvoud van.
274
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¨eerd door een zeer dunne laag (enkele nanometer tot enkele tientallen nanometer) isolator (meestal SiO2 ) 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 VGS aan te leggen t.o.v. de source (en het substraat, wanneer wij dit laatste verbinden met de source), cre¨eren wij een veld met sterkte VGS /d volt/m, wanneer d de dikte van de isolator voorstelt. Een spanning VGS = 1 V en een dikte d = 0,01 µm leiden aldus tot een veldsterkte van 108 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 VGS . Een sterk vereenvoudigde analyse, die buiten het raam van onze behandeling valt, van de FET leidt tot de volgende benaderde karakteristiek1
IDS (VGS , VDS ) =
0,
VGS < Vt
0 I d ((VGS − Vt )VDS 0 I 2 µn W L 2d (VGS − Vt ) ,
µn W L
2 ), V − 12 VDS GS > Vt , VDS < VGS − Vt
elders. (C.1)
Hierin stelt IDS de stroom voor die binnenkomt bij D en de FET verlaat bij S; VDS stelt de spanning voor die men aanlegt tussen D en S. De spanning Vt is de z.g. drempelspanning, dit is de waarde van VGS 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 cm2 /Vs), 0 en I zijn resp. de permittiviteit van het vacuum −12 (8.85 × 10 F/m) en di¨elektrische constante van de isolator (3.9). Figuur C.2 geeft deze relatie grafisch weer. Zoals eerder vermeld, is voor een gegeven VGS de stroom/spanningskarakteristiek geen rechte (die dan een constante weerstand zou voorstellen). Naarmate VDS 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 VDS gedeeld door de toename van IDS ). Voor kleine waarden van VDS (0 < VDS < (VGS − Vt )/2) kan men de FET dus vervangen door een weerstand RDS0 =
L d W µn 0 I (VGS − Vt )
1
(C.2)
FET’s met zeer korte kanalen hebben karakteristieken die hier redelijk sterk van afwijken; voor onze behandeling volstaan de eenvoudige modellen.
275
I DS (mA) 0.1
triodegebied
pentodegebied VGS = 5 volt
4 volt
0.05
3 volt 2 volt 0
-2
0
2
4
6
8
10 VDS (volt)
Figuur C.2: De karakteristiek van een n-FET met een drempelspanning Vt = 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 vacuumbuis. Deze gebieden worden steeds vaker het ’lineair’ en het ’saturatiegebied’ genoemd.
die afhangt van VGS . Voor grotere waarden VDS > VGS − Vt wordt de stroom IDS onafhankelijk van VDS ; de FET kan dan aanzien worden als een stroombron IDS = µn
W 0 I (VGS − Vt )2 L 2d
(C.3)
(beter: een constante stroomafname) met een sterkte gecontroleerd door VGS . Wanneer n-FET stroom voert, is S de meest negatieve aansluiting, zijn VGS > 0 en VDS > 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 pFET. In geleidende toestand is S de meest positieve aansluiting, VGS < 0 en VDS < 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
Vdd
CDB
CGD D
D
S
G
G G S
D
S
Vss
n-FET
C GS
p-FET
C
SB
Parasitaire capaciteiten in een FET
Figuur C.3: Veelgebruikte symbolische voorstellingen voor FET’s. De spanning Vss is de laagste spanning in het circuit en wordt aan het substraat aangelegd (de badkuip van de n-FET). De spanning Vdd 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, e´ e´ n dat eerder bij de source hoort, en e´ e´ n dat eerder bij de drain hoort. Aldus definieert men de capaciteiten CGS tussen gate en source (en het bijhorend deel van het kanaal), CGD tussen gate en drain (en het bijhorend deel van het kanaal), CSB tussen source (en het bijhorend deel van het kanaal) en substraat (Eng: bulk) en CDB 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 CGS + CGD 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
Figuur C.4: Een poort gemaakt met behulp van schakelaars
C.1.2
CMOS-poorten
C.1.3
De invertor
De principi¨ele structuur van een CMOS-poort is weergegeven in figuur C.4. De poort bestaat uit twee schakelnetwerken gevormd door FETs, het netwerk N1 dat de uitgang verbindt met de 0-spanning en het netwerk N2 dat de uitgang verbindt met de voedingsspanning. De geleidingstoestand van beide netwerken wordt gecontroleerd door hetzelfde stel inputs. De essentie nu is dat N1 geleidt a.s.a. N2 niet geleidt. Wanneer precies e´ e´ 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 e´ e´ n transistor. Het netwerk N1 wordt gevormd door een n-FET, N2 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 pFET 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
5V oxide
n-FET
p-FET
n+
n+
S
G D p-well
p+ D
S p+
D
G S n-well
p-FET W=30mm L=10mm
D
n-FET W=10mm 1 pF S L=10mm
substraat (n of p)
Vout
Vin dwarsdoorsnede van twin-tub CMOS
CMOS-invertor
Transferkarakteristiek en voedingsstroom Id 30 (mA)
20
Schakelgedrag 5.0 Vout (V)
10
4.0
0 Vout (V)
3.0
5.0 2.0
4.0 3.0
1.0
2.0 0
1.0 0
0
2.0
4.0
0
200
400
600 t (ns)
6.0 Vin (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
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 pentodegebied2 . 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 CGS + CGD is, maar eerder CGS + 2CGD . Men kan dit als volgt inzien: stel dat de ingang van de aangestuurde invertor op 0 V staat. Op de condensator CGS staat dan ook 0 V. De uitgang van de invertor staat echter hoog, op de voedingsspanning VCC . Deze spanning staat dan over CGD . Na de omschakeling zijn de rollen omgekeerd: over CGS staat nu VCC , terwijl over CGD nu −VCC staat, omdat de uitgang op 0 V gekomen is. De totale lading die moest worden aangeleverd vanuit de aansturende invertor is bijgevolg VCC (CGS + 2CGD ), en de waargenomen capaciteitswaarde is CGS + 2CGD . De som van alle capaciteitswaarden, samen met de eigen CDB 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 dVout IDS,n (Vout ) = , dt C
(C.4)
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
waarbij IDS,n (Vout ) de stroom door de n-FET voorstelt als functie van de uitgangsspanning bij VGS,n = VCC . Het ontlaadproces begint met de n-FET in zijn pentodegebied. Wanneer de uitgangsspanning gedaald is tot VCC − Vt 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 VCC −Vt (4 V in het voorbeeld), gaat de ontlaadcurve geleidelijk over naar een exponenti¨ele 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
2CVt 0 I d (VCC
− Vt )2
(C.5)
(dit is ongeveer 13 ns in het voorbeeld van figuur C.5). De tijdconstante waarmee de eindwaarde benaderd wordt is d L C, (C.6) τ = RDS0 C = Wp µn 0 I (VCC − Vt ) ongeveer 26 ns in het voorbeeld. Men kan een relatief goede benadering verkrijgen door heel de curve te vervangen door een exponenti¨ele 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 β
α=
ln( 2−3β ) Requiv 2β =( − ). RDS0 ln β ln β(1 − β)
Hierin is β = Vt /VCC . Deze formule levert waarden op voor α tussen 1.3RDS0 en 2.2RDS0 voor 0.1VCC ≤ Vt ≤ 0.4VCC . De tijd die het dan duurt om de spanning Vt te bereiken wordt gegeven door tVt = −α ln βRDS0 C en varieert tussen 2RDS0 C en 5RDS0 C voor 0.1VCC ≤ Vt ≤ 0.4VCC . Voor hogere waarden van Vt relatief t.o.v. VCC 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
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-bouw282
5V
f(X,Y,Z,U) = Z + U(X+Y)
U
X
C
Y
Z
klok 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.
5V 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
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 e´ e´ 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 e´ e´ 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 Vout = Vin te tekenen in het diagram, en de snijpunten met de transfercurve op te zoeken. 284
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 bewaard3 . Dit is echter geen re¨eel 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 CGS , CGD , en CDB . De capaciteit CSB tussen source en bulk treedt niet op omdat wij de source zullen geaard houden. De capaciteit CGB 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 VGS = VDS = VDD /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 ID = K(VGS − Vt )2 /2, met als beginwaarde ID0 = K(VDD /2 − Vt )2 /2. Laat ons, zoals voorheen, alle signalen refereren t.o.v. de onstabiele evenwichtswaarden, en deze afwijkingen voorstellen met een kleine letter: iD = ID − ID0 = KvGS (vGS + VDD − 2Vt )/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 (2CGS + 2CGD ) − v˙1 2CGD − v˙1 (2CDB + 2CGD ) + v˙2 2CGD −Kv2 (VDD − 2Vt )/2
(C.7)
Knoop 1: 0 = v˙1 (2CGS + 2CGD ) − v˙2 2CGD − v˙2 (2CDB + 2CGD ) + v˙1 2CGD −Kv1 (VDD − 2Vt )/2
(C.8)
Herschreven wordt dit − v˙1 (4CGD + 2CDB ) + v˙2 (2CGS + 4CGD ) = Kv2 (VDD − 2Vt )/2
(C.9)
v˙1 (2CGS + 4CGD ) − v˙2 (4CGD + 2CDB ) = Kv1 (VDD − 2Vt )/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...
285
Figuur C.10: (a) Het dynamisch overgangsverschijnsel in een elementaire flipflop. Als simulatiewaarden werden genomen Vt = 1 V, L = 4 µm, W = 20 µm, CGS = 26, 4 fF, CGD = 8 fF, CDB = 55 fF, K = 75 µA/V2 ; (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¨effici¨enten; de algemene oplossing ervan bestaat uit een lineaire combinatie van exponenti¨ele functies (modes) met als tijdsconstanten: 2(CGS + CDB ) K(VDD − 2Vt ) 2(CGS + CDB + 4CGD ) K(VDD − 2Vt )
τ1 = −
(C.11)
τ2 =
(C.12)
De eerste tijdsconstante is negatief, en komt dus overeen met een stabiele mode waarin v1 = v2 . De tweede tijdsconstante is echter positief en komt overeen met de onstabiele mode v1 = −v2 . Deze mode domineert na zeer korte tijd, en doet de spanning V1 op knoop 1 exponentieel snel weglopen van haar beginwaarde VDD /2. Uiteraard loopt V1 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 V1 = 0 resp. VDD 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¨ele storing rond t = 4 ns, en eens met een heel kleine initi¨ele 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 (v1 = −v2 ). Rond de stabiele evenwichtspunten is steeds e´ e´ 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¨ele 286
Figuur C.11: Het schema van de zestransistorcel gebruikt in statische RAMs. Transistors T1 en T2 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 S1 en S2 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¨ele aard van de curve: een amplitudevergroting komt neer op een tijdverschuiving. In theorie leiden onbeperkt kleine initi¨ele 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 T1 en T2 aangebracht. Deze transistors gaan in geleiding wanneer op hun gates S1 resp. S2 een hoge spanning ( bijvoorbeeld VDD = 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¨ele spanning brengt, bijvoorbeeld VDD /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 T1 en T2 ‘sterker’ (breder) gemaakt worden dan de transistors in de invertors. De cel wordt dan geschreven. Men kan ook asymmetrisch werken, door bijvoorbeeld enkel van e´ e´ 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 S1 . Zeer snel wordt V1 laag gebracht door T1 , als gevolg V2 gaat hoog, en de terugkoppeling zorgt ervoor dat V1 laag blijft. In ca. 4 ns is het hele overgangsverschijnsel afgelopen. De labiele of metastabiele aard van het evenwichtspunt halverwege VDD 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 S2 een zeer kort puls aan
287
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 V2 laag en V1 wat hoger, zodanig dat V1 ≈ V2 na afloop van het puls. Het netwerk zal dan spontaan naar een stabiel evenwicht evolueren. Eerst ziet men V1 en V2 samen evolueren tot aan het metastabiel evenwichtspunt (volgens de stabiele mode van het systeem); de onstabiele mode manifesteert zich later, doordat V1 en V2 exponentieel snel van elkaar beginnen weg te evolueren. Het uitstel van deze evolutie hangt van de grootte van de initi¨ele 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 e´ e´ 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¨ele 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
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¨elektrica. 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¨eigende model hiervoor is natuurlijk de transmissielijn. De eigenschappen van de transmissielijn worden bepaald door de geometrie van de betrokken geleiders, hun materi¨ele eigenschappen, en de eigenschappen van het di¨electricum waardoor zij gescheiden worden. Geen van deze materialen is ideaal: de geleiders hebben weerstand, en de di¨elektrica hebben een eindige lekweerstand en di¨elektrische 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 A(s) −γ(s)x B(s) +γ(s)x I(x, s) = e − e , Z0 (s) Z0 (s) p
(C.13) (C.14)
waarin γ(s) = (r + sl)(g + sc) de propagatiefunctie is van de lijn, en de grootheid Z0 (s) = p (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 tr van systemen met een dominant eerste-ordegedrag gegeven wordt door tr B = 0,32. 289
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¨ele 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¨en 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
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 × Z0 ). 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¨effici¨enten 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
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¨effici¨enten 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 e− V (x, s) = s
√
√ √ + e− src(2L−x) V cosh( src(L − x)) √ √ = . s cosh( srcL) 1 + e− src2L
srcx
Men kan deze uitdrukking iverteren naar het ijdsdomein. Figuur C.16(a) toont de resultaten van de inversie. De tijdsas werd genormaliseerd op τ = L2 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¨elen 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
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 τ = L2 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¨ele karakteristieke impedantie, en door een geschikte keuze van de bron- en belastingsimpedanties kan men de reflectieco¨effici¨enten aan e´ e´ 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
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. Z0 ); • 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 e´ e´ 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 e´ e´ 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 e´ e´ 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 e´e´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
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 27 – 100 Ω. 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 e´ e´ n enkel aansturingspunt is, en meer dan een ontvanger (bijvoorbeeld de distributie van een kloksignaal 295
vanuit een centraal punt), en deze van de bussen4 . 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 e´ e´ 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¨ente 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 ver4
De term bus wordt in meer dan e´ e´ n betekenis gebruikt: soms bedoelt men alleen maar een bundel draden; op andere ogenblikken bedoelt men interconnecties die kunnen aangestuurd worden door meer dan e´ e´ n bron, en daardoor een vorm van arbitrage nodig hebben. Dit is de betekenis die wij hier hanteren.
296
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 e´ e´ 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 ka´ de splitsing. Is het aantal af te splitsen rakteristieke impedantie hebben als de tak vo´ or takken groot, dan zal de impedantie aan de wortel van de boom zeer laag worden wil men nog realiseerbare impedantie aan de eindpunten overhouden5 . 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
Figuur C.18: Een ge¨etste 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: e´ e´ 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 e´ e´ 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
Figuur C.19: Een getermineerde versus een niet-getermineerde open-collectorbus.
299
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 e´ e´ 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¨enter 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
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
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 ¬ >
l1:=bv2logic(bv1); l1 := ¬( V 3 &or ( V 4 &and ¬( 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: >
lijst geeft de decimale
dec1:=mintermen2decimaal(m1); 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 + AX Y + BX Y + ABX Y + AY Z + BY Z + ABY Z + AX Y Z + BX Y Z + ABX 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¨erarchische lijst ingedeeld volgens gewicht), en tot slot de decimale representatie.
302
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); bv on := “(X+Y’)Z+W’(X’+U)” bv dc := “XYZ’W” W W 1 1 1 1 1 1 1 1 1 1 1 Z Z 1 1 1 1 1 1 Y Y 1 d 1 1 d X X 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
SA/logic2rm := proc(lf ) local res, x, y, rep, z, varnos, allfalse; global ‘¬‘, ‘&and ‘, ‘&or ‘, V ; ‘¬‘ := 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 ‘, ‘¬‘) ; 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 ¬. De co¨effici¨enten 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¨effici¨ent.
304
SA/elimnot := proc() local ff , ff1 , opf , nn; nn := nargs ; ff := args1 ; opf := op(0, ff ) ; ff1 := op(ff ) ; if opf = ‘¬‘ 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 ‘¬‘(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 ¬ enkel op lettervormen staan.
305
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, ‘¬‘(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 0 , en zorgt de routine selectiveadd ervoor dat producten niet dubbel voorkomen, of elkaar kunnen bevatten.
306
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 xfinished do newterm := xnextvalue () ; 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 := args1 ; if nargs = 1 then varno := 1 else varno := args2 end if ; v := V varno ; if not (member(v, s) or member(‘¬‘(v), s)) then s1 := s union {v} ; s2 := s union {‘¬‘(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
SA/mkBDD := proc(l) local Gl , root; global G, ‘¬‘, ‘&and ‘, ‘&or ‘, V ; ‘¬‘ := 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 ‘, ‘¬‘) ; [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
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
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(argsi ), [seq(‘ − ‘, j = 1..rowdim(argsi ))]), i = 1..groups)]; for p to groups − 1 do if gewicht(argsp 1, 1 ) + 1 = gewicht(argsp+1 1, 1 ) then tt := [] ; for p1 to rowdim(argsp ) dofor p2 to rowdim(argsp+1 ) do term1 := argsp p1 , 1 ; fn1 := argsp p1 , 2 ; term2 := argsp+1 p2 , 1 ; fn2 := argsp+1 p2 , 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 up p1 := ‘ ∗ ‘ end if ; if fn2 = fff then up+1 p2 := ‘ ∗ ‘ 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(argsp ) do if up p1 6= ‘ ∗ ‘ then π := [op(π), [argsp p1 , 1 , argsp p1 , 2 ]] end if end do; end do; for p1 to rowdim(argsgroups ) do if ugroups p1 6= ‘ ∗ ‘ then π := [op(π), [argsgroups p1 , 1 , argsgroups 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
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 := args1 ; 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→residu 2+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
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¨ele en de secundair, tertiar, ... essenti¨ele 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
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 (´ee´ 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
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 6= kx , [seq(j, j = 1..nops(s1 ))]) ; ‘union‘(seq({subsop(i = ki , 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
D.3
Sequenti¨ele 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
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 := ‘¬‘(argum 1 ) else ft nn := ‘¬‘(‘&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 6= “ ”, 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) 6= {}, 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
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..2ssize − 1)]) ; Inp := map(x → gray(isize, x), [seq(i, i = 0..2isize − 1)]) ; ttt := array(1..2ssize , 1..2isize ) ; for r to 2ssize dofor c to 2isize 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 ; circuit ’Toestanden ’ := Toest ; circuit ’Inputvariabelen ’ := ivars ; circuit ’Inputs ’ := Inp ; unassign(’ V ’) end proc 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¨enumereerd volgens een Gray-sequentie, om voornamelijk hamming-1-transities te kunnen tonen. Met de resultaten van de analyse wordt de TTT ingevuld.
317
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 ‘, ‘¬‘; 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; ‘¬‘ := 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
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 6= 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 cc x ) end do ; newerstate := eval(svals) ; while newstate 6= 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
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 ‘, ‘¬‘) end proc Figuur D.14: – einde. De resultaten worden onderzocht, en meldigen van statische en essenti¨ele hazards worden uitgeschreven. De starttoestand is s, de onstabiele tussentoestand ss, en de eindtoestand sss. De operatoren &and en ¬ worden weer vrijgegeven.
320
D.4
Sequenti¨ele synthese in Maple
Figuren D.15, D.16, D.17 illustreren de basistappen in de synthese van sequenti¨ele schakelingen op logisch niveau.
321
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 {sn i , sn j } ) then comptab {sn i , sn j } := iocompat 1
else comptab {sn i , 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 6= [] do opvolgers := list 1 ; list := subsop(1 = NULL, list) ; comptab opvolgers 2 := true ; for j in comptab opvolgers 3 do if comptab j 1 = true then comptab j 1 := 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
SA4 /MaxComp := proc(c) local cc, n, m, seen, neigh; if c( Edges) 6= {} 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
SA4 /StabPart := proc(x, G) local visited , tovisit, part, newpair , curr , nxt, newblock , b, i, statenames, notin; part := {} ; tovisit := {x} ; visited := {} ; while tovisit 6= {} 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 6= {} 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
Bibliografie [Abram90]
Abramovici, M., Breuer, M.A., Friedman, A.D. (1990), Digital Systems Testing and Testable Design, IEEE Press: Piscataway, New Jersey.
[Armstrong62]
Armstrong, D. (1962), On the efficient assignment of internal codes to sequential machines, IRE Transactions on Electronic Computers, Vol. EC11, pp. 611-622.
[Armstrong89]
Armstrong, J.R. (1989), Chip-level modeling with VHDL, Prentice Hall: Englewood Cliffs, New Jersey.
[Ashar92]
Ashar, A., Devadas, S., Newton, R. (1992), Sequential Logic Synthesis, Kluwer Academic Publishers: Boston.
[Bell71]
Bell, C.G., Newell, A. (1971), Computer Structures: Examples, McGraw-Hill: New York.
[Birtwistle95]
Birtwistle, G., en Davis, A., editors, (1995) Asynchronous Digital Circuit Design, Springer Verlag: London.
[Borrione91]
Borrione, E., Waxman R. (eds.) (1991), Computer Hardware Description Languages and their Applications, North-Holland: Amsterdam.
[Brayton84]
Brayton, R.K., Hachtel, G.D., McMullen, C.T., Sangiovanni-Vincentelli, A.L (1984), Logic Minimization Algorithms for VLSI Synthesis, Kluwer Academic Publishers: Boston.
[Brayton87]
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. 1062– 1081.
[Breuninger85]
Breuninger, R.K., Frank, K. (1985), “Metastable Characteristics of Texas Instruments Advanced Bipolar Logic Families,” TTL Advanced LowPower Schottky, Advanced Schottky Data Book, Vol 2., Texas Instruments.
[Bryant86]
R. Bryant (1986), “Graph-Based Algorithms for Boolean Function Manipulation,” IEEE Transactions on computers, Vol. C-35, No. 8, pp. 677– 691.
[Brzozowski95]
Brzozowski, J., en Seger, C., (1995) Asynchronous Circuits, Springer Verlag: New York.
[Clare73]
Clare, C.R. (1973), Designing Logic Systems Using State Machines, McGraw-Hill: New York. 325
Readings and
[DeMicheli94]
De Micheli, G. (1994), Synthesis and Optimization of Digital Circuits, McGraw-Hill: New York.
[Devadas94]
Devadas, S., Ghosh, A., Keutzer, K. (1994), Logic Synthesis, McGrawHill: New York.
[Dietmeyer71]
Dietmeyer, D. (1971), Logical Design of Digital Systems, Allyn & Bacon.
[Green86]
D. Green (1986), Modern Logic Design, Addison-Wesley: Wokingham.
[Hachtel96]
G. D. Hachtel, F. Somenzi (1996), Logic Synthesis and Verification Algorithms, Kluwer: Boston.
[Hartenstein87]
Hartenstein, R.W. (ed.) (1987), Hardware Description Languages, NorthHolland: Amsterdam.
[Hartmanis61]
Hartmanis, J. (1961), On the state assignement problem for sequential machines I, IRE Trans. Electron. Comput., Vol. EC-10, pp. 593-603.
[Hennie68]
Hennie, F. (1968), Finite-State Models for Logical Machines, Wiley: New York.
[Hong74]
Hong, S., Cain, R., en Ostapko, D. (1974), MINI: A heuristic approach for Logic Minimization, IBM J. Res. Dev., sept., 443-458.
[Hurst85]
S. L. Hurst, D. M. Miller, en J. C. Muzio (1985), Spectral Techniques in Digital Logic, Academic Press: London.
[Johnson93]
H. Johnson, M. Graham (1993), High-Speed Digital Design – A Handbook of Black Magic, Prentica Hall: Upper Saddle River, New Jersey.
[Lewin92]
Lewin, D., Protheroe, D. (1992), Design of Logic Systems, Chapman & Hall: London.
[Lipsett89]
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. 537-538.
[McCluskey65]
McCluskey, E. (1965), Introduction to the Theory of Switching Circuits, McGraw-Hill: New York.
[McCluskey86]
McCluskey, E.J. (1986), Logic Design Principles, Prentice-Hall: Englewood Cliffs, N.J.
[Michel92]
Michel, P., Lauther, U., Duzy, P. (eds.), (1992), The Synthesis Approach to Digital System Design, Kluwer Academic Publishers: Boston.
[Montrose99]
M. Montrose (1999), EMC and the Printed Circuit Board. Design, Theory and Layout Made Simple, IEEE: New York.
[Navabi93]
Navabi, Z. (1993), VHDL, Analysis and Modeling of Digital Systems, Prentice-Hall: Englewood Ciffs, NJ.
[Parker92]
Parker, K.P. (1992), The Boudary Scan Handbook, Kluwer: Boston. 326
[ITRS01]
Sematech (2001), International technology road map for semiconductors. Zie http://public.itrs.net
[Siewiorek82]
Siewiorek, D.P., Bell, C.G., Newell, A. (1982), Computer Structures: Principles and examples, McGraw-Hill: Auckland.
[Stone73]
H. S. Stone (1973), Discrete Mathematical Structures and Their Applications, SRA: Chicago.
[Tracey66]
Tracey, J. (1966), Internal state assignment for asynchronous sequential machines, IEEE Trans. Electron. Comput., Vol. EC-15, pp. 551-560.
[Varma89]
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. 901–916.
[Voith77]
Voith, R.P. (1977), “ULM Implicants for Minimization of Universal Logic Module Circuits,” IEEE Transactions on Computers, Vol. C–26, pp. 417–424.
[White81]
White, D. (1981), Bit-Slice Design: Controllers and ALUs, Garland STPM Press: New York.
[Wilkins86]
Wilkins, B.R. (1986), Testing Digital Circuits An Introduction, Van Nostrand
[Zissos72]
Zissos, D. (1972), Logic Design Algorithms, Oxford University Press.
327
Index assignatie en valuatie, 33 disjunctieve normaalvorm, 36 algoritme, 39 dualiteit, 34 equivalentie, 33 minimalisatie, 88 BDD’s, 40, 57 algebra¨ısch, 88 compositie, 44 implicantenmethode, 91 ITE-compositie, 46 methode van Zissos, 88 reductie, 43 niet-redundant, 90 Boole-algebra, 20 optioneel product, 88 alternatieve definitie, 21 som-van-producten, 88 atomen, 26 verband met poortnetwerken, zie Poortdualiteit, 22 netwerken eigenschappen, 21 verband met taknetwerken, zie Taknetexclusieve-OF, 29 werken Boolese functies, 23 Bouwstenen, 58 complementering, 41 ASIC’s, 76 don’t care-termen, 92 full custom, 82 functiecompositie, 24, 41 gate arrays, 77, 123 gelijkheidstest, 41 IP cores, 81 gewicht, 24, 92 PLA’s, 82, 116, 117 monotone, 48 soft core, 76 ON-set, DC-set en OFF-set, 99 standaard-celcomponenten, 78 pseudo-functies, 49 programmeerbare componenten, 63 representatie, 24 architectuur, 67 Boolese decisiediagrammen, zie BDD’s FPGA’s, 71, 123 Boolese vormen, 31 macrocel, 196 Hadamard-transformatie, 28 ontwerpshulpmiddelen, 198 karnaughkaart, 25 PAL, 69, 117, 123, 247 mintermfuncties, 27 PLA, 68, 117 Reed-Muller, 29 PLS, 195 ternaire kubuslijsten, 40, 92 programmeertechnologie, 65 waarheidstabel, 25 PROM, 71 satisfaiseerbaarheid, 41 standaardcomponenten, 58 symmetrische, 47 LSI en VLSI, 62, 185 tautologietest, 41, 108 MSI, 61 unaatheid, 48, 97, 103, 104, 208 SSI, 58 zelfduale, 49 Bus, 59 Boolese matrices, 55 differentieel, 61 Boolese vormen, 31, 49 Asynchrone inputs, 9, 182, 233 Hamming-afstand, 234 hazards, 234 synchronisatieflipflop, 234 synchronisatieprotocol, 235
328
logisch niveau, 4, 74, 77, 247 BDD, 139 procedurale beschrijving, 15 RT-niveau, 10, 74, 77 synchroon, 8, 179 Complete som systeemniveau, 11 karnaughkaartmethode, 92 uitvoerbare beschrijving, 15 kubuslijsten, 104 Geheugens, 185 meervoudige functies, 98 dynamisch, 187 tabelmethode van Quine en McCluskey, registers, 185 92 statisch, 186 topologische methode, 99 Grafische beschrijvingen, 260 verwijdering van hazards, 148 circuitschema’s, 263 Compositie en decompositie, 225 OrCAD, DASH, 74 logisch niveau PMS, 260 cascade, 227 tijdsdiagrammen, 262 factorisering, 228 Gray-code, 151 parallel, 227 Hazards synchrone compositie, 230 statische, 71 DRAM, 187 Hyperkubus, 25, 91 speciale vormen, 191 deelkubus, 91 werking, 188 Hammingafstand, 25, 92 implicant, zie Implicant Fieldbus, 193 Flipflops, 177 Implicant, 91 datagedrag, 178 complete som, 91 D-flipflop, 178 essentieel, 91, 95, 107, 108 J/K-gedrag, 178 niet-redundante som, 91, 108 S/R-fliflop, 178 partieel redundant, 108 T-gedrag, 178 priem, 91, 108 klokgedrag, 177 meervoudige functies, 98 asynchroon, 177 totaal redundant, 108 flanksturing, 177 Implicantentabel, 95 I-interval, 179 branch-and-bound, 95 master-slave, 177 cyclisch, 95 metastabiliteit, zie Metastabilteit kolomdominantie, 95 niveausturing, 177 meervoudige functies, 98 O-interval, 179 methode van Petrick, 97 pulssturing, 177 rijdominantie, 95 Fysische beschrijving, 13 verbeterde methode, 108 layout, 13 Kronecker-produkt, 28 Gedrag Kruisoperatie, 105 algoritmisch niveau, 10 Kubuslijsten, 99 asynchroon, 187 complete som, zie Complete som circuitniveau, 3 Espresso Exact, 104 combinatorisch versus sequentieel, 9, 247 functierepresentatie, zie Boolese functies declaratieve beschrijving, 15 kruisoperatie, zie Kruisoperatie drivers en transceivers, 62 open-collector, 253 open-drain, 60 tri-state, 59
329
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 ¨ Mobius-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¨eren 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¨eren en testen, 18 LVS-verificatie, 18 Optioneel product, 88 Parallellisme pijplijnen, 187 Parti¨ele 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¨ele 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, 164 330
circuitniveau, 11 poortnewerken, zie Poortnetwerken logisch niveau, 12, 74 sequentieel, 154 netlijst, 78 taknetwerken, zie Taknetwerken PMS-niveau, 12 terugkoppeling, 153 RT-niveau, 12, 74 Sea of gates, 78 Synchroon ontwerp Sequenti¨ele netwerken, 155 asynchrone inputs, 233 analyse, 157 klokverschuiving, 179 fundamentele mode, 159, 164 ontwerpregels, 179 Hamming-1-inputveranderingen, 159, toelaatbaar klokgedrag, 182 164 asynchroon, 165 Taknetwerken flip-flop, 165 algemenere interconnecties, 53 geheugencellen, 165 connectiematrix, 55, 84, 150 incrementele gedragsbeschrijving, 199, serie-parallel, 51 200 systematische analyse, 55 MEALY versus MOORE, 156 transmissiematrix, 55 outputfunctie, 156 verband met Boolese vormen, 52 reguliere uitdrukkingen, 157 Tekstuele representaties, 243 synchroon, 165 ABEL, ALTERA, 74, 247 datagedrag, 165 ISPS, 244 kloksignaal, 165 VHDL, 74, 77, 249 synthese, 199 Ternaire interpretatie, 154, 163 toestand, 156 detectie van hazards, 148, 161 onstabiele, 156 Testen stabiele, 156 testvectoren, 75, 247 totale, 156 Toestandstransitiediagram, 159 toestandsassignatie, 213 Toestandstransitietabel, 159 1-uit-r-assignaties, 224 eindtoestandentabel, 168 afstandsmethode, 214 exitatietabel, 168 partitiemethode, 216 hazards vermijden van races, 220 combinatorisch, 147, 161 toestandsfunctie, 156 essenti¨ele, 162 toestandsminimalisatie, 203 races, 161 compatibele klassen, 208 ternaire analyse, zie Ternaire interprecompatibele koppels, 205, 208 tatie, zie Ternaire interpretatie kliekbedekking, 208 meervoudige overgangen, 161 methode van Marcus, 208 onvolledig bepaalde tabellen, 206 Vertragingstijd volledig bepaalde tabellen, 206 inertiaalmodel, 4, 259 Shannondecompositie, Shannonexpansie, 37, transportmodel, 4, 259 48, 101 VHDL, 251 Stabiele partitie, 216 algemene structuur, 251 algoritme, 217 architecture, 251 Structuur, 11 entity, 251 beschrijving datatypes, 251 EDIF, 78, 265 parallellisme, 257 JEDEC, 75 asserties, 258 331
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¨eringen, 259 tijdsmodellering, 258 deltavertraging, 258 simulatietijd versus gesimuleerde tijd, 258 volgorde en tijdsloosheid, 258
332