Beruflich Dokumente
Kultur Dokumente
Digitaltechnik
(136028/9)
Vorwort
Das vorliegende Skript dient als Grundlage für die Vorlesung Digitaltechnik“ im zweiten
”
Semester des Bachelor-Studiengangs Technische Informatik Embedded Systems“ an der
”
Berliner Hochschule für Technik. Es dient als Referenz für die in der Vorlesung behandelten
Themenbereiche, deckt aber nicht alle peripheren Themengebiete ab.
Es gilt zu beachten, dass das vorliegende Werk eine reine Vorlesungsausarbeitung darstellt,
kein Lehrbuch. Entsprechend ist es sprachlich eher knapp gehalten und inhaltlich sicher
an einigen Stellen weit weniger umfangreich als es ein entsprechendes Lehrbuch. Ich hoffe,
dass es trotzdem den Studierenden bei der Vor- und Nachbereitung des seminaristischen
Unterrichts, sowie der Prüfungsvorbereitung hilfreich sein wird. Es steht außer Frage, dass
dieses Skript keinesfalls den Vorlesungsbesuch ersetzt.
Dieses Skript stellt nur einen Teil der Unterlagen für die Vorlesung Digitaltechnik“ dar.
”
Zusätzlich werden Kopien der Folien aus der Vorlesung, sowie ausgewählte Dokumente
zum Labor (Aufgabenblätter, Datenblätter, Schaltpläne und Handbücher) zur Verfügung
gestellt. Vorlesung und Laborübungen sind aufeinander abgestimmt, wobei die praktischen
Übungen der Vertiefung des im Unterricht vermittelten Wissens dienen.
Im Labor werden kombinatorische und sequentielle Schaltungen entworfen, realisiert und
simuliert. Ferner werden die erzeugten Schaltungen synthetisiert und auf eine FPGA-
Hardware geladen. Als Entwicklungsumgebung werden ModelSim und Quartus II von
Altera verwendet. Die Handhabung der eingesetzten Software muss der Studierende mit
Eigenengagement bewerkstelligen. Die bereitgestellten Dokumente leisten einen helfenden
Beitrag dazu.
Zum Inhalt: Die Vorlesung Digitaltechnik“ baut inhaltlich auf der Veranstaltung Grund-
” ”
lagen digitaler Systeme“ auf. So wird empfohlen, die dort vermittelten Stoffinhalte vor
Teilnahme an dieser Veranstaltung zu wiederholen. Auch die empfohlene Fachliteratur ist
zur Vertiefung heranzuziehen.
Zur Form: Es hat sich im Sprachgebrauch etabliert, die englischen Fachbegriffe zu ver-
wenden. Teilweise macht eine deutsche Übersetzung keinen Sinn oder ist nicht möglich.
Sind deutsche Fachbegriffe vorhanden, so werden diese verwendet. Der englische Termino-
logie wird meist in Klammern ergänzt oder kursiv hervorgehoben. Das vorliegende Skript
basiert auf Fachliteratur und teilweise auf im Internet verfügbaren Unterlagen. Es ist
nicht möglich alle Quellen im Detail zu benennen. An dieser Stelle sei den Kollegen, Au-
toren und Helfern gedankt, die benannt oder unbenannt zum Gelingen dieses Skriptes
beigetragen haben.
Hinweis
Die Informationen in diesem Dokument werden ohne Rücksicht auf einen eventuellen Pa-
tentschutz veröffentlicht. Die erwähnten Soft- und Hardware-Bezeichnungen können auch
dann eingetragene Warenzeichen sein, wenn darauf nicht besonders hingewiesen wird. Sie
gehören den jeweiligen Warenzeicheninhabern und unterliegen gesetzlichen Bestimmun-
gen. Das Skript wurde mit größter Sorgfalt erstellt und korrigiert. Dennoch können Fehler
und Ungenauigkeiten nicht ausgeschlossen werden. Für fehlerhafte Angaben oder gar de-
ren Folgen wird keine juristische Verantwortung oder irgendeine Haftung übernommen.
Voraussetzungen
• Veranstaltung Grundlagen digitaler Systeme“
”
• Grundverständnis Logik
• Grundkenntnisse C/C++
• Grundverständnis E-Technik
• Freude an der Hardware
Abbildungsverzeichnis X
Tabellenverzeichnis XI
1 Einführung 1
1.1 Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Technische und mathematische Grundlagen . . . . . . . . . . . . . . . . . . 2
1.2.1 Gegenüberstellung von Analog- und Digitaltechnik . . . . . . . . . 2
1.2.2 Zahlensysteme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2.3 Komplementdarstellung . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.4 Fehlererkennung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.5 Elementare Logikverknüpfungen . . . . . . . . . . . . . . . . . . . . 8
3 Systematischer Schaltungsentwurf 30
3.1 Synchrone sequentielle Schaltungen . . . . . . . . . . . . . . . . . . . . . . 30
3.1.1 Beschreibung mittels Zeitverlaufsdiagramm . . . . . . . . . . . . . . 31
3.1.2 Beschreibung mittels Zustandsübergangsdiagramm . . . . . . . . . 31
3.2 Schaltungsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3 Schaltungsynthese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.4 Endliche Automaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.1 Mealy Automat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.2 Moore Automat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.4.3 Medwedjew Automat . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.4.4 Entwurfsmethoden für Automaten . . . . . . . . . . . . . . . . . . . 48
VI
Inhaltsverzeichnis
Literatur 129
VIII
Abbildungsverzeichnis
2.1 Funktionstabelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 Wahrheitstabelle RS-Latch mit NOR-Gattern . . . . . . . . . . . . . . . . 20
2.3 Wahrheitstabelle RS-Latch mit NAND-Gattern . . . . . . . . . . . . . . . 21
2.4 Wahrheitstabelle Gated RS-Latch . . . . . . . . . . . . . . . . . . . . . . . 21
2.5 Anregungstabelle für die gängigen Flipfloptypen . . . . . . . . . . . . . . . 24
2.6 Zahlenwerte für ein Philips Dual D-Flipflop 74AHC74 . . . . . . . . . . . . 26
XI
1 Einführung
1.1 Übersicht
Die Digitaltechnik ist heute ein Teilgebiet der Technischen Informatik, deren Aufgabe
es ist, Informationen zu verarbeiten und darzustellen. Über die letzten Jahrzehnte hat
dieses Gebiet immer mehr an Bedeutung gewonnen. Dies ist den wesentlichen Vorzügen
der Digitaltechnik zu verdanken, die es erlauben, sehr komplexe Systeme aufzubauen.
Das Grundkonzept besteht in der Verwendung eines eingeschränkten Zeichensatzes. Dafür
werden zwei Wertigkeiten verwendet, die je nach Verwendungsbereich in unterschiedlicher
Form dargestellt werden, wie in Tabelle 1.1 dargestellt.
Die in der Digitaltechnik übliche Repräsentationen in Form von 0“ und 1“ sind als Si-
” ”
gnalzustände mit entsprechend definierten Spannungspegeln zu verstehen. Diese können
in logischen Gattern mit stark nichtlinearem Übertragungsverhalten ohne Fehlerfortpflan-
zung übertragen werden. Letztlich wird dadurch eine relativ einfache physikalische Reali-
sierung ermöglicht, was der Digitaltechnik in den sechziger und siebziger Jahren letztlich
zum Durchbruch verholfen und die Verwendung von Halbleiter-Technologien zur Realisie-
rung von zigtausenden logischen Gattern auf einem Chip ermöglicht hat.
Anwendungsbereich Form
Digitaltechnik 0“ und 1“
” ”
Ausagenlogik wahr“ oder falsch“
” ”
Physik low“ oder high“
” ”
Tabelle 1.1: Darstellung der Wertigkeiten
Diese technische Entwicklung bildete schließlich die Grundlage für die Entwicklung und
Verwendung von Field Programmable Gate Arrays (FPGAs). FPGA sind integrierte elek-
tronische Bausteine, die durch Konfiguration beliebige digitale Schaltungen realisieren
können. Die Konfiguration1 erfolgt dabei auf der strukturellen Ebene durch eine anwen-
dungsspezifische Verschaltung der physikalisch auf dem FPGA vorhandenen Hardware-
elemente.
FPGAs haben durch ihr breites Anwendungsgebiet und ihre immer weiter steigende Inte-
grationsdichte die Welt der konfigurierbaren Logik bedeutend verändert. Moderne FPGAs
verfügen über sehr große Ressourcen von Logikgattern und RAM-Blöcken und ermöglichen
1
Oft wird im Zusammenhang mit FPGAs auch von Programmierung“ statt von Konfiguration“ gespro-
” ”
chen. Dies ist allerdings unpräzise bis falsch, da tatsächlich die Logik des FPGA durch den geschriebenen
Code konfiguriert und nicht programmiert wird. Daher wird in diesem Skript ausschließlich die korrekte
Terminologie des Konfigurierens“ benutzt.
”
1
KAPITEL 1. EINFÜHRUNG
somit auch sehr umfangreiche und komplexe Implementierungen. Für die Implementierung
effizienter FPGA-Designs ist es daher unumgänglich, die dazu gebräuchlichen Methoden
zu beherrschen.
Zur (textuellen) Beschreibung der Schaltungen werden sog. Hardwarebeschreibungsspra-
che (engl. Hardware Description Languages (HDL)) wie VHDL und Verilog genutzt. Für
die Verschaltung komplexerer Systeme setzt man mitunter auch graphische Entwicklungs-
werkzeuge (Matlab Simulink, Labview) und höhere Programmiersprachen (SystemC, Han-
delC, HLS) ein. Letztgenannte setzen jedoch eine etwas andere Herangehensweise und viel
Erfahrung und Kenntnisse in den Hardware-Compiler Methoden voraus, um effizient zu
arbeiten. Daher wird hier ausschließlich der klassische Entwurf mittels Hardwarebeschrei-
bungssprache anhand von VHDL behandelt. Bei VHDL handelt es sich um die in Europa
am weitesten verbreitete Sprache2 für den Hardware-Entwurf.
Der Entwurf digitaler Schaltungen, angefangen von simplen Grundschaltungen wie Zähler
oder Schieberegister bis hin zu komplexen Automaten fußt auf der Kenntnis elementarer
Methoden zur Schaltungsanalyse, -synthese und -beschreibung. Fundamentale Konzepte
zur Beherrschung großer Komplexität in Schaltungen wie die Automatentheorie sind da-
bei ebenso wichtig wie die elementaren Beschreibungs- sowie Berechnungsmethoden aus
der Boolschen Algebra. In Verbindung mit einem wachsenden Kenntnisstand in der Hard-
warebeschreibungssprache VHDL wird es bald jedem möglich sein, auch komplexe digitale
Schaltungen nach Zielvorgabe entwerfen und beurteilen zu können.
Die Vorlesung bereitet die wesentlichen Konzepte des Designs digitaler Schaltungen sowie
der Hardwarebeschreibungssprache VHDL auf und gibt eine Einführung in den Entwurf
digitaler Schaltungen und Systeme. Dabei wird der Bogen vom Logikentwurf auf Gat-
terebene bis hin zu komplexeren Systemen auf Register-Transfer-Ebene gespannt. Die
vermittelten Techniken und Methoden werden in den Übungen mit modernen Entwurfs-
werkzeugen praktisch umgesetzt.
2
Weltweit ist Verilog die am weitesten verbreitete HDL.
Digitale Größen sind physikalische Größen, die innerhalb eines bestimmten Dynamikbe-
reiches nur diskrete Werte annehmen können. Digitale Größen bestehen aus abzählbaren
Elementen und können mit hoher Genauigkeit dargestellt werden. Werden pro digita-
lem Signal nur zwei Zustäde unterschieden, spricht man von Binärsignalen. Ein einzelnes
binäres Zeichen wird als Bit (Abkürzung für engl. binary digit) bezeichnet.
Ein Bit ist die kleinste Einheit an Information und hat nur zwei mögliche Zustände:
an/aus oder 1/0 o.ä. Eine Information mit der Größe zwei Bit hat 22 = 4 Zustände, denn
jedes der beiden Bits kann 1 oder 0 sein (siehe Tabelle 1.2). Bei drei Bits sind es 23 = 8
Zustände und bei jedem weiteren Bit verdoppelt sich die Zahl der Möglichkeiten. Die
Anzahl verschiedener Werte, die in n Bits darstellbar sind, beträgt 2n .
In der üblichen Schreibweise werden die einzelnen Bits von rechts nach links abgezählt.
MSB“ (Abk. für engl.: Most Significant Bit) nennt man das höchstwertige Bit (ganz links,
”
Bit 7), LSB“ (Abk. für engl.: Least Significant Bit) das niederwertigste (ganz rechts, Bit
”
0). Mit 8 Bits sind bereits 28 = 256 Zustände darstellbar. Heutzutage sind Bytes die
kleinsten adressierbaren Speichereinheiten. Kleinere Einheiten müssen aus einem Byte
extrahiert werden.
Bit 1 Bit 0
0 0 Zustand 0
0 1 Zustand 1
1 0 Zustand 2
1 1 Zustand 3
Digitale Signale können also durch entprechende Erweiterung der Bitbreite in ihrem Dy-
namikbereich beliebig genau gemacht werden und sind weniger störanfällig als analoge
Signale. Zudem sind durch entsprechende Codierungen viele verschiedene Anwendungen
möglich und die Informationen können direkt mit Hilfe von digitalen Gattern verarbei-
tet werden. Der technische Fortschritt bei der Miniaturisierung der Komponenten der
Digitaltechnik gestattet schließlich eine effiziente Realisierung des hohen Aufwands.
1.2.2 Zahlensysteme
S = {s0 , s1 , · · · , sr−1 }
geschrieben werden, wobei xi ∈ S. (Das tiefgestellte r kann entfallen, wenn die Basis
implizit bekannt ist). Der Wert von X ist somit definiert als:
m
X
W ert(X) = xi r i
i=−n
Ein Zahlensystem, das jeder im täglichen Gebrauch hat, ist das Dezimalsystem (r = 10)
mit dem Zeichenvorrat di ∈ {0, 1, 2, · · · , 9}. Als Beispiel ergibt sich für X = 123, 4510 die
Gewichtung der einzelnen Stellen zu:
Eine n-Bit Binärzahl X = xn−1 xn−2 · · · x1 x0 kann einen beliebigen ganzzahligen Wert
im Bereich 0 ≤ X ≤ 2n − 1 darstellen (z.B. wenn n = 3, dann 0 ≤ X ≤ 7). Um allerdings
den Wert X = 2n darzustellen, sind schon n + 1 Bits nötig.
Das Oktalsystem ist ein Stellenwertsystem mit der Basis r = 8 mit oi ∈
{0, 1, 2, 3, 4, 5, 6, 7}. Der Wert X = 736, 48 entspricht
W ert(X) = 7 × 82 + 3 × 81 + 6 × 80 + 4 × 8−1
= (448 + 24 + 6 + 0.5)10 = 478, 510
Oktalzahlen werden gern benutzt, weil die Umwandlung vom und ins Binärsystem einfach
ist. Jede Ziffer einer Oktalzahl kann durch drei Bit dargestellt werden und umgekehrt.
Ähnliches gilt für das Hexadezimalsystem und die Gruppierung in vier Bit, was einer
übersichtlicheren Darstellung von großen dualen Zahlen dient. Für die Digitaltechnik ist
die binäre Darstellung von elementarer Bedeutung interessant. Der Übersicht halber wird
bei größeren Zahlen gern die Hexadezimaldarstellung gewählt.
Im Hexadezimalsystem (r = 16) werden als Ziffern hi ∈ {0, 1, · · · , 8, 9, A, B, C, D, E, F }
definiert. So steckt hinter der Zahl X = F 3, B16 der Wert
Durch das Prinzip der Wertigkeit der einzelnen Stellen zur Basis (r = 2) ist eine Umrech-
nung von Binär- zu Dezimaldarstellung relativ simpel. Umgekehrt gilt für die Umwand-
lung von Dezimal- zu Binär-, Oktal- und Hexadezimaldarstellung folgendes Schema, das
in Tabelle 1.3 anhand eines Beispiels der Umwandlung der Dezimalzahl 41.687510 in die
Binärdarstellung illustriert wird.
Aus Tabelle 1.3 ist zu ersehen, dass die Umwandlung 41, 687510 = 0101001, 10112 er-
gibt. Die Umwandlung ins Oktal- und Hexadezimalsystem gestaltet sich dann als simples
Zusammenfassen von 3 Bits (Oktalsystem) bzw. 4 Bits (Hexadezimalsystem):
Daraus lässt sich verallgemeinernd folgende systematische Methodik ableiten: Wenn ein
Wert X in einem bestimmten Zahlensystem vorliegt und dieser in ein anderes Basissystem
r konvertiert werden soll, müssen zunächst alle xi in dem Ausdruck gefunden werden:
W ert(Xint ) = x4 r4 + x3 r3 + x2 r2 + x1 r + x0 = (((x4 r + x3 )r + x2 )r + x1 )r + x0
Dividiert man diesen durch r, so erhält man x0 als Rest. Wird der vorige Quotient weiter
durch r geteilt, erscheinen die nachfolgenden xi (i = 1, 2, · · ·) jeweils als Rest. Für die
Umrechnung werden die Ergebnisse also so lange durch r dividiert bis das Ergebnis Null
ist. Der Rest ist dann das Ergebnis.
Für den gebrochenen Anteil erfolgt die Umrechnung umgekehrt, also nicht durch Division,
sondern durch Multiplikation. Der gebrochene Anteil von X beträgt
W ert(Xf rac ) = x−1 r−1 +x−2 r−2 +x−3 r−3 +x−4 r−4 = r−1 (x−1 +r−1 (x−2 +r−1 (x−3 +r−1 x−4 )))
Wird dieser mit r multipliziert, entsteht x−1 als ganzzahliger Anteil des Produkts. Multi-
pliziert man den Bruchteil des vorigen Produkts weiter mit r, erhält man die nachfolgenden
xi (i = −2, −3, · · ·) als weitere ganze Zahlen des Produkts.
3
Ausgehend von der höchsten Wertigkeit wird durch sukzessive durch Subtraktion geprüft, welche Zahlen
zur Darstellung des Wertes aus dem Binärsystem nötig sind und diese werden anschließend zusammen-
gefügt: 41 − 32 = 9; 9 − 8 = 1; 0.6875 − 0.5 = 0.1875; 0.1875 − 0.125 = 0.0625.
1.2.3 Komplementdarstellung
In Hardware ist die Anzahl der Bits n für die Darstellung eines ganzzahligen Wertes
festgeschrieben. Jeder Wert, der mehr als n Bits erfordert, kann nicht korrekt in n Bits
dargestellt werden.
Das Einerkomplement einer n-Bit Binärzahl X = bn−1 · · · b1 b0 ist definiert als:
Dies ist entspricht einfach der bitweisen Vertauschung von von X (1 → 0, 0 → 1).
Das Zweierkomplement einer n-Bit Binärzahl X = bn−1 · · · b1 b0 ist definiert als
2n − X = (2n − 1 − X) + 1 = 2n − 1 − (X − 1)
Es gilt zu beachten, dass die Komplementdarstellung immer auf der Anzahl verfügbarer
Bits n basiert. Das Komplement von Null ist zudem immer noch Null. Bei der Bildung
des Komplements des Komplements entsteht wieder der ursprüngliche Wert, wie folgende
Umwandlung zeigt:
X = 2n − X, X = 2n − X = 2n − (2n − X) = X
Somit kann das MSB als das Vorzeichenbit gedeutet werden, das angibt, ob die Zahl positiv
(M SB = 0) oder negativ (M SB = 1) ist. Für die Vorzeichenerweiterung gilt dann, dass
eine beliebige Anzahl von Nullen einer gegebenen positiven Zahl vorangesetzt werden
kann, ohne deren Wert zu verändern. Ebenso kann eine beliebige Anzahl von Einsen
hinzugefügt werden, wenn die Zahl in der Zweierkomplementdarstellung vorliegt.
Zusammenfassend gilt für den Bereich der im Zweierkomplement darstellbaren Werte:
−2n−1 ≤ X ≤ (2n−1 − 1)
1.2.4 Fehlererkennung
Neben der Darstellung von Zahlen in Hardware ist auch die Übertragung von Da-
ten von Bedeutung, bei der davon ausgegangen werden muss, dass Störungen auf den
Übertragungswegen zu auftretenden Bitfehlern führen. Ursachen dafür können Störsignale
von außen, Spannungsspitzen aus dem Rauschen aktiver Bauelemente oder auch statische
oder dynamische Fehler in digitalen Speichern sein.
Zur Erkennung solcher Bitfehler können spezielle Codes verwendet werden, die man -
je nach Komplexität und Verhalten - fehlererkennende oder fehlerkorrigierende Codes
nennt.
Die einfachste Form der Fehlererkennung ist die Erweiterung des zu übertragenden Bit-
musters um ein weiteres Bit (Prüfbit), das sogenannte Paritätsbit (Parity Bit). Mit dem
Paritätsbit wird die Anzahl der in der Bitfolge vorkommenden Bits auf eine gerade oder
ungerade Anzahl ergänzt. Je nachdem spricht man von einer geraden Parität (even parity)
oder einer ungeraden Parität (odd parity).
In Tabelle 1.4 ist als Beispiel eine Liste von Binärzahlen (von 0 bis 15) mit den Paritätsbits
für gerade (even) und ungerade (odd) Parität aufgeführt.
Mithilfe des Parity Bits können Einbitfehler erkannt werden. Das Auftreten von Zweibit-
fehlern würde allerdings nicht erkannt werden, weil diese sich in der Erkennung aufheben
würden. Die Erkennung von drei fehlerhaften Bits (oder allgemein: ungeraden Mehrfach-
fehlern) ist dagegen möglich.
Eine Fehlerkorrektur ist durch die Erweiterung mittels Parity Bit nicht möglich. Da-
zu bedarf es fehlerkorrigierender Codes. Diese sind ähnlich aufgebaut, jedoch mathe-
matisch komplexer4 , da sie eine eindeutige Bestimmung der Position des aufgetretenen
Fehlers ermöglichen müssen. Ein Beispiel für einen fehlerkorrigierenden Code ist der sog.
Hamming-Code (vgl. Grundlagen digitaler Systeme“).
”
Logische Verknüpfungen sind in der Aussagenlogik bzw. Booleschen Algebra sehr wichtig.
In ihrer Implementierung als Logikgatter sind sie auch ein ganz elementarer Bestandteil
der Digitaltechnik. Dort dienen sie dazu, verschiedene digitale Signale logisch zu ver-
knüpfen.
In der folgenden Darstellung werden abgesehen von der NOT-Verknüpfung nur Ver-
knüpfungen von zwei Variablen betrachtet. Ebenso wird die positive Logik“ vorausge-
”
setzt, bei der der Zustand LOW der logischen 0 und der Zustand HIGH der logischen 1
entspricht.
Für eine AND-Verknüpfung (Konjunktion) mit zwei Eingangsbedingungen (auch Ein-
gangsvariablen genannt) gibt es vier Kombinationsmöglichkeiten, wie in Tabelle 1.5 zu
sehen. Nur wenn beide Eingangsvariablen gesetzt sind, ergibt sich für das Ergebnis Y der
Wert 1.
x1 x0 y
0 0 0
0 1 0
1 0 0
1 1 1
4
An dieser Stelle sei auf die Wahlfachvorlesung Kanal- und Quellencodierung“ im Bachelor-Studiengang
”
Technische Informatik an der Berliner Hochschule für Technik, die jeweils im Wintersemester von mir
gehalten wird.
Bei der in Tabelle 1.6 gezeigten OR-Verknüpfung (Disjunktion) wird das Ergebnis Y auf
1 gesetzt, falls mindestens eine der Eingangsvariablen den Wert 1 besitzt.
x1 x0 y
0 0 0
0 1 1
1 0 1
1 1 1
Das Ergebnis Y der NAND-Verknüpfung zeigt nur dann eine 0, wenn beide Eingangs-
variablen gesetzt sind. Für alle anderen Kombinationen erscheint eine 1 als Ergebnis.
Tabelle 1.7 zeigt die zugehörige Wahrheitstabelle.
x1 x0 y
0 0 1
0 1 1
1 0 1
1 1 0
Bei der NOR-Verknüpfung (Tabelle 1.8) tritt als Ergebnis immer dann eine 0 auf, wenn
mindestens eine Eingangsvariable den Wert 1 hat.
x1 x0 y
0 0 1
0 1 0
1 0 0
1 1 0
Bei der XOR-Verknüpfung (Antivalenz) ist das Ergebnis immer dann 1, wenn nur (genau)
eine Eingangsvariable eine 1 führt, d.h. die Eingangsvariablen unterschiedliche Werte be-
sitzen wie in Tabelle 1.9 dargestellt. Dies lässt sich leicht merken, da das Schaltsymbol
nach DIN-Norm eine =1“ zeigt.
”
x1 x0 y
0 0 0
0 1 1
1 0 1
1 1 0
Für die in Tabelle 1.10 gezeigte XNOR-Verknüpfung gilt, dass nur der gleiche Zustand (0
oder 1) bei den Eingangsvariablen zu einer 1 am Ausgang führt. Auch dies ist leicht zu
behalten, da das Schaltsymbol das Gleichzeichen zeigt.
x1 x0 y
0 0 1
0 1 0
1 0 0
1 1 1
Bei der NOT-Verknüpfung (Negation) wird einfach der Wert der Eingangsvariable im
Ergebnis invertiert.
Alle hier gezeigten Verknüpfungen können schaltungstechnisch auf verschiedene Arten
realisiert werden, z.B. durch Dioden und Transistoren (sog. DTL-Technik) oder mittels
Feldeffekttransistoren (FETs in MOS- oder CMOS-Technik). Darauf wird ausführlich in
einem späteren Kapitel eingegangen.
Die bis hierhin dargestellten Sachverhalte sollen als Wiederholung von bereits vermittel-
tem Grundlagenwiessen einen Einstieg in das Themengebiet erleichtern und zum fundier-
ten Verständnis und zur sicheren Anwendung in den nun folgenden Themenkomplexen
rund um den Logikentwurf, die Analyse und Beschreibung, sowie systematische Entwick-
lung von digitalen Schaltungen beitragen.
Einschlägige Kenntnisse in der Booleschen Algebra und Aussagelogik aus der Vorlesung
Grundlagen digitaler Systeme“ werden vorausgesetzt, ebenso ein mathematisches Grund-
”
verständnis, sowie Grundlagenkenntnisse der Elektrotechnik.
In diesem Kapitel sollen die elementaren Grundlagen und Methoden beschrieben wer-
den, mit denen sich Funktionen in Form digitaler Hardware-Schaltungen beschreiben und
umsetzen lassen. Neben den Unterscheidungsmerkmalen zwischen kombinatorischen und
sequentiellen Schaltungen wird hier auch der Einstieg in die Hardwarebeschreibungsspra-
che VHDL gegeben.
5
Die Begriffe logische Funktion“, Schaltfunktion“ und Boolesche Funktion“ werden in der Regel – und
” ” ”
so auch hier – synonym verwendet.
11
KAPITEL 2. GRUNDLAGEN DER DIGITALTECHNIK
Die Vereinfachung einer gegebenen Schaltfunktion (entweder als boolescher Ausdruck oder
als Wahrheitstabelle) ist in der Regel immer empfehlenswert, da so der Aufwand zur
Realisierung der Funktion in Bezug auf die Anzahl der logischen Gatter und die Anzahl
der zur Darstellung der Funktion erforderlichen Eingänge zu diesen Gattern reduziert
werden kann.
Zur Vereinfachung logischer Funktionen können folgende Ansätze angewendet werden:
• Algebraische Vereinfachung
• Vereinfachung mit KV-Tafeln
• Verfahren nach Quine und McClusky
Die Methode der algebraischen Vereinfachung nutzt die Sätze der Booleschen Algebra,
um die gegebene Schaltfunktion durch Ausklammern, Kürzen, Zusammenfassen, u.a. zu
vereinfachen. Diese Methode kann bei langen Funktionsgleichungen sehr umständlich und
unübersichtlich werden.
Die Vereinfachung mit KV-Tafeln zählt zu den graphischen Methoden, da hier die Wahr-
heitstabelle der logischen Funktion graphisch dargestellt wird. Sie wird in Abhängigkeit
der Anzahl der Eingangsvariablen (n) in eine entsprechende Anzahl (2n ) von Feldern
unterteilt, von denen jedes entweder einen Minterm oder Maxterm repräsentiert. Die Zu-
ordnung der Felder erfolgt so, dass sich zwischen benachbarten Feldern immer genau nur
eine Eingangskombination unterscheidet. Durch Zusammenfassen benachbarter Felder in
Größen von Zweierpotenzen und damit Wegfall von Variablenabhängigkeiten entstehen
so kürzere Ausdrücke für die Funktion. Diese Methode ist sehr komfortabel und gelingt
in der Regel immer. Ab einer Anzahl von 6 Eingangsvariablen wird diese Methode jedoch
unübersichtlich und nicht mehr praktikabel.
6
Üblich ist die Internationale Norm DIN EN 60617-12, sowie die Amerikanische Norm ANSI 91-1984. In
der Literatur findet sich auch häufig noch die frühere deutsche Norm DIN 40700. In diesem Skript, sowie
im Unterricht werden nur die Symbole nach DIN EN 60617-12 verwendet.
Das Verfahren nach Quine und McClusky (auch: tabellarische Methode) ist ein systema-
tisches Minimierungsverfahren und eignet sich daher sehr gut für den Einsatz in Compu-
teralgorithmen, nicht zuletzt, da sich deterministisch bestimmen lässt, ob die minimale
Form einer Booleschen Funktion erreicht ist. Zudem ist die Methode für beliebig viele
Eingangsvariablen anwendbar. Die Grundidee basiert analog zur KV-Tafel auf dem Zu-
sammenfassen von Termen, die in genau einer Variablen komplementär belegt sind. Dazu
müssen zunächst alle Minterme ermittelt und im nächsten Schritt zur Vereinfachung aus-
gewählt werden. Diesen Vorgang wiederholt man rekursiv in mehreren Stufen so lange,
bis keine weiteren Vereinfachugen mehr möglich sind.
x2 x1 x0 y
0 0 0 0
0 0 1 1
0 1 0 0
0 1 1 1
1 0 0 1
1 0 1 0
1 1 0 1
1 1 1 1
y = m1 ∨ m3 ∨ m4 ∨ m6 ∨ m7
= (x2 ∧ x1 ∧ x0 ) ∨ (x2 ∧ x1 ∧ x0 ) ∨ (x2 ∧ x1 ∧ x0 ) ∨ (x2 ∧ x1 ∧ x0 ) ∨ (x2 ∧ x1 ∧ x0 )
Die Funktion lässt sich durch die in Abbildung 2.1 gezeigte Schaltung beschreiben. Wie
für alle Normalformen üblich, weist die Schaltung eine zweistufige Struktur auf. Die erste
Stufe wird durch die Konjunktionen gebildet, die zweite Stufe durch die Disjunktion der
Ergebnisse aus der ersten Stufe. Auf eine Vereinfachung wird hier verzichtet. Stattdessen
soll der Fokus auf eine Darstellung in VHDL gerichtet werden.
Ein VHDL-Modell besteht aus einer Entity Deklaration und der Definition einer (oder
mehrerer) Architectures. Die Entity ist als Black Box zu verstehen und kapselt die gesamte
Schaltung (ohne Details über deren Implementierung). Zudem definiert die Entity den
Namen der Entwurfseinheit, sowie die Schnittstellen zu ihrer Umgebung, unterteilt nach
Richtungen (in oder out).
Die Architecture definiert die Funktion der Schaltung. Dies kann auf verschiedenen Ab-
straktionsebenen erfolgen. Abbildung 2.2 stellt anschaulich die Entsprechungen von Entity
und Architecture in der Schaltung dar.
x2 x1 x0
1 1 1
&
&
& >=1 y
&
&
Listing 2.1 zeigt die komplette VHDL Beschreibung der Beispielschaltung. Der benutzer-
definierte7 Name der Entity lautet Normalform“. Unter diesem, d.h. dem gleichen Namen
”
wie in der Entity angegeben, muss die Datei mit der Endung .vhd“ auch gespeichert sein,
”
da nur so eine eindeutige Referenzierung möglich ist. In VHDL wird grundsätzlich nicht
zwischen Groß- und Kleinschreibung unterschieden. Daher sollte man selbst konsequent
in der Benennung und Kennzeichnung sein.
In der Port Deklaration sind die Schnittstellen definiert, die von der Entwurfseinheit
zur Kommunikation mit ihrer Umgebung verwendet werden. Das Semikolon dient als
Trennzeichen. Zudem ist der Datentyp (hier: bit“) und die Richtung des Datenflusses
”
über den Port definiert. Der Wertevorrat des Datentyps bit“ besteht aus den logischen
”
Werten 0 und 1.
Neben den Richtungen IN (Eingang zur Entity) und OUT (Ausgang von Entity) gibt es
noch die Modi INOUT (Ein- oder Ausgang), sowie BUFFER. Die zwei letztgenannten
sollten von Anfängern jedoch vermieden werden, da sie in der Anwendung problematisch
sind und einige Erfahrung im Umgang erfordern.
INOUT und BUFFER erlauben beide das Zurücklesen eines Wertes von einem Ausgang.
7
Für benutzerdefinierte Benennungen von Entities, Architectures, Ports und Signalen, etc. gilt, dass diese
immer mit einem Buchstaben beginnen müssen, aus Buchstaben, Ziffern und Unterstrichen bestehen
können und keine reservieren Schlüsselwörter (wie z.B. Begin“, End“, Signal“, Variable“, etc. sein
” ” ” ”
dürfen.
&
&
Ausgangs-
port
& >=1 y
&
&
Dabei entspricht der Modus BUFFER einfach einem Register, d.h. hier wird der Ausga-
bewert zusätzlich gespeichert, um ihn später zurücklesen zu können. Ein Einlesen des an
den Port angelegten externen Signalwertes ist allerdings nicht möglich. Der Modus IN-
OUT setzt dagegen einen Tri-State Buffer voraus. Die meisten FPGAs verfügen allerdings
über keine internen Tri-State-Puffer außer an der externen Schnittstelle zum Chip. Wird
dieses Konstrukt dennoch also verwendet, führt dies zu einer unverhältnismäßig erhöhten
Hardware-Komplexität, da das Verhalten mit den in der regulären Logik vorhandenen
Ressourcen nachgebildet werden muss. Bei der Verwendung ist zudem Sorgfalt geboten,
denn es existieren zwei separate Treiber für ein einzelnes Signal. Daher muss das Signal
immer explizit auf hochohmig gestellt werden, um den Wert eines externen Signals lesen
zu können und umgekehrt.
Die Architecture beschreibt die Implementierung der Funktion. Wie die Entity verfügt
auch die Architecture über einen benutzerdefinierten Namen, der eindeutig das jeweilige
Architekturmodell beschreibt. Wie in Listing 2.1 gezeigt, wird die Architecture mit Namen
DNF“ in der ersten Zeile durch das Schlüsselwort OF“ mit der Entity verknüpft.
” ”
Innerhalb der Architecture sind hier fünf Signale definiert, die der Verknüpfung der Min-
terme in der letzten Anweisungszeile dienen. Sie sind durch das Schlüsselwort Signal“
”
in der Architekturbeschreibung definiert und nur hier verfügbar. Signale benötigen keine
Richtungsangabe, wohl aber die Angabe eines Datentypes. Bei Zuweisungen von Port-
signalen zu internen Signalen und vice versa ist auf die Verwendung von gleichen Da-
tentypen zu achten. Die Zuweisung von Signalen erfolgt durch den Zuweisungsoperator
<=. Links steht das Ziel der Zuweisung, rechts vom Zuweisungsoperator der oder die
Signalnamen, von denen der Wert ausgeht.
In kombinatorischen Beschreibungen, d.h. Zuweisungen von Kombinationen von Eingangs-
werten durch Gatter und Negatoren ohne Rückkopplung und Speicherelemente, die zu
ENTITY Normalform IS
PORT ( X0 , X1 , X2 : IN bit ; -- Eingangsports
Y : OUT bit -- Ausgangsport
);
END Normalform ;
SIGNAL m1 , m3 , m4 , m6 , m7 : bit ;
BEGIN
m1 <= ( NOT X2 ) AND ( NOT X1 ) AND X0 ;
m3 <= ( NOT X2 ) AND X1 AND X0 ;
m4 <= X2 AND ( NOT X1 ) AND ( NOT X0 ) ;
m6 <= X2 AND X1 AND ( NOT X0 ) ;
m7 <= X2 AND X1 AND X0 ;
Y <= m1 OR m3 OR m4 OR m6 OR m7 ;
END DNF ;
Ai = fi (E1 , · · · , En )
Für jeden Eingangszustand existiert genau ein Ausgangszustand (vgl. Abbildung 2.3).
Kombinatorische Schaltungen können zum Aufbau von Schaltungen einfacher Logik ver-
wendet werden.
Schaltnetz
E A
0 & 0 >=1
0 0
0 0
A=f(E)
E1 A1
E2 A2
E= E3 A= A3
En An
Schaltwerke bestehen aus kombinatorischer Logik und einer verzögerten Rückführung mit
Speicherelementen. Sie verfügen ebenfalls über n Eingänge E = {E1 , · · · , En } und n
Ausgänge A = {A1 , · · · , An }, hier stellt zu jedem beliebigen Zeitpunkt der Ausgang Ai
aber eine Funktion nicht nur des aktuellen Eingangs, sondern auch der vorangegangenen
Eingangszustände dar:
Für jeden Eingangszustand ist also mehr als ein Ausgangszustand möglich (vgl. Abbil-
dung 2.4).
Schaltwerk
E A
0 & 0 >=1
0 0
0 0
A(tn)=f(E(tn),E(tn-1),…,E(t0))
E1 A1
E2 A2
E= E3 A= A3
En An
Als elementaren Gegensatz hat das Schaltwerk also ein Gedächtnis bzw. einen inneren
”
Zustand“. Dies ist der Grund weshalb man auch von sequentieller Logik spricht: Hier wird
eine Sequenz an Eingängen verarbeitet. Dies setzt die Fähigkeit zur Speicherung dieser
inneren Zustände (gewissermaßen der Vorgeschichte“ der Schaltung) voraus, skizziert in
”
Abbildung 2.5.
Schaltwerk
E A
0 & 0 >=1
0 0
0 0
Kombinatorische
Schaltung
Zustands-
variable
Speicher oder
Verzögerung
Je nachdem welche Art von Speicherelementen zur Speicherung und Rückführung dieser
Zustandsvariablen verwendet werden, können die Schaltwerk entweder synchron (taktge-
steuert) oder asynchron arbeiten. Grundsätzlich unterscheidet man zwischen zwei Vari-
anten:
• einfache Rückkopplung oder Verwendung von Latches (asynchrone seq. Logik)
• Verwendung getakteter Flipflops (synchrone sequentielle Logik)
Mit sequentiellen Schaltungen können sehr komplexe Logiksysteme realisiert werden.
R
>=1 Q
>=1 Q
S
S R Qn+1 Qn+1
0 0 Qn Qn
0 1 0 1
1 0 1 0
1 1 0 0
Wenn die Wirkung des Latches durch ein zusätzliches Freigabesignal synchronisiert wer-
den soll, können gemäß Abbildung 2.8 zwei zusätzliche AND-Gatter mit einem gemein-
samen Eingang EN (für engl. Enable) zusammen mit den beiden Eingängen R und S
verwendet werden. Wenn EN = 0, bleibt das Latch unverändert oder deaktiviert, sein
Ausgang ist unabhängig von den Eingängen R und S. Der Ausgangszustand wird verrie-
gelt. Wenn EN = 1, wird das Latch jedoch aktiviert, um auf R und S zu reagieren. Es ist
dann schaltfähig. Dieses Latch mit zweistufigem Aufbau wird Gated RS-Latch genannt.
Tabelle 2.4 stellt das Schaltverhalten dar. X bedeutet don’t care“.
”
S
& Q
& Q
R
Besonderes Augenmerk soll nun auf das Verhalten des RS-Latches gerichtet werden für
den Fall, dass beide Eingänge R und S aktiviert sind. Wenn EN = 1, sind beide
Ausgänge Qn+1 und Qn+1 auf 1. Wenn EN auf 0 geht, haben beide NAND-Gatter an
ihren Eingängen zwei Einsen, so dass sowohl Qn+1 als auch Qn+1 auf 0 gehen. Aber auf-
grund der Rückkopplungen versuchen beide, den anderen auf 1 zu setzen. Dies stellt eine
instabile Situation dar, die schließlich auf der Grundlage der Asymmetrie der beiden Gates
mit unvorhersehbarem Ausgang aufgelöst wird.
S R Qn+1 Qn+1
1 1 Qn Qn
1 0 0 1
0 1 1 0
0 0 1 1
S
&
& Q
S Q
EN EN
R Q
& Q
&
R
EN S R Qn+1 Qn+1
0 X X Qn Qn
1 0 0 Qn Qn
1 0 1 0 1
1 1 0 1 0
1 1 1 1 1
Alle bisher gezeigten Schaltungen sind pegelgetriggert, d.h. die Schaltungen sind immer
aktiv, wenn das Enable-Signal auf 1 ist. Folglich können die Eingänge während der ge-
samten aktiven Phase die Ausgänge beeinflussen und es kann zu unvorhersehbaren oder
ungewünschten Ausgangssignalen kommen, je nachdem, wann genau das Enable-Signal
inaktiv wird. Um dies zu vermeiden, können die Schaltungen flankengetriggert realisiert
werden. Der Ausgang wird dann nicht durch den Pegel, sondern durch die (steigende oder
fallende) Flanke des Taktsignals bestimmt. Dies setzt eine entsprechende Flankenerken-
nung voraus. Abbildung 2.10 illustriert die Funktionsweise der Flankenerkennung.
D
&
& Q
D Q
EN EN
Q
& Q
&
1
Takt Takt
& Takt* & Takt*
1 1
Takt Takt
Takt Takt
Takt Takt
Takt* Takt*
Grundsätzlich kann eine Flankensteuerung sowohl bei der steigenden (positiven), als auch
bei der fallenden (negativen) Flanke stattfinden. Auf welche Flanke das Flipflop reagiert
ist eindeutig aus der Kennzeichnung des Takteinganges (als Takt oder Clock bezeichnet)
im Schaltzeichen ersichtlich. Ist der Eingang negiert, reagiert das Flipflop auf die negative
Flanke. Ist keine Negierung eingezeichnet, reagiert das Flipflop auf die positive Flanke.
Abbildung 2.12 zeigt eine Übersicht der wichtigsten Flipfloptypen und deren Schaltzei-
chen.
Störung
Daten
Takt
Latch
Ausgang
Flipflop
Ausgang
Positiv-flankengetriggerte Flipflops
S Q D Q J Q
R Q Q K Q
Symbol am
Takteingang
Negativ-flankengetriggerte Flipflops negativer
Logikpunkt
S Q D Q J Q
R Q Q K Q
Daraus resultiert eine weitere Abwandlung, nämlich die Realisierung eines T-Flipflops. Bei
diesem sind die Eingänge J und K zu einem einzigen Eingang namens T zusammengefasst.
Dadurch werden wiederum zwei der vier Fälle mit unterschiedlichen Inputs (J = K)
eliminiert. Bei Aktivierung des Flipflops durch T = 1 schaltet der Ausgang jeweils auf
den invertierten Wert um.
J
&
& Q
Takt
&
1
& Q
&
K
Zusammenfassend stellt Tabelle 2.5 die verschiedenen Typen von Flipflops anhand ihrer
Funktionsweise dar. Die linke Seite zeigt den gewünschten Übergang von Qn → Qn+1 ,
die rechte Seite gibt die Triggersignale der verschiedenen Flipfloptypen an, die für die
Übergänge benötigt werden. In der Praxis kommt häufig jeweils noch ein asynchroner
Eingänge zum Setzen (Preset) und Löschen (Clear) hinzu.
Übergang D T J K S R
0→0 0 0 0 X 0 X
0→1 1 1 1 X 1 0
1→0 0 1 X 1 0 1
1→1 1 0 X 0 X 0
tp
Takt
t
Q
t
Jede logische Schaltung hat eine endliche Verzögerungszeit. Das Propagation Delay tp
ist die charakteristische Zeit, die ein Signal benötigt, um vom Eingang des Gatters zu
dessen Ausgang zu gelangen. Für ein Flipflop entspricht das der Zeit, um dessen Ausgang
nach der aktiven Taktflanke, die letzlich der Übernahme der Daten am Eingang dient,
zu ändern. Das Propagation Delay wird normalerweise zwischen den 50%-Signalpegeln
definiert, wie in Abbildung 2.14 dargestellt.
In einer kombinatorischen Schaltung mit mehreren Stufen ist das Propagation Delay die
Summe der Propagation Delays durch jedes Element im sog. kritischen Pfad. Dieser be-
schreibt in der Schaltungstechnik den zeitlich längsten“ Pfad zwischen Ein- und Ausgang,
”
der die größte Gesamtverzögerung aufweist.
ts th
Takt
t
Daten müssen in der Setup-
und Hold-Phase stabil sein
D
t
Daten können Daten können
sich ändern sich ändern
Die Setup-Zeit ts (auch Vorbereitungszeit, Einschwingzeit oder engl. Setup Time) definiert
die minimale Zeitspanne, in der der Dateneingang vor der aktiven Flanke8 des Taktsignals
stabil sein muss, damit die Daten vom Taktsignal korrekt abgetastet und übernommen
werden können.
Die Haltezeit th (engl. Hold Time) definiert die Zeitspanne, in der der Dateneingang nach
der aktiven Flanke des Taktsignals immer noch stabil anliegen muss, damit die Daten vom
Taktsignal korrekt abgetastet und übernommen werden können. Beide charakterischen
Zeitspannen sind in Abbildung 2.15 dargestellt.
Das Zusammenspiel aller dynamischen Kenndaten sind in Abbildung 2.16 am Beispiel
eines D-Flipflops noch einmal zusammengefasst.
ts th
Takt
t
D
t
t pLH
Q
t
8
Dies kann die steigende oder fallende Taktflanke sein, je nach Schaltung bzw. Komponenten.
x D Q D Q z
1
Q Q
Clock
Als Beispiel für die Berechnung der maximalen Taktfrequenz für eine gegebene Schal-
tung dient Abbildung 2.17 mit den exemplarischen Werten tpF F = 10ns, tpN OT = 8ns,
tsF F = 5ns und thF F = 0, 5ns. Für die minimale Taktperiode Tmin ist die Summe aller
Verzögerungszeiten entscheidend:
Da beide Flipflops durch den gleichen Takt versorgt werden, ändern auch beide gleichzeitig
ihren Wert, so dass in der Rechnung aufgrund des identischen Timings nur ein Flipflop
berücksichtigt ist. Durch die Bildung des Kehrwertes erhält man die maximal zulässige
Taktfrequenz für diese Schaltung:
1 1
fmax = = = 43, 48M Hz
Tmin 23ns
Da das Propagation Delay zwischen Eingang und Ausgang in der Regel größer ist als die
zugrundeliegende Haltezeit der verwendeten synchronen Elemente, sind Verletzungen der
Haltezeit in der Regel weitaus weniger problematisch, sollten aber dennoch in Betracht
gezogen werden, da jede Verletzung der dynamischen Kennwerte mit hoher Wahrschein-
lichkeit zu einem falschen oder unvorhersehbaren Verhalten der Schaltung führt. Diese
Größenbeziehung th << tp ist letztlich der Schlüssel dazu, dass eine direkte Kopplung
von Flipflop-Ausgängen auf Flipflop-Eingänge in einem synchronen System möglich ist.
Natürlich gilt dies unter der Maßgabe, dass evtl. mögliche Taktverschiebungen (engl. Clock
Skew ) vermieden werden.
Tabelle 2.6 zeigt reale Zahlenwerte für die dynamischen Kenndaten am Beispiel einer
Advance High Density (AHC) CMOS-Logikfamilie [Phil99].
ts th tpLH tpHL
6 ns 0,5 ns 11,9 ns 11,9 ns
Das Propagation Delay tp trägt offensichtlich am meisten zur Verzögerung bei und hängt
in der Regel von der eingesetzten Schaltungstechnologie und damit auch von der Belastung
der Schaltung ab, d.h. davon wie viel Last die Schaltung treiben muss. Dies wiederum
hängt vom Leitungswiderstand und der kapazitiven Last ab. Entscheidend ist hier also die
Anzahl der an einem einzigen Ausgang angeschlossenen Gatter, die Länge der Leiterbahn
und schließlich auch die Dielektrizitätskonstante des Substratmaterials auf einem PCB
(engl. Printed Circuit Board ).
2.5.1 Schieberegister
serieller D Q D Q D Q D Q
Dateneingang
Q Q Q Q
Takt
Q0 Q1 Q2 Q3
2.5.2 Zählerschaltungen
Zähler sind den Registern recht ähnlich, da beide eine kaskadierte Anordnung von mehr
als einem Flipflop mit oder ohne zusätzliche Kombinatorik umfassen. Man unterscheidet
je nach Art des Taktsignals Asynchronzähler und Synchronzähler. Die eigentliche Zählung
entspricht dabei der Anzahl angekommener Taktimpulse.
Der Asynchronzähler (auch engl. Ripple Counter ) besteht aus einer Kaskadierung von
(meist) D-Flipflops. Die einzelnen Flipflops werden dabei jeweils zeitverzögert vom vorigen
Flipflopausgang als Takt versorgt, das Taktsignal wird nur an das erste Flipflop direkt
angelegt. Das führt dazu, dass die Schaltzeiten der einzelnen Ausgänge des Zählers nicht
konstant sind, sondern von deren Position in der Schaltung abhängen. Das erste Bit hat
die kürzeste, das letzte Bit die längste Schaltzeit.
1
Q0 Q1 Q2
J Q J Q J Q
Takt
K Q K Q K Q
Takt
Q0 0 1 0 1 0 1 0 1 0
Wiederanfang
bei 000
Q1 0 0 1 1 0 0 1 1 0
Q2 0 0 0 0 1 1 1 1 0
Die Summe aller Gatterlaufzeiten (pro Gatter z.B. 50ns) bestimmt somit die maximale
Taktfrequenz (z.B. 12-Bit Zähler mit 12 · 50ns), so dass Asynchronzähler im Betrieb in
der Regel langsamer sind als ihre synchronen Gegenstücke. Sowohl das Design als auch
die Implementierung des Asynchronzählers ist dagegen sehr einfach, wie Abbildung 2.19
zeigt. Allerdings arbeitet dieser ausschließlich mit fester Zählfolge (hoch oder runter).
Q0 Q1 Q2 Q3
&
&
1
J0 J1 J2 J3
J Q J Q J Q J Q
K0 K1 K2 K3
K Q K Q K Q K Q
Takt
Takt
Q0
Q1
Q2
Q3
Mehr Flexibilität gestattet dagegen der Synchronzähler, da dieser als rückgekoppelter Zu-
standsautomat jede erdenkliche Zählreihenfolge ermöglicht. Das Zählverhalten wird dabei
durch die Rückkopplungslogik (rein kombinatorisch) bestimmt. So können alle Flipflops
synchron mit demselben Takt versorgt werden.
Sowohl das Design als auch die Implementierung des Synchronzähler sind umso komplexer,
je höher die Anzahl an Zuständen wird. Abbildung 2.20 zeigt die Implementierung anhand
von JK-Flipflops.
Dem Entwurf der Beschaltung der Flipflops liegen folgende Überlegungen zugrunde:
• Flipflop 0 kippt mit jeder fallenden Flanke: J0 = K0 = 1
• Flipflop 1 kippt nur, wenn Q0 = 1 ist → J1 = K1 = Q0
• Flipflop 2 darf nur kippen, wenn Q0 ∧ Q1 = 1 ist → J2 = K2 = Q0 ∧ Q1
• Flipflop 3 darf nur kippen, wenn Q0 ∧ Q1 ∧ Q2 = 1 ist → J3 = K3 = Q0 ∧ Q1 ∧ Q2
Im Gegensatz zum Asynchronzähler haben alle Ausgangsbits eine konstante Laufzeit
(nach einer Verzögerungszeit ∆t liegen alle Bits des Zählers als gültiger Wert vor). Bei
diesem Zähler bestimmen die Setup- und Haltezeit der Flipflop-Eingänge die maximale
Taktfrequenz.
Zählerschaltungen finden häufig Anwendung in Schaltungen zur Ereignissynchronisati-
on und Frequenzmessung, Schätzung von Winkelpositionen bei Sensoren, sowie bei der
Zeitmessung von Ereignissen.
2.5.3 Frequenzteiler
Frequenzteiler sind Schaltungen, die die Frequenz eines Signals in einem bestimmten
Verhältnis herunterteilen. Sie sind damit sehr ähnlich zu den Zählerschaltungen, allerdings
liefern sie keine Ausgabe von internen Zählerständen. Stattdessen wird für eine bestimmte
Anzahl von Eingangsimpulsen am Ende ein einziger Ausgabeimpuls erzeugt.
Auch bei diesen Schaltungen ist sowohl ein synchroner, als auch asynchroner Aufbau
möglich, ebenso ist das Teiler- und Tastverhältnis beliebig. Dies resultiert in Realisierun-
gen, die von einfachen Flipflop-Schaltungen bis hin zu komplexen Automaten reichen.
Die wichtigsten Begriffe zum Frequenzteilerverhalten sind:
fein
• Teilerverhältnis: VT eiler = faus
thigh
• Tastverhältnis: VT ast = thigh +tlow
Das Teilerverhältnis beschreibt das Verhältnis zwischen Ein- und Ausgangsfrequenz. Das
Tastverhältnis (engl. Duty Cycle) gibt das Verhältnis zwischen Impulsdauer und Peri-
odendauer an.
Dieses Kapitel behandelt die elementaren Zusammenhänge zwischen der allgemeinen Be-
schreibung einer spezifischen logischen Funktionalität und dem methodischen Vorgehen
zur Entwicklung einer digitalen Schaltung zu dieser Beschreibung.
Schaltwerk
E A
0 & 0 >=1
0 0
0 0
Kombinatorische
Schaltung
flankengetriggerte
Flipflops
30
KAPITEL 3. SYSTEMATISCHER SCHALTUNGSENTWURF
t1 t2
Abbildung 3.2 zeigt den typischen Zeitverlauf eines RS-Flipflops. Konzentriert man sich
auf die Eingänge bzw. Ausgänge zu den beiden Zeitpunkten t1 und t2 , ist leicht zu
erkennen, dass dieses spezifische dynamische Verhalten sich kaum durch eine einfache
Funktionstabelle darstellen liesse. Die Eingänge sind identisch, die Ausgänge jedoch un-
terschiedlich. Es liegt auf der Hand, dass beim RS-Flipflop die Ausgangswerte aus der
Vorgeschichte“ der Eingangsbeschaltung resultiert.
”
Eine weitere Möglichkeit, um das dynamische Verhalten einer Schaltung, einer Kompo-
nente oder eines ganzen Systems zu beschreiben, stellt das Zustandsübergangsdiagramm
(auch Zustandsdiagramm, Zustandsgraph oder engl. State Diagram) dar. Es visualisiert
die Zustände, die eine Schaltung annehmen kann, und welche Ereignisse (in diesem Sinne
Signaländerungen) Zustandsübergänge bewirken. Wie später noch gezeigt wird, werden
Zustandsdiagramme oft zur Beschreibung von endlichen Automaten eingesetzt,
S=1
R=0
S =0 S beliebig
R beliebig
Q=0 Q=1 R=0
S=0
R=1
verbunden, wobei die Pfeile die Zustandsänderung symbolisieren. Die Beschriftung der
Pfeile dient zur Darstellung der Eingangsbelegung, die zu der Zustandsänderung führt.
Beide Darstellungsformen, das Zeitverlaufsdiagramm und der Zustandsgraph, sind eleme-
natare Werkzeuge zur Durchführung von Schaltungsanalyse und Schaltungssynthese.
3.2 Schaltungsanalyse
Einfache Systeme können meist auf rein intuitivem Weg entworfen werden. Bei einer
größeren Komplexität, inbesondere beim Entwurf synchroner sequentieller Schaltungen
bedarf es jedoch eines systematischen Entwurfsverfahrens. Man nennt dies Schaltungs-
synthese.
Bevor die Schaltungssynthese behandelt wird, steht die inverse Vorgehensweise – die Schal-
tungsanalyse – im Fokus. Durch Umkehrung aller durchlaufenen Schritte ist die Synthese
einer derartigen Schaltung direkt ableitbar.
J Q
1 K Q
Clock
J Q
1 K Q
y1
J1 Q
y1
1 K1 Q
Clock
J0 Q
y0 y0
1 K0 Q
Bei einer Schaltung mit mehr als einem Flipflop empfiehlt sich eine eindeutige Kennzeich-
nung aller Ein- und Ausgänge der vorhandenen Flipflops, wie in Abbildung 3.5 umgesetzt.
Die Eingänge des oberen Flipflops (im Folgenden Flipflop 1) werden mit J1 und K1 be-
zeichnet, die des unteren Flipflops (Flipflop 0) mit J0 und K0 .
Da die Flipflops als Zustandsspeicher genutzt werden, werden deren Ausgänge jeweils
mit y1 , respektive y0 benannt. Die Bezeichnung mit y für Zustände wird sich durch den
gesamten Analyse- und Synthese-Prozess ziehen.
Gemäß des oben erläuterten Ablaufs werden zunächst die Funktionsgleichungen aus der
Abbildung abgeleitet.
Schritt 1
z = (x + y1 ) · y0 = x · y0 + y1 · y0
J1 = x
K1 = x
J0 = x · y0 + y1 · y0
K0 = J0
Anschließend werden die KV-Tafeln für die Eingänge J und K der Flipflops aufgestellt.
Zusätzlich muss auch die KV-Tafel für den Ausgang z gebildet werden. Da im vorliegenden
Beispiel z = J0 gilt, entspricht die KV-Tafel von z der von J0 . Abbildung 3.6 zeigt die
fertigen Tabellen.
Schritt 2
y1 y1
J1 K1
y0 y0
0 0 0 0 1 1 1 1
x 1 1 1 1 x 0 0 0 0
y1 y1
J0 K0
y0 y0
0 0 0 1 1 1 1 0
x 1 0 0 1 x 0 1 1 0
Nun wird die Zustandsfolgetabelle aufgestellt. In dieser werden alle Nachfolgezustände für
alle möglichen Zustandskombinationen in Verbindung mit allen Eingangskombinationen
spezifiziert.
Schritt 3
In der vorliegenden Schaltung gibt es zwei binäre Zustandsspeicher (Flipflop 1 und Flipflop
0) mit jeweils einem logischen Ausgang (0 oder 1). Daher müssen in der Zustandsfolgeta-
belle, wie in Tabelle 3.1 zu sehen, insgesamt 22 = 4 unterschiedliche Zustände vorgesehen
werden. Diese werden zunächst in die erste Spalte unter Gegenwärtiger Zustand“ aufge-
”
listet, und zwar in der den KV-Tafeln entsprechenden Kombinationsreihenfolge (bezüglich
y0 und y1 ). Dies erleichtert das Herauslesen der Werte und das Eintragen an die korrekte
Stelle in der Zustandsfolgetabelle.
Anschließend wird durch Vergleich mit den in Tabelle 3.2 gegebenen Beschaltungskombi-
nationen des JK-Flipflops ermittelt, welcher Folgezustand (gekennzeichnet mit einem Plus
Übergang J K
0→0 0 X
0→1 1 X
1→0 X 1
1→1 X 0
über der Zustandsvariable, z.B. y0+ ) vom gegenwärtigen Zustand aus bei entsprechender
Belegung der Eingänge J und K erreicht wird. Dieser wird für die Zustandsvariablen y0
und y1 getrennt in die mittleren Spalten unter Nächster Zustand“ eingetragen, jeweils
”
abhängig davon, ob am Eingang x eine 0 oder 1 anliegt.
Die letzte Spalte stellt den Gegenwärtigen Ausgang“ dar und lässt sich durch einfache
”
Drehung der entsprechenden KV-Tafel um 90 Grad im Uhrzeigersinn und anschließende
Spiegelung an der vertikalen Achse bestimmen. Wegen z = J0 wird hier die KV-Tafel von
J0 zugrundegelegt.
Im nächsten Schritt wird die Zustandsfolgetabelle nun vereinfacht. Für die zu ermittelnde
abstrakte Darstellung der Funktionalität anhand eines Zustandsgraphen ist das interne
Verhalten nämlich irrelevant. Nur das Verhalten der Ausgänge ist wichtig. Daher werden
für die konkreten Zustandskombinationen (y1 y0 ) einfach symbolische Namen vergeben.
Die Zuordnung ist frei wählbar, es empfiehlt sich der Übersicht halber jedoch bei der in
der Zustandsfolgetabelle zugrundegelegten Abfolge zu bleiben, so geschehen bei folgender
Zuordung:
Tabelle 3.3 zeigt die vereinfachte Tabelle, basierend auf der oben genannten Zuordnung.
Schritt 4
Im letzten Schritt kann schließlich der Zustandsgraph direkt aus der vereinfachten Zu-
standsfolgetabelle abgeleitet werden. Die Zustände sind durch ihre symbolischen Namen
benannt und durch Pfeile verbunden. An den Pfeilen steht jeweils die Eingangsbelegung,
die zu der Zustandsänderung führt, sowie durch ein Komma getrennt die begleitende
Ausgangsbelegung. Abbildung 3.7 zeigt das Resultat.
Schritt 5
0/0
a 0/0
0/0
1/1
b c
1/0 1/1
0/1 d 1/0
3.3 Schaltungsynthese
In umgekehrter Reihenfolge entspricht die soeben erläuterte Prozedur genau der Schal-
tungssynthese. Bei dieser wird ausgehend von einer abstrakten Funktionsbeschreibung
eine dazu passende Schaltung entwickelt.
Eine Schaltungssynthese beginnt mit einer eindeutigen Beschreibung der Funktionalität.
Ausgangspunkt ist meist eine verbale Problembeschreibung, die zunächst in eine visuelle
Darstellung in Form eines Zustandsdiagrammes überführt werden muss. Manchmal liegt
diese als Teil der Aufgabenbeschreibung bereits vor.
Die Vorgehensweise bei der Schltungssynthese ist durch folgende Schritte gekennzeich-
net:
1. Zustandsgraph mit vollständigen Zuständen und zugehörigen Ausgangswerten auf-
stellen
2. vereinfachte Zustandsfolgetabelle gemäß des Zustandsgraphen ableiten
3. symbolische Namen durch Zustandskombinationen (Binärkombinationen) ersetzen
und Zustandsfolgetabelle für Binärkombinationen der Zustände aufstellen
4. Flipflop-Typ wählen und KV-Diagramm für Übergangsverhalten des gewählten
Flipflops aufstellen
5. Gleichungen für die Flipflop-Eingänge mittels KV-Diagramm ableiten
0/0 1/0
Schritt 2
Es ist zu erkennen, dass diese Zuordnung nicht unmittelbar der Abfolge der Zustandsvaria-
blen in den KV-Tafeln folgt. Bezüglich der Variablen c und d wird daher eine Umsortierung
erforderlich, wie in den letzten beiden Zeilen in Tabelle 3.5 ersichtlich.
Schritt 3
Nun muss ein geeigneter Flipflop-Typ gewählt werden. Basierend auf diesem werden dann
die KV-Tafeln für das Übergangsverhalten der gewählten Flipflops aufgestellt. Falls es
keinen konkreten Hinweis auf den Einsatz eines bestimmten anderen Flipflop-Typs9 gibt,
kann ein JK-Flipflop verwendet werden. Die Schaltungssynthese mit JK-Flipflops ist ins-
besondere aufgrund der don’t care“-Möglichkeiten (vgl. Tabelle 3.2) vorteilhaft.
”
Die Zustandsfolgetabelle (Tabelle 3.5) definiert welcher Folgezustand vom gegenwärtigen
Zustand aus erreicht wird, abhängig davon, ob am Eingang x = 0 oder x = 1 anliegt. Das
Vorhandensein von 22 = 4 unterschiedlichen Zuständen lässt wiederum auf zwei binäre
Zustandsspeicher (Flipflop 1 und Flipflop 0) schließen.
Durch Vergleich mit Tabelle 3.2 können die Eingangsbelegungen für J und K für alle ge-
zeigten Kombinationen ermittelt werden. Diese werden in die entsprechenden KV-Tafeln
eingetragen. Die KV-Tafel für den Ausgang z kann wieder direkt aus der Zustandsfolge-
tabelle abgelesen werden. Abbildung 3.18 zeigt alle ermittelten KV-Tafeln.
9
Für den Einsatz von D-Flipflops spricht z.B. ein Verhalten, bei dem der Folgezustand immer nur vom
aktuellen Zustand ohne Abhängigkeit von einem eventuell vorhandenen Eingang abhängt.
Schritt 4
y1 y1
J1 K1
y0 y0
0 0 X X X X 0 1
x 0 1 X X x X X 0 0
y1 y1
J0 K0
y0 y0
0 X X 0 X 1 0 X
x 1 X X 1 x X 1 0 X
y1
z
y0
0 0 0 0
x 0 0 0 1
Aus den KV-Tafeln können anschließend die Funktionsgleichungen für alle Eingänge J
und K, sowie für den Ausgang z abgelesen werden.
Schritt 5
z = x · y1 · y0
J1 = y0 · x
K1 = y0 · x
J0 = x
K0 = y1
Mit den ermittelten Funktionsgleichungen kann nun auch die Schaltung gezeichnet werden.
Für eine übersichtliche Darstellung empfiehlt es sich, zunächst die Zustandsspeicher einzu-
zeichnen und anschließend die Eingangsbelegungen durch Hinzufügen der entsprechenden
Logikgatter in der Nähe der Flipflopeingänge vorzusehen. Erst zum Schluß werden die
Verbindungsleitungen eingezeichnet.
Schritt 6
Eingang x 1
& y1
&
J1 Q
y1 & Ausgang z
y1
& K1 Q
Clock
y0
J0 Q
y0
y0
K0 Q
Der Vollständigkeit halber wird auch der letzte Schritt gezeigt, das Aufzeichnen eines
exemplarischen Timing-Diagramms.
Schritt 7
Abbildung 3.11 zeigt das Zeitverhalten des Schaltungssynthesebeispiels. Hier äußert sich
ein typisches Problem einer bestimmten Art von Schaltungen: Die Zustandsvariablen und
der Eingang wirken sich direkt auf den Ausgang aus. So kommt es dazu, dass sog. Spikes
am Ausgang auftreten, wenn das Eingangssignal sich nicht synchron zum Systemtakt
verhält. Das Verhalten der nachfolgenden Schaltung (sofern vorhanden) kann dadurch
unter Umständen dramatisch beeinflusst werden. Abhilfe schaffen hier nur der Einsatz
anderer Schaltungstypen auf der einen Seite oder eine Synchronisation der Eingangssignale
auf der anderen Seite. Weitere Details dazu finden sich im nächsten Abschnitt.
E/A
Z
Übergangs- Speicher Z
schaltnetz Z+
(Verzögerung)
Z Ausgangs-
E schaltnetz A
Register – übernommen. Daher verfügt der Speicher in jedem Fall auch mindestens über
ein zusätzliches Eingangssignal, nämlich das Taktsignal10 (meist Clk für engl. Clock ).
Der im Zustandsregister aktuell gespeicherte Zustand Z wirkt über das Ausgangs-
schaltnetz auf den Ausgang A. Zugleich hat der aktuelle Zustand Z durch eine
Rückkopplung auch Einfluss auf die Verarbeitung der Eingangssignale, da er den Aus-
gangspunkt für den nächsten Übergang definiert. Daher resultiert letztlich auch der Begriff
Übergangsschaltnetz.
Neben der Abhängigkeit vom aktuellen inneren Zustand Z ist für den Mealy Automaten
die direkte Beeinflussung des Ausganges durch die Eingänge E entscheidend. Dies zeigt
Abbildung 3.12 durch den unteren Pfeil im Blockschaltbild, der die direkte Verbindung
vom Eingang zum Ausgangsschaltnetz symbolisiert. Damit reagieren beim Mealy Automat
die Ausgänge unmittelbar auf Eingangsänderungen. Man nennt diesen Automatentyp
daher übergangsorientiert“.
”
Die Abhängkeit vom aktuellen Eingangssignal wird auch im zugehörigen Zustandsgra-
phen deutlich. Dies ist rechts vom Blockschaltbild in Abbildung 3.12 dargestellt. An den
Übergängen, in gewohnter Weise durch Pfeile markiert, werden die beeinflussenden Ein-
und Ausgänge festgelegt. Die Ausgangsänderungen erfolgen somit asynchron gegenüber
dem vorhandenen Takt.
Z
Übergangs-
Flipflops
schaltnetz Z+ Z
Synchronisation Ausgangs-
E schaltnetz A
E
Clock C
Timing-Diagramm
zur Clock C
Verglichen mit den anderen Automatentypen benötigt ein Mealy Automat in der Regel
weniger Zustände für die gleiche logische Realisierung, da pro Ausgangsänderung kein
eigener Zustand, sondern lediglich ein Übergang erforderlich ist. Dieses Verhalten kann
jedoch zu kombinatorischen Schleifen und damit instabilem Verhalten in der Gesamtschal-
tung führen.
Um dies zu umgehen, wird der Mealy Automat auch gern in einer modifizierten Variante
als synchrones (getaktetes) Schaltwerk mit synchronisierten Eingangssignalen verwendet.
Abbildung 3.13 zeigt das entsprechende Blockschaltbild dazu. Der synchrone Mealy Au-
tomat unterscheidet sich vom Moore Automat nur durch die zusätzlichen Eingänge E am
10
Der Übersicht halber ist dieses hier nicht gezeigt. In einem späteren Abschnitt wird darauf noch Bezug
genommen.
Im Unterschied zum Mealy Automat existiert beim Moore Automat keine direkte Verbin-
dung zwischen Eingangssignalen E und dem Ausgangsschaltnetz. Dies geht eindeutig aus
dem Blockschaltbild in Abbildung 6.13 hervor. Die Eingänge wirken somit nicht unmittel-
bar auf den Ausgang, stattdessen wird dieser über das Ausgangsschaltnetz ausschließlich
aus dem aktuellen Zustand Z hergeleitet. Man nennt diesen Automatentyp daher zu-
”
standsorientiert“.
Z Z
Übergangs- Speicher Ausgangs-
schaltnetz Z+
(Verzögerung)
Z
schaltnetz A A
E
Auch der zugehörige Zustandsgraph verdeutlicht die unmittelbare Beeinflussung des Aus-
ganges durch den aktuellen Zustand, wie rechts vom Blockschaltbild in Abbildung 6.13
dargestellt. Den Zuständen, in gewohnter Weise durch Kreise markiert, ist jeweils ein
definierter Ausgang A zugeordnet. Da der Automat in Abhängigkeit seines aktuellen Zu-
standes reagiert, erfolgt auch die Bearbeitung der Eingangssignale zustandsabhängig. An
den durch Pfeile dargestellten Übergängen wird nur der beeinflussende Eingang festgelegt.
Die Ausgangsänderungen erfolgen somit synchron zum vorhandenen Takt.
Der Logikaufwand zur Implementierung eines Moore Automaten ist üblicherweise größer
als bei Mealy, da pro Ausgangsänderung ein eigener Zustand realisiert werden muss.
x x/y
s2 x x
s1 s3 s1 s2 s3
y
Takt Takt
s1 s2 s3 s1 s2 s3
x x
y y
Neben der Anzahl der nötigen Zustände ist insbesondere das Zeitverhalten grundsätzlich
unterschiedlich zwischen Moore und Mealy Automat. Dies ist in Abbildung 3.15 ge-
genübergestellt. Da beim Moore Automat (linke Seite) die Eingangsfunktion nur auf den
Zustandsübergang Einfluss hat, bleibt der Ausgang während der gesamten Taktzyklen
stabil. Durch die Verknüpfung von Eingangs- und Ausgangsfunktion bei Mealy (rechte
Seite) verhält sich das Ausgangssignal asynchron.
Der Medwedjew Automat ist eine Sonderform des Moore Automaten. Wie dieser arbeitet
der Medwedjew Automat zustandsorientiert. Ausgangsänderung erfolgen nur synchron
mit dem Takt. In Abgrenzung zum Moore Automat verfügt der Medwedjew Automat
allerdings nicht über ein gesondertes Ausgangsschaltnetz, wie aus Abbildung 3.16 ersicht-
lich. Stattdessen entspricht der Ausgang jeweils der aktuellen Zustandscodierung.
Z
Übergangs- Speicher Z=A
schaltnetz Z+
(Verzögerung)
A
E
Aufgrund dieser Beziehung korrespondiert die Anzahl der Zustandsspeicher direkt mit der
Anzahl der Ausgangsvariablen. Es ist also eine spezielle Zustandscodierung erforderlich,
die beim Entwurf des Medwedjew Automaten berücksichtigt werden muss. Üblicherweise
führt dies zu einem höheren Bedarf an Flipflop-Ressourcen als bei Moore.
Nachfolgend wird der Entwurf eines Medwedjew Automaten exemplarisch skizziert. Viele,
aber nicht alle, FSM besitzen einen Eingang. Hier soll ein spezieller Zähler ohne separaten
Eingang mit der folgenden zyklischen Zählsequenz realisiert werden:
0 − 1 − 3 − 2 − 6 − 4 − 5 − 7
Als Ausgabe dient entsprechend des Medwedjew Modells der Zustand selbst. Zunächst
wird der Zustandsgraph aus der beschriebenen Zählweise hergeleitet (Abbildung 3.17).
0
1 7
3 5
2 4
Anschließend wird aus dem Zustandsgraphen die Zustandsfolgetabelle, wie in Tabelle 3.6
dargestellt, ermittelt. Die Ausgänge brauchen nicht extra spezifiziert zu werden, da sie
identisch mit den Zustandsvariablen sind.
Eine möglichst geschickte Wahl des Flipflop-Typen kann die resultierende Schaltungskom-
plexität günstig beeinflussen. Da wie aus Tabelle 3.6 ersichtlich der Folgezustand jeweils
nur vom gegenwärtigen Zustand abhängt, ist ein D-Flipflop hier das Mittel der Wahl.
Tabelle 3.7 zeigt die zu verwendende Übergangstabelle.
Übergang D
0→0 0
0→1 1
1→0 0
1→1 1
Damit kann direkt mit der Emittlung der KV-Tafeln für die Eingänge D0 , D1 und D2 der
drei D-Flipflops fortgefahren werden. Abbildung 3.18 zeigt die vollständigen Tabellen.
y1 y1
D0 D1
y2 y2
0 0 0 1 0 1 1 1
y0 1 1 0 1 y0 0 1 0 0
y1
D2
y2
1 1 0 0
y0 1 1 0 0
D0 = y0 · y1 + y1 · y2
D1 = y1 · y2 + y0 · y1
D2 = y1
&
SET
>=1 D0 Q Q0
&
CLR
Q
&
SET
>=1 D1 Q Q1
&
CLR
Q
SET
D2 Q Q2
Takt
CLR
Q
Zur Demonstration des zeitlichen Verhaltens zeigt Abbildung 3.20 schließlich noch das
Timing-Diagramm zu dem hergeleiteten Medwedjew-Automaten.
Takt
Reset
Q 0 1 3 2 6 4 5 7 0 1
Damit wurden nun alle drei Automatentypen hinreichend beleuchtet. Welcher Automa-
tentyp Anwendung findet, hängt von der jeweils zu lösenden Problemstellung ab. Als
Faustregel gilt, dass die beste Lösung diejenige ist, die die Anforderungen erfüllt und
dabei am wenigsten Ressourcen benötigt oder am einfachsten zu implementieren ist. Wel-
che Anforderungen konkret an einen Entwurf gestellt werden, kann je nach Designziel
(Geschwindigkeit, Komplexität, Leistungsbedarf, etc.) stark variieren.
Auch die Beschreibung in graphischer Form anhand eines Zustandsgraphen ist möglich. So
verfügt beispielsweise die FPGA-Entwicklungsumgebung von Altera11 , Quartus II, über
einen graphischen FSM Entry (Abbildung 3.21). Nach Eingabe lässt sich die FSM in (syn-
thesefähigem) VHDL ausspeisen. Diese Vorgehensweise hat den großen Vorteil, dass sie
sowohl die Eingabe als auch die Visualisierung zusammenhängend vereint. Allerdings sind
wie üblich bei einer abstrakten Beschreibungsform die Eingriffsmöglichkeiten limitiert.
Kapitel 4 gibt eine detaillierte Einführung in die Schaltungsentwicklung mit VHDL.
11
Alle programmierbaren Logikbausteine von Altera werden von einer gemeinsamen Designumgebung
unterstützt. Die Quartus II Software ist in verschiedenen Editionen, u.a. auch einer kostenlosen web-
basierten Edition erhältlich. Altera Quartus II heißt mittlerweile Quartus Prime und trägt seit der
Übernahme von Intel auch den Zusatz Intel Quartus Prime.
In diesem Kapitel wird die Hardwarebeschreibung mit VHDL detailliert vorgestellt und
erläutert. Neben der Theorie zur Beschreibung einer Schaltung mit VHDL werden an-
hand zahlreicher Beispiele vertiefende Aspekte des Designs und der Modellierung für die
Schaltungssynthese dargestellt.
49
KAPITEL 4. RECHNERGESTÜTZTER SCHALTUNGSENTWURF MIT VHDL
Trotz der Ähnlichkeit in der Syntax zur Programmiersprache C (und C++) weist VHDL
einen elementaten Unterschied auf: Die inhärente Nebenläufigkeit von Anweisungen und
Prozessen spiegelt zwar das Hardwareverhalten wider, erfordert jedoch ein hohes Maß an
Sorgfalt bei der Beschreibung. Es muss deutlich darauf verwiesen werden, dass VHDL
eine Modellierungssprache ist und keine Programmiersprache.
Ergänzend zu den in Abschnitt 2.1.3 bereits dargelegten Formvorgaben soll hier noch
einmal kurz der prinzipielle Aufbau von VHDL Designs geschildert werden. Abbildung 4.1
illustriert den Aufbau und die elementaren Bestandteile eines VHDL Designs, analog dazu
zeigt Listing 4.1 das Gerüst einer VHDL Beschreibung.
Eingangs- Ausgangs-
signale Signalmodi
Entwurfseinheit
Y out
in Schnittstellen (Ports)
inout
buffer
Architektur
Funktionalität:
Kombinatorische
oder
sequentielle Logik
ENTITY E_NAME IS
-- Portliste
END E_NAME ;
-- Deklarationen
-- ( Liste interner Signale )
BEGIN
-- Nebenlaefige Zuweisungen
-- ( S i g n a l z u w e i s u n g e n )
END A_NAME ;
Die Kombination aus Entity und Architecture ist das grundlegendste Konstrukt in VHDL.
Die Entity definiert den Namen der Entwurfseinheit (Black Box) und legt die Schnittstelle
des Funktionsblockes nach außen fest. Die Deklaration der Anschlüsse erfolgt über Port-
Anweisung, die Anschlüsse werden mit Signalen verbunden. Für die Synthese muss der
Entity-Name unbedingt mit dem Dateinamen übereinstimmen.
Die Architecture beschreibt das funktionale Innenleben. Dabei ist sowohl eine strukturelle
Beschreibung, als auch eine Beschreibung auf Verhaltensebene (Behavioural Description)
möglich. Es gibt klare Vorgaben für die Art der Anweisungen. So existiert die Möglichkeit
logische Operationen (AND, OR, etc.) anzuwenden, arithmetische Operatoren (+, -, etc.)
zu verwenden oder auch bestimmte vorgesehene Verhaltensausdrücke (if-then-else, etc.)
zu formulieren.
Entities und Architectures werden zusammen verwendet, um eine bestimmte Funktiona-
lität zu definieren. Die Architecture bezieht sich immer auf eine bestimmte Entity. Aller-
dings sind auch mehrere Architectures pro Design möglich. Zum Beispiel könnten für eine
Entity mehrere Architectures erstellt werden, die jeweils auf ein bestimmtes Entwurfsziel
optimiert sind:
• Performance
• Schaltungskomplexität
• Leistungsaufnahme
• Einfachheit der Testbarkeit (engl. Design For Testability, kurz DFT) oder der Si-
mulation
Die Auswahl der Architecture bei Vorhandensein mehrerer Designalternativen geschieht
mit der Configuration. Standardmäßig existiert eine Configuration für jede Entity, so-
fern nicht anders definiert ist dies die zuletzt synthetisierte Architecture für diese Entity.
Bei einer zusammenhängenden Beschreibung von Entity und Architecture in einer ge-
meinsamen Datei ist dies relativ eindeutig. Die Configuration muss für diesen Fall also
nicht explizit angegeben werden. Oft wird ein großes FPGA-Design in viele Entity- /
Architecture-Kombinationen unterteilt.
Ein typischer Design Flow mit VHDL beinhaltet die in Abbildung 4.2 dargestellten Schrit-
te. Neben VHDL als Eingabe ist auch ein graphischer Entry möglich (vgl. Schaltplan).
Die Synthese beschreibt die Übersetzung des HDL Codes in eine architekturspezifische
Netzliste. Diese beschreibt die Struktur eines Hardware-Designs auf Register-Transfer
Ebene (RTL), wie in Abbildung 4.3 beispielhaft dargestellt. Es gilt zu beachten, dass
VHDL ursprünglich nicht zum Zweck der Synthese, sondern zur Spezifikation und Do-
kumentation entwickelt wurde. Daher existieren auch zahlreiche VHDL-Anweisungen, die
nicht synthetisierbar sind. Wird VHDL zur Synthese benutzt, ist unbedingt auf einen
synthesefähigen Code zu achten.
Nach der Synthese erfolgt die Implementierung basierend auf der Zieltechnologie. Dazu
wird die Netzliste auf die Zieltechnologie (Bibliothekselemente einer ASIC-Bibliothek oder
eines FPGA-Devices) abgebildet.
Funktionale
Constraints Synthese
Simulation
Implementierung
Translation Floorplanning,
Layout
Map
Timing Analyse,
Place & Route DRC Checks
Zeitbehaftete
Konfigurations-
Tapeout Simulation
datei
FPGA ASIC
Field Programmable Gate Arrays (FPGAs) wurden bereits in Abschnitt 1.1 vorgestellt
und werden in Abschnitt 6.1 ausführlich behandelt. Diese programmierbaren Logikbau-
steine, die anfangs vornehmlich der Emulation von Schaltungsentwürfen für den späteren
ASIC Entwurf dienten, werden heutzutage nicht mehr nur für das Prototyping genutzt.
Sie finden indes Anwendung in verschiedenen Implementierungen, zum Beispiel im Auto-
motive Bereich, in Rechenzentren, in der Telekommunikation, dem Hochfrequenzhandel
und in der professionellen Videoverarbeitung und Formatkonvertierung.
Application Specific Integrated Circuits (ASICs) sind, wie der Name schon sagt, nicht-
standardisierte integrierte Schaltungen, die für einen bestimmten Zweck oder eine be-
stimmte Anwendung entwickelt werden. Aufgrund der Freiheitsgrade beim Design kann
ein ASIC Entwurf, insbesondere ein Full-Custom Design ohne Verwendung vordefinierter
Blöcke, sehr komplex werden. Zudem sind die Kosten für einen ASIC Entwurf immens
(geq 200.000 Euro, je nach Größe), so dass die Entwicklung sich nur bei hohen Stückzahlen
rentiert. ASICs sind nicht Gegenstand des Curriculums und werden daher nicht weiter
beleuchtet.
SET SET
Kombinatorische
D Q D Q
Kombinatorische Kombinatorische
Logik Logik Logik
CLR Q CLR Q
Clock
Die Implementierung für einen FPGA umfasst die Schritte Translation“, ”Mapping“ und
”
Place & Route“. Zunächst wird die Netzliste mit den einschränkenden Vorgaben (Cons-
”
traints) in eine zusammenhängende Repräsentation basierend auf architekturspezifischen
elementaren Elementen (sog. Primitives) überführt (Translation). Dann wird diese Re-
präsentation auf die verfügbaren Ressourcen abgebildet (Mapping). Schließlich findet die
Platzierung und Verdrahtung entsprechend den (timingrelevanten) Constraints auf den
FPGA Ressourcen statt.
Der Schritt des Placement & Routing ist einer der kritischsten für die spätere Performance
der Schaltung auf dem FPGA und in hohem Maße abhängig von der Qualität des VHDL
Codes. Die maximale Taktfrequenz, mit der die Schaltung betrieben werden kann, ist oft
von Details in der Art der Formulierung auf VHDL-Ebene abhängig. Umso wichtiger ist
es, dass stets die Hardware-Entsprechung des Codes beim Entwurf berücksichtigt wird
und Einzelheiten der Implementierung sorgfältig abgewogen und entsprechend umgesetzt
werden. Ein einziger kombinatorischer Logikpfad mit langer Verzögerung kann ausreichen,
um die gesamte Schaltung auszubremsen.
Mit Hilfe einer Konfigurationsdatei (Bitstream) kann das Design letztlich auf den FPGA
geladen werden. Begleitend zum Entwurf empfiehlt sich die Verifikation in verschiedenen
Etappen. Dies geschieht durch Simulation, zunächst auf funktionaler Ebene (siehe Block
Funktionale Simulation“ in Abbildung 4.2). Die Simulation erfordert die Nachbildung
”
der späteren Umgebung des Designs mit Hilfe von aussagekräftigen Simulationsstimuli
(Eingabewerten) in Form einer Testbench. Kapitel 5 beschäftigt sich noch ausführlich mit
diesem Thema.
Basierend auf den Simulationsergebnissen sind pro Design meist mehrere Iterationen
zur Behebung von Logikfehlern oder zur Optimierung des Verhaltens erforderlich. Nach
Durchlaufen aller genannten Implementierungsschritte existieren schließlich konkrete Ti-
minginformationen – insbesondere unter Berücksichtigung der Verdrahtung – für eine
zeitbehaftete Simulation (siehe entsprechenden Block in Abbildung 4.2)). Man nennt die-
se auch Post-Layout Simulation oder Post-R&R Simulation. Anhand dieser kann ermittelt
werden, ob alle Timing Constraints und die Zielfrequenzvorgabe für das Design eingehal-
ten werden konnten. Falls nicht, sind Anpassungen nötig.
VHDL ist eine stark typisierte Sprache. Jedes Signal, jede Variable oder Konstante muss
einem bestimmten Datentyp zugeordnet sein und kann nur mit Ausdrücken des gleichen
Datentyps kombiniert werden. Ein Datentyp definiert eine Menge von festen und stati-
schen Werten. Eine Vermischung von Datentypen ist nicht zulässig und muss ggf. durch
explizite Typkonvertierung umgangen werden.
Es gibt einige grundlegende Datentypen, die in VHDL bereits vordefiniert sind. Für die
Verwendung anderer Datentypen ist die Einbindung von Packages nötig, in denen neben
spezifischen Datentypen auch Funktionen, Konstanten und Komponenten definiert sein
können. Diese wiederum sind in Bibliotheken (engl. Libraries) gegliedert. Dieses Konzept
verfolgt die Aufgabe Hardware Designs zu vereinfachen und Standardelemente einfach
verfügbar zu machen. Es ist auch möglich eigene benutzerdefinierte Datentypen anzu-
legen, wodurch höhere Abstraktionsebenen in VHDL Beschreibungen realisiert werden
können.
Für den Einstieg in den Hardware-Entwurf genügt die Kenntnis der folgenden drei Ty-
pen:
• boolean (für logische Abfragen, z.B. if)
• bit bzw. bit vector (für den Entwurf)
• std logic bzw. std logic vector (für Entwurf und Simulation)
Die Datentypen boolean“ und bit“ sind in VHDL bereits standardmäßig enthalten. Für
” ”
den Hardware-Entwurf sind die Möglichkeiten bei der Verwendung des bit“-Datentyps,
”
der nur die Elemente ’0’ und ’1’ umfasst, sehr beschränkt. So existiert beispielsweise keine
Möglichkeit Signale auf hochohmig zu legen, wie es bei Bus-Standards wie I2C üblich ist.
Auch ist eine Unterscheidung in schwache und starke Signale nicht möglich, was allerdings
für den ASIC-Entwurf unabdingbar ist. Daher wird für den Hardware-Entwurf und die
Simulation der 9-wertige Datentyp std logic“ empfohlen.
”
LIBRARY ieee ;
USE ieee . std_lo gic_1164 . ALL ;
Für die Verwendung von std logic“ muss die Bibliothek ieee.std logic 1164, wie in Lis-
”
ting 4.2 gezeigt, eingebunden werden. Mit Hilfe der Angabe all“ werden alle Sub-
”
Elemente des Package der Bibliothek sichtbar. Tabelle 4.1 zeigt den Wertevorrat, sowie
den Einsatzzweck.
Bei std logic“ können mehrere Treiber für ein Signal existieren, z.B. für bidirektionale
”
Busse mit mehreren Treibern. Eine Auflösungsfunktion entscheidet, welches Signal sich
durchsetzt. Diese ist ebenfalls Teil der std logic 1164 Package Spezifikation. Alternativ
kann der Datentyp std ulogic“ (u für unresolved ) verwendet werden, der mehrere Treiber
”
verbietet. Signale dürfen nur in einem Prozess, bzw. einer nebenläufigen Anweisungen eine
Wertzuweisung erfahren. Damit ist dieser Datentyp weniger flexibel, lässt aber die einfache
Erkennung versehentlicher Mehrfachzuweisungen durch entsprechende Fehlermeldungen
im Simulator zu.
Signale gleichen Datentyps können zu Vektoren zusammengefasst werden und entsprechen
der Deklaration von Bussignalen. Ein bit vector stellt beispielsweise einen aus mehreren
bit-Signalen bestehenden Bus dar. Dieser kann entweder aufsteigend, z.B. als bit vector(0
to 7), oder absteigend als bit vector(7 downto 0) deklariert werden. Gleiches gilt auch
für einen std logic vector. Eine Deklaration mit absteigender Indizierung entspricht der
in der Digitaltechnik üblichen Interpretation von Binärzahlen und ist daher vorzuziehen.
Listing 4.3 zeigt gebräuchliche Möglichkeiten der Signalzuweisung. Es sei darauf hingewie-
sen, dass die gezeigten Zuweisungsbeispiele nur Ausschnitte darstellen und in der gezeigten
Form durch die gleichzeitigen Signalzuweisungen Konflikte verursachen würden.
Wenn alle Bits eines Busses mit demselben Wert belegt werden sollen, empfiehlt sich das
others-Konstrukt. Einzelne konstante Werte müssen in Hochkommata, mehrere konstante
Werte in Anführungszeichen eingeschlossen werden. Mit dem Konkatenationsoperator &
lassen sich Zeichen und Zeichenketten zusammenfügen.
12
Nichtassoziative Verknüpfungen verbieten die Verknüpfung von mehr als zwei Operanden, da das Er-
gebnis nicht eindeutig bestimmt werden kann.
Signalen empfiehlt sich die Klammerung zur Verdeutlichung der Priorität der logischen
Operatoren. Bei nichtassoziativen Verknüpfungen ist dies sogar zwingend. Die logischen
Operatoren sind für die Datentypen boolean, bit und std logic (auch als Vektor) defi-
niert.
Relationale Operatoren (Vergleichsoperatoren) werden verwendet, um Gleichheits-
oder Größenvergleichsfunktionen zu implementieren. VHDL stellt die Operatoren =
(Gleichheit), /= (Ungleichheit), < (kleiner), > (größer), <= (kleiner gleich), >=
(größer gleich) zur Verfügung. Die Gleichheitsoperatoren sind für alle Datentypen
definiert, die Größenvergleichsoperatoren sind dagegen nur für numerische Typen,
Aufzählungstypen und einige Arrays definiert. Als Ergebnis wird immer der Datentyp
boolean zurückgeliefert.
Arithmetische Operatoren werden verwendet, um arithmetische Funktionsblöcke zu er-
stellen. Zu den arithmetischen Operatoren zählen: + (Addition), - (Subtraktion), * (Mul-
tiplikation), / (Division), MOD (Modulo), REM (Rest), ABS (Betrag), sowie ** (Poten-
zierung). Diese Operatoren sind für numerische Datentypen wie integer und real definiert,
meist werden allerdings die Datentypen signed bzw. unsigned verwendet, die arithmeti-
sche Interpretationen vom std logic Datentyp sind. Zu deren Verwendung muss die Bi-
bliothek ieee.numeric std eingebunden werden. Es sei anzumerken, dass die Verwendung
arithmetischer Operatoren in einem Entwurf dazu führen kann, dass sehr große Mengen
kombinatorischer Logik erzeugt werden. Daher ist hier besondere Sorgfalt gefragt.
Schiebeoperatoren sind für Vektoren vom Typ boolean, bit und std logic definiert und
wurden erst im IEEE-1076-1993 [VHDL93] Standard eingeführt. Enthalten sind die lo-
gischen Schiebeoperatoren SLL (Shift Left) und SRL (Shift Right), die arithmetischen
Schiebeoperatoren SLA (Shift Left) und SRA (Shift Right), sowie die Rotationsoperato-
ren ROL (Rotate Left) und ROR (Rotate Right).
S
EN S IB IA Y
1 x x x 0
IA 0
Y 0 1 0 x 0
IB 1 0 1 1 x 1
0 0 x 0 0
0 0 x 1 1
EN
Abbildung 4.4: Schaltsymbol und Funktionstabelle eines 2:1-Multiplexers
Die in Abschnitt 2.1.3 gezeigte, erste VHDL-Beschreibung war bereits ein Beispiel für
eine Datenflussbeschreibung. Hier folgt ein weiteres Beispiel anhand eines 2:1-Multiplexers
mit Enable-Signal (low-active). Abbildung 4.4 zeigt das Schaltsymbol und die zugehörige
Funktionstabelle.
ENTITY Mux2x1 IS
PORT ( IA , IB : IN bit ; -- data input
S : IN bit ; -- select input
E : IN bit ; -- enable
Y1 , Y2 , Y3 : OUT bit
);
END Mux2x1 ;
BEGIN -- Variante 1
Y1 <= ( IA AND NOT E AND NOT S ) OR
( IB AND NOT E AND S ) ;
-- ------- -- Variante 2
WITH S SELECT
Y2 <= ( IA AND NOT E ) WHEN ’0 ’ ,
( IB AND NOT E ) WHEN ’1 ’;
-- ------- -- Variante 3
Y3 <= ( IA AND NOT E ) WHEN S = ’0 ’ ELSE
( IB AND NOT E ) ;
END Mux ;
Die Spezifikation der Funktionalität des 2:1-Multiplexers erfolgt in Listing 4.4 in drei un-
terschiedlichen Beschreibungsformen. Würden diese alle auf denselben Ausgang Y geleitet
werden, würde es aufgrund von mehreren Treibern zu einem Signalkonflikt kommen. Statt
einem Ausgang Y bedient sich die VHDL-Beschreibung daher drei Ausgängen Y 1, Y 2 und
Y 3.
Das Signal Y 1 ist der Ausgang von Variante 1. Hier liegt eine unbedingte Signalzuweisung
vor. Diese besteht aus einer simplen Zuweisung.
Das Signal Y 2 ist der Ausgang von Variante 2. Man spricht hier von einer selektive Si-
gnalzuweisung. Aus einer Reihe gleichberechtigter Möglichkeiten wird je nach erfüllter
Bedingung – gegeben durch das with select“ - Konstrukt – eine ausgewählt. Die in dem
”
Konstrukt angegebenen Optionen müssen sich gegenseitig ausschließen, d.h. eine Aus-
wahlmöglichkeit kann nicht mehr als einmal verwendet werden. Darüber hinaus müssen
alle möglichen Werte des durch with“ angegebenen Signals in der Auflistung der Op-
”
tionen enthalten sein. Diese Art der Signalzuweisung entspricht in der Umsetzung einer
Multiplexerstruktur.
Variante 3 liefert das Ausgangssignal Y 3. Hier liegt eine bedingte Signalzuweisung vor,
zu erkennen an der when else“ - Formulierung (vergleichbar mit einem if then else“ -
” ”
Konstrukt). Bei dieser Art der Signalzuweisung werden die Ausdrücke nach der when“-
”
Klausel nacheinander ausgewertet bis ein wahrer Ausdruck gefunden wird. Die Zuwei-
sung, die diesem wahren Ausdruck entspricht, wird durchgeführt. Infolgedessen haben die
zuerst ausgewerteten Ausdrücke eine höhere Priorität als die späteren. Wenn keiner der
Ausdrücke zutreffend ist, hat die letzte Zuordnung Bestand. In der Implementierung führt
diese Art der Beschreibung zu einer Verschachtelung von Gattern und damit funktional
zu einem Prioritäts-Encoder.
Grundsätzlich gilt bei Datenflussbeschreibungen darauf zu achten, dass mehrere Zuwei-
sungen auf ein- und dasselbe Signal unbedingt vermieden werden müssen. Aufgrund der
Nebenläufigkeit der Zuweisungen entstehen hierbei Konflikte (Kurzschlüsse).
Eine andere Form der Verhaltensbeschreibung ist der Prozess. Ein Prozess stellt zudem die
Umgebung für sequentiell abgearbeitete Anweisungen zur Verfügung – eine Möglichkeit,
die ausschließlich mit Prozessen umgesetzt werden kann.
Alle bisher behandelten VHDL-Signalzuweisungen waren nebenläufig. Die Anweisungen
wurden unabhängig voneinander sofort ausgeführt und ergaben in der Schaltungssynthese
kombinatorische, asynchrone Schaltnetze. Zuweisungen wirken dabei unmittelbar, wenn
sich ein Signal auf der rechten Seite der Signalzuweisung ändert. Damit lassen sich nur
sehr einfacher Funktionsblöcke realiseren. Für komplexere digitale Funktionsblöcke ist die
Verwendung von Prozessen unabdingbar.
Prozesse bestehen aus einer Folge sequentieller Anweisungen, die bei Aktvierung des Pro-
zesses nacheinander ausgeführt werden. Deutlich wird dieser Unterschied in Abbildung 4.5.
Datenflussbeschreibung Prozessbeschreibung
Begin Begin
Anweisung Anweisung
Anweisung Anweisung
Anweisung Anweisung
End End
In der Hardware existieren natürlich keine Prozesse13 , sondern diese stellen lediglich in der
Beschreibungssprache VHDL ein Konstrukt dar, mit dessen Hilfe sich synchrone Schalt-
werke synthetisieren lassen. Das Synthesewerkzeug versucht also die Anweisungen auf
entsprechende Hardwarefunktionselemente abzubilden. So lassen sich Schaltungen mit
zeitlichen Signalabfolgen realisieren (z.B. Zähler).
Mit Hilfe von Prozessen ist die Modellierung prozeduraler Vorgänge, wie Verzweigungen,
Schleifen, etc. möglich. Mehrere Prozesse (in einer Architecture) werden dabei wie Kombi-
natorik nebenläufig abgearbeitet und entsprechen in der Umsetzung parallelen Schaltungs-
teilen. Der Informationsaustausch zwischen Prozessen erfolgt durch Verwendung lokaler
Signale der Architecture.
Die Verwendung eines Bezeichners (Label) für Prozesse ist optional. Der Aufbau eines
Prozesses gliedert sich in:
• Sensitivitätsliste (alternativ: wait-Anweisungen)
• Deklarationsteil mit eigenen Datentypen, Konstanten oder Variablen
• Ausführungsteil (zwischen begin und end process)
Die Sensitivitätsliste gibt die Signale an, auf die der Prozess reagiert und die Änderungen
in den Anweisungen des Prozesses bewirken. Sie wird dazu verwendet, den Zustand einer
Schaltung zwischen Änderungen beizubehalten. Dies bezieht sich auf das Verhalten in
der Simulation. Der Prozess wird für die Simulation über die Sensitivitätsliste aktiviert,
wenn sich ein Signal der Sensitivitätsliste ändert ( Event“). Infolgedessen wird der Prozess
”
(erneut) ausgewertet.
Dadurch wird die Konsistenz zwischen Simulation und Synthese sichergestellt. Die Sen-
sitivitätsliste dient nur der Simulation und hat keinen Einfluss auf das Syntheseergebnis.
Sie muss allerdings für synthesefähige Prozesse zwingend vorhanden sein. Doch selbst
13
Daher ist von Formulierungen der Art Auf dem FPGA läuft ein Prozess...“ dringlichst abzusehen.
”
Prozesse laufen auf CPUs. Auf FPGAs werden Schaltungen implementiert.
if
elsif
elsif
...
else
14
Mit Variablen ist dies möglich, allerdings ist bei dieser Praxis Vorsicht geboten.
ENTITY Priority IS
PORT ( A : IN bit_vector (3 DOWNTO 0) ;
Y : OUT bit_vector (1 DOWNTO 0)
);
END Priority ;
BEGIN
PROCESS ( A )
BEGIN
Y <= " 00 " ; -- Default Zuweisung
IF ( A (3) = ’1 ’) THEN -- erste Bedingung
Y <= " 11 " ;
ELSIF ( A (2) = ’1 ’) THEN -- zweite Bedingung
Y <= " 10 " ;
ELSIF ( A (1) = ’1 ’) THEN -- dritte Bedingung
Y <= " 01 " ;
ELSIF ( A (0) = ’1 ’) THEN -- vierte Bedingung
Y <= " 00 " ;
END IF ;
END PROCESS ;
END Prio ;
a
A[3]
Y~1
2 A[2] 0
1'h1 1 Y[1..0]
A[3..0]
A[2]
Y~0 A[3]
1 A[1] 0 Y~2
0
1'h0 1
1'h1 1
Prozesse und nebenläufige Anweisungen können äquivalent verwendet werden, d.h. jede
nebenläufige Signalzuweisung kann auch als Prozess formuliert werden. Andersherum gilt
diese Analogie nicht. Sequentielle Signalzuweisungen sind ausschließlich innerhalb eines
Prozesses möglich. Wie bei Datenflussbeschreibungen ist grundsätzlich auch bei Prozess-
beschreibungen auf eine sorgfältige Praxis der Signalzuweisungen zu achten. Signale, denen
in einem Prozess ein Wert zugewiesen wird, dürfen außerhalb des Prozesses keinen Wert
zugewiesen bekommen.
Innerhalb eines Prozesses existieren spezielle Konstrukte zur Schaltungsbeschreibung. Ei-
ne davon ist die if-then-else“-Anweisung, deren Prinzip in Abbildung 4.6 verdeutlicht
”
wird. Diese entspricht dem when else“-Konstrukt in der Datenflussmodellierung. Durch
”
die Schachtelung von Bedingungen ergeben sich unterschiedliche Prioräten, die in der
Synthese je nach Verzweigungen entweder zu Multiplexern oder einem Prioritätsencoder
(sequentielle Modellierung) führen.
Durch die Priorisierung ist die Reihenfolge bei der Abfrage der Bedingungen entschei-
dend. Die Bedingungen sind voneinander unabhängig und können sich auf unterschied-
liche Prüfgegenstände beziehen. Ein Abschluss der Abfrage ohne ‘else“ ist syntaktisch
erlaubt, führt allerdings zu einer unvollständigen Spezifikation.
Listing 4.5 zeigt die Beschreibung eines Prioritäts-Encoders in VHDL im Rahmen ei-
nes kombinatorischen Prozesses. Wenn eine if-Anweisung nicht vollständig spezifiziert ist,
d.h. wenn kein else-Zweig explizit angegeben ist, muss auf den zuletzt zugewiesenen Wert
zurückgegriffen werden. Das Synthesewerkzeug fügt dazu ein speicherndes Element in
Form eines Latches ein. Dies ist allerdings ungewollt, da es die Schaltungskomplexität auf-
bläht, den Entwurf unübersichtlich macht (Stichwort: unsichtbare Speicher, d.h. Speicher,
die im Entwurf nicht explizit spezifiziert sind) und dem Prinzip einer kombinatorischen
Schaltung widerspricht, in dem der Ausgang ausschließlich eine Funktion des Eingangs
ohne internen Zustand (Speicher) sein soll.
Ein weiterer praktischer Aspekt besteht darin, dass moderne FPGAs zugunsten der Lo-
gikdichte mittlerweile auf einen Latch-Modus in den Flipflops verzichten. Daher würde die
Latch-Funktion mit Hilfe von Lookup-Tables (LUTs) emuliert werden, was in der Pra-
xis zu signifikanten Routing-Verzögerungen und damit schlechter Timing Performance
führt. Um die ungewollte Generierung von Latches zu vermeiden, sollte eine if-Anweisung
immer mit einem else-Zweig abgeschlossen werden. Alternativ hat die Zuweisung eines
Default-Wertes an den Ausgang vor der Abfrage den gleichen Effekt. Die zweitgenannte
Möglichkeit ist in Listing 4.5 umgesetzt.
case
Das Syntheseergebnis der VHDL-Beschreibung ist in Abbildung 4.7 dargestellt. Die Kenn-
zeichnung am Gatter (hier: Multiplexer) gibt die Bitbreite und den Wert der angelegten
Konstante an: 1’h1 → Bitbreite 1 / Wert 1 in Hexadezimaldarstellung und 1’h0 → Bit-
breite 1 / Wert 0 in Hexadezimaldarstellung.
Anders als die if-then-else“-Anweisung stellt die case“-Anweisung eine Mehrfach-
” ”
Verzweigung dar, bei der sich alle Auswahloptionen auf den gleichen Prüfgegenstand
beziehen, wie in Abbildung 4.8 skizziert. Diese Art der Abfrage entspricht dem with
”
select“-Konstrukt in der Datenflussmodellierung.
In der Hardwareumsetzung resultiert daraus eine Multiplexerstruktur (sequentielle Mo-
dellierung) oder ein Decoder. Auch Wertetabellen lassen sich komfortabel umsetzen, was
insbesondere für den FPGA-Entwurf sehr interessant ist, da die Tabellen bis zu einer be-
stimmten Größe praktisch unverändert in die Lookup-Tables (LUTs) der konfigurierbaren
Logikblöcke (engl. Configurable Logic Blocks, kurz: CLBs) geschrieben werden, wodurch
die erwünschte Schaltnetzfunktion realisiert wird.
Durch die Auswahl verschiedener Optionen für denselben Prüfgegenstand ist die Reihen-
folge der Optionen beliebig. Diese müssen sich allerdings gegenseitig ausschließen, d.h.
keine Auswahloption darf in zwei oder mehr Verzweigungen berücksichtigt werden. Fer-
ner müssen alle möglichen Werte für den abzufragenden Prüfgegenstand vorkommen. Mit
Hilfe des others“-Zweiges kann ein Default-Fall konstruiert werden, der immer dann zum
”
Tragen kommt, wenn keine der zuvor gelisteten Bedingungen erfüllt wird.
ENTITY Mux2x1New IS
PORT ( IA , IB : IN bit ;
S : IN bit ;
E : IN bit ;
Y : OUT bit
);
END Mux2x1New ;
BEGIN
PROCESS ( IA , IB , S , E )
BEGIN
IF ( E = ’0 ’) THEN
CASE S IS
WHEN ’0 ’ = > Y <= IA ;
WHEN ’1 ’ = > Y <= IB ;
WHEN OTHERS = > Y <= ’0 ’;
END CASE ;
ELSE
Y <= ’0 ’;
END IF ;
END PROCESS ;
END CaseMux ;
E
S Y~1
1'h0 0
Y~0
0 1 Y
IA
1
IB
Listing 4.6 zeigt die Beschreibung eines 2:1-Multiplexers mit Enable-Signal in VHDL, das
zugehörige Syntheseergebnis ist in Abbildung 4.9 dargestellt.
Für die Beschreibung synchroner Schaltungen ist ein eindeutiger Umgang mit Taktsigna-
len erforderlich. Dieser ist durch den sog. taktsynchronen Rahmen gegeben, der wie in
Listing 4.7 gezeigt aus einer Abfrage des Clock-Signals am Anfang des Prozesses defi-
niert ist. Durch die Formulierung CLOCK = ’1’ and CLOCK’event wird die steigende
Flanke des Taktsignals abgefragt. Entsprechend ließe sich auch die fallende Flanke durch
eine Abfrage auf CLOCK = ’0’ beschreiben. Das Signalattribut event ist Bestandteil der
Sprache VHDL und bezeichnet einen beliebigen Signalwechsel.
Alle Signale, denen in einem taktsynchronen Rahmen ein Wert zugewiesen wird, werden zu
Flipflops bzw. Registern synthetisiert. Durch die Zuweisung von Eingang x auf Ausgang y
in Listing 4.7 entspricht die Beschreibung einem flankengetriggerten Flipflop. Die Ausgabe
des Flip-Flops ändert sich nur dann, wenn eine (in diesem Falle) positive Taktflanke
empfangen wird. Andernfalls bleibt die vorherige Ausgabe bestehen.
Häufig werden zusätzlich zu einem synchronen Taktsignal noch ein oder mehrere asyn-
chrone Eingänge (z.B. Reset) verwendet. In diesem Falle müssen die asynchronen Signale
immer vor der Taktflankenabfrage abgefragt werden. Ebenso ist darauf zu achten, dass in
der if-Abfrage der Flanke keine weitere Bedingung (wie z.B. Enable-Abfrage) steht. Jede
weitere Abfrage würde zu einem zusätzlichen Gatter (z.B. AND-Gatter) auf der Clock-
leitung führen und somit eine Verzögerung in der Verteilung des Taktsignals bewirken.
Der resultierende Taktversatz (engl. Clock Skew ) zu weiteren Schaltungsteilen würde das
Designprinzip synchroner Schaltungen verletzen.
ENTITY ABC IS
PORT ( X , Reset , CLK : IN bit ;
Y : OUT bit
);
END ABC ;
END Test ;
werden können, die sich von den Entwicklungswerkzeugen nur schwer oder gar nicht syn-
thetisieren lassen, und zudem in ihrem Zeitverhalten Verwirrung stiften können, sollten
Anfänger die Verwendung von Variablen vermeiden. Abbildung 4.10 illustriert das un-
terschiedliche Zeitverhalten in einem Prozess. Die zugehörige VHDL Beschreibung ist in
Listing 4.8 gegeben.
4.2.3 Strukturbeschreibung
Neben der Verhaltensbeschreibung ist es auch möglich eine Schaltung in Form ihrer Kom-
ponenten zu beschreiben. Diese Form wird Strukturbeschreibung genannt und erfordert
hierarchische Konstrukte.
Die Strukturbeschreibung basiert auf der Verwendung von bereits vorhandenen Schal-
tungsteilen und fügt diese in einen größeren Kontext ein. Dies soll hier anhand eines
Beispiels genauer erläutert werden. Listing 4.9 zeigt die Beschreibung eines AND-Gatters
mit zwei Eingängen.
ENTITY And_2 IS
PORT ( a , b : IN std_logic ;
o : OUT std_logic
);
END And_2 ;
BEGIN
o <= a AND b ;
END Behavior ;
Basierend auf dieser Basiskomponente soll ein AND-Gatter mit drei Eingängen gemäß
der in Abbildung 4.11 gezeigten Struktur beschrieben werden. Damit die vorhandene
Schaltung (2-Input AND) in der neuen Beschreibung (3-Input AND) benutzt werden
kann, muss sie zunächst als Komponente eingebunden werden. Dies geschieht durch das
Abbildung 4.11: Schaltung eines 3-Input AND aus mehreren 2-Input AND-Gattern
Anschließend wird die Komponente im Architecture Body instanziiert. Jede Instanz erhält
eine Bezeichnung zur eindeutigen Referenzierung. Mittels Port Map werden für jede In-
stanz die an der Komponente vorhandenen Portsignale den Signalen der Hauptkomponen-
te zugeordnet. Man spricht bei dieser Hauptkomponente von der Top Entity, da diese ja
aufgrund der Hierarchiebildung der oder den eingebundenen Komponenten übergeordnet
ist.
In der für die Port Map erforderlichen Auflistung muss wieder genau die Reihenfolge der
usprünglichen Entity Deklaration eingehalten werden. Die Portsignale der Komponente
stehen dabei auf der linken Seite, die Signale der Top Entity auf der rechten. Die Zuord-
nung erfolgt durch das Zeichen => (umgedrehter Zuweisungsoperator).
ENTITY And_3 IS
PORT ( a , b , c : IN std_logic ;
o : OUT std_logic
);
END And_3 ;
COMPONENT And_2 IS -- Name und Port - Definition genau so wie in And2 - Entity
PORT ( a , b : IN std_logic ;
o : OUT std_logic
);
END COMPONENT ;
BEGIN
u1 : And_2 -- erste Instanz u1 des And2 - Gatters und Port Mapping
PORT MAP (
a => a, -- Reihenfolge der uebergebenen Signale muss identisch
b => b, -- zu den Signalen in der K o m p o n e n t e n d e k l a r a t i o n sein
o = > s_connect ) ;
u2 : And_2 -- zweite Instanz u2 des And2 - Gatters und Port Mapping
PORT MAP (
a => c,
b = > s_connect ,
o => o );
END Struct ;
Für Verbindungen, die nicht direkt zum Port der Top Entity führen, müssen interne
Signale angelegt werden. Signalen repräsentieren in VHDL physikalische Leitungen bzw.
Busse. Für das gezeigte Beispiel ist das der Fall für die Verbindung zwischen dem Ausgang
des ersten 2-Input AND (Ausgang o von u1) und dem Eingang des zweiten AND-Gatters
(Eingang b von u2). Listing 4.10 zeigt die Beschreibung des 3-Input AND-Gatters unter
Verwendung von zwei 2-Input AND-Gattern.
Die Vorgehensweise in der Strukturbeschreibung mit VHDL entspricht genau dem typi-
schen Vorgehen im diskreten Schaltungsentwurf. Man setzt vorhandene Komponenten mit
genau spezifizierter Funktionalität ein und verdrahtet diese anhand der Informationen des
Datenblattes über die Zuordnung der physikalischen Pins zu den logischen Anschlüssen.
Die Entwicklung von Designs mit Generics“ ermöglicht die Wiederverwendbarkeit von
”
Modulen und erhöht die Flexibilität bei der Einbindung dieser Module. Basierend auf
einer gemeinsamen Grundstruktur kann die Beschreibung ähnlicher Schaltungen mit un-
terschiedlicher Struktur und unterschiedlichem Verhalten erfolgen. Dies geschieht durch
Parametrisierung von Signalvektoren oder parametrisierter Instanziierung von Kompo-
nenten. Erst zum Zeitpunkt der Synthese wird das generische Design mit konkreten Wer-
ten versehen, die dann in der realen Schaltung abgebildet werden.
Listing 4.11 zeigt als Beispiel die Entity eines generischen AND-Gatters. Die Definition
von Parametern für ein VHDL-Modul erfolgt jeweils in der Entity des Moduls.
LIBRARY IEEE ;
USE IEEE . std_lo gic_1164 . ALL ;
ENTITY Andn IS
GENERIC ( n : integer := 8) ;
PORT ( a : IN s t d _ l o g i c _ v e c t o r (n -1 DOWNTO 0) ;
b : IN s t d _ l o g i c _ v e c t o r (n -1 DOWNTO 0) ;
o : OUT s td _ l o g i c _ v e c t o r (n -1 DOWNTO 0)
);
END Andn ;
Es ist öft nützlich, wenn auch nicht zwingend erforderlich, einen Default-Wert für das
Generic“ anzugeben. Bei der Instanziierung einer generischen Komponente kann der
”
Default-Wert, wie in Listing 4.12 zu sehen, mit generic map“ überschrieben werden. Wenn
”
der Default-Wert verwendet werden soll, kann das generic map“ weggelassen werden, ist
”
kein Wert hinterlegt, so ist das generic map“ obligatorisch.
”
u1 : Andn
GENERIC MAP (
n = > 16)
PORT MAP (
...... ) ;
Ein große Vorteil von Generics“ liegt in der unterschiedlichen Instanziierung einer Kom-
”
ponente innerhalb eines Moduls. Jedem Generic“ kann dabei ein anderer Wert zugewiesen
”
werden. Listing 4.13 verdeutlicht dies durch Beispiele.
u2 : Andn
GENERIC MAP (
n = > 16)
PORT MAP (
...... ) ;
u3 : Andn
GENERIC MAP (
n = > 32)
PORT MAP (
...... ) ;
BEGIN
u4 : Andn
GENERIC MAP (
n = > bus_width )
PORT MAP (
...... ) ;
END Struct ;
15
Konstanten können auch innerhalb von Packages oder Entities definiert werden. Hier wird dies jedoch
nicht näher betrachtet.
Viele digitale Systeme können als regelmäßige iterative Zusammenschaltung von Grund-
strukturen oder Komponenten implementiert werden. Wenn ein Entwurf als eine Wieder-
holung von Komponenten beschrieben werden kann, sollte es möglich sein, die Komponen-
te einmal zu spezifizieren und anschließend zu beschreiben wie sie wiederholt instanziiert
werden soll, anstatt jede Instanziierung einzeln zu beschreiben
Die Generate“-Anweisung in VHDL ist ein Konstrukt, das diesen Ansatz für die ef-
”
fiziente Beschreibung eines Entwurfs bzw. für die Erzeugung der iterativen Strukturen
des Entwurfs nutzt. Dabei werden die Komponenten in einer for-Schleife (for-generate-
Anweisung) automatisch instanziiert. Generate“-Anweisungen müssen immer ein Label
”
besitzen. Der Schleifenindex muss nicht extra deklariert werden und kann innerhalb der
Schleife (z.B. bei der Verwendung von Bussignalen) verwendet werden. Durch eine End-
”
Generate“-Anweisung wird die Schleife beendet.
COMPONENT And_2 IS
PORT ( a , b : IN std_logic ;
o : OUT std_logic
);
END COMPONENT ;
BEGIN
UAnd2 : And_2
PORT MAP ( a => a(i),
b => b(i),
o => o(i));
END GENERATE ;
END Complete ;
Listing 4.15 zeigt als Beispiel die Beschreibung eines generischen n-fachen AND-Gatters
unter Wiederverwendung des in Listing 4.9 bereits beschriebenen AND-Gatters mit zwei
Eingängen. Gemäß des Generic“ aus der Entity (vgl. Listing 4.11 werden mit dieser
”
Anweisung n Gatter generiert. Für n = 8 zeigt Abbildung 4.12 das Syntheseergebnis der
resultierenden 8-Bit AND-Schaltung.
Nicht zuletzt durch das gezeigte Syntheseergebnis wird deutlich, dass Generate“-
”
Anweisungen nebenläufige VHDL-Konstrukte sind, die weitere nebenläufige Anweisun-
gen enthalten können, die repliziert werden sollen. Generate“-Anweisungen können in
”
Verbindung mit Generics“ oder Konstanten verwendet werden, um sich wiederholende
”
Strukturen auf effiziente Weise zu erzeugen.
Schleifen-Konstrukte in VHDL umfassen eine oder mehrere Anweisungen, die gemäß ver-
schiedener Schleifentypen und Iterationsbedingungen wiederholt werden. Sie dienen al-
lerdings nicht der Beschreibung sequentiell ausgeführter Logik, sondern der Spezifikation
einer parallelen regelmässigen Struktur.
Es existieren zwei Schleifentypen, die FOR-Schleife und die WHILE-Schleife. Listing 4.16
zeigt die Anwendung einer FOR-Schleife zur Umverdrahtung zwischen MSBs und LSBs
innerhalb eines 12 Bit breiten Busses. Die Anzahl der Iterationen wird durch den in
der Anweisung direkt angegebenen Wertebereich gesteuert. Die dazu nötige Laufvariable
(im gezeigten Beispiel die Variable i) ist nur innerhalb der FOR-Schleife bekannt und
wird bei Verwendung implizit deklariert, muss also vorher nicht definiert werden. Die
nimmt automatisch den Datentyp der Elemente des Wertebereichs an, im in Listing 4.16
gezeigten Beispiels ist dies der Typ INTEGER. Um die Synthetisierbarbeit des Entwurfs
sicherzustellen, müssen die Grenzen des Wertebereichs konstant und bekannt sein.
Variante1 : PROCESS ( x )
CONSTANT bus_width : INTEGER := 11;
BEGIN
FOR i IN 0 TO bus_width LOOP
y ( bus_width - i ) <= x ( i ) ; -- Eingang x auf Ausgang y in
END LOOP ; -- geaenderter Abfolge
END PROCESS Variante1 ;
Eine alternative Beschreibung ohne FOR-Schleife zur Umkehrung der Bits von Ein- zu
Ausgangsbus ist in Listing 4.17 gegeben. Beide Beispiele sind absolut gleichwertig, erzeu-
gen in der Synthese also exakt die gleiche Logik, nur sind die Lösungen in ihrer Beschrei-
bung unterschiedlich elegant.
Variante2 : PROCESS ( x )
BEGIN
y (11) <= x (0) ;
y (10) <= x (1) ;
y (9) <= x (2) ;
y (8) <= x (3) ;
y (7) <= x (4) ;
y (6) <= x (5) ;
y (5) <= x (6) ;
y (4) <= x (7) ;
y (3) <= x (8) ;
y (2) <= x (9) ;
y (1) <= x (10) ;
y (0) <= x (11) ;
END PROCESS Variante2 ;
LIBRARY ieee ;
USE ieee . std_lo gic_1164 . ALL ;
USE ieee . numeric_std . ALL ;
ENTITY DEF IS
PORT ( X : IN s t d _ l o g i c _ v e c t o r (7 DOWNTO 0) ;
Y : OUT s t d _ l o g i c _ v e c t o r (3 DOWNTO 0)
);
END DEF ;
16
Die Datentypkonvertierung in VHDL ist sehr inkonsistent. Je nachdem von welchem Datentyp in wel-
chen Datentyp eine Konvertierung durchgeführt werden muss, sehen Syntax und Form aufgrund der
genutzten Bibliotheken anders aus. Daher sollte im Falle der Notwendigkeit in der entsprechenden Bi-
bliotheksreferenz nachgeschlagen werden, anstatt den Ehrgeiz aufzubringen alle Konvertierungsformen
auswendig zu lernen.
Im Unterschied zur FOR-Schleife muss die Laufvariable außerhalb der Schleife explizit
deklariert werden. Auch die Änderung der Laufvariable und der Abbruch werden explizit
gesteuert. Die WHILE-Schleife iteriert solange über den eingeschlossenen Code, bis der
Ausdruck, auf den sie prüft, nicht mehr als wahr gewertet wird. Im in Listing 4.18 gezeigten
Beispiel ist dies der Fall, wenn die Laufvariable i, die innerhalb der Schleife bei jedem
Durchgang inkrementiert wird, aus dem Bereich < 8 läuft.
Nicht immer muss mit Laufvariablen so regulär verfahren werden. WHILE-Schleifen eig-
nen sich insbesondere für Situationen, in denen im Voraus nicht genau bekannt ist wieviele
Iterationen erforderlich sein werden. Dies bedingt allerdings auch, dass WHILE-Schleifen
nicht einheitlich synthetisierbar sind. Sie sind insbesondere nicht synthetisierbar, wenn die
Abbruchbedingung dynamisch bestimmt wird und die Anzahl der Iterationen auf VHDL
Quellcode-Ebene nicht bekannt ist. Ebenso sind Endlos-Schleifen möglich.
Wie aus der Syntax ersichtlich, weisen die Schleifen eine Ähnlichkeit zur Generate“-
”
Anweisung auf und verhalten sich auch so. Sie dienen einem ähnlichen Zweck, allerdings
sind diese Konstrukte sequentielle Anweisungen und damit nur in Prozessen erlaubt.
Zur effizienten Beschreibung komplexerer Strukturen kann es sinnvoll sein mit eigenen
Datentypen zu arbeiten.
TYPE Bit IS ( ’0 ’ , ’1 ’) ;
TYPE Boolean IS ( False , True ) ;
TYPE Even IS ( ’2 ’ , ’4 ’ , ’6 ’ , 8 ’) ;
TYPE Int_Byte IS RANGE 0 TO 255;
TYPE Bit_Index IS RANGE 31 DOWNTO 0;
Listing 4.19 zeigt Beispiele für die Definition von skalaren Datentypen. Skalare Datentypen
sind solche, deren Elemente nicht mehr weiter zerlegt werden können. In den zwei ersten
Zeilen ist zu Anschauungszwecken die Definition der bereits vordefinierten Datentypen
boolean“ und bit“ gegeben. Die dritte Zeile zeigt die Definition eines eigenen Datentyps
” ”
als Aufzählungstyp durch Angabe einer geordneten Menge von Zeichen. In den zwei letzten
Zeilen werden jeweils eigene Datentypen durch Einschränkung des dem vordefinierten
Datentyps Integer“ entsprechenden, ganzzahligen Intervalls
”
−2.147.483.647 bis + 2.147.483.647
definiert.
x (0) <= y (1) (2) ; -- zwei Klammern , da y ein Array von Vektoren
Durch Definition von Arrays lassen sich mehrere Datenelemente zu einem neuen Datentyp
kombinieren, wobei alle Elemente vom gleichen Datentyp sein müssen. Arrays können
eindimensional oder zweidimensional sein, auch Arrays von Vektoren sind möglich, wie
aus Abbildung 4.13 ersichtlich. Höherdimensionale Arrays sind nicht synthetisierbar.
0 1 0 0 1 0 1 0 0 1
0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 1
1 0 1 1 0 1 0 1 1 0
SIGNAL y : matrix ;
SIGNAL z : matrix2d ;
x (1) <= y (2) (3) ; -- zwei Klammern , da y ein Array von Vektoren
x (2) <= z (2 ,1) ; -- eine Klammer , da z ein 2 D Array
Listing 4.21 zeigt eine alternative Möglichkeit zur Definition eines Arrays von Vektoren
(Zeile 1). Darüber hinaus ist ist auch die zweidimensionale Array-Konstruktion gezeigt, die
nicht auf Vektoren, sondern vollständig auf einer 2D-Anordnung von Skalaren basiert.
TYPE dataset IS
RECORD
a : s t d _ l o g i c _ v e c t o r (11 DOWNTO 0) ;
b : s t d _ l o g i c _ v e c t o r (2 DOWNTO 0) ;
c : std_logic ;
END RECORD ;
Mit Hilfe von Struktur-Datentypen lassen sich auch Elemente unterschiedlicher Daten-
typen zusammenfassen. Dies geschieht durch das Schlüsselwort record“. Die einzelnen
”
Subelemente des neuen Datentyps werden mit Hilfe von Elementnamen referenziert. Lis-
ting 4.22 veranschaulicht dies.
Für nähere Details zur Definition und Verwendung aller möglichen Datentypen sei auf die
Lektüre des Language Reference Manual [VHDL87] (inkl. späterer Ergänzungen) verwie-
sen.
Reset
s1
1
1 0
s2 s3
1 0
s4
0
Abbildung 4.14: Moore-Automat als Beispiel für die Beschreibung in VHDL
Dies soll an dem Beispiel eines Moore-Automat mit asynchronem Reset gemäß Abbil-
dung 4.24 veranschaulicht werden. Dieser Automat zeichnet sich durch
• 4 Zustände s1, s2, s3, s4
• 5 Übergänge
• 1 Eingang x
• 1 Ausgang y
aus. Im folgenden wird die Spezifikation dieses Automaten in VHDL durch die verschie-
denen Beschreibungsformen erläutert.
Ein-Prozess Beschreibung
Bei der Ein-Prozess Beschreibung dient gemäß Abbildung 4.15 genau ein taktsynchroner
Prozess der Beschreibung des Automaten.
Reset
Übergangs- Zustands-
schaltnetz speicher
Clock Ausgangs-
x schaltnetz
y
Prozess
Durch die Zuweisung des Ausgangs innerhalb des taktynchronen Prozesses werden auto-
matisch zusätzliche Register am Ausgang integriert, so dass die Ausgaben immer takt-
synchron erfolgen. Dies mag als Vorteil ausgelegt werden.
Der Nachteil dieser Beschreibungsform liegt in der nicht vorhandenen Trennung zwi-
schen kombinatorischer und taktsynchroner Schaltungsteile. Dies macht den Entwurf
unübersichtlich und spiegelt zudem nur unzureichend die reale Struktur des Automaten
wieder, in der lediglich der Zustandsspeicher ein synchrones Element sein muss.
LIBRARY IEEE ;
USE IEEE . std_lo gic_1164 . ALL ;
ENTITY FSM IS
PORT ( Clk , Reset , x : IN std_logic ;
y : OUT std_logic ) ;
END ENTITY ;
ARCHITECTURE Eins OF FSM IS
TYPE Zustaende IS ( s1 , s2 , s3 , s4 ) ; -- Definition der Zustaende
SIGNAL Zustand : Zustaende ;
BEGIN
PROCESS ( Clk , Reset ) -- sensitiv fuer Clk + Reset
BEGIN
IF ( Reset = ’1 ’) THEN -- asynchrones Reset
Zustand <= s1 ; y <= ’1 ’; -- Initialz ustand und - wert
ELSIF ( Clk = ’1 ’ AND Clk ’ event ) THEN
CASE Zustand IS -- Z u s t a n d s g l i e d e r u n g m . case
WHEN s1 = > IF x = ’1 ’ THEN Zustand <= s2 ; y <= ’1 ’; -- Folgezustand und
ELSE Zustand <= s3 ; y <= ’0 ’; -- Ausgabewert des
END IF ; -- Folgezustands !
WHEN s2 = > Zustand <= s4 ; y <= ’0 ’;
WHEN s3 = > Zustand <= s4 ; y <= ’0 ’;
WHEN s4 = > Zustand <= s1 ; y <= ’1 ’;
WHEN OTHERS = > Zustand <= s1 ; y <= ’1 ’; -- verhindert Blockierung
END CASE ;
END IF ;
END PROCESS ;
END Eins ;
Die VHDL Beschreibung als Ein-Prozess Darstellung ist in Listing 4.23 gegeben. Durch
das synchrone Umfeld ist das Ausgangssignal y ein Register und entspricht bei der Zu-
weisung dem Ausgabewert des Folgezustandes. Dies zeigt sich letztlich auch in dem in
Abbildung 4.16 dargestellten Zeitverhalten durch synchrone Änderungen am Ausgang.
Eingang Beschaltung
SEL[0] Zustand
SEL[1] y
SEL[2] Zustand
Data[0] V CC
Data[1] GN D
Data[2] x
Abbildung 4.17 zeigt das Syntheseergebnis der Ein-Prozess Beschreibung. Zur näheren
Erläuterung sind in Tabelle 4.2 Details zur internen Verschaltung gegeben. In Abbil-
dung 4.18 ist der dem Syntheseergebnis entsprechende Zustandsgraph abgebildet.
Zwei-Prozess Beschreibung
Die Trennung von kombinatorischen (Übergangs- und Ausgangsschaltnetz) und se-
quentiellen Elementen (Zustandsspeicher) führt direkt zur Zwei-Prozess Beschreibung,
wie in Abbildung 4.19 dargestellt. Diese liegt näher an der Hardware und ist zudem
übersichtlicher und leichter erweiterbar.
Reset
Übergangs- Zustands-
schaltnetz speicher
Clock Ausgangs-
x schaltnetz
y
Prozess 2
Nur für Mealy
Prozess 1
Prozess 1 ist kombinatorisch ausgelegt und dient der gemeinsamen Realisierung von
Ausgangs- und Übergangsschaltnetz. Prozess 2 arbeitet taktsynchron und beschreibt den
Zustandsspeicher (D-Flipflops) als Synchronisationsblock für die Weiterschaltung zum
nächsten Zustand.
Die VHDL Beschreibung als Zwei-Prozess Darstellung ist in Listing 4.24 gegeben. Man be-
achte die Sensitivitätslisten der beiden Prozesse. Da für den synchronen Prozess lediglich
das Takt- und das Resetsignal entscheidend sind, finden sich auch nur diese beiden Signale
in der Sensitivitätsliste. Bei asynchronen Prozessen führt die Auflistung aller durch ent-
sprechende Abfragekonstrukte (if..., case...) betroffenen Signale, sowie – falls zutreffend –
alle bei unbedingten Zuweisungen vorkommenden Signale rechts neben dem Signalzuwei-
sungsoperator zu einer korrekten und vollständigen Liste.
Durch die Zuweisung des Ausgangssignals in einem nebenläufigen Prozess bezieht diese
sich immer auf den aktuellen Zustand. Es gibt hier keine Verzögerung wie bei der Ein-
Prozess Darstellung. Die Übernahme des unmittelbar ermittelten Folgezustandes in den
aktuellen Zustand erfolgt jeweils bei der nächsten Taktflanke.
LIBRARY IEEE ;
USE IEEE . std_lo gic_1164 . ALL ;
ENTITY FSM IS
PORT ( Clk , Reset , x : IN std_logic ;
y : OUT std_logic ) ;
END ENTITY ;
ARCHITECTURE Zwei OF FSM IS
TYPE Zustaende IS ( s1 , s2 , s3 , s4 ) ; -- Definition der Zustaende
SIGNAL Zustand , Folgezustand : Zustaende ;
BEGIN
Z u s t a n d s s p e i c h e r : PROCESS ( Clk , Reset ) -- sensitiv fuer Clk + Reset
BEGIN
IF ( Reset = ’1 ’) THEN -- asynchrones Reset
Zustand <= s1 ; -- Initial zustand s1
ELSIF ( Clk = ’1 ’ AND Clk ’ event ) THEN
Zustand <= Folgezustand ; -- synchrones We iterscha lten
END IF ;
END PROCESS Z us t a n d s s p e i c h e r ;
Transitionen : PROCESS (x , Zustand ) -- Folgezustands - und A u s g a n g s b e r e c h n u n g
BEGIN
y <= ’1 ’; -- Initialwert fuer Ausgang
Folgezustand <= s1 ; -- erster Folgezustand vor Auswahl
CASE Zustand IS
WHEN s1 = > IF x = ’1 ’ THEN Folgezustand <= s2 ; -- Folgezustand
ELSE Folgezustand <= s3 ;
END IF ; y <= ’1 ’; -- Ausgabewert des
WHEN s2 = > Folgezustand <= s4 ; y <= ’1 ’; -- aktuellen Zustands !
WHEN s3 = > Folgezustand <= s4 ; y <= ’0 ’;
WHEN s4 = > Folgezustand <= s1 ; y <= ’0 ’;
WHEN OTHERS = > Folgezustand <= s1 ; y <= ’1 ’; -- verhindert Blockierung
END CASE ;
END PROCESS Transitionen ;
END Zwei ;
Die Trennung in zwei Prozesse gestattet bei der Simulation des Zeitverhaltens, wie in Ab-
bildung 4.16 ersichtlich, den Zugriff auf Zwischensignale (hier: das Signal Folgezustand“
”
). Dies kann die Fehlersuche erheblich erleichtern. Zudem führt die Implementierung von
FSMs in Zwei-Prozess Darstellung in der Regel zu kleineren Netzlisten und damit zu
besseren Synthese-Ergebnissen. Natürlich hängt dies in hohem Maße von der Synthese-
Software ab, liegt aber schon darin begründet, dass durch die Trennung von kombinato-
rischen und synchronen Elementen eine günstigere Ausgangslage geschaffen wird. Das in
Abbildung 4.21 gezeigte Syntheseergebnis unterstreicht dies, Abbildung 4.22 ergänzt das
Ergebnis um den Zustandsgraphen.
Drei-Prozess Beschreibung
Werden die zwei kombinatorischen Schaltnetze zur Steuerung des Übergangs- und Aus-
gabeverhaltens ebenfalls voneinander getrennt, resultiert daraus unmittelbar die in Ab-
bildung 4.23 skizzierte Drei-Prozess Beschreibung. Diese verfolgt das gleiche modulare
Prinzip wie die Zwei-Prozess Beschreibung, nur granularer. Von allen Varianten ist diese
am übersichtlichsten und stellt somit die empfohlene bzw. bevorzugte Variante dar.
Reset
Übergangs- Zustands-
schaltnetz speicher
Clock Ausgangs-
x schaltnetz
y
Prozess 1 dient der Realisierung des Übergangsschaltnetzes, Prozess 3 stellt die separate
Realisierung des Ausgangsschaltnetzes dar. Beide sind kombinatorisch ausgelegt. Prozess
2 ist taktsynchron und dient der Realisierung des Zustandsspeichers (D-Flipflops).
In Listing 4.25 ist die vollständige VHDL Beschreibung der Drei-Prozess Darstellung
gegeben. Besonderes Augenmerk sei neben der funktionalen Aufteilung auf die einzelnen
Prozesse auch hier wieder auf die jeweiligen Sensitivitätslisten gerichtet. Zeitverhalten
und Syntheseergebnis entsprechen exakt der Zwei-Prozess Beschreibung, weswegen diese
hier nicht extra nocheinmal gezeigt werden.
LIBRARY IEEE ;
USE IEEE . std_lo gic_1164 . ALL ;
ENTITY FSM IS
PORT ( Clk , Reset , x : IN std_logic ;
y : OUT std_logic ) ;
END ENTITY ;
ARCHITECTURE Drei OF FSM IS
TYPE Zustaende IS ( s1 , s2 , s3 , s4 ) ;
SIGNAL Zustand , Folgezustand : Zustaende ;
BEGIN
Z u s t a n d s s p e i c h e r : PROCESS ( Clk , Reset )
BEGIN
IF ( Reset = ’1 ’) THEN
Zustand <= s1 ;
ELSIF ( Clk = ’1 ’ AND Clk ’ event ) THEN
Zustand <= Folgezustand ;
END IF ;
END PROCESS Z us t a n d s s p e i c h e r ;
Folgezustand : PROCESS (x , Zustand )
BEGIN
CASE Zustand IS
WHEN s1 = > IF x = ’1 ’ THEN Folgezustand <= s2 ;
ELSE Folgezustand <= s3 ;
END IF ;
WHEN s2 = > Folgezustand <= s4 ;
WHEN s3 = > Folgezustand <= s4 ;
WHEN s4 = > Folgezustand <= s1 ;
WHEN OTHERS = > Folgezustand <= s1 ;
END CASE ;
END PROCESS Folgezustand ;
Ausgang : PROCESS ( Zustand )
BEGIN
CASE Zustand IS
WHEN s1 = > y <= ’1 ’;
WHEN s2 = > y <= ’1 ’;
WHEN s3 = > y <= ’0 ’;
WHEN s4 = > y <= ’0 ’;
WHEN OTHERS = > y <= ’0 ’;
END CASE ;
END IF ;
END PROCESS Ausgang ;
END Drei ;
Mealy-Automaten gezeigt. Diese folgt einem festen Ablauf, der sich in folgende Schritte
gliedert:
1. Zustandsfolgetabelle des Moore-Automaten aufstellen
2. zweite Tabelle nach Mealy-Übergangsformat vorbereiten, nach dem die Folge-
zustände und Ausgänge je nach Eingangskonfiguration gruppiert werden.
3. alle Zustände der Zustandsfolgetabelle des Moore-Automaten in das Format des
Mealy-Automaten übertragen, wobei die Ausgabe der Zustände der ersten Spalte
(Moore) verwendet und entsprechend in der zweiten und dritten Spalte (Mealy)
platziert wird
4. evtl. Tabelle durch Entfernung redundanter Zustände vereinfachen
5. Zustandsgraph aus ermittelter Zustandsfolgetabelle des Mealy-Automaten ableiten
Tabelle 4.3 zeigt die Zustandsfolgetabelle des Moore-Automaten. Bei diesem Automaten-
typ hängt der Wert der Ausgangsfunktion ausschließlich vom aktuellen Zustand ab. Daher
lassen sich die erste und letzte Spalte der Tabelle direkt aus Abbildung 4.24 ablesen. In
der mittleren Doppelspalte werden die Übergänge zu den Folgezuständen, abhängig vom
Eingang x eingetragen.
Mealy-Automaten (Tabelle 4.4) sind dies die Zustände s2 und s3. Sie haben jeweils den
gleichen Folgezustand bei gleichem Ausgang, sind also äquivalent.
Reset Reset
0/0
s1 s1
1/1 0/0 1/1
s2
s2 x/1 s3 x/1
x/0
x/0 x/0 s4
s4
Besitzt ein Automat zwei äquivalente Zustände, so können diese zusammengefasst und der
Automat vereinfacht werden. Abbildung 4.24 zeigt den Zustandsgraphen des konvertier-
ten Mealy-Automaten in seiner ursprünglichen Form, sowie die vereinfachte Form durch
Zusammenfassung der Zustände s2 und s3 zu nur einem Zustand s2.
Die Konvertierung von Mealy nach Moore erfolgt nach dem gleichen Prinzip, allerdings
ergibt sich dabei nicht automatisch die gleiche Anzahl von Zuständen. Ein Moore-Automat
benötigt mehr Zustände, so dass diese bei der Zieltabelle entsprechend ergänzt werden
müssen.
Man ermittelt die zu ergänzenden Zustände, indem man die Anzahl der verschiedenen
Ausgänge bestimmt, die einem Folgezustand zugeordnet sind. Die betroffenen Zustände
werden entsprechend der unterschiedlichen, ihm zugeordneten Ausgänge auf mehrere
Zustände aufgeteilt. Das weitere Vorgehen entspricht dem gezeigten Schema in umge-
kehrter Reihenfolge.
Listing 4.26 zeigt nun den Entwurf des Übergangs- und Ausgangsschaltnetzes für den
Automaten in der Mealy-Variante basierend auf der Drei-Prozess Beschreibung. Die Mo-
dellierung des Zustandsspeichers bleibt unverändert. Der Zeitverhalten dieser Variante ist
in Abbildung 4.25 dargestellt und verdeutlicht die Anfälligkeit für Hazards, deutlich zu
sehen im Ausgangssignal y.
Die modulare Entwurfsmethodik in VHDL erlaubt es, sehr komplexe Entwürfe mit einem
hierarchischen Ansatz realisieren zu können. Dies erfolgt durch die Partitionierung eines
Systems in Module. Dieser Ansatz lässt sich auch auf die Realisierung von Zustandsauto-
maten anwenden. Allerdings sind je nach Automatentyp Anpassungen und Optimierungen
notwendig.
Beim Mealy-Automaten werden die Übergangs- und die Ausgangslogik als kombinato-
rische Schaltungen realisiert. Werden mehrere Mealy-Automaten modular hintereinan-
der geschaltet, besteht die Gefahr von kombinatorischen Schleifen. Zusätzlich entstehen
lange Pfade. Die maximale Taktfrequenz wird durch die längste Laufzeit eines Signals
durch die kombinatorische Logik zwischen je zwei Flipflops bestimmt (kritischer Pfad,
vgl. Abschnitt 2.4). Bei gekoppelten Automaten entspricht die Gesamtlaufzeit der Sum-
me der Laufzeiten durch das Ausgangsschaltnetz des ersten Automaten und der durch
das Übergangsschaltnetz des zweiten Automaten. Eine Signaländerung braucht also re-
lativ lange, um sich durch die zusammengesetzte kombinatorische Logik zur nächsten
Flipflopstufe fortzupflanzen. Daher ist die Taktfrequenz stark limitiert.
SET SET
Eingang D Q D Q Ausgang
Kombinatorische
Logik
CLR
Q CLR
Q
Clock
Kombinatorische Schleifen können vermieden und der kritische Pfad verkürzt werden,
wenn am Eingang und / oder Ausgang zusätzliche Flipflops eingefügt werden. Dies ent-
spricht einer Ein- bzw. Ausgangssignalsynchronisation, schematisch angedeutet in Abbil-
dung 4.28. Man spricht von registerten Ein- bzw. Ausgängen.
Auf VHDL-Ebene entspricht die direkte Verwendung der Port-Eingangssignale einer Enti-
ty einer kombinatorischen Weiterleitung (nicht-registert). Sollen registerte Eingänge reali-
siert werden, muss dies durch eine Beschreibung mit internen Signalen, die im sequentiellen
Prozess zugewiesen werden, erfolgen. Für Ausgangssignale gilt das ebenso. Nebenläufige
s1
Zustand Binär Gray One-Hot
s1 00 00 0001
s2 01 01 0010 s4 s2
s3 10 11 0100
s4 11 10 1000
s3
Bei der Binärcodierung werden die Zustände sequentiell durchnummeriert. Damit lässt
sich eine minimale Anzahl an Flipflops zur Codierung erreichen, allerdings auf Kos-
ten komplexer kombinatorischer Logik. Daher sind vor allem CPLDs gut für die Im-
plementierung geeignet, da diese über breite Gatterstrukturen und eine große Menge an
kombinatorischer Logik pro Register verfügen. Mit n Flipflops lassen sich 2n Zustände
17
Da sich die Daten nur mit der aktiven Taktflanke ändern, sind somit Hazards und Spikes ausgeschlossen.
18
Insbesondere beim Design von Zählern ist dies kritisch, da es dort häufig zu Zustandswechseln und
einem Umschalten in die höherwertigere Bitebene kommt.
TYPE Zustaende IS ( s1 , s2 , s3 , s4 ) ;
SIGNAL Zustand : Zustaende ;
-- o d e r --
TYPE Zustaende IS ( s1 , s2 , s3 , s4 ) ;
ATTRIBUTE enum_encoding : string ;
ATTRIBUTE enum_encoding OF Zustaende : TYPE IS " 11 10 01 00 " ;
SIGNAL Zustand : Zustaende ;
-- o d e r --
Es birgt Vorteile, die Zustandscodierung der FSM selbst in die Hand zu nehmen. Die
konkrete Art der Zustandscodierung lässt sich auf Typ-Ebene definieren. Das Synthese-
attribut enum encoding ist Bestandteil der Sprache VHDL und definiert wie zuvor defi-
nierte Aufzählungstypen bei der Synthese codiert werden sollen. Beliebige, benutzerde-
finierte Codierungen sind möglich. Das Attribut enum encoding muss der Definition des
Aufzählungstypen folgen, aber seiner Verwendung vorausgehen. Darüber hinaus muss der
Attributwert ein String sein, das die beliebige Benutzercodierung angibt. Diese besteht
letztlich aus einer durch Leerzeichen getrennten Liste von Codes. Die Liste muss so viele
Codes enthalten wie Elemente im Aufzählungstyp vorhanden sind, außerdem müssen alle
Codes die gleiche Länge haben.
Je nach Synthesetool gibt es bei der Verwendung des Attributes enum encoding Ein-
schränkungen. Die volle Kontrolle über die Zustandscodierung der FSM und damit die
Unabhängigkeit von der Leistungsfähigkeit der Synthesesoftware liefert die manuelle Co-
dierung. Es wird ein eigener Subtyp eines bestehenden Vektordatentypen angelegt und
anschließend Konstanten dieses Typs. Die Konstanten sind so definiert, dass sie die ent-
sprechenden Zustände des Zustandsautomaten repräsentieren. Bei der Festlegung der Co-
des hat der Entwickler alle Freiheiten. Der Vorteil dieser Variante besteht darin, dass
die Festlegung der Codierung zwischen verschiedenen Synthesewerkzeugen portabel und
damit herstellerunabhängig ist. Der Nachteil ist der erhöhte Schreibaufwand auf VHDL
Code-Ebene.
Je nachdem, wie viele Zustände ein Zustandsautomaten besitzt und welche Zustandsco-
dierungsart gewählt wurde, gilt dieser als sicher oder unsicher. Im Zuge der Optimierung
sollte es auch das erklärte Ziel sein, den zu entwickelnden Zustandsautomaten sicher zu
machen. Wenn die Anzahl der Zustände m eine Potenz von 2 ist und ein binärer oder Gray
Code verwendet wird, ist der Zustandsautomat sicher. Zur Zustandscodierung werden
dann n Flipflops gemäß m = 2n verwendet. Da alle möglichen Zustandswerte (oder Flip-
flopzustände) erreichbar sind, ist der Entwurf sicher. Existieren allerdings m Zuständen
und es gilt m < 2n , oder es wird keine Binär- oder Gray-Codierung verwendet, so ist
der Zustandsautomat unsicher. In diesem Falle können Bitsequenzen vorkommen, die zur
Codierung nicht ausgenutzt werden. Man spricht von Pseudozuständen.
Generell werden die nicht erreichbaren Pseudozustände vom Synthesetool wegoptimiert.
Manchmal führt die Optimierung jedoch nicht zu einer für alle Szenarien sicheren Schal-
tung. Wird die Schaltung schon per Reset in einen ungültigen Zustand versetzt oder wird
diese in einer extremen Umgebung betrieben, kann beispielsweise durch Spannungsspit-
zen oder induzierte Strahlung ein fehlerhafter Zustand entstehen, der dazu führt, dass der
Automat hängebleibt“ und unbegrenzt in dem undefinierten Zustand verbleibt und nie
”
wieder in seinen normalen Betriebszustand zurückkehrt.
Pseudozustände müssen also im Entwurf explizit adressiert werden. Eine sinnvolle Zu-
standscodierung kann helfen, ebenso die klare Definition über eine mögliche Rückkehr
aus Pseudozuständen. Es existieren drei wesentliche Strategien zur Risikominimierung
von Pseudozuständen:
• Aufzählungstyp für Zustände mit Anzahl von Elementen (Zustandsnamen) dekla-
rieren, die Zweierpotenz entspricht
• case-Anweisung einer FSM mit when others“-Statement abschließen, um Rückkehr
”
aus unvorhergesehenen Zuständen explizit zu spezifizieren
• Codierungsschema für Elemente (Zustandsnamen) auf Bitebene spezifizieren
Falls möglich, sollte die Anzahl der Zustände immer auf eine Potenz von 2 gebracht wer-
den. Entscheidend ist dabei, dass alle Zustände auch genutzt werden. Allgemein können
Pseudozustände auch durch das when others“-Statement einer case-Anweisung abgedeckt
”
werden. Die Default-Einstellung der meisten Synthesetools entfernt allerdings unerreich-
bare Zustände, um die Performance der resultierenden Schaltung zu erhöhen. Dieser Op-
timierungsschritt birgt die Gefahr wiederum eine unsichere Schaltung zu generieren. Am
sichersten ist die Strategie, eine manuelle Codierung auf Bitebene per Konstanten zu ver-
wenden (vgl. Listing 4.27, Beispiel 3). Unabhängig von der Anzahl der Zustände wird das
Syntheseergebnis – auch bei Durchführung von Optimierungen seitens des Synthesetools
– aufgrund der nicht änderbaren Konstanten immer sicher sein.
Dieses Kapitel beschreibt die Grundsätze und Details bei der Designverifikation mit
VHDL. Ansätze für Verifikationsstrategien werden vermittelt, ebenso stehen die Struk-
turierung und der Entwurf umfangreicher und komplexer VHDL-Testbenches im Fokus.
Grundlagen zur digitalen Simulation ergänzen den Inhalt.
Testbench
Nach Eingabe des VHDL-Codes und vor der Synthese lässt sich zunächst eine funktio-
nale Simulation durchführen, die der syntaktischen und funktionalen Überprüfung des
Codes dient. VHDL bietet viele Funktionen, die für die Simulation von digitalen Schal-
tungsentwürfen genutzt werden können. Dies geschieht im Rahmen einer sogenannten
Testbench, einer Umgebung zur Validierung des Entwurfs oder Modells, schematisch dar-
gestellt in Abbildung 5.1.
Die Testbench ist selbst eine VHDL-Datei, allerdings mit leerer Schnittstelle. In ihr sind
Schaltungsstimuli (Stimulisignale) und die entsprechenden, erwarteten Ausgaben hinter-
legt, die das zeitliche Verhalten der zu testenden Schaltung (DUT, engl. Device Under
Test) abbilden. Das DUT kann einzeln oder mit anderen DUTs getestet werden. Testben-
ches sind ein integraler Bestandteil eines jeden VHDL-Projekts und sollten immer zusam-
men mit der eigentlichen Schaltung entworfen werden. Aufgrund der Überprüfung aller
89
KAPITEL 5. SIMULATION UND ZEITVERHALTEN IM DIGITALENTWURF
Möglichkeiten haben Testbenches oft eine beachtliche Größe und deutlich mehr VHDL-
Code als das Design selbt. Auch kann die Simulationszeit beträchtlich sein.
Listing 5.1 zeigt das Gerüst einer Testbench für einen Multiplexer als DUT. Der Stimulus-
Prozess in der Architecture beschreibt die Zeitverläufe der Anregungssignale. Nicht darge-
stellt in dem Gerüst sind die obligatorische Instanziierung des DUT, sowie ein optionaler
Prozess zur Überprüfung der Ausgaben.
BEGIN
stimulus : PROCESS -- keine S e n s i t i v i t a e t s l i s t e
BEGIN
E <= ’1 ’; S <= ’1 ’; IA <= ’1 ’; IB <= ’0 ’; WAIT FOR 150 ns ;
E <= ’0 ’; S <= ’1 ’; IA <= ’0 ’; IB <= ’1 ’; WAIT FOR 150 ns ;
E <= ’0 ’; S <= ’0 ’; IA <= ’1 ’; IB <= ’0 ’; WAIT FOR 100 ns ;
E <= ’0 ’; S <= ’1 ’; IA <= ’1 ’; IB <= ’1 ’; WAIT FOR 100 ns ;
E <= ’0 ’; S <= ’0 ’; IA <= ’0 ’; IB <= ’1 ’; WAIT FOR 100 ns ;
END PROCESS stimulus ; -- nach 600 ns wieder von vorne
END testbench ;
Das Verhalten des VHDL-Simulators lässt sich in definierten Fehlerfällen durch die Aus-
gabe von Fehlermeldungen und Warnungen bei bestimmen Bedingungen beeinflussen.
Dies geschieht durch sogenannte Assertions. Listing 5.3 illustriert dies anhand von zwei
Beispielen.
19
Die Testbench ist hierarchisch eine übergeordnete Einheit. Daher enthält sie keine Portsignale nach
außen und kann in ihren Prozessen auch nicht auf Signale reagieren. Eine Sensitivitätsliste ergibt also
keinen Sinn.
ASSERT ( x = y )
REPORT " Hinweis : x ist nicht y ! "
SEVERITY NOTE ;
ASSERT ( z = ’0 ’)
REPORT " Fehler gefunden ! z muss 0 sein ! "
SEVERITY FAILURE ;
Die Assert-Anweisung prüft die angegebene boolesche Bedingung und gibt im Falle eines
falschen Prüfwertes eine Nachricht mit dem report-String im Simulator aus. Die Fehler-
klasse kann durch das Schlüsselwort Severity als Hinweis (engl. note), Warnung (engl.
warning), Fehler (engl. error ) oder Defekt (engl. failure) definiert und folgendermaßen
genutzt werden:
• note → dient der Ausgabe von allgemeinen Informationen
• warning → dient der Anzeige von möglichen unerwünschten Bedingungen
• error → dient der Meldung über den Erhalt eines falschen Ergebnisses
• failure → dient der Anzeige über eine nicht durchführbare Operation und führt
normalerweise zum Abbruch der Simulation
Wird in der Anweisung keine Fehlerklasse angegeben, findet eine Einordnung in die Klasse
error statt. Auch ist die Angabe eines Benachrichtigungstextes per report-String nicht
zwingend. Wird diese weggelassen, so wird eine Standardmeldung ausgegeben. Assertions
können sowohl als nebenläufige (direkt in der Architecture), als auch als sequentielle
Anweisungen (innerhalb eines Prozesses) formuliert werden. Da diese in der Hardware-
Umsetzung jedoch keine Bedeutung haben, werden sie vom Synthesetools ignoriert.
Die reine Funktionssimulation approximiert das Verhalten eines Schaltungsentwurfs unter
der Annahme, dass sich alle Ausgänge gleichzeitig ändern. Verzögerungszeiten spielen bei
der funktionalen Simulation keine Rolle, da in der Regel genau die Schaltungsbeschrei-
bungen simuliert werden, die später auch auf der Ziel-Hardware (FPGA) implementiert
werden. Die tatsächlichen Verzögerungszeiten sind ohnehin erst nach dem Placement &
Routing auf dem FPGA verfügbar.
Verzögerungszeiten können allerdings schon in der Simulation durch symbolische Lauf-
zeiten nachgebildet werden. Damit ist die Evalierung von Laufzeiteffekten und da-
mit des genauen Verhaltens der Hardware möglich. Man nutzt verzögerungsbehaftete
Signalzuweisungen, die nicht synthesefähig sind. In VHDL existieren unterschiedliche
Verzögerungsmodelle, auf die in Abschnitt 5.3 näher eingegangen wird.
High und High → Low, in der MOS-Technologie sind tpLH und tpHL in etwa gleich (vgl.
Abschnitt 6.2).
Während die funktionale Simulation einzig der syntaktischen und funktionalen
Überprüfung des Codes dient, lässt sich duch eine Timing-Analyse beobachten wie lange
es dauert, bis sich eine Änderung an den Eingängen auf den Ausgang auswirkt und welche
laufzeitbedingten Phänomente zum Tragen kommen.
Verschiedene Pfade durch die kombinatorische Logikschaltung benötigen unterschiedli-
che Signallaufzeiten, da Gatter in unterschiedlicher Anzahl und mit unterschiedlichen
Propagation Delays vorkommen können. Dadurch entstehen kritische Wettrennen“ von
”
Signalen, die Race Conditions genannt werden und zu fehlerhaften Zwischenzuständen
(Hazards) führen können. Da die Ursache in der Struktur des realisierten Schaltnetzes
liegt, spricht man von Strukturhazards. Abbildung 5.2 zeigt dazu eine Beispielschaltung
mit zugehörigem KV-Diagramm. Es sei angenommen, dass jedes Gatter ein Propagation
Delays von tp = 10ns aufweise.
X1 c1 X0
&
Y :
X2
c2 >=1 Y
X2 1 0 0 0 1
&
X0 c3 X1 0 1 1 1
ENTITY Hazard IS
PORT ( X0 , X1 , X2 : IN bit ;
Y : OUT bit
);
END Hazard ;
SIGNAL c1 , c2 , c3 : bit ;
BEGIN
c1 <= X1 AND X2 AFTER 10 ns ;
c2 <= NOT X2 AFTER 10 ns ;
c3 <= X0 AND c2 AFTER 10 ns ;
Y <= c1 OR c3 AFTER 10 ns ;
END Timing ;
Alle drei Eingänge x0, x1 und x2 sind zu Anfang auf den Signalwert 1 gesetzt. Bei
t = 100ns ändert sich der Wert des Signals x2 von 1 auf 0. Für die Bestimmung des
Ausgangs y wird x2 einmal in seiner negierten und einmal in seiner nicht-negierten Form
verwendet. Durch die am NOT-Gatter auftretende Verzögerung wird der Zwischenwert c1
früher gebildet als der Zwischenwert c3, beide sind jedoch durch das OR-Gatter verknüpft
für den Ausgang y verantwortlich. Da der Sprung 0 → 1 durch das NOT-Gatter verzögert
an c3 auftritt, liegt am OR-Gatter für eine Dauer von 10ns auf beiden Eingängen eine 0
an und kommt es bei t = 125ns zu einem Hazard des Ausgangssignals y.
Bei t = 200ns ändert sich der Wert des Signals x2 erneut, diesmal von 0 auf 1 zurück.
Ein bei t = 225ns theoretisch möglicher Hazard tritt hier allerdings nicht auf, da durch
den verzögerten Wechsel 1 → 0 an c3 dennoch immer mindestens eine 1 am OR-Gatter
anliegt. Logisch hat dies keine Auswirkung auf y.
Ein Strukturhazard ist grundsätzlich behebbar durch Änderung der Struktur des Schalt-
netzes unter Beibehaltung der Funktion. Die Ursache von Strukturhazards liegt immer in
unverbundenen Vereinigungsblöcken. Im vorliegenden Beispiel sind das die Terme x1 · x2
und x0 · x2. Beim Pegelwechsel von x2 wird von einem Produktterm auf den anderen um-
geschaltet, wegen der Invertierung des x2-Signals dauert die Bildung der Produktterme
aber unterschiedlich lange. Ein zusätzlicher, überlappender Produktterm schafft hier Ab-
hilfe. Diese Methode funktioniert immer. Abbildung 5.4 zeigt die resultierende Schaltung
inklusive KV-Tafel.
X1 c1
&
X0
c2
X2 1 Y :
c3 X2
& >=1 Y
X0 0 0 0 1
X1 0
1
1
1
c4
&
5.3.1 Simulationsablauf
Warten
Ausführung Signal-
beendet ereignis
Ausführen
+1d
Während der Simulation befindet sich jeder Prozess gemäß Abbildung 5.5 in einem
von zwei aufeinanderfolgenden Zuständen. Bei Änderung eines Signals aus der Sensiti-
vitätsliste (Signal Event) geht der Prozess in den Ausführungszustand über.
Im Ausführungszustand werden alle Anweisungen des Prozesses innerhalb eines Delta-
Zyklus sequentiell abgearbeitet und solange wiederholt, bis sich ein stabiler Zustand
einstellt. Delta-Zyklen werden so oft zu einer Simulationszeit hinzugefügt, wie es Si-
gnaländerung zu diesem Simulationszeitpunkt gibt. Signale werden dabei noch nicht
verändert. Die Änderungen werden (mit Zeitstempel) in einer Transaktionsliste vorge-
merkt. Die Simulationszeit bleibt dabei stehen. Gibt es keine Signaländerungen mehr,
wird ein echter Zeitschritt bis zum nächsten Ereignis getätigt
Innerhalb eines Prozesses können Signalen unterschiedliche Werte zugewiesen werden.
Erst am Ende des Prozesses werden alle Signale, die durch den Prozess verändert wur-
den, entsprechend der Transaktionslist aktualisiert. Bei Zuweisung unterschiedlicher Wer-
te wird die letzte Zuweisung übernommen. Zeitverzögerte Änderungen erfolgen entspre-
chend später. Im Wartezustand bleiben alle Signalwerte bis zum nächsten Prozessdurch-
lauf unverändert. Die Simulationszeit schreitet voran bis zum nächsten auszuwertenden
Ereignis.
Die gegenseitige Aktivierung von Prozessen verläuft ebenfalls in jeweils einem Delta-
Zyklus. Alle aktiven Prozesse werden quasi parallel abgearbeitet. Im Simulator werden
die Signale erst angezeigt, wenn das System stabil ist. Das Konzept der Delta-Zylen lässt
sich am besten anhand eines Beispiels verdeutlichen. Für die in Abbildung 5.6 gezeigte
Beispielschaltung soll das Verhalten am Ausgang c für eine Eingangsänderung 1 → 0
bestimmt werden.
a
In: 1à0 1 c
&
b
&
1
Das Eingangssignal muss insgesamt drei Gatter passieren, ehe der Ausgang c bestimmt
werden kann. Nach dem NOT-Gatter am Eingang (Zwischensignal a) können für die
Bestimmung von c zwei Pfade eingeschlagen werden. Entweder es wird zuerst das NAND-
Gatter (Zwischensignal b) oder das AND-Gatter (Ausgang c) evaluiert. Je nachdem wel-
cher Pfad zuerst bestimmt wird, kann es zu zwischenzeitlichen Wechseln bei den zu be-
stimmenden Signalwerten kommen. Tabelle 5.1 verdeutlicht dies.
Je nach Komplexität der Schaltung können auch mehrere Iterationen erforderlich sein,
um das Ausgangssignal schließlich zu bestimmen. Es gestaltet sich mit diesem Vorgehen
also zufällig nach wievielen Schritten das Ergebnis vorliegt, je nachdem welcher sequenti-
elle Ablauf in der Evaluierung der Gatter gewählt wurde. Diese Problematik wird durch
Delta-Zyklen vermieden. Die gleiche Problemstellung mit Hilfe von Delta-Zyklen gelöst
zeigt Tabelle 5.2. Besonderes Augenmerk sei auf die Abfolge mehrerer Delta-Zyklen zu
einem festen Simulationszeitpunkt gerichtet. Zu jedem Delta-Zyklus ist das auslösende
Signalereignis, sowie die sich daraus ergebende Abhängigkeit für den nächsten Schritt
aufgetragen.
Die Herausforderung einer sinnvollen Abfolge in der Logikevaluierung, wie sie durch das
Hilfmittel der Delta-Zyklen ermöglicht wird, ist in realen Schaltungen natürlich nicht
gegeben, sondern tritt nur in physikalischen Simulationen auf.
5.3.2 Verzögerungsmodelle
LIBRARY ieee ;
USE ieee . std_lo gic_1164 . ALL ;
ENTITY Delaymodel IS
PORT ( dummy_in : IN bit ;
dummy1_out , dummy2_out : OUT bit
);
END Delaymodel ;
BEGIN
dummy1_out <= NOT dummy_in AFTER 10 ns ;
dummy2_out <= TRANSPORT NOT dummy_in AFTER 10 ns ;
END Behavior ;
Das Simulationsergebnis ist in Abbildung 5.7 dargestellt. Der Signalverlauf des Ein-
gangssignals zeigt einen 5ns kurzen Signalwechsel bei 200ns, der beim Ausgangssignal
dummy1 out“ nicht mehr zu sehen ist. Der Signalwechsel ist kürzer als die spezifizier-
”
te Verzögerung und wird daher durch das Trägheitsmodell entfernt. Das Ausgangssignal
dummy2 out“ zeigt indes den kurzen Signalwechsel. Die nichtträge Verzögerung führt
”
dazu, dass das Ausgangssignal dem Eingang in der in der Verzögerungsanweisung ange-
gebenen Zeitspanne folgt, unabhängig davon wie schnell Signaländerungen erfolgen.
Die unterschiedliche Wirkungsweise der Verzögerungsmodelle wird durch das Vorgehen
des Simulators anhand der Transaktionsliste, schematisch dargestellt in Abbildung 5.8,
ermöglicht. Alle Signalzuweisungen werden zur späteren Aktualisierung in die Transakti-
onsliste eingetragen. Diese umfasst die Wertezuweisungnen sowie den Zeitpunkt, zu dem
diese Transaktion stattfinden soll. Signalzuweisungen erfolgen also nicht sofort.
Abbildung 5.7: Unterschiede zwischen Inertial und Transport Delay Modell in der Simulation
Die Liste ist nach zunehmender Zeit sortiert. Wenn eine neue Transaktion zeitlich vor
der ursprünglichen Transaktion liegt, wird die vorhandene Transaktion überschrieben.
Liegt die neue Transaktion zeitlich nach der ursprünglichen Signaländerung, wird die
neue Transaktion am Ende der Liste hinzugefügt. Dies sollte insbesondere bei verzögerten
Signalzuweisungen in Testbenches berücksichtigt werden, bei denen die einzelnen Zeit-
schritte bei aufeinanderfolgenden after-Anweisungen auch immer in aufsteigender zeitli-
cher Abfolge spezifiziert sein müssen.
Je nach Verzögerungsmodell werden die Transaktionen in der Liste unterschiedlich be-
handelt. Beim Transport Delay Modell erfolgt die Behandlung wie soeben beschrieben.
Der Unterschied beim Inertial Delay Modell besteht darin, dass zusätzlich zu dem Vorge-
hen Transaktionen mit kürzerer Impulsdauer als die spezifizierte Impulsverzögerungszeit
entfernt werden.
Transaktionen
Zeit …. t4 t3 t2 t1 0
Treiberwert
Wert …. v4 v3 v2 v1 Signal
Signaltreiber
Das Inertial Delay Modell, wie auch das Transport Delay Modell, ermöglichen es dem
Entwickler, verschiedene zeitliche Verhaltensweise auf der VHDL-Ebene zu modellieren.
Insbesondere bei der Testbench-Modellierung kann dies nützlich sein, um Verzögerungen
sowohl auf Board-Ebene als auch innerhalb eines Schaltkreises darzustellen und zu unter-
suchen.
20
Damit sind ICs mit fester Funktion gemeint, die für eine bestimmte Aufgabe konzipiert worden sind.
Diese diskreten Bauteile müssen auf einer Leiterplatte zu einer kompletten Schaltung zusammengefügt
werden. Dies bedingt in der Regel auch die Verwendung weiterer peripherer simpler Logik (engl. Glue
Logic), um die handelsüblichen integrierten Schaltungen zu verbinden.
99
KAPITEL 6. LOGIKARCHITEKTUREN UND HALBLEITERTECHNOLOGIE
ROMs enthalten bei der Herstellung verdrahtete und nicht änderbare Information, ein
PROM (Abk. engl. Programmable ROM ) kann dagegen einmalig vom Anwender program-
miert werden. Daher ist auch die Bezeichnung OTP-ROM (engl. One Time Programmable)
üblich, beschreibt aber das gleiche. Zu den Speichern, die löschbar und wiederbeschreibbar
sind, zählen EPROM (engl. Erasable Programmable Read Only Memory) und EEPROM
(engl. Electrically Erasable Programmable Read-Only Memory).
Das Löschen erfolgt bei EPROMs durch eine UV-Lichtquelle (Ultraviolett), die durch ein
Quarzfenster in das Innere des EPROM-Gehäuses scheint. Beim EEPROM wird ein elek-
trisches Feld anstelle einer UV-Lichtquelle verwendet. Die Programmierung erfolgt mit
Hilfe spezieller Programmiergeräte. EPROMs bieten im Vergleich zu PROMs eine gerin-
gere Speicherdauer, da das EPROM für Strahlung und elektrisches Rauschen empfänglich
ist. EEPROMs sind weniger anfällig.
Programmierbare
Rückkopplung
Wahrheitstabellen können auch in flüchtigen Speichern abgelegt werden. Dazu zählen sta-
tische und dynamische Speicher, also SRAM (Abk. engl. Static Random Access Memory)
oder DRAM (Abk. engl. Dynamic Random Access Memory). Diese können im Betrieb
beliebig beschrieben und ausgelesen werden, verlieren aber ihren Speicherinhalt nach dem
Abschalten der Versorgungsspannung.
Andererseits kann die Logik direkt als boolesche Funktion realisiert werden. In dieser
Kategorie unterscheidet man wiederum zwischen PLDs und FPGAs. Tabelle 6.2 gibt einen
Überblick über die Bausteine dieser Kategorie. Zu den PLDs zählen das PLA (Abk. engl.
Programmable Logic Array) und das PAL (Abk. eng. Programmable Array Logic). Diese
einfachen programmierbaren logischen Schaltungen bestehen typischerweise aus einem
Array von AND-Gattern und einem Array von OR-Gattern.
Abbildung 6.1 zeigt den prinzipiellen Aufbau. Einzelne PLDs unterscheiden sich in Breite
und Programmierbarkeit der Arrays. Eine Rückkopplung ermöglicht die Einbeziehung des
In-Circuit Programming
PALs wurden 1978 von der Firma Monolithic Memories Inc. (MMI) eingeführt. PALs
sind Sonderformen von PLAs, bei denen sowohl das UND-Array als auch das ODER-
Array programmierbar ist. PLAs sind inzwischen sehr selten und fast vollständig vom
Markt verschwunden. Während PALs nur einmal beschreibbar sind, stellen GALs (Abk.
engl. Generic Array Logic) eine Weiterentwicklung der PALs dar, die mehrfach (elektrisch)
beschreibbar ist.
Ein CPLD (Abk. engl. Complex Programmable Logic Device) kombiniert intern eine Viel-
zahl von PLD-Blöcken, deren Ein- und Ausgänge durch eine globale Verbindungsmatrix
miteinander verbunden sind. Somit hat ein CPLD zwei Ebenen der Programmierbarkeit:
Jeder PLD-Block kann programmiert werden, zusätzlich auch die Verbindungen zwischen
den PLDs.
Field Programmable Gate Arrays (FPGAs) wurden erstmals 1985 von der Firma Xilinx
vorgestellt und bestehen ähnlich wie ein CPLD aus untereinander vernetzten Blöcken,
jedoch sind diese komplexer. Es existieren drei programmierbare Hauptkomponenten:
Logikzellen, Verbindungsnetze und Input/Output-Zellen. Diese können vom Anwender
zuammenhängend programmiert werden. Die physikalische Struktur und die Art der Pro-
grammierung durch entsprechende Design-Software ist herstellerabhängig. Zu den größten
Herstellern zählen neben Xilinx noch Altera (inzwischen Intel21 ) und Lattice.
Heutzutage hat nur noch der Einsatz von CPLDs und FPGAs praktische Relevanz.
Dies ist – verglichen mit den anderen programmierbaren Bausteinen – in den geringeren
Einschränkungen, den größeren Logikressourcen und der Verwendung einer einheitlichen
Hardware-Programmiersprache begründet.
21
Die Übernahme des Chipherstellers Altera durch Intel wurde Ende 2015 abgeschlossen.
Mit einem ROM können kombinatorische Schaltungen realisiert werden, da der ROM-
Inhalt als Funktion der anliegenden Adresse interpretiert werden kann. Die Information
über das Verhalten der Schaltung wird in der Struktur und den Verbindungen des Spei-
chers gehalten, ohne dass tatsächlich Speicherkapazität benötigt wird.
I0 O0
feste UND-Matrix programmierbarer
I1 O1
ODER-Speicher
In-1 n à 2n Adress-Decoder 2n / k Matrix Ok-1
2n Minterm-Leitungen
Abbildung 6.2 zeigt die Struktur des Speichers mit n Eingängen und k Ausgängen. Das
PROM verfügt über eine feste AND-Matrix (als n/2n -Decoder aufgebaut) und program-
mierbare Verbindungen zu der OR-Matrix am Ausgang.
Das PROM implementiert boolesche Funktionen als Summen von Mintermen, indem jede
Eingangsadresse eine von 2n Minterm- Ausgangsleitungen auswählt. Alle 2n Minterme
können auf jeden der k OR-Ausgänge gelegt werden, wobei jede mögliche OR-Verbindung
einem Programmierbit entspricht.
I2 I1 I0
1
prog. Verbindungen
&
&
&
&
&
&
&
&
>=1
>=1
>=1
>=1
O3 O2 O1 O0
feste Verbindungen
x0 1
x1 1
x2 1
entspricht
x x x x >=1 y0 x0
prog. Verbindungen
x x x x >=1 y1 x1
x x x x >=1 y2 x2
x x x x >=1 y3 Parity-Bit
Sowohl ROM als auch PAL können verwendet werden, um beliebige logische Funktionen in
Form von Summenprodukten zu implementieren. Beim Entwurf mit einem PAL-Baustein
müssen die booleschen Funktionen allerdings vereinfacht werden, was in der Struktur des
Bausteins begründet ist.
I0 O0
programmierbare
I1 feste ODER-Matrix O1
UND-Matrix
In-1 mit 2n Eingängen Ok-1
p Produktterm-Leitungen
Ein Blockdiagramm des PAL ist in Abbildung 6.5 dargestellt. Es besteht aus n Eingängen,
k Ausgängen und p Produkttermen. In PALs wird anstelle eines Decoders wie in PROMs
eine AND-Matrix bestehend aus p AND-Gattern verwendet, wobei p < 2n ist.
prog. UND-Matrix
x0 1
x1 1
x2 1
x3 1
x4 1
x5 1
x6 1
x7 1
x8 1
>=1 y0
>=1 y1
>=1 y2
>=1 y3
Jedes der AND-Gatter kann so programmiert werden, dass es einen Produktterm der
Eingangsvariablen und nicht wie im ROM alle Minterme erzeugt. Alle n Eingänge können
in jedem Produktterm verwendet werden22 . Von den p Produktterme wird über die festen
Verbindungen der OR-Matrix eine beschränkte Anzahl zu je einem Ausgang verknüpft.
Da das PAL k Ausgänge hat, beträgt die Anzahl der OR-Gatter ebenfalls k.
Ein Produktterm kann nicht für mehrere Ausgänge gemeinsam verwendet werden. Dies
schränkt die Flexibilität bei der Implementierung ein. Zudem sollte beachtet werden, dass
beim PAL nur die Terme, die tatsächlich benötigt werden, in der AND-Matrix program-
miert werden, während in einem ROM alle Minterme durch die AND-Matrix erzeugt
werden müssen. Die Kennzeichnung eines PALs erfolgt in Abgrenzung zum ROM durch
die Angabe n x p x k.
x x
x0 1
prog. Verbindungen
x x
x x
x1 1
x x
x x
x2 1
x x
feste Verbindungen
entspricht
>=1 y0 Parity-Bit
>=1 y1
Der in Abbildung 6.6 gezeigte Aufbau eines 9 x 20 x 4 PAL zeichnet sich durch 9 Eingänge
und 4 Ausgänge aus. Jeder Eingang hat ein Buffer-Inverter-Gatter, jeder Ausgang wird
durch ein festes OR-Gatter erzeugt. Der Baustein hat 4 Abschnitte, die jeweils aus einer
5-Bit breiten AND-OR-Verbindung bestehen, d.h. in jedem Abschnitt gibt es 5 program-
mierbare AND-Gatter. Jedes AND-Gatter hat 18 programmierbare Eingangsanschlüsse,
die durch 18 horizontale Linien (als Ausgänge der Buffer-Inverter-Gatter) angezeigt wer-
den, die jede vertikale Linie schneiden. Die vertikale Linie symbolisiert die Mehrfach-
Eingangskonfiguration eines AND-Gatters.
Jeder Produktterm ist einem speziellen OR-Gatter zugeordnet. Damit ist die Anzahl der
Produktterme in jedem Abschnitt festgelegt. Wenn die Anzahl der Terme in der Funktion
groß ist, d.h. die Breite der Abschnitte aus AND-OR-Verbindungen übersteigt, kann es
notwendig sein, zwei oder mehr Abschnitte zu verwenden, um eine Boolesche Funktion zu
implementieren. Eine DNF-Minimierung ist in jedem Falle empfehlenswert. Die reduzierte
Anzahl von P-Termen in dem zu realisierenden kombinatorischem Ausdruck ermöglicht
so eine bessere Nutzung der PAL-Hardware.
Am Beispiel des Paritätsgenerators zeigt Abbildung 6.7 die Implementierung für ein 3x8x2
PAL. Eine Minimierung des Ausdrucks ist nicht möglich, es werden 4 Terme gebildet. Die
22
Bei manchen Bausteinen gibt es Einschränkungen. Es sollte in jedem Falle das Datenblatt zu Rate
gezogen werden.
in dem gewählten Baustein zur Verfügung stehenden Ressourcen reichen zum Durch-
schleifen der Eingänge nicht aus. Daher wird nur ein Ausgang für die Anzeige der Parity-
Information genutzt.
In der Praxis sind PALs oft mit variablen konfigurierbaren Ausgangsblöcken ausgestattet.
Die Ausgangszelle kann dabei als kombinatorischer Ausgang, als registerter Ausgang oder
als Eingang genutzt werden. Flipflops dienen unter anderem der Implementierung einer
Zustandsmaschine. So können sowohl rein kombinatorische, als auch sequentielle Schal-
tungen realisiert werden. Einige der PAL-Ausgänge sind mit zusätzlichen Buffer-Inverter-
Gattern verbunden und werden über programmierte Verbindungen zu den Eingängen
der AND-Matrix zurückgekoppelt. Gleiches gilt auch für GALs. In Abbildung 6.8 ist die
gesamte Struktur eines PAL (GAL) dargestellt. Tabelle 6.3 fasst die wesentlichen Unter-
schiede zwischen PROM und PAL abschließend noch einmal zusammen.
PROM PAL
Programmierbar ODER-Matrix UND-Matrix
Field Programmable Gate Arrays (FPGAs) unterscheiden sich von PLDs darin, wie die
zu konfigurierenden Logikblöcke angeordnet sind, wie diese zur Implementierung (kombi-
natorischer und auch sequentieller) Logik genutzt werden, sowie in der Technologie der
Konfigurationszellen.
Bei PLDs werden die Verbindungen zwischen den Logikblöcken durch eine zentrale Schalt-
matrix geführt. Diese gewährleistet, dass die Blöcke untereinander fast beliebig miteinan-
der verbunden werden können. Die geometrische Lage der Blöcke zueinander auf Chipe-
bene hat weder für das Routing, noch für das Zeitverhalten der Signale eine Bedeutung.
Allerdings ist durch diese Architektur die erreichbare Logikdichte sehr beschränkt, da die
Schaltmatrix mit zunehmender Anzahl von Logikblöcken quadratisch wachsen muß. Bei
FPGAs existiert keine zentrale Schaltmatrix. Vielmehr sind die konfigurierbaren Logik-
blöcken (CLBs) gleichmäßig über die Chipfläche in Matrixanordnung verteilt. Die grund-
legende Struktur ist in Abbildung 6.9 anschaulich dargestellt.
programmierbare
Verbindungen
I/O Blöcke
Logikzellen
FPGAs basieren auf dem Prinzip, dass nahezu jede digitale Schaltung aus den beiden
Grundelementen Lookup Tables (LUTs) und Flipflops realisiert werden kann. Diese bei-
den Elemente, zusammen mit Multiplexern, die für die interne Verschaltung innerhalb
der Blöcke nötig sind, bilden die Basis für die CLBs. Jeder CLB kann so konfiguriert
werden, dass er eine beliebige Boolesche Funktion seiner Eingangsvariablen implemen-
tiert. Die Implementierung sequentieller Logik wird durch das Vorhandensein der Flipflops
ermöglicht.
Typischerweise haben CLBs zwischen 4-6 Eingangsvariablen. Funktionen mit einer
größeren Anzahl von Variablen werden über mehrere CLBs verteilt. Diese werden mitein-
ander verbunden, um das Zieldesign vollständig zu implementieren. Die Verbindung der
CLBs, ebenso wie die Anbindung an externe Anschlüsse erfolgt mit einem konfigurierbaren
Verbindungsnetzwerk.
Die programmierbaren Verbindungen stellen horizontale und vertikale Routingkanäle be-
reit. Im Gegensatz zu PLDs ist die geometrische Lage der Logikblöcke maßgebend für
den Verlauf der genutzten Verbindungswege und damit auch für das Zeitverhalten der
zu realisierenden Schaltung. Signale zwischen nicht direkt benachbarten Zellen müssen
über geeignete Verbindungsresourcen geführt werden. Diese fügen dem Design zusätzliche
Verzögerungen hinzu, die umso größer sind, je größer der Abstand der zu verschaltenden
Blöcke ist und je mehr Verbindungspunkte genutzt werden.
Aufgrund des hohen Einflusses des Routings auf die Performance lässt sich per Constraints
angeben, welche Verbindungen zeitkritisch sind. Da meist verschieden schnelle Routing-
kanäle zur Verfügung stehen und kurze Verbindungen schneller sind als solche, die mehr
Verbindungspunkte nutzen, lässt sich auf das Routing so etwas Einfluss nehmen. Belastba-
re Aussagen über das Zeitverhalten der implementierten Schaltung sind immer erst nach
Durchlaufen des Placement & Routing Schrittes im Design Flow (vgl. Abschnitt 4.1.2)
möglich.
Um mit der Außenwelt zu kommunizieren, d.h. um Signale in den Chip herein- und wie-
der herauszuführen, existieren konfigurierbare I/O Blöcke, die das Innenleben mit den
physischen Pins des FPGA-Chips verbinden. Diese bestehen aus Eingangs- und Aus-
gangsbuffern mit Tristate- und Open-Collector Ausgängen. Typischerweise befinden sich
an den Ausgängen Pull-Up Widerstände, manchmal auch Pull-Down Widerstände, die
zur Terminierung von Signalen und Bussen verwendet werden können, ohne dass diskrete
Widerstände auf Board-Ebene außerhalb des Chips erforderlich sind.
Die Polarität der Ausgänge kann für eine active-high oder active-low Signalisierung pro-
grammiert werden, in der Regel können auch die beabsichtige Signalgeschwindigkeit
bzw. Flankensteilheit (engl. slew rate) sowie diverse I/O Standards konfiguriert wer-
den. Dazu zählen Single-Ended-, sowie differentielle Signalstandards einschließlich LVDS-
Terminierung durch digital gesteuerte Impedanz- und Signalhub-Bereiche. Die Ausgänge
sind mit Flipflops ausgestattet, so dass getaktete Signale ohne nennenswerte Verzögerung
direkt an die Pins geleitet werden können, was die Anforderungen an die Setup-Zeit
der nachfolgenden Schaltungen verringert. In gleicher Weise reduzieren Flipflops an den
Eingängen die Verzögerung bei der Weiterleitung in die CLBs und somit die erforderliche
Haltezeit des FPGAs.
Zusätzlich zur in Abbildung 6.9 dargestellten Struktur verfügen moderne FPGA Archi-
tekturen meist noch über weitere zusätzliche Funktionsblöcke, wie DSPs (engl. Digital
Signal Processing), integrierte RAM-Blöcke, High-Speed Transceiver, integrierte Prozes-
soren, sowie DCMs (engl. Digital Clock Manager ) und PLLs (engl. Phase Lock Loop,
Phasenregelschleifen zur Frequenzgenerierung) zur Verwendung bei der internen Takter-
zeugung.
Mit Hilfe mehrerer tausend unabhängiger DSP-Blöcke in modernen FPGAs sind Multipli-
kationen und Additionen auf breiten Datenstrukturen (typischerweise 18 · 27 Bit), sowie
Berechnungen in Fließkomma-Arithmetik möglich. Integrierte RAM-Blöcke der Größe 2
bis 33 Mbit (je nach FPGA-Typ) dienen zum einen der einfachen lokalen Zwischenspei-
cherung hoher Mengen von Daten im FPGA, zum anderen der Realisierung anwendungs-
spezifischer Speicherarchitekturen wie FIFOs (First In First Out) oder Lookup Tables
(LUTs). Die konfigurierbaren High-Speed Transceiver für schnelle serielle Verbindungen
unterstützen aggregierte Datenraten von 10 - 100 Gbit/s bei einer Kanaldatenrate von
maximal 6,25 Gbit/s. Über Extension-Boards oder entsprechende On-Board Anbindun-
gen lassen sich damit beispielsweise Gigabit Ethernet oder QSFP+ Schnittstellen, sowie
PCIe- oder Hypertransport-Links realisieren.
Die Integration eines Prozessors innerhalb eines FPGAs bietet oft Vorteile: mehr Flexibi-
lität im Design, weniger Komponenten auf Platinenebene, einfache Adaptierbarkeit. Man
unterscheidet zwischen Hardcores und Softcores. Letztere sind Prozessorimplementierun-
gen in einer HDL-Sprache ohne umfangreiche Optimierung für die Zielarchitektur. Sie
haben in der Regel eine geringere Performance und sind in Bezug auf die Ressourcennut-
zung weniger effizient. Hardcore-Prozessoren sind auf die Zielarchitektur optimiert und
in diese als Hardware-Modul eingebettet, also in den Silizium-Chip des FPGA physika-
lisch integriert. Die Logik-Ressourcen des FPGAs werden somit nicht genutzt und stehen
weiterhin in vollem Umfang zur Verfügung.
Grundsätzlich stehen für jeden FPGA diverse Bibliotheken mit fertigen Schaltungsblöcken
(IP Cores, engl. Intellectual Property) über den Hersteller kostenlos oder kostenpflichtig
zur Verfügung. Diese können zur Ergänzung eigener Designs eingesetzt werden.
Sowohl die Funktionalität der Logikzellen, als auch die Verbindungen zwischen den CLBs
werden durch den Konfigurationsspeicher bestimmt. Dieser besteht aus SRAM-Zellen,
die auf dem FPGA-Chip verteilt sind. Da SRAM eine flüchtige Speichertechnologie ist,
muss ein FPGA beim Einschalten jeweils neu konfiguriert werden. Dies erfordert entweder
eine Verbindung zu einem PC (über JTAG23 ) oder einen Flash-EEPROM Baustein auf
dem FPGA-Board, aus dem die Konfigurationsdaten beim Einschalten geladen werden
können.
FPGAs werden meist mit Taktraten zwischen 20 - 200 MHz getaktet, also sehr viel langsa-
mer als moderne CPUs. Durch die massiv parallele Datenverarbeitung lassen sich dennoch
23
JTAG (Joint Test Action Group) bezeichnet den IEEE-Standard 1149.1 zur Programmierung und zum
Debugging von Hardware und auf Leiterplatten.
enorme Performance-Gewinne erzielen, so dass ein 50 MHz Design auf einem FPGA (je
nach Anwendung) eine Software-Realisierung auf einem 3 GHz Prozessor spielend in Re-
chenzeit und Leistungsaufnahme übertreffen kann.
Im begleitenden Labor zu dieser Vorlesung werden unterschiedliche digitale Schaltungen
entworfen und simuliert, die in ihrer Komplexität von einfachen Funktionen bis hin zu
komplexen Automaten reichen. Grundlage der Implementierung ist das Terasic Altera
DE2-115 Board [Tera10]. Dieses Board kombiniert eine Vielzahl von Logik- und I/O-
Bausteinen auf einer gemeinsamen Leiterplatte. Das Kernstück bildet ein Altera Cyclone
IV EP4CE115 FPGA mit ≈ 114.480 Logikelementen24 (LE, engl. Logic Elements), der
kleinsten Einheit, die der Implementierung beliebiger kombinatorischer sowie sequentieller
Logikstrukturen dient.
24
Jeder FPGA-Hersteller benennt die logischen Basisblöcke unterschiedlich. In einem FPGA von Altera
werden Sie mit Logic Element“, kurz LE, bezeichnet. Xilinx nutzt den Begriff Configurable Logik
” ”
Block“, kurz CLB. In diesem Skript wurde dafür bisher einheitlich der Begriff CLB verwendet.
Der Cyclone IV zählt zu Alteras Low-Cost, Low-Power FPGA Famile. Produziert wird
diese in einer TSMC25 60nm-Technologie (2009). Bausteine mit bis zu 150k Logic Elements
(LE) sind verfügbar. Die LEs sind in Logic Array Blocks (LAB) gruppiert, die spalten-
und reihenweise über den Baustein verteilt sind.
Zur lokalen Speicherung gibt es RAM-Speicherblöcke, die als Dualport- oder Singleport-
Speicher mit einer Breite von 1 bis 36 Bit konfiguriert und bei einer Frequenz von bis zu 200
MHz betrieben werden können. Die Speicherblöcke sind spaltenweise zwischen bestimmten
LABs angeordnet. Pro Speicherblock stehen 4 kBit plus Parität (4.608 Bit) zur Verfügung,
insgesamt beläuft sich das Speichervolumen auf bis zu 6,3 Mbit Embedded Memory. Die
FPGA-Familie bietet in Ergänzung zu den Logikressourcen bis zu 360 Multiplizierer der
Breite 18 · 18 Bit für DSP Anwendungen, sowie bis zu 8 High-Speed Transceiver (je max.
3,125 Gbps, inkl. 8B/10B Encoder/Decoder) [Alte16].
Abbildung 6.10 zeigt den Aufbau eines Logic Elements. FPGA-typisch werden Logikgat-
ter mit Hilfe einer LUT implementiert, die hier als 16x1 SRAM mit vier Eingängen und
einem Ausgang vorliegt. Die Wahrheitstabelle für die gewünschte Funktion wird während
der Programmierung in den SRAM geladen. Eine einzelne LUT kann jede beliebige kom-
25
TSMC ist die Abkürzung für Taiwan Semiconductor Manufacturing Corporation, der weltweit dritt-
größte Halbleiterhersteller.
binatorische Funktion mit vier Eingängen und einem Ausgang modellieren, indem die
über die angelegten Adressen des SRAM die konfigurierte Logikfunktion selektiert wird.
4
Rechnerisch führt dies zu 22 = 216 verschiedenen Logikfunktionen.
Komplexere Logikfunktionen erfordern Verbindungen zwischen mehreren Logikelemen-
ten. Die LUTs können über Multiplexer kaskadiert werden, zudem existiert eine spezielle
Carry-Logik zur Implementierung von zeitkritischen Strukturen (Addierer, Akkumulato-
ren, Zähler,etc.), sowie eine Carry Chain zur direkten (schnellen) Verbindung benachbar-
ter LEs in derselben Spalte. Der Ausgang der LUT kann in ein D-Flipflop und dann in das
Verbindungsnetzwerk eingespeist werden. Clock-, Clear- und Preset-Signale können durch
interne Logik oder einen externen I/O-Pin angesteuert werden. Das Flipflop kann so kon-
figuriert werden, dass es als D-Flipflop, T-Flipflop, JK-Flipflop oder SR-Latch arbeitet,
zudem ist eine Rückkopplung des Flipflopausgangs auf den Eingang der LUT möglich.
Das Flipflop kann in Verbindung mit der LUT oder eigenständig genutzt werden.
Abbildung 6.11 zeigt den Aufbau eines Logic Array Block (LAB). Ein LAB umfasst 16
LEs, Kontrollsignale, LE Carry Chains, Registerketten, lokale Interconnect-Ressourcen,
sowie einen Zugang zu den chipweiten Zeilen- und Spaltenverbindungen. Die Verschal-
tung der einzelnen Blöcke des FPGAs erfolgt an den horizontalen und vertikalen Kreu-
zungspunkten der Leitungssegmente (Schaltmatrizen). Zum Zwecke einer flexiblen und
dennoch leistungsfähigen Zusammenschaltung von Ressourcen existiert eine hierarchisch
untergliederte Verbindungsarchitektur mit Leitungssegmenten unterschiedlicher Länge:
Local Interconnects, DirectLink-Verbindungen und MultiTrack Interconnects. So können
die Einflüsse von Leitungswiderstand und Signalverzögerungszeit reduziert werden.
Local Interconnects dienen der Verbindung einzelner Logikelemente innerhalb eines LABs.
DirectLink-Verbindungen stellen die nächsthöhere Ebene dar. Sie verbinden unmittelbar
benachbarte FPGA Logikblöcke und bieten das flexibelste und schnellste Routing über
Logikblock-Grenzen hinweg. Einen globaleren Ansatz verfolgen MultiTrack Interconnects.
Sie verbinden Blöcke mit größerer räumlicher Distanz über horizontale und vertikale
Verbindungskanäle unterschiedlicher Länge. Zur Minimierung von Laufzeitunterschieden
beim Verteilen des Taktsignals existieren bis zu 20 globale High-Speed Taktnetze. Jedes
Taktnetz umfasst bis zu vier PLL-Strukturen zur Anpassung der Phase und Frequenz.
Die Konfiguration erfolgt wie bei den LEs durch das Setzen von SRAM-Speicherbits.
Jeder I/O-Pin des Cyclone IV FPGAs wird von einem I/O-Element (IOE) gespeist, das
sich an den Enden der LAB-Zeilen und -Spalten an der Peripherie des Bausteins befin-
det. Es werden verschiedene Single-Ended- und differentielle I/O-Standards unterstützt,
jedes IOE enthält einen bidirektionalen I/O-Buffer sowie drei Register zur Speicherung
von Eingangs-, Ausgangs- und Enable-Signalen (1 Input Register, 2 Output Register, 2
OE Register). Vier Takt-I/Os sind mit den acht globalen Low-Skew-Taktleitungen des
Bausteins verbunden. Den Aufbau eines I/O Elements (IOE) zeigt Abbildung 6.12.
Als Zusammenfassung stellt Tabelle 6.4 nocheinmal alle wesentlichen Merkmale der be-
schriebenen programmierbaren Bausteine gegenüber.
Integrierte Schaltungen bestehen aus einigen wenigen bis zu Milliarden Bauelementen, die
auf einem einzigen Halbleitersubstrat oder Wafer hergestellt und miteinander verbunden
sind. Die fortlaufende Miniaturisierung integrierter Schaltungen aus Transistoren, Dioden
26
Gordon Moores Vorhersage aus dem Jahr 1965 besagte, dass sich die Anzahl der Komponenten auf
einem integrierten Schaltkreis jedes Jahr verdoppeln würde. Als die Integration bis 1975 erstaunliche
65.000 Komponenten erreichte, revidierte Moore sein Gesetz der Verdopplung der Transistoranzahl auf
alle 2 Jahre. Das wiederum bedeutete, dass sich die Leistung von Computerchips etwa alle 18 Monate
verdoppeln würde (ohne Zunahme des Stromverbrauchs).
bis zu 400 Transistoren auf jedem Chip enthielten und daher Medium Scale Integration
”
(MSI)“ genannt wurden. Dabei wurden bis zu 100 Gatter in spezifischen Funktionen inte-
griert, z.B. Addierer, Multiplexer und Decoder. MSI war wirtschaftlich attraktiv, da die
Systeme mit geringeren Kosten, kleineren Leiterplatten, weniger Montageaufwand und
einer Reihe weiterer Vorteile hergestellt werden konnten.
Die nächste Entwicklung war die Large Scale Integration (LSI)“, die beginnend in den
”
1970er Jahren in großen Mengen die Halbleiterwelt eroberte. Die Entwicklung von LSI
wurde durch wirtschaftliche Faktoren vorangetrieben und jeder Chip bestand aus Zehn-
tausenden von Transistoren. Bis zu 10k Gatter auf einem Chip ermöglichten digitale
Komponenten wie PLDs und auch integrierte Speicherlösungen.
Auf LSI folgte die Very Large Scale Integration (VLSI)“, bei der Hunderttausende von
”
Transistoren integriert wurden. Erstmalig konnte eine CPU auf einer einzigen integrier-
ten Schaltung hergestellt werden, um so einen Microprozessor zu produzieren. Auch die
Speicherdichte erhöhte sich und 1986 wurde der ersten 1-Mbit-RAM-Chip präsentiert,
der auf mehr als einer Million Transistoren basierte. Mitte der 1990er Jahre produzierte
Microprozessor-Chips enthielten bereits mehr als drei Millionen Transistoren. ULSI steht
für Ultra Large Scale Integration (VLSI)“ und entspricht mehr als 1 Million Transisto-
”
ren. Es gibt jedoch keinen qualitativen Sprung zwischen VLSI und ULSI, daher wird in
Fachtexten meist der Begriff VLSI für ULSI verwendet.
Giga Scale Integration (GSI)“ ist die Technologie mit der derzeit höchsten Integrations-
”
dichte und mehr als einhundert Millionen bis zu einer Milliarde Transistoren pro Chip.
Entsprechende integrierte Schaltungen arbeiten mit Strukturbreiten von 50nm und darun-
ter. Die meisten integrierten Lösungen, wie aktuelle System-On-A-Chips, Computer- und
Mobilprozessoren, Audio- / Videocodecs, Grafikverarbeitungseinheiten, FPGAs, High-
End Mikrocontroller, große Speicherchips, DSPs, sowie Video-/Bildprozessoren basieren
auf GSI.
Der Pentium-IV Prozessor wurde im Jahr 2000 auf den Markt gebracht. Er wurde in
180-nm Technologie (Kanallänge eines MOSFET) gebaut, wobei die Transistoranzahl 42
Der Vorteil der MOSFETs besteht darin, dass diese fast keine Steuerleistung benötigen,
relativ kompakt sind und leicht in Massenproduktion hergestellt werden können. Aller-
dings wirken die Kapazitäten der MOSFETs kurzen Schaltzeiten entgegen und sorgen für
langsame Schaltgeschwindigkeiten. Des weiteren sind MOSFETs empfindlich gegen stati-
sche Aufladungen, die zur Zerstörung der Bauteile führen kann. Der überwiegende Anteil
integrierter digitaler Schaltungen wird nach wie vor in MOS-Technologie gefertigt.
Bei in Complementary Symmetry-Metal Oxide Semiconductor“ ausgeführten Logikgat-
”
tern werden n-Kanal- und p-Kanal-MOSFETs paarweise eingesetzt. Dadurch verfügen
CMOS Gatter über einen sehr geringen Ruhestrom und damit auch über einen sehr ge-
ringen statischen Leistungsverbrauch. CMOS ist gegenüber NMOS allerdings aufwendiger
und hat eine ungünstigere Packungsdichte. Zudem sind die Schaltzeiten langsamer und
CMOS-Schaltungen reagieren empfindlicher gegenüber äußeren elektrischen Störungen.
Charakteristische Parameter der Schaltkreisfamilien sind:
• Fan-Out (Treiben von Lasten)
• Propagation Delay (Verzögerungszeit)
• Noise Margin (Rauschabstand)
• Power Consumption (Energieverbrauch)
Für jede Schaltkreisfamilie wird ein Basisgatter (NAND, NOR bzw. Inverter) definiert,
für das diese Parameter üblicherweise angegeben werden. Das Fan Out entspricht dem
Ausgangslastfaktor und ist insbesondere bei Zusammenschaltung mehrer Gatter bzw.
Schaltungsteilen relevant. Der Eingang einer Schaltung stellt eine Last für die Treiber-
schaltung dar, die diesen Eingang bedienen muss. Eine Logikschaltung, die bestimmte
Ausgangsspegel erzeugt, muss an ihren Eingängen mit entsprechenden Strompegeln an-
gesteuert werden. Für die Zusammenschaltung von Schaltungen ist es also wichtig, den
Ausgangsstrom der treibenden Schaltung korrekt auszulegen und die Summe der Ein-
gangsströme der getriebenen Schaltungen adäquat zu berücksichtigen. Fan Out-Werte
werden üblicherweise als Vielfache der Werte für das Basisgatter definiert und geben so
die Anzahl der Gatter an, die an einem Gatterausgang angeschlossen werden dürfen, ohne
dass dessen Betriebsverhalten gestört wird.
Das Propagation Delay ist bereits aus Abschnitt 2.4 bekannt und ein wichti-
ger Parameter für die Perfomance des Timing-Verhaltens jeder Schaltung, da es
die mittlere Verzögerungszeit einer Ausgangssignal-Pegeländerung als Folge eines
Eingangssignal-Pegelwechsel angibt. Resultierende Laufzeiten werden jeweils bezogen
auf die Hälfte der Eingangs-/Ausgangssignalamplituden angegeben. Das Noise Margin
(Störspannungsabstand) definiert die Stabilität bei statischen Störeinflüssen. Es wird ein
maximaler Störpegel festgelegt, der einem Gatterausgangssignal überlagert werden darf,
ohne das es zu Fehlinterpretationen am nachfolgenden Eingangsgatter kommt.
Jede Schaltung hat auch einen Energiebedarf pro Zeiteinheit. Dieser wird durch die Leis-
tungsaufnahme (Stromverbrauch), üblicherweise in mW (Milliwatt), ausgedrückt. Neben
dem Begriff Power Consumption für die Leistungsaufnahme wird auch oft der Begriff
Power Dissipation (Verlustleistung) verwendet. Streng genommen gibt die Verlustleistung
aber nur denjenigen Anteil an aufgenommener Leistung an, der nicht in der gewünschten
Form abgegebener Leistung umgesetzt wird. Meist besteht dieser Anteil in abgegebener
Wärme.
p +++++ p n ----- n
Löcher Elektronen
p-Kanal n-Kanal
Abbildung 6.14: Schematischer Aufbau eines MOS-Transistors
Der Source-Anschluss ist intern jeweils mit dem Substrat verbunden, der Gate-
Steueranschluss ist vom Silizium durch Metalloxyd isoliert aufgebracht. Durch die Be-
wegung von positiven und negativen Ladungsträgern wird ein Kanal gebildet, dessen Wi-
derstandswert beeinflusst werden kann. Der Kanal ist eine Verbindungsstrecke zwischen
der dotierten Zone unterhalb des Source-Anschlusses und der dotierten Zone unterhalb
des Drain-Anschlusses.
Das Grundmaterial des p-Kanal MOS Transistors (PMOS) ist schwach n-leitend. Source
und Drain bestehen aus stark p-dotiertem Material. In der Mitte liegt durch Siliziumdioxid
isoliert die Gate-Elektrode. Zwischen Drain und Source kann in dieser Anordnung kein
Strom fliessen, da immer einer der beiden pn-Übergänge der pnp-Struktur in Sperrrichtung
gepolt ist. Das Material des n-dotierten Substrats wirkt als Widerstand. Wird zwischen
Gate und Source eine negative Spannung VGS < VT H < 0 angelegt, bildet sich unter dem
Gate ein Kanal mit Löcherleitung, der Drain und Source verbindet. Ein über VGS < 0
erzeugtes elektrisches Feld zieht die im n-dotierten Substrat vorhandenen Löcher an und
führt dazu, dass die ursprünglich n-dotierte Schicht unterhalb der Oxidschicht p-leitend
wird. So kann ein Strom vom Source- zum Drain-Anschluss fließen.
Beim n-Kanal MOS Transistors (NMOS) ist das Grundsubstrat leicht p-dotiert, die beiden
Zonen für Source und Drain sind entsprechend stark n-dotiert. Source, Drain und das p-
dotierte Grundsubtrat bilden eine npn-Struktur. Wird zwischen Gate und Source eine
positive Spannung VGS > VT H > 0 angelegt, bildet sich unter dem Gate ein Kanal mit
Elektronenleitung, der Drain und Source verbindet. Ein über VGS > 0 erzeugtes Feld zieht
die im p-dotierten Substrat vorhandenen Elektronen an, so dass die Leitfähigkeit zwischen
n-dotierten Drain- und Source-Bereichen erhöht wird. So fließt ein Strom vom Drain zum
Source-Anschluss. Die ursprüngliche p-dotierte Schicht unterhalb der Oxidschicht ist n-
leitend geworden, der n-Kanal ist entstanden.
Bei gleicher Geometrie weisen p-Kanal Transistoren einen wesentlich größeren Kanalwi-
derstand auf, da die Beweglichkeit der Löcher viel geringer ist als die Beweglichkeit der
Elektronen. Daher sind die meisten MOS-Transistoren als diskrete Bauelemente selbst-
sperrende n-Kanal Transistoren. In integrierten Schaltungen werden alle verfügbaren Ty-
pen verwendet.
Drain Drain
Substrat Substrat
Gate Gate
Source Source
p-Kanal n-Kanal
Abbildung 6.15: Schaltzeichen eines MOS-Transistors
In Abbildung 6.15 sind die Schaltzeichen der beiden MOS Transistortypen dargestellt.
Die Unterbrechung des jeweils leitenden Kanals ohne angelegte Steuerspannung VGS mit
Bezug zum Substrat ist darin eindeutig gekennzeichnet. Der Pfeil gibt jeweils die Ver-
schiebung der Elektronen im Substrat an, wenn |VGS | > 0. Oft wird auch die vereinfachte
Darstellung, wie in Abbildung 6.16 zu sehen, verwendet. Der Pfeil zeigt hier die technische
Stromrichtung für den Fall an, dass der Kanal mit |VGS | > |VT H | leitfähig wird.
Für jede im digitalen Schaltungsentwurf verwendeten Technologie ist das grundlegende
Schaltungselement der logische Inverter. Die durch Evaluierung der Funktionsweise und
Charakterisierung dieser Inverterschaltung gewonnenen Ergebnisse können dann auf den
Entwurf weiterer Logikgatter bis hin zu komplexeren Schaltungen angewendet werden.
Abbildung 6.17 fasst dies für den n-Kanal MOS Inverter (NMOS Inverter) zusammen.
Drain Drain
Gate Gate
Source Source
p-Kanal n-Kanal
Abbildung 6.16: Vereinfachtes Schaltzeichen eines MOS-Transistors
Aus der gegebenen Abbildung ist ersichtlich, dass die Eingangsspannung Vin des Inverters
gleich der Gate-Source-Spannung VGS des NMOS-Transistors ist und die Ausgangsspan-
nung Vout gleich der Drain-Source-Spannung VDS . Der Source-Anschluss ist mit der Masse
verbunden, am Drain-Anschluss wird der Ausgang Y abgenommen. Die Spannungsver-
sorgung der Schaltung ist durch VDD gegeben. Die Last besteht aus einem einfachen
Linearwiderstand RD und der Drainstrom iD ist gleich dem Laststrom.
Solange die Spannung am Eingang des Transistors kleiner als die Schwellenspannung VT H
ist (Vin < VT H ), befindet sich der Transistor im Sperrbereich und leitet keinen Strom.
Somit ist der Spannungsabfall über dem Lastwiderstand gleich Null und die Ausgangs-
spannung ist gleich VDD .
Übersteigt die Eingangsspannung die Schwellenspannung (Vin > VT H ), beginnt der Tran-
sistor einen Strom ungleich Null zu leiten und geht in den Sättigungsbereich. Wird die
Eingangsspannung weiter erhöht, tritt der Transistor in den linearen Bereich ein und die
Spannung am Ausgang Vout nimmt ab. Ist schließlich Vin = VDD und damit logisch 1, so
nähert sich Vout dem Massepotential und entspricht logisch 0.
VDD Vout iD
Linearer Bereich Sättigung
Vin = VDD
VDD VDD / RD
RD
iD
Y=A‘
VDS = Vout
Vin VDS
A VTH VDD VDD
+ VDS = VGS - VTH
Vin Vin = VDD à FET durchgeschaltet, iD = max, VDS = min = 0V
- - Vin = 0 à FET gesperrt, iD = min, VDS = max = 5V
Die CMOS-Schaltungstechnik ist weit verbreitet. Sie ist dadurch gekennzeichnet, dass
eine beliebige Funktion Y = f (X1 , · · · , Xn ) immer durch zwei Netzwerke implementiert
wird, die logisch komplementär sind. Die Netzwerke bestehen jeweils aus einem der bei-
den Typen der MOS Transistoren, die miteinander verbunden die gewünschte logische
Funktion bilden und wechselseitig ein- bzw. ausgeschaltet werden. Logische AND- und
VDD
UGS1 = -VDD
S
à T1 an
G
T1 p-Kanal
Y=A‘
A D
=0
T2 n-Kanal
à T2 sperrt
G
S
UGS2 = 0
UA UGS2 UGS1 T1 T2 UY
Low = GN D 0 −VDD leitet sperrt High = VDD
High = VDD VDD 0 sperrt leitet Low = GN D
Während der CMOS Inverter nur über einen Eingang verfügt, hat das CMOS NAND-
Gatter zwei Eingänge (A und B). Es besteht aus zwei parallelen p-Kanal Transistoren
und zwei dazu in Reihe geschalteten n-Kanal Transistoren, gezeigt in Abbildung 6.19.
Die Transistoren T 2 und T 3 ähneln dem in Reihe geschalteten komplementären Paar
aus der Inverterschaltung in Abbildung 6.18. Es handelt sich bei beiden um p-Kanal
MOSFETs, die durch das gleiche Eingangssignal (Eingang A) gesteuert werden, wobei
der obere Transistor sperrt und der untere Transistor leitet, sobald der Eingang High“
”
ist und umgekehrt.
VDD
p-Kanal p-Kanal
T1 T2
Y=(AB)‘
n-Kanal
T3
A
T4 n-Kanal
In ähnlicher Weise werden auch die Transistoren T 1 und T 4 durch das gleiche Eingangssi-
gnal (Eingang B) gesteuert und liefern das gleiche Leit- bzw. Sperr-Verhalten für die glei-
chen Eingangslogikpegel. Diese beiden Transistoren sind n-Kanal MOSFETs. Die Source-
und Drain-Anschlüsse der oberen beiden Transistoren (T 1 und T 2) sind parallel geschal-
tet, während die unteren Transistoren (T 3 und T 4) in Reihe geschaltet sind.
Das Verhalten der Gesamtschaltung lässt sich wie folgt charakterisieren: Sind beide
Eingänge (A, B) auf High“, so leiten die n-Kanal Typen und die p-Kanal Typen sperren.
”
In diesem Falle ist der Ausgang Y dann auf Low“. Ist nur ein Eingang auf Low“, sperrt
” ”
der zugehöriger n-Kanal Typ und der zugehöriger p-Kanal Typ leitet. Der Ausgang Y ist
in diesem Fall dann auf High“. Tabelle 6.7 dokumentiert die vollständige Funktionsweise
”
des CMOS NAND-Gatters für alle Eingangskombinationen.
UA UB T1 T2 T3 T4 UY
Low Low leitet leitet sperrt sperrt High
Low High sperrt leitet sperrt leitet High
High Low leitet sperrt leitet sperrt High
High High sperrt sperrt leitet leitet Low
Wie das CMOS NAND-Gatter besteht auch das CMOS-NOR-Gatter aus vier MOSFETs,
allerdings in einer anderen Anordnung. Anstelle von zwei an der Spannungsquelle parallel
geschalteten und zwei zur Masse in Reihe geschalteten Transistoren, verwendet das NOR-
Gatter an der Spannungsquelle zwei in Reihe geschaltete Transistoren (vom Typ p-Kanal),
sowie zwei parallel geschaltete n-Kanal Transistoren, deren Source-Anschluss an Masse
liegt. Abbildung 6.20 zeigt die Schaltung.
VDD
T1
A
T2
B
Y=(A+B)‘
T3 T4
Wie beim NAND-Gatter arbeiten die Transistoren T 1 und T 3 als komplementäres Paar,
ebenso die Transistoren T 2 und T 4. Jedes Paar wird von einem zugehören Eingangssignal
gesteuert. Wenn entweder Eingang A oder Eingang B High“ sind, wird mindestens einer
”
der unteren n-Kanal Transistoren (T 3 oder T 4) durchgeschaltet, wodurch der Ausgang
auf Masse gezogen und Low“ wird. Der zugehöriger p-Kanal Typ im oberen Teil sperrt
”
jeweils.
Nur wenn beide Eingänge Low“ sind, befinden sich die beiden unteren n-Kanal Tran-
”
sistoren im Sperrmodus und die beiden oberen p-Kanal Transistoren sind leitend. Damit
liegt der Ausgang auf dem gleichen Potential wie die Spannungsquelle und liefert einen
High“-Pegel. Dieses Verhalten definiert offensichtlich die NOR-Logikfunktion, wie in ??
”
zusammengefasst.
UA UB T1 T2 T3 T4 UY
Low Low leitet leitet sperrt sperrt High
Low High leitet sperrt sperrt leitet Low
High Low sperrt leitet leitet sperrt Low
High High sperrt sperrt leitet leitet Low
In allen bisher diskutierten Fällen wurde der Transistor als einfacher Schalter wahrgenom-
men. Dieses Verhalten wird erreicht, indem der Transistor bewusst unter- oder übersteuert
wird. Grundsätzlich führt ein kleiner Eingangsstrom zur Basis des Transistors zu einem
großen Ausgangsstrom zwischen dem Kollektor und dem Emitter. Wird der Transistor
in einem nach oben und unten definierten Arbeitsbereich betrieben, so verhält er sich
wie ein Verstärker. Ein Betrieb außerhalb dieses Arbeitsbereiches führt zu Unter- bzw.
Übersteuerung.
Ein MOS Transistor kann also als spannungsgesteuerter elektronischer Schalter verstanden
werden. Wenn keine Basisspannung vorhanden ist oder die Spannung weniger als 0,7 V
beträgt, ist der Schalter ausgeschaltet. Wenn eine Spannung an die Basis angelegt wird,
leitet der Transistor Strom über die Kollektor-Emitter-Strecke. Wenn die Spannung an
der Basis in den Sättigungsbereich geht, kann der Kollektorstrom ohne Einschränkung
fließen. Der Schalter ist dann also durchgeschaltet. Die Leitfähigkeit zwischen Source und
Drain wird dabei stromlos, d.h. rein kapazitiv gesteuert. Damit ist im statischen Betrieb
der Transistor nahezu frei von Verlustleistung.
Abbildung 6.21 zeigt das Schaltprinzip einer Ersatzschaltung. Demnach entspricht ein
sperrender Transistor einem geöffneten Schalter und ein leitender Transistor einem ge-
schlossenen Schalter. Auch eine komplette Inverterschaltung kann wie in Abbildung 6.22
gezeigt in Schalterdarstellung umgesetzt werden. Der CMOS Inverter besteht demnach
aus einem oberen Öffner (p-Kanal) und einem unteren Schließer (n-Kanal). Liegt am Ein-
gang Vin Low“ Pegel schließt der obere Schalter und der untere öffnet. Der Ausgang
”
liefert so das Komplement des Eingangs: Vout = VDD .
VDD = 5V
Vin Vout
In Abschnitt 6.2.1 wurde bereits auf die charakteristischen Parameter der Schaltkreis-
familien hingewiesen. Diese sollen nun für die CMOS-Schaltkreisfamilie näher erläutert
werden.
Die Leistungsaufnahme setzt sich aus mehreren Anteilen zusammen:
• statischer Anteil (durch Leckströme der Drain- und Sourcedioden, sowie durch den
Kanal)
• dynamischer Anteil zum Auf- und Entladen von Last- und parasitären Kapazitäten
• dynamischer Kurzschlußstrom zwischen VDD und Masse während des Schaltens
In CMOS Schaltungen ist immer einer der paarweise auftretenden Transistoren leitend. Es
existitert keine direkte Verbindung zwischen VDD und Masse. Die leitenden Transistoren
haben einen geringen Innenwiderstand, die sperrenden Transistoren führen nahezu keinen
Strom. Allerdings sperren die Transistoren nur im Idealfall komplett. Über die Gate-
Oxid-Kapazität gibt es eine Koppelung vom Gate-Anschluss auf den aktiven Kanal. Der
resultierende statische Strom durch den eigentlich sperrenden Transistor wird Leckstrom
genannt und ist sehr klein. Die Leistungsaufnahme bei statischen Pegeln ist daher sehr
gering (z.B. Pstat = 0, 01mW ) und unabhängig von der Aktivitätsfrequenz. Sie ist immer
vorhanden, sobald die Schaltung an der Versorgungsspannung angeschlossen ist.
Der hauptsächliche Anteil der Leistungsaufnahme ist auf dynamische Effekte
zurückzuführen. Diese sind das Ergebnis des Schaltens kapazitiver Lasten zwischen zwei
verschiedenen Spannungszuständen ( High“ und Low“). Während einer Taktperiode
” ”
wird die Lastkapazität jeweils einmal auf- und entladen. Die Ladung auf der Lastkapazität
CL ist durch
Q = VDD · CL
definiert. Bei einer gegebenen Frequenz f fließt ein mittlerer Strom der Größe
I =f ·Q
durch die Schaltung. Daraus resuliert die mittlere Leistung, die ausgedrückt wird durch:
2
P = I · VDD = (f · VDD · CL ) · VDD = f · VDD · CL
2
Während des Ladens wird 1/2 · C · VDD im PMOS umgesetzt, beim Entladen der Rest
im NMOS. Um die dynamische Leistungsaufnahme einer CMOS Schaltung zu reduzie-
ren, lassen sich gemäß der Formel mehrere Strategien ableiten. Es kann einerseits die
umzuladende Kapazität verringert werden. Dieser Weg verläuft meist über die Miniatu-
risierung von Strukturgrößen und damit über die Anwendung modernerer und kleinerer
Strukturbreiten im Nanometerbereich. Des weiteren stehen die dynamische Leistung P
und die Versorgungsspannung VDD in einem quadratischen Verhältnis. Eine Reduzierung
von VDD und des verwendeten Spannungshubs kann die dynamische Leistung somit er-
heblich beeinflussen. Schließlich haben auch die Schaltaktivität und die Betriebsfrequenz
einen (linearen) Einfluss, da keine Leistung verbraucht wird, wenn sich die Potentiale
nicht ändern. Bei niedrigen Frequenzen ist die Leistungsaufnahme allerdings gering. Dies
ist einer der Gründe, warum die CMOS-Technologie eine so beliebte Wahl für Schaltungs-
realisierungen ist.
Neben dem Umladen von externen (durch Leitungen und Eingänge der Folgestufen) und
internen (innerhalb eines Gatters befindlichen) Kapazitäten ist ein weiterer dynamische
Anteil der Leistungsaufnahme durch dynamische Kurzschlußströme bedingt. Diese entste-
hen dadurch, dass Transistoren ihren Leitfähigkeitszustand nicht mit einem Mal, sondern
in endlicher Zeit ändern. So entstehen dynamische Querströme.
Die pro Schaltvorgang verbrauchte Energie ist sowohl von der Spannung, als auch dem
Spitzenpegel des Stroms abhängig und hat einen direkten Bezug zur Schaltzeit:
Durch das bekannte Verhältnis von Energie E zu Leistung P gilt für die Leistung damit:
Diese Leistungsaufnahme findet nur während des Schaltvorgangs statt. Die Anstiegszeiten
tsw der Signale sollten daher so kurz wie möglich sein. Abbildung 6.23 illustriert den
Sachverhalt. Auch hier gilt, dass die Leistungsaufnahme frequenzabhängig ist.
Die Leistungsaufnahme ist nur einer von mehreren physikalischen Aspekten der CMOS
Gatter. Ein Logikgatter hat in der Regel mehrere Ein- und Ausgänge. Die Eingänge eines
CMOS Gatters nehmen in der Regel keinen statischen Strom auf, nur die dynamische
Belastung ist relevant. Der Begriff Fan-In beschreibt die Anzahl der Eingänge eines Lo-
gikgatters. Beispielsweise verfügt ein AND-Gatter mit zwei Eingängen über einen Fan-In
von 2, ein 3-Input OR somit über ein Fan-In von 3. Ein NOT-Gatter hat immer einen
Fan-In von 1. Die Anzahl der Eingänge kann für jede Logikschaltung nicht über diese,
durch das Fan-In definierte endliche Zahl hinaus erhöht werden.
VDD
S VDD
G
VDD-VTH
Vin
D VTH
t
i Vout
iPeak
Vin D
i
G
t
S tsw
Als Fan-Out wird die Anzahl der Gatter beschrieben, die jedes Logikgatter an seinem
Ausgang ansteuern kann, ohne dass der Spannungspegel am Ausgang einen garantierten
Bereich verlässt. Das Fan-Out hängt von der Menge an elektrischem Strom ab, die ein Gate
erzeugen oder aufnehmen kann, während es andere Gates antreibt. Je höher das Fan-Out,
desto höher die kapazitive Last am treibenden Gatter und damit auch die Verzögerung
1
1
2
1 1
Fan-Out = N
……
treibendes Gatter
N
1
Genau betrachtet liegt die Ursache des Propagation Delay im kapazitiven Verhalten durch
Ladungsträger-Transportvorgänge beim Aufbau und Leeren eines Kanals. Aufgrund des
symmetrischen Aufbaus von CMOS Gattern sind die Zeiten tpLH und tpHL daher auch
gleich. Gemessen wird wie bereits in Abschnitt 2.4 beschrieben zwischen den 50% Pegeln
der Ein- und Ausgangssignale.
VDD VDD
VOH
„High“-Zustand
Störspannungsabstand
VIH
VIL
„Low“-Zustand
Störspannungsabstand
VOL
0 0
Ausgangsspannungsbereich Eingangsspannungsbereich
CMOS Schaltungen sind in der Regel so konstruiert, dass sie Schwankungen der Eingangs-
und Ausgangsspannungspegel durchaus tolerieren. Abweichungen vom Nennpegel sind in
der Regel das Ergebnis mehrerer unterschiedlicher Faktoren:
• unsaubere bzw. instabile Versorgungsspannung VDD
• Drift des Transistorarbeitspunktes (Spannungs- und Stromkennlinien) durch hohe
Betriebstemperaturen
• Übersprechen auf Signalleitungen durch Stromimpulse oder Einkopplungen über
Versorgungsleitungen
[Phil99] Philips: ”74AHC74; 74AHCT74 Dual D-type flip-flop with set and reset; positive-
edge trigger”, Product specification, File under Integrated Circuits, IC06, 1999
[VHDL87] VHDL Language Reference Manual; IEEE Std 1076-1987, ISBN 1-55937-181-1
[VHDL93] VHDL Language Reference Manual; IEEE Std 1076-1993, ISBN 1-55937-376-8
[VHDL02] VHDL Language Reference Manual; IEEE Std 1076-2002, ISBN 0-7381-3247-0
[Tera10] Terasic Altera DE2-115 User Manual; Terasic Technologies, Taiwan, 2010
[Alte16] Cyclone IV Device Handbook; Altera Corporation, USA, 2016
[Moor65] G. E. Moore: Cramming more components onto integrated circuits; Electronics,
Volume 38, No 8, Seiten 114-118, 1965
[Moor75] G. E. Moore: Progress in Digital Integrated Electronics; Technical Digest, IEEE
International Electron Devices Meeting, Seiten 11-13, 1975
[Denn74] R.H. Dennard: Design of Ion-Implanted MOSFET?s with Very Small Physical
Dimensions; IEEE Journal of Solid-State Circuits, Vol. SC-9, No. 5, Seiten 256-268,
1974
129
Ende
E-mail: sven-hendrik.voss@bht-berlin.de