Digitaltechnik - Beuth Hochschule für Technik Berlin

Werbung
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
Herunterladen