Skript zur Vorlesung Digitaltechnik im Bachelor-Studiengang Technische Informatik gehalten im Wintersemester 2010/11 von Prof. Dr.-Ing. Ulrich Teppner Nur für Lehrzwecke Vervielfältigung nicht gestattet 1 Prof. Dr. Ulrich Teppner: DT39 1 SYNCHRONE SEQUENTIELLE SCHALTUNGEN 4 1.1 Allgemeine Betrachtungen 4 1.2 Flip-Flops 4 1.3 Sequentielle Grundschaltungen 1.3.1 Zähler 1.3.2 Schieberegister 9 9 12 1.4 Synchrone sequentielle Schaltungen 1.4.1 Analyse synchroner sequentieller Schaltungen 1.4.2 Synthese synchroner sequentieller Schaltungen 1.4.3 Mealy- Moore- Medvedev- Schaltungen 14 14 16 19 1.5 24 Aufgaben 2 ENTWICKLUNG KOMPLEXER DIGITALER SYSTEME 27 2.1 Ablaufdiagramme (ASM-charts, FSM-charts) 27 2.2 Beispiel zur Entwicklung digitaler Systeme mit ASM-charts 30 2.3 Alternative Steuerteil-Realisierung als One-Hot Schaltung 33 2.4 Beispiel: ASM-Chart für einen sequentiellen Multiplizierer 35 3 TECHNISCHE REALISIERUNG VON LOGIK-BAUELEMENTEN 3.1 37 37 Dioden-Gatter 3.2 Bipolare Transistoren-Gatter 3.2.1 Dioden-Transistor-Logik (DTL) 3.2.2 Transistor-Transistor-Logik (TTL) 3.2.3 Open-Collector TTL Gatter 3.2.4 Three-state TTL Gatter 3.2.5 Schottky TTL 3.2.6 Emitter-coupled logic (ECL) 38 39 40 41 42 43 44 3.3 MOS Gatter 3.3.1 NMOS und PMOS 3.3.2 CMOS 44 44 45 3.4 Arbeitsbedingungen von Gattern 3.4.1 Statische Störsicherheit 3.4.2 Fan-Out 3.4.3 Schnelligkeit und Verzögerung von Logik-Gattern 46 46 47 48 4 PROGRAMMIERBARE LOGIK-BAUSTEINE 50 4.1 Grundstruktur programmierbarer Logikbausteine 4.1.1 Feste AND-Verschaltung, programmierbare OR-Verschaltung 4.1.2 Programmierbare AND-Verschaltung, programmierbare OR-Verschaltung 4.1.3 Programmierbare AND-Verschaltung, feste OR-Verschaltung 51 51 53 56 4.2 Komplexe programmierbare Logik-Bausteine 4.2.1 XILINX-FPGA 60 61 2 Prof. Dr. Ulrich Teppner: DT39 5 ELECTRONIC DESIGN AUTOMATION 80 6 VHDL 83 6.1 VHDL: Grundsätzliches 6.1.1 Aufbau eines VHDL Modells 83 83 6.2 Fundamentale VHDL Sprachstrukturen 6.2.1 Objekte (Objects) 6.2.2 Datenypen (Data Types) 6.2.3 Signalzuweisungen (Signal Assignments) 6.2.4 Variablenzuweisungen (Variable Assignments) 6.2.5 Operatoren 6.2.6 sequentielle VHDL Statements 6.2.7 nebenläufige VHDL Statements 6.2.8 Strukturale Modellierung 88 88 88 92 94 94 94 98 100 6.3 Fortgeschrittene VHDL Sprachstrukturen 6.3.1 Attribute, Bibliotheksfunktionen 6.3.2 Bibliotheksfunktionen 6.3.3 Packages 6.3.4 Subprogramme 6.3.5 USE-Einbindung (Clause) 102 102 103 105 106 108 3 Prof. Dr. Ulrich Teppner: DT39 1 Synchrone sequentielle Schaltungen In diesem Kapitel wird die systematische Entwicklung synchroner sequentieller Schaltungen, im Deutschen manchmal auch Schaltwerke genannt, abgeleitet. 1.1 Allgemeine Betrachtungen Die folgenden Überlegungen dienen zunächst zur systematischen Entwicklung der Problematik sequentieller Logik. Bei sequentiellen Schaltungen sind die Ausgänge eine Funktion der gegenwärtigen Eingänge und der Vorgeschichte, welche in Form von Zustandsvariablen gespeichert ist. .. Eingänge .. .. . Kombinatorische . Ausgänge Schaltung Zustandsvariable... ... Speicher oder Verzögerung Abbildung 1.1 Prinzipielle Struktur sequentieller Logik Die Abbildung 1.1 stellt diese Abhängigkeit dar. Die Zustandsvariablen werden dabei gewonnen durch verzögerte Rückführung kombinatorisch erhaltener Logik. Diese Verzögerung erfolgt entweder durch rein physikalische Verzögerung oder durch getaktete Flip-Flops. Bei rein physikalischer Verzögerung spricht man von asynchroner, bei Verzögerung durch getaktete Flip-Flops von synchroner sequentieller Logik. Die getakteten Flip-Flops selbst sind jedoch grundsätzlich asynchroner Art. Die systematische Entwicklung asynchroner sequentieller Schaltungen ist nur für kleine Systeme möglich. Prinzipiell werden deswegen heutzutage synchrone Schaltungen entwickelt, was in diesem Skript daher auch systematisch behandelt wird. Asynchrone Schaltungsentwicklung wird erst gar nicht systematisch eingeführt, stattdessen werden im folgenden nur die Basis-Flip-Flops beschrieben. 1.2 Flip-Flops Die einfachste Form eines Flip-Flops besteht darin, dass z.B. zwei NAND-Gatter kreuzgekoppelt werden, wie in der Abbildung 1.2 dargestellt. (In der deutschen Literatur wird das Flip-Flop auch häufig 'bistabile Kippstufe' genannt. Diese Bezeichnung beruht darauf, dass es zwei stabile Zustände einnehmen und dazwischen hin- und herwechseln kann.) 4 Prof. Dr. Ulrich Teppner: DT39 Abbildung 1.2 SR-Flip-Flop Vergleicht man diese Schaltung mit dem Prinzipschaltbild von Abbildung 1.1, so erkennt man, dass sich die logische Verzögerung der Rückkopplungsleitung in der physikalischen Signallaufzeit (propagation delay) der Logik-Gatter befinden muss. Eine direkte Abbildung Eingänge → Ausgänge existiert nicht mehr. Die Funktion der Schaltung kann daher nicht mehr wie bei der Kombinatorik durch Funktions- oder Wahrheitstabellen beschrieben werden. Stattdessen muss eine andere Beschreibungsform gefunden werden. Eine mögliche Form ist die des “Timing Diagram“ (Zeitverlaufsdiagramm). Setzen wir diese Form hier ein, so ergibt sich das folgende beispielhafte Verhalten. Abbildung 1.3 Typischer Zeitverlauf eines SR-Flip-Flops Vergleicht man die Eingänge bzw. Ausgänge der Schaltung zu den beiden Zeitpunkten t1 und t2, so stellt man fest, dass die Eingänge identisch sind, während die Ausgänge sich unterscheiden. Es muss also zusätzlich zu den Eingangswerten etwas Weiteres in die Bestimmung der Ausgangswerte einfließen. Dies kann, wie oben gesagt, nur die Vorgeschichte sein. Diese ist derart, dass vor dem Zeitpunkt t1 das Signal S aktiv war, während vor dem Zeitpunkt t2 das Signal R aktiv war. Die Problematik, dass beide Eingänge (S und R) gleichzeitig aktiv sein können, wird in dem Zeitverlaufsdiagramm nicht dargestellt. Der Leser sollte selbst nachvollziehen, 5 Prof. Dr. Ulrich Teppner: DT39 dass in diesem Fall die Aussage, dass /Q invers zu Q ist, nicht mehr stimmt. Allgemein ist deswegen bei einem beliebig aufgebauten SR-Flip-Flop der Zustand S=R=aktiv nicht erlaubt bzw. nicht definiert! Eine sich ähnlich verhaltende Schaltung eines SR-Flip-Flops besteht aus zwei kreuzgekoppelten NOR-Gattern. Wir erweitern die Schaltung aus Abbildung 1.2 nun noch etwas, um einige weitere wichtige Grundschaltungen von Flip-Flops zu entwickeln bzw. zu definieren. Abbildung 1.4 Transparentes D-Latch Zunächst wird eine Erweiterung nach Abbildung 1.4 vorgenommen. Das zugehörige Timing Diagram ist in Abbildung 1.5 dargestellt. Abbildung 1.5 Typisches Zeitverhalten eines D-Latch Wir erkennen, dass sich die Ausgänge nur ändern, wenn der Takt-Eingang aktiv, d.h. “high“ ist. Weiter erkennen wir, dass nur noch ein Steuereingang existiert, welchen wir D genannt haben. Ist D = “high“, so wird S aktiv, ist D = “low“, wird R aktiv. Das bedeutet, dass das Flip-Flop den Zustand des Eingangs D übernimmt, wenn der Takt-Eingang aktiv ist. Der Q-Ausgang des Flip-Flops folgt dann direkt diesem Zustand. Ist der Takt-Eingang inaktiv, so wird der alte Zustand gehalten. Ein derartiger Baustein wird “(transparentes) Latch“ genannt. Latches haben bestimmte Anwendungsbereiche (z.B. Adress-Latches bei manchen Mikro-Prozessoren). Wir werden sie jedoch noch etwas weiter entwickeln müssen, um Grundbausteine für die von uns im Folgenden benutzten Schaltungen zu besitzen. 6 Prof. Dr. Ulrich Teppner: DT39 Ihr Problem ist, dass sie den D-Eingang bei aktivem Takt-Eingang nach der internen Signal-Laufzeit direkt auf den Ausgang geben. Eine getaktete Weitergabe des Eingangs ist damit nicht möglich. Eine Lösung dieses Problems ist der Einsatz von Master-Slave - Flip-Flops. Diese Lösung ist jedoch wegen verschiedener Nachteile heute ungebräuchlich (und wird hier auch nicht weiter erläutert). Stattdessen werden fast ausschließlich flankengetriggerte Flip-Flops eingesetzt. Eine einfache Erweiterung unseres Latches erläutert die Funktion dieser flankengetriggerten Flip-Flops. Es soll jedoch darauf hingewiesen werden, dass diese Erweiterung nur das Prinzip darstellt. Das bedeutet nicht, dass diese Flip-Flops tatsächlich alle derartig aufgebaut sein müssen. Abbildung 1.6 Flankengetriggertes D-Flip-Flop Abbildung 1.7 Takt-Generierung aus der positiven Clock-Flanke Wie aus dem Timing Diagram (Abbildung 1.7) ersichtlich, wird nur innerhalb eines kurzen Zeitraums um die positive Flanke des Clock-Signals herum der D-Eingang übernommen. Anschließend sperrt der Eingang wieder. Man geht nun davon aus, dass alle flankengetriggerten Flip-Flops eines Systems das gleiche Verhalten haben. Dann kommt der neue Ausgang eines Flip-Flops erst nach dem sensitiven Zeitraum am Eingang des nächsten Flip-Flops an (z.B. beim Schieberegister). Entscheidend für dieses Verhalten sind im Prinzip zwei Zeiten: Set-Up- und Hold-Time (Setup- und Halte-Zeit). Die Setup-Zeit ist die Zeit, die ein Vorbereitungseingang stabil sein muss, bevor die aktive Clock-Flanke kommt, die Halte-Zeit ist die Zeit, die ein Vorbereitungseingang stabil sein muss, nachdem die aktive Clock-Flanke gekommen ist. 7 Prof. Dr. Ulrich Teppner: DT39 Bei Verwendung flankengetriggerter Flip-Flops gleicher Technologie muss i.a. lediglich darauf geachtet werden, dass die Setup-Zeit durch die Signallaufzeiten der Kombinatorik nicht unterschritten wird (maximale Clock-Frequenz!). Abbildung 1.8 Flankengetriggertes JK-Flip-Flop In der Abbildung 1.8 ist auch die Logik eines flankengetriggerten JK-Flip-Flops abgebildet. JK-FF sind modifizierte SR-FF, bei welchen der nicht definierte (unerlaubte) Zustand definiert ist: Sind beide Eingänge aktiv (J=K=aktiv), so kippt der interne Zustand. Dies wird erreicht durch die gegenseitige Verriegelung der Steuereingänge. Ist das FF bereits gesetzt (Q' = 0), so wird der Setz-Eingang (J) gesperrt. Ist es gelöscht (Q = 0), wird der Rücksetzeingang (K) gesperrt. Diese flankengetriggerten Flip-Flops, die intern (asynchrone) sequentielle Schaltungen sind, können als Verzögerungselemente für synchrone sequentielle Schaltungen eingesetzt werden. Im Gegensatz zu den reinen Laufzeit-Verzögerungen der asynchronen Schaltungen, die von Bauteil zu Bauteil unterschiedlich sein können und damit ein zuverlässiges Design für komplexere System unmöglich machen, sind diese getakteten Verzögerungen sehr gut beherrschbar. Der Begriff D-Flip-Flop (Delay-FF) leitet sich von dieser Eigenschaft als VerzögerungsElement zu dienen ab, und nicht, wie häufig dargestellt, von dem Begriff Daten-FF. Zusammenfassend können wir nun folgendes sagen: Zunächst gibt es das einfache, nicht getaktete SR- oder auch RS- Flip-Flop. Dies besitzt einen Setz- und einen Rücksetz-Eingang und zwei Ausgänge: Q und Q’. Das getaktete SR-FF besitzt zusätzlich einen Takt-Eingang. S bzw. R können nur aktiv werden, wenn der Takt-Eingang ebenfalls aktiv ist. Dieser Flip-Flop-Typ wird als (transparentes) Latch bezeichnet. Eine Erweiterung hierzu ist das Master-Slave-FlipFlop. Das flankengetriggerte Flip-Flop ist das für synchrone sequentielle Schaltungen verwendete. Hiervon gibt es prinzipiell 4 Arten: D-FF, T-FF, JK-FF, SR-FF. Ihr Verhalten ist durch die folgende Tabelle definiert: Übergang 0→0 0→1 1→0 1→1 D 0 1 0 1 T 0 1 1 0 J 0 1 X X K X X 1 0 S 0 1 0 X R X 0 1 0 8 Prof. Dr. Ulrich Teppner: DT39 Um den angezeigten Übergang zu erzeugen, müssen die jeweiligen Vorbereitungseingänge auf die entsprechenden Pegel gelegt werden. Ein ’X’ bedeutet, dass der Eingang 0 oder 1 sein kann, ohne das Schaltverhalten zu beeinflussen. Diese Eingänge werden Vorbereitungseingänge genannt, da sie erst zur Wirkung kommen, wenn die aktive Clock-Flanke eintrifft. Neben diesen Vorbereitungseingängen existieren häufig noch sog. asynchrone Eingänge. Diese kommen auch ohne aktive Clock-Flanke sofort zur Wirkung. Hier gibt es prinzipiell einen Setz- (preset) und einen Lösch- (clear) Eingang. Der Setz-Eingang setzt das Flip-Flop sofort auf 1, der Lösch-Eingang setzt es auf 0. Sind beide aktiv, ist das Verhalten wiederum unbestimmt (je nach Implementierung). Ein Satz flankengetriggerter Flip-Flops wird auch Register genannt. 1.3 Sequentielle Grundschaltungen 1.3.1 Zähler Es gibt grundsätzlich zwei verschiedene Arten, Zähler aufzubauen. Die eine Art ist die asynchrone, die andere die synchrone. Beide besitzen ihre Vor- und Nachteile und werden je nach Anforderungen eingesetzt. 1.3.1.1 Asynchron-Zähler Abbildung 1.9 4-Bit asynchroner Binärzähler (Ripple Counter) In obiger Abbildung ist die Schaltung eines asynchronen Zählers, aufgebaut mit (negativ) flankengetriggerten Flip-Flops, dargestellt. Dem Schaltbild sind bereits Vor- und Nachteile dieses Aufbaus zu entnehmen. Der Vorteil ist, dass lediglich das unterste (hier das linke) Flip-Flop der maximalen Taktfrequenz ausgesetzt ist, und zwar bei konstanten Vorbereitungseingängen. Damit ist dies eine Flip-Flop der einzig begrenzende Faktor bezüglich der maximal verarbeitbaren Frequenz. Der Nachteil ist, dass die Flip-Flops zeitversetzt schalten und die Zählausgänge daher nicht gleichzeitig gesetzt werden, sondern nacheinander (daher auch der englische Name ‘ripple counter’). 9 Prof. Dr. Ulrich Teppner: DT39 Typische als TTL-Bausteine realisierte Asynchron-Zähler sind der 74’90 bzw. 74’290. Abbildung 1.10 Logik des 74LS90 /1/ Um diesen ‘LS90 als BCD-Zähler zu benutzen, muss der Ausgang QA mit dem Eingang CKB verbunden werden. Es ergibt sich die Zählsequenz: Output Count QD QC QB QA 0 L L L L 1 L L L H 2 L L H L 3 L L H H 4 L H L L 5 L H L H 6 L H H L 7 L H H H 8 H L L L 9 H L L H Um den gleichen Baustein als Bi-QuinärZähler einzusetzen, muss der Ausgang QD an CKA angeschlossen werden. Dadurch ergibt sich die Zählsequenz: Output Count QA QD QC QB 0 L L L L 1 L L L H 2 L L H L 3 L L H H 4 L H L L 5 H L L L 6 H L L H 7 H L H L 8 H L H H 9 H H L L 1.3.1.2 Synchron-Zähler Beim Synchron-Zähler sind dagegen alle Flip-Flops gleichzeitig getaktet. Der Abbildung 1.12 sind ebenfalls Vor- und Nachteile dieses synchronen Zählers zu entnehmen. Neben einem etwas höheren Schaltungsaufwand ist der entscheidende Nachteil, dass die Laufzeit der Vorbereitungseingänge die maximale Taktfrequenz dieses Zählertyps beschränkt. Typische als TTL-Bausteine realisierte Synchron-Zähler sind der 74’161 bzw. 74’191 (Abbildung 1.11). Ein typisches Zeitverlaufsdiagramm ist anschließend dargestellt. 10 Prof. Dr. Ulrich Teppner: DT39 Abbildung 1.12 4-bit synchroner Binärzähler Abbildung 1.11 Logik des 74LS190 Auf-/Ab-Zählers /1/ 11 Prof. Dr. Ulrich Teppner: DT39 Abbildung 1.13 Typisches Timing Diagramm des 74LS190 /1/ 1.3.2 Schieberegister Abbildung 1.14 4-bit bidirektionales Schiebe-Register mit parallelem Laden 12 Prof. Dr. Ulrich Teppner: DT39 Das vorhergehende Blockschaltbild stellt die Funktion eines Schieberegisters dar. Abbildung 1.15 Logik des 74LS194 bidirektionalen Schieberegisters mit parallelem Laden /1/ Abbildung 1.16 Typisches Timing Diagram des 74LS194 Schieberegisters /1/ 13 Prof. Dr. Ulrich Teppner: DT39 1.4 Synchrone sequentielle Schaltungen Wir wollen nun darangehen, die systematische Entwicklung synchroner sequentieller Schaltungen kennenzulernen. Dazu betrachten wir zunächst ihre genaue Definition im Unterschied zu allgemeinen sequentiellen Schaltungen. Bei synchronen sequentiellen Schaltungen werden die Zustandsvariablen in gleichzeitig getakteten Flip-Flops untergebracht. Hardwaremäßig werden diese Zustandsvariablen in flankengetriggerten Flip-Flops gespeichert. Dies können D-, JK-, RS- oder T-FlipFlops sein. Zur abstrakten Beschreibung dieser Schaltungen können nicht die Funktionstabellen der Kombinatorik eingesetzt werden, stattdessen existieren Zustandsgraphen. .. Eingänge .. Kombinatorische .. .. Ausgänge Schaltung ... ... flankengetriggerte Flip-Flops Abbildung 1.17 Prinzipielle Struktur synchroner sequentieller Logik Um die Entwicklung synchroner sequentieller Schaltungen kennenzulernen, wird zunächst die Analyse derartiger Schaltungen vorgestellt. Eine Umkehrung der Analyseschritte erlaubt uns dann, den Syntheseweg zu verstehen. 1.4.1 Analyse synchroner sequentieller Schaltungen Das folgende Analyse-Beispiel einer sequentiellen Schaltung soll den Zusammenhang zwischen Schaltung und Zustandsgraph erläutern. Wenn dieser Zusammenhang er- 14 Abbildung 1.18 Synchrone sequentielle Schaltung als Analyse-Beispiel Prof. Dr. Ulrich Teppner: DT39 kannt wurde, kann die Synthese einer derartigen Schaltung als Umkehrung der Analyse durchgeführt werden. Durch Überprüfung der Logik dieser Schaltung soll die abstrakte Beschreibung in Form eines Zustandsgraphen abgeleitet werden. Hierzu werden als erster Schritt die KVTafeln für die Vorbereitungseingänge J und K der beiden Flip-Flops aufgezeichnet. Das obere FF nennen wir y1 mit den Vorbereitungseingängen J1 und K1, das untere y0 (mit J0 und K0). Die Rückführungen sind entsprechend y1 und y0‘. x x y1 y0 0 1 y1 y0 0 1 00 0 1 00 1 0 01 0 1 01 1 0 11 0 1 11 1 0 10 0 1 10 1 0 J1 = x K1 = x’ x x y1 y0 0 1 y1 y0 0 1 00 0 1 00 1 0 01 0 0 01 1 1 11 0 0 11 1 1 10 1 1 10 0 0 J0 = z = (x + y1) • y0’ = x • y0’ + y1 • y0’ K0 = J0’ Hieraus wird eine sog. Zustandsfolgetabelle entwickelt. Diese beschreibt für alle möglichen Zustandskombinationen in Verbindung mit allen möglichen Eingangskombinationen die Nachfolgezustände. Zustandsfolgetabelle (Übergangstabelle) Gegenwärtiger Zustand y1 0 0 1 1 y0 0 1 1 0 Nächster Zustand (Folgezustand) x=0 x=1 y 1+ y 0+ y 1+ y 0+ 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 1 gegenwärtiger Ausgang x=0 x=1 z z 0 1 0 0 0 0 1 1 Als zweiter Schritt werden für die Zustandskombinationen (y1 y0) symbolische Namen eingeführt. Dies ist möglich und sinnvoll, da diese Zustandskombinationen für die Schaltungsanwendung ohne Bedeutung sind. Für die Anwendung ist lediglich das Verhalten der Ausgänge entscheidend. Alles interne Verhalten ist ohne Belang. Wir führen die folgenden Namen und Zuordnungen ein: a = 00 b = 01 c = 10 d = 11 15 Prof. Dr. Ulrich Teppner: DT39 Hiermit kann die Zustandsfolgetabelle umgeschrieben werden(Achtung auf die Reihenfolge!): Vereinfachte Zustandsfolgetabelle Gegenwärtiger Zustand a b c d Folgezustand, gegenw. Ausgang bei x = 0 a,0 a,0 b,1 a,0 Folgezustand, gegenw. Ausgang bei x = 1 d,1 c,0 d,1 c,0 Ausgehend von dieser vereinfachten Tabelle kann der Zustandsgraph direkt aufgetragen werden: 1.4.2 Synthese synchroner sequentieller Schaltungen Zur Synthese synchroner sequentieller Schaltungen müssen die im vorstehenden Abschnitt durchgeführten Schritte sinngemäß umgekehrt werden. Es müssen u.U. noch zusätzliche Zwischenschritte eingeführt werden, worauf hier nicht eingegangen wird. Ausgangspunkt für die Synthese ist jedoch meist eine verbale Problembeschreibung, die zunächst in einen Zustandsgraphen umgesetzt werden muss. So auch bei dem nachfolgenden Problem. Aufgabe: Auf einer Datenleitung wird der Beginn einer Nachricht durch 3 aufeinander folgende (zur clock synchrone) "1" angekündigt. Ein synchrones sequentielles Schaltwerk soll diese Datenleitung als Eingang 'x' benutzen und nach der zweiten "1" für einen Takt einen Ausgang 'z' setzen. Danach soll dieser Ausgang unabhängig vom Eingang permanent auf "0" bleiben. Der erste Schritt zur Lösung ist die Entwicklung des Zustandsgraphen für diese Aufgabe. Dies ist letztendlich auch der entscheidende Schritt, da alle nachfolgenden (in Abhängigkeit von einigen Entscheidungsfreiheiten) vorgegeben sind. 16 Prof. Dr. Ulrich Teppner: DT39 a 1/0 1/0 b c 1/1 d 0/0 1/0 0/0 0/0 0/0 Abbildung 1.19 Zustandsgraph für das Synthese-Beispiel Hieraus wird anschließend eine vereinfachte Zustandsfolgetabelle abgeleitet. Vereinfachte Zustandsfolgetabelle Gegenwärtiger Zustand a b c d Folgezustand, gegenw. Ausgang bei x = 0 a, 0 a, 0 a, 0 d, 0 Folgezustand, gegenw. Ausgang bei x = 1 b, 0 c, 0 d, 1 d, 0 Nun müssen die symbolischen Namen durch Zustandskombinationen ersetzt werden. Da es sich um vier Zustände handelt, müssen zwei Zustandsvariablen eingeführt werden (y1 y0). Aus den insgesamt 24 Möglichkeiten wird hier die folgende ausgewählt: a=00 b=01 c=10 d=11 Mit diesen Vorgaben kann jetzt die Zustandsfolgetabelle entwickelt werden. Zustandsfolgetabelle (Übergangstabelle) Gegenwärtiger Zustand y1 0 0 1 y0 0 1 1 1 0 Nächster Zustand (Folgezustand) x=0 x=1 y 1+ y 0+ y 1+ 0 0 0 0 0 1 1 1 1 0 0 1 y 0+ 1 0 1 1 gegenwärtiger Ausgang x=0 x=1 z z 0 0 0 0 0 0 0 1 Nun ist zu entscheiden, welche Flip-Flop-Typen eingesetzt werden. Wir wählen für dieses Beispiel JK-Flip-Flops aus. Einen Vergleich bezüglich des Realisierungsaufwandes in Abhängigkeit vom verwendeten Flip-Flop-Typ werden wir später ziehen können. Das Übergangsverhalten für JKFlip-Flops ist in nebenstehender Tabelle noch einmal aufgezeichnet. Übergang 0→0 0→1 1→0 1→1 J 0 1 X X K X X 1 0 Hiermit lassen sich die Gleichungen für die Vorbereitungseingänge der beiden FlipFlops ableiten: 17 Prof. Dr. Ulrich Teppner: DT39 x x y1 y0 0 1 y1 y0 0 1 00 0 0 00 X X 01 0 1 01 X X 11 X X 11 0 0 10 X X 10 1 0 J1 = y0 • x K1 = y0’ • x’ x x y1 y0 0 1 y1 y0 0 1 00 0 1 00 X X 01 X X 01 1 1 11 X X 11 0 0 10 0 1 10 X X J0 = x K0 = y1’ Hiermit lässt sich die Schaltung aufzeichnen (z kann direkt aus der Zustandsfolgetabelle abgeleitet werden): Abbildung 1.20 Schaltung zur Synthese des "Beginning of Message Detectors" Das Timing-Verhalten dieser Schaltung ist der Simulation zu entnehmen: 18 Prof. Dr. Ulrich Teppner: DT39 Abbildung 1.21 Typisches Zeitverhalten des Beginning-of-message Detektors Das Problem dieser Schaltungsart, bei der neben den Zustandsvariablen die Eingänge direkt auf die Ausgänge wirken, zeigt die folgende Abbildung. Abbildung 1.22 Zeitverhalten des BOM Detektors bei fehlerhaftem x-Eingangsverhalten Wenn die Eingangssignale nicht synchron mit dem System-Takt sind, kann dies zu Spikes auf den Ausgängen führen, welche das Verhalten der Nachfolge-Schaltung dramatisch beeinflussen können. Hier sind andere Schaltungs-Typen einzusetzen (s. Folge-Kapitel), oder es ist eine Synchronisation der Eingangssignale durchzuführen. 1.4.3 Mealy- Moore- Medvedev- Schaltungen Man unterscheidet synchrone sequentielle Schaltungen grundsätzlich in Mealy-, Moore- und Medvedev-Schaltungen. Bei MealySchaltungen sind die Ausgänge sowohl von den Eingängen als auch von den Zustandsvariablen abhängig (wie in obigem Synthese-Beispiel), bei Moore-Schaltungen sind sie nur von den Zustandsvariablen abhängig und bei Medvedev-Schaltungen sind sie identisch mit den Zustandsvariablen. Die Schreibweise bei den Zustandsdiagrammen unterscheidet sich entsprechend. Nebenstehend haben wir ein Beispiel für die Schreibweise eins Mealy-Automaten. Die Festlegung von Ein- und Ausgängen erfolgt an den Transitionen! 19 Prof. Dr. Ulrich Teppner: DT39 Bei einem Moore-Automaten steht an den Transitionen hingegen nur die Festlegung des Eingangs. Wir werden im Folgenden das Beispiel der obigen Mealy-Schaltung weiterführen und realisieren. Der nächste Schritt dazu ist das Aufstellen einer Zustandsfolgetabelle: Gegenwärtiger Zustand y1 0 0 1 1 Nächster Zustand x=0 y1+ y0+ 0 0 1 1 1 0 1 0 y0 0 1 1 0 x=1 y1+ y0+ 0 1 0 1 1 1 0 0 gegenw. Ausgang x=0 x=1 z z 0 0 0 0 0 0 0 1 Nun muss man sich entscheiden, welche FF-Typen eingesetzt werden sollen. Nehmen wir an, wir wollen mit JK-FFs weiterarbeiten, so ergeben sich die folgenden Vorbereitungseingänge für diese FFs: x x y1 y0 0 1 y1 y0 0 1 00 0 0 00 X X 01 1 0 01 X X 11 X X 11 0 0 10 X X 10 0 1 J1 = y0 y x’ K1 = y0’ y x 20 Prof. Dr. Ulrich Teppner: DT39 x x y1 y0 0 1 y1 y0 0 1 00 0 1 00 X X 01 X X 01 0 0 11 X X 11 1 0 10 0 0 10 X X K0 = y1 y x’ J0 = y1’y x x y1 y0 0 1 00 0 0 01 0 0 11 0 0 10 0 1 z = y0 y y1’y x Damit ist die Schaltung realisiert. Auf weitere Probleme im Zusammenhang mit sequentiellen synchronen Schaltungen, wie z.B. Minimierung der Zustände wird hier nicht eingegangen, da sie im Hinblick auf die Zielrichtung programmierbarer Logik von geringerer Bedeutung sind. Es wird jedoch noch eine Medvedev-Schaltung abgeleitet. Dies ist ein spezieller Zähler, welcher die folgende Sequenz 0-1-3-2-6-4-5-7 repetitiv durchläuft. Der Zustandsgraph sieht folgendermaßen aus: 21 Prof. Dr. Ulrich Teppner: DT39 Abbildung 1.23 Zustandsgraph eines Medvedev-Zählers Dadurch ergibt sich die folgende Zustandsfolgetabelle: Gegenw. Zustand y0 y1 y2 0 0 0 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 Nächster Zustand y0+ y1+ y2+ 0 0 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 1 0 0 0 Die Ausgänge brauchen nicht extra spezifiziert zu werden, da sie identisch mit den Zustandsvariablen sind. Als FF's werden D-FF's benutzt. Die Beschaltung ihrer Eingänge ergibt sich durch folgende KV-Tafeln: y1 y2 y1 y2 00 01 11 10 0 0 0 0 1 1 1 1 0 1 y0 D0 = y0 y y1’ + y1 y y2’ y0 00 01 11 10 0 0 1 1 1 1 0 1 0 0 D1 = y1’ y y2 + y0’ y y1 22 Prof. Dr. Ulrich Teppner: DT39 y1 y2 00 01 11 10 0 1 1 0 0 1 1 1 0 0 y0 D2 = y1’ In der Abbildung 1.24 ist diese Schaltung mit ihrer Simulation dargestellt. Abbildung 1.24 23 Prof. Dr. Ulrich Teppner: DT39 1.5 Aufgaben Aufgabe 1.1 Gegeben sei die Schaltung der Abbildung 1.25 x J Q CLK K Q J Q clk CLK K Q z Abbildung 1.25 Schaltung zur Analyse-Aufgabe Entwickeln Sie daraus über die Zustandsfolgetabellen den Zustandsgraphen. Zustandsfolgetabelle (Übergangstabelle) Gegenwärtiger Zustand y1 0 0 1 1 y0 0 1 1 0 Nächster Zustand (Folgezustand) x=0 x=0 y 1+ y 0+ y 1+ y 0+ gegenwärtiger Ausgang x=0 x=1 z z Einführung symbolischer Namen für die Zustandskombinationen (y1 y0) a= b= c= d= Vereinfachte Zustandsfolgetabelle Gegenwärtiger Zustand Folgezustand, gegenw. Ausgang bei x = 0 Folgezustand, gegenw. Ausgang bei x = 1 a b c d 24 Prof. Dr. Ulrich Teppner: DT39 Zustandsgraph Aufgabe 1.2 Entwickeln Sie für den nebenstehenden Zustandsgraphen eine Schaltung. a) Setzen Sie für die Zustände an: a = 00, b = 01, c = 10, d = 11 Als FFs werden JK-FF eingesetzt. b) Setzen Sie für die Zustände an: a = 00, b = 01, c = 11, d = 10 Als FFs werden D-FF eingesetzt. Aufgabe 1.3 Entwickeln Sie einen Modulo 3 Binärzähler als Medvedev-Schaltung mit Auf-/ab-Steuereingang. 25 Prof. Dr. Ulrich Teppner: DT39 Aufgabe 1.4 Gegeben sei folgende Zustandsfolgetabelle für eine Schaltung mit einem Eingang x und einem Ausgang z: gegenw. Zustand y1 y0 00 01 11 10 Folge-Zustand x=0 y1+y0+ 00 11 10 11 x=1 y1+y0+ 01 10 01 00 gegenw. Ausgang x=0 x=1 z z 0 0 0 1 0 1 0 0 Unter Benutzung von J K Flip-Flops ist hierzu eine Schaltung zu entwickeln. Leiten Sie die (in 2 Ebenen minimalen) Boole'schen Funktionen für die Vorbereitungs-Eingänge der beiden Flip-Flops und für den Ausgang z ab. x y1 y0 x 0 1 y1 y0 00 00 01 01 11 11 10 10 J1 = 0 1 x 0 1 y1 y0 00 00 01 01 11 11 10 10 J0 = 1 K1 = x y1 y0 0 K0 = 26 Prof. Dr. Ulrich Teppner: DT39 2 Entwicklung komplexer digitaler Systeme Im Allgemeinen dienen digitale Systeme immer in irgendeiner Weise der Verarbeitung von Daten. Die binäre Information, die in einem derartigen System gespeichert ist, kann dabei unterschieden werden in a) b) Daten, die verarbeitet werden Steuerinformation (Zustandsvariablen) Der logische Entwurf eines derartigen Systems kann daher auch in zwei Anteile aufgeteilt werden: a) b) Datenverarbeitungsteil Steuerlogik Die Steuerlogik ist eine sequentielle Schaltung, die eine zeitliche Sequenz von Steuersignalen an den Datenverarbeitungsteil weitergibt. Beschrieben wird dies durch eine endliche Anzahl von Einzelschritten, welche das vorgegebene Problem lösen. Dies nennt man einen Hardware-Algorithmus. Das allgemeine Schema ist in Abbildung 2-1 dargestellt. Abbildung 2-1 Allgemeines Schema zur Struktur komplexer digitaler Systeme In der Software ist es üblich, Lösungswege für Algorithmen durch z.B. Flussdiagramme zu beschreiben. In der Hardware gibt es eine äquivalente Schreibweise. Dies sind Ablaufdiagramme, im englisch-sprachigen Bereich auch ASM-charts (Algorithmic State Machine Charts) oder FSM-charts (Finite State Machine Charts) genannt. Diese ähneln den erwähnten Flussdiagrammen, haben aber einen ganz wesentlichen Unterschied, welcher auf dem grundsätzlichen Gegensatz sequentieller Software-Abarbeitung und paralleler Hardware beruht. 2.1 Ablaufdiagramme (ASM-charts, FSM-charts) Die gegenwärtige Tendenz in diesem Bereich sieht so aus, dass sich die Hardware-Beschreibung mittels “Charts“ bei komplexeren digitalen Systemen in Zukunft wahrschein27 Prof. Dr. Ulrich Teppner: DT39 lich gegenüber dem Einsatz reiner Hardware-Beschreibungs-Sprachen durchsetzen wird, da eine Formulierung hiermit sehr einfach und übersichtlich wird, und eine automatische Synthese der Hardware hieraus problemlos durchführbar ist. Bevor die Grundelemente der Ablaufdiagramme erklärt werden, ist anzumerken, dass es verschiedene Schreibweisen gibt. Die hier vorgestellte ist daher nur exemplarisch zu sehen. Es existieren in unserer Definition drei Symbole: Zustands- (State-), Entscheidungs(Decision-) und bedingte (conditional) Box. Abbildung 2-2 Die drei Grundelemente von Ablaufdiagrammen Einige wesentliche Eigenschaften von hiermit aufgebauten Ablaufdiagrammen sollen an einem Ausschnitt eines umfangreicheren Diagramms dargestellt werden. 28 Prof. Dr. Ulrich Teppner: DT39 Abbildung 2-3 Ausschnitt eines Ablaufdiagramms Der durch die gestrichelte Linie gekennzeichnete Teil wird auch als Block bezeichnet. Ein Block ist eine Struktur bestehend aus exakt einer Zustands-Box und allen Entscheidungs- und bedingten Boxen an den Ausgängen dieser Zustands-Box bis zur jeweils nächsten Zustands-Box. Bevor wir weiter auf die Bedeutung eines Blocks eingehen, werden wir zunächst einen zum Ablaufdiagramm äquivalenten Zustandsgraphen zeichnen. 001 EF = 1X EF = 00 EF = 01 100 010 011 Abbildung 2-4 Zustandsgraph zum Ablaufdiagramm-Ausschnitt An der Abbildung 2-4 kann man erkennen, dass der Zustandsgraph, d.h. damit der Steuerteil der Schaltung, nur noch die Übergänge zwischen den Zustandsboxen enthält. Die Information über die Register-Transfers, welche in den Zustands- und bedingten Boxen gegeben ist, ist hier weggefallen. 29 Prof. Dr. Ulrich Teppner: DT39 Im Zusammenhang mit der Definition eines Blocks kann man sagen, dass ein solcher Block durch einen Zustand wiedergegeben wird. Die Übergänge zwischen den Zuständen werden durch die Entscheidungs-Boxen definiert. Ein ganz wesentlicher Unterschied zu Flussdiagrammen ist nun der folgende: Alle Register-Transfers, welche innerhalb eines Blocks gegeben sind (egal ob unbedingte aus der Zustands-Box oder bedingte aus der bedingten Box), werden gleichzeitig ausgeführt, und zwar beim Übergang in den Folge-Zustand. Dies bedeutet für das Beispiel aus Abbildung 2-3, dass A ← A + 1 und R ← 0 mit der gleichen Takt-Flanke ausgeführt werden (falls E = 1, sonst wird nur A ← A + 1 ausgeführt). Dies reflektiert die Tatsache, dass alle Register des Systems mit der gleichen TaktFlanke schalten. Während sich das System in einem bestimmten Zustand befindet (hier in T1), werden diese Transfers durch Setzen von Vorbereitungseingängen bzw. Steuereingängen vorbereitet, und beim Übergang in den Folge-Zustand werden sie ausgeführt. Dieses Verhalten soll an einem detaillierteren Beispiel im nächsten Kapitel genauer beleuchtet werden. 2.2 Beispiel zur Entwicklung digitaler Systeme mit ASM-charts Es soll ein digitales System entwickelt werden mit 2 Flip-Flops E und F und einem 4-bit Zähler A. A besteht aus A4 (MSB) ... A1 (LSB). Ein Start-Signal S initiiert das System. Der Zähler wird dann hochgezählt. A3 und A4 bestimmen dabei folgendermaßen die Sequenz: wenn A3 = 0: E ← 0, weiterzählen wenn A3 = 1: E ← 1, wenn außerdem A4 = 0, weiterzählen wenn außerdem A4 = 1, F im nächsten Takt setzen, dann stoppen Das Ablaufdiagramm zu dieser Aufgabe ist in der Abbildung 2-5 dargestellt. 30 Prof. Dr. Ulrich Teppner: DT39 Abbildung 2-5 ASM-chart zum Beispiel Ausgehend hiervon versuchen wir, die sich in der so beschriebenen Hardware abspielenden Vorgänge durch eine Simulation nachzuvollziehen. Dies kann in der nachfolgenden Tabelle als Sequenz von Operationen protokolliert werden. A4 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 Zähler A3 A2 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 A1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 Flip-Flops E F ? 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 Zustand T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T1 T2 T0 Bemerkungen A3 = 0, A4 = 0 A3 = 1, A4 = 0 A3 = 0, A4 = 1 31 Prof. Dr. Ulrich Teppner: DT39 Als nächstes soll die Hardware zu diesem Beispiel entwickelt werden. Wie weiter oben beschrieben, kann durch Aufstellen eines Zustandsgraphen für dies Ablaufdiagramm der Steuerteil definiert werden. S,A3,A4 T0 X,X,X T2 1,X,X 0,X,X X,1,1 T1 X,0,X X,1,0 Abbildung 2-6 Zustandsgraph für den Steuerteil der Beispielschaltung, abgeleitet aus dem Ablaufdiagramm Modifizierte Zustandsfolgetabelle dazu (vereinfachte Schreibweise) Gegenw. Zustand y1 y0 S Eingänge A3 A4 0 0 0 0 0 1 X X 0 1 1 X 0 0 1 1 1 1 0 1 X X X X X X X 0 1 X Folgezustand + y1 y 0+ 0 0 0 1 0 1 0 1 1 1 0 0 Ausgänge (=Zustandsdesig.) T0 T1 T2 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 Flip-Flop-Beschaltung nach Inspektion dieser Tabelle: J1 = y0 • A3 • A4 K1 = 1 J0 = S K0 = y1 T0 = y0’ T1 = y1’ • y0 T2 = y1 Der Datenverarbeitungsteil dieser Schaltung kann nicht nach einem derartigen Verfahrensschema entwickelt werden. Trotzdem ist seine Entwicklung relativ eindeutig, wobei man nach folgendem Verfahren vorgeht. Zunächst sind alle in der Schaltung einzusetzenden Register aufzulisten. Dann ist für jedes dieser Register festzulegen, welche Operationen an ihm ausgeführt werden müssen (Inspektion der Register-Transfers aus dem Ablaufdiagramm). Anschließend müssen nur noch für diese Transfers geeignete Bausteine ausgesucht werden, wobei allerdings ein gewisses Maß an Erfahrung eingebracht werden muss, um die optimalen Bausteine auszusuchen. Bei einer automatischen Hardware-Generierung über HardwareCompiler ist hier das Expertenwissen entscheidend. In unserem Beispiel benötigen wir drei Register: A, E, F. E und F sind 1-Bit Register mit Setz- und Rücksetz-Möglichkeit, so dass einfache JK-FFs eingesetzt werden können. A ist ein 4-Bit Register, welches gelöscht und inkrementiert werden können muss, so dass sich hier ein Binär-Zähler anbietet. 32 Prof. Dr. Ulrich Teppner: DT39 Dadurch ergibt sich die Schaltung aus Abbildung 2-7. Abbildung 2-7 Schaltung zum Datenverarbeitungs- und Steuerteil (Controller) Das Verhalten dieser Schaltung kann an Hand der zeitlichen Simulation mit dem erwarteten Verhalten verglichen werden. Abbildung 2-8 Zeitverhalten der synthetisierten Schaltung 2.3 Alternative Steuerteil-Realisierung als One-Hot Schaltung Der Begriff ‘One-Hot’ kommt aus dem Englischen und bedeutet, dass für jeden Zustand exakt ein Flip-Flop zuständig ist. D.h. natürlich, dass einerseits beim Reset dieses Systems genau 1 Flip-Flop gesetzt und alle anderen gelöscht werden müssen, und andererseits, dass im Betrieb auch nur 1 Flip-Flop zu einem Zeitpunkt gesetzt sein darf. 33 Prof. Dr. Ulrich Teppner: DT39 Dies hat wesentliche Vorteile im Falle eines eventuellen Störfalls innerhalb eines derartigen Systems. Ein Störfall bedeutet, dass Störungen auf Signal- oder Versorgungsleitungen zu einer unerwünschten Änderung von Flip-Flop-Zuständen führen. Im Falle einer One-Hot-Realisierung führt diese Änderung mit hoher Wahrscheinlichkeit zu einer nicht erlaubten Flip-Flop-Konfiguration, d.h., dass mehr (oder weniger) als 1 Flip-Flop gesetzt sind. Eine einfache Kombinatorik kann diesen Fehler erkennen und melden. Ein weiterer Vorteil liegt in der einfacheren Entwicklung dieser Schaltung, wie sich in Abbildung 2-9 zeigt. Ein eventueller Nachteil ist natürlich der höhere Flip-Flop-Aufwand. Bei modernen FPGA, welche über eine hohe Anzahl von Flip-Flops verfügen (und im Verhältnis dazu wenig Logik), ist dies jedoch häufig die Methode der Wahl. Abbildung 2-9 Steuerteil-Realisierung als One-Hot Schaltung Die Entwicklung sieht derart aus, dass man sich direkt am Zustandsgraphen orientieren kann (Abbildung 2-6). Exakt die Pfeile, die in einen Zustand führen, bedingen ein Setzen des entsprechenden Flip-Flops. 34 Prof. Dr. Ulrich Teppner: DT39 2.4 Beispiel: ASM-Chart für einen sequentiellen Multiplizierer In Abbildung 2-10 ist als Beispiel ein ASM-chart für einen Multiplizierer nach der Schiebe-und-Addiere Methode gegeben. Abbildung 2-11 zeigt das zugehörige Operations- (Datenverarbeitungs-)teil als Blockschaltbild. Abbildung 2-10 Ablaufdiagramm eines Binärmultiplizierers nach der Schiebe- und Addiermethode Die Zustände dieser Maschine sind durch Ti gekennzeichnet (rechteckige Kästen). Der Anfangszustand ist T0, bis das Startbit S gesetzt wird. In T1 wird der Operationsteil initiiert: Das Ergebnis-Register A und das Übertrags-Register E werden gelöscht, der Zähler wird auf die Zahl der Durchläufe n geladen. Danach wird die Schleife mit den Zuständen T2 und T3 so lange durchlaufen, bis der Zähler die n Durchläufe gezählt hat und damit Z = 1 wird. Dies ist der Fall, wenn alle Bits des Multiplikators verarbeitet sind. Während in T3 jeweils geschoben wird, wird in T2 nur dann addiert, wenn das zugehörige Multiplikatorbit Q1 = 1 ist. 35 Prof. Dr. Ulrich Teppner: DT39 Abbildung 2-11 Operationsteil des Binärmultiplizierers Das Blockschaltbild zum Operationsteil ist in der Abbildung 2-11 dargestellt. B hält den Multiplikanden, Q den Multiplikator und A das partielle Produkt (zusammen mit dem Flip-Flop E für den Übertrag). P zählt die verarbeiteten Bits und setzt Z auf 1, wenn alle bearbeitet sind. Während sich das Ergebnis von Register A nach Register Q bitweise erweitert, wird der Multiplikator bitweise aus Q herausgeschoben. 36 Prof. Dr. Ulrich Teppner: DT39 3 Technische Realisierung von Logik-Bauelementen Wir wollen uns nun etwas genauer mit den technischen Details von Logik-Bauelementen beschäftigen. Ganz allgemein werden üblicherweise Spannungen benutzt, um Boole'sche Werte bzw. binäre Ziffern (Bits) darzustellen. Daher benötigt man zwei Spannungen, um diese beiden binären Zustände zu repräsentieren. Wenn die Spannung, mit welcher man eine 1 darstellt positiver ist als die Spannung, mit der die 0 dargestellt wird, spricht man von positiver Logik. Im umgekehrten Fall wird von negativer Logik gesprochen. Da meistens mit positiver Logik gearbeitet wird, werden wir in den folgenden Erklärungen auch davon ausgehen. Zu erwähnen ist noch, dass wir unter dem Begriff (Logik-) Gatter (englisch: gate) die physikalische Repräsentation einer Boole'schen Logik-Funktion verstehen. So ein Gatter kann entweder einen (NOT-Gatter) oder mehrere Eingänge besitzen. Die Anzahl der Eingänge bezeichnet man auch als Fan-In. Ein AND-Gatter mit 3 Eingängen hat daher ein Fan-In von 3. Unter Fan-Out versteht man die Anzahl von nachgeschalteten Gattern, die man an einen Ausgang eines Gatters anschließen kann. Das Fan-Out ist durch die elektrischen Eigenschaften der beteiligten Bauteile bestimmt. Hierauf werden wir später eingehen. Vorher werden wir grundsätzliche Logik-Gatter Bauformen besprechen, welche teilweise historisch sind, aber wichtig für das Grundverständnis auch moderner elektronischer Realisierungen. 3.1 Dioden-Gatter Blicken wir zurück auf eine p-n-Diode. Strom fließt in Durchlassrichtung durch diese Diode, wenn die angelegte Spannung ungefähr +0,7 V überschreitet. Der Spannungsabfall über die Diode bleibt ungefähr bei 0,7 Volt, auch wenn der Strom zunimmt. Bei angelegter Spannung < 0,7 V bzw. negativer Spannung fließt praktisch kein Strom. In den folgenden Betrachtungen gehen wir von einer idealen Diode mit genau diesem Verhalten aus. Ein 3-Input AND mit Dioden aufgebaut wird in nebenstehender Abbildung dargestellt. Wir nehmen die Eingangs-LogikPegel an zu 0V für 0 und +5V für 1. Wenn alle Eingänge auf 0 gelegt sind, fließt Strom zwischen der 5V Spannungsversorgung und den Eingängen A,B und C. An den Dioden entsteht ein Spannungsabfall von 0,7 Volt, welcher am Ausgang anliegt. Dies wird als logisch 0 interpretiert. Wird ein Input auf 5V gelegt (logisch 1) fließt trotzdem durch die anderen Dioden ein Strom und erzeugt den 0,7 Volt Spannungsabfall. Der Ausgang bleibt daher auf logisch 0. Erst wenn alle Inputs auf 5V gelegt werden, ändert sich das: Der Ausgang geht dann auch auf 5V, d.h. logisch 1. Wir haben somit ein AND-Gatter erzeugt. Zu beachten ist, dass der Ausgang 0 durch eine Spannung, die 0,7 Volt höher ist als eine Eingangs-0, repräsentiert wird. Werden derartige Gatter hintereinander geschaltet, 37 Prof. Dr. Ulrich Teppner: DT39 wird bei jedem Gatter 0,7 Volt für eine logische 0 dazu addiert. D.h., hinter zwei derartigen Gattern wäre eine 0 repräsentiert durch 1,4 Volt, hinter dreien durch 2,1 Volt, usw. Das ist natürlich nicht akzeptabel. Eine 1 würde übrigens jeweils unverändert durch 5 Volt dargestellt. Ein 3-Input OR kann ebenfalls mit Dioden realisiert werden. Nebenstehend ist die entsprechende Schaltung dargestellt. Sind alle Inputs auf 0 Volt (logisch 0) gelegt, ist auch der Ausgang 0 Volt. Wird mindestens einer der Eingänge auf 5 Volt (logisch 1) gelegt, so geht die entsprechende Diode auf Durchlass und es tritt ein Spannungsabfall von 0,7 Volt ein. Der Ausgang geht also auf 4,3 Volt, was als logisch 1 angesehen werden muss. Die Schaltung repräsentiert daher ein OR. Zu beachten ist hier, dass diese Schaltung eine Eingangs-1 um jeweils 0,7 Volt vermindert. Kaskadierte OR-Gatter würden beim logisch-1 also wiederum die Spannung um jeweils 0,7 Volt vermindern 3.2 Bipolare Transistoren-Gatter Ein NOT-Gatter kann z.B. nicht nur aus Dioden und Widerständen gebaut werden. Hierzu benötigen wir aktive Elemente, i.a. Transistoren. Wir werden in diesem Kapitel bipolare Transistoren als Logik-Elemente benutzen. Diese Transitoren werden in LogikSchaltungen entweder gesperrt oder in Sättigung angesteuert. 38 Prof. Dr. Ulrich Teppner: DT39 Bei dem abgebildeten Transistor handelt es sich um einen npn-Transistor (Stromfluss aus dem Emitter und in Kollektor und Basis. In der Abbildung ist ein Widerstand zwischen Kollektor und 5 Volt gelegt, durch den der Kollektor-Strom fließt. Fließt kein Basis-Strom (a), so sind auch Kollektor- und Emitter-Strom 0. Der Transistor sperrt und kann mit einem offenen Schalter verglichen werden. Die Kollektor-Spannung entspricht der Versorgungsspannung (5 Volt). An der Basis muss eine Spannung < 0,6 Volt anliegen, um diesen Zustand einzustellen. Wird zwischen Basis und Emitter eine Spannung > 0,6 Volt gelegt, fließt ein BasisStrom IB und nach der Formel IC = hFE IB auch ein Kollektor-Strom IC. hFE ist dabei die DC Stromverstärkung. Der Spannungsabfall über den Widerstand R nimmt zu und die Kollektorspannung nähert sich 0 Volt. Tatsächlich existiert eine Minimalspannung zwischen Kollektor und Emitter, die Sättigungsspannung, welche ungefähr 0,2 Volt beträgt. Bei weiter steigendem Basis-Strom stimmt die obige Formel nicht mehr und der Transistor geht in die Sättigung. Die Basis-Emitter-Spannung, welche den Transistor in diese Sättigung bringt beträgt i.a. 0,7 bis 0,9 Volt (im folgenden nehmen wir 0,7 Volt an). Nebenstehend ist ein Transistor NOT Gatter dargestellt. Ist die Eingansspannung 0 Volt (oder < 0,6 Volt), fließt kein Basis-Strom und daher auch kein Kollektor-Strom. Die KollektorSpannung steigt auf 5 Volt. Steigt die Eingangsspannung auf deutlich > 0,7 Volt, geht der Transistor in die Sättigung und die Ausgangsspannung fällt auf 0,2 Volt. Daher ist diese Schaltung ein NOT Gatter, wobei eine logische 0 am Ausgang durch 0,2 Volt und eine logische 1 durch 5 Volt repräsentiert werden. 3.2.1 Dioden-Transistor-Logik (DTL) In Anlehnung an das Dioden AND Gatter (s.o.) kann ein NAND Gatter mit Dioden und Transistor aufgebaut werden. Diese so gebaute Logik bezeichnet man als DTL (Dioden-Transistor-Logik). Auch hier haben wir wieder die beiden Zustände 'gesättigt' und 'gesperrt', entsprechend zu obigem NOT Gatter. Wenn ein oder mehrere Eingänge low (0,2 Volt) sind, liegen am unteren Ende von R1 0,9 Volt an (0,2 + 0,7 Volt Spannungsabfall an der Diode). Die beiden Dioden D4 und D5 sperren, da keine eine Spannungsdifferenz von >0,7 Volt sieht (eine Diode würde daher bereits ausreichen), womit durch R2 eine Basisspannung von 0 Volt erzeugt wird. Der Transistor sperrt. Sind alle Inputs high (5 Volt), sperren die Eingangs-Dioden D1 bis D3. Als Konsequenz fließt Strom durch R1 und D4 und D5 an die Basis des Transistors. Hier teilt sich der Strom: ein Teil fließt über R2, der andere in die Basis. R2 muss so bemessen sein, dass der Transistor sicher in die Sättigung getrieben wird. 39 Prof. Dr. Ulrich Teppner: DT39 3.2.2 Transistor-Transistor-Logik (TTL) Derartige DTL Gatter waren in der Frühzeit der integrierten Schaltungen (ca. um 1960) durchaus üblich. Sie lösten die RTL Gatter (Resistor=Widerstand Transistor Logik) ab, die hier nicht besprochen werden und wurden selbst relativ schnell durch TTL Gatter (Transistor Transistor Logik) abgelöst (ca. um 1963). Diese TTL Gatter waren die Basis vieler nachfolgender Baustein-Familien. Standard TTL war dabei die erste Familie und wurde, wie gesagt, 1963 eingeführt. Wenn wir nebenstehende TTL Schaltung betrachten und mit der vorherigen DTL Schaltung vergleichen, stellen wir fest, dass die Eingangs-Dioden durch einen sog. Multi-Emitter Transistor T1 ersetzt worden sind. Dessen verschiedene Basis-Emitter PN-Übergänge kann man auch als separate Dioden auffassen, die den Dioden der DTL Schaltung entsprechen. Die Dioden D4 und D5 der DTL Schaltung werden entsprechend ersetzt durch den Basis-Kollektor PN-Übergang des Transistors T1. Weiterhin fällt auf, dass der eine Ausgangstransistor der DTL Schaltung ersetzt wurde durch eine sog. Gegentakt-Ausgangsstufe (Totem Pole Schaltung). Betrachten wir nun die Funktionsweise: Sind ein oder beide Eingänge low (0,2 Volt), fließt ein Strom vom +5 Volt-Anschluss durch R1 in die Basis und aus dem Emitter in die Treiber der Eingänge A und B. Da es sich um einen Transistor handelt, fließt auch ein Kollektor-Strom nach der Maßgabe: Emitter-Strom = Kollektor-Strom + Basis-Strom (IE = IC + IB). Unter der Annahme, dass der Basis-Strom ausreicht, den Transistor zu sättigen, ist die Spannungsdifferenz zwischen Kollektor und Emitter von T1 0,2 Volt. Somit liegt an der Basis von T2 0,4 Volt an, wodurch er sperrt. Dies bringt wiederum T3 zum Sperren (Basis an 0 Volt) und T4 zum Leiten. Bedingt durch die Spannungsabfälle an T4 und D1 ergibt sich somit ein Ausgangspegel von 3,6 Volt (5 - 0,7 – 0,7). Sind beide Eingänge high-Pegel, so sperren die Basis-Emitter PN-Übergänge von T1. Der Kollektor kann trotzdem nicht über 1,4 Volt steigen wegen der Basis-Emitter Übergänge von T2 und T3. Es fließt ein Strom durch R1, den Basis-Kollektor Übergang von T1 und in die Basis von T2. T2 und damit auch T3 gehen in die Sättigung. T1 befindet sich im sog. Inversbetrieb: Emitter auf 3,6 Volt, Kollektor auf 1,4 Volt und Basis auf 2,1 Volt, d.h. der Kollektor arbeitet als Emitter und umgekehrt. T3 in Sättigung bedeutet, dass der Kollektor auf 0,2 Volt liegt. Die Basis von T4 liegt an 0,9 Volt (T2 und T3 in Sättigung). Ohne D1 würde T4 deswegen auch in die Sättigung, mit D1 sperrt T4 und der Ausgang liegt sicher auf low-Pegel. Dieses Bauteil ist ein 2-Input NAND-Gatter, welches als TTL-Bauteil die Bezeichnung 7400 besitzt. Zu erwähnen ist noch, dass unbeschaltete Eingänge wirken, als wenn ein High-Pegel anliegen würde. 40 Prof. Dr. Ulrich Teppner: DT39 Ein 2-Input NOR-Gatter mit der Bezeichnung 7402 wird in der nebenstehenden Darstellung gezeigt. Seine Funktionsweise ist entsprechend der für das NAND-Gatter erklärten. 3.2.3 Open-Collector TTL Gatter Will man die Ausgänge mehrerer TTL Gatter miteinander verknüpfen, damit die Einzelgatter eine gemeinsame Leitung treiben, so erhält man Probleme entsprechend der nebenstehenden Darstellung. Wenn unterschiedliche Ausgänge die gemeinsame Leitung auf unterschiedliche Pegel ziehen wollen, können sich außerordentlich hohe Ströme bilden, da die beiden sich in Sättigung befindlichen Transistoren einen sehr geringen Widerstand (ca. 25 Ω) haben. Hierdurch ist eine Zerstörung der beteiligten Transistoren möglich. Eine mögliche Lösung für dieses Problem sind TTL-Gatter mit sog. Open-collector Ausgang. Dies sind TTL-Ausgänge, bei welchen der obere Transistor und die Diode weggelassen werden. In der folgenden Abbildung (a) ist die entsprechende Schaltung dargestellt. Der Ausgang ist entweder in Durchlass geschaltet (logisch 0) gegen 0 Volt, oder er ist gesperrt (hochohmig bei logisch 1). Dieser Ausgang erzeugt damit keinen direkten Logik-Pegel, welcher an nachfolgende TTL-Bauteile weitergegeben werden kann. 41 Prof. Dr. Ulrich Teppner: DT39 Allerdings können solche Ausgänge jetzt auf eine Leitung zusammengeschaltet werden (b). Hierzu muss nur ein sog. Pull-up Widerstand (typischerweise 470 Ω bis 4,7 kΩ) gegen die Versorgungsspannung geschaltet werden. Sind alle beteiligten Ausgangstransistoren gesperrt, liegt die gemeinsame Leitung damit auf 5 V (logisch 1). Ist nur ein Ausgangstransistor leitend, wird die gemeinsame Leitung auf logisch 0 gezogen. Dies ist eine ORVerknüpfung der Ausgänge und wird als wired-OR bezeichnet. Man kann es daher als entsprechende LogikVerknüpfung einsetzen. Eine andere Anwendung liegt im Einsatz als BusSystem, da es hiermit möglich ist, mehrere Signal-Quellen an eine Leitung anzuschließen und auf die entsprechenden Empfänger zu verteilen. Der Einsatz der open-collector Bausteine ist jedoch nicht mehr sehr verbreitet, außer für spezielle Signale bei Bussystemen. Der grundsätzliche Nachteil liegt darin, dass ein Umschalten von 0 auf 1 über den Pull-up Widerstand stattfindet und dieser als passives Bauelement (Die Ausgangs-Kapazität muss über diesen Widerstand auf logisch 1 geladen werden) wesentlich langsamer ist als ein aktiv schaltender Transistor. 3.2.4 Three-state TTL Gatter Die Lösung obigen Problems ist der Einsatz von Three-State Gattern (auch als Tri-state Gatter nach einer Markenbezeichnung von National Semiconductor Corporation bezeichnet). Während ein normaler TTL-Ausgang zwei Zustände (0 und 1) annehmen kann, hat ein Three-State Ausgang derer drei. Zusätzlich zu den beiden LogikAusgängen 0 und 1 kommt ein dritter Zustand hinzu, in welchem der Ausgang einen sehr hohen Widerstand zeigt, also praktisch abgeschaltet ist. Im Englischen wird hoher Widerstand mit high impedance bezeichnet, das Zeichen für Impedanz ist Z, weswegen dieser Zustand auch häufig als Hi-Z tituliert wird. Die folgende Abbildung zeigt einerseits das Logik-Symbol für einen invertierenden Three-State Treiber (a), andererseits die Wahrheitstabelle für die Funktion dieses Gatters (b) und eine BusAnschaltung mehrerer derartiger Treiber (c). Man muss natürlich darauf achten, dass nur einer der möglichen Treiber (Sources) einen Logik-Pegel auf den Bus schreibt, alle anderen müssen im hochohmigen Zustand sein. Derartige Bussysteme sind die heutzutage eingesetzten. 42 Prof. Dr. Ulrich Teppner: DT39 Die Realisierung des dritten Zustands ist sehr simpel. Dies wird in nebenstehender Abbildung deutlich. Der zusätzliche Steuereingang (Control input) wird mit einem zusätzlichen Anschluss des Multi-Emitter Transistors und einer zusätzlichen Diode D2 verbunden. Wenn dieser Steuereingang high ist, sperrt D2 und das Gatter arbeitet wie ein normaler TTL-Ausgang. Ist er low, würde der Ausgang ohne D2 eine logische 1 annehmen, d.h. T3 sperrt und T4 wäre leitend. Durch D2 wird nun aber die Basis von T4 runtergezogen, so dass T4 ebenfalls sperrt. D.h. beide Ausgangstransistoren sperren und der Ausgang ist damit insgesamt hochohmig gegen 0 und 5 Volt. 3.2.5 Schottky TTL So wie bisher besprochen, befinden sich die Transistoren immer in einem von 2 Zuständen: entweder in Sättigung (voll leitend) oder sperrend. Dazwischen müssen sie umschalten. In Sättigung fließt mehr Strom als nötig in die Basis und bewirkt übermäßige Ladung im Transistor. Diese Ladung muss beim Schalten wieder abfließen, was Zeit kostet. Ziel ist es daher, den Transistor nicht in die Sättigung kommen zu lassen. Dies kann erreicht werden, 43 Prof. Dr. Ulrich Teppner: DT39 indem man verhindert, dass die Kollektorspannung die Sättigungsspannung erreicht (ca. 0,2 Volt). Dies erreicht man durch Einsatz einer Schottky-Diode zwischen Basis und Kollektor, welche ein 'clamping' (Festklemmen der Spannung bei 0,3 bis 0,4 Volt) erzielt. Eine derartige Schaltung wird als Schottky-Transistor bezeichnet. Diese Modifikation der TTL-Bausteine wurde 1969 eingeführt und brachte die Bausteine der 74Sxx-Serie auf den Markt. Eine low-power Version mit höheren internen Widerstandswerten wurde 1971 als Low-power Schottky eingeführt (74LSxx). Diese LS-Bauteile wurden der Standard. Es gab jedoch noch die Einführung von Advanced Schottky TTL (74ASxx) und Advanced Low-power Schottky TTL (74ALSxx) mit noch schnelleren Schalteigenschaften und Leistungsverbrauch. Die Abbildung zeigt ein LSTTL Gatter. Man sieht, dass man außerdem vom Multi-Emitter Transistor zurück zu einer Diodenschaltung gegangen ist. 3.2.6 Emitter-coupled logic (ECL) In der Emitter-gekoppelten Logik wurden die eingesetzten Transistoren generell nicht in Sättigung betrieben, wodurch wesentlich kürzere Schaltzeiten erreicht wurden. Die Versorgungsspannung war -5,2 Volt, Logik-Pegel daher nicht kompatibel zu TTL. Die Verlustleistung war substantiell höher als bei TTL. Der Vorteil waren natürlich die kurzen Schaltzeiten, weswegen bei entsprechenden Anwendungen in der Vergangenheit ECL eingesetzt wurde. Heute ist es durch die Entwicklungen in der CMOS-Technik mit ähnlichen Schaltzeiten jedoch weitestgehend verdrängt. 3.3 MOS Gatter Alternativ zu bipolaren Transistoren, wie sie in der TTL- und ECL-Technik eingesetzt werden, können Metalloxid Feldeffekttransistoren (MOSFET) benutzt werden, wie es heute bei hoch-integrierten Schaltungen üblich ist 3.3.1 NMOS und PMOS Der MOSFET kann als n-Kanal (NMOS) oder p-Kanal (PMOS) MOSFET aufgebaut sein. Weiterhin unterscheidet man in selbstsperrende (enhancement) und selbstleitende (depletion) Bauformen. Es gibt drei Anschlüsse: Source, Drain und Gate. Ein n-Kanal selbstsperrender MOSFET wird normalerweise so betrieben, dass Drain an eine positive Spannung gegenüber Source angeschlossen ist. Wenn die Gate-Source Spannung VGS 0 Volt ist, fließt kein Strom zwischen Source und Drain. Ab der Schwellspannung VT (Threshold Voltage) tritt ein zunehmender Strom auf. Das Bauteil kann damit als Logik-Baustein mit zwei Zuständen fungieren: leitend und nicht-leitend. Beim selbstleitenden NMOS Transistor ist VT negativ. Bei VGS = 0 Volt fließt bereits ein Strom zwischen Source und Drain. Dieser Strom stoppt, wenn VGS < VT. PMOS Gatter funktionieren entsprechend. 44 Prof. Dr. Ulrich Teppner: DT39 In der Abbildung ist in (a) ein einfaches NMOS NOT Gatter dargestellt. VDD ist die positive Versorgungsspannung, die über den Widerstand an Drain angeschlossen ist. Source ist an VSS (0 Volt) angeschlossen. Der Transistor ist bei A (Gate) = 0 Volt gesperrt, wodurch der Ausgang auf VDD liegt. Übersteigt die Gate-Spannung VT, so wird der Transistor leitend und der Ausgang auf VSS gezogen. Die Abbildungen (b) und (c) stellen ein NAND bzw. NOR Gatter dar, was leicht nachzuvollziehen ist. Einzel-Gatter in NMOS-Technik existieren nicht. Allerdings wurden diverse Microprozessoren in dieser Technik hergestellt. 3.3.2 CMOS Die Kombination von n-Kanal und p-Kanal Bauteilen in einer Technologie ist bekannt als CMOS (complementary MOS). In der Realisierung für ein CMOS NOT-Gatter (a) sind ein selbstsperrender PMOS Transitor an VDD und ein selbstsperrender NMOS an VSS angeschlossen. VDD kann eine Spannung zwischen typischerweise 3 und 15 Volt annehmen. Ist der Eingangspegel 0 Volt, so ist der untere Transistor abgeschaltet, da zwischen Gate und Source 0 Volt (< VT) liegen. Der obere dagegen ist leitend, da am Gate eine höhere negative Spannung als VT (in Relation zur dortigen Source-Spannung VDD) anliegt. Entsprechend kann man sich die Funktionsweise des NAND-Gatters (b) und des NOR-Gatters (c) klarmachen. 45 Prof. Dr. Ulrich Teppner: DT39 Der große Vorteil dieser CMOS-Schaltungen liegt darin, dass es keinen DC-Strompfad zwischen VDD und VSS gibt, so dass ein sehr geringer statischer Stromverbrauch das Resultat ist. Allerdings müssen beim Schalten sowohl obere, als auch untere Transistoren gleichzeitig schalten und es fließen große Ströme zum Laden und Entladen von internen und externen Kapazitäten. Dies führt zu einem dynamischen Stromverbrauch, der sich proportional zur Signalfrequenz verhält. Ursprünglich waren die Schaltgeschwindigkeiten von CMOS-Gattern deutlich langsamer als die von TTL-Gattern. Inzwischen sind die Schaltzeiten durch Miniaturisierung, insbesondere bei VLSI-Bauteilen, jedoch wesentlich verkürzt worden. 3.4 Arbeitsbedingungen von Gattern 3.4.1 Statische Störsicherheit Mit Rauschen (noise) bezeichnet man unerwünschte elektrische Signale, die in einem System auftreten. Es kann aus der normalen Arbeit eines Systems entstehen, indem Interferenz mit Nachbar-Elementen diese Signale entweder durch elektromagnetische Störung oder über die Spannungsversorgung induziert. Es kann aber auch aus externen Quellen kommen. Betrachten wir die Übertragungskennlinie eines TTLGatters. In ihr ist aufgetragen die Ausgangsspannung in Abhängigkeit von der Eingangsspannung. Die minimale Spannung für einen logisch-1 Ausgang beträgt 2,4 Volt, die maximale Spannung für einen logisch-0 Ausgang 0,4 Volt. Der Umschaltpunkt zwischen 0 und 1 liegt bei ca. 1,4 Volt und ist sehr temperaturabhängig (aus der Abbildung nicht ersichtlich). Es ist garantiert, dass ein Eingang von bis zu 0,8 Volt als 46 Prof. Dr. Ulrich Teppner: DT39 logisch 0 und ein Eingang von mehr als 2,0 Volt als logisch 1 erkannt wird. Daraus kann man folgendes ableiten: Die statische Störsicherheit für logisch-1 beträgt 2,4 V – 2,0 V = 0,4 V Die statische Störsicherheit für logisch-0 beträgt 0,8 V – 0,4 V = 0,4 V Bei CMOS-Bauteilen liegen diese Werte weitaus höher (bei ca. 0,4 * VDD). Eine andere Konsequenz aus diesen Daten ist, dass ein CMOS-Ausgang problemlos an einen TTL-Eingang angeschlossen werden kann, ein Anschluss eines TTL-Ausgangs an einen CMOS-Eingang jedoch Probleme bringen kann, da der TTL high Pegel u.U. unterhalb des CMOS high Pegels liegen kann. Hier muss dann mit einem Pull-up Widerstand in der Leitung 'nachgeholfen' werden. 3.4.2 Fan-Out Wie am Beginn des Kapitels erklärt, bezeichnet man mit Fan-Out die Zahl der an einen Ausgang anschließbaren Gatter-Eingänge. Die Begrenzung ist dabei gegeben durch die Ausgangsströme und Eingangsströme der beteiligten Gatter. Die sich ergebende Anzahl ist nicht notwendigerweise die gleiche für einen low- wie für einen high-Ausgang, da die maximalen Ausgangsströme in beiden Fällen unterschiedlich und auch die Eingangsströme unterschiedlich sind. Logisch-1 Fan-Out = IOH(max) / IIH(max) Logisch-0 Fan-Out = IOL(max) / IIL(max) Wobei IOH(max) = maximaler high-level Ausgangsstrom IOL(max) = maximaler low-level Ausgangsstrom IIH(max) = maximaler high-level Eingangsstrom vom nachgeschalteten Gatter IIL(max) = maximaler low-level Eingangsstrom vom nachgeschalteten Gatter Diese Werte sind den entsprechenden Datenblättern zu entnehmen und einzusetzen. So ergibt sich z.B. aus dem Datenblatt für ein 74LS00 (s. Abbildung nächste Seite) als typisches LSTTL-Bauteil (bei Anschluss mehrerer 74LS00 untereinander): Logisch-1 Fan-Out = 400 μA / 20 μA = 20 Logisch-0 Fan-Out = 8 mA / 0,4 mA = 20 Beide Werte sind hier identisch, was nicht sein muss. Der niedrigere Wert ist der, mit welchem dann gearbeitet werden muss. Einzelne Bauteile können andere Werte besitzen. Es muss also immer spezifisch nachgerechnet werden. 47 Prof. Dr. Ulrich Teppner: DT39 3.4.3 Schnelligkeit und Verzögerung von Logik-Gattern Schnellere Schaltgeschwindigkeit von Logik-Gattern bedeutet immer auch schnellere Verarbeitungsgeschwindigkeit insgesamt, so dass schon immer die Suche nach schnelleren Logik-Schaltungen bestand. Die Entwicklung schnellerer Schaltungen ist dabei die Aufgabe von Elektronik-Ingenieuren und nicht die der Logik-Entwickler. Diese sind davon jedoch betroffen, da hierauf die ganze Entwicklungstheorie von z.B. sequentiellen Schaltungen beruht. Eine ganze Reihe verschiedener physikalischer Effekte spielt bei der Bestimmung der Schaltzeiten eine Rolle. Hier sollen jedoch nur einige grundsätzliche Betrachtungen anhand der nachfolgenden Abbildung angestellt werden. Beginnend mit dem Start des Pulses an der Basis erhält man eine Verzögerung td bis der Kollektorstrom steigt. Diese ist hauptsächlich bedingt durch eine effektive Basis-Emitter Kapazität, die erst geladen werden muss (gestrichelt eingezeichnet). Nachdem der Transistor anfängt zu leiten, ergibt sich eine endliche Anstiegszeit tr, welche durch die Kollektor Kapazität bedingt ist. 48 Prof. Dr. Ulrich Teppner: DT39 An der fallenden Flanke des Basis-Pulses haben wir wieder eine Verzögerung ts, welche wieder auf die BasisEmitter Kapazität, zusätzlich aber auch auf die während der Sättigung eingetretenen Ladung der Basis zurückzuführen ist und daher auch größer ist als td. Schließlich haben wir wieder eine endliche Abfallzeit tf, die durch die Kollektor Kapazität bedingt ist. Verhältnisse wie in dieser Betrachtung liegen praktisch jedoch nie vor, da die Eingangspulse für ein Gatter normalerweise aus dem Ausgang eines anderen kommen und daher bereits eine endliche Flankensteilheit besitzen. Reale Verhältnisse sind daher eher in der nebenstehenden Abbildung widergegeben. Für TTL-Schaltkreise befindet sich der Schaltpunkt zwischen High- und Low-Pegel ungefähr in einem 0,1 Volt-Bereich bei 1,5 Volt. Daher beziehen sich die Schaltangaben üblicherweise auf einen Punkt, wo die Spannung 1,5 Volt kreuzt. tpd0 wird üblicherweise mit tpdHL bezeichnet und tpd1 mit tpdLH. Die Angabe HL bzw. LH um die Übergangsrichtung zu markieren bezieht sich dabei immer auf das Ausgangssignal! pd steht übrigens für 'propagation delay' (Ausbreitungsverzögerung) und wird u.U. auch nur mit P bezeichnet -> tPLH bzw. tPHL (s.a. Datenblatt 74LS00 auf der vorherigen Seite). In diesem Datenblatt ist auch zu erkennen, dass diese Verzögerungszeiten, wie zu vermuten, von der Last (kapazitiv und ohmsch) am Ausgang abhängen. 49 Prof. Dr. Ulrich Teppner: DT39 4 Programmierbare Logik-Bausteine Als man in den 1970er Jahren begann, Logikschaltungen durch programmierbare Bausteine aufzubauen, lag deren Komplexität bei maximal zunächst einigen -zig bis später einigen hundert Gatter-Äquivalenten (als Gatter-Äquivalent dient ein 2-Input NANDGatter). Die Strukturen dieser Bausteine waren noch sehr einfach und überschaubar gehalten. Heute liegt die Komplexität bei einigen Millionen Gatter-Äquivalenten, die Strukturen sind entsprechend komplex und auch Hersteller-abhängig. Eine Übersicht über die unter dem Oberbegriff ASIC (Anwendungs-spezifische IC) zu verstehenden Bausteine gibt die Abbildung 4.1. Abbildung 4.1 Nutzer-Spezifische IC (s. Text) Anzumerken ist, dass verschiedene in Abbildung 4.1 benutzte Begriffe nicht eindeutig sind. So wird der Oberbegriff ASIC meistens (insbesondere im amerikanischen Sprachbereich) nur für Gate-Arrays und Custom Designs verwendet. Auch auf die Unterscheidung CPLD-FPGA kommen wir später (Kapitel 4.2) noch einmal zurück. Ein Full-Custom Design ist eine Entwicklung, bei welcher bis in die einzelne GatterStruktur hinein kundenspezifisch entwickelt wird. Dies ist daher der zeitaufwendigste und teuerste, aber vom Ergebnis her der effektivste Entwurf. Beim Standard-Zellen Entwurf werden standardisierte Strukturen benutzt (z.B. Zähler oder Addierwerke), welche als Masken zur Chip-Herstellung bereits ausgetestet sind, und zu einer komplexeren Schaltung zusammengefügt. Beim Semi-Custom Design werden vorgefertigte Chip-Strukturen benutzt, um die Anwender-Logik zu generieren. Beim Gate-Array bedeutet dies, dass der Chip bereits vorgefertigte Gatterzellen in fest vorgegebener Geometrie als Feld enthält. Die AnwenderLogik wird als Maske spezifiziert, die bei vorgefertigten Wafern nur noch die Verdrahtung (Metallisierungsebene) der Gatterzellen festlegt. Man spricht deswegen von Masken-Programmierung. Bei der Anwender-Programmierung handelt es sich um fertige Bausteine, die beim Anwender auf das gewünschte Logik-Verhalten programmiert werden können. Man un50 Prof. Dr. Ulrich Teppner: DT39 terteilt heutzutage in die einfachen PLD (bis ca. 1000 Gatter-Äquivalente) -auch SPLD (simple PLD) genannt- und andererseits CPLD (complex PLD) bzw. FPGA. Alle programmierbaren Logik-Bausteine funktionieren grundsätzlich nach einem von drei Prinzipien.. Wie wir wissen, lässt sich jede Boole'sche Funktion in eine Summe von Produkten entwickeln. Dies entspricht einer Schaltung in zwei Ebenen, wobei die erste aus AND-Gattern und die zweite aus OR-Gattern besteht. Diese beiden Gatter-Ebenen findet man auch in den programmierbaren Bausteinen. Der Unterschied besteht nun darin, welche dieser Gatter-Ebenen programmierbar ist. Daraus ergeben sich drei unterschiedliche Grund-Architekturen, welche im Folgenden besprochen werden. 4.1 Grundstruktur programmierbarer Logikbausteine 4.1.1 Feste AND-Verschaltung, programmierbare OR-Verschaltung Dies wird z.B. durch PROMs erreicht. Obwohl man im Allgemeinen bei PROMs an Speicherelemente denkt, können sie auch zur Realisierung von kombinatorischer Logik benutzt werden. Die Abbildung 4.2 zeigt die Grundstruktur eines PROMs. Der Dekoder erzeugt sämtliche Minterme der an die Adresseingänge angelegten Eingangsvariablen. Betrachtet man einen Ausgang, so kann er durch Programmierung der Verknüpfungen an eine beliebige Anzahl der Minterme angeschlossen werden. Damit lassen sich also sämtliche Boole'schen Funktionen erzeugen. PROMs wurden häufig bei Schaltungen eingesetzt, die viele unterschiedliche Produktterme benutzen, wie z.B. Code-Konvertierungen. Ein großer Nachteil ist jedoch, dass bei vielen anderen Schaltungen häufig nur ein Bruchteil der Verknüpfungsmöglichkeiten (d.h. der Minterme) genutzt wird, und jede weitere Eingangsvariable darüberhinaus deren Anzahl verdoppelt. D.h., die Ausnutzung ist häufig extrem gering. Trotzdem finden wir diese Struktur heute bei allen gängigen FPGAs (s. Kapitel 4.2.1). Diese Zellen werden dort zwar LUT (look-up table) genannt, beruhen aber auf dem gleichen Prinzip. 51 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.2 PROM Array Struktur Ein Beispiel für die Anwendung soll ein BCD zu BCD-Exzess-3-Code Konverter sein. Die Funktionstabelle dazu ist: D 0 0 0 0 0 0 0 0 1 1 BCD-Code C B 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1 0 0 0 0 A 0 1 0 1 0 1 0 1 0 1 BCD Exzess-3 Code ED EC EB EA 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 Tabelle 4-1 52 Prof. Dr. Ulrich Teppner: DT39 Da im PROM sämtliche Minterme erzeugt werden, entfällt die Notwendigkeit der Schaltungsminimierung. Es können direkt die Minterme ver-Odert werden. Die zugehörige Baustein-Programmierung ist in der Abbildung 4.3 dargestellt. Abbildung 4.3 PROM als BCD zu Exzess-3-Code Konverter programmiert Wegen der Pseudo-Tetraden werden einige Minterme nicht genutzt. Daneben ist die Ausnutzung des PROMs jedoch hoch. 4.1.2 Programmierbare AND-Verschaltung, programmierbare OR-Verschaltung Diese Bausteine werden häufig PLA (= programmable logic arrays) genannt. Ihre Grundstruktur zeigt die folgende Abbildung. 53 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.4 PLA Struktur Die Vorteile der PLA-Struktur lassen sich an einem einfachen Beispiel demonstrieren. Dazu stellen wir eine Funktionstabelle auf: A 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 B 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 C 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 D 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 F1 1 0 0 1 0 1 0 1 0 1 0 0 0 0 1 0 F2 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 0 F3 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 0 F4 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 Tabelle 4-2 Nach bekanntem Verfahren leiten sich die KV-Tafeln ab. Bei der Minimierung muss jedoch auf optimale Überschneidung mit anderen Produkttermen geachtet werden. Der Leser kann leicht nachvollziehen, dass andere, teilweise näherliegende Zusammenfassungen als die angegebenen zu mehr als 8 Produkttermen führen können und damit im Beispiel-PLA nicht realisiert werden könnten! 54 Prof. Dr. Ulrich Teppner: DT39 CD AB 00 01 11 10 CD AB 00 01 11 10 00 1 0 1 0 00 0 0 0 0 01 0 1 1 0 01 0 1 0 0 11 0 0 0 1 11 1 1 0 0 10 0 1 0 0 10 0 0 0 1 F1 = A’ y B’ y C’ y D’ + A’ y C y D + A’ y B y C’ y D + A y B y C y D’ + A y B’ y C’ yD CD AB 00 01 11 10 F2 = A y B’ y C y D’ + A’ y B y C’ y D + A y B y C’ CD AB 00 01 11 10 00 0 0 1 1 00 1 0 0 0 01 0 0 1 0 01 0 0 0 0 11 0 0 0 1 11 1 1 0 0 10 0 0 0 0 10 0 0 0 1 F3 = A’ y B’ y C + A’ y C y D + A y B y C y D’ F4 = A’ y B’ y C’ y D’ + A y B’ y C y D’ + A y B y C’ Für die Programmierung eines PLA entwickeln wir hieraus eine PLA-Programmiertabelle mit dem folgenden Aussehen: Produkt Term 1 2 3 4 5 6 7 8 Inputs A 0 0 0 1 1 1 1 0 B 0 1 1 1 0 0 0 C 0 1 0 0 1 0 1 1 D 0 1 1 0 1 0 - F1 1 1 1 1 1 - Outputs F2 F3 1 1 1 1 1 1 F4 1 1 1 - Die Produktterme wurden durchnumeriert und in der Spalte ‘Inputs’ die zugehörigen Eingänge mit ihrer Polarität eingetragen. In der Spalte ‘Outputs’ ist dann noch durch eine ‘1’ markiert, ob der Produktterm für die entsprechende Funktion benutzt wird. Hier erkennt man, dass einige Produktterme für mehrere Funktionen benutzt werden können, man somit zu einem ‘Product Term Sharing’ kommt. 55 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.5 PLA-Realisierung der Funktion aus Tabelle 4-2 Dies kann nur bei dieser PLA-Struktur durchgeführt werden und führt zu einer effektiveren Ausnutzung der internen Chip-Struktur. Während anfangs die Entwicklungswerkzeuge dieses ‘Product Term Sharing’ wenig unterstützten (Problem s. oben), und diese Bausteinform sich deswegen auch wenig durchsetzte, wurden zwischenzeitlich leistungsfähigere Tools hierfür entwickelt, so dass diese Architektur wieder stärker verbreitet ist (z.B. pLSI-Bausteine von Lattice und CoolRunner CPLDs von XILINX). 4.1.3 Programmierbare AND-Verschaltung, feste OR-Verschaltung Dies sind die verbreitetsten, bzw. am häufigsten benutzten Schaltungen von SPLDs, aber auch von CPLDs. Sie wurden Mitte der 70er Jahre von MMI (Monolithic Memories Incorporated) unter dem (geschützten) Namen PAL eingeführt. Ihre prinzipielle Struktur zeigt die Abbildung 4.6. Um Eigenarten und auch einen wesentlichen Nachteil der PAL-Struktur zu zeigen, versuchen wir, das als PLA realisierte Beispiel in dem PAL der Abbildung 4.6 zu implementieren. Man stellt sofort fest (Abbildung 4.7), dass die Funktion F1 nicht in diesem PAL unterzubringen ist, da die Zahl der Produktterme für jeden Ausgang exakt 4 ist. Werden weniger benötigt, so können die freien nicht anderweitig benutzt werden. Werden mehr benötigt, so ist die Funktion nicht realisierbar. D.h., es muss in diesem Fall einer anderer PAL mit mehr Produkttermen ausgesucht werden, oder die Funktion muss durch Hintereinanderschaltung mehrerer Zellen realisiert werden. 56 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.6 PAL Struktur Eine neue Art PAL-ähnlicher programmierbarer Bausteine führte Mitte der 80er Jahre Altera ein. Deren EPLD genannte Bausteine übernahmen die EPROM-Technologie und waren von daher durch UV-Licht löschbar. Als Weiterentwicklung hierzu sind die elektrisch löschbaren PLDs (z.B. GALs der Fa. Lattice) zu sehen. Anfangs konnte man diese Bausteine in zwei Klassen aufteilen: mit Registern (registered), und ohne Register (non-registered). Während die ohne Register nur für die Realisierung kombinatorischer Logik geeignet waren, können die PLDs mit Registern auch direkt für sequentielle Logik eingesetzt werden. Die dafür notwendigen Rückführungen (feedbacks) sind bereits im Baustein enthalten. Heute können die registered PLDs auch für reine Kombinatorik verwendet werden, da sie die Möglichkeit besitzen, das Register wahlweise zu überbrücken. Daher findet man bei modernen SPLDs und CPLDs nur noch die registered Version. 57 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.7 PAL-Realisierung der Funktion aus Tabelle 4-2 F1 ist nicht komplett realisiert Als Beispiel für in Teilbereichen noch eingesetzte SPLDs mit PAL-Struktur wird im Folgenden ein GAL der Fa. Lattice vorgestellt. 4.1.3.1 GALs GAL (generic array logic) ist eine geschützte Namensgebung von Lattice. Es sind PALBausteine mit anpassbarer Struktur durch OLMC (output logic macrocell). Sie sind elektrisch löschbar durch Einsatz der E2CMOS-Technologie. 58 Prof. Dr. Ulrich Teppner: DT39 In der folgenden Abbildung wird ein GAL22V10 dargestellt, der noch relativ verbreitet ist. Der 22V10 hat 12 dedizierte Eingänge und 10 I/O-Makrozellen. Abbildung 4.8 Struktur des GAL22V10 /5/ Man beachte, dass sich die Makrozellen in der Zahl der Produktterme unterscheiden (zwischen 8 und 16). Jeder Makrozellenausgang (OLMC = Output Logic Macro Cell) erlaubt eine von vier möglichen Ausgangskonfigurationen: kombinatorisch / registered bzw. aktiv high / low. Steuerbits S0 bzw. S1 setzen die Funktion (Abbildung 4.9). Abbildung 4.9 /5/ Im gelöschten Zustand sind beide Steuerbits auf 1 gesetzt (nur EE-Version). Durch die Programmierung wird das entsprechende Steuerbit auf 0 gelegt. Die so konfigurierbaren Ausgangsverhalten sind in der folgenden Abbildung dargestellt. 59 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.10 /5/ Die Three-State Ausgänge sind durch eine Steuerleitung direkt ansprechbar. Alle FlipFlops sind durch ein asynchrones Reset (AR) oder synchrones Preset (SP) gemeinsam lösch- bzw. setzbar. Zu beachten ist, dass z.B eine gelöschtes Flip-Flop den zugehörigen Ausgang trotzdem setzen kann (Registered/Active Low)! Neben dem GAL22V10 kommen auch der GAL16V8 und der GAL26V12 noch zum Einsatz. Beide sind in ihrer Struktur ähnlich, nur mit weniger bzw. mehr Makrozellen. 4.2 Komplexe programmierbare Logik-Bausteine Im Bereich komplexer programmierbarer Logikbausteine existieren prinzipiell unterschiedliche Architekturansätze. Die Abbildung 4.11 zeigt die beiden verschiedenen Architekturen: Channeled Array - Segmented Block im Vergleich. Die Segmented Block-Struktur ist eine Weiterentwicklung der besprochenen PLDStruktur. Die einzelnen internen Blöcke entsprechen jeweils einem einfachen PLD. Diese sind dann untereinander über Bussysteme verbunden. Sie werden deswegen auch als CPLD (complex PLD) bezeichnet. In der Channeled Array-Struktur sind die einzelnen Blöcke wesentlich kleiner (hohe Granularität oder Körnigkeit), es besteht dafür eine höhere Dichte und die Struktur ist flexibler. Entscheidend für die Performance ist jedoch die Entflechtung und Plazierung der Logik (Place and Route). Ihr Zeitverhalten ist daher nicht deterministisch. Sie werden auf Grund ihrer Gate-Array-ähnlichen Struktur auch häufig FPGA (Field programmable Gate Array) genannt. Im Vergleich kann man sagen, dass bei der Segmented-Block Struktur die Logik-Entwicklung einfacher und die Gesamt-Verzögerungszeiten besser vorhersagbar sind. Ihr 60 Prof. Dr. Ulrich Teppner: DT39 Nachteil ist die relativ feste Struktur-Vorgabe. In der Channeled-Array Struktur ist die Flexibilität der Architektur von Vorteil, der Nachteil ist eine starke Design-Abhängigkeit von der Leistungsfähigkeit des Entwicklungs-Tools. Abbildung 4.11 Die unterschiedlichen Strukturen komplexer PLD Als weiteren grundsätzlichen Unterschied gibt es Bausteine, welche die Konfiguration in E2PROM-Zellen ablegen (bei älteren Architekturen in EPROM-Zellen), und andere, welche die Konfiguration in SRAM-Zellen speichern. Die E2PROM-Struktur hat den Vorteil, dass die Konfiguration bei Abschalten der Spannung erhalten bleibt, die SRAM-Struktur dagegen den Vorteil, dass sie beliebig häufig rekonfigurierbar ist und auch während des Betriebs dynamisch umprogrammierbar ist. Die FPGA-Struktur wird in unseren Labor-Versuchen eingesetzt, so dass sie exemplarisch erläutert wird. Dabei kommen wir erneut auf die eben beschriebenen Unterschiede zu sprechen. 4.2.1 XILINX-FPGA Die meisten der folgenden Abbildungen sind dem Buch 'The Design Warrior's Guide to FPGAs' entnommen. ISBN 0750676043 4.2.1.1 Technische Grundlagen programmierbarer Logik Betrachten wir zunächst erneut eine sehr simple programmierbare Funktion von zwei Eingängen a und b mit dem Ausgang y: Logic 1 Potential links a Pull-up resistors NOT b & y = 1 (N/A) AND NOT 61 Prof. Dr. Ulrich Teppner: DT39 Jeder Eingang ist in seiner direkten und invertierten Form vorhanden. Bei Abwesenheit der angedeuteten Links (Verknüpfungen) sind alle Eingänge des AND durch die Pull-Up Widerstände auf logisch '1' gelegt, was bedeutet, dass der Ausgang permanent auf '1' liegt. Deswegen betrachten wir das nächste Bild, bei dem die Links mit Fuses (Sicherungen) Fuses Logic 1 Fat a Pull-up resistors Faf NOT & Fbt b y = 0 (N/A) AND Fbf NOT ausgestattet sind. Diese Sicherungen entsprechen in ihrer Funktion ganz normalen Haushaltssicherungen. Alle diese Sicherungen sind anfangs intakt, so dass der Ausgang des AND-Gatters zunächst '0' ist. Logic 1 Fat a Pull-up resistors NOT & b y = a & !b AND Fbf NOT Werden entsprechend obiger Abbildung einige Sicherungen durchgebrannt, folgt der Ausgang der Funktion a & !b (a logisch verundet mit nicht b). Der Vorgang des Durchbrennens der Sicherung nennt man Programmieren oder Brennen des Bausteins. Derart programmierbare Bausteine nennt man OTP (One Time Programmable = einmal programmierbare), da sie nur einmal programmierbar sind (eine weggebrannte Sicherung ist nicht ersetzbar). 62 Prof. Dr. Ulrich Teppner: DT39 Logic 1 Unprogrammed antifuses a Pull-up resistors NOT & b y = 1 (N/A) AND NOT Die hier beschriebene Technik wird bei modernen FPGA nicht mehr verwendet. Im Gegensatz zur besprochenen Technik existiert jedoch eine sog. Antifuse-Technik, welche aktuell verwendet wird. Hier sind die programmierbaren Links mit Antifuses belegt. In ihrem unprogrammierten Zustand bieten diese einen sehr hohen Widerstand. Logic 1 Programmed antifuses a Pull-up resistors NOT & b y = !a & b AND NOT Programmiert man sie (mit hohen Spannungs- bzw. Strompulsen) verschwindet ihr Widerstand. Die so in der Abbildung programmierte Funktion ist !a & b (nicht a verundet mit b). Amorphous silicon column Polysilicon via Metal Oxide Metal Substrate (a) Before programming (b) After programming Technisch funktioniert das folgendermaßen: Zwischen zwei Metallschichten befindet sich amorphes Silizium, welches ein guter Isolator (>109 Ohm) ist. Durch Anlegen der hohen gepulsten elektrischen Felder und damit Ströme verwandelt sich dies amorphe Silizium in gut leitendes Polysilizium. Dieser Prozess ist ebenfalls nicht umkehrbar (OTP!). Umkehrbare Programmierung wurde 1971 von Intel eingeführt mit den sog. EPROMs (erasable programmable read-only memory). Ein EPROM Transistor ist ähnlich aufgebaut wie ein MOS-Transistor, hat jedoch ein zweites Polysilizium-Gate, das ebenfalls isoliert durch die Oxid-Schicht ist. Unprogrammiert ist dieses Floating Gate ungeladen und ohne Einfluss. 63 Prof. Dr. Ulrich Teppner: DT39 Source terminal Control gate terminal Drain terminal Source terminal Control gate terminal Drain terminal control gate Silicon dioxide control gate source drain Silicon substrate floating gate source drain (b) EPROM transistor (a) Standard MOS transistor Zum Programmieren wird eine hohe Spannung (12 Volt und mehr) zwischen Control Gate und Drain bzw. Source Terminal gelegt. Dies bewirkt einen Elektronenfluss zum Floating Gate. Bei Wegnahme der Programmierspannung verbleibt eine negative Ladung auf dem Floating Gate (ohne äußere Einflüsse für mindestens 10 Jahre), wodurch der Transistor sperrt. Zum Löschen und Re-Programmieren muss die Ladung vom Floating Gate wieder herunter transportiert werden. Dies geschieht durch ultraviolettes Licht, welches den Elektronen genug Energie gibt, um vom Floating Gate durch den Isolator durchzudiffundieren. Hierzu befindet sich auf dem Gehäuse des IC ein Quarzglasfenster, wodurch das Licht auf den Chip gelangen kann. Dies macht den Baustein jedoch teuer und auch der Lösch-Vorgang selber dauert mit 20 – 30 Minuten sehr lange. Die nachfolgende Einführung der E2PROM-Technik war daher zwangsläufig: Die Isolierschicht des Floating Gate wurde dünner, wodurch es möglich wurde, auch mit elektrischer statt UV-Energie das Floating Gate zu entladen. (EEPROM oder E2PROM = electrically erasable PROM). Eine andere Bezeichnung für diese Technik ist FLASH, um die schnelle Löschbarkeit auszudrücken. Typischerweise werden bei FLASHSpeicher nicht einzelne Zellen, sondern ganze Blöcke auf einmal gelöscht. Eine Übersicht der Anwendung dieser Technologien im LogikBereich gibt die nebenstehende Tabelle. (SPLD = simple PLD, CPLD = complex CPLD, FPGA = Field Programmable Gate Array) Technology Symbol Predominantly associated with ... Fusible-link SPLDs Antifuse FPGAs EPROM SPLDs and CPLDs E2PROM/ FLASH SPLDs and CPLDs (some FPGAs) SRAM SRAM FPGAs (some CPLDs) Einen Überblick über die Einteilung programmierbarer Logikbausteine gibt folgende Abbildung: 64 Prof. Dr. Ulrich Teppner: DT39 PLDs SPLDs PROMs PLAs CPLDs PALs GALs etc. Der Schritt von der SPLD-Struktur (simple PLD) zur CPLD-Struktur (complex PLD) bestand in Folgendem: Die Verbindungsmatrix (Interconnect Area) bestand zunächst darin, alle Ausgänge (und alle Eingänge) mit der programmierbaren Logik zu verknüpfen. Eine Verdoppelung der Anzahl der Makrozellen bedeutete damit eine Vervierfachnung des Verknüpfungsaufwandes (bei 100%iger Verknüpfungsmöglichkeit). Die Fa. Altera führte deswegen mit ihren Bausteinen 1984 eine neue Architektur ein: Programmable Interconnect matrix Input/output pins SPLD-like blocks Nicht alle Verknüpfungsmöglichkeiten sind mehr 100 wires gegeben, sondern lediglich eine Programmable Auswahl wird über die multiplexer Interconnect Matrix zur Verfügung gestellt. Z.B. werden über Multiplexer 30 aus 100 Leitungen weiter geleitet (s. Abb.). 30 wires Diese Architektur wird CPLD genannt. Es handelt sich dabei eigentlich um mehrere SPLDs auf einem Chip. Altera führte übrigens noch eine weitere Eigenschaft ein: Es wurden E2PROM-Zellen zur Programmierung benutzt, so dass die Bausteine lösch- und reprogrammierbar wurden. 65 Prof. Dr. Ulrich Teppner: DT39 Neben den Nutzer-programmierbaren Bausteinen existierten die ASICs als Herstellerprogrammierte. Zwischen diesen beiden Gruppen existierte jedoch eine Lücke: Auf der einen Seite existierten die PLDs, welche einfach konfigurierbar sind und schnelle Design- und Modifikationszyklen erlauben, aber keine komplexen oder großen Funktionen. Auf der anderen Seite existierten die ASICs, welche zwar komplexe Funktionen realisieren können, aber einen extremen Entwicklungsaufwand mit entsprechenden Kosten benötigen. Einmal entworfen, ist das Design zudem im Silizium festgeschrieben. PLDs ASICs The GAP SPLDs Gate Arrays CPLDs Structured ASICs* Standard Cell Full Custom *Not available circa early 1980s 4.2.1.2 XILINX FPGA-Architektur Im Jahre 1984 kam als neue Architektur die zunächst LCA (Logic Cell Array) genannte Architektur von der Fa. XILINX auf den Markt. Diese füllte letztendlich die beschriebene Lücke und wurde konsequenterweise später deswegen in FPGA (Field Programmable Gate Array) umbenannt. Das Basiselement dieser Architektur ist eine in CMOS-Technik realisierte Logik-Zelle, welche über SRAM-Elemente konfiguriert wird und im wesentlichen aus einer LUT (Look-Up Table) zur Logik-Realisierung und einem FlipFlop besteht. Das FF kann dabei asynchron gesetzt oder gelöscht werden und ist positiv oder negativ flankentriggerbar. a b c Über die LUT können beliebige Funktionen realisiert werden, wie am Beispiel zur Realisierung der Funktion y = (a&b)|!c zu sehen ist. 3-input LUT y mux flip-flop q d clock c Truth table & | y = (a & b) | !c y Programmed LUT a b c y SRAM cells 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 000 001 010 011 100 101 110 111 8:1 Multiplexer Required function a b y 66 ab c Dr. Ulrich Teppner: DT39 Prof. Die nächste Abbildung zeigt, dass die einzelnen Logik-Zellen umgeben sind mit programmierbaren Verbindungsleitungen (programmable interconnect). Neben diesen lokalen Verbindungen existieren ebenfalls globale Verbindungsleitungen, über welche Signale wie 'clock' oder 'reset' zu allen Elementen geführt werden können. Programmable interconnect Programmable logic blocks Eine komplettere Übersicht über die Struktur der FPGAs wird aus folgender Abbildung ersichtlich. Zusätzlich zu den oben gezeigten Elementen sieht man hier noch die IO-Blöcke, welche die Verbindung zur Außenwelt herstellen (sprich: zu den Pins des Bausteins). Hinter allem (logisch gesehen) liegen die SRAM-Zellen zur Konfiguration der BausteinElemente. Bei heute aktuellen FPGAs, die häufig auch Plattform FPGA genannt werden, da sie als Basis zu vielen unterschiedlichen Design-Arten genutzt werden können, kommen noch Elemente hinzu, wie: Block RAM, High-Speed IO, Multiplizierer, eingebettete Prozessoren, ... 67 Prof. Dr. Ulrich Teppner: DT39 Zunächst wollen wir jedoch noch einen kurzen Blick auf die Eigenschaften verschiedener Programmier-Technologien werfen. Während die von uns benutzten und später beschriebenen XILINX-Bausteine eine SRAM-Technik zur Programmierung nutzen, gibt es auch andere Hersteller, welche die oben erwähnten alternativen Programmier-Techniken nutzen. Eine Gegenüberstellung findet sich daher in folgender Tabelle: Feature SRAM Antifuse E2PROM / FLASH Technology node State-of-the-art One or more generations behind One or more generations behind Reprogrammable Yes (in system) No Yes (in-system or offline) Reprogramming speed (inc. erasing) Fast ---- 3x slower than SRAM Volatile (must be programmed on power-up) Yes No No (but can be if required) Requires external configuration file Yes No No Good for prototyping Yes (very good) No Yes (reasonable) Instant-on No Yes Yes IP Security (especially when using bitstream encryption) Very Good Very Good Size of configuration cell Large (six transistors) Very small Medium-small (two transistors) Power consumption Medium Low Medium Rad Hard No Yes Not really Acceptable Abbildung 4.12 Vergleich verschiedener Programmier-Techniken (Rad Hard = Resistent gegen Strahlung) Je nach Anwendung haben die verschiedenen Techniken daher ihre Vor- und Nachteile, obwohl man insgesamt sagen muss, dass die von XILINX vertretene SRAM-Technik trotz einiger Nachteile anscheinend am besten akzeptiert wird. 16-bit SR 16 x 1 RAM 4-input LUT Kern ihrer Architektur waren die Logik-Zellen mit ihren LUT. Diese LUT realisieren kombinatorische Logik, sind aber ebenso dazu geeignet, als Speicher (RAM) zu dienen, bzw. Elemente von Schieberegistern zu sein, was auch genutzt wird. Eine 4-input LUT kann daher auch als 16 Bit SRAM oder 16 Bit Schieberegister genutzt werden. 68 Prof. Dr. Ulrich Teppner: DT39 16-bit SR 16x1 RAM a b c d 4-input LUT mux flip-flop e clock clock enable Die (sehr vereinfachte) Struktur einer XILINX-Logik-Zelle sieht also aus wie nebenstehend. (Das Flip-flop kann flankengetriggert oder als Latch benutzt werden.) set/reset Slice 16-bit SR 16x1 RAM Logic Cell (LC) Als nächstes werden bei XILINX zwei dieser Logik-Zellen zusammengefasst zu einem sog. Slice (Scheibchen). 4-input LUT LUT 16-bit SR MUX REG Logic Cell (LC) 16x1 RAM 4-input LUT LUT Während in ganz frühen Generationen von XILINX-Bausteinen 3-input LUT benutzt wurden, ist man heute zu 4-input LUT übergegangen, da dies nach Hersteller-Angaben den optimalen Komy promiss darstellen soll (mehr Eingänge erlauben die direkte Realisierung komplexerer q Funktionen, jeder zusätzliche Eingang verdoppelt jedoch die Zahl der RAM-Zellen). MUX REG Während die Logik-Eingänge im Slice zu jeder Logik-Zelle separat sind, sind clock, clock enable und set/reset gemeinsame Signale. Zwei oder vier derartige Slices werden dann zu einem CLB (Configurable Logic Block) zusammengefasst. Bei den später zu besprechenden Spartan-3 Bausteinen sind es vier Slices, die einen Configurable logic block (CLB) CLB CLB CLB CLB Slice Slice Logic cell Logic cell Logic cell Logic cell Slice Slice Logic cell Logic cell Logic cell Logic cell CLB bilden. 69 Prof. Dr. Ulrich Teppner: DT39 Zur Kopplung der Slices gibt es programmierbare sehr schnelle Verbindungen zwischen den Slices. Der Grund für diese hierarchische Struktur ist die Hierarchie in der Schnelligkeit der Verbindungswege: schnellste Verbindungen zwischen den Logik-Zellen, langsamere zwischen den Slices und noch etwas langsamere auf CLB-Ebene. Hierdurch kommt man den Anforderungen der zu implementierenden Anwendungen in ihrer i.a. ebenfalls block-artigen hierarchischen Struktur am nächsten. Eine weitere erwähnenswerte Eigenschaft der Logik-Zellen ist eine Fast Carry Logik für die Addition, die über alle Slices eines CLB geführt wird und auch zwischen den CLB genutzt werden kann. RAM blocks Multipliers Logic blocks Zusätzlich zur Addition werden insbesondere bei DSP-Anwendungen (DSP = digital signal processing) Multiplikationen benötigt. Hierzu werden spezielle Multiplizierer eingebaut, welche wiederum eng verbunden mit SRAM Blocks sind und auch häufig in Kombination genutzt werden. Eine typische Anwendung wird als MAC bezeichnet: Multiply and Accumulate, d.h. multipliziere 2 Werte und addiere das Ergebnis zu einer laufenden Summe. Dies wird durch die beschriebene Architektur direkt unterstützt. (Noch besser wären zusätzliche dedizierte Addierer, welche auf einigen Bausteinen auch vorhanden sind!) Eine weitere Entwicklung der letzten Jahre im FPGA-Bereich ist, dass man den für viele Anwendungen unverzichtbaren Mikroprozessor mit auf den Chip gepackt hat. Dies erspart einem einerseits, die zum Prozessor zusätzliche Logik in einem separaten Chip unterzubringen (man hat alles auf einem Chip = SoC - System on Chip), andererseits eröffnet es Einsatzmöglichkeiten in Bereichen, wo reine Hardware-Lösungen zu teuer und schnell waären, reine Software-Lösungen jedoch zu langsam. 70 Prof. Dr. Ulrich Teppner: DT39 Main FPGA fabric Hier kann ein "klassischer" Ansatz zur Realisierung benutzt werden, bei dem ein Prozessor mit seinen Komponenten als sog. Stripe an den FPGA-Bereich gesetzt wird. The “Stripe” uP RAM I/O Microprocessor core, special RAM, peripherals and I/O, etc. etc. Alternativ könnte der ProzessorKern jedoch auch mitten in den uP uP uP uP uP (a) One embedded core (b) Four embedded cores FPGA-Bereich gelegt werden, um eine optimale Kopplung zu erhalten. Dies wird bei einigen XILINX-Bausteinen mit einem, zwei oder sogar vier Prozessor-Kernen (PowerPC) so gemacht. Alternativ hierzu ist es jedoch auch möglich, eine Gruppe von CLBs zu einem Prozessor zu konfigurieren. Hierbei spricht man von einem Soft Core Prozessor (im Gegensatz zum Hard Core bei der davor besprochenen Variante). Soft Cores sind natürlich langsamer als Hard Core Prozessoren (typischerweise arbeiten sie mit 30 – 50 % der Geschwindigkeit eines Hard Cores), dafür flexibler einsetzbar. Eine weitere Eigenschaft dieser FPGA-Architektur ist, dass alle Flip-Flops des Systems mit der gleichen Clock versorgt werden müssen, um den Paradigmen der synchronen sequentiellen Schaltungen zu entsprechen. Bei der Vielzahl der anzusteuernden LogikZellen kann das zu einem Problem werden. 71 Prof. Dr. Ulrich Teppner: DT39 Clock tree Flip-flops Special clock pin and pad Clock signal from outside world Diese Abbildung zeigt die grundsätzliche Struktur: Ein spezieller Anschluss gibt das Clock-Signal auf einen sog. Clock-tree, der es dann über die einzelnen Äste und Zweige Clock signal from outside world Clock Manager etc. Daughter clocks used to drive internal clock trees or output pins Special clock pin and pad verteilt. Tatsächlich sitzt jedoch hinter diesem Anschluss zunächst ein sog. DCM (ClockManager, es gibt pro chip mehrere davon), welcher verschiedene Funktionen hat. 1 2 3 4 Ideal clock signal Real clock signal with jitter Cycle 1 Cycle 2 Cycle 3 Cycle 4 Superimposed cycles Eine Funktion ist es, den sog. Clock-Jitter zu eliminieren. Dies ist die zeitliche Verschiebung der Clock-Pulse, wie in obiger Abbildung gezeigt. 72 Prof. Dr. Ulrich Teppner: DT39 Eine weitere Funktion ist die Frequenz-Synthese. Hierbei können Clock-Signale erzeugt werden, die ein Vielfaches oder ein Teil der Eingangs-Frequenz besitzen. Ein einfaches Beispiel ist in folgendem Bild gegeben. 1.0 x original clock frequency 2.0 x original clock frequency .5 x original clock frequency Während in diesem Beispiel jedoch nur die doppelte bzw. halbe Frequenz erzeugt werden, sind real auch ganz andere Verhältnisse erzeugbar (z.B. 11/28 der Frequenz). Eine dritte Aufgabe ist die Phasen-Verschiebung. Die DCM können Signale mit der gleichen Frequenz wie die Eingangsfrequenz, aber unterschiedlicher Phase erzeugen. Eine weitere wichtige Aufgabe ist das De-skewing der Clock-Signale. Unter skew versteht man den Effekt, dass, bedingt durch Verzögerung auf den Verteilungsleitungen, das Clock-Signal an den Flip-Flops des Systems zu späteren Zeitpunkten ankommt als am Eingang zum Chip. Hierdurch kann es zu Zeit-Differenzen an verschiedenen Punkten des Designs kommen, was wiederum zu unterschiedlichen Problemen führen kann. Daughter clock (monitored downstream of the clock manager) fed back to special input Clock signal from outside world De-skewed daughter clocks used to drive internal clock trees or output pins Special clock pin and pad 1 2 3 4 Main (mother) clock 1 2 3 4 Untreated daughter clock 1 2 3 De-skewed daughter clock Das De-skewing ist in obiger Abbildung dargestellt. Die nicht behandelte (untreated) Tochter Clock ist verzögert gegenüber der Eingangs-Clock. Die 'Behandlung' sieht nun so aus, dass die Tochter Clock vom DCM zusätzlich verzögert wird, bis sie wieder in Phase (genauer gesagt, exakt 360° Grad verschoben) mit der Eingangs Clock ist. 4.2.1.3 XILINX Spartan-3 Familie Im Gegensatz zu anderen Firmen auf dem Markt entwickelte XILINX ein Bausteinkonzept, welches einerseits auf flexibel konfigurierbaren und kombinierbaren Basiszellen beruht (Channeled Array Struktur), und andererseits dynamisch, d.h. im Betrieb, umprogrammierbar ist. Zunächst wurden diese Bausteine LCA (Logic Cell Array) genannt, heute FPGA (Field Programmable Gate Array). 73 Prof. Dr. Ulrich Teppner: DT39 Die XILINX-FPGA speichern die Konfiguration in SRAM-Zellen. Im Laufe der Zeit entwickelte XILINX mehrere Baustein-Familien, die jedoch alle auf dem gleichen Grundprinzip beruhen. Eingeführt wurde dies Prinzip 1985 mit der ersten, der 2000er Familie. Anfang und Mitte der 90er Jahre wurde diese Familie abgelöst durch die 3000er und 4000er. Diese sind inzwischen durch die beiden Familien Spartan und Virtex ersetzt worden. Aktuelle Version der Spartan-Familie ist derzeit Spartan-6. Da im Labor Bausteine der Spartan-3-Serie eingesetzt werden, soll diese hier erläutert werden. In Erweiterung der vorangegangenen Serien hat XILINX in diese Bausteine zusätzliche Eigenschaften integriert, welche insbesondere für die digitale Signalverarbeitung von Nutzen sind: Block-RAM und schnelle Multipliziereinheiten. Dies ist in der folgenden Abbildung ersichtlich. Abbildung 4.13 Spartan-3 Struktur Grundsätzlich existieren daher: Die programmierbaren I/O-Blöcken (IOB) an den Rändern zu den I/O-Pins, die konfigurierbaren Logik-Blöcke (CLB), die Verbindungswege (interconnect resources), dann noch die digitalen Clock-Manager(DCM) und die erwähnten Multiplizierer und das Block-RAM. Alle Teile werden durch ein verteiltes Feld von Speicherzellen zur Konfigurierung gesteuert. Jeder der I/O-Blöcke stellt ein Interface zwischen dem externen Anschluss-Pin und der internen Logik dar. Seine Struktur ist in Abbildung 4.14 wiedergegebenen. Jeder IOB enthält einen Register- und einen direkten (kombinatorischen) Ausgangspfad, der durch den am Ausgang liegenden programmierbaren 3-State Buffer getrieben wird. Alle IOBs sind grundsätzlich zur DDR (Double Data Rate) Übertragung ausgelegt. Dies bezieht sich sowohl auf die Konfiguration als Ausgang, als auch auf die als Eingang. Der 74 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.14 Spartan IOB Anschluss selber ist durch Dioden gegen elektrostatische Entladungen geschützt (ESD) und besitzt programmierbare Pull-Up bzw. Pull-Down Widerstände. Bedingt durch die Gehäuseform (BGA = Ball Grid Array) können Abschlusswiderstände auf der Leiterplatte nicht nah genug am Anschlusspin platziert werden. Deswegen existieren innerhalb des Bausteins an jedem Pin programmierbare Abschlusswiderstände (DCI = digital controlled impedance), die diese Aufgabe übernehmen. Neben der Unterstützung 18 verschiedener klassischer (single-ended) Übertragungsstandards wie z.B der low-voltage Versionen LVTTL oder LVCMOS, sind auch 8 verschiedene differentielle Übertragungsstandards möglich, wobei dann allerdings jeweils zwei Pins für ein Signal benutzt werden müssen. 75 Prof. Dr. Ulrich Teppner: DT39 Als Eingang geschaltet, erlaubt der IOB die direkte und / oder gespeicherte Weitergabe des Eingangswertes durch die Leitungen I bzw. IQ1 und IQ2 (DDR-Übertragung). Alle FFs des IOB können unabhängig als flankengetriggertes FF oder pegelgesteuertes Latch benutzt werden. Ebenso können die Eingänge SR entweder als synchrones oder asynchrones Set/Reset programmiert werden. Die Eingänge REV bestimmen dabei, ob SR das FF setzt oder rücksetzt. Das Feld der CLB (Configurable Logic Block = konfigurierbarer Logik-Block) stellt die Funktionselemente zur Verfügung, um die Nutzer-Logik zu realisieren. Im Gegensatz zu den Vorgänger-Architekturen besteht ein CLB aus 4 sog. Slices, wovon jederSlice einen Bereich für kombinatorische Logik, 2 Flip-Flops und einen internen Steuerungsbereich enthält. Die Slices unterscheiden sich in linksseitige (Left-Hand) und Abbildung 4.15 Spartan CLB rechtsseitige (Right-Hand) (Abbildung 4.15). Die linksseitigen sind dabei nicht nur für Logik, sondern auch als Schieberegister oder verteiltes RAM einsetzbar. In der Abbildung 4.16 ist ein linksseiter Slice als Superset auch für die rechtsseitigen dargestellt. Kernstück sind dabei die RAM-basierten LUTs (Look-Up-Tables), in welchen kombinatorische Logik realisiert werden kann. Sie besitzen jeweils 4 Eingänge, so dass sie eine beliebige Logikabhängigkeit dieser 4 Eingänge realisieren können. Das Ergebnis dieser Logik (Ausgang D) kann über den Ausgang X (Y) in die Verbindungsleitungen übergeben werden. Alternativ kann es jedoch auch über programmierbare Multiplexer an das Speicherelement FFX (FFY) gegeben werden. Weiterhin kann es die schnelle Carry-Logik über Multiplexer steuern oder über den Multiplexer F5MUX zu Funktionen von mehr Variablen erweitert werden. 76 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.16 Spartan Left-Hand Slice Falls nur die FF eines Slices genutzt werden sollen, können sie über die Bypass-Leitung BX bzw. BY bedient werden, wodurch eine separate Nutzung der Kombinatorik und FlipFlops möglich ist. Nur mit den linksseitigen Slices können Schieberegister und verteiltes RAM realisiert werden. Für detaillierte Erläuterungen hierzu sei auf das entsprechende Manual verwiesen (http://direct.xilinx.com/bvdocs/publications/ds099.pdf) 77 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.17 Spartan BlockRAM Der Block RAM ist gleichmäßig auf die Spalten des Bausteins verteilt. Beim im Labor eingesetzten XCS200 handelt es sich z.B. um 12 Blocks mit 221.184 Bit, die auf 2 Spalten verteilt sind. Grundsätzlich ist dies RAM dual-ported. Es existieren 4 Datenpfade: (1) Port A RAMZugriff, (2) Port B RAM-Zugriff, (3) Port B liest von Port A und (4) Port A liest von Port B. Zugriffe auf den RAM sind prinzipiell synchroner Art. Die Multipliziereinheiten ermöglichen 2 Verfahren: Entweder asynchron, oder synchron mit Ergebnisspeicherung im Register. An jedem Block-RAM Modul befindet sich jeweils ein Multiplizierer. Eine weitere wichtige Einheit sind die DCM (Digital Clock Manager). Deren Funktion ist bereits oben erklärt worden Abbildung 4.18 Spartan DCM 78 Prof. Dr. Ulrich Teppner: DT39 Abbildung 4.19 DLL Die DLL (Delay Locked Loop) ist zuständig für die Eliminierung des Clock-Skew. Die Funktionsweise ist derart, dass sukzessive Delays addiert werden, bis das Feed-Back Signal (CLKFB) exakt in Phase mit dem Original Signal (CLKIN) ist. Diese Situation wird dann gelocked. 4.2.1.4 Boundary Scan (JTAG) Der Boundary Scan ist eine Testmethode, mit der gedruckte Schaltung zuverlässiger und einfacher getestet werden können als durch mechanischen Abgriff der Signale auf dem Bord (Nadel-Kissen). Insbesondere bei Multi-Layer Platinen oder bei SMDBauteilen entstehen erhebliche Schwierigkeiten bei der mechanischen Methode. Beim Boundary Scan werden dagegen die Zustände der Eingänge eines Chip ausgelesen und andererseits Ausgänge gezielt auf definierte Logikpegel gesetzt. Notwendig ist dafür ein (funktionsfähiger) Anschluss über (beim XILINX-Baustein drei) dedizierte I/O-Pins. Die Funktion des Tests ist derart, dass zunächst der Zustand der I/O-Pins abgefragt und intern gespeichert wird (Capture). Danach werden diese Daten seriell aus dem Chip herausgeshiftet und statt dessen neue serielle Daten hineingeshiftet (shift). Danach werden die I/O-Pins auf die neuen Daten geladen (Update). Auf die gleiche Art können nicht nur Daten, sondern auch Anweisungen (Instruktionen) in spezielle interne Register geschoben und danach verarbeitet werden. 79 Prof. Dr. Ulrich Teppner: DT39 Mit dieser Methode können sowohl die externen Verbindungen, als auch die interne Logik eines Chips überprüft werden. Zusätzlich können Daten intern abgelegt werden. Obwohl ursprünglich gar nicht dafür entwickelt, ist dies heute die Methode, mit der Konfigurationen in FPGAs geladen werden. 5 Electronic Design Automation Bereits vor Jahren hat man festgestellt, dass die Entwicklungsmethodik digitaler Schaltungen mit der zunehmenden Integrationsdichte integrierter Schaltungen nicht Schritt hält. Dies drückt sich in obiger Grafik aus, in welcher eine Linie (blau) die Entwicklung der Integrationsdichte in Logik-Transistoren pro Chip angibt, die andere (rot), die Zahl der sinnvoll in ein Design implementierten Logik-Transistoren pro Mann-Monat. Die Steigung beider Linien ist sehr unterschiedlich, so dass sich hier eine Schere öffnet, die bedeutet, dass ein Entwicklungsteam zunehmend weniger in der Lage ist, kontemporäre ICs mit adäquaten Designs zu füllen. Dies wird als 'Productivity Gap' (Produktivitätslücke) bezeichnet. Neben dieser Productivity Gap hat sich eine weitere, noch bedeutendere Lücke herausgebildet, die sog. Verification Gap (s. Abbildung n. Seite). Diese Verification Gap gibt an, dass die Möglichkeit aktuelle Designs zu verifizieren noch geringer gewachsen ist als die Möglichkeit Designs zu entwerfen. Beide Tatsachen waren und sind weiterhin eine Herausforderung an die Tool-Hersteller, dem Entwicklungs-Ingenieur Werkzeuge in die Hand zu geben, mit welchen sie in der Lage sind, komplexe Designs sowohl schneller zu entwerfen, als auch effektiver zu verifizieren. Diese Werkzeuge werden allgemein unter dem Oberbegriff 'Electronic 80 Prof. Dr. Ulrich Teppner: DT39 Design Automation' geführt, der auf Deutsch soviel bedeutet, wie 'Automatisierter Entwurf (digitaler) elektronischer Schaltungen'. Bevor diese EDA-Tools in den 90er Jahren des letzten Jahrhunderts ihren Siegeszug antreten konnten, war jedoch zunächst ein grundlegender Paradigmenwechsel in der Art der Schaltungsentwicklung notwendig. Während bis in die 80er Jahre hinein die sog. Bottom-Up Methode in der Schaltungsentwicklung vorherrschte, bei der eine Schaltung aus Einzelkomponenten schrittweise entwickelt, getestet und weiter zusammengesetzt wurde, setzte sich in den 90er Jahren die Top-Down Entwicklung durch (s. Abb. Rechts). Bei dieser Methode wird der gesamte Entwurfsprozess von der Idee bis zur Realisierung begleitet von zunächst abstrakten, dann immer konkreter und hardware-näher werdenden Beschreibungen des Designs, verbunden mit objektiven Simulationen, die eine ständige Rückkopplung mit den Vorgaben erlauben. Diese Entwurfsart erfordert zunächst das Vorhandensein einer Beschreibungssprache, die alle diese Schritte begleiten kann. Dazu hat sich in Europa die Sprache VHDL (VHSIC Hardware Description Language, VHSIC = Very High Speed Integrated Circuit) entwickelt, in den USA ist die Sprache Verilog stärker vertreten. 81 Prof. Dr. Ulrich Teppner: DT39 Neben dieser Sprache bedarf es auch eines Simulators, der die Entwicklung begleitet. Hier hat sich in Verbindung mit VHDL der Simulator ModelSim durchgesetzt (obwohl grundsätzlich auch andere Simulatoren in Frage kommen). Wie oben herausgestellt, war die Productivity Gap die eine Herausforderung. Die andere ist die Verification Gap. Hier haben sich noch keine Werkzeuge als Standard herausgestellt. Derzeit gibt es jedoch Bestrebungen von verschiedenen Seiten, de facto Standards zu schaffen. Hierunter fallen Bemühungen SystemC oder SystemVerilog als Verifikationssprache zu etablieren. In den nächsten Jahren wird sich zeigen, welche Entwicklung die Oberhand behält. Im Folgenden werden wir uns mit der Sprache VHDL eingehender beschäftigen, da dies die in Europa (und damit auch Deutschland) am weitesten verbreitete Hardware-Design Sprache ist. VHDL wurde erstmals 1987 standardisiert und dann in einem neuen Standard 1993 überarbeitet. Wesentlichen Anteil an der Entwicklung hatte das amerikanische Verteidigungsministerium, welches diese Sprache auch als Standard für die Dokumentation von Hardware einführte. Daran erkennt man auch, dass eine ganz wichtige Eigenschaft von VHDL die Möglichkeit ist, die Funktion von Hardware zu beschreiben, ohne die Struktur vorzugeben. Erst im Laufe der Jahre entwickelte sich VHDL auch zu einer SyntheseSprache, so dass es heute möglich ist, aus recht abstrakten Beschreibungen heraus die entsprechende Hardware automatisch erzeugen zu lassen. Man muss jedoch nach wie vor einschränkend sagen, dass nicht jede beliebige Beschreibung auch synthetisierbar ist. Es ist daher eine Eigenschaft eines guten VHDL-Entwicklungs-Ingenieurs, in Verbindung mit dem benutzten Synthese-Tool VHDL-Konstrukte so einzusetzen, dass eine effektive Hardware entsteht. Kurz gesagt: Es reicht nicht aus, 'schönen' Code zu schreiben, sondern man muss auch die Funktion der zu erzeugenden Hardware verstehen und den Zusammenhang zum geschriebenen Code verstehen. Gute Hardware-Kenntnisse sind also die Voraussetzung, um mit VHDL Hardware zu designen, obwohl beim Schreiben von VHDL-Code vieles an das Schreiben von Code in einer Software-Sprache erinnert. Im später folgenden Kurs 'Electronic Design Automation' (6. Semester) wird eine Vertiefung der in diesem Semester nur einführungsmäßig vermittelten Kenntnisse stattfinden. 82 Prof. Dr. Ulrich Teppner: DT39 6 VHDL Es werden hier nur einige wesentliche Details von VHDL angesprochen. Zur Vertiefung werden entweder Lehrbücher (z.B. Reichardt, Schwarz: VHDL-Synthese) oder onlineLiteratur (Suchen im „Hamburg VHDL-archive“) empfohlen. 6.1 VHDL: Grundsätzliches Grundsätzlich kann man drei Beschreibungsmodelle in VHDL definieren: - Verhaltensbeschreibung (Behavior) - Datenflussbeschreibung (Dataflow, Register Transfer Level) - Strukturbeschreibung (Structure) Demonstriert am Beispiel eines Volladdierers würde dies bedeuten: - Die Verhaltensbeschreibung entspricht der Funktionstabelle. (Keine Strukturinformation!) - Die Datenflussbeschreibung entspricht den Boole´schen Gleichungen. (Verhaltensbeschreibung, welche die Struktur impliziert!) - Die Strukturbeschreibung entspricht dem Aufbau durch Gatter. (Bauteile und Verbindungen sind festgelegt) Die Datenflussbeschreibung liegt zwischen den beiden anderen und ist nicht immer eindeutig abzutrennen. Eindeutig abzugrenzen voneinander sind Behavior und Structure. Prinzipiell kann man an dieser Stelle sagen, dass eine Synthese einer Strukturbeschreibung kein Problem ist, die Synthese einer Datenflussbeschreibung immer, die einer Verhaltensbeschreibung jedoch nicht immer möglich ist. 6.1.1 Aufbau eines VHDL Modells Eine Entwurfseinheit (Design Unit) besteht grundsätzlich aus einer Entity und einer Architecture. Prinzipiell können in VHDL Entity und Architecture separat angelegt werden, so dass zu einer Entity mehrere Architectures existieren können. Durch ein CONFIGURATION-Konstrukt kann dann zu einer Entity die gewünschte Architecture ausgewählt werden. Hierauf wird jedoch erst später eingegangen, d.h. Entity und Architecture werden der Einfachheit halber zunächst zusammen in ein File geschrieben. Der Filename dieser Einheit sollte lauten: Entity-name.VHD ! Die Entity sieht dabei folgendermaßen aus: ENTITY name declarations generic declarations port definitions END 83 Prof. Dr. Ulrich Teppner: DT39 Die Entity bezeichnet man auch als Eigenschaftsbeschreibung oder Schnittstellenbeschreibung. Alle Eigenschaften des zu modellierenden Entwurfs, wie Ein-, Ausgänge, allgemeine Konstanten, etc. werden in ihr deklariert. ARCHITECTURE name declarations BEGIN Statements Block Statements Process Statements Procedure Call Statements Assertion Statements Signal Assignment Statements END Der Architecture Body des Entwurfs ist die verhaltensmäßige, strukturmäßige, datenflussmäßige oder gemischte Beschreibung der Funktionalität dieses Entwurfs. Als Erweiterung zu dieser Entwurfs-Einheit können in einem Package-Teil häufig bzw. Projekt-weit genutzte Komponenten (Subprogramme), Datentypen usw. deklariert werden. Dieser Package-Teil steht entweder in einem File zusammen mit der Entity/Architecture (vor der Entity) oder in einem separaten File (Endung ebenfalls .VHD). Weiteres zur PACKAGE s. im entsprechenden Kapitel. Zunächst jedoch einige Beispiel: ENTITY full_adder IS PORT ( x, y, cin: IN BIT; sum, cout: OUT BIT); END full_adder; -- input ports -- output ports Mit dieser Entity kann eine der folgenden Architekturen verbunden werden. Behavior: ARCHITECTURE behavioral_view OF full_adder IS BEGIN PROCESS VARIABLE n : INTEGER; CONSTANT sum_vector: BIT_VECTOR (0 TO 3) := “0101“; CONSTANT carry_vector: BIT_VECTOR (0 TO 3) := “0011“; BEGIN n := 0; IF x = ´1´ THEN n := n+1; END IF; IF y = ´1´ THEN n := n+1; END IF; IF cin = ´1´ THEN n := n+1; END IF; 84 Prof. Dr. Ulrich Teppner: DT39 sum <= sum_vector(n) AFTER 20 ns; cout <= carry_vector(n) AFTER 30 ns; WAIT ON x, y, cin; END PROCESS; END behavioral_view; Dataflow ARCHITECTURE dataflow_view OF full_adder IS SIGNAL s: BIT; BEGIN s <= x XOR y AFTER 10 ns; sum <= s XOR cin AFTER 10 ns; cout <= (x AND y) OR (s AND cin) AFTER 20 ns; END dataflow_view; Structure ARCHITECTURE structure_view OF full_adder IS COMPONENT half_adder PORT ( i1, i2: IN BIT; carry: OUT BIT; sum: OUT BIT); END COMPONENT; COMPONENT or_gate PORT ( i1, i2: IN BIT; o: OUT BIT); END COMPONENT; --inputs --outputs --inputs --output SIGNAL a, b, c: BIT; BEGIN U1: U2: U3: half_adder half_adder or_gate PORT MAP (x, y, a, b); PORT MAP (b, cin, c, sum); PORT MAP (a, c, cout); END structure_view; Natürlich können verschiedene Modelle untereinander gemixt werden: ARCHITECTURE mixed_view OF full_adder IS COMPONENT xor_gate 85 Prof. Dr. Ulrich Teppner: DT39 PORT ( i1, i2: IN BIT; o: OUT BIT); END COMPONENT; SIGNAL s: BIT; BEGIN V1: cout <= (x AND y) OR (s AND cin) AFTER 20 ns; V2: xor_gate PORT MAP (x, y, s); V3: xor_gate PORT MAP (s, cin, sum); END mixed_view; Die Architecture ist aus nebenläufigen Statements aufgebaut. Ein Grundelement dabei ist der PROCESS. Dieser bildet Eingänge auf Ausgänge ab. Diese Abbildung kann rein kombinatorischer oder auch sequentieller Art sein. Die Beschreibung dieser Abbildung ist durch verschiedenartigste, aus der Software bekannte Konstrukte möglich. Wie in der Software werden diese Konstrukte (für die Simulation) sequentiell bearbeitet. Bei der Synthese müssen sie jedoch durch geeignete Hardware ersetzt (d.h. nachgebildet) werden. Eine sequentielle Bearbeitung z.B. eines IF-THEN-ELSE Blocks bedeutet daher nicht, dass daraus auch eine sequentielle Schaltung generiert werden muss! (S. dazu obiges Beispiel der Verhaltensbeschreibung eines Voll-Addierers) Der interne Aufbau des Processes ist vollkommen losgelöst vom Aufbau der Hardware. Wichtig ist nur, dass das Verhalten (!) korrekt beschrieben wird. Ein Vergleich mit anderen (sogenannten) Hardware-Beschreibungs-Sprachen ist an dieser Stelle durchaus interessant: Diese sind häufig (z.B. OHDL, AHDL, CUPL, Abel, ...) aus einer reinen Struktur- zu einer Datenfluss-beschreibenden Syntax (PALASMähnlich) weiterentwickelt worden. Sie besitzen daher einen teilweise vollkommen andersartigen Aufbau. Z.B. ist der PROCESS-Konstrukt dort unbekannt. Die Bezeichnung "Hardware-Beschreibungs-Sprache" ist deswegen auch nicht ganz korrekt, wird jedoch gerne als Verkaufs-Argument benutzt. In ihrer Funktionalität fehlt auf jeden Fall der Bereich der abstrakten Systembeschreibung und -simulation. Dies ist die Domäne einer echten HDL wie z.B. VHDL, welche somit für den Chip-, Board- und Systementwurf gleichermaßen geeignet ist. Wie gut aus einer VHDL-Beschreibung auch Hardware entwickelt werden kann, hängt vom Einsatz der Konstrukte und vom Synthese-Tool ab. . Für die Synthese müssen daher bestimmte Regeln eingehalten werden. 86 Prof. Dr. Ulrich Teppner: DT39 6.1.1.1 Entity Declaration Allgemeine Form (Reihenfolge nicht veränderbar!): ENTITY entity_name IS GENERIC ([CONSTANT] generic_name: type [:=value; ...]); PORT ([SIGNAL] port_name: mode type [indexrange] ...); END [entity_name]; Generics sind Parameter, welche von außen dem Modell übergeben werden können. Z.B. lassen sich so Verzögerungs- oder Setup-Zeiten für das ganze Modell festlegen. Sie gehören zur Objektklasse CONSTANT. z.B. GENERIC (delay: TIME := 1ns); Ports sind die Schnittstellen des Entwurfs. Sie gehören default-mäßig zur Objektklasse SIGNAL. Ihr Mode kann IN, OUT oder INOUT sein. z.B. PORT (a: IN BIT; b: IN BIT_VECTOR(0 TO 2); c: OUT BIT); 6.1.1.2 Architecture Body Die Architektur beschreibt die interne Verarbeitung der Komponente. Sie ist mit einer Entity Deklaration durch den Namen verbunden. Ports und Generics dieser Entity können genutzt werden. Die grundsätzliche Struktur sieht wie folgt aus: ARCHITECTURE architecture_name OF entity_name IS {Deklarationsteil} BEGIN {Statement-Teil} END [architecture_name]; Der Hardware-Funktion entsprechend werden alle Statements gleichzeitig (bzw. concurrent, nebenläufig) abgearbeitet. Um aus der Software bekannte sequentielle Anweisungen (z.B. IF-THEN-ELSE) in der Beschreibung einsetzen zu können, gibt es spezielle Konstrukte (PROCESS), innerhalb derer diese sequentiellen Statements angewendet werden können. 87 Prof. Dr. Ulrich Teppner: DT39 6.2 Fundamentale VHDL Sprachstrukturen 6.2.1 Objekte (Objects) Objekt-Namen können Buchstaben (A..Z), Ziffern (0..9) und den Unterstrich (_) enthalten. Sie müssen mit einem Buchstaben beginnen und dürfen nicht mit dem Unterstrich enden. Es wird nicht zwischen Klein- und Großschreibung unterschieden (case-insensitive). Objekte halten die Datenwerte innerhalb eines Modells. Jedes Objekt besitzt einen Typ (type) und ist einer Klasse (class) zugeordnet. Der Typ gibt die Art der enthaltenen Daten an, die Klasse, was damit gemacht werden kann. Es gibt drei verschiedene Objekt-Klassen: CONSTANT VARIABLE SIGNAL Konstanten können von beliebigem Typ sein. Ihr Wert kann sich nie ändern. Variablen können von beliebigem Typ sein. Sie sind gültig innerhalb eines Prozesses oder Unterprogramms (nicht global!). Ihr Wert ändert sich durch eine Zuweisung (assignment). Signale repräsentieren logische Verbindungen in der Hardware. Einer Änderung des Wertes eines Signals liegt das Verhalten der Hardware zugrunde: sie erfolgt nicht sofort, sondern selbst bei 0 ns Laufzeit nach dem gegenwärtigen Simulationsschritt (DeltaZyklus genannt). 6.2.2 Datenypen (Data Types) Es gibt vordefinierte und Nutzer-definierbare Datentypen 6.2.2.1 Vordefinierten Datentypen (Auszug) BOOLEAN Dies ist ein Aufzählungstyp mit den beiden Werten FALSE und TRUE. Für ihn sind relationale Operatoren ( = , /= , < , <= , > , >= , wobei FALSE < TRUE ) und logische Operatoren ( AND , OR , NAND , NOR , XOR , NOT ) definiert. INTEGER 88 Prof. Dr. Ulrich Teppner: DT39 Der Wertebereich dieses Typs umfasst -2147483648 bis +2147483647 (32 bit). Relationale Operatoren ( = , /= , < , <= , > , >=) und arithmetische Operatoren ( + , - , * , / , MOD , REM , ** , ABS) sind erlaubt. Die default-Zahlenbasis bei Wert-Zuweisungen ist dezimal Es können jedoch auch Zahlen in den Basen 2, 8, 16 angegeben werden nach folgendem Schema: [Basis #]Ziffern{[_] Ziffern}[#] Der Unterstrich wird zur Bestimmung des Wertes missachtet und dient nur zur Übersichtlichkeit der dargestellten Zahl. Beispiele: 16#FF# 16#124E_2341# 250_123_451 CHARACTER, STRING, TEXT CHARACTER ist ein Aufzählungstyp für den 128-character ASCII Zeichensatz. Die relationalen Operatoren ( = , /= , < , <= , > , >=) sind erlaubt. STRING ist ein 1-dimensionales Feld von CHARACTERs. TEXT ist ein File mit STRING-Variablen. Nur File-Zugriffs-Routinen (Prozeduren, Funktionen) können mit Objekten vom Typ TEXT arbeiten! TIME Objekte vom Typ Zeit werden genutzt, um Verzögerungszeiten zu spezifizieren. Als Maßeinheiten sind möglich: fs , ps , ns , us , ms , sec , min , hr. Die relationalen Operatoren ( = , /= , < , <= , > , >=), Addition und Subtraktion ( + , - ) sind erlaubt. Multiplikation und Division ( * , / ) sind folgendermaßen erlaubt: {INTEGER} * {TIME} → {TIME} {TIME} * {INTEGER} → {TIME} {TIME} / {INTEGER} → {TIME} {TIME} / {TIME} → {INTEGER} BIT / BIT_VECTOR BIT ist ein Datentyp welcher die Zustände 0 und 1 annehmen kann. Er korrespondiert daher mit der physikalischen Leitung innerhalb einer Schaltung, welche ebenfalls die Werte 0 und 1 einnehmen kann. Ein BIT_VECTOR ist ein 1-dimensionales Feld von BITs. Neben diesen standardmäßig definierten Datentypen gibt es weitere, welche zwar nicht im Sprachumfang definiert sind, sich aus Zweckmäßigkeitsgründen inzwischen jedoch allgemein durchgesetzt haben. Zu ihrer Benutzung ist eine Bibliothek einzubinden: library ieee; use ieee.std_logic_1164.all; 89 Prof. Dr. Ulrich Teppner: DT39 STD_LOGIC / STD_ULOGIC / STD_LOGIC_VECTOR / STD_ULOGIC_VECTOR Hier handelt es sich um eine Erweiterung des standardmäßigen Datentyps BIT. Die Erweiterung dient im wesentlichen dazu, 3-state Zustände aufzunehmen und undefinierte Zustände (Simulation) zu erlauben. Das 'u' steht für unresolved (nicht aufgelöst) und bedeutet, dass eventuelle BusKonflikte (mehrere Treiber für eine Leitung) nicht aufgelöst werden, d.h. vom Entwickler ausgeschlossen werden müssen. Dieser Datentyp eignet sich also nicht für 3-state Leitungen! Es können folgende Werte angenommen werden: 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-' ---------- Uninitialized Forcing Unknown Forcing 0 Forcing 1 High Impedance Weak Unknown Weak 0 Weak 1 Don't care Für beide (Vektor-)Datentypen sind relationale Operatoren ( = , /= , < , <= , > , >=) und logische Operatoren ( AND , OR , NAND , NOR , XOR , NOT ) definiert. Beispiel: ... l, r, p: std_logic_vector (7 DOWNTO 0); ... p <= nand(l,r); ... 6.2.2.2 Benutzer-definierte Datentypen Aufzählungstyp TYPE type_name IS (Liste von Aufzählungsgrößen); Beispiel: TYPE color_type IS (green, red, blue); VARIABLE color: color_type; ... color := red; Die relationalen Operatoren ( = , /= , < , <= , > , >=) sind erlaubt. 90 Prof. Dr. Ulrich Teppner: DT39 Feld (Array Type) Durch eine Gruppe von Elementen zusammengesetzter Typ. Alle Elemente müssen vom gleichen Typ sein und sind indiziert durch ihre Position im Feld. Felder können 1oder 2-dimensional sein. Die Bereiche sind vom Typ INTEGER. Logische Operatoren ( AND , OR , NAND , NOR , XOR , NOT ) sind für 1-dimensionale Felder von STD_LOGIC oder BOOLEAN Elementen definiert. Die relationalen Operatoren ( = , /= , < , <= , > , >=) sind für alle 1-dimensionalen Felder definiert. Beispiel: library ieee; use ieee.std_logic_1164.all; PACKAGE ... TYPE log_array IS ARRAY(0 TO 7) OF STD_LOGIC; TYPE cm_type IS ARRAY(INTEGER RANGE <>) OF color_type; -- s. oben ... END; ENTITY ... PORT (a,b: IN log_array; c: OUT log_array); ... ARCHITECTURE ... BEGIN PROCESS (a,b) VARIABLE color_array: cm_type(0 TO 255); BEGIN ... END PROCESS; END; -- s. hierzu weiter unten Eine Typ-Deklaration kann innerhalb eines Package (s. dort), oder auch innerhalb einer Architecture eingesetzt werden. Man sieht an obigem Beispiel ebenfalls,, dass es zwei Arten der Feld-Typ Deklaration gibt: eingeschränkt (=constrained, mit festen Grenzen) oder uneingeschränkt (=unconstrained, mit freien Grenzen). Record Typen Durch eine Gruppe von Elementen zusammengesetzter Typ. Die Elemente können von unterschiedlichem Typ sein. Nur die Gleichheitsoperatoren ( = , /= ) sind definiert. Beispiel: 91 Prof. Dr. Ulrich Teppner: DT39 TYPE op_type IS (opadd, opor, opand, opxor); TYPE instruction_type IS RECORD op_code: op_type; data: INTEGER; END RECORD; VARIABLE instruction, next_instruction: instruction_type; ... instruction := next_instruction; ... CASE instruction.op_code IS -- s. hierzu weiter unten ... 6.2.3 Signalzuweisungen (Signal Assignments) Hierdurch wird dem Treiber (Driver) eines Signals ein Wert (waveform value) zugewiesen. Das Signal ändert seinen Wert nicht sofort, sondern mindestens (bei keinem delay) nach einem Simulationsschritt (delta delay). Signalzuweisungen werden ausgeführt, sobald sich ein Eingangswert ändert. Sie können beliebig innerhalb des ausführbaren Teils einer Architektur stehen. signal_name <= [TRANSPORT] waveform; wobei waveform zu ersetzen ist durch: value_expression_1 [AFTER time_expression_1] {,value_expression_n[AFTER time_expression_n]}; Beispiele: c <= a XOR b; sum <= a XOR b XOR cin AFTER 30ns; f <= TRANSPORT ´0´ AFTER 10ns; clk <= NOT clk AFTER clkwidth; Wenn mehrere Zuweisungen (im nebenläufigen Teil) auf das gleiche Signal durchgeführt werden sollen, muss eine Busauflösung eintreten. Dies kann bei std_logic Signalen durch den hoch-ohmigen Zustand 'Z' erreicht werden, sonst muss eine spezielle Funktion dafür entwickelt werden. Bedingte Signalzuweisungen haben folgendes Format: [label:] signal_name <= [TRANSPORT] {waveform_1 WHEN condition ELSE} waveform_n; 92 Prof. Dr. Ulrich Teppner: DT39 Beispiel: c <= ´1´ AFTER 10ns WHEN a=´0´AND b= ´0´ELSE ´0´ AFTER 12ns WHEN a=´1´AND b=´1´ELSE ´0´ AFTER 20ns; Auswahlzuweisung (Selected Signal Assignment): [label:] WITH expression SELECT signal_name <= [TRANSPORT], waveform_1 WHEN choices_1 {,waveform_n WHEN choices_n}; choices_. kann ein Ausdruck, die Verknüpfung mehrerer Ausdrücke ( | als ODERVerknüpfungsoperator) oder das Schlüsselwort OTHERS sein. Beispiel: library ieee; use ieee.std_logic_1164.all; ENTITY was IS GENERIC (delay: TIME := 10ns); PORT (sel: IN STD_LOGIC_VECTOR(0 TO 1); dout: OUT STD_LOGIC; d0, d1, d2, d3: IN STD_LOGIC); END was; ARCHITECTURE behav OF was IS BEGIN WITH CONV_INTEGER(sel) SELECT dout <= d0 AFTER delay WHEN 0, d1 AFTER delay WHEN 1, d2 AFTER delay WHEN 2, d3 AFTER delay WHEN 3, ´X´ WHEN OTHERS; END behav; Welche Schaltung beschreibt dieses Modell? (CONV_INTEGER(sel) ist eine Typkonvertierung des 2-bit Feldes in einen integer-Wert) Der Begriff TRANSPORT spezifiziert das Delay-Modell. Es gibt drei Modelle: INERTIAL (default), TRANSPORT (muss explizit angegeben werden) und eine Kombination davon, welche REJECT INERTIAL heisst. Für alle Delay-Modelle wird dem Treiber eines Signals eine neue Liste von waveforms übergeben, welche zu den vorgegebenen Zeitpunkten das Signal setzen. Im Treiber bereits eingelagerte waveforms, welche nach der ersten neu gesetzten (oder gleichzeitig mit ihr) zur Wirkung kämen, werden gelöscht. Beim Inertial-Modell werden zusätzlich alle vor der ersten neu gesetzten waveform gelöscht, mit einer Ausnahme: Hat die letzte davor liegende waveform den gleichen Wert, bleibt sie erhalten. Dies hat zur Folge, dass Spikes, die kürzer sind als die angegebene Delay-Zeit, unterdrückt werden. 93 Prof. Dr. Ulrich Teppner: DT39 6.2.4 Variablenzuweisungen (Variable Assignments) Variablenzuweisungen ersetzen den Wert des Objektes sofort, es gibt keine Verzögerung! Diese Zuweisungsstatements können nur in Prozessen und Unterprogrammen benutzt werden (s. weiter unten). Beispiele: a := x*y; counter := counter + 1; 6.2.5 Operatoren Folgende Operatoren sind definiert: arithmetisch + Addition Subtraktion * Multiplikation / Division ** Potenzieren ABS Absolutwert bilden REM Rest der Integer-Division MOD Rest der Integer-Division Unterschied zwischen REM und MOD: -5 REM 4 = -1, -5 MOD 4 = 3 relational = gleich /= ungleich < kleiner als <= kleiner als oder gleich > größer als >= größer als oder gleich logisch AND OR NAND NOR XOR NOT und oder und negiert oder negiert exklusives oder negiert verkettend & Verkettung (Concatenation) 6.2.6 sequentielle VHDL Statements Man kann grundsätzlich in sequentielle und nebenläufige (concurrent) Statements unterteilen. 94 Prof. Dr. Ulrich Teppner: DT39 Nebenläufige Statements werden zu Beginn der Simulation berechnet und dann jeweils, wenn ein Signal in ihrer Abhängigkeitsliste sich ändert. Alle Statements im Ausführungsteil einer Architektur sind nebenläufig. Sequentielle Statements können nur innerhalb eines Prozesses oder eines Unterprogramms eingesetzt werden. Sie werden (zur Verhaltenssimulation) in ihrer sequentiellen Reihenfolge abgearbeitet. 6.2.6.1 IF Statement Diese Statements erlauben die bedingte Abarbeitung sequentieller Statements. Beispiel: PROCESS (a,b) BEGIN IF a = ´0´ OR b = ´0´ THEN out <= ´0´ AFTER 10ns; ELSIF a = ´X´ OR b = ´X´ THEN out <= ´X´ AFTER 10ns; ELSE out <= ´1´ AFTER 10ns; END IF; END PROCESS; Wenn keine Bedingung wahr ist, wird kein Statement bearbeitet. Wenn mehrere wahr sind, wird nur die erste wahre bearbeitet. 6.2.6.2 CASE Statement Diese Statements erlauben ebenfalls die bedingte Abarbeitung sequentieller Statements. Beispiel: PROCESS(x) BEGIN CASE x IS WHEN 1 => out <= ´0´; WHEN 2 | 3 => out <= ´1´; WHEN OTHERS => out <= ´X´; END CASE; END PROCESS; Der Selektionsausdruck (im Beispiel x) muss vom Typ INTEGER oder ein Aufzählungstyp sein. Beim Typ INTEGER muss die Auswahl OTHERS gegeben sein. 95 Prof. Dr. Ulrich Teppner: DT39 6.2.6.3 WAIT Statement Das WAIT Statement suspendiert einen Prozess oder eine Prozedur. Es kann nur benutzt werden, wenn die Abhängigkeits-Liste im PROCESS Statement (s. dort) nicht gesetzt ist. Die allgemeine Form des WAIT Statements ist: WAIT [ON signal_name_1 {, signal_name_n}] -- Signaländerung [UNTIL condition] -- Bedingung [FOR time_expression]; -- Zeitangabe Sind Signaländerung und Bedingung spezifiziert, müssen beide erfüllt sein. Ist eine Zeitangabe gegeben, ist dies die Maximalzeit. Beispiel: PROCESS BEGIN WAIT ON a,b UNTIL enable = ´1´; c <= a AND b; END PROCESS; 6.2.6.4 ASSERT Statement Das ASSERT Statement (Erklärungsanweisung) prüft eine angegebene Bedingung und meldet einen Fehler, falsch sie FALSE ist. Es wird vom Synthetisierer ignoriert. Die allgemeine Form ist: ASSERT condition [REPORT string] [SEVERITY severity_level]; Der severity level kann NOTE, WARNING, ERROR (default) oder FAILURE sein. Beispiel: PROCESS(s,r) BEGIN ASSERT NOT (s=´1´ AND r=´1´) REPORT “S und R sind beide ´1´“ SEVERITY ERROR; END PROCESS; 96 Prof. Dr. Ulrich Teppner: DT39 6.2.6.5 LOOP Statements LOOP Statements bedingen, dass eine Folge von sequentiellen Statements eine bestimmte Anzahl oft durchlaufen wird. Es gibt drei verschiedene LOOP Statements: einfache LOOP, FOR LOOP, WHILE LOOP. Das allgemeine Schema ist: [loop_label:] [iteration_scheme] LOOP Sequenz von Statements END LOOP[loop_label]; iteration_scheme kann sein: WHILE condition FOR loop_index_variable IN range (Beispiele s. Kapitel 6.2.6.7) 6.2.6.6 EXIT Statement Wenn kein iteration_scheme gegeben ist, muss die LOOP über ein EXIT Statement verlassen werden. 6.2.6.7 NEXT Statement Das NEXT Statement vollendet die Ausführung eines Schleifendurchlaufs der einschließenden LOOP Anweisung. Die Ausführung wird am innersten LOOP Statement fortgesetzt. Falls eine WHEN Bedingung gegeben ist, geschieht dies nur, wenn die Bedingung wahr ist. Beispiele: PROCESS (a,b) VARIABLE x: INTEGER := 0; VARIABLE y: INTEGER; BEGIN LOOP x := x + 1; y := 20; LOOP IF y < (x*x) THEN EXIT; END IF; y := y - x; END LOOP; EXIT WHEN x > 10; END LOOP; END PROCESS; 97 Prof. Dr. Ulrich Teppner: DT39 WHILE instruction /= halt LOOP FOR cycle IN 1 TO cycle_count(instruction) LOOP NEXT WHEN jump = ´1´; execute (instruction, cycle); END LOOP; EXIT WHEN interrupt = ´1´; fetch(instruction); END LOOP; WHILE NOT done LOOP ... IF a=b THEN done := TRUE; END IF; END LOOP; 6.2.6.8 NULL Statement Das NULL Statement ist eine leere Anweisung. Beispiel: CASE y IS WHEN 0 | 1 => b <= a; WHEN OTHERS => NULL; END CASE; 6.2.7 nebenläufige VHDL Statements Folgende Statements können innerhalb einer Architektur auftreten: - Process Statements - Nebenläufige Signalzuweisungen - Nebenläufige Mitteilungen (Assertions) - Block Statements Block Statements werden für eine hierarchische Struktur benutzt. 6.2.7.1 PROCESS Statement Dies sind die fundamentalen Elemente der Architektur und wurden in den vorangegangen Beispielen bereits ohne weitere Erklärung eingesetzt. Sie definieren die Werte ihrer Ausgangssignale als Funktion der Eingangssignale in Abhängigkeit von der Zeit. 98 Prof. Dr. Ulrich Teppner: DT39 Entweder enthält ein Process direkt eine Abhängigkeitsliste (Sensitivity List), oder diese Liste ist über ein WAIT Statement gegeben. Eine direkte Abhängigkeitsliste wird quasi durch ein WAIT ersetzt. Jeder Process einer Architektur wird zum Simulationsbeginn gestartet und läuft unendlich weiter. Die Ausführung eines WAIT Statements suspendiert den Process, bis ein Signal aus der Abhängigkeitsliste seinen Wert ändert. Allgemeine Form: [process_label:] PROCESS [(sensitivite_signal_name1 {, sensitivite_signal_namen})] [constant_declarations]; [variable_declarations]; [type_declarations]; BEGIN [sequential_statements] END PROCESS [process_label]; Beispiele: PROCESS (a,b) BEGIN IF a = ´0´ AND b = ´0´ THEN qn <= ´1´AFTER delay; ELSE qn <= ´0´AFTER delay; END IF; END PROCESS; Frage: Welche Logik-Verknüpfung beschreibt dieser Process? register: PROCESS VARIABLE value: STD_LOGIC_VECTOR(1 TO 16); BEGIN WAIT UNTIL clk = ´1´; value := aluout(1 TO 16); IF enabled THEN resreg <= value; END IF; END PROCESS; 99 Prof. Dr. Ulrich Teppner: DT39 6.2.7.2 ASSERT Statement Die nebenläufige ASSERT-Anweisung unterscheidet sich von der sequentiellen syntaktisch nur dadurch, dass sie ein Label haben kann und nicht innerhalb eines Process steht: [label:] ASSERT condition [REPORT string] [SEVERITY severity_level]; Es wird zum Beginn einer Simulation ausgeführt, und danach, wann immer ein Signal in der Bedingung sich ändert. 6.2.7.3 BLOCK Statement Ein BLOCK Statement enthält einen Satz nebenläufiger Anweisungen. Es wird zur Strukturierung eingesetzt, um Teile nebenläufiger Anweisungen zu gruppieren. Konstanten, Signale und Typen, die am Block-Anfang deklariert sind, gelten nur bis zum Ende des Blocks. label: BLOCK [constant_declarations] [signal_declarations] [type_declarations] BEGIN [concurrent_statements] END BLOCK [label]; 6.2.8 Strukturale Modellierung Die strukturale Modellierung erlaubt einen hierarchischen Aufbau des VHDL-Modells. Hierzu werden Komponenten benutzt, welche aus der Komponenten Deklaration und der Komponenten Instantiierung besteht. 6.2.8.1 COMPONENT Deklaration Die Komponenten Deklaration schafft die Verbindung zur Entity der Komponente. Sie steht im Architektur- (oder Package-) Teil. 100 Prof. Dr. Ulrich Teppner: DT39 Beispiel: ... COMPONENT xor2 GENERIC (delay: TIME := 2ns); PORT (a,b: IN STD_LOGIC; q: OUT STD_LOGIC); END COMPONENT; ... Dies steht in direkter Verbindung zum File “xor2.vhd“ mit dem Inhalt: ENTITY xor2 IS GENERIC (delay: TIME := 2ns); PORT (a,b: IN STD_LOGIC; q: OUT STD_LOGIC); END xor2; 6.2.8.2 COMPONENT Instantiierung Die Komponenten Instantiierung schafft eine Instanz (einen Einsatz) der Komponente innerhalb der Architektur. Für obiges Beispiel könnte sie folgendermaßen aussehen: x1: xor2 GENERIC MAP (4ns) PORT MAP (q => in1, a => x, b => y); Verknüpfungen zwischen den formalen und aktuellen Parametern kann durch Position innerhalb der Liste (im Beispiel bei den genirics), oder durch Namen (im Beispiel bei den ports) erreicht werden. Soll für bestimmte Parameter der default-Wert benutzt werden, kann auch das Schlüsselwort OPEN eingesetzt werden. Beispiel: x1: xor2 GENERIC MAP (OPEN) ... Hier würde die delay-Zeit von 2ns benutzt werden. Ein default-Wert muss vorhanden sein! 101 Prof. Dr. Ulrich Teppner: DT39 6.3 Fortgeschrittene VHDL Sprachstrukturen 6.3.1 Attribute, Bibliotheksfunktionen Attribute werden benutzt, um Eigenschaften von Objekten oder Typen abzufragen. Es gibt vordefinierte und benutzerdefinierte. 6.3.1.1 Vordefinierte Attribute Beispiel: TYPE my_typ IS (blue, red, green, yellow); VARIABLE v1, v2, v3: my_typ; VARIABLE v4: INTEGER; ... v1 := my_typ´LEFT; -- blue - links in der Liste v2 := my_typ´VAL(3); -- yellow - der 3. in der Liste v3 := my_typ´SUCC(red); -- green - Nachfolger von red v4 := my_typ´POS(red) -- 1 - Position von red Einige wichtige vordefinierte (und synthetisierbare) Attribute sind: ´LEFT ´RIGHT ´HIGH ´LOW ´RANGE ´LENGTH linke Grenze des Index-Bereiches rechte Grenze des Index-Bereiches obere Grenze des Index-Bereiches untere Grenze des Index-Bereiches entweder ´LEFT to ´RIGHT oder ´LEFT downto ´RIGHT Wertebereich des Feldes: ´HIGH - ´LOW + 1 6.3.1.2 Benutzer-definierte Attribute Sie werden definiert durch eine Attribut Deklaration und Attribut Spezifikation. Es müssen immer Konstanten sein. Attribut Deklaration ATTRIBUTE name:type[(index_1[,index_2])]; Attribut Spezifikation ATTRIBUTE name OF item-name_list:item-class IS expression; item-name_list kann auch ALL oder OTHERS sein. 102 Prof. Dr. Ulrich Teppner: DT39 Beispiel: library ieee; use ieee.std_logic_1164.all; ENTITY demo_entity IS ... ATTRIBUTE fanout: INTEGER; ATTRIBUTE rtime: TIME; ... END demo_entity; ARCHITECTURE demo OF demo_entity IS SIGNAL s1, s2, s3, s4: STD_LOGIC__VECTOR(0 TO 7); SIGNAL clk, s5: STD_LOGIC; ... ATTRIBUTE fanout OF ALL: SIGNAL IS 4; ATTRIBUTE rtime OF s1, s2, s3, clk: SIGNAL IS 5ns; ATTRIBUTE rtime OF OTHERS: SIGNAL IS 10ns; ... BEGIN ... delay := load - delay*s1´fanout; ... END demo; 6.3.2 Bibliotheksfunktionen 6.3.2.1 Standard-Bibliotheken Es stehen standardmäßig eine Anzahl von Bibliotheksfunktionen zur Verfügung, welche in den aktuellen Programmcode eingebunden werden können. Diese Routinen lassen sich gruppieren in die Bereiche: - Vektor-Manipulation - Typ-Konvertierung - Erkennung von Werten bzw. Änderungen - Schreib- / Lese-Funktionen Im folgenden werden die wichtigsten Funktionen der einzelnen Bibliotheken als Übersicht aufgelistet. Ihr Einsatz ist in den meisten Fällen selbsterklärend. Bei Problemen sollte in der On-Line Hilfe nachgesehen werden. IEEE.std_logic_signed Für die Datentypen der IEEE-Bibliothek sind die Operatoren: + , - , * , < , <= , >= , > , = , /= , bzw. ABS überladen. Die Operanden können gemischt sein, das Ergebnis ist vom umfassenderen Typ (Bei Vergleichsoperationen natürlich vom Typ BOOLEAN). Die Werte von Vektoren werden im 2er-Komplement angenommen! Schiebe-Funktionen (SHL links bzw. SHR rechts) schieben den Datentyp unsigned oder signed um die angegebene Anzahl von Bits. Beispiel: 103 Prof. Dr. Ulrich Teppner: DT39 arg: std_logic_vector (7 DOWNTO 0); count: std_logic_vector (2 DOWNTO 0); ... arg <= shr(arg,count); ... Konvertierungsfunktionen Name CONV_INTEGER Argument STD_LOGIC_VECTOR Size Ergebnis INTEGER CONV_STD_LOGIC_VECTOR INTEGER INTEGER STD_LOGIC_VECTOR IEEE.std_logic_unsigned Der Inhalt ist identisch zu std_logic_signed, jedoch werden alle Vektor-Werte vorzeichenlos angenommen! IEEE.std_logic_arith Zunächst werden in dieser Bibliothek einige weitere Datentypen deklariert, die teilweise jedoch nur aus Klarheitsgründen definiert sind. Statt std_logic_vector können die Datentypen signed oder unsigned benutzt werden. Der Datentyp small_int hält nur die beiden Integer-Werte 0 und 1. Für diese Datentypen sind jetzt die Operatoren: + , - , * , < , <= , >= , > , = , /= , bzw. ABS überladen. Die Operanden können gemischt sein, das Ergebnis ist vom umfassenderen Typ (Bei Vergleichsoperationen natürlich vom Typ BOOLEAN). Schiebe-Funktionen (SHL links bzw. SHR rechts) schieben den Datentyp unsigned oder signed um die angegebene Anzahl von Bits (Beispiel s.o.). Konvertierungsfunktionen Name CONV_INTEGER Argument UNSIGNED SIGNED STD_ULOGIC Size Ergebnis INTEGER INTEGER SMALL_INT CONV_UNSIGNED INTEGER UNSIGNED SIGNED STD_ULOGIC INTEGER INTEGER INTEGER INTEGER UNSIGNED UNSIGNED UNSIGNED UNSIGNED CONV_SIGNED INTEGER UNSIGNED SIGNED STD_ULOGIC INTEGER INTEGER INTEGER INTEGER SIGNED SIGNED SIGNED SIGNED CONV_STD_LOGIC_VECTOR INTEGER UNSIGNED SIGNED STD_ULOGIC INTEGER INTEGER INTEGER INTEGER STD_LOGIC_VECTOR STD_LOGIC_VECTOR STD_LOGIC_VECTOR STD_LOGIC_VECTOR 104 Prof. Dr. Ulrich Teppner: DT39 6.3.2.2 Eigene Bibliotheken Eine Bibliothek besteht aus einem Package. Der Bibliotheksname muss mit dem Package-Namen identisch sein und die Extension .vhd haben. Sie kann im Arbeitsverzeichnis stehen oder in einem speziellen Bibliotheksverzeichnis. 6.3.3 Packages Packages sind Sammlungen von Subprogrammen, Konstanten und Typ-Deklarationen. Sie können in ein Beschreibungs-File integriert sein oder als separates .VHD-File abgelegt werden. Von dort können sie importiert werden von Beschreibungsmodellen oder auch von anderen Packages. Sie können nicht selbständig simuliert werden, sondern immer nur zusammen mit einem Beschreibungsmodell. Ein Package besteht grundsätzlich aus einer Package Declaration und einem Package Body. In der Package Declaration werden die Subprogramme, Konstanten und Typen deklariert, welche exportiert werden sollen. Sie werden dann an anderer Stelle importiert durch ein USE-clause (s. dort). 6.3.3.1 PACKAGE Deklaration Package Deklarationen haben die Form: PACKAGE package_name IS [exported_subprogram declaration] [exported_constant declaration] [exported_type declaration] END [package_name]; Beispiel: PACKAGE arithmet IS FUNCTION min(CONSTANT a,b: IN INTEGER) RETURN INTEGER; CONSTANT maxint: INTEGER := 16#FFFF#; TYPE arith_mode_type IS (signed, unsigned); END 6.3.3.2 PACKAGE Body Der Package Body nimmt die folgende Form an: PACKAGE BODY package_name IS [exported_subprogram_bodies] internal_subprogram_declarations] [internal_subprogram_bodies] [internal_constants_declarations] [internal_type_declarations] END [package_name]; 105 Prof. Dr. Ulrich Teppner: DT39 Beispiel dazu: PACKAGE BODY arithmet IS FUNCTION min(CONSTANT a,b: INTEGER) RETURN INTEGER IS BEGIN IF a<b THEN RETURN a; ELSE RETURN b; END IF; END min; END arithmet; 6.3.4 Subprogramme Unterprogramme können innerhalb Packages definiert werden. Es kann sich dabei um eine Prozedur oder um eine Funktion handeln. Sie dürfen allerdings nur sequentielle Anweisungen enthalten, nebenläufige sind nicht erlaubt. Objekte, welche innerhalb von Unterprogrammen deklariert werden, sind außerhalb unsichtbar. Variablen, welche innerhalb von Unterprogrammen deklariert sind, behalten zwischen zwei Aufrufen nicht ihren Wert. Ein Unterprogramm muss in seiner Funktion durch einen Subprogram Body definiert sein. Eine Subprogram Declaration ist notwendig, damit ein Subprogram benutzt werden kann, bevor der Subprogram Body deklariert ist. Eine Subprogram Declaration ist notwendig in einer Package Declaration. Die Subprogram Declaration enthält den Namen, beschreibt ob es sich um eine Funktion oder Prozedur handelt, und erklärt die Parameter. Folgende Unterschiede gibt es für Funktionen und Prozeduren: Argumentarten Argumentklassen Anzahl der Rückgabewerte Aufruf RETURN-Statement Funktionen IN Konstanten, Signale 1 in Ausdrücken oder Anweisungen muss mit Rückgabewert eingesetzt werden Prozeduren IN, OUT, INOUT Konstanten, Signale, Variablen beliebig eigenständige Anweisung (sequentiell oder parallel) kann eingesetzt werden, darf keinen Rückgabewert haben 106 Prof. Dr. Ulrich Teppner: DT39 6.3.4.1 Funktionen Funktionen können ihre Parameter nicht ändern. Sie müssen mit einem RETURN Statement abschließen, welches einen Wert des Typs der Funktion zurückgibt. Function Declarations haben die Form: FUNCTION function_name [([objekt_class_1] arg_name_1 {, arg_name_n}: [IN] type [(index_range_1[, index_range_2])] {;[object_class_n] arg_name_1 {, arg_name_n}: [IN] type [(index_range_1[, index_range_2])]})] RETURN type; Function Bodies haben die Form: FUNCTION function_name [([objekt_class_1] arg_name_1 {, arg_name_n}: [IN] type [(index_range_1[, index_range_2])] {;[object_class_n] arg_name_1 {, arg_name_n}: [IN] type [(index_range_1[, index_range_2])]})] RETURN type IS [constant_declarations] [variable_declarations] [type_declarations] BEGIN sequence of statements END [function_name]; 6.3.4.2 Prozeduren Prozeduren können ihre Parameter verändern. Anders als Funktionen, liefern sie keinen Return-Wert zurück. Procedure Declarations haben die Form: PROCEDURE procedure_name [([objekt_class_1] arg_name_1 {, arg_name_n}: [mode] type [(index_range_1[, index_range_2])] {;[object_class_n] arg_name_1 {, arg_name_n}: [mode] type [(index_range_1[, index_range_2])]})]; Procedure Bodies haben die Form: 107 Prof. Dr. Ulrich Teppner: DT39 PROCEDURE procedure_name [([objekt_class_1] arg_name_1 {, arg_name_n}: [mode] type [(index_range_1[, index_range_2])] {;[object_class_n] arg_name_1 {, arg_name_n}: [mode] type [(index_range_1[, index_range_2])]})] IS [constant_declarations] [variable_declarations] [type_declarations] BEGIN sequence of statements END [procedure_name]; Ein Prozedur-Aufruf kann sowohl innerhalb des sequentiellen Teils, als auch innerhalb des nebenläufigen Teils eines VHDL-Files geschehen. Falls eine Prozedur im nebenläufigen Teil aufgerufen wird, können jedoch keine Variablen übergeben werden! 6.3.5 USE-Einbindung (Clause) USE-Einbindungen spezifizieren Subprogramme, Typen und Konstanten, welche aus Packages importiert werden sollen. Die USE-Anweisung muss direkt vor der Entity oder dem Package stehen, wo die Einbindung benötigt wird. Die Syntax der USE-Anweisung ist: USE external_name_1 {external_name_2}; wobei external_name_n folgende Form hat: library_name.package_name.declared_name library_name.package_name.ALL library_name ist der Alias-Name des Verzeichnisses, in welchem das Package abgelegt ist (muss im viewdraw.ini File gesetzt werden). Ist das Package im eingestellten aktuellen ‘working library’-Verzeichnis, so ist der library_name WORK. package_name ist der Package- und damit der File-Name des Packages (ohne .VHD Endung). declared_name ist der Name des zu importierenden Subprogramms, der Konstanten oder des Typs. Soll alles aus dem Package importiert werden, so kann stattdessen ‘ALL’ angegeben werden. Beispiel: LIBRARY WORK;-- die Library-Anweisung gehört zum USE-Clause, -- ist jedoch nicht nötigt, wenn wie hier das Verzeichnis WORK benutzt wird USE WORK.arithmet.min; ENTITY bsp IS 108 Prof. Dr. Ulrich Teppner: DT39 ... END; ARCHITECTURE behavior OF bsp IS BEGIN ... a := min(x,y); ... END behavior; 109 Prof. Dr. Ulrich Teppner: DT39