Uploaded by Carofantastik

K1608

advertisement
Inhaltsverzeichnis
1 Technische Informatik
5
1.1
Anwendungsbereiche der Technischen Informatik . . . . . . . . .
7
1.2
Teilbereiche der Technischen Informatik . . . . . . . . . . . . . .
7
1.2.1
Hardware-Entwurf . . . . . . . . . . . . . . . . . . . . .
8
1.2.2
Rechnerarchitektur . . . . . . . . . . . . . . . . . . . . .
8
1.2.3
Bewertung von Computersystemen . . . . . . . . . . . .
8
1.2.4
Echtzeit– und eingebettete Systeme . . . . . . . . . . . .
8
1.2.5
Betriebssysteme . . . . . . . . . . . . . . . . . . . . . . .
9
1.2.6
Kommunikationsnetze und verteilte Systeme . . . . . . .
9
1.3
Einordnung des Moduls Computersysteme . . . . . . . . . . . .
9
1.4
Weitere Kurse zur Technischen Informatik . . . . . . . . . . . .
10
2 Schaltnetze
2.1
13
Boole’sche Algebra . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.1.1
Definition der Booleschen Algebra . . . . . . . . . . . . .
15
2.1.2
Schaltalgebra – ein Modell der Booleschen Algebra . . .
17
Schaltfunktionen . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.1
Definitionen . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.2
Darstellung . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2.3
Minimierung von Schaltfunktionen . . . . . . . . . . . .
29
2.3
Analyse von Schaltnetzen . . . . . . . . . . . . . . . . . . . . .
37
2.4
Synthese von Schaltnetzen . . . . . . . . . . . . . . . . . . . . .
40
2.5
Code–Umsetzer . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
2.2
1
2
Inhaltsverzeichnis
2.5.1
Schaltnetzentwurf für die 8421–BCD zu 7–Segment Umsetzung . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
Schaltnetzentwurf für einen Adressdecodierer . . . . . . .
45
Addierglieder . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
2.6.1
Halbaddierer . . . . . . . . . . . . . . . . . . . . . . . .
46
2.6.2
Volladdierer . . . . . . . . . . . . . . . . . . . . . . . . .
47
2.6.3
Paralleladdierer . . . . . . . . . . . . . . . . . . . . . . .
48
2.7
Komparatoren . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
2.8
Multiplexer . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
2.9
Arithmetik-Logik Einheit (ALU)
. . . . . . . . . . . . . . . . .
59
2.9.1
Zahlendarstellung und Zweierkomplement . . . . . . . .
60
2.9.2
Addierer/Subtrahierer . . . . . . . . . . . . . . . . . . .
62
2.10 Schaltnetze mit programmierbaren Bausteinen . . . . . . . . . .
65
2.10.1 ROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
2.10.2 PROM, EPROM . . . . . . . . . . . . . . . . . . . . . .
69
2.10.3 PAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
2.10.4 PLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
2.11 Laufzeiteffekte in Schaltnetzen . . . . . . . . . . . . . . . . . . .
71
2.12 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . .
76
2.13 Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . . .
77
2.5.2
2.6
3 Schaltwerke
81
3.1
Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
3.2
Speicherglieder . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
3.3
Automatenmodelle für Schaltwerke . . . . . . . . . . . . . . . .
88
3.3.1
Darstellungsformen . . . . . . . . . . . . . . . . . . . . .
91
3.3.2
Äquivalenz zwischen Mealy- und Moore-Automaten . . .
92
3.4
Analyse von Schaltwerken . . . . . . . . . . . . . . . . . . . . .
94
3.5
Synthese von Schaltwerken . . . . . . . . . . . . . . . . . . . . .
97
3.5.1
Umschaltbarer Gray-Code-Zähler . . . . . . . . . . . . .
97
3.5.2
Zustands-Minimierung . . . . . . . . . . . . . . . . . . . 100
Inhaltsverzeichnis
3.5.3
3.6
3
Zustands-Codierung . . . . . . . . . . . . . . . . . . . . 103
Implementierung von Schaltwerken . . . . . . . . . . . . . . . . 104
3.6.1
Programmierbare Logikbausteine . . . . . . . . . . . . . 104
3.6.2
Mikroprogrammsteuerwerke . . . . . . . . . . . . . . . . 105
3.7
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . 106
3.8
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . . . 107
4 Komplexe Schaltwerke
113
4.1
Entwurf von Schaltwerken . . . . . . . . . . . . . . . . . . . . . 114
4.2
Aufbau komplexer Schaltwerke . . . . . . . . . . . . . . . . . . . 115
4.3
RTL-Notation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.4
ASM-Diagramme . . . . . . . . . . . . . . . . . . . . . . . . . . 119
4.4.1
Zustandsboxen . . . . . . . . . . . . . . . . . . . . . . . 119
4.4.2
Entscheidungsboxen . . . . . . . . . . . . . . . . . . . . 120
4.4.3
Bedingte Ausgangsboxen . . . . . . . . . . . . . . . . . . 120
4.4.4
ASM-Block . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.5
Konstruktionsregeln für Operationswerke . . . . . . . . . . . . . 122
4.6
Entwurf des Steuerwerks . . . . . . . . . . . . . . . . . . . . . . 124
4.7
Beispiel: Einsen-Zähler . . . . . . . . . . . . . . . . . . . . . . . 126
4.7.1
Lösung mit komplexem Moore-Schaltwerk . . . . . . . . 126
4.7.2
Lösung mit komplexem Mealy-Schaltwerk . . . . . . . . 128
4.7.3
Aufbau des Operationswerks . . . . . . . . . . . . . . . . 128
4.7.4
Moore-Steuerwerk als konventionelles Schaltwerk . . . . 129
4.7.5
Moore-Steuerwerk mit Hot-one-Codierung . . . . . . . . 132
4.7.6
Mealy-Steuerwerk als konventionelles Schaltwerk . . . . . 132
4.7.7
Mealy-Steuerwerk mit Hot-one-Codierung . . . . . . . . 134
4.7.8
Mikroprogrammierte Steuerwerke . . . . . . . . . . . . . 134
4.8
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.9
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . . . 137
5 Aufbau und Funktionsweise eines Computers
141
4
Inhaltsverzeichnis
5.1
Erweiterung komplexer Schaltwerke . . . . . . . . . . . . . . . . 142
5.2
Komponenten eines Computers . . . . . . . . . . . . . . . . . . 143
5.2.1
Rechenwerk . . . . . . . . . . . . . . . . . . . . . . . . . 143
5.2.2
Leitwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
5.2.3
Speicher . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
5.2.4
Ein-/Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . 150
5.3
Interne und externe Busse . . . . . . . . . . . . . . . . . . . . . 150
5.4
Prozessorregister . . . . . . . . . . . . . . . . . . . . . . . . . . 152
5.5
Anwendungen eines Stapelzeigers . . . . . . . . . . . . . . . . . 154
5.6
5.7
5.5.1
Unterprogramme . . . . . . . . . . . . . . . . . . . . . . 155
5.5.2
Unterbrechungen (Interrupts) . . . . . . . . . . . . . . . 158
Rechenwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5.6.1
Daten- und Adressregister . . . . . . . . . . . . . . . . . 165
5.6.2
Datenpfade . . . . . . . . . . . . . . . . . . . . . . . . . 166
5.6.3
Schiebemultiplexer . . . . . . . . . . . . . . . . . . . . . 167
5.6.4
Logische Operationen . . . . . . . . . . . . . . . . . . . . 168
5.6.5
Arithmetische Operationen . . . . . . . . . . . . . . . . . 169
5.6.6
Status-Flags . . . . . . . . . . . . . . . . . . . . . . . . . 169
Leitwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
5.7.1
Mikroprogrammierung . . . . . . . . . . . . . . . . . . . 172
5.7.2
Mikrobefehlsformat . . . . . . . . . . . . . . . . . . . . . 173
5.8
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . 174
5.9
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . . . 175
Index
177
Kapitel 1
Technische Informatik
Kapitelinhalt
1.1
Anwendungsbereiche der Technischen Informatik . . . . . .
7
1.2
Teilbereiche der Technischen Informatik . . . . . . . . . . .
7
1.3
Einordnung des Moduls Computersysteme . . . . . . . . . .
9
1.4
Weitere Kurse zur Technischen Informatik . . . . . . . . .
10
5
6
Kapitel 1. Technische Informatik
Die Informatik beschäftigt sich mit der automatischen Verarbeitung von
Informationen mit Computersystemen. Die Bezeichnung Informatik wurde von
Karl Steinbuch eingeführt und ergibt sich aus der Kombination der Begriffe
Information und Automatik.
Wir können im Wesentlichen drei Gebiete der Informatik unterscheiden:
• Theoretische Informatik,
• Praktische und Angewandte Informatik,
• Technische Informatik.
Die Theoretische Informatik widmet sich dabei den formalen und mathematischen Aspekten. Sie beantwortet grundlegende Fragen zu Logik und Deduktion, Formalen Sprachen, Automaten-, Berechenbarkeits- und Komplexitätstheorie sowie zur Algorithmentheorie.
Bei der Praktischen Informatik stehen keine abstrakten sondern konkrete
Problemstellungen im Vordergrund. Es werden Methoden und Werkzeuge für
die Erstellung von Softwarelösungen solcher Probleme entwickelt. Die wichtigsten Teilbereiche bilden die Softwaretechnik, Programmiersprachen, Datenstrukturen, Algorithmen, Datenbanken, Compilerbau und Betriebssysteme.
Zur Angewandten Informatik zählen die Teilbereiche Webbasierte Systeme, Mensch-Maschine-Schnittstellen, Multimediatechniken, Künstliche Intelligenz, Wissensbasierte Systeme, Bio-Informatik, Computergrafik, Bildverarbeitung und IT-Sicherheit.
Die Technische Informatik vereint Konzepte und Methoden zum Entwurf
von Computersystemen, die für verschiedene Anwendungsbereiche optimiert
werden. Im Folgenden werden wir – beginnend mit kleinen und wenig performanten Computersystemen – verschiedene Anwendungsbereiche vorstellen.
Wie bei vielen Klassifizierungen gilt auch hier, dass die Gebiete der Informatik nicht disjunkt sind. So gibt es beispielsweise starke Bezüge zwischen der
Softwaretechnik und der theoretischen Informatik im Bereich automatischer
Ableitung von Programmeigenschaften, die bei einer Code-Umstrukturierung
erhalten bleiben sollen. Beim Entwurf eines Mikrochips werden die Schaltnetze heute durch Hardware-Beschreibungssprachen spezifiziert, so dass sich
bei Chip-Entwurfssystemen beispielsweise auch umfangreiche softwaretechnische Fragestellungen ergeben.
Auch zur Einordnung einzelner Fachgebiete der Informatik finden sich in
der Literatur Unterschiede. So findet sich die Bildverarbeitung teils in der Angewandten, teils in der Technischen Informatik.
1.1. Anwendungsbereiche der Technischen Informatik
1.1
Anwendungsbereiche der Technischen Informatik
Eingebettete Systeme sind in großer Zahl in Geräten der Haushalts- und Unterhaltungselektronik sowie in modernen Fahrzeugen zu finden. Mobile Geräte
wie Smartphones oder Tablet-Computer verfügen zusätzlich über berührungsgesteuerte Bildschirme (touch screens) und Telekommunikationsschnittstellen.
Desktop-Computer (häufig auch Personal Computer oder PC genannt) besitzen meist großformatige und hochauflösende Bildschirme, eine Tastatur, leistungsstarke Mehrkern-Prozessoren sowie größere Haupt- und Sekundärspeicher.
Bei Server-Computern verzichtet man auf Bildschirm bzw. Tastatur und beschränkt sich auf den Zugriff über eine Netzwerk-Schnittstelle. Server sind
auf maximale Performanz optimiert und verfügen daher meist über mehrere
Mehrkern-Prozessoren sowie graphische Co-Prozessoren (Graphical Processing
Unit, GPU) zur Beschleunigung von rechenintensiven Programmen. Um die
Performanz weiter zu erhöhen, können mehrere Server über ein leistungsstarkes
lokales Netzwerk zu einem Cluster (engl. für Anhäufung) zusammengeschaltet
werden. Der Zusammenschluss mehrerer Cluster führt schließlich zum Grid–
oder Cloud-Computing, bei dem die Nutzer über das Internet auf extrem performante Parallelrechnersysteme zugreifen können.
Je nach Anwendungsbereich stehen verschiedene Entwurfsziele im Vordergrund. So sollen z.B. mobile Systeme möglichst wenig Energie verbrauchen, um
die Akkulaufzeiten zu verlängern. Im Gegensatz dazu haben PCs und Server
einen deutlich höheren Energieverbrauch, da es hier vor allem auf eine hohe
Performanz ankommt.
1.2
Teilbereiche der Technischen Informatik
Die Technische Informatik umfasst die Teilbereiche
• Hardware-Entwurf (engl. digital design),
• Rechnerarchitektur (engl. computer architecture),
• Messen, Modellieren und Bewerten,
• Echtzeit– und eingebettete Systeme,
• Betriebssysteme, und
• Rechnernetze und Verteilte Systeme.
wobei die Betriebssysteme in natürlicher Weise eine Schnittstelle zwischen Praktischer und Technischer Informatik bilden.
7
8
Kapitel 1. Technische Informatik
1.2.1
Hardware-Entwurf
Der Hardware-Entwurf befasst sich mit der computergestützten Erstellung von
Hardware-Schaltungen zur Realisierung von Schaltnetzen, Schaltwerken und
Prozessoren.
Die Bandbreite reicht von Überlegungen zur effizienten Realisierung von oft
benötigten Schaltungen, zum Beispiel Rechnerarithmetik, über die Eingabe von
Schaltungen mittels Hardware-Beschreibungssprachen bis zu Algorithmen zur
automatischen Erstellung von Test-Eingabemustern für Mikrochips zur Erkennung von Fabrikationsfehlern.
1.2.2
Rechnerarchitektur
Die Rechnerarchitektur befasst sich mit Organisationsformen von Prozessoren,
um verschiedene, teilweise in Konflikt stehende Entwurfskriterien wie Leistungsfähigkeit, Ressourcenverbrauch (Leistungsaufnahme, Anzahl Transistoren) und Zuverlässigkeit zu erfüllen.
Die Untersuchungen reichen von der Organisation von Zwischenspeichern
zur Erhöhung des Datendurchsatzes über die Anzahl, Auswahl und Steuerung
von Ausführungseinheiten für verschiedene Befehle bis zur Struktur von Instruktionssätzen.
1.2.3
Bewertung von Computersystemen
Bei der Bewertung von Computersystemen gibt es viele Ansätze auf der Basis
von Modellen verschiedener Detailgrade sowie durch Ausführung von Anwendungen auf dem realen System. Hierbei darf die Messung der relevanten Parameter zur Laufzeit (wie Leistungsaufnahme, Datendurchsatz oder Speicherzugriffszeit) die Ausführung nicht so beeinflussen, dass die Messung verfälscht
wird.
1.2.4
Echtzeit– und eingebettete Systeme
Eingebettete Systeme dienen oft der Steuerung von Geräten. Deshalb dürfen Reaktionen des Systems bestimmte Zeiten nicht überschreiten. Zum Beispiel wäre
es fatal, wenn die Weitergabe des Kommandos zum Bewegen der Vorderräder
beim Steer-by-Wire in Kraftfahrzeugen manchmal erst mit einer Verzögerung
von einer halben Sekunde erfolgen würde. Echtzeitsysteme erfüllen solche Eigenschaften.
Weiterhin sind solche Systeme oft mobil und daher von einer Batterie oder
Akku abhängig, so dass zum Beispiel eine Abwägung zwischen Leistungsfähigkeit und Leistungsaufnahme erfolgen muss.
1.3. Einordnung des Moduls Computersysteme
1.2.5
Betriebssysteme
Ein Betriebssystem stellt eine Abstraktionsschicht zwischen einer konkreten
Rechnerhardware und Anwendungsprogrammen zur Verfügung. Es ermöglicht
beispielsweise, dass mehrere Anwendungsprogramme quasi-gleichzeitig ausgeführt werden, und jedes dabei so ausgeführt werden kann, als ob es alleine
auf dem Rechner ausgeführt würde. Gleichzeitig koordiniert und beschränkt
es den Zugriff von Anwendungen auf Hardware-Einheiten wie Festplatten oder
Netzwerk-Karten.
1.2.6
Kommunikationsnetze und verteilte Systeme
Kommunikationsnetze sorgen dafür, dass verschiedene Rechner miteinander
kommunizieren können. Hierbei gibt es eine Fülle von Technologien unterschiedlichster Bandbreite, Verzögerung, oder Übertragungsmedien. Arbeiten mehrere
Rechner, die sich an verschiedenen Orten (und in der Regel unter verschiedener administrativer Kontrolle) befinden, an der Lösung eines Problems, so
spricht man von einem verteilten System. Mit dem Aufkommen des Grid– und
Cloud-Computing hat dieses Feld an Bedeutung zugenommen.
1.3
Einordnung des Moduls Computersysteme
Das Modul Computersysteme besteht aus den Kursen Computersysteme 1 und
Computersysteme 2.
Der Kurs Computersysteme 1 bietet eine Einführung in den HardwareEntwurf. Behandelt werden Schaltnetze, Schaltwerke und komplexe Schaltwerke
sowie die Grundlagen von Mikroprozessoren.
Der Kurs Computersysteme 2 bietet eine Einführung in die Rechnerarchitektur. Behandelt werden Befehlssatz-Architektur, Mikroarchitektur mit Pipelining, Superskalarität und Sprungvorhersage sowie die Speicherorganisation
einschließlich Caches und Externspeichern.
Vielleicht fragen Sie sich, weshalb diese Themen in Ihrem Studiengang vorkommen, wenn Sie doch, wie viele Studierende, eine Tätigkeit in der SoftwareEntwicklung oder –Administration anstreben. Die Leistungsfähigkeit einer Software hängt jedoch entscheidend von deren Zusammenwirken mit der benutzten
Hardware ab. Daher ist es wichtig, die grundlegenden Abläufe bei der Ausführung eines Programms auf der Hardware zu kennen. Daher gibt es sowohl
Empfehlungen der Gesellschaft für Informatik als auch Anforderungen der Akkreditierungsagenturen, die ein entsprechendes Fachwissen für ein Informatikstudium vorsehen.
Ein großer Teil der heutigen Software läuft nicht auf PCs oder Servern,
sondern auf mobilen oder eingebetteten Geräten. Die Software-Entwicklung für
9
10
Kapitel 1. Technische Informatik
solche Geräte verlangt damit auch Kenntnis von deren Besonderheiten (zum
Beispiel reduzierte Speichergrößen), um diese berücksichtigen zu können.
Während dies lange als Spezialgebiet galt, führen die Verbreitung von mobilen Geräten (Beispiel App-Entwicklung für Smartphones) sowie die Vision
vom Internet der Dinge, bei dem letztlich alle Alltagsgeräte computergesteuert
sind und über (drahtlose) Netzwerke kommunizieren, dazu, dass immer mehr
Software-Entwickler Anwendungen für solche Geräte programmieren.
Auch unabhängig vom Anwendungsfeld und trotz Unterstützung durch Softwareenwicklungs-Werkzeuge bedingt eine Performance-Optimierung von Anwendungen in der Regel Kenntnisse der zugrundeliegenden Architektur, zum
Beispiel der Cachegröße und –Organisation.
Last but not least: auch wenn Sie derzeit eine konkrete Tätigkeit im Fokus
haben, weiß niemand von uns mit Sicherheit, was er oder sie in 10 oder 20
Jahren beruflich machen wird. Hier ist eine gewisse Breite in der Grundlagenausbildung unabdingbar (womit wir wieder bei den Vorgaben der Akkreditierungsagenturen wären).
In diesem Sinne wünschen wir Ihnen viel Freude bei der Bearbeitung des
Moduls Computersysteme.
Falls wir Sie jetzt sogar neugierig auf Technische Informatik gemacht haben,
finden Sie im folgenden Abschnitt Informationen über weitere Module in diesem
Bereich.
1.4
Weitere Kurse zur Technischen Informatik
Der Pflichtkurs Betriebssysteme und Rechnernetze bietet eine Einführung in
die beiden genannten Bereiche. Zu jedem der Bereiche gibt es darüber hinaus
ein Wahlpflichtmodul mit vertiefenden Inhalten. Zusätzlich gibt es ein Wahlpflichtmodul Verteilte Systeme.
Das Wahlpflichtmodul PC-Technologie stellt die Hardware sowie Betriebssystem– und Hardware-nahe Software-Aspekte in PCs vor, und bietet somit
eine zu den vorigen Modulen orthogonale Herangehensweise.
Das Wahlpflichtmodul Parallele Programmierung und Grid-Computing bietet neben einer Einführung in die Programmierung von Rechnern mit mehreren
Prozessoren und verschiedenen Speicherorganisationen auch eine Einführung
ins Grid– und Cloud-Computing. Vertiefende Informationen zu diesen Bereichen bietet das Modul Advanced Parallel Computing.
Das Wahlpflichtmodul Virtuelle Maschinen befasst sich unter anderem mit
den Anforderungen an Instruktionssätze und Kontrollmechanismen von Prozessoren, wenn nicht wie bei einem Betriebssystem mehrere Prozesse quasigleichzeitig mit der Illusion, den Rechner alleine zu nutzen, ausgeführt werden,
sondern mehrere virtuelle Rechner, von denen jeder sein eigenes Betriebssystem
1.4. Weitere Kurse zur Technischen Informatik
nutzen kann, auf einem physikalischen Rechner ausgeführt werden.
Das Wahlpflichtmodul Anwendungsorientierte Mikroprozessoren stellt die
Architektur von Prozessoren vor, die nicht in PCs eingesetzt werden. Mikrocontroller dienen vorwiegend Steuerungsaufgaben und digitale Signalprozessoren dienen vorwiegend der Verarbeitung digitalisierter Signale, zum Beispiel
Audio– und Videodaten.
11
12
Kapitel 1. Technische Informatik
Kapitel 2
Schaltnetze
Kapitelinhalt
2.1
Boole’sche Algebra . . . . . . . . . . . . . . . . . . . . . . .
15
2.2
Schaltfunktionen . . . . . . . . . . . . . . . . . . . . . . . .
17
2.3
Analyse von Schaltnetzen . . . . . . . . . . . . . . . . . . .
37
2.4
Synthese von Schaltnetzen . . . . . . . . . . . . . . . . . . .
40
2.5
Code–Umsetzer . . . . . . . . . . . . . . . . . . . . . . . . .
41
2.6
Addierglieder . . . . . . . . . . . . . . . . . . . . . . . . . .
46
2.7
Komparatoren . . . . . . . . . . . . . . . . . . . . . . . . .
51
2.8
Multiplexer . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
2.9
Arithmetik-Logik Einheit (ALU) . . . . . . . . . . . . . . .
59
2.10 Schaltnetze mit programmierbaren Bausteinen . . . . . . .
65
2.11 Laufzeiteffekte in Schaltnetzen . . . . . . . . . . . . . . . .
71
2.12 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . .
76
2.13 Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . .
77
13
14
Kapitel 2. Schaltnetze
Schaltnetze basieren auf elektronischen Schaltungen, die Spannungen als
logische Variablen 0 oder 1 interpretieren. Mit geeigneten Schaltungen ist man
in der Lage, alle grundlegenden Verknüpfungen der Boole’schen Algebra, auch
Schaltalgebra genannt, zu realisieren.
Schaltnetze enthalten mehrere Verknüpfungsglieder und realisieren eine Schaltfunktion oder Vektorfunktion:
F : {0, 1}n → {0, 1}m ,
Y = F (X)
(2.1)
Dabei ist X der Eingangsvektor mit den Eingangsvariablen x1 , x2 , . . . , xn ,
Y der Ausgangsvektor mit den Ausgangsvariablen y1 , y2 , . . . , ym , F die Zuordnungsvorschrift zwischen den Eingangs– und Ausgangsvariablen, gebildet durch
die Operatoren ∨, ∧, – und dargestellt durch die Schaltzeichen für die UND–,
ODER–, NICHT–Verknüpfung.
Die Schreibweise in Komponentendarstellung lautet:
y1 = f1 (x1 , x2 , . . . , xn )
y2 = f2 (x1 , x2 , . . . , xn )
..
..
.
.
ym = fm (x1 , x2 , . . . , xn )
(2.2)
Die Signallaufzeiten in den Verknüpfungsgliedern werden bei der Beschreibung der Schaltnetze nicht berücksichtigt. Unter dieser Voraussetzung gilt:
Die Ausgangsvariablen zu irgend einem Zeitpunkt sind eindeutig
bestimmt durch die Eingangsvariablen zum gleichen Zeitpunkt.
Die Definition der DIN–Norm (DIN44300/93) für ein Schaltnetz lautet deshalb:
Schaltnetz: Ein Schaltwerk1 , dessen Wert am Ausgang zu irgend
einem Zeitpunkt nur vom Wert am Eingang zu diesem Zeitpunkt
abhängt.
Schaltnetze werden mit Begriffen und Schaltzeichen der Schaltalgebra beschrieben. Im ersten Abschnitt dieses Kapitels werden Begriffe und Gesetze der
Schaltalgebra in einer Übersichtsform dargestellt. In der Analyse von Schaltnetzen wird ausgehend von einem Schaltplan die Funktionstabelle und die Funktionsgleichung erstellt. In der Synthese von Schaltnetzen gelangt man in umgekehrter Reihenfolge von einer Funktionstabelle oder Funktionsgleichung zum
Schaltplan.
Als Beispiele für Schaltnetze werden Funktionseinheiten digitaler Rechensysteme dargestellt: Code–Umsetzer, arithmetische Schaltnetze, Multiplexer.
Schaltnetze können nach zwei unterschiedlichen Methoden entworfen werden:
1
eine Funktionseinheit zum Verarbeiten von Schaltvariablen
2.1. Boole’sche Algebra
15
1. Realisierung durch einzelne Verknüpfungsglieder (UND, ODER, NICHT)
2. Realisierung durch adressierende Bausteine (Multiplexer, Festwertspeicher–ROM, PROM ...)
Zuordner F
x1
x2
Eingangsvektor
x
X .3
.
.
.
xn
y1
Schaltnetz
..
enthalt
&
_1
>
y2
y3
1
..
Verknupfungsglieder
. Y
.
.
.
Ausgangsvektor
ym
Abbildung 2.1: Blockschaltbild für ein Schaltnetz
In der DIN–Definition von Schaltnetzen werden Laufzeiteffekte nicht berücksichtigt. Reale Schaltnetze sind aus Verknüpfungsgliedern aufgebaut, bei
denen Signallaufzeiten auftreten. Deshalb werden am Ende des Kapitels Laufzeiteffekte in Schaltnetzen (Hazards) besprochen.
2.1
Boole’sche Algebra
Die Zweiwertigkeit von Schalterzuständen – Schalter ein/Schalter aus – führte zur praktischen Anwendung der Booleschen Algebra, zur Schaltalgebra. Die
Schaltalgebra ist eine Boolesche Algebra über der Menge B = {0, 1}. Die Realisierungsmöglichkeit der Schaltalgebra mit Schaltern (Verknüpfungsgliedern)
kommt in den Begriffen Schaltvariable, Schaltfunktion und Schaltalgebra selbst
zum Ausdruck. Die Schaltalgebra als Modell der Booleschen Algebra bildet die
theoretische Grundlage für den Entwurf von Schaltnetzen. Man kann sagen:
In digitalen Datenverarbeitungssystemen werden auf der physikalischen Ebene binäre Schaltvariablen mit elektronischen Schaltern (Verknüpfungsgliedern)
nach den Gesetzen der Schaltalgebra verknüpft.
2.1.1
Definition der Booleschen Algebra
Die Boolesche Algebra ist eine algebraische Struktur. Sie wird charakterisiert
durch folgende Eigenschaften:
16
Kapitel 2. Schaltnetze
1. Es existiert eine Menge B = {a, b, . . . , n}
∧ und ∨ sind eindeutige Verknüpfungen:
∧ : B × B −→ B
∨ : B × B −→ B
2. Für a, b, c ∈ B gelten folgende Gesetze:
2.1 Kommutativgesetze
a ∧ b = b ∧ a (K∧)
a ∨ b = b ∨ a (K∨)
2.2 Assoziativgesetze
(a ∧ b) ∧ c = a ∧ (b ∧ c) (A∧)
(a ∨ b) ∨ c = a ∨ (b ∨ c) (A∨)
2.3 Absorptionsgesetze
a ∧ (a ∨ b) = a (Ab∧)
a ∨ (a ∧ b) = a (Ab∨)
2.4 Distributivgesetze
a ∧ (b ∨ c) = (a ∧ b) ∨ (a ∧ c) (D∧)
a ∨ (b ∧ c) = (a ∨ b) ∧ (a ∨ c) (D∨)
2.5 Neutrale Elemente
Es gibt in B verschiedene Elemente e und n ∈ B, so dass für alle
a ∈ B gilt:
a ∧ e = a (N ∧)
a ∨ n = a (N ∨)
2.6 Komplementäres Element
Zu jedem a ∈ B existiert genau ein Element a ∈ B mit den Eigenschaften
a ∧ a = n (C∧)
a ∨ a = e (C∨)
2.7 Dualitätsprinzip
Ist A eine Aussage der Booleschen Algebra, so auch A, die man durch
Vertauschen von ∧ gegen ∨ und n gegen e erhält.
2.8 De Morgansche Regeln:
a∧b = a∨b
a∨b = a∧b
2.2. Schaltfunktionen
2.1.2
17
Schaltalgebra – ein Modell der Booleschen Algebra
Die Schaltalgebra ist ein Modell der Booleschen Algebra, die nur über zwei
Elementen, den beiden Elementen 0 und 1 definiert ist, d.h. die Schaltalgebra
ist eine Boolesche Algebra über der Menge B = {0, 1}. Sie wird durch folgende
Eigenschaften charakterisiert
1. Es existiert eine Menge B = {0, 1}
2. Es existieren die Verknüpfungen (Operatoren) ∧, ∨,–
Für die Verknüpfungszeichen werden Schaltzeichen eingeführt (DIN 40700
Teil 14).
3. Es gelten die Gesetze der Booleschen Algebra.
Operator
Schaltzeichen
Benennung
1
NICHT - Glied
(NOT)
V
&
UND - Glied
(AND)
V
>
_1
ODER - Glied
(OR)
Abbildung 2.2: Operatoren und Schaltzeichen nach DIN 40700
2.2
Schaltfunktionen
Die Schaltfunktionen der Schaltalgebra sind vergleichbar mit den Funktionen
der (allgemeinen) Algebra.
2.2.1
Definitionen
Eine Schaltfunktion ist eine Gleichung der Schaltalgebra, die die Abhängigkeit einer binären Schaltvariablen y (Ausgangsvariable) von einer (oder meh-
18
Kapitel 2. Schaltnetze
reren) unabhängigen binären Schaltvariablen x1 , (x2 , ...xn ) (Argument– oder
Eingangsvariablen) beschreibt (2.2). Die DIN–Formulierung lautet:
Schaltfunktion– eine Funktion, bei der jede Argumentvariable und
die Funktion selbst nur endlich viele Werte annehmen kann. (DIN
44300/87)
Eine Schaltvariable ist ein Symbol für die Elemente {0, 1} der Schaltalgebra.
Ist B = {0, 1}, dann bedeutet x ∈ B : die Variable x hat entweder den Wert
0 oder 1. DIN–Formulierung (44300/86): eine Variable, die nur endlich viele
Werte annehmen kann (am häufigsten sind binäre Schaltvariablen).
Ist x1 ∈ B und x2 ∈ B, dann hat die Produktmenge (kartesisches Kreuzprodukt) B × B = {(0, 0), (0, 1), (1, 0), (1, 1)} vier Elemente oder Wertekombinationen. Als Schreibweise für die Wertekombinationen verwendet man meist
folgende Darstellung:
(0,
(0,
(1,
(1,
0)
1)
0)
1)
=
ˆ x1
=
ˆ x1
=
ˆ x1
=
ˆ x1
x2
x2
x2
x2
Mit n Variablen können 2n Wertekombinationen gebildet werden. Für die
Schaltfunktion gilt deshalb:
Eine Schaltfunktion ist eine eindeutige Zuordnungsvorschrift, die
jeder Wertekombination von Schaltvariablen einen Wert zuordnet.
Jeder der insgesamt 2n Wertekombinationen der Variablen
x1 , x2 , . . . , xn
xi ∈ {0, 1}(i = 1, 2, . . . , n)
wird durch die Zuordnungsvorschrift f eindeutig ein Funktionswert
f (x1 , x2 , . . . , xn ) ∈ {0, 1} zugeordnet.
Man schreibt
y = f (x1 , x2 , . . . , xn )
und sagt
y ist eine Funktion von x1 , x2 , . . . , xn .
Der Ausdruck y = f (x1 , x2 , . . . , xn ) wird Schaltfunktion genannt.
Wird eine Schaltfunktion mit Hilfe eines Operationssymbols (∧, ∨,– ) dargestellt, dann heißt diese Schaltfunktion eine Verknüpfung (DIN 44300/87).
2.2. Schaltfunktionen
..
Verknupfung
19
UND
ODER
NICHT
x 2 x1 f (x1 , x 2 )
x 2 x1 f (x1 , x 2 )
x
f (x)
Wertetabelle
0
0
1
1
0
0
1
1
0
1
1
0
Schaltzeichen
x1
Darstellung
Funktion
x2
0
1
0
1
0
0
0
1
&
y = f (x1 , x 2 )
= x1 x2
y
x1
x2
0
1
1
1
0
1
0
1
>
_1
y
y = f (x1 , x 2 )
= x1 x2
x
1
y
y = f (x) = x
Abbildung 2.3: Grundverknüpfungen und ihre Darstellung
Mit diesen Operationssymbolen werden drei Grundverknüpfungen gebildet. Mit
diesen Grundverknüpfungen kann jede Schaltfunktion dargestellt werden, es
handelt sich bei (∧, ∨,– ) um ein sog. vollständiges Operatorensystem.
Es gibt für jede Verknüpfung drei gleichwertige Darstellungen (Abb. 2.3):
Wertetabelle, Schaltzeichen oder die Angabe der Funktion.
Weil mit n Eingangsvariablen 2n Wertekombinationen gebildet werden können
und die Ausgangsvariable zwei Werte 0, 1 annehmen kann, gibt es zu n Einn
gangsvariablen insgesamt 22 Ausgangsfunktionen. Für y = f (x) gibt es vier
Funktionen.
x f1 (x) f2 (x) f3 (x) f4 (x)
0
0
0
1
1
1
0
1
0
1
Bei f1 und f4 sind die Ausgangswerte unabhängig von den Eingangswerten
0 bzw. 1. Bei f2 ist der Ausgangswert gleich x, f3 bildet die Negation von x,
also f3 (x) = x.
Mit zwei Variablen x1 ∈ {0, 1} und x2 ∈ {0, 1} lassen sich insgesamt 16 unterschiedliche Verknüpfungen bilden, s. Tabelle 2.1.
Die wichtigsten Verknüpfungen, die als Digitalschaltungen realisiert sind,
sind in Abb. 2.4 dargestellt. Mit den in Abb. 2.4 angegebenen Verknüpfungen
werden mindestens zwei oder mehr Variablen miteinander verknüpft. Entsprechend haben die Schaltzeichen zwei oder mehr Eingänge. Die verbale Formulierung der Verknüpfung bedeutet
20
Kapitel 2. Schaltnetze
Funktionswert
Schreibweise
y = f (x1 , x2 )
mit den Zeichen
Benennung der
x1 = 0 1 0 1
∧∨−
Verknüpfung
x2 = 0 0 1 1
Null
y0 = 0 0 0 0
0
Konjunktion
y1 = 0 0 0 1
x1 ∧ x2
Inhibition
y2 = 0 0 1 0
x1 ∧ x2
Transfer
y3 = 0 0 1 1
x2
Inhibition
y4 = 0 1 0 0
x1 ∧ x2
Transfer
y5 = 0 1 0 1
x1
Antivalenz
y6 = 0 1 1 0 (x1 ∧ x2 ) ∨ (x1 ∧ x2 )
Disjunktion
y7 = 0 1 1 1
x1 ∨ x2
NOR–Verknüpfung y8 = 1 0 0 0
x1 ∨ x2
y9 = 1 0 0 1 (x1 ∧ x2 ) ∨ (x1 ∧ x2 )
Äquivalenz
Komplement
y10 = 1 0 1 0
x1
Implikation
y11 = 1 0 1 1
x1 ∨ x2
Komplement
y12 = 1 1 0 0
x2
Implikation
y13 = 1 1 0 1
x1 ∨ x2
NAND–Verknüpfung y14 = 1 1 1 0
x1 ∧ x2
y15 = 1 1 1 1
1
Eins
Bemerkung
Null
UND
Exclusiv–ODER
ODER
NICHT–ODER
NICHT–UND
Eins
Tabelle 2.1: Tabelle der möglichen Verknüpfungen mit zwei Variablen
• UND–Verknüpfung: Die Ausgangsvariable y ist dann 1, wenn alle Eingangsvariablen x1 , x2 , · · · xn gleich 1 sind.
• ODER–Verknüpfung: Die Ausgangsvariable y ist dann 1, wenn mindestens eine Eingangsvariable x1 oder x2 oder · · · xn gleich 1 ist.
• Antivalenz (Exklusiv–ODER, XOR): Die Ausgangsvariable y ist dann 1,
wenn entweder x1 oder x2 gleich 1 ist, aber nicht beide. Werden mehr als
zwei Variablen verknüpft, dann erfolgt die Verknüpfung durch Kaskadierung von zweifach XOR–Gliedern (((x1 ⊕ x2 ) ⊕ x3 ) ⊕ · · ·).
Selbsttestaufgabe 2.1 In Tabelle 2.1 gibt es 16 Schaltfunktionen mit zwei Variablen. Wie viele Schaltfunktionen gibt es mit vier Variablen?
Lösung auf Seite 77
2.2.2
Darstellung
Wie in Abb. 2.3 dargestellt, gibt es für die Grundverknüpfung drei gleichwertige
Darstellungen. Ebenso gibt es für Schaltfunktionen verschiedene gleichwertige
Darstellungsformen:
• Funktionstabelle
• Funktionsgleichung
2.2. Schaltfunktionen
Verknüpfung
21
Operator-Schreibweise
Schaltzeichen
Wertetabelle
x1 x0 y
UND
y = x0 ∧ x1
x0
x1
&
y
0
0
1
1
0
1
0
1
0
0
0
1
x1 x0 y
ODER
y = x0 ∨ x1
x0
x1
1
y
NICHT
y = x0
x0
1
y
0
0
1
1
0
1
0
1
0
1
1
1
x0 y
0
1
1
0
x1 x0 y
NAND
y = x0 ∧ x1
x0
x1
&
y
0
0
1
1
0
1
0
1
1
1
1
0
x1 x0 y
NOR
y = x0 ∨ x1
x0
x1
1
y
0
0
1
1
0
1
0
1
1
0
0
0
x1 x0 y
Antivalenz
y = x0 ≡ x1
x0
x1
=1
y
0
0
1
1
0
1
0
1
0
1
1
0
x1 x0 y
Äquivalenz
y = x0 ≡ x1
x0
x1
=
y
0
0
1
1
0
1
0
1
1
0
0
1
Abbildung 2.4: Wichtige Verknüpfungen der Digitalelektronik
• KV–Diagramm
• Schaltzeichen
• Binäres Entscheidungsdiagramm
Darstellung als Funktionstabelle
Die Funktionstabelle ist eine Zusammenstellung aller möglichen Wertekombinationen der Eingangsvariablen und der zugehörigen Werte der Ausgangsvariablen
(Tabelle 2.2). Sind für alle möglichen Wertekombinationen der Eingangsvariablen, (2n Kombinationen bei n Variablen), Werte für die Ausgangsvariablen
festgelegt, dann spricht man von einer vollständigen Funktionstabelle. In einer
unvollständigen Funktionstabelle ist nicht für jede mögliche Eingangskombination ein fester Wert der Ausgangsvariablen festgelegt.
22
Kapitel 2. Schaltnetze
Vollständige Funktionstabelle
x3 x2 x1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Unvollständige Funktionstabelle
f (x1 , x2 , x3 )
0
1
1
1
0
0
0
1
x3 x2 x1
f (x1 , x2 , x3 )
0
0
0
0
1
1
1
1
0
1
1
0
1
für diese Kombinationen
ist f (x1 , x2 , x3 ) nicht
definiert, sie heißen don’t
care Terme und können mit
0 oder 1 belegt werden.
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Tabelle 2.2: Vollständige und unvollständige Funktionstabelle
Darstellung als Funktionsgleichung
Die allgemeine Schreibweise einer Schaltfunktion ist
y = f (a, b, c)
Die Verknüpfung der Argumentvariablen (a, b, c, · · ·) geschieht durch die Operatoren UND, ODER, NICHT mit den Symbolen ∧, ∨,– .
Beispiel
y = a∧b∨c
Setzen wir a = x1 ∨ x2 ; b = x1 ∧ x3 ; c = x2 ∧ x3
so folgt
y = f (x1 , x2 , x3 ) = (x1 ∨ x2 ) ∧ (x1 ∧ x3 ) ∨ (x2 ∧ x3 )
(2.3)
Für die Ausführung der Verknüpfungen gibt es Vorrangregeln. Die Negation
hat die höchste Priorität, sowohl für Einzelvariablen als auch für Ausdrücke.
Die UND–Verknüpfung hat Vorrang vor anderen Verknüpfungen
(analog – Punktrechnung geht vor Strichrechnung). Bei Formeln, die durch Verknüpfung anderer Formeln entstehen, sind Außenklammern vorgesehen (DIN
66000). Bei der direkten UND–Verknüpfung einzelner Variablen wird das UND–
Verknüpfungszeichen der besseren Lesbarkeit wegen weggelassen, z.B. statt
x1 ∧ x2 ∧ x3 schreibt man (x1 x2 x3 ).
2.2. Schaltfunktionen
23
Aus den Gesetzen der Schaltalgebra folgen Regeln, die für die Umformung
von Schaltfunktionen hilfreich sind:
a∧0
a∨0
a∧a
a∨a
=
=
=
=
0;
a;
a;
a;
a∧1
a∨1
a∧a
a∨a
x 1 x0 ∨ x1 x0
(x1 ∨ x0 ) ∧ (x1 ∨ x0 )
x1 ∨ x1 x0
x1 (x1 ∨ x0 )
x1 ∨ x1 x0
=
=
=
=
=
=
=
=
=
a
1
0
1
x1
x1
x1
x1
x1 ∨ x0
Aus dem Dualitätsprinzip folgt z.B. für die Antivalenz
y = x0 x1 ∨ x0 x1
y = (x0 ∨ x1 ) ∧ (x0 ∨ x1 )
(2.4)
(2.5)
d.h. aus y wird y wenn man in der Funktionsgleichung ∧ und ∨, sowie 0
und 1 vertauscht. Weiterhin folgt:
Es ist möglich, jede Schaltfunktion ausschließlich mit NAND– oder
nur mit NOR–Verknüpfungsgliedern zu realisieren.
z. B.: Darstellung der Antivalenz nur mit NAND–Verknüpfung
y = x0 x1 ∨ x0 x1
y = x0 x1 ∨ x0 x1
y = x0 x1 ∧ x1 ∧ x 0 ∧ x0 x1
nur mit NOR–Verknüpfung
y = x0 x1 ∨ x0 x1
y = (x0 ∨ x1 ) ∧ (x0 ∨ x1 ) Dualitätsprinzip
y = y = (x0 ∨ x1 ) ∧ (x0 ∨ x1 )
y = (x0 ∨ x1 ) ∨ (x0 ∨ x0 ∨ x1 ∨ x1 )
24
Kapitel 2. Schaltnetze
Normalformen
Für die Darstellung von Schaltfunktionen in Gleichungsform gibt es Standarddarstellungen oder Normalformen
• Disjunktive Normalform (DNF)
• Konjunktive Normalform (KNF)
Die Disjunktive Normalform einer Schaltfunktion ist eine Disjunktion (ODER–
Verknüpfung) von Mintermen. Jeder Minterm (mi ) ist dabei eine Konjunktion, die jede Eingangsvariable negiert oder nicht negiert enthält. Besteht eine
Schaltfunktion aus Disjunktionen von Konjunktionstermen, die nicht alle Eingangsvariablen enthalten, so spricht man von einer disjunktiven Form (DF).
Die Konjunktive Normalform einer Schaltfunktion ist eine Konjunktion (UND–
Verknüpfung) von Maxtermen. Jeder Maxterm (Mi ) ist dabei eine Disjunktion, die jede Eingangsvariable negiert oder nicht negiert enthält. Besteht eine
Schaltfunktion aus Konjunktionen von Disjunktionstermen, die nicht alle Eingangsvariablen enthalten, so spricht man von einer konjunktiven Form (KF).
Bei n Schaltvariablen gibt es 2n verschiedene Minterme. Jeder Minterm hat
nur bei einer Kombination der Wertetabelle den Wert 1, bei allen anderen
Kombinationen den Wert 0; deshalb der Name Minterm.
Folgende Tabelle zeigt die Kombinationen von zwei Schaltvariablen und die
möglichen Minterme mit ihren zugehörigen Werten.
x2 x1
x2 ∧ x1
x2 ∧ x1
x2 ∧ x1
x2 ∧ x1
0
0
0
0
0
1
0
1
0
0
1
0
1
0
0
1
0
0
1
1
1
0
0
0
Der Minterm, der für eine bestimmte Kombination den Wert 1 hat, ergibt
sich, indem man die UND–Verknüpfung aus allen Schaltvariablen hinschreibt
und die Schaltvariablen negiert, die bei dieser Kombination den Wert 0 haben.
Z.B. gehört zur Wertekombination 0 1 der Minterm x2 ∧ x1 .
Bei n Schaltvariablen gibt es 2n verschiedene Maxterme. Jeder Maxterm hat
nur bei einer Kombination der Wertetabelle den Wert 0, bei allen anderen
Kombinationen den Wert 1; deshalb der Name Maxterm.
Folgende Tabelle zeigt alle Kombinationen von zwei Schaltvariablen und
alle möglichen Maxterme mit ihren zugehörigen Werten.
2.2. Schaltfunktionen
x3 x2 x1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
25
y = f (x3 , x2 , x1 )
Minterme
mi
Maxterme
1
0
0
1
1
1
0
0
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
x1 ∧ x2 ∧ x3
m0
m1
m2
m3
m4
m5
m6
m7
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
x1 ∨ x2 ∨ x3
0
1
0
1
0
1
0
1
Mi
M0
M1
M2
M3
M4
M5
M6
M7
Tabelle 2.3: Min– und Maxterme der Schaltfunktion
x2 x1
x2 ∨ x1
x2 ∨ x1
x2 ∨ x1
x2 ∨ x1
0
0
0
1
1
1
0
1
1
0
1
1
1
0
1
1
0
1
1
1
1
1
1
0
Der Maxterm, der für eine bestimmte Kombination den Wert 0 hat, ergibt
sich, indem man die ODER–Verknüpfung, gebildet aus allen Schaltvariablen
hinschreibt, und die Schaltvariablen negiert, die bei dieser Wertekombination
den Wert 1 haben. Z.B. gehört zur Wertekombination 0 1 der Maxterm x2 ∨ x1 .
Liegt für eine Schaltfunktion y = f (x1 , x2 , x3 ) eine vollständige Funktionstabelle vor, dann kann daraus die Funktionsgleichung in einer Normalform dargestellt werden.
In der disjunktiven Normalform treten genau die Minterme auf, bei denen
der Funktionswert f (x1 , · · · , xn ) den Wert 1 hat. Hat die Eingangsvariable xi
die Belegung 1, so steht im Minterm auch xi ; hat sie die Belegung 0, so steht im
Minterm xi . Die in Tabelle 2.3 dargestellte Schaltfunktion lautet in disjunktiver
Normalform
f (x1 , x2 , x3 ) = (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨
(x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 )
In der konjunktiven Normalform treten die Maxterme auf, bei denen der Funktionswert f (x1 , · · · , xn ) den Wert 0 hat. Hat die Eingangsvariable xi die Belegung
0, so steht im Maxterm auch xi , hat sie die Belegung 1, so steht im Maxterm
xi . Die in Tabelle 2.3 dargestellte Schaltfunktion lautet in konjunktiver Normalform
f (x1 , x2 , x3 ) = (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ) ∧
26
Kapitel 2. Schaltnetze
(x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 )
Jede Schaltfunktion kann in disjunktiver Normalform und konjunktiver Normalform dargestellt werden. Beide Darstellungen sind äquivalent und ineinander überführbar (Dualitätsprinzip).
Benutzen wir in der Darstellung einer Schaltfunktion die Abkürzung mi für die
Minterme und Mi für die Maxterme, dann erhalten wir für die Schaltfunktion
nach Tabelle 2.3
in DNF:
in KNF:
y = m0 ∨ m3 ∨ m4 ∨ m5
y = M1 ∧ M2 ∧ M6 ∧ M7
(2.6)
(2.7)
Für die Minterme, die nicht in der DNF enthalten sind gilt
y = m1 ∨ m2 ∨ m6 ∨ m7
(2.8)
y = y = m1 ∨ m2 ∨ m6 ∨ m7
y = m1 ∧ m2 ∧ m6 ∧ m7
(2.9)
Mit de Morgan folgt
Aus Vergleich von 2.7 und 2.9 folgt
mi = Mi
Für die Maxterme, die nicht in der KNF enthalten sind gilt
y = M0 ∧ M3 ∧ M4 ∧ M5
(2.10)
und mit de Morgan folgt
y = y = M0 ∧ M3 ∧ M4 ∧ M5
y = M0 ∨ M3 ∨ M4 ∨ M5
Aus Vergleich von 2.11 und 2.6 folgt ebenfalls
Mi = mi
(2.11)
2.2. Schaltfunktionen
x3 x2 x1 f (x1 , x2 , x3 )
0 0 0
0
0 0 1
1
0 1 0
0
0 1 1
1
1 0 0
1
0
1 0 1
1 1 0
1
1 1 1
0
27
x2 x1
x3
0
1
00
0
1
01
1
0
11
1
0
10
0
1
Tabelle 2.4: Funktionstabelle und zugehöriges KV–Diagramm
Karnaugh–Veitch–Diagramm
Ein KV–Diagramm ist die graphische Darstellung einer Wertetabelle oder Schaltfunktion. Das Diagramm ist in Matrixform angeordnet. Jeder Kombination der
Eingangsvariablen wird ein Feld der Matrix zugeordnet. Hat die Wertetabelle oder Schaltfunktion n Eingangsvariablen, dann hat das KV–Diagramm 2n
Felder. Die Anordnung oder Zuordnung der Felder zu den 2n möglichen Kombinationen der Eingangsvariablen wird so vorgenommen, dass sich beim Übergang von einem Feld zu einem benachbarten Feld nur der Wert einer Variablen
ändert, s. Tabelle 2.4. Anfangs– und Endfeld einer Zeile oder einer Spalte sind
benachbart. Die Matrix kann gleichsam vertikal und horizontal zu einem Zylinder zusammengerollt werden. Die Werte der möglichen Kombinationen werden
an den Matrixrand vor die Spalten und Zeilen geschrieben. In die Felder der
Matrix werden die zu den 2n möglichen Wertekombinationen gehörenden Funktionswerte geschrieben.
Soll eine gegebene Schaltfunktion, die in einer Normalform vorliegt, in einem KV–Diagramm dargestellt werden, dann werden den Feldern der Matrix
Minterme zugeordnet, wenn die Schaltfunktion in der DNF vorliegt (oder Maxterme, wenn die Schaltfunktion in der KNF vorliegt). Die Zuordnung der Min–
oder Maxterme zu den Feldern der Matrix wird wieder so vorgenommen, dass
sich beim Übergang von einem Feld zu einem benachbarten Feld innerhalb der
Terme nur eine Variable ändert. Die möglichen Terme werden an den Rand der
Matrix vor die Spalten und Zeilen geschrieben. Meist schreibt man zusätzlich
an den Matrixrand die Werte der Eingangskombinationen. In die Felder der
Matrix werden die zu den Termen gehörenden Funktionswerte geschrieben.
Beispiel 2.1 Die Schaltfunktion
y = (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 )
soll in einem KV–Diagramm dargestellt werden. Die Schaltfunktion hat drei
Schaltvariablen und ist in der DNF angegeben. Für die in der Schaltfunktion vorkommenden Minterme ist der Funktionswert 1. Die Felder des KV–
28
Kapitel 2. Schaltnetze
Diagramms, die diesen Mintermen zugeordnet werden, enthalten eine 1. In die
übrigen Felder wird eine 0 eingetragen (Abb. 2.5).
x 2 x1 x 2 x1 x 2 x1 x 2 x1 x 2 x1
x3
x3
0
x3
1
00
01
11
10
1
0
1
0
1
0
0
1
Abbildung 2.5: Darstellung einer DNF–Schaltfunktion in einem KV–Diagramm
Beispiel 2.2 Die Schaltfunktion
y = (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 ) ∧ (x1 ∨ x2 ∨ x3 )
soll in einem KV–Diagramm dargestellt werden. Die Schaltfunktion hat drei
Schaltvariablen und ist in der KNF angegeben. Für die in der Schaltfunktion vorkommenden Maxterme ist der Funktionswert 0. Die Felder des KV–
Diagramms, die diesen Maxtermen zugeordnet werden, enthalten eine 0. In die
übrigen Felder wird eine 1 eingetragen (Abb. 2.6).
x 2 x1 x 2 x1 x 2 x1 x 2 x1 x 2 x1
x3
x3
0
x3
1
00
01
11
10
1
0
1
0
0
1
1
0
Abbildung 2.6: Darstellung einer KNF–Schaltfunktion in einem KV–Diagramm
KV–Diagramme sind sehr hilfreich beim Vereinfachen (Minimieren) von
Schaltfunktionen und bei der Übertragung einer Funktionstabelle in eine Funktionsgleichung. Im weiteren werden wir, wenn nichts Spezielles erwähnt ist, stets
KV-Diagramme von disjunktiven Formen verwenden.
Mit Schaltzeichen
Nach Abb. 2.3 können die Grundverknüpfungen durch eine Wertetabelle, durch
eine Gleichung und durch Schaltzeichen dargestellt werden. DIN 40700 sagt:
Schaltzeichen werden in zweierlei Weise verwendet:
2.2. Schaltfunktionen
29
– als graphische Darstellung Boolescher Funktionen oder Operationen zum
Zweck der Beschreibung, des Entwurfs, der Synthese oder Analyse von
Systemen, die der Verarbeitung von binären Signalen dienen.
– als graphische Darstellung von technischen Systemen oder ihrer Teile in
Schaltungsunterlagen.
Folgende Schaltfunktion
y = f (x1 , x2 , x3 ) = (x1 ∨ x2 ) ∧ (x1 ∧ x3 ) ∨ (x2 ∧ x3 )
(2.12)
wird mit Schaltzeichen dargestellt:
Abbildung 2.7: Schaltfunktion dargestellt mit Schaltzeichen
Hierbei ist der Hardware-Aufwand proportional zur Anzahl der benutzten
Gatter. Die Durchlaufzeit oder Verzögerung eines Signals von einem Eingang
zu einem Ausgang ist proportional zum längsten Weg vom Eingang durch das
Schaltnetz zum Ausgang.
Selbsttestaufgabe 2.2 Eine Schaltfunktion sei als Funktionsgleichung
f (x1 , x2 , x3 ) = x1 ∧ (x2 ∨ x3 ) ∨ x2 ∧ x3
gegeben. Erstellen Sie die Wertetabelle, die DNF, das KV-Diagramm und eine
Darstellung mit Schaltzeichen.
Lösung auf Seite 77
2.2.3
Minimierung von Schaltfunktionen
Schaltfunktionen, die in einer Normalform gegeben sind oder die aus einer Funktionstabelle hergeleitet wurden, enthalten oft redundante Terme. Daher können
sie weiter vereinfacht werden.
30
Kapitel 2. Schaltnetze
Beispiel 2.3 Die Funktionsgleichung
y = (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 )
ist äquivalent der Gleichung
y = (x1 ∧ x3 ) ∨ (x1 ∧ x3 )
Vereinfachung von Schaltfunktionen soll deshalb hier bedeuten:
Die Funktionsgleichungen werden in möglichst “kurzen” Ausdrücken
dargestellt: d.h. mit möglichst wenig Variablen und möglichst wenig
Verknüpfungen. Die vereinfachte Form einer Schaltfunktion wird
disjunktive Form (DF) bzw. konjunktive Form (KF) genannt.
Es gibt verschiedene Verfahren zur Vereinfachung von Schaltfunktionen. Grundlage aller Verfahren sind folgende zwei Gesetze der Schaltalgebra
x1 ∨ x1 = 1
x1 ∧ x1 = 0
Die wichtigsten Verfahren zur Vereinfachung von Schaltfunktionen basieren
auf:
– den Gesetzen der Schaltalgebra
– KV–Diagrammen oder
– der Methode von Quine–McCluskey
Verfahren mit den Gesetzen der Schaltalgebra
In dem Verfahren mit den Gesetzen der Schaltalgebra kann durch Ausklammern
von Variablen, Kürzen, Zusammenfassen, Anwendung der De Morganschen Gesetze eine Schaltfunktion vereinfacht werden.
Beispiel 2.4
y = (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 ) ∨ (x1 ∧ x2 ∧ x3 )
= (x1 ∧ x3 ) (x2 ∨ x2 ) ∨ (x1 ∧ x3 ) (x2 ∨ x2 )
| {z }
| {z }
1
= (x1 ∧ x3 ) ∨ (x1 ∧ x3 )
1
2.2. Schaltfunktionen
31
Verfahren mit KV–Diagrammen
Das Verfahren mit KV–Diagrammen ist ein graphisches Verfahren. Ist in dem
KV–Diagramm eine Schaltfunktion in DNF dargestellt, dann werden benachbarte Felder, die mit 1 belegt sind, zusammengefasst. Die Zusammenfassung
wird so vorgenommen, dass sie möglichst viele Einsen einschließt. Dabei dürfen
aber nur rechteckige Blöcke mit eins, zwei, vier, acht usw. Feldern entstehen,
wobei das Zusammenfassen eines einzelnen Felds zu einem Block zwar einen
trivialen Fall darstellt, aber nicht vergessen werden darf. Felder der ersten
und letzten Zeile aber gleicher Spalte sind benachbart und können in einem
Block zusammengefasst werden; ebenso Felder der ersten und letzten Spalte
aber gleicher Zeile. Die vereinfachte Schaltfunktion wird dann aus den Termen
der zusammengefassten Blöcke und der übriggebliebenen Einzelfelder gebildet.
Die Terme der zusammengefassten Blöcke enthalten nur die Variablen, die sich
innerhalb eines Blockes nicht ändern.
In Abbildung 2.8 ist die Schaltfunktion in der DNF dargestellt und die mit
1 belegten Felder des KV–Diagramms werden zusammengefasst.
x 2 x1 x 2 x1 x 2 x1 x 2 x1 x 2 x1
x4 x 3
x 4 x 3 3.
00
x4 x 3
01
x4 x 3
11
x4 x 3
10
3.
00
01
11
10
1
0
1
1
0
1
1
0
0
0
1
1.
0
1
0
1
1
3.
2.
3.
Abbildung 2.8: Vereinfachung einer Schaltfunktion in DNF
Die vereinfachte Schaltfunktion lautet:
y = (x1 ∧ x2 ) ∨ (x1 ∧ x3 ∧ x4 ) ∨ (x1 ∧ x3 )
1.
2.
3.
Beispiel 2.5 Ist in dem KV–Diagramm eine Schaltfunktion in der KNF dargestellt, dann werden benachbarte Felder, die mit 0 belegt sind, zusammengefasst.
Die Zusammenfassung erfolgt wie oben erläutert und ist in Abb. 2.9 dargestellt.
32
Kapitel 2. Schaltnetze
x 2 x1 x 2 x1 x 2 x1 x 2 x1 x 2 x1
x4 x 3
x4 x 3
00
x4 x 3
01
x4 x 3
11
x4 x 3
10
00
01
11
1
0 2.
0
10
4.
0
0
1
1
1
1
1
0
3.
1
1
1
0
0
4.
1.
Abbildung 2.9: Vereinfachung einer Schaltfunktion in KNF
Die vereinfachte Schaltfunktion lautet:
y = (x1 ∨ x2 ∨ x3 ∨ x4 ) ∧ (x1 ∨ x3 ∨ x4 ) ∧ (x1 ∨ x2 ∨ x4 ) ∧ (x2 ∨ x3 )
1.
2.
3.
4.
Die Vereinfachung mit KV–Diagrammen eignet sich für Schaltfunktionen
mit maximal 6 Schaltvariablen. Sind mehr als 6 Schaltvariablen in der Schaltfunktion enthalten, dann wird dieses Verfahren unübersichtlich. Dies ist wie
folgt begründbar: Wenn durch redundante Variablen zusammenhängende Blöcke im KV–Diagramm entstehen sollen, dürfen in eine Koordinatenrichtung
höchstens zwei Variablen abgetragen werden. Schaltfunktionen mit 6 Schaltvariablen erfordern ein dreidimensionales KV–Diagramm. Damit hat die optische
Vorstellung ihre Grenze erreicht.
Quine–McCluskey Verfahren
Das Verfahren nach Quine–McCluskey arbeitet mit Tabellen. Es lassen sich
damit Schaltfunktionen mit vielen Variablen vereinfachen. Das Verfahren geht
von Schaltfunktionen aus, die in der DNF vorliegen. Die Methode lässt sich
leicht in ein Programm übertragen.
Für die Schreibweise wird folgendes vereinbart: Die Minterme der Schaltfunktion werden nicht durch die negierten und nichtnegierten Variablen dargestellt,
sondern durch ihr Binäräquivalent:
1
0
–
steht für eine nicht negierte Variable
steht für eine negierte Variable
steht für eine nicht auftretende Variable
2.2. Schaltfunktionen
Dez
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
33
x4
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
x3
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
x2
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
x1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
f (x4 , x3 , x2 , x1 )
1
0
1
0
1
1
1
1
0
0
1
1
0
0
0
0
Tabelle 2.5: Funktionstabelle einer Schaltfunktion, zur Veranschaulichung des
Quine–McCluskey Verfahrens
Beispiele: x4 ∧ x3 ∧ x2 ∧ x1
x4 ∧ x3 ∧ x1
x4 ∧ x2
=
ˆ 1010
=
ˆ 10-0
=
ˆ 1-1-
Das weitere Verfahren wird anhand eines Beispiels erläutert. Eine Schaltfunktion f (x4 , x3 , x2 , x1 ) sei durch ihre Funktionstabelle gegeben (Tabelle 2.5).
Die Reihenfolge der Funktionswerte wird so angeordnet, dass die Binäräquivalente der Terme aufsteigenden Dualzahlen entsprechen. Zur weiteren Vereinfachung der Schreibweise wird die Reihenfolge der Terme durch Dezimalzahlen
als Indizes der Minterme dargestellt.
Im ersten Schritt werden die Minterme nach gewichteten Gruppen in eine
weitere Tabelle übertragen. Das Gewicht einer Gruppe wird durch die Anzahl
der Einsen in den Binäräquivalenten bestimmt (Gruppe 0: keine 1, Gruppe 1:
eine 1, usw.). Im zweiten Schritt werden die Minterme von benachbarten Gruppen zu einem um eine Variable kürzeren Term zusammengefasst entsprechend
dem Distributivgesetz sowie Eigenschaften von komplementärem und neutralem Element (s. Abschnitt 2.1.1):
(x2 ∧ x1 ) ∨ (x2 ∧ x1 ) = x2
Zwei Terme sind zusammenfassbar, wenn sie sich nur in einer Stelle um 0
und 1 unterscheiden.
Dies wird im Binäräquivalent durch ’–’ gekennzeichnet. Man beginnt mit
dem ersten Minterm einer Gruppe und versucht ihn mit allen Mintermen der
34
Kapitel 2. Schaltnetze
nächsten Gruppe zu verschmelzen. Verschmolzen werden können alle Minterme, die sich nur durch den Wert einer Variablen unterscheiden. Dabei können
die Minterme mehrmals verwendet werden. Alle Minterme, die so mit einem
√
anderen Minterm verschmolzen wurden, werden gekennzeichnet ( ). Die neu
entstandenen Terme werden wieder nach Gruppen geordnet und in eine Tabelle
eingetragen. An den Dezimalziffern, die in der ersten Spalte der Tabelle stehen,
ist erkennbar, aus welchen Mintermen der neue Term gebildet wurde. Somit
lauten die Tabellen des ersten und zweiten Schrittes:
Dez
0
2
4
5
6
10
7
11
x4
0
0
0
0
0
1
0
1
x3
0
0
1
1
1
0
1
0
x2
0
1
0
0
1
1
1
1
x1
0
0
0
1
0
0
1
1
√ Gruppe
0
√
1
√
√
2
√
√
√
3
√
Dez
0,2
0,4
2,6
2,10
4,5
4,6
5,7
6,7
10,11
x4
0
0
0
0
0
0
0
1
x3
0
0
1
1
1
1
0
x2
0
1
1
0
1
1
x1
0
0
0
0
0
1
-
√ Gruppe
0
√
√
1
√
√
√
√
2
Der zweite Schritt wird solange wiederholt, bis keine Verschmelzung mehr
durchgeführt werden kann. Die verschmolzenen Terme werden gekennzeichnet.
Terme die nicht gekennzeichnet sind, werden Primimplikanten genannt.
Als letzte Tabelle folgt für das Beispiel:
Dez
x4
0,2 ; 4,6 0
0,4 ; 2,6 0
4,5 ; 6,7 0
4,6 ; 5,7 0
x3
1
1
x2
-
x1
0
0
-
Gruppe
0
1
Entstehen bei der Bildung einer Tabelle in einer Gruppe mehrfach gleiche
Terme, so werden diese bis auf einen gestrichen. Die Schaltfunktion setzt sich
jetzt aus den Primimplikanten zusammen, die nicht gekennzeichnet sind. Für
das Beispiel folgt:
Indexdarstellung:
f (x4 , x3 , x2 , x1 ) = (2, 10) ∨ (10, 11) ∨ (0, 2, 4, 6) ∨ (4, 5, 6, 7)
Boolesche Form:
f (x4 , x3 , x2 , x1 ) = (x3 ∧ x2 ∧ x1 ) ∨ (x4 ∧ x3 ∧ x2 ) ∨ (x4 ∧ x1 ) ∨ (x4 ∧ x3 )
Diese Schaltfunktion lässt sich weiter vereinfachen, wiederum mit Tabellen: Primtermtabellen oder Primimplikantentafeln. Jeder Primimplikant ist aus
2.2. Schaltfunktionen
35
bestimmten Mintermen entstanden (dargestellt durch die Dezimalziffern als
Indizes der Minterme). Andererseits sind verschiedene Minterme in mehreren
Primimplikanten enthalten. Ziel der Vereinfachung ist es, diejenigen Primimplikanten zu finden, die alle Minterme überdecken. Diese werden wesentliche
Primimplikanten genannt.
Die Primimplikantentafel ist so aufgebaut, dass über den Spalten der Tafel die Indizes der Minterme stehen und an den Zeilen die Primimplikanten.
Für jeden Primimplikanten werden alle Minterme markiert, die durch ihn abgedeckt werden. In der Primimplikantentafel wird dies durch ein Kreuz in dem
Schnittpunkt der betreffenden Spalte und Zeile dargestellt (Abb. 2.10).
Abbildung 2.10: Primimplikantentafel
Jetzt sucht man alle Spalten, in denen nur eine Markierung steht und kennzeichnet sie, in der Tafel durch . Ein Primimplikant in der zu dieser Markierung gehörigen Zeile ist ein wesentlicher Implikant, wird Kernimplikant genannt, und muss in der Minimalform erscheinen. Aus den verbleibenden (nicht
wesentlichen) Primimplikanten sucht man eine minimale Anzahl von Primimplikanten aus, so dass alle Minterme überdeckt werden, minimale Restüberdeckung. Kernimplikanten und minimale Restüberdeckung sind im Beispiel durch
• gekennzeichnet.
Die Disjunktion der Kernimplikanten und der Restüberdeckung ist die Minimalform der Schaltfunktion.
f (x4 , x3 , x2 , x1 ) = (x4 ∧ x3 ∧ x2 ) ∨ (x4 ∧ x1 ) ∨ (x4 ∧ x3 )
Vektorfunktion
Der Ausdruck
y = f (x1 , x2 , . . . , xn )
stellt eine Schaltfunktion dar. Führt man für den Klammerausdruck
(x1 , x2 , . . . , xn ) eine Abkürzung X ein, wobei
X = (x1 , x2 , . . . , xn )
36
Kapitel 2. Schaltnetze
bedeutet, dann heißt diese Abkürzung Vektor X. Die Bestandteile xi des
Vektors werden Komponenten des Vektors X genannt. Eine Schaltfunktion
kann dann verkürzt geschrieben werden:
y = f (X)
Es gibt Schaltfunktionen, die alle von denselben Schaltvariablen abhängen.
Eine Zusammenfassung dieser Schaltfunktionen wird Funktionsbündel oder Vektorfunktion genannt. Die Schreibweise ist:
Y
Y
F
X
=
=
=
=
F (X)
(y1 , y2 , . . . , ym )
(f1 , f2 , . . . , fm )
(x1 , x2 , . . . , xn )
(2.13)
Der Ausdruck (2.13) steht für
y1 = f1 (x1 , x2 , . . . , xn )
y2 = f2 (x1 , x2 , . . . , xn )
..
.
ym = fm (x1 , x2 , . . . , xn )
Ebenso wie die Schaltfunktion y = f (x1 , x2 , . . . , xn ) kann auch die Vektorfunktion Y = F (X) durch eine Wertetabelle dargestellt werden. Als Beispiel sei
die Wertetabelle zur Codierung des Gray–Code in den Dual–Code angegeben.
Gray–Code
Dual–Code
x4 x3 x2 x1 y4 y3 y2 y1
0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 0
0 0 1 0 0 0 1 1
0 1 1 0 0 1 0 0
0 1 1 1 0 1 0 1
0 1 0 1 0 1 1 0
0 1 0 0 0 1 1 1
Gray–Code
Dual–Code
x4 x3 x2 x1 y4 y3 y2 y1
1 1 0 0 1 0 0 0
1 1 0 1 1 0 0 1
1 1 1 1 1 0 1 0
1 1 1 0 1 0 1 1
1 0 1 0 1 1 0 0
1 0 1 1 1 1 0 1
1 0 0 1 1 1 1 0
1 0 0 0 1 1 1 1
Die Vektorfunktion Y = F (X) dieser Wertetabelle kann in vier Komponenten oder Schaltfunktionen dargestellt werden.
y1
y2
y3
y4
=
=
=
=
f1 (x1 , x2 , x3 , x4 )
f2 (x1 , x2 , x3 , x4 )
f3 (x1 , x2 , x3 , x4 )
f4 (x1 , x2 , x3 , x4 )
2.3. Analyse von Schaltnetzen
37
Eine andere Darstellungsform der Vektorfunktion ist das KV–Diagramm.
Die Vektorfunktion oder die zugehörige Wertetabelle kann nicht als Ganzes in
einem KV–Diagramm dargestellt werden, sondern für jede y–Komponente wird
ein KV–Diagramm angegeben. Soll eine Vektorfunktion mit Hilfe eines KV–
Diagramms vereinfacht werden, dann wird für jede y–Komponente ein Diagramm erstellt. Nach den bekannten Regeln werden Blöcke gebildet, um die
minimierte Schaltfunktion zu ermitteln. Vektorfunktionen finden häufig Anwendung in Schaltnetzen. Schaltnetze für Codierer, arithmetische Schaltungen
u.a. können als Vektorfunktionen dargestellt werden.
Selbsttestaufgabe 2.3 Minimieren Sie die Schaltfunktion aus Selbsttestaufgabe 2.2 mittels KV-Diagramm und mittels Quine-McCluskey-Verfahren.
Lösung auf Seite 77
2.3
Analyse von Schaltnetzen
Nach DIN 40700 bedeutet der Begriff Schaltzeichen graphische Darstellung einer Booleschen Funktion und graphische Darstellung von technischen Systemen
in Schaltungsunterlagen (Schaltplan). Analog wird hier der Begriff Schaltnetz
sowohl für die technische Realisierung einer Schaltfunktion als auch für die graphische Darstellung als Schaltplan verwendet.
Unter Analyse von Schaltnetzen verstehen wir deshalb das Lesen und Verstehen
von Schaltplänen, die der Verarbeitung binärer Signale dienen, und das Lesen
und Verstehen graphischer Darstellungen von Schaltfunktionen.
In der Analyse von Schaltnetzen wird untersucht, welche Werte die Ausgangsvariable(n) als Funktion der Eingangsvariablen annehmen. Dieser funktionale
Zusammenhang wird am besten durch eine Wertetabelle oder durch eine Funktionsgleichung dargestellt. Ausgehend von einem vorgegebenen Schaltplan wird
für jede Ausgangsvariable eine Schaltfunktion erstellt.
Die Ableitung der Schaltfunktion kann vom Eingang zum Ausgang oder vom
Ausgang zum Eingang vorgenommen werden. Vorteilhaft ist es, vom Eingang
zum Ausgang zu arbeiten, weil man dann am Ausgang der Verknüpfungsglieder Zwischenfunktionen einführen kann. Die Zwischenfunktionen werden zur
(Ausgangs)–Schaltfunktion zusammengefasst. In einer Wertetabelle werden die
möglichen Wertekombinationen der Eingangsvariablen eingetragen, dann die
Werte der Zwischenfunktionen gebildet und aus den Zwischenfunktionswerten
werden die Werte der Ausgangsvariablen ermittelt. Der Analysevorgang lässt
sich durch einen Ablaufplan angeben (Abb. 2.11).
Soll aus einem gegebenen Schaltplan die Funktionsgleichung ermittelt werden, so kann man folgendermaßen vorgehen:
– Ausgänge der Verknüpfungsglieder als Zwischenfunktionen z1 · · · zn kennzeichnen.
38
Kapitel 2. Schaltnetze
Wertekombinationen
der Eingangsvariablen
Schaltplan
Zwischenfunktionen
Wertetabelle
Funktionsgleichung
Abbildung 2.11: Ablaufplan für die Analyse eines Schaltnetzes
– Funktionsgleichungen der Zwischenfunktionen z1 · · · zn aufschreiben.
– Die Zwischenfunktionen durch zugehörige Funktionsgleichungen ersetzen.
Soll aus einem gegebenen Schaltplan eine Wertetabelle ermittelt werden, so
kann man folgendermaßen vorgehen:
– Alle möglichen Wertekombinationen der Eingangsvariablen in eine Wertetabelle eintragen.
– Ausgänge der Verknüpfungsglieder als Zwischenfunktion z1 · · · zn kennzeichnen.
– Funktionswerte der Zwischenfunktionen ermitteln und in die Wertetabelle
eintragen.
– Aus den Funktionswerten der Zwischenfunktionen die Werte der Ausgangsvariablen ermitteln und in die Wertetabelle eintragen.
Die Analyse von Schaltnetzen wird an einem Beispiel gezeigt. Abb. 2.12 zeigt
das zu analysierende Schaltnetz mit eingetragenen Zwischenfunktionen. In Tabelle 2.6 sind die Funktionswerte der Zwischenfunktionen und der Ausgangsfunktionen dargestellt.
Die Darstellung des Schaltnetzes in einer Funktionsgleichung ergibt:
2.3. Analyse von Schaltnetzen
a
b
39
c
Z1
&
>1
>1
Y2
Z2
&
&
Z3
&
Z4
&
Z5
>1
Z7
Y1
Z6
Abbildung 2.12: Beispiel zur Analyse von Schaltnetzen. Der Kringel am Eingang
des letzten UND-Gatters ist hierbei eine Kurzform für einen Inverter.
Eingangsvar.
Z1
Z2
Z3 Z4 Z5
abc a ∨ b ∨ c ab
Z6 = Y1
Z6
Z7
Y2
bc
ac Z3 ∨ Z4 ∨ Z5
0
0
0
0
1
0
0
1
0
0
0
0
1
1
1
0
1
0
0
0
0
1
1
1
1
0
1
1
0
0
1
0
0
0
0
0
0
1
0
0
0
0
1
1
1
1
0
1
0
1
0
0
1
1
0
0
0
1
1
0
0
1
0
1
0
1
0
0
0
1
1
1
1
1
1
1
1
1
0
0
1
c
b
a
0
0
0
0
0
0
0
1
0
0
1
0
0
1
1
Z2 ∧ Z6 Z1 ∨ Z7
Tabelle 2.6: Tabelle der Zwischenfunktionen zur Analyse des Schaltnetzes
Y1 = Z6 = Z3 ∨ Z4 ∨ Z5 = ab ∨ bc ∨ ac
Z 6 = Z3 ∨ Z4 ∨ Z5 = ab ∨ bc ∨ ac
= ab ∧ bc ∧ ac
Z6
= (a ∨ b) ∧ (b ∨ c) ∧ (a ∨ c)
Y2 = Z1 ∨ Z7 = Z1 ∨ (Z2 Z 6 ) = abc ∨ (a ∨ b ∨ c) Z 6
40
Kapitel 2. Schaltnetze
a Z 6 = a (a ∨ b) ∧ (b ∨ c) ∧ (a ∨ c)
= a(a ∨ b c) (b ∨ c)
a Z 6 = abc(b ∨ c) = abc
b Z6 =
= ba c
c Z6 =
= cab
Y2 = abc ∨ abc ∨ ba c ∨ cab
Auch die Durchlaufzeit lässt sich analysieren. Zwischen einem Eingang und
Ausgang Y2 beträgt sie 5 (zwei UND-Gatter, zwei ODER-Gatter, ein Inverter),
und zwischen einem Eingang und Ausgang Y1 beträgt sie 2.
Selbsttestaufgabe 2.4 Analysieren Sie das Schaltnetz aus Abb. 2.13.
Abbildung 2.13: Schaltnetz zum Selbsttest
Lösung auf Seite 78
2.4
Synthese von Schaltnetzen
In der Synthese von Schaltnetzen wird aus einer gegebenen Aufgabenstellung
der Schaltplan für ein Schaltnetz entworfen. Die Aufgabenstellung kann in
verbaler Formulierung, als Funktionsgleichung oder als Wertetabelle vorliegen. Deshalb ist der Syntheseweg von der Art der Aufgabenstellung abhängig.
Abb. 2.14 zeigt den Ablauf zur Synthese von Schaltnetzen.
Liegt die Aufgabenstellung als Funktionsgleichung vor, dann kann der Schaltplan direkt gezeichnet werden. Liegt die Aufgabenstellung als Wertetabelle vor,
wie es oft der Fall ist, dann wird aus der Wertetabelle die Funktionsgleichung
der Ausgangsvariablen in DNF oder KNF gebildet. Dann kann der Schaltplan
gezeichnet werden. Häufig ist es sinnvoll zuvor vereinfachte Funktionsgleichungen zu bilden (mit KV–Diagramm oder dem Verfahren von Quine-McCluskey)
2.5. Code–Umsetzer
Funktionsgleichung
41
verbale Formulierung
Wertetabelle
Variablenzuordung
Wertekombinationen
Wertetabelle
DNF
KNF
Schaltplan
Abbildung 2.14: Ablaufplan zur Synthese von Schaltnetzen
und dann das Schaltnetz zu zeichnen. Liegt die Aufgabenstellung in verbaler
Formulierung vor, werden zuerst die Eingangsvariablen und Ausgangsvariablen
definiert. Dann werden die Wertekombinationen der Eingangsvariablen in eine
Wertetabelle eingetragen und die Werte der Ausgangsvariablen, manchmal über
Bildung von Zwischenfunktionen, zugeordnet. Aus der Wertetabelle werden die
Funktionsgleichungen der Ausgangsvariablen in DNF oder KNF hergeleitet.
Dann kann der Schaltplan gezeichnet werden.
In den folgenden Abschnitten werden beispielhaft verschiedene Schaltnetze entworfen.
2.5
Code–Umsetzer
Ein Code–Umsetzer ist eine Vorschrift für die eindeutige Zuordnung (Codierung) der Zeichen eines Zeichenvorrats zu denjenigen eines anderen Zeichenvorrats (Bildmenge) (DIN 44300). Der Begriff Umsetzer bedeutet eine Funktionseinheit zum Ändern der Darstellung von Daten (DIN 44300/118).
42
Kapitel 2. Schaltnetze
Wir verstehen unter einem Code–Umsetzer ein Schaltnetz, das Informationen,
die in den Zeichen eines Codes A dargestellt sind, in die Zeichen eines Codes B überträgt. Diese Funktion wird durch ein Blockschaltbild dargestellt
(Abb. 2.15).
Information
in den Zeichen
des Codes A
Information
in den Zeichen
des Codes B
Code-Umsetzer
X/Y
Abbildung 2.15: Blockschaltbild für einen Code–Umsetzer
Die Anzahl der Eingänge und Ausgänge eines Code–Umsetzers ist abhängig
von der Wortlänge der Binärcodes, in denen die Information dargestellt ist.
2.5.1
Schaltnetzentwurf für die 8421–BCD
zu 7–Segment Umsetzung
In digitalen Datenverarbeitungssystemen werden Dezimalziffern sehr oft in einem BCD–Code2 dargestellt und in 7–Segmenteinheiten zur Anzeige gebracht.
Dafür ist ein Code–Umsetzer erforderlich. In dem hier betrachteten Beispiel
mögen die Dezimalziffern im 8421–BCD–Code vorliegen. Die Code–Umsetzung
kann durch das Blockschaltbild aus Abb. 2.16 dargestellt werden.
a
A
b
B
C
Code-Umsetzer
X/Y
c
d
e
f
D
g
Abbildung 2.16: Blockschaltbild für einen 8421–BCD–Code zu 7–Segment–
Code–Umsetzer
Die Zuordnung (Codierung) der Dezimalziffern vom 8421–BCD–Code zu
den Segmenten der 7–Segment–Anzeige wird nach Abb. 2.17 in einer Wertetabelle festgelegt (Tabelle 2.7).
2
BCD: binär codierte Dezimalzahl
2.5. Code–Umsetzer
Dezimal 8421–BCD–Code
7–Segment–Code
D C B
A
a b c d e f g
Ziffer
0
0 0 0
0
1 1 1 1 1 1 0
0 0 0
1
0 1 1 0 0 0 0
1
2
0 0 1
0
1 1 0 1 1 0 1
0 0 1
1
1 1 1 1 0 0 1
3
4
0 1 0
0
0 1 1 0 0 1 1
0 1 0
1
1 0 1 1 0 1 1
5
6
0 1 1
0
0 0 1 1 1 1 1
7
0 1 1
1
1 1 1 0 0 0 0
1 0 0
0
1 1 1 1 1 1 1
8
9
1 0 0
1
1 1 1 0 0 1 1
Tabelle 2.7: Zuordnungstabelle für 8421–BCD Code in 7–Segment Code
a
f
g
e
b
c
d
Abbildung 2.17: 7–Segment–Anzeige mit Bildung der Dezimalziffern
Für die Ausgangsvariablen a, b, . . . , g werden aus der Wertetabelle die Funktionsgleichungen in der DF hergeleitet. Geht man davon aus, dass die Kodierungen von 10 bis 15 (Pseudotetraden) nicht vorkommen, dann können diese
bei der Vereinfachung im KV–Diagramm als don’t care–Terme benutzt werden.
Nach der Vereinfachung ergeben sich für die Ausgangsvariablen die Funktionsgleichungen in der DF.
a
b
c
d
e
f
g
=
=
=
=
=
=
=
D ∨ (A ∧ C) ∨ (A ∧ C) ∨ (A ∧ B)
C ∨ (A ∧ B) ∨ (A ∧ B)
A∨B∨C
(A ∧ B) ∨ (A ∧ C) ∨ (B ∧ C) ∨ (A ∧ B ∧ C)
(A ∧ B) ∨ (A ∧ C)
D ∨ (A ∧ B) ∨ (A ∧ C) ∨ (B ∧ C)
(A ∧ B) ∨ (B ∧ C) ∨ (B ∧ C) ∨ D
Mit diesen Schaltfunktionen ergibt sich das Schaltnetz für den Code–Umsetzer
nach Abb. 2.18.
43
44
Kapitel 2. Schaltnetze
A B C D
1
1
1
1
&
&
A B
A C
&
A C
&
A B
&
A B
&
B C
&
A C
&
B C
&
A B C
A
B
C
C
D
>
_1
>
_1
>
_1
>
_1
>
_1
>
_1
>
_1
a
b
c
d
e
f
g
Abbildung 2.18: Schaltnetz für einen 8421–BCD–Code in 7–Segment Code Umsetzer
2.5. Code–Umsetzer
A2
0
0
0
0
1
1
1
1
A1
0
0
1
1
0
0
1
1
45
A0
0
1
0
1
0
1
0
1
Q0
1
0
0
0
0
0
0
0
Q1
0
1
0
0
0
0
0
0
Q2
0
0
1
0
0
0
0
0
Q3
0
0
0
1
0
0
0
0
Q4
0
0
0
0
1
0
0
0
Q5
0
0
0
0
0
1
0
0
Q6
0
0
0
0
0
0
1
0
Q7
0
0
0
0
0
0
0
1
Tabelle 2.8: Wertetabelle für einen 3 Bit Adressdecodierer
2.5.2
Schaltnetzentwurf für einen Adressdecodierer
Decodierer (decoder) sind Code–Umsetzer mit mehreren Eingängen und Ausgängen, bei denen für jede Kombination von Eingangssignalen immer nur je ein
Ausgang ein Signal abgibt (DIN 44300/121).
Am Ausgang eines Decodierers liegt die Information in den Zeichen eines
1 − aus − n Codes vor. Ein 1 − aus − n Code ist dadurch gekennzeichnet, dass
die Anzahl der Binärstellen gleich der Anzahl der darzustellenden Zeichen ist.
Wenn eine Bitstelle des Codewortes das 1–Signal führt, führen alle anderen
Stellen ein 0–Signal (Tabelle 2.8).
Abbildung 2.19: Blockschaltbild eines 3–Bit Adressdecodierers
Decodierer finden als Adressdecodierer Anwendung in digitalen Rechensystemen. Verschiedene Bausteine (Peripheriegeräte) oder Speicherzellen werden
mit einer Adresse angewählt. Über die Adresseingänge wird ein Ausgang des
Decodierers angewählt, der dann ein 1–Signal führt. Hat ein Adressdecodierer
n Eingänge, dann können 2n Ausgänge angewählt werden. Abb. 2.19 zeigt das
Blockschaltbild und Tabelle 2.8 die zugehörige Wertetabelle für einen 3–Bit
Adressdecodierer.
46
Kapitel 2. Schaltnetze
Selbsttestaufgabe 2.5 Entwerfen Sie die Funktionstabelle und ein Schaltnetz
für einen 2-Bit Adressdecodierer.
Lösung auf Seite 78
2.6
Addierglieder
Addierglieder sind Schaltnetze, die zwei Dualzahlen addieren. Dualzahlen bilden wie die Dezimalzahlen ein Stellenwertsystem, nur dass das Gewicht der
i-ten Stelle 2i ist, und nur Ziffern 0 und 1 erlaubt sind. Beispielsweise wird
durch die Dualzahl 101 die Zahl 1 · 22 + 0 · 21 + 1 · 20 = 5 dargestellt.
Dualzahlen werden wie Dezimalzahlen stellenweise addiert, beginnend bei
der wertniedrigsten Stelle. In einem Computer gehören Addierglieder zur ALU
(Arithmetic Logic Unit).
2.6.1
Halbaddierer
Werden zwei einstellige Dualzahlen A und B addiert, dann sind vier Additionen
möglich. Das Ergebnis wird mit Summe S und Übertrag Ü gekennzeichnet. Ü
und S bilden somit eine 2-stellige Dualzahl.
A
0
0
1
1
plus
plus
plus
plus
plus
B
0
1
0
1
Ü
0
0
0
1
S
0
1
1
0
Diese vier Additionen werden in eine Wertetabelle übertragen, A und B
sind die Eingangsvariablen, S und Ü die Ausgangsvariablen.
B
0
0
1
1
A
0
1
0
1
Ü
0
0
0
1
S
0
1
1
0
Aus dieser Wertetabelle können für S und Ü die Schaltfunktionen in einer
Normalform gewonnen werden.
Die Schaltfunktionen in DNF lauten:
S = (A ∧ B) ∨ (A ∧ B) = A ⊕ B
Ü = A ∧ B
2.6. Addierglieder
47
Die Übertragung der Schaltfunktionen in ein Schaltnetz ist in Abb. 2.20
dargestellt.
A
=1
S
A
..
U
&
B
Schaltnetz
HA
B
S
..
U
Schaltzeichen
Abbildung 2.20: Halbaddierer
Ein Schaltnetz, das zwei einstellige Dualzahlen addiert, Summe und Übertrag bildet, wird Halbaddierer (HA) genannt.
2.6.2
Volladdierer
Bei der Addition von zwei mehrstelligen Dualzahlen kommt es vor, dass nicht
zwei sondern drei Bit addiert werden, weil der Übertrag von der nächst niedrigeren Stelle hinzukommt. Solche Additionen können nicht mit einem HA durchgeführt werden. Ein Schaltnetz, das drei Bit addieren kann, daraus Summe
und Übertrag bildet, muss drei Eingänge und zwei Ausgänge haben und wird
Volladdierer (VA) genannt.
Aus der Aufgabenstellung lässt sich das Schaltnetz für einen Volladdierer
entwerfen. Die drei zu addierenden Bits werden mit den Variablennamen A,
B und C gekennzeichnet, teilweise auch Cin für eingehenden Übertrag (engl.
Carry). A, B und C werden addiert, die Summe wird mit S und der entstehende Übertrag mit Ü bezeichnet. Die möglichen Additionen werden in einer
Wertetabelle (Tabelle 2.9) dargestellt. Bei Nutzung eines VA in Addierern für
mehrstellige Dualzahlen werden die Ein– und Ausgänge mit einem Index, der
der Stelle entspricht, bezeichnet. Damit gilt Üi = Ci+1 , und auf die Bezeichnung
Üi wird verzichtet.
Aus der Wertetabelle lassen sich die Schaltfunktionen für die Summe S und
den Übertrag Ü gewinnen. Nach Vereinfachung ergeben sich die DF:
S =
=
Ü =
=
(A ∧ B ∧ C) ∨ (A ∧ B ∧ C) ∨ (A ∧ B ∧ C) ∨ (A ∧ B ∧ C)
A⊕ B⊕ C
(A ∧ B) ∨ (A ∧ C) ∨ (B ∧ C)
(A ∧ B) ∨ (A ∨ B) ∧ C
48
Kapitel 2. Schaltnetze
C
0
0
0
0
1
1
1
1
B
0
0
1
1
0
0
1
1
A
0
1
0
1
0
1
0
1
Ü
0
0
0
1
0
1
1
1
S
0
1
1
0
1
0
0
1
Tabelle 2.9: Zuordnungstabelle für die Addition von drei einstelligen Dualzahlen
In Abbildung 2.21 sind die Schaltfunktionen als Schaltnetz dargestellt.
Die Addition von zwei mehrstelligen Dualzahlen An−1 , . . . , A0 und Bn−1 , . . . , B0
kann bitseriell oder bitparallel ausgeführt werden. Man spricht daher von Serien–
und Paralleladdierer.
Beide Addiernetze unterscheiden sich wesentlich im Hardwareaufwand und
in der Addierzeit. Der Paralleladdierer führt die Addition aller Stellen in einem Schaltnetz ohne Zwischenspeicherung, d.h. während eines Taktschritts (s.
Kap. 3), aus. Der Serienaddierer führt während eines Taktschrittes die Addition von nur einer Stelle aus und nutzt als Schaltwerk Speicherelemente zum
Speichern von Zwischenergebnissen.
2.6.3
Paralleladdierer
Paralleladdierer können nach einer Vielzahl von Strategien realisiert werden,
wobei wir hier nur zwei Formen vorstellen:
– Paralleladdierer in Normalformlösung
– Ripple–Carry Adder
Normalform–Paralleladdierer
Bei einer Normalform entsteht immer ein dreistufiges Schaltnetz mit den Ebenen NICHT, UND, ODER. Die Addierzeit bei diesem Paralleladdierer ist von
der Stellenzahl der Summanden unabhängig. Sie ist konstant und beträgt 3
Laufzeiten. Der Hardwareaufwand steigt allerdings sehr schnell an. Abb. 2.22
zeigt das Blockschaltbild für die Addition von zwei 2–Bit Zahlen.
Für die Ausgangsvariablen ergeben sich die Funktionsgleichungen in DF.
Statt der Booleschen Schreibweise der UND-Verknüpfung mit dem Operator ∧
2.6. Addierglieder
49
a) vielstufiges Schaltnetz
b) dreistufiges Schaltnetz
Abbildung 2.21: Volladdierer
soll hier die algebraische Schreibweise als Multiplikation benutzt werden. Der ·
Operator wird, wie in der Mathematik üblich, nicht ausgeschrieben:
S0 = A0 B 0 ∨ A0 B0
= A0 ⊕ B0
S1 = A0 B0 A1 B1 ∨ A0 B0 A1 B 1 ∨ A0 A1 B1 ∨
A0 A1 B 1 ∨ B 0 A1 B1 ∨ B 0 A1 B 1
= A1 ⊕ B1 ⊕ (A0 B0 ) (mit C1 = A0 B0 )
50
Kapitel 2. Schaltnetze
A0
B0
Schaltnetz
S0
S1
A1
B1
C
Abbildung 2.22: Blockschaltbild für einen Paralleladdierer, der eine Normalform
realisiert
=
C =
=
=
A1 ⊕ B1 ⊕ C1
A1 B1 ∨ A0 B0 A1 ∨ A0 B0 B1
A1 B1 ∨ (A1 ∨ B1 )A0 B0
A1 B1 ∨ (A1 ∨ B1 )C1
(2.14)
(2.15)
(2.16)
Die Addition von zwei n–stelligen Summanden erfordert ein Schaltnetz mit
2 n Eingängen und (n + 1) Ausgängen. Für jeden Summenausgang müssen (ohne Minimierung) 2(2n−1) Min– oder Maxterme verknüpft werden. Die Anzahl
der Verknüpfungsglieder für die Summenausgänge wächst mit n · 2(2n−1) . Ein
Normalform–Paralleladdierer, der die Addition von 16– oder 32–Bit Summanden realisieren soll, ist hardwaremäßig nicht mehr realisierbar.
Der Normalform–Paralleladdierer ist ein Addiernetz mit minimaler Addierzeit
aber maximalem Hardwareaufwand.
Ripple–Carry Adder
Der Ripple–Carry Adder realisiert ein mehrstufiges Schaltnetz. Die Addition
der ersten oder wertniedrigsten Stelle wird von einem HA, der ein dreistufiges
Schaltnetz enthält, ausgeführt. Für jede weitere zu addierende Stelle wird ein
VA nachgeschaltet, der aus den Stellenbits und dem Übertrag der voraufgehenden Stelle wiederum einen Übertrag und eine Summe bildet. Abb. 2.23 zeigt
den so entstandenen Aufbau eines 4–Bit Ripple–Carry Adders.
B3 A3
C4
VA
S3
B2 A2
C3
VA
S2
B1 A 1
C2
VA
S1
B0 A 0
C1
HA
S0
Abbildung 2.23: 4–Bit Ripple–Carry Adder
2.7. Komparatoren
51
Mit jeder Stelle wächst das Schaltnetz um zwei Stufen. Summe und Übertrag einer Stelle i können erst gebildet werden, wenn Summe und Übertrag der
Stelle i−1 stabil sind, d.h. wenn der Übertrag durch alle Stufen des Schaltnetzes
durchgerieselt ist, wobei er durch UND– und ODER-Gatter muss. Die Signallaufzeit t durch ein n–stufiges Schaltnetz ergibt sich aus der Summe der Signallaufzeiten tP durch die einzelnen Volladdierer. Die Addierzeit des Ripple–Carry
Adders ist also proportional der Stellenzahl der Summanden. Werden taktweise Summanden an die Eingänge dieses Paralleladdierers angelegt, dann muss
die Pulsperiode größer sein als die Signallaufzeit (Addierzeit) t. Der Hardwareaufwand, die Anzahl der erforderlichen Verknüpfungsglieder, wächst linear mit
der Stellenzahl. Der Ripple–Carry Adder ist ein Addiernetz, bei dem Addierzeit
und Hardwareaufwand linear zur Stellenzahl n wachsen.
Selbsttestaufgabe 2.6 Konstruieren Sie aus Voll– und/oder Halbaddierern einen
4-Bit Ripple-Carry Addierer, der zusätzlich einen Eingangsübertrag C0 verarbeiten kann. Wie müssen Sie hierzu Abb. 2.23 verändern?
Lösung auf Seite 79
2.7
Komparatoren
Komparatoren sind Rechenelemente, die analoge oder binäre Signale vergleichen (DIN 40700 Blatt18/34). In digitalen Rechenanlagen sind Komparatoren Schaltnetze, die zwei Binärzahlen miteinander vergleichen. Werden zwei
Binärzahlen mit A und B bezeichnet, dann sind die Vergleichskriterien A = B,
A > B und A < B.
y1
b a
a
b
Komparator
Schaltnetz
a = b ( y1 )
a b ( y2 )
a b ( y3 )
Blockschaltbild
0
0
1
1
0
1
0
1
y2
y3
a=b a b a b
1
0
0
1
0
0
1
0
0
1
0
0
Wertetabelle
Abbildung 2.24: 1–Bit Komparator
Zuerst soll ein Komparatorschaltnetz entworfen werden, das zwei einstellige
Binärzahlen miteinander vergleicht. Als Blockschaltbild ergibt sich die Darstellung nach Abb. 2.24. Aus der Wertetabelle können die Schaltfunktionen direkt
angegeben werden.
52
Kapitel 2. Schaltnetze
y1 = a ≡ b
y2 = a ∧ b
y3 = a ∧ b
Abbildung 2.25 zeigt das zugehörige Schaltnetz, das zwei einstellige Binärzahlen vergleicht.
b
a
1
1
=
y1 (a = b)
&
y2 (a b)
&
y3 (a b)
Abbildung 2.25: Schaltnetz eines 1 Bit Komparators
Sollen zwei– oder mehrstellige Binärzahlen auf gleich, kleiner oder größer
untersucht werden, dann kann man unterschiedliche Entwurfsmethoden anwenden. Als Blockschaltbild kann die Aufgabenstellung nach Abb. 2.26 dargestellt
werden.
a0
A
B
a3
b0
b3
A = B (Y1)
Komparator
A B (Y2)
A B (Y3)
Abbildung 2.26: 4 Bit Komparator
Im ersten Schritt wird die Stellenwertigkeit der Binärzahlen festgelegt. Dann
kann der Vergleich der beiden Binärzahlen in einer Wertetabelle dargestellt
werden.
Für zwei zweistellige Binärzahlen A = a1 a0 und B = b1 b0 , wobei a0 , b0 den
Stellenwert 20 haben, und a1 , b1 den Stellenwert 21 , ergibt sich die Wertetabelle
aus Tabelle 2.10.
2.8. Multiplexer
53
B
b1
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
A
b0
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
a1
0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1
a0
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
Y1
A=B
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
Y2
A<B
0
0
0
0
1
0
0
0
1
1
0
0
1
1
1
0
Y3
A>B
0
1
1
1
0
0
1
1
0
0
0
1
0
0
0
0
Tabelle 2.10: Wertetabelle für einen 2–Bit Komparator
Mit Hilfe der Wertetabelle ergeben sich nach Vereinfachung mit dem KV–
Diagramm die Schaltfunktionen in der DF:
Y 2 = a1 b 1 ∨ a1 a0 b 0 ∨ a0 b 1 b 0
Y 3 = a1 b 1 ∨ a0 b 1 b 0 ∨ a1 a0 b 0
Y1 = Y 2 · Y 3 = Y2 ∨ Y3
für A < B
für A > B
für A = B
Diese Schaltfunktionen können als Schaltnetz realisiert werden, das dann
zweistellige Dualzahlen miteinander vergleicht.
Für den Vergleich von mehrstelligen Binärzahlen wird ein Algorithmus angewandt, der schrittweise alle Bit–Stellen miteinander vergleicht. Der Vergleich
kann mit der werthöchsten oder der wertniedrigsten Stelle beginnen. Die Schaltnetze, die dann entstehen, sind mehrstufig.
Selbsttestaufgabe 2.7 Minimieren Sie die DNF für Y1 aus Tabelle 2.10. Stellen
Sie Y3 als Funktion von Y1 und Y2 dar, um eine weitere Minimierung zu sparen.
Lösung auf Seite 79
2.8
Multiplexer
Ein Multiplexer ist ein auswählendes Schaltnetz. Über Steuereingänge wird
einer von mehreren Dateneingängen auf den Ausgang durchgeschaltet.
54
Kapitel 2. Schaltnetze
Abbildung 2.27: Blockschaltbild eines Multiplexers
Abbildung 2.27a zeigt das Blockschaltbild eines Multiplexers. D0 , . . . , Dn
sind die Dateneingänge, S0 , . . . , Sm die Steuereingänge, Y ist der Ausgang.
Abb. 2.27b zeigt das genormte Schaltzeichen eines 4 zu 1 Multiplexers. Der
Buchstabe G bedeutet: Die Steuereingänge steuern die Dateneingänge durch
UND–Verknüpfung. E kennzeichnet den Aktivierungseingang Enable. Wenn
E = 1, d.h. E = 0, dann haben alle Ausgangssignale den Wert 0, unabhängig
vom Wert der Eingangssignale.
Die Funktion eines 4 zu 1 Multiplexers wird durch folgende Wertetabelle
beschrieben:
S1
0
0
1
1
S0
0
1
0
1
Y=
D0
D1
D2
D3
Jeweils ein Dateneingang wird mit dem entsprechenden Steuerwort UND –
verknüpft und auf den Ausgang geschaltet. Daraus folgt die Schaltfunktion
Y
= (S 0 ∧ S 1 ∧ D0 ) ∨ (S0 ∧ S 1 ∧ D1 ) ∨
(S 0 ∧ S1 ∧ D2 ) ∨ (S0 ∧ S1 ∧ D3 )
Aus der Schaltfunktion ergibt sich das Schaltnetz (Abb. 2.28).
Die Länge der Datenworte, die in einem Rechenwerk verarbeitet werden,
beträgt 4, 8, 16 oder 32 Bit. Deshalb ist es erforderlich, dass ein Multiplexer, der
die Datenworte von einem ausgewählten Register auf die ALU durchschaltet,
auch 4, 8, 16 oder 32 Bit Eingangsdaten auf den Ausgang mit entsprechender
Bit–Anzahl schaltet.
Abbildung 2.29 zeigt das Schaltsymbol eines 4 × 2 zu 1 Multiplexers und
die Wertetabelle. Entweder werden die vier Dateneingänge A0 , . . . , A3 oder
2.8. Multiplexer
55
D0
&
D1
&
>
_1
D2
Y
&
D3
&
1
S1
1
S0
Abbildung 2.28: Schaltnetz eines 4 zu 1 Multiplexers
Abbildung 2.29: 4 × 2 zu 1 Multiplexer
B0 , . . . , B3 auf den Ausgang Y = Y0 , . . . , Y3 durchgeschaltet. Die Funktion des
4 × 2 zu 1 Multiplexers wird durch die Wertetabelle beschrieben. Die Auswahl
der Eingangsdatenworte wird durch die Steuervariable S festgelegt und ist in
der Wertetabelle dargestellt.
Während der Multiplexer ein auswählendes Schaltnetz ist, ist der Demultiplexer ein verteilendes Schaltnetz. Über Steuereingänge wird ein Dateneingang
auf einen von mehreren Ausgängen geschaltet. Mit n Steuereingängen kann auf
einen von 2n Datenausgängen verteilt werden (Abb. 2.30).
In Abhängigkeit vom Eingangssteuerwort wird der Dateneingang auf einen
der möglichen Datenausgänge geschaltet. Für einen 1 zu 4 Demultiplexer ergibt
sich die Wertetabelle aus Abb. 2.30.
56
Kapitel 2. Schaltnetze
Abbildung 2.30: Demultiplexer
Steuerworteingänge und Dateneingang sind wie beim Multiplexer UND–
verknüpft. Daraus ergeben sich für die Ausgänge folgende Schaltfunktionen
Q0
Q1
Q2
Q3
=
=
=
=
S0 ∧ S1 ∧ D
S0 ∧ S 1 ∧ D
S 0 ∧ S1 ∧ D
S0 ∧ S1 ∧ D
Mit den Schaltfunktionen lässt sich das Schaltnetz für einen 1 zu 4 Demultiplexer zeichnen (Abb. 2.31).
D
&
Q
&
Q1
&
Q
&
Q
0
2
3
S0
S1
1
0
1
0
G3
1
Q
S0
Schaltnetz
Schaltzeichen
Abbildung 2.31: 1 zu 4 Demultiplexer
0
Q1
Q
D
S1
Q
2
3
2.8. Multiplexer
57
Wie beim Multiplexer deutet der Buchstabe G im Schaltzeichen auf die
UND–Verknüpfung von Steuereingängen und Dateneingang hin.
Um mehr–Bit Dateneingangsworte auf verschiedene mehr–Bit Ausgangskanäle zu schalten, müssen entsprechende Demultiplexer vorhanden sein.
Abbildung 2.32 zeigt die Funktion eines 4 × 1 zu 4 Demultiplexers. Das
Schaltverhalten eines solchen Demultiplexers wird durch die Wertetabelle beschrieben.
Abbildung 2.32: 4 × 1 zu 4 Demultiplexer
Multiplexer werden hauptsächlich als Datenwegschaltungen eingesetzt.
Selbsttestaufgabe 2.8 Bauen Sie aus einem 1-zu-4 Demultiplexer einen 2-Bit
Adressdecoder. Hierzu müssen Sie lediglich in Abb. 2.31 die Ein– und Ausgänge
des Schaltzeichens neu beschriften.
Lösung auf Seite 79
Selbsttestaufgabe 2.9 Konstruieren Sie aus fünf 1-zu-4 Demultiplexern einen
1-zu-16 Demultiplexer. Hierzu müssen Sie lediglich die Schaltzeichen der 1-zu-4
Demultiplexer geeignet mit Leitungen verbinden.
Lösung auf Seite 79
Die UND–Verknüpfung der Steuereingänge mit den Dateneingängen hat
dabei adressierende Eigenschaften. Jede Kombination der Steuervariablen wird
mit einem Dateneingang UND–verknüpft und auf den Ausgang durchgeschaltet. Dadurch wird ein Schaltnetz realisiert, das die Steuereingänge als Eingangsvariable hat. An den Dateneingängen liegen die Funktionswerte der Ausgangsvariablen. So kann jede Schaltfunktion mit einem Multiplexer realisiert
werden.
Am Beispiel eines Volladdierers wollen wir die Realisierung mit Hilfe von
Multiplexern betrachten (Abb. 2.33).
58
Kapitel 2. Schaltnetze
..
S
C U.. B A
S2 S1 S0
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
0
1
1
0
1
0
0
1
..
S U
Y0 Y1
0
1
1
0
1
0
0
1
0
0
0
1
0
1
1
1
8:1
MUX 1
U
0
0
0
1
0
1
1
1
8:1
MUX 2
S2
S1
S0
a) Tabelle
b) Schaltbild
Abbildung 2.33: Volladdierer mit zwei 8 zu 1 Multiplexern
Die Zuordnungstabelle enthält die Eingangsvariable A, B und Cü sowie
die Ausgangsvariable Summe und Übertrag. Jede Ausgangsvariable stellt eine
vollständige Schaltfunktion mit 8 möglichen Eingangskombinationen dar. Die
Eingangsvariablen werden zu Steuer– oder Adresseingängen der beiden 8 zu
1 Multiplexern. Je nach anliegender Eingangsadresse S2 S1 S0 wird von jedem
Multiplexer ein Eingang auf den Ausgang durchgeschaltet. Liegen an den Eingängen von Multiplexer 1 die Funktionswerte für die Summenbildung, an den
Eingängen von Multiplexer 2 die Funktionswerte der Übertragsbildung, dann
wird die Zuordnungstabelle realisiert. Jeder Multiplexer realisiert eine Schaltfunktion.
Der Volladdierer mit zwei 8 zu 1 Multiplexern nach Abb. 2.33b kann auch
mit zwei 4 zu 1 Multiplexern realisiert werden (Abb. 2.34).
Adresse
S2 S1
0
0
1
1
0
1
0
1
MUX 1 (S)
S0
S0
S0
S0
a) Tabelle
..
MUX 2 (U )
0
S0
S0
1
..
S
..
..
Multiplexer-Belegung fur die Dateneingange
S0
S0
S0
S0
4:1
MUX
U
0
S0
S0
1
4:1
MUX
S2
S1
b) Schaltbild
Abbildung 2.34: Volladdierer mit zwei 4 zu 1 Multiplexern
2.9. Arithmetik-Logik Einheit (ALU)
Das bedeutet eine wesentliche Vereinfachung. Dieser Vereinfachung liegt
folgende Überlegung zugrunde: die Adresse und der zugehörige Dateneingang
sind UND–verknüpft. Es ist also möglich die Eingangsvariablen aufzuspalten,
zwei (hier S1 S2 ) werden als Adresseingänge benutzt und die anderen werden
den Dateneingängen zugeführt. Dabei wird die eigentliche Ausgangsvariable
z.B. y0 (= S) durch die dritte Steuervariable (S0 ) oder durch die Konstanten
0 oder 1 ausgedrückt. Für S2 S1 = 00 gilt y0 = S0 , für S2 S1 = 01 gilt y0 = S 0 ,
für S2 S1 = 10 gilt y0 = S 0 , für S2 S1 = 11 gilt y0 = S0 . Damit ergibt sich
für die Belegung der Dateneingänge der beiden Multiplexer die Tabelle nach
Abb. 2.34.
Schaltfunktionen lassen sich also mit Multiplexern vereinfachen. Die als
Adresseingänge benutzten Eingangsvariablen werden aus der Schaltfunktion
eliminiert. Jede Schaltfunktion mit n Eingangsvariablen kann durch einen Multiplexer mit 2n−1 Eingängen realisiert werden. An die Dateneingänge werden
die Konstanten 0, 1 oder die verbleibende Eingangsvariable angelegt. Soll die
Schaltfunktion durch einen Multiplexer mit 2n−2 Eingängen realisiert werden,
dann werden an die Dateneingänge die Konstanten 0, 1, die restlichen Eingangsvariablen oder Verknüpfungen davon angelegt. Die Adresseingänge können aus
den Eingangsvariablen frei gewählt werden. Jedoch ist es zweckmäßig diejenigen Eingangsvariablen zu wählen, die in möglichst vielen Produkttermen der
Schaltfunktion (DNF) vorkommen.
2.9
Arithmetik-Logik Einheit (ALU)
Die ALU ist das Kernelement eines digitalen Rechensystems (Mikroprozessor).
Als Funktion betrachtet ist die ALU eines Rechners ein Schaltnetz, das binäre
Variablen miteinander verknüpft. Die wichtigste arithmetische Verknüpfung,
die in der ALU ausgeführt wird, ist die Addition. Die logischen (Booleschen)
Verknüpfungen sind UND, ODER, NICHT, XOR. Die Schaltnetze zur Addition (Addierglieder) und die Verknüpfungsglieder UND, ODER, NICHT, XOR
haben wir in diesem Kapitel beschrieben.
Neben der arithmetischen Verknüpfung Addition ist die Subtraktion ebenso
wichtig. Die Subtraktion kann durch ein eigenes Schaltnetz realisiert werden
oder auf die Addition zurückgeführt werden. Wird die Subtraktion auf die Addition zurückgeführt, dann ist für Addition und Subtraktion nur ein Schaltnetz,
z.B. ein Paralleladdierer, erforderlich.
In diesem Abschnitt soll eine einfache ALU entwickelt werden, bei der die
Subtraktion durch Zweierkomplementbildung auf die Addition zurückgeführt
wird.
59
60
Kapitel 2. Schaltnetze
2.9.1
Zahlendarstellung und Zweierkomplement
Für die Zahlendarstellung und Zahlenoperationen mit Schaltnetzen eignen sich
Binärcodes, besonders der Dualcode und der BCD–Code.
Ohne Vorzeichen werden im Dualcode positive Zahlen so addiert, wie im Dezimalcode Dezimalzahlen. Mit Vorzeichen werden positive und negative Zahlen
durch das höchstwertige Bit als Vorzeichen gekennzeichnet. Das höchstwertige
Bit ist bei positiven Zahlen die 0, bei negativen Zahlen die 1. Der eigentliche Zahlenwert wird durch die restlichen n-1 Bits dargestellt, positive Zahlen
im Dualcode, negative Zahlen durch das Zweierkomplement. Die Bildung des
Zweierkomplements einer Dualzahl erfolgt in zwei Schritten:
1. Bildung des Einerkomplements (Invertierung) z.B. Einerkomplement von
A = 011001 ist A = 100110
2. Addition einer 1 zum Einerkomplement
Einerkomplement
A = 100110
+1
Zweierkomplement (A + 1) = 100111
Addiert man eine n-Bit Dualzahl A und das Zweierkomplement dieser Zahl
(A + 1), so ist das Ergebnis eine Dualzahl der Form 1.000 · · · 00, eine
n + 1–Bit Zahl, die (n + 1)ste Stelle ist eine 1, die anderen n Stellen sind 0.
Streicht man die 1 an der werthöchsten Stelle, d.h. die 1 an der (n + 1)sten
Stelle, dann ist das Ergebnis 0.
Daraus folgt:
ohne Übertrag gilt
oder
A + (A + 1) = 0
A + 1 = −A
Das Zweierkomplement (A +1) einer Dualzahl A ist eine Darstellung für
-A.
Ist für die Darstellung von positiven und negativen Zahlen eine feste Bitanzahl vorgegeben, dann kann die Subtraktion einer Zahl durch die Addition des
Zweierkomplements dieser Zahl ausgeführt werden.
Abbildung 2.35 zeigt die Darstellung positiver und negativer 4–Bit Zahlen. Stehen n–Bit Worte für die Zahlendarstellung zur Verfügung, dann ist der
darstellbare Wertebereich
−2n−1 bis + 2n−1 − 1.
Bei arithmetischen Operationen kann das Ergebnis den darstellbaren Wertebereich überschreiten. Das Ergebnis ist dann eine nicht korrekte Zahl, die außerhalb der Bereichsgrenzen liegt, es entsteht ein Überlauf oder overflow.
Wird die Addition von zwei 4–Bit Zahlen A und B allgemein formuliert,
2.9. Arithmetik-Logik Einheit (ALU)
61
Abbildung 2.35: Darstellung positiver und negativer Zahlen
A
a3
a2
a1
a0
B
b3
b2
b1
b0
c4
c3
c2
c1
\
s4
s3
s2
s1
s0
wobei a3 , b3 die Vorzeichenbits sind, si die Stellensummen und ci die Stellenüberträge, dann entsteht ein overflow wenn:
• die Vorzeichenbits der Summanden gleich sind, d.h. a3 ≡ b3 ,
und
• die beiden höchstwertigen Bits der Überträge ungleich sind, d.h. c4 ⊕ c3 .
Sind nämlich die Vorzeichen der Summanden verschieden, so kann es zu keiner Bereichsüberschreitung kommen. In diesem Fall (a3 6= b3 ⇔ a3 ⊕b3 = 1) gilt
wegen ci+1 = ai bi ∨(ai ⊕bi )ci auch c4 = c3 . Sind die Vorzeichen der Summanden
gleich, so entsteht ein Overflow, wenn das Vorzeichenbit des Ergebnisses unterschiedlich zu denen der Summanden ist. Sind beide Summanden-Vorzeichen
positiv, also gleich 0, so entsteht ein Overflow, wenn das Ergebnis-Vorzeichen
negativ, also gleich 1, ist, was wegen si = ai ⊕ bi ⊕ ci nur passieren kann, wenn
c3 = 1 ist. In diesem Fall wird aber kein Übertrag c4 erzeugt. Die Überträge
sind also ungleich. Analog behandelt man den Fall zweier negativer Vorzeichen.
Selbsttestaufgabe 2.10 Welche Zahl wird durch 110011 im Zweierkomplement
dargestellt? Wie sieht die Darstellung der Dezimalzahl −42 im Zweierkomplement mit 8 Stellen (einschl. Vorzeichen) aus? Kann man die Dezimalzahlen
62
Kapitel 2. Schaltnetze
−17, −16, +10, +20 im Zweierkomplement mit 5 Stellen (einschl. Vorzeichen)
darstellen?
Lösung auf Seite 80
2.9.2
Addierer/Subtrahierer
Soll, wie oben vorgeschlagen, die Subtraktion mit einem Paralleladdierer durchgeführt werden, dann müssen wir durch ein zusätzliches Schaltnetz die Funktionsfähigkeit des Paralleladdierers erweitern. Das zu entwerfende Schaltnetz
muss also neben der Summe aus zwei Dualzahlen A und B auch deren Subtraktion, realisiert als Addition von A und B̄ mit Eingangsübertrag 1, beherrschen. Das Ergebnis der Subtraktion, ebenfalls als Dualzahl betrachtet,
ist nur sinnvoll, solange die durch B dargestellte Dualzahl nicht größer ist als
A. Sind hingegen A und B als Zweierkomplement gegeben, so ist auch das
Ergebnis der Addition als Zweierkomplement gegeben und korrekt, solange keine Bereichsüberschreitung auftritt. Eine Bereichsüberschreitung kann, wie in
Abschnitt 2.9.1 beschrieben, durch Vergleich der beiden Vorzeichenbits und
Vergleich der beiden letzten Überträge erkannt werden.
Im ersten Schritt wird ein Schaltnetz entworfen, das abhängig von einem
Steuersignal S0 ein Bit Bi einer Dualzahl invertiert (bei S0 = 1) oder nicht
invertiert (bei S0 = 0). Ein solches Schaltnetz besteht wegen
f (Bi , S0 ) = B̄i ∧ S0 ∨ Bi ∧ S¯0
= Bi ⊕ S0
nur aus einem XOR-Gatter. Damit kann ein Paralleladdierer/-Subtrahierer wie
in Abb. 2.36 realisiert werden. Bei S0 = 0 wird addiert, bei S0 = 1 subtrahiert.
Die Summenbits sind zur Unterscheidung vom Steuersignal mit Fi bezeichnet.
Das ODER-Gatter beim Eingangsübertrag sorgt dafür, dass bei der Addition
ein Eingangsübertrag berücksichtigt werden kann, bei der Subtraktion hingegen
ein Eingangsübertrag mit dem Wert 1 erzwungen wird.
In Abb. 2.37 ist das Addier–/Subtrahier-Schaltnetz zu einem Blockschaltbild zusammengefasst. Das n mit dem Schrägstrich bei A, B und F deutet an,
dass es sich hier eigentlich um n Leitungen handelt.
Man kann das Addier-Subtrahierschaltnetz um weitere Funktionen erweitern. Zum Beispiel wird die XOR-Funktion bereits als Teil der Summenbildung
berechnet. Wenn die Überträge ausgeschaltet werden, wird die XOR-Funktion
als Ergebnis des Addierers ausgegeben. Das Ausschalten“ eines Signals X er”
folgt dadurch, dass man es mit einem Steuersignal S1 UND-verknüpft. Denn
ist S1 = 1, dann gilt X ∧ S1 = X, d.h. das Signal X wird unverändert weitergeleitet. Ist S1 = 0, dann gilt X ∧ S1 = 0, d.h. das Signal X wird ausgeschaltet.
Die Schaltnetze zum gesteuerten Invertieren und Ausschalten können mittels
2.9. Arithmetik-Logik Einheit (ALU)
Abbildung 2.36: 4-Bit Addier-Subtrahierschaltnetz
Abbildung 2.37: Blockschaltbild für n-Bit Addier-Subtrahierschaltnetz
y = S0 ⊕ Ai ∧ S1 kombiniert werden. Abb. 2.38 zeigt das Blockschaltbild und
die Funktionstabelle.
Setzt man in Abb. 2.36 das Schaltnetz SN vor beide Eingänge der Volladdierer und vor den Eingangsübertrag (s. Abb. 2.39), dann kann zum Beispiel der
Eingang Bi invertiert werden (durch S0 = 1 und S1 = 1) und die Eingänge Ai
und Ci ausgeschaltet werden (durch S2 = S3 = S4 = 0), so dass das Ergebnis
der Addition“ wiederum B̄i ergibt.
”
In Tabelle 2.11 sind die sinnvollen Verknüpfungen enthalten, die mit dem
erweiterten Addier–/Subtrahier-Schaltnetz ausgeführt werden können.
Allerdings geht man in der Regel einen anderen Weg. Statt ein Schaltnetz
immer komplizierter zu machen, um mehr Funktionen mit ihm zu berechnen,
63
64
Kapitel 2. Schaltnetze
Abbildung 2.38: Schaltnetz zur Aufgabenstellung; a: Blockschaltbild, b: Funktionstabelle
Abbildung 2.39: Erweitertes Addier-Subtrahierschaltnetz
nimmt man verschiedene Schaltnetze für die Funktionen und selektiert die gewünschte Funktion mittels Multiplexern.
In der ALU werden neben den arithmetischen Verknüpfungen Addition und
Subtraktion die logischen Verknüpfungen UND, ODER und NICHT ausgeführt.
Das Addier–/Subtrahier-Schaltnetz nach Abb. 2.37 muss deshalb um Schaltnetze erweitert werden, die diese Verknüpfungen ausführen. In Abb. 2.40 ist
dieses erweiterte Schaltnetz dargestellt.
Es enthält das Schaltnetz aus Abb. 2.37, die Schaltnetze für die UND–,
ODER– und NICHT–Verknüpfung sowie Multiplexer. Die Komponenten A0 · · ·An−1
der Variablen A und die Komponenten B0 · · ·Bn−1 der Variablen B liegen gleichzeitig an dem Addier–/Subtrahier-Schaltnetz, dem UND-, dem ODER- und
dem NICHT-Schaltnetz an. In dem UND-Schaltnetz werden die Komponenten
A0 ∧B0 , . . . , An−1 ∧Bn−1 verknüpft. Entsprechend werden alle Verknüpfungen
2.10. Schaltnetze mit programmierbaren Bausteinen
S4
logisch
arithmetisch
Tabelle 2.11:
Schaltnetzes
0
1
Funktionstabelle
65
S3
0
0
0
0
1
1
1
1
1
S2
0
0
0
0
0
0
0
1
1
S1
0
0
1
1
0
1
1
0
1
S0
0
1
0
1
0
0
1
0
0
F
0
1
B
B
A
A⊕B
A ⊕B
A
A⊕B
1
1
1
0
0
1
1
1
1
0
1
0
A+B
A-B
B-A
des
erweiterten
Addier–/Subtrahier–
ausgeführt. Dabei spielt der Inverterblock eine Sonderrolle. Während in den
anderen Schaltnetzen die zwei Variablen zu einem Ergebnis verknüpft werden, muss hier gewählt werden, welche der beiden Variablen invertiert werden
soll. Deshalb gibt es einen Auswahl-Multiplexer vor dem Inverterblock mit dem
Steuersignal S1 . Der Ergebnis-Multiplexer wählt über die Steuereingänge S2 , S3
die Ausgänge von einem Verknüpfungsschaltnetz aus und schaltet sie auf den
Ausgang F durch. Mit dem Schaltnetz nach Abb. 2.40 können sowohl arithmetische als auch logische (Boolesche) Verknüpfungen durchgeführt werden.
2.10
Schaltnetze mit programmierbaren Bausteinen
Einfache Schaltnetze (s. vorige Beispiele) lassen sich mit diskreten Verknüpfungsgliedern realisieren. Für komplexe Schaltnetze gibt es Bausteine mit hochintegrierten Verknüpfungsgliedern, die vom Anwender zu einem Schaltnetz verbunden, d.h. programmiert werden. Solche Bausteine werden programmierbare
Logikbausteine genannt. Es sind PROMs, EPROMs, PALs und PLAs.
Wie zu Beginn dieses Kapitels dargestellt, ist ein Schaltnetz die Realisierung einer Schaltfunktion oder Vektorfunktion. Sind die Schaltfunktionen in
einer Normalform gegeben, dann liefert die Realisierung ein dreistufiges Schaltnetz. In einem Schaltnetz, das eine DNF realisiert – und jedes Schaltnetz kann
in der DNF dargestellt werden – werden die Minterme (Produktterme) disjunktiv verknüpft. Das Schaltnetz enthält in der ersten Stufe Inverter, in der zweiten
66
Kapitel 2. Schaltnetze
Abbildung 2.40: Schaltbild der Arithmetik-Logik Einheit (ALU) mit Blockschaltbild.
UND–Verknüpfungen, in der dritten Stufe ODER–Verknüpfungen. Abb. 2.41a
zeigt den Strukturaufbau eines Schaltnetzes in der DNF. Der Eingangsvektor X
hat hier die Komponenten X0 , X1 , X2 , sie liegen invertiert und nichtinvertiert
vor. In den UND–Gliedern werden die Produktterme p0 , . . . ,p7 gebildet. Die
Produktterme werden in den ODER–Gliedern disjunktiv verknüpft und bilden die Ausgangsvariablen. Die Kreuzungspunkte der Eingangsvariablen mit
den Eingängen der UND–Glieder wird UND–Matrix, die Kreuzungspunkte der
Produktterme mit den Eingängen der ODER–Glieder ODER–Matrix genannt.
In programmierbaren Logikbausteinen werden die für das Schaltnetz erforder-
2.10. Schaltnetze mit programmierbaren Bausteinen
lichen Kreuzungspunkte der UND– und/oder ODER–Matrix programmiert.
Abbildung 2.41b zeigt ein PLA mit Verknüpfungsgliedern, Abb. 2.41c ist
eine vereinfachte Darstellung von Abb. 2.41b. Hier sind die Eingangsleitungen der UND– und ODER–Glieder nicht mehr dargestellt. Jeder Punkt in
der UND–Matrix bedeutet, dass die entsprechende Eingangsvariable einen Beitrag zu der mit p gekennzeichneten UND–Verknüpfung liefert. Jeder Punkt der
ODER–Matrix bedeutet, dass dieser Produktterm einen Beitrag zur ODER–
Verknüpfung liefert. Nach der Programmierbarkeit der UND–Matrix und/oder
der ODER–Matrix unterscheidet man vier Gruppen von programmierbaren Logikbausteinen, dargestellt in der folgenden Übersicht:
ROM
PROM, EPROM
PAL
PLA
UND–Matrix
fest
fest
programmierbar
programmierbar
ODER–Matrix
fest
programmierbar
fest
programmierbar
Die Realisierung von Schaltnetzen mit den verschiedenen Arten programmierbarer Logikbausteine wird im Folgenden näher beschrieben.
2.10.1
ROM
ROM steht für Read Only Memory. Nach der Übersichtstabelle ist die UND–
Matrix und die ODER–Matrix dieser Bausteine fest. Dieser Baustein realisiert
ein Schaltnetz mit festem Inhalt, der vom Hersteller durch Maskenprogrammierung fest verdrahtet wurde. Der Inhalt kann nur gelesen werden, daher der
Name Nur–Lese–Speicher oder Festwertspeicher. ROM–Bausteine finden Anwendung z.B. als Programmspeicher, Tabellenspeicher und Codeumwandler.
Ein ROM–Baustein ist aus einem Adressdecodierer und einer Speichermatrix
aufgebaut. Der Adressdecodierer übernimmt die Funktion der UND–Matrix aus
Abb. 2.41. Mit der Speichermatrix wird die ODER–Matrix realisiert. Der Eingangsvektor X wird als Adresse an den Adressdecodierer gegeben, der dann eine
Zeile der Speichermatrix auswählt. Ist die Zeile mit einem Eingang der ODER–
Glieder verbunden, dann wird dieser Produktterm über ein ODER–Glied bzw.
die ODER–Glieder an die Komponenten des Ausgangsvektors geschaltet. Die
Verbindungspunkte, realisiert durch Koppelelemente (Dioden, Transistoren) einer Zeile der Speichermatrix, repräsentieren den Inhalt dieser Speicherzeile oder
das Speicherwort. Deshalb werden die Zeilen der Speichermatrix Wortleitungen
genannt und die Ausgänge der ODER–Glieder entsprechend als Datenleitungen
bezeichnet. Das Schaltnetz nach Abb. 2.42 realisiert einen Volladdierer.
67
68
Kapitel 2. Schaltnetze
X
P
UND..
Verknupfung
ODER..
Verknupfung
Y
1
X
a) Strukturmodell
X0
1
X1
UNDMatrix
1
X2
1
&
p7
&
p6
&
p5
&
p4
&
p3
&
p2
&
p1
&
p0
ODERMatrix
_1
>
Y0
_1
>
Y1
..
b) Darstellung mit Verknupfungsgliedern
X0
1
X1
UNDMatrix
1
X2
1
&
p7
&
p6
&
p5
&
p4
&
p3
&
p2
&
p1
ODERMatrix
c) vereinfachte Darstellung
Abbildung 2.41: Struktur einer PLA
&
p0
_1
>
Y0
_1
>
Y1
2.10. Schaltnetze mit programmierbaren Bausteinen
Speichermatrix
}
}
Adreβdecodierer
69
X0
X1
X/Y
X2
>
_1
>
_1
S
U
..
Abbildung 2.42: Schaltbild eines ROM (VA–Schaltnetz)
2.10.2
PROM, EPROM
PROM steht für Programmable Read Only Memory. Nach der Tabelle der programmierbaren Logikbausteine ist die UND–Matrix fest und die ODER–Matrix
programmierbar. Ein PROM–Baustein realisiert ein Schaltnetz, dessen Inhalt
vom Anwender programmiert wird. Der Aufbau besteht wie beim ROM aus
Adressdecodierer und Speichermatrix. Der Inhalt der Speichermatrix wird vom
Anwender festgelegt und einprogrammiert. An allen Kreuzungspunkten der
Wortleitungen mit den Datenleitungen befinden sich Koppelelemente. Sie sind
über einen Widerstand, der die Aufgabe einer Schmelzsicherung (fusible link)
hat, an die Wortleitung angeschlossen (Abb. 2.43).
UB
Schmelzsicherung
Schmelzsicherung
Abbildung 2.43: Koppelelement mit programmierbarer Schmelzsicherung
Um auf einer Datenleitung eine 0 zu programmieren, muss das Koppelelement im Kreuzungspunkt zur Wortleitung zerstört werden. Ein Überstrom wird
durch das Koppelelement geleitet, der den Widerstand zum Schmelzen bringt
70
Kapitel 2. Schaltnetze
und damit Wort– und Datenleitung entkoppelt. Das hier beschriebene Verfahren funktioniert nur, wenn die Koppelelemente einzeln programmiert werden.
EPROM steht für Erasable Programmable Read Only Memory (löschbarer
programmierbarer Festwertspeicher). Diese Bausteine haben gegenüber den nur
einmal programmierbaren PROMs den Vorteil, dass der Speicher dieser Bausteine gelöscht und dann neu programmiert werden kann. Das Koppelelement,
das Wort– und Datenleitung miteinander verbindet, wird beim Programmiervorgang nicht irreversibel abgekoppelt.
Zum Löschen wird der Baustein mit UV–Licht (Wellenlänge 200–300nm)
bestrahlt. Die Löschzeit beträgt einige Minuten. Es wird immer die Information
des ganzen Bausteines gelöscht.
Neben der Möglichkeit den Inhalt des Bausteins mit UV–Licht zu löschen,
gibt es auch die Möglichkeit elektrisch zu löschen. Diese Bausteine werden EEPROMs genannt (Electrically EPROM). Jede einzelne Bitzelle kann elektrisch
programmiert oder gelöscht werden.
2.10.3
PAL
PAL steht für Programmable Array Logic. PAL–Bausteine haben eine programmierbare UND–Matrix und eine feste ODER–Matrix.
Bei Schaltfunktionen in der DNF nimmt die Zahl der möglichen Produktterme mit jeder Eingangsvariablen um das Doppelte zu. Werden Schaltfunktionen
mit vielen Eingangsvariablen und wenig Ausgangsvariablen mit PROMs realisiert, sind alle möglichen Produktterme vorhanden. In den meisten Fällen werden aber nur einige Produktterme benötigt. PAL–Bausteine enthalten weniger
UND–Glieder als die Zahl möglicher Produktterme aus den Eingangsvariablen.
Beispiel 2.6
Der PAL–Baustein PLHS 18P8 hat zehn Eingangsvariablen.
Damit könnten 1024 Produktterme gebildet werden. Würden alle in UND–
Gliedern realisiert, ergäbe das für viele Anwendungen eine hohe Redundanz.
Der Baustein enthält eine programmierbare UND–Matrix mit 72 UND–Gliedern,
und acht Ausgänge. Jeweils neun UND–Glieder führen auf ein ODER–Glied.
Bei manchen PAL–Bausteinen können die Ausgänge direkt oder invertiert auf
die Eingänge zurückgeführt werden. Zusätzliche Treiber mit Tri–State Funktion und Ausgänge mit Speichergliedern ermöglichen eine große Flexibilität
und Anwendungsmöglichkeit der PAL–Bausteine.
2.10.4
PLA
PLA steht für Programmable Logic Array. PLA–Bausteine haben eine programmierbare UND–Matrix und eine programmierbare ODER–Matrix, deshalb können sie als universelle Bausteine bezeichnet werden. Programmierbare
UND–Terme können mehrfach ausgenutzt werden. Die UND–Glieder können
2.11. Laufzeiteffekte in Schaltnetzen
71
mit jedem der möglichen Eingänge verbunden werden. Vor jedem Ausgang liegt
ein ODER–Glied, das mit jedem UND–Glied verbunden werden kann. Wie bei
den PAL–Bausteinen besteht die Möglichkeit, bestimmte Ausgänge auf den
Eingang zurückzuführen.
Für die Programmierung aller programmierbaren Logikbausteine benötigt
der Anwender ein spezielles Programmiergerät. Bei PROM–Bausteinen werden die Koppelelemente der ODER–Matrix über Wertetabellen programmiert.
PAL–Bausteine werden direkt mit Schaltfunktionen programmiert.
2.11
Laufzeiteffekte in Schaltnetzen
Zu Beginn dieses Kapitels haben wir für die Funktionsbeschreibung von Schaltnetzen die Definition der DIN–Norm benutzt. Darin werden Schaltnetze mit
idealen Verknüpfungsgliedern realisiert und die Eigenschaften realer Verknüpfungsglieder bleiben bewusst unberücksichtigt. Eine Eigenschaft realer Verknüpfungsglieder ist für den Entwurf und das fehlerfreie Funktionieren von
Schaltnetzen besonders wichtig – die Signallaufzeit. In Schaltnetzen kann die
Signallaufzeit dazu führen, dass die Schaltvariablen Werte annehmen, die sie
theoretisch oder bei idealen Verknüpfungsgliedern nicht annehmen würden. Solche Falsch–Werte in Schaltnetzen treten als Antwort auf die Änderung der
Werte der Eingangsvariablen auf und werden Hazards genannt. In den folgenden einfachen Funktionsgleichungen bleibt der Funktionswert per Definition der
Gleichung und bei idealen Verknüpfungsgliedern konstant, auch wenn sich die
Eingangsvariable ändert.
y0
y1
y2
y3
=
=
=
=
x∧x
x∧x
x∨x
x∨x
=
=
=
=
0
1
1
0
In Abbildung 2.44 sind die Schaltnetze zu den Funktionsgleichungen dargestellt. Ein Signalweg führt immer durch zwei Verknüpfungsglieder, der andere
nur durch ein Verknüpfungsglied. Ein Weg dauert deshalb zwei Signallaufzeiten
(2 tp ) der andere eine (1 tp ). Dabei ist angenommen, dass die Signallauzeit tp in
allen Verknüpfungsgliedern gleich ist. Durch die unterschiedlichen Signallaufzeiten kommt es zu Falschwerten oder Hazards. Der Vorgang ist im Impulsdiagramm nach Abb. 2.45 dargestellt. Die so entstandenen Hazards werden
statische Hazards genannt.
Wird in einem Schaltnetz durch Änderung einer Eingangsvariablen auch eine
Ausgangsvariable verändert und entsteht in dem Schaltnetz auch ein statischer
Hazard, der die Ausgangsvariable nochmals auf den Wert vor der Änderung
72
Kapitel 2. Schaltnetze
Abbildung 2.44: Entstehung von Hazards: Schaltnetze und Funktionsgleichungen
×
×
y0
y1
y2
y3
tp
t0
1
2
3
4
5
6
7
Abbildung 2.45: Entstehung von Hazards: Impulsdiagramm
setzt, dann handelt es sich um einen dynamischen Hazard. Einem dynamischen
Hazard geht immer ein statischer Hazard voraus. In Abb. 2.46 ist die Entstehung von einem statischen und dynamischen Hazard dargestellt.
Im Punkt Y1 des Schaltnetzes wird eine XOR–Verknüpfung realisiert. In der
Funktionstabelle sind unter Y1 die Funktionswerte der idealen Verknüpfung dar-
2.11. Laufzeiteffekte in Schaltnetzen
Abbildung 2.46: Entstehung von statischen und dynamischen Hazards
gestellt. Durch die NICHT–Glieder wird der Signalweg der Eingangsvariablen
zu den UND–Gliedern unterschiedlich verzögert. Ändern sich die Eingangsvariablen von BA = 00 nach BA = 11, dann bleibt nach der Funktionstabelle der
Wert der Ausgangsvariablen unverändert auf 0–Signal. Nach dem Impulszeit–
Diagramm, das die vorhandenen Signallaufzeiten berücksichtigt, liegt an beiden
Eingängen der UND–Glieder kurzzeitig 1–Signal an und folglich zeitverzögert
dann auch an den Ausgängen. Eine weitere Signallaufzeit später liegt auch an
Y1 ein 1–Signal an. Dieser nach der Funktionstabelle falsche Wert ist ein statischer 1–Hazard. Ändern sich die Eingangsvariablen von BA = 10 nach BA = 01,
dann entsteht an Y1 ein statischer 0–Hazard. An Y2 entsteht ein dynamischer
Hazard, dargestellt im rechten Teil des Impulsdiagramms (Abb. 2.48).
Statische 0– oder 1– Hazards lassen sich vermeiden, wenn in den Schaltnetzen redundante Verknüpfungsglieder eingebaut werden. Das soll an einem
Beispiel gezeigt werden.
Aus einer gegebenen Funktionstabelle werden die minimierten Funktionsgleichungen in DF und KF ermittelt. Die Funktionsgleichungen werden in ein
Schaltnetz übertragen (Abb. 2.47).
73
74
Kapitel 2. Schaltnetze
x2 x1 x0 f (x0 , x1 , x2 )
0 0 0
0
0
0 0 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
x1 x0
x2
0
1
00
0
1
y = x0 x1 ∨ x0 x2 DF
y = (x0 ∨ x1 ) ∧ (x0 ∨ x2 )
01
0
0
11
1
1
10
0
1
KF
(2.17)
Abbildung 2.47: Schaltnetz mit Hazard (a) und (b), hazardfrei (c) und (d)
In dem Schaltnetz, das aus der DNF gewonnen wurde, entsteht beim Übergang x2 x1 x0 = 1 1 1 nach x2 x1 x0 = 1 1 0 ein statischer 0–Hazard.
Zur Vermeidung dieses 0-Hazards wird das Schaltnetz Abb. 2.47a um ein
redundantes UND-Glied erweitert, das x1 und x2 verknüpft und y auf 1 hält
(Abb. 2.47c). Die Entstehung eines statischen 1–Hazard in einem Schaltnetz,
das nach der KF gewonnen wird, ist analog. Der 1–Hazard entsteht dann beim
Übergang x2 x1 x0 = 0 0 0 nach x2 x1 x0 = 0 0 1.
2.11. Laufzeiteffekte in Schaltnetzen
75
Hazards können besonders die Funktion von Schaltwerken stören. Sie werden
dann Races (Wettlauferscheinungen) genannt. Dabei werden die falschen Werte
der Ausgangsvariablen eines Schaltnetzes von Speichergliedern aufgenommen
und auf den Eingang des Schaltnetzes rückgekoppelt. Um solche Fehler zu vermeiden werden taktflankengesteuerte Speicherglieder benutzt. Die Information
wird erst dann in die Speicherglieder übernommen, wenn die Hazards abgeklungen sind und am Schaltnetzausgang ein stabiler gültiger Signalzustand anliegt.
In Abb. 2.48 sind statische und dynamische Hazards in einer Übersicht
dargestellt.
statt
oder
Y1 =
0
0
0
0
0
Y1 =
1
1
1
1
1
0
1
0
0
0
Y1 =
1
0
1
1
1
entsteht
Y1 =
statischer 1 - Hazard
statischer 0 - Hazard
statt
oder
Y2 =
0
1
1
1
1
Y2 =
1
0
0
1
0
1
1
Y2 =
1
0
0
0
0
entsteht
Y2 =
dynamischer 0 - Hazard
1
0
dynamischer 1 - Hazard
Abbildung 2.48: Klassifikation von Hazards
0
76
Kapitel 2. Schaltnetze
2.12
Zusammenfassung
Nachdem Durcharbeiten dieses Kapitels sollten Sie gelernt haben,
• die verschiedenen Darstellungen von Schaltfunktionen zu verstehen, mit
ihnen zu arbeiten und sie ineinander zu überführen,
• Schaltfunktionen zu minimieren,
• Schaltnetze zu analysieren und zu synthetisieren,
• Zahlen im dualen Zahlensystem und im Zweierkomplement darzustellen
und mit solchen Zahlen zu rechnen,
• mit einfachen Schaltnetzen für oft gebrauchte Funktionalitäten zu arbeiten.
2.13. Lösungen der Selbsttestaufgaben
2.13
77
Lösungen der Selbsttestaufgaben
Selbsttestaufgabe 2.1 von Seite 20
n
4
In n = 4 Variablen gibt es 22 = 22 = 216 = 65536 Schaltfunktionen, wobei
etwa 1000 dieser Schaltfunktionen letztlich unabhängig von einer oder mehreren
der Variablen sind.
Selbsttestaufgabe 2.2 von Seite 29
Die Wertetabelle zu y = x1 ∧ (x2 ∨ x3 ) ∨ x2 ∧ x3 ist in Tabelle 2.12 zu sehen.
Die DNF lautet
x1 x2 x¯3 ∨ x1 x2 x3 ∨ x1 x¯2 x3 ∨ x¯1 x2 x3 .
Das KV-Diagramm sowie eine Darstellung mit Schaltzeichen sind in Abbildung
Abb. 2.49 zu sehen.
x1
0
0
0
0
1
1
1
1
x2
0
0
1
1
0
0
1
1
x3
0
1
0
1
0
1
0
1
y
0
0
0
1
0
1
1
1
Tabelle 2.12: Wertetabelle der Schaltfunktion aus Selbsttestaufgabe 2.2
Abbildung 2.49: KV-Diagramm und Schaltzeichnung der Schaltfunktion aus
Selbsttestaufgabe 2.2
Selbsttestaufgabe 2.3 von Seite 37
Die Übertragung der Minterme aus Tabelle 2.12 liefert mit anschließender Verschmelzung:
78
Kapitel 2. Schaltnetze
Dez
3
5
6
7
x3
0
1
1
1
x2
1
0
1
1
x1
1
1
0
1
√ Gruppe
2
√
√
√
3
Dez
3,7
5,7
6,7
x3
1
1
x2
1
1
x1
1
1
-
Gruppe
2
Man sieht, dass keine weiteren Verschmelzungen möglich sind, denn alle
Terme befinden sich in der gleichen Gruppe. Damit besteht die minimale disjunktive Form aus 3 Primimplikanten:
y = x1 x2 ∨ x1 x3 ∨ x2 x3 .
Abb. 2.50 zeigt die Primimplikanten im KV-Diagramm.
Abbildung 2.50: KV-Diagramm mit Primimplikanten der Schaltfunktion aus
Selbsttestaufgabe 2.3
Selbsttestaufgabe 2.4 von Seite 40
Es gilt
Z1
Z2
Z3
Z4
Z5
Z6
Z7
Z8
Z9
Y
=
=
=
=
=
=
=
=
=
=
X1 ∧ X2
X2 ∧ X3
X1 ∧ X3
X4 ∨ X5
Z1 ∨ Z2 ∨ Z3 = X1 X2 ∨ X2 X3 ∨ X1 X3
Z̄5 = X1 X2 ∨ X2 X3 ∨ X1 X3
Z5 ∧ Z4 = (X1 X2 ∨ X2 X3 ∨ X1 X3 ) ∧ (X4 ∨ X5 )
Z̄4 = X4 ∨ X5
Z6 ∧ Z8 = X1 X2 ∨ X2 X3 ∨ X1 X3 ∧ X4 ∨ X5
Z9 ∨ Z7 = (X1 X2 ∨ X2 X3 ∨ X1 X3 ) ∧ (X4 ∨ X5 )
∨ X 1 X2 ∨ X2 X 3 ∨ X 1 X3 ∧ X4 ∨ X5
Selbsttestaufgabe 2.5 von Seite 45
Die Funktionstabelle ergibt sich wie folgt. Das Schaltnetz ist in Normalform in
Abb. 2.51 zu sehen.
2.13. Lösungen der Selbsttestaufgaben
A1
0
0
1
1
A0
0
1
0
1
Q3
0
0
0
1
79
Q2
0
0
1
0
Q1
0
1
0
0
Q0
1
0
0
0
Abbildung 2.51: Schaltnetz in Normalform der Schaltfunktion aus Selbsttestaufgabe 2.5
Selbsttestaufgabe 2.6 von Seite 51
Der Halbaddierer der niederwertigsten Stelle in Abb. 2.23 wird durch einen
Volladdierer ersetzt, und der zusätzliche Eingang wird mit C0 verbunden.
Selbsttestaufgabe 2.7 von Seite 53
Die Minterme für Y1 befinden sich in den Gruppen 0, 2 und 4. Deshalb ist keine
weitere Minimierung der DNF möglich. Für Y3 gilt: Y3 = Y¯1 ∧ Y¯2 .
Selbsttestaufgabe 2.8 von Seite 57
Die Steuereingänge des Demultiplexers werden mit den Adresseingängen verbunden. Der Dateneingang wird fest mit dem Wert 1 verbunden. Die Ausgänge
des Demultiplexers entsprechen den Ausgängen des Adressdecoders.
Selbsttestaufgabe 2.9 von Seite 57
Die Schaltzeichnung ist in Abb. 2.52 zu sehen.
80
Kapitel 2. Schaltnetze
Abbildung 2.52: 1-zu-16 Demultiplexer aus 1-zu-4 Demultiplexern
Selbsttestaufgabe 2.10 von Seite 61
110011 stellt im Zweierkomplement eine negative Zahl dar. Um den Betrag der
Zahl zu erhalten, subtrahieren wir 1 und bilden wir das Einerkomplement. Wir
erhalten 001101, also die Darstellung von 13 als Dualzahl. Damit stellt 110011
im Zweierkomplement die Zahl −13 dar.
Um die Zweierkomplement-Darstellung der Zahl −42 zu erhalten, bilden wir
zunächst die Darstellung von +42 als Dualzahl, nämlich 32+8+2 = 25 +23 +21 ,
also 00101010. Wir bilden das Einerkomplement und addieren 1, womit wir
11010110 als Zweierkomplement erhalten.
Im Zweierkomplement mit 5 Stellen einschließlich Vorzeichenbit können
Zahlen von −16 (10000) bis +15 (01111) dargestellt werden. Deshalb sind −17
und +20 nicht darstellbar.
Kapitel 3
Schaltwerke
Kapitelinhalt
3.1
Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
3.2
Speicherglieder . . . . . . . . . . . . . . . . . . . . . . . . .
83
3.3
Automatenmodelle für Schaltwerke . . . . . . . . . . . . . .
88
3.4
Analyse von Schaltwerken . . . . . . . . . . . . . . . . . . .
94
3.5
Synthese von Schaltwerken . . . . . . . . . . . . . . . . . .
97
3.6
Implementierung von Schaltwerken . . . . . . . . . . . . . . 104
3.7
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . 106
3.8
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . 107
81
82
Kapitel 3. Schaltwerke
Charakteristisches Merkmal von Schaltnetzen ist, dass die von ihnen erzeugten Ausgangssignale ausschließlich von den anliegenden Eingangssignalen
abhängen. Es gibt jedoch viele Aufgabenstellungen, bei denen ein digitales System selbstständig (autonom) oder in Abhängigkeit von Eingangssignalen eine
Abfolge von Ausgangssignalen erzeugen soll. Beispiele sind Zähler oder Steuerungsschaltungen wie z.B. eine Ampelsteuerung.
In diesem Kapitel werden wir uns deshalb den Schaltwerken zuwenden. Bei
diesen ist die Ausgabe von den Eingabesignalen und von einem inneren Zustand
bestimmt. Dieser Zustand kann sich wiederum in Abhängigkeit der Eingangssignale zeitlich ändern. Zur Speicherung des inneren Zustands werden Speicherglieder benötigt. Diese werden zuerst unter Betrachtung ihres Aufbaus und
ihrer Kenngrößen eingeführt. Indem man die Ausgänge von Speichergliedern zusammen mit zusätzlichen Eingabesignalen in einem Schaltnetz verknüpft und
dann dessen Ausgangsvektor wieder auf die Eingänge derselben Speicherglieder
zurückführt, erhält man ein Schaltwerk. Struktur und Verhalten von Schaltwerken kann man mit Hilfe endlicher Automaten modellieren. Neben der Analyse
und der Synthese von Schaltwerken werden in diesem Kapitel auch verschiedene
Arten der Implementierung vorgestellt.
3.1
Motivation
Bevor wir uns näher mit der Realisierung von Speichergliedern befassen, wollen
wir ein einfaches Beispiel für ein Schaltwerk betrachten, in dem Speicherglieder
verwendet werden. Dazu dient ein Vorwärtszähler, der eine Wortbreite von zwei
Bit haben soll. Wir gehen davon aus, dass nach dem Einschalten der Betriebsspannung beide Ausgänge der Speicherglieder den Wert 0 haben. Die beiden
Bits kann man zu einem Wort Q1 Q0 zusammenfassen, das einen stellengewichteten Wert darstellt. Ein Vorwärtszähler muss zu diesem Wert 1 addieren, um
den nachfolgenden Zählerstand zu ermitteln. Diese Addition erfolgt mit Hilfe
eines Addier-Schaltnetzes, das auch als Inkrementierer bezeichnet wird (siehe
Kap. 2).
Ausgehend vom Anfangszustand 00 durchläuft dann unser Schaltwerk die
Folgezustände 01, 10 und 11. Danach wechselt es wieder in den Anfangszustand
und beginnt von vorne. Es können also insgesamt vier verschiedene Zustände
angenommen werden und man bezeichnet ein solches Schaltwerk als Modulo-4Zähler.
Für den Modulo-4-Zähler benötigen wir zwei Speicherglieder, die man auch
Flipflops nennt. Ein Flipflop ist in der Lage, einen von zwei Zuständen einzunehmen. Damit die Zustandsübergänge bei allen Flipflops gleichzeitig ausgeführt werden, verfügen sie über einen Takteingang, der meist von einem zentralen Taktsignal angesteuert wird.
In Abb. 3.1 ist das Schaltbild unseres einfachen Schaltwerks dargestellt. Die
Schaltung stellt ein autonomes Schaltwerk dar, da keine externen Steuereingän-
3.2. Speicherglieder
83
ge vorhanden sind. Ein allgemeines Schaltwerk verfügt über solche Eingänge.
Mit einem externen Steuereingang X könnte man den Zähler z.B. zu einem
umschaltbaren Vor-/Rückwärtszähler erweitern.
Abbildung 3.1: Aufbau eines Modulo-4-Zählers.
Speicherglieder erlauben es also, Berechnungen in mehrere Schritte (Takte)
zu zerlegen, indem sie Ergebnisse eines Schritts speichern und diese Werte im
nächsten Schritt als Eingabe der nächsten Berechnung dienen.
Selbsttestaufgabe 3.1 (Vor-/Rückwärtszähler)
a) Ihnen steht ein Halbaddierer und ein Volladdierer zur Verfügung. Entwerfen
Sie damit das Inkrementier-Schaltnetz nach Abb. 3.1.
b) Ersetzen Sie das Inkrementier-Schaltnetz durch ein umschaltbares Inkrementier/Dekrementier-Schaltnetz, das über ein externes Steuersignal X umgeschaltet werden kann. Der Modulo-4-Zähler soll für X = 0 vorwärts und für
X = 1 rückwärts zählen.
Lösung auf Seite 107
3.2
Speicherglieder
In einem Schaltnetz kann kein Wert gespeichert werden. Sobald die Eingabewerte nicht mehr an den Eingängen des Schaltnetzes anliegen, ist auch (nach einer
Verzögerungszeit durch das Schaltnetz) die dazu passende Ausgabe nicht mehr
vorhanden. Es ist allerdings nicht schwer, einen solchen Speicher aus Gattern
zu bauen, wenn man eine der Eigenschaften von Schaltnetzen aufgibt, die Zyklusfreiheit. Hierzu betrachten wir zwei Inverter, die als Kreis geschaltet sind
(siehe Abbildung 3.2), d.h. der Ausgang des einen ist mit dem Eingang des
anderen verbunden und umgekehrt.
84
Kapitel 3. Schaltwerke
Abbildung 3.2: Zwei kreisförmig verschaltete Inverter
Wenn wir dafür sorgen, dass sich am Punkt Q eine Zeitlang der Wert 1 befindet, dann wird wegen x̄ = x nach einer kurzen Verzögerungszeit der Inverter
1 am Punkt Q0 den Wert 0 erzeugen, und der Inverter 2 wird nach einer weiteren kurzen Verzögerung am Punkt Q den Wert 1 erzeugen, womit eine stabile
Rückkopplung erzeugt ist. Der Wert 1 wird nun dauerhaft an Q anliegen, zumindest solange die Schaltung mit Energie versorgt wird. Man sagt, dass der
Wert Q = 1 gespeichert ist. Das gleiche gilt übrigens für den Wert 0, so dass wir
einen Speicher für einen boole’schen Wert, also das Ergebnis einer Berechnung
in einem Schaltnetz, gefunden haben. Man nennt eine solche Schaltung Latch
oder Flipflop.
Es bleibt aber noch zu klären, wie man einen Wert (1 oder 0) in die Schaltung einbringt. Hierzu überlegen wir uns, dass bei einem NOR-Gatter gilt:
x NOR 0 = x̄ ,
x NOR 1 = 0 .
(3.1)
(3.2)
Ersetzt man also die beiden Inverter in Abbildung 3.2 durch zwei NOR-Gatter
(siehe Abbildung 3.3), und setzt die beiden zusätzlichen Eingänge S und R auf
0, dann hat man wegen Gleichung (3.1) die gleiche Situation wie oben.
Abbildung 3.3: Zwei kreisförmig verschaltete NOR-Gatter
Setzt man den Eingang S für eine gewisse Zeit auf den Wert 1, dann geht der
Ausgang des NOR-Gatters 2 wegen Gleichung (3.2) auf 0, unabhängig davon,
welchen Wert der Ausgang des NOR-Gatters 1 dem weiteren Eingang des NORGatters 2 liefert. Beim NOR-Gatter 1 haben beide Eingänge den Wert 0, so dass
der Ausgang des NOR-Gatters 1 den Wert 1 annimmt. Dieser Ausgang bildet
den zweiten Eingang des NOR-Gatters 2. Setzt man dessen S-Eingang von 1
3.2. Speicherglieder
zurück auf 0, dann ändert sich an der Funktionsweise nichts, da 1 NOR 1 =
1 NOR 0 = 0. Damit hat man den obigen Zustand, bei dem dauerhaft am
Punkt Q eine 1 und am Punkt Q0 eine 0 vorliegt, erreicht.
Man nennt den Vorgang, das Signal S für mindestens die doppelte Verzögerungszeit eines NOR-Gatters auf 1 zu setzen, und dann wieder auf 0 zu setzen,
einen Setz-Vorgang. Das Signal S nennt man das Setz-Signal oder Set.
Genauso kann man durch eine 1 am Eingang R, die mindestens zwei NORVerzögerungszeiten anliegt und danach wieder zur 0 wechselt, erreichen, dass
dauerhaft eine 0 an Q und eine 1 an Q0 anliegt. Diesen Vorgang nennt man
Rücksetzen, das Signal R nennt man Rücksetz-Signal oder Reset.
Die gesamte Schaltung bezeichnet man als SR-Latch, manchmal auch RSLatch. Man benutzt dafür das Schaltsymbol in Abbildung 3.4.
Abbildung 3.4: Schaltsymbol des SR-Latch
Üblicherweise zeichnet man die beiden NOR-Gatter nicht mit Verbindungen
in Form eines Kreises, sondern in Form einer Acht wie in Abbildung 3.5 gezeigt.
Man nennt die Verschaltung kreuzweise Rückkopplung.
Abbildung 3.5: Zeichnung des SR-Latch mit kreuzweiser Rückkopplung
Wir haben bisher noch nicht betrachtet, was passiert, wenn man beide Eingänge R und S auf 1 setzt. Dies ist einfach zu beantworten: sowohl an Q als
auch an Q0 liegt eine 0 an. Dieses Verhalten ist der Grund, dass man Q0 statt Q̄
schreibt, denn ansonsten (s.o.) haben die beiden Ausgänge zueinander inverse
Werte.
Während diese Ausnahme nicht schlimm ist, kann es zu einem seltsamen
Verhalten kommen, wenn man beide Eingänge gleichzeitig auf den Wert 0 zurücksetzt. Wenn die beiden Gatter ungleiche Verzögerungszeiten haben, dann
kann das SR-Latch danach gesetzt oder rückgesetzt sein, es kommt darauf an
welches Gatter schneller schaltet. Schalten beide Gatter hingegen gleichschnell,
85
86
Kapitel 3. Schaltwerke
dann haben bei beiden Gattern gleichzeitig beide Eingänge den Wert 0, und
beide Gatter schalten gleichzeitig ihren Ausgang auf 1. Damit liegen an beiden Gattern gleichzeitig die Eingänge auf 0 und 1, so dass beide Gatter ihren
Ausgang gleichzeitig auf 0 schalten. Man sagt: das SR-Latch flimmert. Die
Frequenz dieser Schwingung wird durch die Verzögerungszeit der Gatter bestimmt, und kann mehrere Gigahertz betragen. Die Schwingung endet erst bei
einem erneuten Setzen bzw. Rücksetzen, oder wenn eines der Gatter durch
unterschiedliche Betriebsbedingungen (z.B. Temperatur) eine unterschiedliche
Verzögerungszeit aufweist. Wegen der Gefahr des Flimmerns nach dem Rückschalten von R = S = 1 auf R = S = 0 gilt das gleichzeitige Setzen und
Rücksetzen als verboten.
Selbsttestaufgabe 3.2 (NAND-SR-Latch)
Man kann das SR-Latch auch mittels zweier NAND-Gatter aufbauen. Welche
Zusatzschaltung muss man dann für die Signale R und S vorsehen, damit die
Funktionsweise identisch zu der des SR-Latch mit NOR-Gattern ist?
Lösung auf Seite 107
Wir werden uns bei den weiteren Speichern auf die Darstellung der Funktionsweise beschränken und auf die detaillierte Darstellung des inneren Aufbaus
verzichten, da Flipflops normalerweise nicht aus Gattern, sondern direkt aus
Transistoren auf Chipebene aufgebaut werden.
Eine Weiterentwicklung des SR-Latch ist das JK-Latch. Dieses hat statt der
Eingänge S und R die Eingänge J und K. Es verhält sich wie ein SR-Latch,
nur bei J = K = 1 wird der gespeicherte Wert invertiert (getoggelt).
Während wir bisher mittels Steuereingängen angegeben haben, welcher Wert
im Flipflop gespeichert werden soll, wollen wir doch eigentlich den Wert eines
Datensignals, nämlich des Ausgangs eines Schaltnetzes, im Flipflop speichern.
Deshalb gibt es das D-Flipflop.
Das D-Flipflop speichert den Wert, der am Dateneingang des D-Flipflops
anliegt, wenn das Taktsignal, auch Clock oder CK genannt, eine steigende Flanke hat.
Ein Taktsignal ist hierbei ein im Allgemeinen periodisches Signal, d.h. es
hat abwechselnd die Werte 0 und 1. Den Übergang von 0 nach 1 nennt man
steigende Flanke, den von 1 nach 0 fallende Flanke. Die Abstände zwischen
steigenden Flanken sind normalerweise gleichlang und heißen Taktperiode, das
Intervall zwischen zwei steigenden Flanken heißt Takt.
Intern berechnet das D-Flipflop aus dem Wert des Datensignals und der
steigenden Flanke ein Setz– bzw. Rücksetzsignal geeigneter Länge für ein innenliegendes SR-Latch.
Damit das D-Flipflop funktionieren kann (damit zum Beispiel das interne
Setzsignal lang genug ist), darf sich der Wert des Datensignals für je ein Zeitintervall vor und nach der steigenden Flanke nicht ändern. Diese Zeitintervalle
3.2. Speicherglieder
heißen Setz-Zeit (Setup-Time) und Halte-Zeit (Hold-Time), zusammen nennt
man sie das Wirkintervall.
Das Intervall, in dem ein neu eingespeichertes Datensignal frühestens oder
spätestens am Datenausgang des Flipflop erscheint, heißt Kippintervall. Es handelt sich um ein Intervall, da die Verzögerung von der steigenden Taktflanke
zur Ausgabe je nach dem gespeicherten Wert (0 oder 1) unterschiedlich sein
kann, auch kann die Temperatur die Schaltgeschwindigkeit beeinflussen.
Abbildung 3.6 zeigt schematisch den zeitlichen Verlauf bei einem Taktsignal
CK, einem Dateneingang D und einem Datenausgang Q eines D-Flipflops, sowie
die Kipp– und Wirkintervalle. Wie groß Wirkintervall und Kippintervall genau
sind, und wie sie relativ zur steigenden Taktflanke liegen, hängt von der internen
Struktur eines Flipflops ab. Weiterhin zeigt die Abbildung das Schaltsymbols
des D-Flipflops.
Abbildung 3.6: Zeitverhalten und Schaltsymbol des D-Flipflops
Flipflops, bei denen sich Wirk– und Kippintervall nicht überlappen, heißen Master-Slave-Flipflops oder MS-Flipflops, da sie intern in der Regel aus
zwei hintereinandergeschalteten Latches mit zeitlich verschobenen Steuersignalen realisiert sind. Diese Eigenschaft ist wichtig, damit bei der Verwendung im
Schaltwerk Ausgangssignale des MS-Flipflops nicht über das Schaltnetz so auf
den Eingang rückgekoppelt werden, dass eine Änderung des Ausgangs (im Kippintervall) zu einer Änderung des Eingangs während des Wirkintervalls führt.
Dies würde nämlich verhindern, dass ein Wert zuverlässig im Flipflop gespeichert werden kann.
Wir werden im weiteren davon ausgehen, dass die Taktperiode eines Schaltnetzes stets lang genug ist, damit trotz der Verzögerung durch das Schaltnetz
das Wirkintervall des Speicherglieds respektiert wird.
Verbindet man mehrere D-Flipflops mit einem gemeinsamen Taktsignal, so
erhält man ein sogenanntes Register. Abbildung 3.7 zeigt ein 4-Bit-Register.
Neben dem Takteingang gibt es einen Load-Eingang, dessen Wert bei der steigenden Taktflanke angibt, ob tatsächlich gespeichert werden soll (bei Wert 1)
oder nicht (bei Wert 0). So kann in Schaltwerken bei Registern in manchen
Takten die Taktung ausgeblendet werden, so dass der gegenwärtige Inhalt noch
einen weiteren Takt bestehen bleibt.
87
88
Kapitel 3. Schaltwerke
Abbildung 3.7: Schaltbild eines ladbaren 4-Bit-Registers.
Schieberegister sind Register, die neben dem Takteingang ein Steuersignal
besitzen, mit dem entschieden wird, ob bei der steigenden Taktflanke ein neuer
Wert von den Eingängen geladen“ wird (bei Wert 1), oder ob (bei Wert 0)
”
die Inhalte von Bit i zu Bit i + 1 geschoben werden, sowie ein neuer Wert bei
D0 eingespeichert und der Inhalt des obersten Bits bei Qn−1 ausgegeben und
danach überschrieben wird. Genau wie Schieberegister mit linksschieben“ gibt
”
es auch Schieberegister mit rechtsschieben“, bei denen Bit i nach Bit i − 1
”
verschoben wird.
Selbsttestaufgabe 3.3 (Steuerbares Schieberegister)
Entwerfen Sie ein 3-Bit-Schieberegister, das folgende vier Funktionen ausführt:
S1
0
0
1
1
S0
0
1
0
1
Funktion
Rechtsschieben
Löschen
Parallel laden
Linksschieben
Hinweis: Verwenden Sie zum Entwurf 4:1-Multiplexer und D-Flipflops.
Lösung auf Seite 108
3.3
Automatenmodelle für Schaltwerke
Wenn das Ausgabeverhalten einer Digitalschaltung nicht nur von ihrer momentanen Eingabe abhängt, sondern auch auf vorhergehende Eingaben reagieren
soll, müssen wir sie als Schaltwerk implementieren. Zur abstrakten Darstellung
des Verhaltens verwendet man das Modell eines endlichen Automaten. Dabei
kann man zwei Automatentypen unterscheiden: Mealy- und Moore-Automaten.
Ein Automat ist ein Modell für ein diskretes, zeitveränderliches System.
Automaten können formal durch ein 6-Tupel beschrieben werden:
< I, S, O, s0 , f, g >
(3.3)
3.3. Automatenmodelle für Schaltwerke
89
Darin bezeichnen
• I die Menge der möglichen Eingabezeichen (Eingabealphabet),
• S die Menge der Zustände,
• O die Menge der möglichen Ausgabezeichen (Ausgabealphabet),
• s0 den Startzustand,
• g die Übergangsfunktion und
• f die Ausgangsfunktion.
Wenn die Mengen I, S und O endlich sind, so spricht man von einem endlichen Automaten (Finite State Maschine, FSM).
Finite State Maschine
Für jedes Paar aus einem Zustand und einem Eingabezeichen liefert die
Übergangsfunktion g einen eindeutig bestimmten Folgezustand:
g :S×I →S
(3.4)
Die Ausgabezeichen werden durch die Funktion f bestimmt. Für diese Funktion gibt es zwei verschiedene Definitionen. Die erste Möglichkeit besteht darin,
die Ausgabezeichen lediglich aus dem augenblicklichen Zustand abzuleiten:
f :S→O
(3.5)
Diese Variante wird als zustandsbasierter endlicher Automat oder MooreAutomat bezeichnet.
Moore-Automat
Eine andere Möglichkeit zur Definition von f besteht darin, zusätzlich das
aktuelle Eingabezeichen einzubeziehen. Man bezeichnet diese Variante als übergangsbasierter endlicher Automat oder Mealy-Automat. In diesem Fall gilt:
Mealy-Automat
f :S×I →O
(3.6)
Wenn die Elemente von I, S und O aus binären Zeichenketten bestehen, so
stellen die Funktionen f und g Boole’sche Funktionen dar. Sie können daher
durch Schaltnetze implementiert werden. Zur Speicherung der Zustände können
Flipflops bzw. Register mit geeignetem Zeitverhalten benutzt werden.
Wenn der Eingabevektor X eines Schaltwerks aus m Elementen besteht,
d.h. X = (xm−1 , . . . , x1 , x0 ), so ergibt sich die Menge I der Eingabezeichen
90
Kapitel 3. Schaltwerke
aus dem kartesischen Produkt der einzelnen Signalmengen. Im Falle binärer
Eingaben gilt also
I = {0, 1}m
(3.7)
Ähnlich erhalten wir die beiden anderen Mengen für ein Schaltwerk mit
einem k Bit langen Zustandsvektor bzw. -register Z = (zk−1 , . . . , z0 ) und einem
n-dimensionalen Ausgangsvektor Y = (yn−1 , . . . , y0 ). Im Falle binärer Signale
gilt:
S = {0, 1}k
O = {0, 1}n
Vollständigkeit
(3.8)
(3.9)
Ein Automat heißt vollständig, wenn für jeden Zustand und alle möglichen
Eingaben Zustandsübergänge (Kanten) spezifiziert sind. Eine Kante kann auch
durch eine ODER-Verknüpfung zweier oder mehrerer möglicher Eingaben markiert sein.
Widerspruchsfreiheit Ein Automat heißt widerspruchsfrei , wenn für jeden Zustand und alle möglichen Eingaben jeweils ein eindeutiger Folgezustand bestimmt ist, d.h. wenn g
tatsächlich eine Funktion ist1 . Für den Zustandsgraphen bedeutet dies, dass es
für jede mögliche Eingabe nur eine einzige auslaufende Kante aus einem Knoten
(Zustand) gibt.
Der Aufbau eines synchronen Schaltwerks nach den beiden oben beschriebenen Automatenmodellen ist in Abb. 3.8 dargestellt. Um eine korrekte Arbeitsweise des Schaltwerks zu gewährleisten, muss der Folgezustand Z t+1 stets durch
nicht-transparente Speicherglieder (z.B. Register mit Master-Slave-Flipflops)
vom aktuellen Z t entkoppelt sein. Dies wird durch die verschieden schraffierten
Bereiche des Registers angedeutet.
g
Register
xt
z t+1
f
yt
Takt
zt
Abbildung 3.8: Aufbau eines Mealy-Schaltwerks. Wenn die gestrichelte Verbindung weggelassen wird, erhalten wir ein Moore-Schaltwerk.
1
Da g in Def. 3.3 als Funktion definiert wurde, kann es eigentlich nur widerspruchsfreie
Automaten geben. Da in der Praxis aber Übergänge oft im Zustandsgraph spezifiziert werden,
kann es vorkommen, dass g eine Relation aber keine Funktion ist. Statt zu sagen, dies ist
kein Automat, sagt man, der Automat ist nicht widerspruchsfrei.
3.3. Automatenmodelle für Schaltwerke
3.3.1
91
Darstellungsformen
Es gibt im Wesentlichen zwei Möglichkeiten, um das Verhalten eines Schaltwerkes darzustellen:
• Zustandstabellen (oder Zustandsdiagramme) und
• Zustandsgraphen.
Die Zustandstabelle enthält pro Zeile als Eingangsvariablen die Komponenten
des Eingabevektors X t und die Komponenten des Zustandsvektors Z t , als Ausgangsvariablen die Komponenten des Ausgabevektors Y t und die Komponenten
des Folgezustandsvektors Z t+1 .
Ausgangsvariablen
Eingangsvariablen
t
zk−1
···
z0t
xtm−1
···
xt0
t+1
zk−1
···
z0t+1
t
yn−1
···
y0t
Die Werte der Ausgangsvariablen werden durch ein Schaltnetz aus den Werten
der Eingangsvariablen gebildet. Für jede Ausgangsvariable kann eine minimierte Schaltfunktion in der DNF oder KNF bestimmt werden.
Ein Zustandsgraph beschreibt das Verhalten eines Schaltwerks in graphischer Darstellung. Er besteht aus Knoten und Kanten. Die Knoten werden als
Kreise gezeichnet und stellen die inneren Zustände des Schaltwerks dar. Die
Kanten werden als gerichtete Verbindungen zwischen den Knoten gezeichnet
und stellen die Übergänge zwischen Zuständen dar (Abb. 3.9).
Kanten
zi
zj
Zustand i
Zustand j
Knoten
Abbildung 3.9: Grundform eines Zustandsgraphen.
Die Knoten (Kreise) enthalten die Zustandsnamen oder die zugehörigen
Kombinationen der Zustandsvariablen. An die Kanten wird die Belegung des
Eingabevektors geschrieben, die das Schaltwerk vom gegenwärtigen zum Folgezustand überführt. Beim Mealy-Automaten schreibt man zusätzlich hinter
92
Kapitel 3. Schaltwerke
die Eingabekombination die zum gegenwärtigen Zustand gehörige Belegung
des Ausgabevektors. Beim Moore-Automaten ist der Ausgabevektor eindeutig
durch den momentanen Zustand (Knoten) bestimmt. Daher müssen die Ausgaben an allen von diesem Knoten ausgehenden Übergangskanten gleich sein.
Alternativ schreibt man beim Moore-Automaten die Ausgabe deshalb auch
unterhalb des Zustandsnamens in den Zustand und nicht an die Kanten.
Der Übergang zum Folgezustand ist zwar taktabhängig, jedoch wird der
Takteingang nicht angegeben, da er kein Informationsträger ist. Eine auf den
Ausgangsknoten zurückführende Kante gibt an, dass bei dieser Belegung des
Eingabevektors keine Zustandsänderung auftritt.
Hat der Zustandsvektor eines Schaltwerkes k Variablen, dann hat der entsprechende Zustandsgraph höchstens 2k Knoten. Bei einem Eingabevektor mit
m Variablen können maximal 2m Kanten (Verzweigungen) von jedem Knoten
ausgehen.
3.3.2
Äquivalenz zwischen Mealy- und Moore-Automaten
Die beiden oben beschriebenen Automatenmodelle können so ineinander überführt werden, dass sie ein äquivalentes Ein-/Ausgabeverhalten aufweisen. Wir
beginnen mit dem aufwändigeren Fall: der Überführung eines Mealy-Automaten
in einen äquivalenten Moore-Automaten. Hier müssen wir dem äquivalenten
Moore-Automaten zugestehen, dass im Vergleich zum Mealy-Automaten alle
Ausgaben einen Takt verzögert erfolgen, und dass die Ausgabe im Startzustand nicht gewertet wird. Diese Einschränkung lässt sich nicht umgehen, da
im Mealy-Automat die Ausgabe im ersten Takt vom Startzustand und von der
Eingabe abhängig ist, während im Moore-Automat die Ausgabe im ersten Takt
nur vom Startzustand abhängig ist, und die Eingabe während des ersten Taktes nur den Folgezustand beeinflussen kann, und so erst im folgenden Takt auf
die Ausgabe wirken kann.
Bei der Transformation betrachten wir für jeden Knoten v des MealyAutomaten die eingehenden Kanten. Sind diese alle mit dem gleichen Ausgabevektor Y markiert, so wird im Moore-Automat der Knoten v mit dem
Ausgabevektor Y markiert. Gibt es auf den eingehenden Kanten verschiedene
Markierungen mit Ausgabevektoren Y1 , . . . , Yk , so werden im Moore-Automat
die Knoten v1 bis vk geschaffen, die mit den Ausgabevektoren Y1 bis Yk markiert
werden, und als eingehende Kante jeweils die erhalten, die im Mealy-Automat
mit dem betreffenden Ausgabevektor markiert war.
Abb. 3.10 zeigt ein Beispiel für die Transformation eines Mealy-Automaten.
Wir erkennen, dass der im linken oberen Teil dargestellte Mealy-Automat für
den Zustand 1 unterschiedlich markierte einlaufende Kanten aufweist. Daher
muss der Zustand 1 in zwei Zustände 10 und 11 aufgespalten werden. Über die in
Abb. 3.10 rechts oben dargestellte Zwischenstufe ist dann wieder eine einfache
Transformation zu einem äquivalenten Moore-Automaten möglich (Abb. 3.10
unten). Dabei kann, wie oben schon beschrieben, der Ausgabevektor im Zustand
3.3. Automatenmodelle für Schaltwerke
93
0 beliebig gewählt werden, da er ignoriert wird.
Abbildung 3.10: Umwandlung eines Mealy- in einen äquivalenten MooreAutomaten durch Einfügen zusätzlicher Zustände.
Bei der Überführung eines Moore-Automaten in einen äquivalenten MealyAutomaten müssen wir prinzipiell nichts tun, da ein Moore-Automat auch als
Mealy-Automat betrachtet werden kann, bei dem die Ausgangsfunktion f nicht
von ihrem zweiten Argument, dem Eingabevektor, abhängt. In der Darstellung
als Graph müsste man dann nur die Ausgabemarkierung jedes Zustands v als
Ausgabemarkierung auf alle von v ausgehenden Kanten übertragen. Um eine
Symmetrie zum Vorgehen bei der Transformation eines Mealy-Automaten in
einen Moore-Automaten zu erhalten, kann man allerdings auch die Ausgabemarkierung jedes Zustands auf die einlaufenden Kanten übertragen. Dann entfällt die Ausgabe des Startzustands und alle Ausgaben des Mealy-Automaten
erfolgen einen Takt früher als im Moore-Automaten.
Wir wollen dies an einem Beispiel demonstrieren. In der Abb. 3.11 sehen
wir auf der linken Seite den Zustandsgraphen eines Moore-Automaten. Zur
Umwandlung in einen äquivalenten Mealy-Automaten müssen die Ausgaben
aus den einzelnen Zuständen auf die einlaufenden Kanten übertragen werden.
Das Ergebnis der Umwandlung ist im rechten Teil von Abb. 3.11 zu sehen.
Selbsttestaufgabe 3.4 (Äquivalente Automaten)
Transformieren Sie den Mealy-Automaten mit dem Zustandsgraph aus Abb. 3.12
in einen äquivalenten Moore-Automaten.
Lösung auf Seite 108
94
Kapitel 3. Schaltwerke
Abbildung 3.11: Umwandlung eines Moore- in einen äquivalenten MealyAutomaten.
1/1
0/0
0
1
0/0
1/0
Abbildung 3.12: Zu transformierender Mealy-Automat
3.4
Analyse von Schaltwerken
Im Folgenden gehen wir davon aus, dass der Schaltplan eines Schaltwerks vorgegeben ist und wir die Aufgabe haben, sein Schaltverhalten zu analysieren.
Hierzu müssen wir zunächst die Übergangsfunktion g und die Ausgangsfunktion f anhand der vorgegebenen (Rückkopplungs-)Schaltnetze herleiten. Dann
wird ein Anfangszustand Z0 angenommen und mit den möglichen Werten der
Eingabevariablen und der Übergangsfunktion werden die erreichbaren Folgezustände bestimmt. Zusammen mit der Ausgangsfunktion können auf diese Weise
die Zeilen der Zustandstabelle erstellt werden. Mit Hilfe der vollständigen Zustandstabelle kann schließlich der Zustandsgraph gezeichnet werden, der das
Verhalten des Schaltwerks anschaulich darstellt.
Wir erläutern die Vorgehensweise anhand eines Schaltwerks, das aus (MasterSlave-)D-Flipflops nach Abb. 3.13 aufgebaut ist2 . Zunächst einige allgemeine
Bemerkungen zur Charakterisierung dieses Schaltwerks: Es handelt sich um
ein synchron angesteuertes Schaltwerk. Der Eingabevektor X und der Ausgangsvektor Y bestehen aus je einer Variablen. Das Schaltwerk enthält zwei
D-Flipflops als Speicherglieder, es hat also zwei Zustandsvariablen und kann
daher maximal vier Zustände einnehmen. Die Komponenten z0+ und z1+ des Folgezustandsvektors Z t+1 werden durch ein Schaltnetz aus dem Eingabevektor X
und aus den Komponenten z0 und z1 des Zustandsvektors Z zum Zeitpunkt t
gebildet. Der Ausgangsvektor Y wird aus dem Eingabevektor X und den Komponenten des Zustandsvektors Z gebildet. Daraus folgt, dass das Schaltwerk
einen Mealy-Automaten darstellt.
Aus der allgemeinen Charakterisierung ergibt sich eine erste Beschreibung
des Schaltwerks durch Schaltfunktionen. Die Analyse des Schaltnetzes liefert
die Komponenten des Folgezustandsvektors:
2
Der Einfachheit halber markieren wir im Folgenden die Komponenten des Folgezustandsvektors mit einem hochgestellten +“-Zeichen.
”
3.4. Analyse von Schaltwerken
95
1
x
&
&
&
&
_1
>
z1
z1
z0
z0
&
&
_1
>
1D
C1
&
_1
>
y
z +1
z 0+
1D
C1
C
Abbildung 3.13: Schaltwerk mit D-Flipflops.
z0+ = (z 0 ∧ x) ∨ (z 1 ∧ x)
z1+ = (z0 ∧ z 1 ) ∨ (z0 ∧ x) ∨ (z 0 ∧ z1 ∧ x)
(3.10)
(3.11)
Für den Ausgangsvektor Y ergibt sich:
y = (z0 ∧ z1 ∧ x) ∨ (z 0 ∧ z1 ∧ x)
(3.12)
Beim Übergang vom Zeitpunkt t zu t + 1 wird der Folgezustandsvektor zum
neuen Zustandsvektor Z(t) := Z(t + 1). Mit dieser Zuweisung und den Schaltfunktionen nach (3.10) und (3.11) kann die Zustandstabelle erstellt werden. Wir
gehen von einem Anfangszustand z0 = 0, z1 = 0 aus, d.h. die beiden Flipflops
sollen beim Einschalten der Betriebsspannung zurückgesetzt werden. Die Eingangsvariable soll zuerst den Wert x = 0 haben. Mit (3.10) folgt z0+ = 1, mit
(3.11) folgt z1+ = 0 und mit (3.12) folgt y = 0. Es ergibt sich die Zustandstabelle
3.1.
Mit der Zustandstabelle kann der Zustandsgraph gezeichnet werden (Abb. 3.14).
96
Kapitel 3. Schaltwerke
z1
0
0
0
0
1
1
1
1
z0
0
0
1
1
0
0
1
1
x
0
1
0
1
0
1
0
1
z1+
0
0
1
1
1
0
0
1
z0+
1
1
0
1
1
0
0
0
y
0
0
0
0
0
1
1
0
Tabelle 3.1: Zustandstabelle für das Schaltwerk mit D-Flipflops.
0/0
Start
00
01
1/0
1/0
0/1
0/0
1/1
1/0
11
0/0
10
Abbildung 3.14: Zustandsgraph für das Schaltwerk mit D-Flipflops.
Selbsttestaufgabe 3.5 (2-Bit-Synchronzähler)
Analysieren Sie den Synchronzähler aus Abb. 3.15.
Abbildung 3.15: Synchronzähler mit zwei Ausgängen.
3.5. Synthese von Schaltwerken
97
a) Bestimmen Sie, ausgehend vom Startzustand Q3 Q2 Q1 Q0 = 0001, den Zählzyklus für X = 1 und für X = 0 und erstellen Sie die Zustandstabelle!
b) Zeichnen Sie den Zustandsgraphen!
Lösung auf Seite 109
3.5
Synthese von Schaltwerken
Bei der Synthese wird aus einer (häufig verbal) gegebenen Aufgabenstellung
ein Schaltwerk entworfen. Dazu ist es notwendig, die Aufgabenstellung mit den
Beschreibungsmöglichkeiten eines Schaltwerks darzustellen. Es empfehlen sich
folgende Schritte für das Vorgehen:
• Festlegen der Zustandsmenge, die das Schaltwerk einnehmen soll. Daraus
ergibt sich die Anzahl der Zustandsvariablen und die Anzahl der erforderlichen Speicherglieder.
• Festlegen des Anfangszustandes. Hier wird meist der Nullvektor angenommen, der durch die Rücksetzeingänge der Flipflops beim Einschalten
der Betriebsspannung erzwungen werden kann.
• Definition der Eingangs- und Ausgangsvariablen.
• Darstellung der zeitlichen Zustandsfolge in Form eines Zustandsgraphen.
• Aufstellen der Zustandstabelle.
• Herleitung und Minimierung der Übergangs- und Ausgangsfunktion in
DNF bzw. KNF aus der Zustandstabelle.
• Darstellung des Schaltwerks in einem Schaltplan. Das bedeutet: Übertragen der Schaltfunktionen in ein Schaltnetz, Verbindungen mit den Flipflops herstellen, Kennzeichnen des Zustandsvektors und des Folgezustandsvektors.
• Implementierung des Schaltwerks.
3.5.1
Umschaltbarer Gray-Code-Zähler
Als Beispiel wollen wir einen zweistelligen, umschaltbaren Gray-Code-Zähler
auf Basis von D-Flipflops entwerfen. Kennzeichen des Gray-Codes ist es, dass
sich zwischen zwei aufeinander folgenden Codewörtern stets nur eine Bitstelle
ändert. Die Umschaltung soll durch eine Eingangsvariable x erfolgen. Für x = 0
ist die Zählfolge
00, 01, 11, 10, 00 usw.
98
Kapitel 3. Schaltwerke
und für x = 1 ist die Zählfolge
00, 10, 11, 01, 00 usw.
festgelegt.
• Zuerst ermitteln wir die Anzahl der nötigen Zustände. Da es insgesamt
vier verschiedene Codewörter gibt, sind genauso viele Zustände erforderlich. Zur Codierung dieser vier Zustände reichen zwei Zustandsvariablen
aus, die in zwei D-Flipflops gespeichert werden.
• Das Schaltwerk beginnt mit dem Anfangszustand Z(0) = 00.
• Die Umschaltung erfolgt durch die Eingangsvariable x. Die Ausgangsvariablen sind identisch mit den Zustandsvariablen, weil der Zählzustand
angezeigt werden soll. Wir können also auf ein Ausgangsschaltnetz f verzichten.
• Die zeitliche Zustandsfolge, die sich aus der obigen Beschreibung und den
Festlegungen ergibt, ist in Abb. 3.16 dargestellt.
1
00
00
10
10
0
1
0
1
0
0
01
01
11
11
1
Abbildung 3.16: Zustandsgraph des umschaltbaren Gray-Code-Zählers.
• Zustandstabelle
Aus dem Zustandsgraphen folgt unmittelbar die Zustandstabelle 3.2. Die
linke Seite der Tabelle enthält alle Wertekombinationen, die die Eingangsvariable x und die Zustandsvariablen z1 , z0 annehmen können. Die rechte
Seite der Tabelle enthält die Werte der Folgezustände.
• Schaltfunktionen (Übergangsfunktionen)
Aus der Zustandstabelle können wir die Übergangsfunktionen in der DF
aufstellen:
z1+ = (z0 ∧ x) ∨ (z 0 ∧ x)
z0+ = (z 1 ∧ x) ∨ (z1 ∧ x)
(3.13)
(3.14)
3.5. Synthese von Schaltwerken
z1
0
0
0
0
1
1
1
1
99
z0
0
0
1
1
0
0
1
1
z1+
0
1
1
0
0
1
1
0
x
0
1
0
1
0
1
0
1
z0+
1
0
1
0
0
1
0
1
Tabelle 3.2: Zustandstabelle für den umschaltbaren Gray-Code-Zähler.
Die beiden Schaltfunktionen können nicht weiter mit Karnaugh-Diagrammen (vgl. Kapitel 2) minimiert werden. z1+ entspricht der EXOR-Funktion
und z0+ der negierten EXOR-Funktion (Äquivalenz-Funktion).
• Zeichnen des Schaltwerkes (Abb. 3.17).
1
x
&
&
_1
>
z1
z1
z0
z0
&
&
_1
>
z +1
1D
C1
z 0+
1D
C1
C
Abbildung 3.17: Schaltplan des umschaltbaren Gray-Code-Zählers.
100
Kapitel 3. Schaltwerke
Selbsttestaufgabe 3.6 (3-Bit-Zähler)
Entwerfen Sie einen 3-Bit-Synchronzähler mit folgender Zählfolge:
0 − 1 − 3 − 7 − 6 − 5 − 0 − ···
Erstellen Sie hierzu:
• den Zustandsgraph,
• die Zustandstabelle,
• die minimierten Funktionsgleichungen und
• das Schaltbild des Schaltwerks.
Lösung auf Seite 110
3.5.2
Zustands-Minimierung
Werden zwei Schaltwerke durch die gleiche Folge von Eingabevektoren angesteuert und liefern sie die gleiche Folge von Ausgangsvektoren, so sind sie bezüglich ihres Verhaltens äquivalent. Es kann aber durchaus sein, dass sie intern
ganz anders arbeiten bzw. über eine unterschiedliche Zahl von Zuständen verfügen. Häufig enthalten die aus einer textuellen Beschreibung abgeleiteten Zustandsgraphen redundante Zustände. Um den Entwurfs- und Hardwareaufwand
zu minimieren, sollte man daher die Anzahl der Zustände im Zustandsgraphen
redundante Zustände
minimieren.
Um redundante Zustände zu erkennen, muss man die Äquivalenz zweier
bzw. mehrerer Zustände prüfen.
Zwei Zustände zi und zj sind äquivalent (zi ≡ zj ), wenn sie das gleiche
Ausgabeverhalten haben und – für alle Eingabevektoren – äquivalente Folgezustände einnehmen. Wir können folgende Äquivalenzrelation ≡“ definieren:
”
zi ≡ zj ⇔ ∀x(f (x, zi ) = f (x, zj )) und
∀x(g(x, zi ) ≡ g(x, zj )) d.h. ∀x(zi+ ≡ zj+ )
x∈I
(3.15)
(3.16)
Wenn eine der Bedingungen (3.15) oder (3.16) nicht erfüllt ist, folgt, dass
die Zustände zi und zj nicht äquivalent sind (zi 6≡ zj ). Die Bedingung in Gleichung (3.16) macht die Definition der Zustandsäquivalenz rekursiv, ohne dass
man ein Rekursionsende sieht. Zum Verständnis ist es hilfreich, das Gegenteil
zu betrachten: Zwei Zustände sind nicht äquivalent, wenn es eine natürliche
3.5. Synthese von Schaltwerken
101
Zahl r gibt, so dass nach r-facher Anwendung von Gleichung (3.16) eine NichtÄquivalenz durch Verletzung von (3.15) auftritt. Gibt es ein solches r nicht,
dann sind die Zustände äquivalent. Wegen der endlichen Zahl s = |S| von
Zuständen kann man sich auf r ≤ s(s − 1)/2 einschränken.
Aus der Definition der Zustandsäquivalenz können wir ein einfaches Ausschluss-Verfahren zur Zustands-Minimierung ableiten.
Zu Beginn erstellen wir eine Liste sämtlicher Zustandspaare, die (3.15) erfüllen. Für jedes Paar ermitteln wir alle Folge-Zustandspaare (g(x, zi ), g(x, zj ))
und tragen diese hinter dem zugehörigen Ausgangs-Zustandspaar ein.
Wegen der Symmetrie-Eigenschaft der Äquivalenzrelation (aus zi ≡ zj folgt
zj ≡ zi ) müssen nur die Zustandspaare mit i < j für i, j = 1, · · · , n betrachtet
werden.
Außerdem müssen nur Folge-Zustandspaare aufgenommen werden, die sich
vom Ausgangs-Zustandspaar unterscheiden. Als nächstes wird überprüft, ob
die eingetragenen Folge-Zustandspaare die Bedingung (3.15) der Äquivalenzrelation erfüllen. Wenn ein Folge-Zustandspaar nicht als Ausgangs-Zustandspaar
vorkommt, ist es zu streichen. Gleichzeitig impliziert die Streichung eines FolgeZustandspaares, dass auch das zugehörige Ausgangs-Zustandspaar nicht äquivalent sein kann und ebenfalls zu streichen ist.
Kennt man die Menge der äquivalenten Zustandspaare, so kann man mit
der Transitivitäts-Eigenschaft eventuell neue Zustandspaare bestimmen. Wenn
beispielsweise die Zustands-Paare (zi ,zj ) und (zj ,zk ) äquivalent sind, so ist auch
das Zustandspaar (zi ,zk ) äquivalent und die drei Zustände bilden eine Äquivalenzklasse. Alle Zustände einer Äquivalenzklasse können durch einen einzigen Äquivalenzklasse
Zustand ersetzt werden.
Im Folgenden soll die Anwendung des gerade beschriebenen Verfahrens an
einem Beispiel demonstriert werden. Das Schaltwerksverhalten sei durch die in
Tabelle 3.3 gegebene Zustandstabelle gegeben. Es handelt sich um ein MooreSchaltwerk mit einem Ein- und einem Ausgang.
Tabelle 3.3: Zustandstabelle für das Beispiel zur Zustands-Minimierung.
Zustand
1
2
3
4
5
6
7
8
Folge-Zustand für
X=0
X=1
4
3
6
8
5
4
1
5
3
1
6
2
2
8
3
7
Ausgang
0
0
1
0
1
1
0
1
102
Kapitel 3. Schaltwerke
In Tabelle 3.4 sind drei Stufen zur Bestimmung der Äquivalenzklassen dargestellt. In Stufe 0 werden zunächst die Ausgangs-Zustandspaare ermittelt.
Dann werden hinter jedes Ausgangs-Zustandspaar die entsprechenden FolgeZustandspaare geschrieben. In Stufe 1 wird von oben nach unten geprüft, ob
die rechts stehenden Folge-Zustandspaare auch als Ausgangs-Zustandspaare
vorhanden sind. Wenn dies nicht der Fall ist, werden die betreffenden FolgeZustandspaare und Ausgangs-Zustandspaare gestrichen. Bei der Stufe 1 wurden
bereits Streichungen aus vorangehenden Zeilen berücksichtigt. So erfolgt z.B. in
Zeile 9 und 10 die Streichung des Folge-Zustandspaars (1,2). In Stufe 2 verfährt
man in gleicher Weise und stellt dann fest, dass bei einem weiteren Durchlauf
keine Streichungen mehr möglich sind.
Tabelle 3.4: Ermittlung der Äquivalenzklassen.
(1,2)
(1,4)
(1,7)
(2,4)
(2,7)
(3,5)
(3,6)
(3,8)
(4,7)
(5,6)
(5,8)
(6,8)
Stufe 0
(4,6) (3,8)
(3,5)
(2,4) (3,8)
(1,6) (5,8)
(2,6)
(1,4)
(5,6) (2,4)
(3,5) (4,7)
(1,2) (5,8)
(1,2) (3,6)
(1,7)
(3,6) (2,7)
(1,2)
(1,4)
(1,7)
(2,4)
(2,7)
(3,5)
(3,6)
(3,8)
(4,7)
(5,6)
(5,8)
(6,8)
Stufe 1
(4,6) (3,8)
(3,5)
(2,4) (3,8)
(1,6) (5,8)
(2,6)
(1,4)
(5,6) (2,4)
(3,5) (4,7)
(1,2) (5,8)
(1,2) (3,6)
(1,7)
(3,6) (2,7)
(1,2)
(1,4)
(1,7)
(2,4)
(2,7)
(3,5)
(3,6)
(3,8)
(4,7)
(5,6)
(5,8)
(6,8)
Stufe 2
(4,6) (3,8)
(3,5)
(2,4) (3,8)
(1,6) (5,8)
(2,6)
(1,4)
(5,6) (2,4)
(3,5) (4,7)
(1,2) (5,8)
(1,2) (3,6)
(1,7)
(3,6) (2,7)
Aus der Stufe 2 der Tabelle 3.4 können wir ablesen, dass die beiden Zustandspaare (1,4) und (3,5) äquivalent sind. Wir können daher pro äquivalentes Zustandspaar je einen Zustand (z.B. die Zustände 4 und 5) mit dem jeweils
anderen Zustand vereinigen. Man beachte, dass die verbleibenden Zustände (1
und 3) wechselseitig Folgezustände voneinander sind.
Selbsttestaufgabe 3.7 (Benötigte Zustände ermitteln)
Eine Zustands-Minimierung ergab, dass die ursprünglich betrachteten acht
Zustände (1 bis 8) folgende äquivalente Zustandspaare enthalten: (1,3), (1,6),
(3,6), (4,5), (4,7) und (5,7). Wie viele Zustände werden insgesamt noch benötigt?
Lösung auf Seite 112
3.5. Synthese von Schaltwerken
Nachdem wir die minimale Zahl der Zustände ermittelt haben, stellen sich
folgende Fragen: Wie viele Bits (Flipflops) werden zu deren Codierung benötigt? Welche Codewörter sollen den jeweiligen Zuständen zugeordnet werden?
3.5.3
Zustands-Codierung
Nehmen wir an, dass nach der Zustandsminimierung n Zustände übrig bleiben.
Wir betrachten zwei Möglichkeiten der Codierung: unär und binär.
Hot-one-Codierung
Bei der unären oder Hot-One-Codierung gibt es pro Zustand ein Flipflop. Der
Zustand i wird dadurch repräsentiert, dass Bit i den Wert 1 hat und alle anderen
Bits den Wert 0. Beispielsweise ist bei n = 4 der Zustand 2 durch 0100 codiert.
Offensichtlich ist durch die Symmetrie ohne Belang, welcher Zustand welches Codewort erhält. Der Zustand des Schaltwerks entspricht dem gesetzten
Flipflop. Für Moore-Automaten kann das Ausgangsschaltnetz durch diese Art
der Zustandscodierung sehr einfach entworfen werden. Es besteht pro Ausgangsvariable aus einem OR-Schaltglied, dessen Eingänge mit allen Zuständen
(d.h. Flipflop-Ausgängen) verbunden sind, bei denen diese Ausgangsvariable
den Wert 1 liefern soll. Für Mealy-Automaten ist die Ansteuerung des ORSchaltglieds deutlich komplizierter. Sie erfolgt durch die AND-Verknüpfung
mit einem Vorgängerzustand und der Decodierung des für eine 1-Ausgabe zugeordneten Eingangsvektors. Die benötigten Schaltfunktionen können sehr gut
mit programmierbaren Logikbausteinen implementiert werden (vgl. Abschnitt
3.6.1).
Bei Verwendung von D-Flipflops kann auch die Übergangsfunktion sehr
einfach bestimmt werden. Jeder Knoten des Zustandsgraphen ist genau einem
Flipflop zugeordnet. Die Schaltfunktion des zugehörigen D-Eingangs ergibt sich
aus einer OR-Verknüpfung von Konjunktionstermen, die jeweils einer einlaufenden Kante in diesen Knoten entsprechen. Mit jedem dieser Konjunktionsterme
wird eine Bedingung für das Aktivieren des Zustands geprüft. Diese Bedingung
enthält einerseits den vorausgehenden Zustand (Ausgang Q des zugeordneten
Flipflops) und die Belegung des Eingabevektors, die diesen Zustandsübergang
auslöst. Darin treten allerdings nur diejenigen Eingangsvariablen auf, die Einfluss auf den Zustandsübergang haben.
Die Hot-one-Codierung sollte wegen ihrer Hardware-Redundanz nur angewandt werden, wenn die Zahl der Zustände klein ist (z.B. < 10). Bei Schaltwerken mit einer größeren Zahl von Zuständen sollte man die Binärcodierung
verwenden. Bei Problemstellungen mit einer sehr großen Zahl von Zuständen
(z.B. > 1000) ist ein systematischer Entwurf nach der oben beschriebenen Methode nicht mehr möglich. Man verwendet in diesem Fall komplexe Schaltwerke
(vgl. Kapitel 4).
103
104
Kapitel 3. Schaltwerke
Binäre Codierung
Zur binären Codierung der Zustände werden dlog2 ne Flipflops benötigt. Man
sieht, dass man bereits für n = 128 gegenüber der Hot-One-Codierung eine
große Einsparung erhält: 7 statt 128 Flipflops.
Flipflop i muss gesetzt werden, wenn einer der Zustände, in deren Binärcodierung Bit i den Wert 1 hat, als Nachfolgezustand auftritt. Deshalb müssen für
alle diese Zustände die eingehenden Kanten betrachtet werden. Jede Kante wird
durch einen Konjunktionsterm repräsentiert, der den Startzustand der Kante
und den zugeordneten Eingabevektor repräsentiert. Hat beispielsweise Zustand
0001 eine eingehende Kante, die vom Zustand 1110 ausgeht und mit der Eingabe 10 markiert ist, so wird für Bit 0 der Konjunktionsterm Q3 Q2 Q1 Q̄0 X1 X̄0
verwendet. Die Konjunktionsterme werden mit einem ODER-Gatter verknüpft,
dessen Ausgang mit dem Dateneingang des Flipflops i verbunden ist.
In diesem Fall ist die Zuordnung von Zuständen zu Binärwörtern durchaus
von Belang, was den Schaltungsaufwand für die Übergangsfunktion betrifft. Das
Zuordnungsproblem ist auch nicht trivial, da es n! = n·(n−1)·(n−2) · · · 1 mögliche Zuordnungen gibt. Für größere Werte von n gibt es deshalb ZuordnungsHeuristiken. Wir werden im weiteren die Zustände einfach durchnummerieren
und Zj mit der Binärcodierung von j zuordnen.
3.6
Implementierung von Schaltwerken
Wie wir gesehen haben, bestehen Schaltwerke aus einem Register und ein oder
zwei Schaltnetzen für die Funktionen f und g. Zur Implementierung von Schaltwerken müssen also im Wesentlichen Schaltnetze aufgebaut werden, die diese
beiden Funktionen realisieren. Diese Schaltnetze können entweder durch Verdrahten einzelner Schaltglieder (AND, OR, NOT) oder mit Hilfe programmierbarer Logikbausteine implementiert werden. Wir wollen im Folgenden die letztgenannte Möglichkeit genauer betrachten.
3.6.1
Programmierbare Logikbausteine
In Abschnitt 2.10 haben wir bereits PROMS, EPROMs, PALs und PLAs
kennengelernt. Eine Erweiterung von deren Funktionalität bieten so genannte
Gate Array Logic GALs (Gate Array Logic), die neben einem programmierbaren PAL für jeden
Ausgang auch noch ein Flipflop bereitstellen. Dessen Ausgang kann wiederum
auf die Eingänge des Schaltnetzes zurück gekoppelt werden. Mit einem solchen
Logikbaustein kann also ein komplettes Schaltwerk implementiert werden. Die
Programmierung kann bei neueren Bausteinen (z.B. Lattice ispGALs3 ) sogar
3
isp steht für in-system programmable.
3.6. Implementierung von Schaltwerken
105
im laufenden Betrieb erfolgen und wird mit Hilfe von Hardwarebeschreibungssprachen unterstützt.
Makrobefehl
X/Y
MIKROPROGRAMM
SPEICHER
Folgeadress -
Vektor
C
Steuer - Vektor
C
Status - Vektor
Operanden
ALU
Ergebnis
Abbildung 3.18: Mikroprogrammsteuerwerk auf Basis eines Speichers.
3.6.2
Mikroprogrammsteuerwerke
Auch mit einem Speicherbaustein, d.h. ROM, PROM, EPROM oder EEPROM,
kann leicht ein programmierbares Schaltwerk implementiert werden, vgl. Abb. 3.18.
Die beiden Schaltfunktionen f und g werden dann in zwei Teilbereichen des
Speichers abgelegt. Da man ein derartiges Schaltwerk häufig zur Realisierung
der Ablaufsteuerung in einem Prozessor verwendet, wird es auch als Mikroprogrammsteuerwerk bezeichnet. Sowohl das Holen als auch das Ausführen einzelner Maschinenbefehle kann mit Hilfe eines entsprechenden Mikroprogramms
sehr komfortabel und flexibel implementiert werden. In Kapitel 4 werden wir
noch einige Beispiele hierfür vorstellen.
Der Adresseingang des Speichers wird durch die Konkatenation von Eingabevektor X und Zustandsvektor Z angesteuert. Zu jeder angelegten Adresse
aktiviert der Adressdecoder genau eine Wortleitung mit 1 und steuert damit die
Bitleitungen an. Wenn der Vektor X den höherwertigen Adressbits zugeordnet
wird, kann man damit im Speicher die Startadresse des Mikroprogramms festlegen. Bei einem Prozessor verwendet man hierzu den so genannten Operationscode oder kurz Opcode, der über einen weiteren programmierbaren Logikbaustein
in die eigentliche Startadresse umgewandelt wird. Die Folgezustandsvariablen
Z + bilden zusammen mit dem gleichzeitig zwischengespeicherten Ausgangsvek-
106
Kapitel 3. Schaltwerke
tor4 Y einen Mikrobefehl. Jeder Mikrobefehl kann über die Folgezustandsvariablen nachfolgende Mikrobefehle adressieren. Die Auswahl der in einem Mikrobefehl auszuführenden Operationen erfolgt durch die Belegung des zugehörigen
Ausgangsvektors Y .
3.7
Zusammenfassung
Nach dem Durcharbeiten dieses Kapitels sollten Sie
• den Aufbau und die Funktionsweise von Speichergliedern verstanden haben,
• Kenntnis von Automatenmodellen und deren Anwendung auf Schaltwerke
erlangt haben,
• Verständnis des Zeitverhaltens und der Funktionsgrenzen von Schaltwerken entwickelt haben,
• Analyse und Synthese von Schaltwerken vornehmen können,
• die verschiedenen Methoden zur Implementierung von Schaltwerken anwenden können.
4
Lässt man die D-Flipflops vor dem Ausgangsvektor Y weg, so erhält man ein MealySchaltwerk.
3.8. Lösungen der Selbsttestaufgaben
3.8
Lösungen der Selbsttestaufgaben
Selbsttestaufgabe 3.1 von Seite 83
a)
Abbildung 3.19: Aufbau des Inkrementier-Schaltnetzes für einen reinen Vorwärtszähler.
b)
Abbildung 3.20: Aufbau des Schaltnetzes für einen umschaltbaren Vor/Rückwärtszähler. Für X = 0 wird wie in a) inkrementiert. Für X = 1 wird
die Zweierkomplement-Darstellung von -1 = 11 als zweiter Summand in den
2-Bit-Addierer eingespeist. Dadurch wird der Zustand mit jedem Takt dekrementiert.
Selbsttestaufgabe 3.2 von Seite 86
Man muss die beiden Steuersignale invertieren (siehe Abb. 3.21), denn wenn
zum Beispiel S̄ den Wert 0 hat (dies passiert genau dann wenn S = 1) geht der
Ausgang des oberen NAND-Gatters auf 1, und das Flipflop ist gesetzt.
107
108
Kapitel 3. Schaltwerke
Abbildung 3.21: Aufbau eines SR-Latches auf Basis von NAND-Schaltgliedern.
Selbsttestaufgabe 3.3 von Seite 88
Die Lösung ist in Abb. 3.22 dargestellt. Die Multiplexereingänge werden von
links nach rechts über S1 S0 = 00, 01, 10 und 11 ausgewählt.
Abbildung 3.22: Steuerbares Schieberegister.
Selbsttestaufgabe 3.4 von Seite 93
Man erkennt, dass Knoten 1 eingehende Kanten mit unterschiedlichen Ausgangswerten hat. Er muss dupliziert werden. Der resultierende Moore-Automat
ist als Zustandsgraph in Abb. 3.23 dargestellt.
3.8. Lösungen der Selbsttestaufgaben
109
0
1
0
0
1
1
10
0
0
0
11
1
Abbildung 3.23: Äquivalenter Moore-Automat
Selbsttestaufgabe 3.5 von Seite 96
a) Es handelt sich um einen Moore-Automaten, da die Ausgabe nur vom Zustand abhängig ist. Wir erhalten die Zustandstabelle gemäß Tabelle 3.5. Aus
dieser geht hervor, dass es sich um einen Automaten mit Hot-One-Codierung
(s. auch Abschnitt 3.5.3) handelt, denn ausgehend vom Zustand Z0 , codiert
als 0001, sind nur drei weitere Zustände (0010, 0100, 1000) erreichbar, also
insgesamt 4 Zustände. Die Ausgabe ist eine Binärcodierung der Zustandsnummer, also zum Beispiel erzeugt Zustand Z2 , codiert als 0100, die Ausgabe
10. Die Zählzyklen lassen sich ebenfalls aus der Tabelle ablesen:
• Für X = 0 ergibt sich der Zählzyklus 0 — 3 — 2 — 1 — 0, also ein
Modulo-4 Zähler, der aber runterzählt.
• Für X = 1 ergibt sich der Zählzyklus 0 — 1 — 3 — 2, also ein GrayCode-Zähler.
Tabelle 3.5: Zustandstabelle für Selbsttestaufgabe 3.5.
+
Y1 Y0
X Q3 Q2 Q1 Q0 Q+
3 · · · Q0
0
0001
1000
00
0
1000
0100
11
0
0100
0010
10
0
0010
0001
01
1
0001
0010
00
1
0010
1000
01
1
1000
0100
11
1
0100
0001
10
110
Kapitel 3. Schaltwerke
b) Der Zustandsgraph ist eine grafische Darstellung der Zählfolgen. Die Knoten enthalten die jeweiligen (Zähl-)Zustände, während an den Kanten die
Zustandsübergangsbedingungen eingetragen sind.
Abbildung 3.24: Zustandsgraph für das Schaltwerk von Selbsttestaufgabe 3.5.
Selbsttestaufgabe 3.6 von Seite 100
Den Zustandsgraphen für den Zähler zeigt Abb. 3.25.
Abbildung 3.25: Zustandsgraph für den 3-Bit–Synchronzähler.
Da keine Vorgaben gemacht wurden, welche Flipflop-Typen zu verwenden
sind, wählen wir D-Flipflops, weil sich damit wesentlich leichter synchrone
Zähler aufbauen lassen als mit JK-Flipflops. Auch die Automatentabelle (Tabelle 3.6) wird sehr einfach. Die Spalten der Ausgänge des Zeitpunktes tn+1
sind mit den Spalten der D-Eingänge identisch.
Tabelle 3.6: Zustandstabelle für Selbsttestaufgabe 3.6.
Q2 Q1
0
0
0
0
0
1
1
1
1
1
1
0
tn
Q0 D2 D1 D0
0
0
0
1
1
0
1
1
1
1
1
1
1
1
1
0
0
1
0
1
1
0
0
0
Q2
0
0
1
1
1
0
tn+1
Q1
0
1
1
1
0
0
Q0
1
1
1
0
1
0
3.8. Lösungen der Selbsttestaufgaben
Wir minimieren nun die Funktionsgleichungen für die D-Eingänge. Da die
Zustände mit dem Wert 2 und 4 nicht auftreten, werden sie als don’t care (×)
gekennzeichnet.
• D0 :
Abbildung 3.26: KV-Tafel für den Eingang D0 .
Wir erhalten: D0 = Q2 ∨ Q0 .
• D1 :
Abbildung 3.27: KV-Tafel für den Eingang D1 .
In diesem Fall nützen die don’t care-Terme nichts, da sie weder zur Vergrößerung eines Päckchens noch zum Einbinden einer alleinstehenden 1
dienen können. Die minimale DF lautet: D1 = Q0 Q1 ∨ Q0 Q2 .
• D2 :
Abbildung 3.28: KV-Tafel für den Eingang D2 .
Die minimale Gleichung für D2 lautet: D2 = Q1 .
111
112
Kapitel 3. Schaltwerke
Damit können wir die Schaltung angeben (Abb. 3.29).
Abbildung 3.29: Schaltbild zur Lösung der Selbsttestaufgabe 3.6.
Selbsttestaufgabe 3.7 von Seite 102
Es gibt die Äquivalenzklassen (1,3,6) und (4,5,7). Die Zustände 3 und 6 können
mit dem Zustand 1, die Zustände 5 und 7 mit dem Zustand 4 verschmolzen
werden, d.h. es werden insgesamt nur noch 4 Zustände (1,2,4 und 8) benötigt.
Kapitel 4
Komplexe Schaltwerke
Kapitelinhalt
4.1
Entwurf von Schaltwerken . . . . . . . . . . . . . . . . . . . 114
4.2
Aufbau komplexer Schaltwerke . . . . . . . . . . . . . . . . 115
4.3
RTL-Notation . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.4
ASM-Diagramme . . . . . . . . . . . . . . . . . . . . . . . . 119
4.5
Konstruktionsregeln für Operationswerke . . . . . . . . . . 122
4.6
Entwurf des Steuerwerks . . . . . . . . . . . . . . . . . . . 124
4.7
Beispiel: Einsen-Zähler . . . . . . . . . . . . . . . . . . . . . 126
4.8
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . 136
4.9
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . 137
113
114
Kapitel 4. Komplexe Schaltwerke
Im vorigen Kapitel haben wir Schaltwerke anhand von Zustandsgraphen
bzw. –tabellen entworfen. Da bei der Mikroprogrammierung die Tabellen direkt in einen Speicher übertragen werden können, ist diese Methode wesentlich
einfacher als der konventionelle Entwurf mit optimierten Schaltnetzen für die
Funktionen f und g. Aber auch diese einfachere Entwurfsmethode kann nur angewandt werden, solange die Zahl der Zustände und Eingangsvariablen klein“
”
ist.
Eine interessante Anwendung von Schaltwerken besteht darin, komplexere
arithmetische Operationen auf der Basis von Schaltnetzen für einfachere Operationen auszuführen und dadurch den Hardwareaufwand zu minimieren. So
kann beispielsweise eine Multiplikation auf mehrere Additionen zurückgeführt
werden. Schaltwerke für derartige Aufgabenstellungen können wegen der großen
Zahl der Eingangsvariablen bzw. möglichen Zustände nicht mit den bisher behandelten Methoden entworfen werden. Bei arithmetischen Aufgabenstellungen
ist außerdem die genaue Zahl der Zustände im Voraus nicht bekannt, weil die
Anzahl der nötigen Berechnungsschritte von den Operanden abhängt.
Um bei solch komplexen Aufgabenstellungen einen übersichtlichen Schaltwerksentwurf zu erreichen, verwendet man ein komplexes Schaltwerk, das aus
zwei kooperierenden Teilschaltwerken besteht. Ausgangspunkt für den Entwurf
eines komplexen Schaltwerks ist ein Hardware-Algorithmus für die gewünschte
Funktion. Die Umsetzung von Algorithmen in digitale Hardware erreicht man
am einfachsten durch eine funktionale Aufspaltung in einen steuernden und
einen verarbeitenden Teil. Ein komplexes Schaltwerk besteht daher aus einem
Steuer– und einem Operationswerk. Die Verwendung universeller Operationswerke führt im nächsten Kapitel zu den Grundlagen eines Computers.
4.1
Entwurf von Schaltwerken
In Kapitel 3 haben wir Methoden zum Entwurf von Schaltwerken kennengelernt. Die wesentlichen Entwurfsschritte sollen hier kurz wiederholt werden.
Ausgehend von einer verbalen (informalen) Beschreibung, kann man das
gewünschte Schaltverhalten mit einem Zustandsgraphen formal spezifizieren.
Die Zahl der Zustände wird minimiert, indem man äquivalente Zustände zusammenfasst. Dadurch werden weniger Flipflops benötigt. Durch eine geeignete
Zustands-Codierung kann der Aufwand zur Bestimmung der Folgezustände minimiert werden. Um die Schaltfunktionen für die Eingänge der D-Flipflops zu
finden, überträgt man den Zustandsgraphen in eine Zustandstabelle. In dieser
Tabelle stehen auf der linken Seite die Zustandsvariablen zkt und die Eingabevariablen xtm zum Zeitpunkt t. Auf der rechten Seite stehen die gewünschten
Folgezustände zkt+1 und die zugehörigen Ausgabevariablen ynt .
Die Entwurfsaufgabe besteht daher in der Erstellung der Zustandstabelle
und der Minimierung der damit spezifizierten Schaltfunktionen. Im Gegensatz
zu diesem konventionellen Entwurf kann bei Anwendung der Mikroprogram-
4.2. Aufbau komplexer Schaltwerke
115
mierung der zweite Schritt entfallen. Beide Entwurfsmethoden sind aber nur
anwendbar, solange die Zahl der Eingangsvariablen und möglichen inneren Zustände klein“ bleibt.
”
Beispiel 4.1 8-Bit-Dualzähler: Mit k Speichergliedern sind maximal 2k Zustände codierbar. Um z.B. einen 8-Bit-Dualzähler nach der beschriebenen Methode zu entwerfen, müsste eine Zustandstabelle mit 256 Zeilen erstellt werden.
Hiermit müssten acht Schaltfunktionen für die jeweiligen D-Flipflops ermittelt und minimiert werden. Obwohl es sich bei diesem Beispiel um eine relativ
einfache Aufgabenstellung handelt und außer der Taktvariablen keine weiteren
Eingangsvariablen vorliegen, ist ein Entwurf mit einer Zustandstabelle nicht
sinnvoll durchführbar.
Schaltwerke für komplizierte Aufgabenstellungen, d.h. Schaltwerke mit einer
großen Zahl von Zuständen, wollen wir als komplexe Schaltwerke bezeichnen. komplexe Schaltwerke
Um bei komplexen Schaltwerken einen effektiven und übersichtlichen Entwurf
zu erreichen, nimmt man eine Aufteilung in zwei kooperierende Teilschaltwerke
vor: ein Operationswerk (data path) und ein Steuerwerk (control path). Die
funktionale Aufspaltung in eine verarbeitende und eine steuernde Komponente
vereinfacht den Entwurf erheblich, da beide Teilschaltwerke getrennt voneinander entwickelt und optimiert werden können.
Beispiele für die Anwendung komplexer Schaltwerke sind:
• Ampelsteuerung mit flexiblen Phasen,
• Umrechnung von Messwerten (z.B. Temperatur von Grad Celsius in Fahrenheit),
• Arithmetische Einheiten für Gleitkommazahlen (Multiplikation, Division).
Für die o.g. Aufgabenstellungen könnten wir sehr leicht eine Lösung in Form
eines Algorithmus angeben und ein entsprechendes Programm schreiben. Aber
auch wenn wir eine Hardware-Lösung für die Aufgabenstellung suchen, können
wir einen Algorithmus als Ausgangspunkt für den Entwurf benutzen. Diesen
Hardware-Algorithmus implementieren wir dann mit einem komplexen Schaltwerk.
4.2
Aufbau komplexer Schaltwerke
Abb. 4.1 zeigt den Aufbau eines komplexen Schaltwerks. Wie bei einem gewöhnlichen Schaltwerk sind funktional zusammengehörende Schaltvariablen zu Vektoren zusammengefasst. Das Operationswerk bildet den verarbeitenden Teil,
d.h. hier wird der Eingabevektor X schrittweise zum Ausgabevektor Y umgeformt. Der Eingabevektor, Zwischenergebnisse und der Ausgabevektor werden
116
Kapitel 4. Komplexe Schaltwerke
hierzu in Registern gespeichert und über Schaltnetze (arithmetisch oder logisch) miteinander verknüpft. Die Datenpfade zwischen den Registern und solchen Operations-Schaltnetzen können mit Hilfe von Multiplexern oder Bussen
realisiert werden.
Steuervektor
Statusvektor
Die in einem Taktzyklus auszuführenden Operationen und zu schaltenden
Datenpfade werden durch die Belegung des Steuervektors bestimmt. Mit jedem Steuerwort wird ein Teilschritt des Hardware-Algorithmus abgearbeitet.
Das Steuerwerk hat die Aufgabe, die richtige Abfolge von Steuerwörtern zu
erzeugen. Dabei berücksichtigt es die jeweilige Belegung des Statusvektors, der
besondere Ergebniszustände aus den vorhergehenden Taktzyklen anzeigt. Über
eine Schaltvariable des Statusvektors kann z.B. gemeldet werden, dass ein Registerinhalt den Wert Null angenommen hat. Das Steuerwerk kann bestimmte
Statusvariablen abfragen und anschließend auf deren momentane Belegung reagieren. So ist es beispielsweise möglich, eine Schleife im Steueralgorithmus zu
verlassen, wenn das Register mit dem Schleifenzähler den Wert Null erreicht
hat.
Wir gehen im Folgenden davon aus, dass die beiden Teilschaltwerke synchron getaktet werden und die Rückkopplungsbedingungen stets erfüllt sind.
Eingabevektor X
Operationswerk
Steuervektor S
Ausgabevektor Y
Statusvektor V
Steuerwerk
Abbildung 4.1: Aufbau eines komplexen Schaltwerks.
4.3
RTL-Notation
In diesem Abschnitt wollen wir die so genannte RTL-Notation (Register Transfer Level) zur kompakten Beschreibung von Hardwarekomponenten und deren
Funktionen einführen. Wir bezeichnen Register durch Großbuchstaben. Sofern
4.3. RTL-Notation
117
die Register eine besondere Funktion haben, wählen wir eine passende Abkürzung, z.B. AR für ein Adressregister. Allgemeine Register zur Speicherung von
Daten können mit R bezeichnet und durchnummeriert werden.
Ein Register wird als Vektor definiert, indem man die Randbits“ angibt.
”
So bedeutet R2(7 : 0), dass R2 ein 8-Bit-Register ist. Das rechte Bit hat die
Wertigkeit 20 und wird daher auch als LSB (Least Significant Bit) bezeichnet. Das linke Bit hat die Wertigkeit 27 und wird als MSB (Most Significant
Bit) bezeichnet. Häufig fasst man 8 Bit zu einem Byte zusammen und verwendet dieses anstatt einzelner Bits als Basisgröße (z.B. bei Speicherung oder
Datenübertragung). Größere Wörter (z.B. 32 Bit) werden dann byteweise zerlegt bzw. zusammengesetzt. Beginnt man dabei mit dem höchstwertigen Byte
(D31 , · · · , D24 ) so spricht man von einer Big-endian-Reihung. Beginnt man mit
dem niederwertigsten Byte (D7 , . . . , D0 ), so spricht man von Little Endian.
Zuweisungen zu Registern werden durch den Ersetzungsoperator ← beschrieben. So bedeutet R1 ← 0, dass das Register R1 zurückgesetzt wird, d.h.
alle Bits werden Null. R1 ← R1 + R2 bedeutet, dass der Inhalt von R1 durch
die Summe der in den Registern R1 und R2 gespeicherten Werte ersetzt wird.
Soll ein Registerinhalt nicht mit jedem Taktzyklus verändert werden, so
kann man die Datenübernahme von einem Steuersignal abhängig machen. Dadurch erhalten wir eine bedingte Zuweisung in der Form:
if (S1 = 1) then (R1 ← R1 + R2 )
Schaltungstechnisch wirkt S1 in diesem Fall als Steuervariable, die das Taktsignal modifiziert. Dies wird durch ein AND-Schaltglied wie in Abb. 4.2 realisiert.
R1 +R 2
Takt
S1
&
R1
Abbildung 4.2: Bedingte Zuweisung durch Taktausblendung mit einem ANDSchaltglied.
Die o.g. if-Anweisung kann auch durch folgende verkürzte Schreibweise dargestellt werden:
S1 : R1 ← R1 + R2
Sollen zwei oder mehr Registertransfers gleichzeitig stattfinden, so werden
die Anweisungen in eine Zeile geschrieben und durch Kommata voneinander
getrennt. Man beachte, dass die Reihenfolge der Anweisungen innerhalb einer
Zeile keine Bedeutung hat, da alle gleichzeitig ausgeführt werden.
Zur Speicherung von Daten können neben einzelnen Registern auch Speicher
eingesetzt werden. Diese werden durch den Großbuchstaben M charakterisiert
118
Kapitel 4. Komplexe Schaltwerke
und durch ein Adressregister angesprochen, das als Index in eckigen Klammern
angegeben wird.
Beispiel 4.2 Befehlsholephase eines Prozessors
Wir werden später noch genauer untersuchen wie ein Prozessor Befehle
verarbeitet. Ein wichtiger Teilschritt bei der Befehlsverarbeitung ist die Befehlsholephase, bei der ein Maschinenbefehl aus dem Hauptspeicher ins Leitwerk
übertragen wird. Durch die Operation
IR ← M [P C], P C ← P C + 1
wird der durch den Befehlszähler (Programm Counter, PC) adressierte Befehl
aus dem Speicher in das Befehlsregister (Instruction Register, IR) geladen.
Gleichzeitig wird der Befehlszähler inkrementiert. Man beachte, dass am Ende eines Kippintervalls der noch unveränderte Befehlszähler zum Adressieren
des Speichers benutzt wird und dass der geholte Befehl sowie der neue Befehlszählerstand erst mit dem Wirkintervall des nachfolgenden Takts übernommen
werden. Das Inkrementieren des Befehlszählers kann auch durch die Schreibweise P C++ abgekürzt werden.
Die Register oder Speicherplätze auf der rechten Seite des Ersetzungssymbols ← können durch Operationen miteinander verknüpft werden, die durch
Boole’sche Schaltfunktionen beschrieben werden. Wir unterscheiden im Folgenden drei Kategorien und geben Beispiele für solche Mikrooperationen an.
1. Logische Mikrooperationen, bitweise ausgeführt
•
•
•
•
NOT
AND
OR
EXOR
¯
∧
∨
⊕
2. Arithmetische Mikrooperationen
• Addition +
• Um 1 inkrementieren ++
• Subtraktion –
(kann auf die Addition des Zweierkomplements zurückgeführt werden)
• Um 1 dekrementieren – –
• Einerkomplement ¬
(ist identisch mit der Negation)
3. Verschiebung und Konkatenation
• Schiebe um n Bit nach links n bzw. nach rechts n
• Rotiere um n Bit nach links ←- n bzw. nach rechts ,→ n
4.4. ASM-Diagramme
• Verbinde zwei Vektoren zu einem größeren Vektor k
Mikrooperationen können durch Schaltnetze (z.B. Addition) oder einfach
nur durch die An- bzw. Umordnung der Datenleitungen (z.B. Konkatenation,
Schiebemultiplexer) implementiert werden. Durch Verkettung dieser elementaren Mikrooperationen in einem Hardware-Algorithmus können mit einem Operationswerk komplexere Makrooperationen gebildet werden. So kann beispielsweise ein einfaches Operationswerk mit einer 8 Bit breiten ALU (Arithmetic Lo- ALU
gic Unit), die nur ganze Zahlen addieren bzw. subtrahieren kann, auch 32- oder
64-Bit-Gleitkommaoperationen ausführen. Man benötigt dazu einen HardwareAlgorithmus, der die Gleitkommaoperationen so zerlegt, dass sie durch eine
entsprechende Zahl von 8-Bit-Operationen umgesetzt werden können. Die Anzahl und Abfolge dieser Mikrooperationen ist von den Daten abhängig und
wird durch die Zwischenergebnisse (Statusbits) gesteuert. Die Anzahl der Mikrooperationen kann verringert werden, indem man die Wortbreite oder die
Komplexität der verfügbaren Funktionsschaltnetze erhöht.
Nachdem wir nun die grundlegenden Mikrooperationen kennengelernt haben, werden wir im nächsten Abschnitt sehen, wie diese in einen HardwareAlgorithmus integriert werden.
4.4
ASM-Diagramme
Als Hilfsmittel zur Beschreibung von Hardware-Algorithmen für ein komplexes
Schaltwerk verwendet man das so genannte Algorithmic State Machine Chart
oder ASM-Diagramm. Ein ASM-Diagramm ähnelt einem Flussdiagramm, enthält aber zusätzliche Informationen über die zeitlichen Abläufe der benutzten
Mikrooperationen. Es kann drei Arten von Boxen enthalten:
1. Zustandsboxen,
2. Entscheidungsboxen und
3. bedingte Ausgangsboxen.
Bei Moore-Schaltwerken gibt es keine bedingten Ausgangsboxen, da sie zustandsorientiert arbeiten. Dafür enthalten Moore-Schaltwerke in der Regel aber
mehr Zustandsboxen als Mealy-Schaltwerke. Aus den o.g. Elementen werden
wiederum ASM-Blöcke gebildet, die jeweils einen Zustand und dessen komplette Verzweigungsstruktur beinhalten.
4.4.1
Zustandsboxen
Die Zustandsbox wird durch einen symbolischen Zustandsnamen und einen Zustandscode bezeichnet (Abb. 4.3). Innerhalb einer Zustandsbox können einem
119
120
Kapitel 4. Komplexe Schaltwerke
oder mehreren Registern Werte zugewiesen werden. Die Zuweisungen werden
in der oben eingeführten RTL-Notation angegeben. In Zustandsboxen wird die
Aktion festgelegt, die beim Erreichen dieses Zustands im Operationswerk ausgeführt werden soll.
Zustandsname
Zustandscodierung
Z1
Zuweisungen
001
A
0
Abbildung 4.3: Zustandsbox, links: allgemeine Form, rechts: Beispiel.
In jedem ASM-Diagramm gibt es einen Anfangszustand Z0 , der nach dem
Einschalten der Betriebsspannung eingenommen wird. Die dazu erforderlichen
Datenpfade werden durch entsprechende Belegungen der Steuervariablen bestimmt, die wiederum durch den Anfangszustand des Steuerwerks festgelegt
sind.
4.4.2
Entscheidungsboxen
Entscheidungsboxen testen Registerinhalte oder Eingänge auf besondere Bedingungen (Abb. 4.4). Hierzu werden Status-Informationen durch einen Vergleicher (Komparator) abgefragt oder die Belegung von Eingängen mit bestimmten
Werten wird getestet. Die abgefragten Bedingungen steuern den Kontrollfluss
und legen damit die Ausgangspfade aus einem ASM-Block fest. Durch Entscheidungsboxen werden die Folgezustände festgelegt, die das Steuerwerk als
nächstes einnehmen soll. Eine Entscheidungsbox hat nur zwei Ausgänge, da
die abgefragte Bedingung nur wahr (1) oder falsch (0) sein kann.
1
Bedingung
0
1
A=0
0
Abbildung 4.4: Entscheidungsbox, links: allgemeine Form, rechts: Beispiel.
4.4.3
Bedingte Ausgangsboxen
Diese Komponente gibt es nur bei ASM-Diagrammen für Mealy-Schaltwerke.
Wie bei einer Zustandsbox können in der bedingten Ausgangsbox Variablen
4.4. ASM-Diagramme
121
oder Ausgängen Werte zugewiesen werden1 . Es werden jedoch nur diejenigen Ausgangsboxen ausgeführt, die auf dem genommenen Pfad liegen. Die
Zuweisungen der aktivierten bedingten Ausgangsboxen werden zeitgleich zu
den Zuweisungen in der vorgelagerten Zustandsbox ausgeführt. Zur Unterscheidung von einer Zustandsbox hat die bedingte Ausgangsbox abgerundete Ecken
(Abb. 4.5). Außerdem wird weder ein Zustandsname noch ein Zustandscode
zugeordnet.
Bedingte Zuweisung
K++
Abbildung 4.5: Bedingte Ausgangsbox, links: allgemeine Form, rechts: Beispiel.
Selbsttestaufgabe 4.1 (Erforderliches Steuerwerk)
Begründen Sie, dass bei Vorliegen einer bedingten Ausgangsbox in einem ASMDiagramm das Steuerwerk des betreffenden komplexen Schaltwerks als MealyAutomat ausgeführt werden muss.
Lösung auf Seite 137
4.4.4
ASM-Block
Ein ASM-Block enthält genau eine Zustandsbox, die als Eingang in den Block
dient. Ein Netzwerk aus hinter- bzw. nebeneinandergeschalteten Entscheidungsboxen, das im Falle von Mealy-Schaltwerken auch bedingte Ausgangsboxen enthalten kann, führt zu anderen Zuständen im ASM-Diagramm. Die ASM-Blöcke
können dadurch gekennzeichnet werden, dass man sie durch gestrichelte Linien
einrahmt oder grau hinterlegt. Das Netzwerk der ASM-Blöcke bildet schließlich
das ASM-Diagramm.
Beim Arbeiten mit ASM-Diagrammen müssen folgende Regeln beachtet
werden:
1. Die Entscheidungsboxen müssen so miteinander verbunden sein, dass jeder durch das Netzwerk der Entscheidungsboxen genommene Pfad (abhängig von der jeweiligen Variablenbelegung) zu genau einem Zustand
führt.
2. Variablen in der Zustandsbox oder in bedingten Ausführungsboxen dürfen
innerhalb eines ASM-Blocks nur einmal auf der linken Seite stehen, d.h.
sie dürfen nur einmal pro Taktzyklus beschrieben werden.
1
Man könnte sie daher auch als bedingte Zustandsboxen bezeichnen.
122
Kapitel 4. Komplexe Schaltwerke
3. Die Wertzuweisungen an die Variablen erfolgen erst am Ende eines Taktzyklus, d.h. innerhalb des Zustandes werden auf der rechten Seite von
Zuweisungen und in Entscheidungsboxen die Werte benutzt, die die Variablen am Anfang des Zustands haben. Die im Zustand neu zugewiesenen
Werte sind also erst kurz nach Ende des Taktzyklus (am Anfang des Folgezustands) gültig.
Selbsttestaufgabe 4.2 (ASM-Diagramm) Entscheiden Sie, ob der nachfolgende ASM-Block die in 1 angegebene Regel erfüllt.
Z1
D
E
A>B
1
X
A
0
1
B<0
0
C
1
Z2
Z3
Lösung auf Seite 137
Im Gegensatz zu einem normalen Flussdiagramm ordnet das ASM-Diagramm den einzelnen Anweisungen und Verzweigungen Zustände zu und definiert so, welche Speicher, Funktionsschaltnetze und Datenwegschaltungen im
Operationswerk benötigt werden. Da gleichzeitig auch der Kontrollfluss visualisiert wird, eignet sich das ASM-Diagramm zur vollständigen Spezifikation eines
komplexen Schaltwerks. Anhand der Darstellung mit einem ASM-Diagramm
können sowohl das Operations- als auch das Steuerwerk synthetisiert werden.
Bevor wir den Entwurf mit ASM-Diagrammen an einem Beispiel demonstrieren, wollen wir einige allgemeine Konstruktionsregeln für Operations- und
Steuerwerke vorstellen.
4.5
Konstruktionsregeln für Operationswerke
Da eine gegebene Aufgabenstellung durch viele verschiedene Algorithmen lösbar ist, gibt es für den Entwurf eines komplexen Schaltwerks keine eindeutige
Lösung. Die Kunst des Entwurfs besteht darin, einen guten Kompromiss zwischen Hardwareaufwand und Zeitbedarf zu finden.
4.5. Konstruktionsregeln für Operationswerke
123
Ist die Architektur des Operationswerks vorgegeben, so muss der Steueralgorithmus daran angepasst werden. Dies ist z.B. bei einem Rechenwerk eines
Computers der Fall. Das Rechenwerk ist ein universelles Operationswerk, das
zur Lösung beliebiger (berechenbarer) Problemstellungen benutzt werden kann.
Wenn dagegen die Architektur des Operationswerks frei gewählt werden
darf, hat der Entwickler den größten Spielraum — aber auch den größten Entwurfsaufwand. Für diesen Fall sucht man ein an die jeweilige Problemstellung
angepasstes Operationswerk. Wir werden im Folgenden Konstruktionsregeln
für den Entwurf solcher anwendungsspezifischer Operationswerke angeben.
Ausgangspunkt ist stets ein Algorithmus, der angibt, wie der Eingabevektor zum Ausgabevektor verarbeitet werden soll. Wie wir oben gesehen haben,
kann zur Beschreibung von Hardware-Algorithmen ein ASM-Diagramm benutzt
werden. Es enthält Anweisungen mit Variablen, Konstanten, Operatoren, Zuweisungen und bedingte Verzweigungen. Hiermit kann dann die Architektur
des Operationswerks wie folgt abgeleitet werden:
1. Für jede Variable, die auf der linken Seite einer Zuweisung steht, ist ein
Register erforderlich.
2. Wenn einer Variablen mehr als ein Ausdruck zugewiesen wird, muss vor
die Eingänge des Registers ein Multiplexer (Auswahlnetz) geschaltet werden. Um die Zahl der Verbindungsleitungen (Chipfläche) zu reduzieren,
können die Register auch in einem Registerblock zusammengefasst wer- Registerblock
den. Der Zugriff erfolgt in diesem Fall zeitversetzt über einen Bus. Soll auf
zwei oder mehrere Register gleichzeitig zugegriffen werden, so muss der
Registerblock über eine entsprechende Anzahl von Busschnittstellen verfügen, die auch als Ports bezeichnet werden. Man unterscheidet Schreib- Ports
und Leseports. Ein bestimmtes Register kann zu einem bestimmtem Zeitpunkt natürlich nur von einem Schreibport beschrieben werden. Es kann
aber gleichzeitig an zwei oder mehreren Leseports ausgelesen werden.
3. Konstanten können fest verdrahtet sein oder sie werden durch einen Teil
des Steuervektors definiert.
4. Die Berechnung der Ausdrücke auf den rechten Seiten von Wertzuweisungen erfolgt mit Funktionsschaltnetzen, welche die erforderlichen Mikrooperationen mit Hilfe Boole’scher Funktionen realisieren.
5. Wertzuweisungen an unterschiedliche Variablen können parallel (gleichzeitig) ausgeführt werden, wenn sie im Hardware-Algorithmus unmittelbar aufeinander folgen und wenn keine Datenabhängigkeiten zwischen Datenabhängigkeiten
den Anweisungen bestehen. Eine (echte) Datenabhängigkeit liegt dann
vor, wenn die vorangehende Anweisung ein Register verändert, das in der
nachfolgenden Anweisung als Operand benötigt wird.
124
Kapitel 4. Komplexe Schaltwerke
6. Zur Abfrage der Bedingungen für Verzweigungen müssen entsprechende
Statusvariablen gebildet werden.
Die gleichzeitige Ausführung mehrerer Anweisungen verringert die Zahl der
Taktzyklen und verkürzt damit die Verarbeitungszeit. Andererseits erhöht dies
aber den Hardwareaufwand, wenn in den gleichzeitig abzuarbeitenden Wertzuweisungen dieselben Mikrooperationen auftreten. Die Funktionsschaltnetze für
die parallel ausgeführten Operationen müssen dann mehrfach vorhanden sein.
In Abschnitt 4.7 wird die Anwendung der oben angegebenen Konstruktionsregeln demonstriert.
Selbsttestaufgabe 4.3 (Einfaches Operationswerk)
Skizzieren Sie ein Operationswerk mit zwei Registern R1 und R2 . Durch eine
Steuervariable S soll es möglich sein, eine der beiden folgenden Mikrooperationen auszuwählen.
S = 0 Tausche die Registerinhalte von R1 und R2 .
S = 1 Addiere die Registerinhalte von R1 und R2 und schreibe die Summe in
das Register R1 . Das Register R2 soll dabei unverändert bleiben.
Lösung auf Seite 137
4.6
Entwurf des Steuerwerks
Die Struktur eines Steuerwerks ist unabhängig von einem bestimmten Steueralgorithmus. Für den systematischen Entwurf haben wir drei Möglichkeiten
kennengelernt:
1. Entwurf mit Hilfe von Zustandsgraph/-tabelle, Zustandsminimierung und
binärer Zustandscodierung,
2. wie 1., allerdings mit einem Flipflop pro Zustand (Hot-one-coding),
3. Entwurf als Mikroprogrammsteuerwerk.
Die beiden erstgenannten Methoden sind nur dann anwendbar, wenn die
Zahl der Zustände nicht zu groß ist (z.B. bis 32 Zustände). Für umfangreichere
Steueralgorithmen kommt praktisch nur die Methode der Mikroprogrammierung
in Frage.
Ein verzweigungsfreier oder linearer Steueralgorithmus kann besonders leicht
implementiert werden. Wir benötigen nur einen Zähler und einen SteuerwortSpeicher (Control Memory), der die einzelnen Steuerwörter aufnimmt und von
den Zählerausgängen adressiert wird. Sobald der Eingabevektor anliegt, wird
4.6. Entwurf des Steuerwerks
125
Adresse
...
Ladbarer Zähler
der Zähler zurückgesetzt und gestartet. Am Ausgang des Steuerwort-Speichers
werden nun die Steuerwörter nacheinander ausgegeben und vom Operationswerk verarbeitet. Eine Schaltvariable des Steuervektors zeigt das Ende des
Steueralgorithmus an und stoppt den Zähler. Danach kann ein neuer Zyklus
beginnen.
Steuerwort
Load/Count
Verzweigungsadresse
Steuerwortspeicher
...
&
“test” Operationswerk
“zero”
Abbildung 4.6: Prinzip eines mikroprogrammierbaren Steuerwerks, das bedingte Verzweigungen ausführen kann.
Um Verzweigungen innerhalb des Steueralgorithmus zu ermöglichen, wird
ein ladbarer Zähler verwendet (Abb. 4.6). Der Einfachheit halber wollen wir
annehmen, dass nur Verzweigungen auf die Bedingung zero“, d.h. ein be”
stimmtes Register R des Operationswerks hat den Wert 0 angenommen, erlaubt sind. Diese Bedingung ist erfüllt, wenn alle Bits des Registers R den
Wert 0 haben. Eine entsprechende Statusvariable zero“ kann beispielsweise
”
mit einem NOR-Schaltglied erzeugt werden, das alle Bits als Eingabe erhält.
Durch eine Schaltvariable des Steuervektors wird diese Abfrage aktiviert. Falls
das zero“-Bit gesetzt ist, wird der (Mikroprogramm-)Zähler mit einer Verzwei”
gungsadresse aus dem Steuerwort-Speicher geladen. Die Abfrage der Steuervariablen zero“ wird durch eine 1 an der Steuervariablen test“ aktiviert. Die
”
”
AND-Verknüpfung liefert dann bei gesetztem zero“-Flag den Wert 1 und schal”
tet über den Load/Count−Eingang den Zähler vom Zähl- auf Ladebetrieb. Um
Speicherplatz zu sparen, wird ein Teil des Steuerworts als Verzweigungsadresse interpretiert. Das Steuerwort darf deshalb während der Abfrage einer Verzweigungsbedingung nicht im Operationswerk wirksam werden. Mit Hilfe des
Abfragesignals test“ kann z.B. der Takt des Operationswerks für einen Taktzy”
klus ausgeblendet werden. Dadurch wird jeweils ein Wirk- und ein Kippintervall
unterdrückt. Die durch die Verzweigungsadresse geschalteten Datenpfade und
Operationen werden unwirksam, da die D-Flipflops die Ergebnisse nicht übernehmen.
126
Kapitel 4. Komplexe Schaltwerke
Die Synchronisierung des Steuerwerks in Abb. 4.6 erfolgt durch Rücksetzen
des Zählers beim Start und durch ein Stop-Bit im Steuerwort. Beide Einrichtungen wurden der Übersicht halber nicht eingezeichnet.
Im Folgenden wollen wir an einem einfachen Beispiel verschiedene Entwürfe
von komplexen Schaltwerken vorstellen.
4.7
Beispiel: Einsen-Zähler
Ein komplexes Schaltwerk soll die Anzahl der Einsen in einem n Bit langen Wort
X bestimmen. Die Berechnung soll beginnen, sobald ein weiteres Eingangssignal
Start den Wert 1 annimmt. Das Ergebnis wird auf den Ausgangsvektor Y gelegt
und eine 1 auf einem weiteren Ausgangssignal zeigt an, dass das Ergebnis am
Ausgang anliegt.
Das hier vorliegende Problem ist für großes n sehr schwer zu lösen. Wir
könnten mit einem Volladdierer jeweils 3-Bit-Blöcke auswerten und daraus eine
2-Bit-Dualzahl für die Anzahl der Bits in diesem 3-Bit-Block gewinnen. Bei
n = 12 müssten wir dann aber vier Wörter“ zu je 2 Bit in einem übergeordneten
”
Addierschaltnetz aufsummieren.
Zur Lösung dieses Problems bietet sich ein ladbares Schieberegister A zur
Aufnahme des n-Bit-Worts an. Die Anzahl der Einsen wird in einem Zähler K
gespeichert, der zu Anfang zurückgesetzt wird. Der Zähler wird inkrementiert,
wenn das niederwertige (rechte) Bit A0 des Schieberegisters den Wert 1 hat.
Dann wird das Register A um ein Bit nach rechts geschoben, wobei eine 0 von
links nachgeschoben wird. Wenn alle Bits des Schieberegisters A den Wert 0
haben, kann K als Ergebnis an Y ausgegeben werden. Damit wir das Anliegen
eines gültigen Ergebnisses erkennen, wird gleichzeitig der Ausgang F ertig auf
1 gesetzt.
Selbsttestaufgabe 4.4 (12-Bit-Einsen-Zähler) Entwerfen Sie ein Schaltnetz, um
die Zahl der Einsen in einem 6 Bit langen Wort zu bestimmen. Erweitern Sie
die Wortbreite mit zwei derartigen 6-Bit-Modulen auf 12 Bit.
Lösung auf Seite 138
4.7.1
Lösung mit komplexem Moore-Schaltwerk
In Abb. 4.7 ist das ASM-Diagramm für die zustandsorientierte Lösung dargestellt. Solange das Start-Signal den Wert 0 führt, bleibt das Schaltwerk im
Zustand z0 . F ertig = 0 zeigt an, dass an Y noch kein gültiges Ergebnis anliegt. Wenn Start den Wert 1 annimmt, wird in den Zustand z1 verzweigt. Dort
wird der Eingangsvektor X in das Register A eingelesen. Gleichzeitig wird das
Zählregister K zurückgesetzt. Im Zustand z2 wird das niederwertige Bit A0 des
4.7. Beispiel: Einsen-Zähler
127
Z0
Fertig
0
0
Start = 1
1
Z1
A
K
X
0
Z2
0
1
A0 = 1
Z3
K++
Z4
A >> 1
1
0
A=0
Z5
Fertig
1
Y
K
Abbildung 4.7: ASM-Diagramm für ein komplexes Moore-Schaltwerk.
Schieberegisters abgefragt. Je nach Belegung wird K entweder inkrementiert
oder es erfolgt ein direkter Zustandswechsel nach z4 . Dort wird A nach rechts
geschoben und gleichzeitig geprüft, ob A noch Einsen enthält. Diese Statusinformation kann mit einem n-fach OR-Schaltglied erzeugt werden. Falls A noch
mindestens eine 1 enthält, verzweigt das Schaltwerk in den Zustand z2 . Sonst
wird für einen Taktzyklus die Zahl der Einsen auf Y ausgegeben. Dann springt
das Schaltwerk in den Anfangszustand und wartet auf ein neues Startereignis.
Der Zustand z2 erscheint zunächst überflüssig, da in ihm keine Zuweisung
erfolgt. Allerdings ist er notwendig, da im vorausgehenden Zustand (z1 bzw.
z4 ) eine Zuweisung an das Register A erfolgt, und in der Entscheidungsbox, die
zum ASM-Block von Zustand z2 gehört, das Register A abgefragt wird. Gäbe es
nun zwischen Zustand z1 (bzw. z4 ) und der Entscheidungsbox keinen weiteren
Zustand, so hätte die Zuweisung an A noch gar nicht stattgefunden, denn diese
wird gemäß Regel 3 erst am Ende des Takts vorgenommen.
128
Kapitel 4. Komplexe Schaltwerke
Z0
Fertig
0
0
Start = 1
1
Z1
A
K
X
0
Z2
0
1
A0 = 1
K++
1
0
A=0
Z3
A >> 1
Fertig
1
Y
K
Abbildung 4.8: ASM-Diagramm für ein komplexes Mealy-Schaltwerk.
4.7.2
Lösung mit komplexem Mealy-Schaltwerk
In Abb. 4.8 ist die entsprechende übergangsorientierte Lösung dargestellt. Im
Gegensatz zur Moore-Variante werden hier statt sechs nur vier Zustände benötigt. Zwei Zustände können durch die Verwendung bedingter Ausgangsboxen
eingespart werden. Dies bedeutet, dass zur Zustandscodierung nur zwei statt
drei Flipflops benötigt werden. Falls alle Bits des Eingangsvektors X mit dem
Wert 1 belegt sind, erfolgt die Auswertung eines Bits bei der Mealy-Variante in
einem statt in drei Taktschritten. Sie benötigt in diesem Fall auch nur ein Drittel der Zeit. Man beachte, dass die Bedingungen A0 = 1 und A 6= 0 gleichzeitig
ausgewertet werden, da sie dem gleichen ASM-Block zugeordnet sind.
4.7.3
Aufbau des Operationswerks
Bevor wir verschiedene Steuerwerkslösungen betrachten, entwerfen wir das Operationswerk (Abb. 4.9). Das Operationswerk ist für beide Schaltwerks-Varianten identisch. Wir benötigen ein Register A mit einer Wortbreite von n Bit und
4.7. Beispiel: Einsen-Zähler
129
ein Register K mit einer Wortbreite von dlog2 (n + 1)e Bit2 .
Da das Register A in zwei Zuständen (z1 und z4 ) auf der linken Seite steht,
d.h. geschrieben wird, befindet sich vor dem Dateneingang D des Registers ein
Multiplexer. Gleiches gilt für Register K.
Die Register benötigen Select-Eingänge sA und sK , die in dem Takt den
Wert 1 annehmen, wenn das Register tatsächlich beschrieben werden soll, denn
das Taktsignal hat in jedem Takt eine steigende Flanke. Sie entsprechen dem
Enable-Signal aus Kapitel 3. Weiterhin haben die Multiplexer jeweils ein Steuersignal mA und mK .
Schließlich benötigt man noch ein 1-Bit Register F für die Variable Fertig,
samt Steuersignal sF . Auch dieses Register müsste eigentlich einen vorgeschalteten Multiplexer besitzen, da Fertig in zwei Zuständen geschrieben wird. Da
die möglichen Werte hier aber 0 und 1 sind, entsprechen sie gerade dem Wert
des Multiplexer-Steuersignals mF , wodurch man den Multiplexer durch eine
direkte Verbindung von mF mit dem Register-Eingang ersetzen kann.
Weiterhin benötigen wir Schaltnetze zum Rechtsschieben sowie zum Inkrementieren, um die Berechnungen in den Zuständen z3 und z4 zu ermöglichen,
sowie ein Schaltnetz zum Test, ob A ungleich Null ist, was allerdings mit einem
ODER aller Bits von A realisiert werden kann.
Insgesamt empfängt das Operationswerk die Steuersignale sA , sK , sF , mA ,
mK und mF vom Steuerwerk sowie die Eingangsvariable X, und liefert die
Status-Signale A 6= 0 sowie A0 = 1 ans Steuerwerk, sowie die Ausgaben Fertig
und Y .
4.7.4
Moore-Steuerwerk als konventionelles Schaltwerk
Aus dem ASM-Diagramm in Abb. 4.7 sehen wir, dass sechs Zustände benötigt
werden. Zunächst müssen wir entsprechende Zustandscodierungen festlegen.
Wir wollen hierzu die Dualzahlen in aufsteigender Reihenfolge verwenden:
zt
Q2 Q1 Q0
z0
z1
z2
z3
z4
z5
000 001 010 011 100 101
Da die Codes 110 und 111 nicht vorkommen, können wir aus der obigen
Tabelle diejenigen Codierungen, die zu diesen beiden Codes einen HammingAbstand3 von 1 haben, weiter vereinfachen. Dies betrifft die Zustände z2 bis
z5 . Wir erhalten folgende Zustandscodierung, die gegenüber dem ersten Ansatz
durch ein einfacheres Übergangsschaltnetz g implementiert werden kann.
2
Der d e-Operator rundet auf die nächste ganze Zahl auf.
Der Hamming-Abstand gibt an, um wie viele Bit sich zwei Codes voneinander unterscheiden.
3
130
Kapitel 4. Komplexe Schaltwerke
Abbildung 4.9: Aufbau des Operationswerks für den Einsen-Zähler.
zt
Q2 Q1 Q0
z0
z1
z2
z3
z4
z5
000 001 ×10 ×11 1×0 1×1
Das × bedeutet, dass das betreffende Bit i beim Berechnen des Zustands
als Nachfolgezustand (Di ) den Wert 0 erhält, womit man Eindeutigkeit erzielt,
dass man es aber bei der Abfrage des gegenwärtigen Zustands (Qi ) nicht berücksichtigen muss, was die Gleichungen vereinfacht.
Wir gehen davon aus, dass das Steuerwerksregister aus D-Flipflops aufgebaut ist. Die Folgezustände ergeben sich durch die Belegungen an den Eingängen der D-Flipflops:
z t+1 = D2 D1 D0 (z t )
Zusammen mit Abb. 4.7 können wir nun die Schaltfunktionen für das Übergangsschaltnetz des Steuerwerks angeben.
D0 muss den Wert 1 annehmen, wenn die Folgezustände z1 , z3 oder z5 sind.
Der Zustand z1 wird erreicht, wenn sich das Schaltwerk im Zustand z0 befindet
und Start = 1 wird. Der Zustand z3 wird erreicht, wenn sich das Schaltwerk im
Zustand z2 befindet und A0 = 1 wird. Schließlich wird der Zustand z5 erreicht,
4.7. Beispiel: Einsen-Zähler
wenn im Zustand z4
131
A 6= 0 gilt. Daraus erhalten wir folgende Schaltfunktion:
D0 = z0 Start ∨ z2 A0 ∨ z4 (A 6= 0)
= Q2 Q1 Q0 Start ∨ Q1 Q0 A0 ∨ Q2 Q0 (A 6= 0)
Aus der Zustandstabelle der vorigen Seite sehen wir, dass der Zustand z2
durch die Kombination Q0 = 0 und Q1 = 1 eindeutig bestimmt ist und somit
in der Gleichung für D0 nur als Q1 Q0 auftaucht. Die Belegung von Q2 spielt für
die Definition des Zustands z2 keine Rolle. Ähnlich verfährt man im Folgenden
mit den Zuständen z3 bis z5 .
D1 muss für die Folgezustände z2 und z3 den Wert 1 annehmen, da für z4
und z5 das × mit 0 gleichgesetzt wird.
Aus Abb. 4.7 sieht man, dass z2 sich unbedingt aus z1 oder aus z4 und
gleichzeitig A 6= 0 ergibt. Der Zustand z3 wird erreicht, wenn in z2 A0 = 1 ist.
Damit erhalten wir folgende Schaltfunktion:
D1 = z1 ∨ z4 (A 6= 0) ∨ z2 A0
= Q2 Q1 Q0 ∨ Q2 Q0 (A 6= 0) ∨ Q1 Q0 A0
D2 muss nur für die Folgezustände z4 und z5 den Wert 1 annehmen, da
× für die Zustände z2 und z3 auf 0 gesetzt wird. Der Zustand z4 ergibt sich,
wenn in z2 A0 = 0 ist, oder unbedingt aus z3 . Der Zustand z5 wird schließlich
erreicht, wenn in z4 (A 6= 0) = 0 ist. Damit folgt:
D2 = z2 A0 ∨ z3 ∨ z4 (A 6= 0)
= Q1 Q0 A0 ∨ Q1 Q0 ∨ Q2 Q0 (A 6= 0)
Die o.g. Schaltfunktionen des Übergangsschaltnetzes definieren die Abfolge
der Zustände in Abhängigkeit der vom Operationswerk gelieferten Statusbits.
Um die Steuersignale für das Operationswerk zu gewinnen, benötigen wir noch
ein Ausgangsschaltnetz f . Dieses Schaltnetz wird durch folgende Schaltfunktionen bestimmt:
mA
sA
sK
mK
sF
mF
=
=
=
=
=
=
z4 = Q2 Q0
z1 ∨ z4 = Q2 Q1 Q0 ∨ Q2 Q0
z1 ∨ z3 = Q2 Q0
z3 = Q1 Q0
z0 ∨ z5 = Q2 Q1 Q0 ∨ Q2 Q0
z5 = Q2 Q0
Selbsttestaufgabe 4.5 (Nutzung von Schiebe– und Zählregistern) Für das Register A könnte ein Schieberegister genutzt werden, womit man sich das Schaltnetz zum Rechtsschieben und den Multiplexer sparen kann. Das Register K kann
132
Kapitel 4. Komplexe Schaltwerke
als Zählregister mit integriertem Inkrementierer realisiert werden. Argumentieren Sie, warum sich die Anzahl der Steuersignale bei dieser Optimierung des
Schaltwerks nicht ändert.
Lösung auf Seite 138
4.7.5
Moore-Steuerwerk mit Hot-one-Codierung
Die Zuordnung von bestimmten Zustandscodes kann entfallen, wenn man für
jeden Zustand ein einzelnes D-Flipflop vorsieht. Die Schaltfunktionen für die
Eingänge dieser Flipflops können direkt aus dem ASM-Diagramm abgelesen
werden:
D0
D1
D2
D3
D4
D5
=
=
=
=
=
=
Q0 Start ∨ Q5 ∨ Q5 Q4 Q3 Q2 Q1 Q0
Q0 Start
Q1 ∨ Q4 (A 6= 0)
Q2 A0
Q2 A0 ∨ Q3
Q4 (A 6= 0)
Wir gehen normal davon aus, dass alle Flipflops beim Einschalten der Betriebsspannung durch eine entsprechende Power-on-Schaltung auf 0 zurückgesetzt werden. Bei einer binären Zustandscodierung gelangt das Steuerwerk
so in den Zustand 0. Damit das Steuerwerk bei Hot-one-Codierung nach dem
Einschalten sicher in den Zustand 0 gelangt, muss Q0 gesetzt werden. Hierzu
muss in der Schaltfunktion für D0 der Term Q5 Q4 Q3 Q2 Q1 Q0 aufgenommen
werden.
Die Steuersignale für die Multiplexer im Operationswerk können direkt an
den Flipflopausgängen abgenommen werden, zur Bestimmung der RegisterEnable-Signale wird je ein ODER-Schaltglied benötigt.
mK
mA
mF
sK
sA
sF
4.7.6
=
=
=
=
=
=
Q3
Q4
Q5
Q1 ∨ Q3
Q1 ∨ Q4
Q0 ∨ Q5
Mealy-Steuerwerk als konventionelles Schaltwerk
Die Schaltfunktionen für das Mealy-Steuerwerk können wir wie im vorangehenden Abschnitt herleiten. Im ASM-Diagramm nach Abb. 4.8 gibt es nur vier
4.7. Beispiel: Einsen-Zähler
133
Zustände, so dass wir mit einem 2-Bit-Zustandsregister auskommen. Der Zustandsvektor wird wie folgt codiert:
zt
Q1 Q0
z0 z1 z2 z3
00 01 10 11
Wir gehen wieder davon aus, dass das Steuerwerksregister aus D-Flipflops
aufgebaut ist. Die Folgezustände ergeben sich durch die Belegungen an den
Eingängen der D-Flipflops:
z t+1 = D1 D0 (z t )
D0 muss den Wert 1 annehmen, wenn der Folgezustand z1 oder z3 ist. z1
erreicht man aus dem Zustand z0 , wenn Start = 1 ist, z3 aus dem Zustand z2 ,
wenn (A 6= 0) ist4 . Damit erhalten wir:
D0 = z0 Start ∨ z2 (A 6= 0)
= Q1 Q0 Start ∨ Q1 Q0 (A 6= 0)
D1 muss den Wert 1 annehmen, wenn der Folgezustand z2 oder z3 ist. z2
erreicht man aus dem Zustand z1 oder aus dem Zustand z2 , wenn (A 6= 0) ist.
z3 erhalten wir aus dem Zustand z2 , wenn (A 6= 0) gilt. Damit folgt:
D1 = z1 ∨ z2 (A 6= 0) ∨ z2 (A 6= 0)
= z1 ∨ z2
= Q1 Q0 ∨ Q1 Q0
Nachdem die Schaltfunktionen für das Übergangsschaltnetz g vorliegen,
müssen noch die Schaltfunktionen für die Steuersignale des Operationswerks
bestimmt werden (Ausgangsschaltnetz f ):
mA
sA
sK
mK
mF
sF
4
=
=
=
=
=
=
z2 (A 6= 0) = Q1 Q0 (A 6= 0)
z1 ∨ z2 (A 6= 0) = Q1 Q0 ∨ Q1 Q0 (A 6= 0)
z1 ∨ z2 A0 = Q1 Q0 ∨ Q1 Q0 A0
z2 A0 = Q1 Q0 A0
z3 = Q1 Q0
z0 ∨ z3 = Q1 Q0 ∨ Q1 Q0
Wenn man unsicher ist und ausführlich verfahren will, erstellt man zunächst aus dem
ASM-Diagramm den Zustandsgraph des Steuerwerks und leitet die Zustandsfolgetabelle ab.
Aus dieser ergeben sich ebenfalls die Gleichungen.
134
Kapitel 4. Komplexe Schaltwerke
4.7.7
Mealy-Steuerwerk mit Hot-one-Codierung
Durch die Hot-one-Codierung kann der Entwurf erleichtert werden. Die vier
Zustände werden dazu wie folgt codiert:
zt
Q3 Q2 Q1 Q0
z0
z1
z2
z3
0001 0010 0100 1000
Mit Hilfe von Abb. 4.8 erhalten wir folgende Schaltfunktionen für die FlipflopEingänge:
D0
D1
D2
D3
=
=
=
=
Q0 Start ∨ Q3 ∨ Q3 Q2 Q1 Q0
Q0 Start
Q1 ∨ Q2 (A 6= 0)
Q2 (A 6= 0)
Man beachte, dass der letzte Term in der Gleichung für D0 wieder zur Initialisierung nötig ist. Die Schaltfunktionen für das Ausgangsschaltnetz lauten:
mA
sA
sK
mK
mF
sF
=
=
=
=
=
=
Q2 (A 6= 0)
Q1 ∨ Q2 (A 6= 0)
Q1 ∨ Q2 A0
Q2 A0
Q3
Q0 ∨ Q3
Man sieht an den Gleichungen deutlich den Unterschied zwischen Moore–
und Mealy-Steuerwerk: in letzterem wirken die Status-Signale, die Eingangssignale des Steuerwerks bilden, direkt auf die Ausgangssignale des Steuerwerks, d.h. die Steuersignale. Im Moore-Steuerwerk sind die Ausgangssignale
des Steuerwerks nur vom aktuellen Zustand abhängig. Damit ist das MealySteuerwerk tatsächlich ein Mealy-Automat, und das Moore-Steuerwerk tatsächlich ein Moore-Automat.
4.7.8
Mikroprogrammierte Steuerwerke
Im Folgenden werden für die Moore- und Mealy-Variante mikroprogrammierte
Steuerwerke vorgestellt. Um die Kapazität des Mikroprogrammspeichers optimal zu nutzen, sollten die ASM-Blöcke nur höchstens zwei Ausgänge (Folgezustände) haben. Das bedeutet, dass wir auch nur zwischen zwei möglichen Folgezustandsvektoren unterscheiden müssen. Im Mikroprogrammsteuerwerk ist dies
durch einen 2:1-Multiplexer mit der Wortbreite des Zustandsvektors realisiert.
4.7. Beispiel: Einsen-Zähler
Dieser Multiplexer wird durch ein Schaltnetz zur Abfrage der jeweiligen Testbedingung angesteuert. Eine Testbedingung wird über je ein AND-Schaltglied
abgefragt, indem der zweite Eingang über eine Steuerleitung des Mikroprogrammspeichers aktiviert wird. Je nach Ergebnis dieses Tests wird dann aus
einer Spalte des Mikroprogrammspeichers die Folgeadresse für das Zustandsregister ausgewählt. Parallel zur Erzeugung der Folgeadressen werden aus den
Wortleitungen, die direkt den Zuständen zugeordnet sind5 , die Steuersignale
für das Operationswerk abgeleitet.
In Abb. 4.10 ist das Mikroprogrammsteuerwerk für die Moore-Variante dargestellt. Diese Lösung ist sehr ähnlich zu der Hot-one-Codierung aus 4.7.5.
Dies gilt auch beim Mikroprogrammsteuerwerk für die Mealy-Variante, das in
Abb. 4.11 zu sehen ist. Auch dort können die Zustands- und Ausgangsschaltfunktionen direkt aus den Gleichungen aus Abschnitt 4.7.7 entnommen werden.
Abbildung 4.10: Mikroprogrammsteuerwerk der Moore-Variante.
Abbildung 4.11: Mikroprogrammsteuerwerk der Mealy-Variante.
5
Eine Optimierung der Zustandscodierung wie in 4.7.4 ist nicht erforderlich, da der Adressdecoder des Mikroprogrammspeichers alle Minterme der Adressen (Zustände) ermittelt.
135
136
universelles
Operationswerk
Kapitel 4. Komplexe Schaltwerke
Zur Realisierung des Einsen-Zählers“ haben wir ein speziell auf die Pro”
blemstellung abgestimmtes Operationswerk verwendet. Neben solchen anwendungsspezifischen Operationswerken kann man jedoch auch universell verwendbare Operationswerke konstruieren, die für viele verschiedene Problemstellungen eingesetzt werden können. Zur Lösung einer bestimmten Aufgabe mit Hilfe
eines universellen Operationswerks müssen nur genügend“ viele Register und
”
Funktionsschaltnetze für nützliche“ Operationen vorhanden sein. Da im all”
gemeinen nicht alle vorhandenen Komponenten vom Hardware-Algorithmus
ausgenutzt werden, enthält ein universelles Operationswerk gegenüber einem
anwendungsspezifischen Operationswerk stets ein gewisses Maß an Redundanz.
Dafür eignet es sich jedoch sehr gut zur Realisierung von Computern.
Selbsttestaufgabe 4.6 (Modulo-X-Zähler)
Entwerfen Sie ASM-Diagramm und Operationswerk für einen Modulo-XZähler. Der Wert soll über den Eingabevektor X vorgegeben werden, der im
ersten Takt eingelesen wird, und beträgt maximal 1023 sowie minimal 2. Der
Zähler soll beim Wert 0 starten. Die Zählerstände sollen in einem Register A
gespeichert werden, das direkt mit dem Ausgabevektor Y verbunden ist. Zur
Bestimmung des Statusvektors steht ein Vergleicher mit den Eingängen A und
B zur Verfügung, der an seinem Ausgang A < B eine 1 ausgibt, sobald der
Wert an A kleiner als B ist. Außerdem seien ein Addierschaltnetz und ein
Subtrahierschaltnetz der benötigten Wortbreite vorhanden.
1. Wie groß ist die benötigte Wortbreite?
2. Skizzieren Sie das ASM-Diagramm!
3. Skizzieren Sie das Operationswerk!
4. In welchem Zustand nimmt Register A seinen maximalen Wert an?
Lösung auf Seite 138
4.8
Zusammenfassung
Nach dem Durcharbeiten dieses Kapitels sollten Sie
• den Aufbau und die Funktionsweise komplexer Schaltwerke verstanden
haben,
• Hardware-Algorithmen für komplexe Problemstellungen formulieren und
daraus komplexe Schaltwerke ableiten können.
4.9. Lösungen der Selbsttestaufgaben
4.9
137
Lösungen der Selbsttestaufgaben
Selbsttestaufgabe 4.1 von Seite 121
Die bedingte Ausgangsbox wird nur aktiviert, wenn sie auf einem Pfad durch
vorgelagerte Entscheidungsboxen erreicht wird. D.h. das Schreibsignal (Teil des
Steuervektors) des Registers der Variablen, die auf der linken Seite der Zuweisung in der bedingten Ausgangsbox steht, wird nur bei bestimmten Werten des
Statusvektors (der die Ergebnisse der Entscheidungsboxen enthält) aktiviert.
Der Steuervektor ist die Ausgabe des Automaten im Steuerwerk, der Statusvektor stellt die Eingabe dar. Damit ist in dem Automaten des Steuerwerks die
Ausgabe abhängig von der Eingabe. Dies erfordert einen Mealy-Automaten, da
bei einem Moore-Automaten die Ausgabe nur vom Zustand, nicht aber von der
Eingabe abhängig ist.
Selbsttestaufgabe 4.2 von Seite 122
Für jeden Wert von A wird z2 als Folgezustand gewählt. Solange B > 0 ist,
besteht kein Konflikt. Sobald aber B ≤ 0 wird, werden gleichzeitig z2 und z3 als
Folgezustände ausgewählt. Damit wird gegen die angegebene Regel verstoßen.
Selbsttestaufgabe 4.3 von Seite 124
Der Aufbau des Operationswerks ist in Abb. 4.12 dargestellt. Da das Register
R2 bei S = 1 nicht verändert werden darf, muss der Takt durch ein AND–
Schaltglied maskiert“ werden. Der Takt wird nur für S = 0 an R2 weiterge”
leitet. In diesem Fall übernimmt das Register R2 den Inhalt von Register R1 .
Gleichzeitig wird über den Multiplexer vor R1 das Register R2 zum Einspeichern in R1 ausgewählt. Für S = 1 wird die Summe von R1 und R2 ausgewählt
und von R1 übernommen.
+
0
1
Takt
S
R1
R2
&
Abbildung 4.12: Aufbau des Operationswerks
138
Lösungen der Selbsttestaufgaben
Selbsttestaufgabe 4.4 von Seite 126
In Abb. 4.13 ist der Aufbau der Schaltnetzlösung für 6 Bit dargestellt. Wenn wir
mit zwei dieser Modulen einen 12-Bit-Vektor auswerten, erhalten wir an den
Modul-Ausgängen zwei 3-Bit-Wörter. Diese müssen mit einem 4-Bit-Addierschaltnetz aufsummiert werden, damit das größtmögliche Ergebnis 12 (=0Chex )
dargestellt werden kann.
Bit 0
Bit 1
b0
b1
Bit 4
Bit 5
Y
C0
VA S
C1
S1
Ci
Bit 2
Bit 3
X
b2
b3
X
C0
Summe 2
Y
VA S
Summe 1
Ci
X
C0
Y
VA S
C0
S0
X
C0
Y
VA S
C0
Summe 0
Ci
Abbildung 4.13: Aufbau eines Schaltnetzes zum Zählen von Einsen in einem
6-Bit-Wort.
Selbsttestaufgabe 4.5 von Seite 131
Nutzt man ein ladbares Schieberegister, so entfällt zwar der Multiplexer, trotzdem muss aber zwischen den Fällen: Laden, Schieben, nichts tun unterschieden
werden, wozu (mindestens) zwei Steuersignale notwendig sind, da mit einem
Steuersignal nur 2 Fälle unterschieden werden können. Ähnlich verhält es sich
mit dem Zählregister. Auch hier sind die drei Fälle: Laden, Zählen, nichts tun
zu unterscheiden.
Selbsttestaufgabe 4.6 von Seite 136
1. Die benötigte Wortbreite beträgt 10 Bit, da 29 ≤ 1023 < 210 .
2. Siehe linke Seite von Abb. 4.14.
3. Siehe rechte Seite von Abb. 4.14. Über die Steuerleitung MA kann die
Zuweisungsquelle an A gewählt werden. Mit SB = 1 kann man B nur
im Zustand Z0 den um Eins verringerten Wert des Eingabevektors X
zuweisen. In den anderen Zustängen ist SB = 0.
Lösungen der Selbsttestaufgaben
Abbildung 4.14: ASM-Diagramm und Operationswerk zum Modulo-X-Zähler.
4. Damit A z.B. Werte von 0 bis 1022 annimmt (X = 1023, also B = 1022),
muss die Abfrage A < B lauten. Beim ersten Erreichen des Zustands Z2
hat A den Wert 1. Hat A beim wiederholten Erreichen von Z2 den Wert
1022 (Maximalwert), dann schlägt der Vergleich erstmalig fehl und es wird
in den Rücksetzzustand Z0 verzweigt. Beim Eintritt in den Rücksetzzustand gilt noch A = 1022. Dort wird am Ende des Taktzyklus wieder auf
0 zurückgesetzt.
139
140
Lösungen der Selbsttestaufgaben
Kapitel 5
Aufbau und Funktionsweise eines
Computers
Kapitelinhalt
5.1
Erweiterung komplexer Schaltwerke . . . . . . . . . . . . . 142
5.2
Komponenten eines Computers . . . . . . . . . . . . . . . . 143
5.3
Interne und externe Busse . . . . . . . . . . . . . . . . . . . 150
5.4
Prozessorregister . . . . . . . . . . . . . . . . . . . . . . . . 152
5.5
Anwendungen eines Stapelzeigers . . . . . . . . . . . . . . . 154
5.6
Rechenwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
5.7
Leitwerk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
5.8
Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . 174
5.9
Lösungen der Selbsttestaufgaben . . . . . . . . . . . . . . . 175
141
142
Kapitel 5. Aufbau und Funktionsweise eines Computers
Das folgende Kapitel beschreibt die grundlegenden Komponenten eines Computers und erläutert ihr Zusammenspiel bei der Abarbeitung von Maschinenprogrammen. Zunächst wird in das Operationsprinzip des von Neumann-Computers
eingeführt. Dieses ergibt sich aus einer Verallgemeinerung der komplexen Schaltwerke, die wir im letzten Kapitel kennengelernt haben. Das Operationsprinzip
des von Neumann-Computers basiert auf der Einführung von Maschinenbefehlen, die in einem Speicher abgelegt sind und die nacheinander von einem Prozessor ausgeführt werden. Der Prozessor besteht aus einem Rechen- und Leitwerk,
die das komplexe Schaltwerk bilden. Zur Steuerung des Befehlsablaufs dient ein
Programmzähler-Register. Weitere Prozessor-interne Speicher sind die Daten, Adress- und das Statusregister, die für den Zugriff auf die Operanden bzw.
zur Steuerung des Programmflusses benötigt werden. Das Rechenwerk enthält
neben den Datenregistern Schaltnetze für logische und arithmetische Operationen. Bei der Betrachtung des Leitwerkes beschränken wir uns in diesem Kapitel
auf Mikroprogramm-Steuerwerke, die Befehle in mehreren Taktzyklen umsetzen. Im Kurs Computersysteme 2 werden wir noch andere Möglichkeiten zur
Steuerung des Rechenwerks kennenlernen. Zum Schluss dieses Kapitels gehen
wir dann noch kurz auf Realisierungsformen von Speichern ein. Die Speicherorganisation heutiger Computer wird am Ende des Kurses Computersysteme 2
ausführlich behandelt.
5.1
Erweiterung komplexer Schaltwerke
In Kapitel 4 haben wir gesehen, dass beim komplexen Schaltwerk (nach der
Eingabe der Operanden) immer nur ein einziger Steueralgorithmus aktiviert
wird. Ein Computer entsteht aus der Erweiterung eines komplexen Schaltwerks
durch mehrere Steueralgorithmen für sogenannte Befehle (instructions) und
einen Registerblock, um die Operanden dafür vorzuhalten.
Opcode
Speicher
Angenommen, wir hätten Steueralgorithmen für die vier Grundrechenarten auf einem universellen Operationswerk entwickelt, das lediglich über einen
Dual-Addierer verfügt. Durch eine Verkettung der einzelnen Steueralgorithmen
könnten wir nun einen übergeordneten Algorithmus realisieren, der die Grundrechenarten als Operatoren benötigt. Die über Steueralgorithmen realisierten
Operationen können durch Operationscodes (kurz Opcode), z.B. die dualen
Darstellungen der Zahlen 0 bis 3, ausgewählt werden und stellen – zusammen
mit Adressinformationen für die Auswahl der Operanden – dem Programmierer
Maschinenbefehle bereit, die er in einem Programm benutzen kann.
Die zentrale Idee eines Computers besteht nun darin, die Befehle in einem
Speicher abzulegen und sie vor der Ausführung durch das Steuerwerk selbst
holen zu lassen. Es benötigt ein Befehlsregister für die Befehle (Opcodes plus
Operandenadressen) und einen Befehlszähler für die Adressierung dieser Befehle im Speicher. Man bezeichnet ein solches Steuerwerk als Leitwerk. Ein
universelles Operationswerk, das neben einer ALU auch einen Registerblock
5.2. Komponenten eines Computers
enthält, nennt man Rechenwerk.
Leitwerk und Rechenwerk bilden den Prozessor oder die CPU (Central Pro- Prozessor
cessing Unit). Damit der Prozessor nicht nur interne Berechnungen ausführen
kann, können im Speicher auch Daten abgelegt werden. Diese werden dann über
sogenannte Lade- und Speicher-Befehle (load, store instructions) in bzw. aus
dem Registerblock übertragen. Damit auch von außen (Benutzer-)Daten einbzw. ausgegeben werden können, benötigt ein Computer eine Schnittstelle zur
Umgebung, die als Ein-/Ausgabe bezeichnet wird.
Ein-/Ausgabe
5.2
Komponenten eines Computers
Wir unterscheiden also insgesamt vier Funktionseinheiten: Rechenwerk, Leitwerk, Speicher und Ein-/Ausgabe. Das Blockschaltbild in Abb. 5.1 zeigt, wie die
einzelnen Komponenten miteinander verbunden sind. Die Verbindungen wurden entsprechend ihrer Nutzung gekennzeichnet. Hierbei steht D für Daten, B
für Befehle, A für Adressen und S für Steuersignale. Die Zahl der Datenleitungen bestimmt die Maschinenwortbreite eines Prozessors, die von der jeweiligen
Anwendung abhängt. Während Desktop-Prozessoren heute meist 64 Bit Wortbreite haben, findet man bei eingebetteten Systemen oft nur Prozessoren mit
8 oder 16 Bit Wortbreite.
Der Zeitpunkt der Erfindung des ersten Computers wird weltweit diskutiert
und es ist äußerst schwierig, die Urheberschaft einer einzigen Person zuzuordnen. Ohne Zweifel sind in diesem Zusammenhang John V. Atanasoff (mit Clifford Berry), Charles Babbage, John von Neumann, Alan Turing und Konrad
Zuse (in alphabetischer Reihenfolge) zu nennen.
Im Folgenden werden wir zunächst die o.g. Komponenten und deren grundlegende Funktionsweise beschreiben. Die Darstellung entspricht im Wesentlichen dem Modell, das John von Neumann vorgeschlagen hat. Im Anschluss
an die Beschreibung der Grundlagen werden dann Modifikationen vorgestellt,
die sowohl die Implementierung als auch die Programmierung eines Computers
vereinfachen. Danach wird ausführlicher auf den Aufbau von Rechen-, Leitwerk
und Speicher eingegangen.
5.2.1
Rechenwerk
Ein Rechenwerk stellt ein universelles Operationswerk dar, das elementare arithmetische und logische Operationen beherrscht und über mehrere Register verfügt. Diese Register werden durch Adressen ausgewählt und nehmen die Operanden (Variablen oder Konstanten) auf, die miteinander verknüpft werden
sollen. Die ALU kann jeweils zwei Registerinhalte arithmetisch oder logisch
143
144
Kapitel 5. Aufbau und Funktionsweise eines Computers
Leitwerk
A
Befehlszähler (PC)
B
Befehlsregister (IR)
Opcode
Adressfeld
A
Ablaufsteuerung
Holen
S
Ausführen
S
D
ALU
Status
D
Registerblock
Rechenwerk
S
Shifter
Speicher
D/B
Befehl
Befehl
Datum
Datum
Befehl
Datum
Befehl
Befehl
A
D
S
Ein-/Ausgabe
D
A
Register
S
Peripheriegeräte
Abbildung 5.1: Blockschaltbild eines Computers.
Status-Flags
miteinander verknüpfen. Die Art der Verknüpfung wird durch ein Steuerwort
bestimmt und das Ergebnis wird wieder in ein Register des Registerblocks zurückgeschrieben. Meist ist auch eine Schiebeeinrichtung (Shifter) vorhanden,
mit der die Datenbits um eine oder mehrere Stellen nach links oder rechts verschoben werden können. Der Shifter ist besonders nützlich, wenn zwei binäre
Zahlen multipliziert oder dividiert werden sollen und die ALU nur addieren
kann. Das Statusregister dient zur Erfassung besonderer Ergebnisse, die das
Leitwerk auswertet, um bedingte Verzweigungen in Steueralgorithmen für Be-
5.2. Komponenten eines Computers
145
fehle auszuführen. Die einzelnen Bits des Statusregisters bezeichnet man als
Flags. Das Statusregister kann meist wie ein normales (Daten-)Register gelesen
und beschrieben werden.
5.2.2
Leitwerk
Das Leitwerk stellt ein umschaltbares Steuerwerk dar, das – gesteuert durch
den Operationscode (Opcode) der Befehle – die zugehörigen Steueralgorithmen
auswählt. Es steuert den Programmablauf, indem es Befehle aus dem Speicher
holt, im Befehlsregister IR (Instruction Register) speichert und die einzelnen Befehlsregister
Operationscodes in eine Folge von Steuerwörtern (Steueralgorithmus) umsetzt.
Es arbeitet zyklisch, d.h. die Holephase (fetch) und die Ausführungsphase (execute) wiederholen sich ständig (Abb. 5.2). Der Befehlszähler PC (Program Befehlszähler
Counter) wird benötigt, um im Speicher die Befehle und – bei dem hier behandelten Grundprinzip – auch deren Operanden zu adressieren. Während der
Holephase zeigt sein Inhalt auf den Maschinenbefehl, der vom Speicher in das
Befehlsregister geladen und anschließend ausgeführt wird. Nachdem ein neuer
Maschinenbefehl geholt wurde, wird der Befehlszähler erhöht.
Reset
Initialisiere Prozessor(-register):
z. B. Programmzähler
PC
XXXX
Wiederhole, solange Betriebsspannung vorhanden
Hole Operationscode:
IR
M[PC++]
HolePhase
Wiederhole bis Operanden vollständig
BefehlsZyklus
Operand bzw. Operandenadresse
M[PC++]
Operation gemäß Opcode
Verknüpfung
AusführungsPhase
Transfer
Rechenwerksregister
ändern
Register
externer
Speicher
Verzweigung
PC ändern
Abbildung 5.2: Befehlsabarbeitung durch das Leitwerk. Das Nachladen von
Operanden nach dem Holen des Befehls ist nur bei Mehr-Wort-Befehlen notwendig, s. Seite 149, und kann beim ersten Durchlesen ignoriert werden.
Wie man in Abb. 5.2 sieht, wird ein Befehl in zwei Teilschritten abgearbeitet. Die Holephase ist für alle Befehle gleich. Die Ausführungsphase kann eine
variable oder feste Anzahl von Taktschritten umfassen. Wir werden im Kurs
Computersysteme 2 Beispiele für verschiedene Implementierungsvarianten von
146
Kapitel 5. Aufbau und Funktionsweise eines Computers
Prozessoren kennenlernen. Der Abb. 5.2 entnimmt man, dass ein Prozessor im
Wesentlichen drei Befehlsarten unterstützt: Verknüpfungs-, Datentransfer- und
Verzweigungsbefehle. Im Folgenden geben wir jeweils die notwendigen Verarbeitungsschritte für die Maschinenbefehle aus diesen Klassen an. Es wird davon
ausgegangen, dass der Befehl bereits geholt wurde und während der Ausführungsphase im Befehlsregister gespeichert bleibt. Danach wird unter der P CAdresse der nächste Befehl geholt, und dieser Zyklus wiederholt sich, solange
der Prozessor mit Betriebsspannung versorgt wird1 .
1. Verknüpfung von Operanden
• Auslesen der beiden Operanden aus dem Registerblock,
• Verknüpfung in der ALU,
• Schreiben des Ergebnisses in den Registerblock.
Die Registeradressen sind Bestandteil des Maschinenbefehls und werden neben
dem Opcode in einem Adressfeld angegeben.
2. Datentransfer zwischen Speicher und Prozessor
Hier muss zwischen Lese- und Schreibzugriffen unterschieden werden:
a) Lesen (load)
• Bestimmung der Speicheradresse des Quelloperanden,
• Lesezugriff auf den Speicher (Speicheradresse ausgeben),
• Speichern des gelesenen Datums in das Zielregister.
b) Schreiben (store)
• Bestimmung der Speicheradresse des Zieloperanden,
• gleichzeitig kann der Inhalt des Quellregisters ausgelesen werden,
• Schreibzugriff auf den Speicher (Speicheradresse und Datum ausgeben
und Datum speichern).
Die Speicheradresse wird häufig als Summe eines Registerinhalts (Indexregister ) und einer konstanten Verschiebung (displacement, offset) bestimmt.
Beide Angaben sind Bestandteil des Maschinenbefehls und werden im Adressfeld (s.u.) spezifiziert.
1
Ausnahme: Bei manchen Prozessoren kann die Befehlsverarbeitung mit einem HALT Befehl gestoppt werden.
5.2. Komponenten eines Computers
147
3. Verzweigungsbefehle
Man kann in Maschinenprogrammen zwei Arten von Verzweigungen unterscheiden. Eine unbedingte Verzweigung oder Sprung (Jump) führt dazu, dass der
PC mit einem neuen Wert überschrieben wird. Der neue PC-Wert wird entweder als Operand des Sprung-Befehls direkt vorgegeben (absolute Adresse)
oder er wird berechnet, indem zum alten PC-Wert eine Adressverschiebung
(Offset) addiert wird. Da die Addition des Zweierkomplements einer Subtraktion entspricht, kann man damit auch Rückwärtssprünge ausführen. Im Fall der
Adressberechnung spricht man von PC-relativer sonst von absoluter Adressierung. Die bedingte Verzweigung (Branch) wird nur dann ausgeführt, wenn eine
im Befehl vorgegebene Bedingung erfüllt ist. Im Falle der Ausführung wird sie
analog zur unbedingten Verzweigung behandelt. Folgende Schritte werden bei
Verzweigungen ausgeführt:
• Bestimmung des neuen PC -Werts für das Verzweigungsziel,
• Prüfung der Verzweigungsbedingung (entfällt bei Sprüngen),
• bei Sprüngen immer, bei Verzweigungen bedingt: Überschreiben des PC
mit dem neuen Wert.
Damit ein Maschinenprogramm innerhalb des Adressraums beliebig verschiebbar bleibt, empfiehlt es sich, keine absolute, sondern nur PC -relative
Adressierung zuzulassen.
Selbsttestaufgabe 5.1 (PC-relative Verzweigung)
Betrachten Sie den folgenden Befehl, der eine relative Verzweigung ausführt,
wenn die beiden Register R1 und R2 den gleichen Wert haben:
Branch Relative if (R1==R2), Offset
Offset sei ein positiver oder negativer Zahlenwert. Jede Adresse des Speichers enthalte einen Maschinenbefehl. Der Maschinenbefehl soll an der Adresse
0008 stehen und im Falle gleicher Register nach 0004 verzweigen. Bestimmen
Sie den Wert des Offset.
Speicherausschnitt:
0004 Verzweigungsziel wenn (R1==R2)
0005 ...
0006 ...
0007 ...
0008 Branch_Relative_if (R1==R2), Offset
0009 ...
Lösung auf Seite 175
148
Kapitel 5. Aufbau und Funktionsweise eines Computers
Bedingte Verzweigungen können dazu benutzt werden, Schleifen der Form
do { Schleifenrumpf; R1<--R1+1; } while (R1<R2)
zu implementieren. In Selbsttestaufgabe 5.1 würden die Befehle 0004 bis 0006
den Schleifenrumpf enthalten, im Befehl 0007 würde Register R1 um 1 erhöht.
Die o.g. Teilschritte zur Befehlsausführung erfordern, abhängig vom jeweiligen Maschinenbefehl, einen oder mehrere Taktzyklen. Die Dauer einzelner
Befehle hängt stark von den unterstützten Adressierungs-Arten ab. Diese legen
fest, wie während der Befehlsausführung auf die Operanden zugegriffen wird.
Je mehr Adressierungsmöglichkeiten zur Verfügung stehen, desto kürzer werden die Maschinenprogramme. Andererseits steigen aber der Hardwareaufwand
und die Zahl der benötigten Taktzyklen zur Ausführung einzelner Befehle.
Die Implementierung eines Befehlssatzes ist umso einfacher, je gleichartiger die Teilschritte der drei Befehlsklassen sind. Wenn es schließlich gelingt
— als kleinsten gemeinsamen Nenner für alle Befehle — eine feste Zahl von
Teilschritten zu finden, wird eine Implementierung durch eine Befehlspipeline
möglich. Dabei können die Teilschritte mehrerer Befehle zeitlich überlappend
ausgeführt werden. Wie bei einem Fließband kann dadurch der Befehlsdurchsatz
erheblich gesteigert werden. Diese Philosophie wurde seit Mitte der achtziger
RISC-Prozessoren Jahre konsequent bei so genannten RISC-Prozessoren (Reduced Instruction Set
Computer) eingesetzt.
Dagegen werden Prozessoren, die einen möglichst hohen Komfort bei der
CISC-Prozessoren Programmierung in Maschinensprache bieten, als CISC-Prozessoren (Complex
Instruction Set Computer) bezeichnet. Während RISC-Prozessoren Speicherzugriffe nur mit den o.g. Load- und Store-Befehlen ermöglichen, können CISCBefehle die Operanden über vielfältige Adressierungsarten sogar direkt im Speicher ansprechen. Solche Befehle benötigen dann zwar keine expliziten Load- und
Store-Operationen, aber ihr Implementierungsaufwand ist deutlich höher. Außerdem können die Befehle wegen ihrer unterschiedlichen Länge (die Zahl der
Teilschritte ist variabel) nur nacheinander ausgeführt werden. Eine Fließbandverarbeitung wie bei RISC-Prozessoren ist daher nicht oder nur eingeschränkt
möglich.
Man findet heute in fast allen Computersystemen vorwiegend RISC-Prozessoren bzw. RISC-Kerne. Selbst Prozessoren, die eigentlich einen CISC-Befehlssatz anbieten (z.B. Intel x86) wandeln die komplexen Befehle in so genannte Micro-Ops (also Mikrobefehle) um und führen diese letztendlich auf einem
RISC-Kern aus.
Befehlsformate
Maschinenbefehle bestehen aus dem Opcode und einem Adressfeld , das entweder die Rechenwerksregister direkt adressiert, eine absolute Speicheradresse
5.2. Komponenten eines Computers
149
oder die Adresse eines Indexregister s sowie eine zusätzliche Adressverschiebung
(Offset) zu dessen Inhalt enthält.
Wenn die Operanden in Rechenwerksregistern stehen, genügt ein einziges
Maschinenwort zur Darstellung eines Befehls. Solche Ein-Wort-Befehle findet Ein-Wort-Befehle
man sowohl bei CISC- als auch bei RISC-Prozessoren, für die sie typisch sind.
Ein Ein-Wort-Befehl hat folgendes Befehlsformat:
Opcode Adressfeld
Wenn die Operanden oder Daten direkt im Speicher abgelegt sind, kann ein
Befehl aus zwei oder drei Maschinenwörtern bestehen. Man findet solche Mehr- Mehr-Wort-Befehle
Wort-Befehle ausschließlich bei CISC-Prozessoren. Ein typischer CISC-Befehl
hat z.B. folgendes Format:
Opcode Adresse 1. Operand
Adresse 2. Operand
Adresse Ergebnis
In diesem Beispiel steht der 1. Operand in einem Register, das über das Adressfeld des Befehls adressiert wird. Der 2. Operand wird aus dem Speicher geholt.
Hierzu muss zunächst dessen Adresse aus dem Speicher geladen und in ein (für
den Programmierer nicht sichtbares) Adressregister geschrieben werden. Mit
dieser Adresse erfolgt dann ein weiterer Speicherzugriff, um den 2. Operanden in ein prozessorinternes Hilfsregister zu kopieren. Dann wird die Verknüpfung gemäß dem Opcode durchgeführt und das Ergebnis in einem Hilfsregister
zwischengespeichert. Um es in den Speicher zu transportieren, muss zunächst
wieder die Speicheradresse für das Ergebnis geholt und ins (wiederum für den
Programmierer nicht sichtbare) Adressregister geladen werden. Der Speicher
wird dann über das Adressregister angesprochen und der Inhalt des Hilfsregisters in den Speicher kopiert. Wir sehen, dass ein solcher CISC-Befehl nicht
nur sehr viele Teilschritte bzw. Taktzyklen, sondern auch zusätzliche Hardware
erfordert (hier ein Hilfs- und Adressregister).
Zur symbolischen Darstellung von Maschinenbefehlen werden Abkürzungen
benutzt, die sich ein Programmierer leichter einprägen kann als eine Funktionsbeschreibung oder gar den binären Opcode eines Befehls. Ein Programm, das
aus solchen so genannten Mnemonics besteht, bezeichnet man als Assembler- Mnemonic
programm. Es kann mit Hilfe einer Entwicklungssoftware, die man Assembler Assembler
nennt, in die binäre Darstellung der Maschinenbefehle übersetzt werden. Assembler erlauben auch die Verwendung symbolischer Namen für Konstanten,
Variablen und Sprungziele.
150
Kapitel 5. Aufbau und Funktionsweise eines Computers
5.2.3
Speicher
Im Speicher eines Computers werden sowohl Maschinenbefehle als auch Daten abgelegt. Jeder Speicherplatz ist über eine binäre Adresse ansprechbar und
kann ein Maschinenwort (z.B. 32 oder 64 Bit) aufnehmen. Bei modernen Computersystemen werden verschiedene Arten von Speichern benutzt, um möglichst
geringe Kosten pro Bit und gleichzeitig hohe Zugriffsraten zu erreichen. Direkt mit dem Prozessor verbunden sind die Halbleiterspeicher, bei denen man
Schreib-/Lese-Speicher (Random Access Memory, RAM) und Nur-Lese- Speicher (Read-Only Memory, ROM) unterscheidet. Jedes Computersystem enthält
einen ROM-Speicher, in dem ein einfaches Betriebssystem (Monitor) oder kleines Urladeprogramm (Bootstrap Loader) permanent gespeichert ist. Bei den
meisten Computern wird das Betriebssystem nach dem Einschalten von einem
magnetomotorischen Speicher (Festplatte) geladen. Der Hauptspeicher wird im
Allgemeinen mit dynamischen Speicherbausteinen aufgebaut, deren Zugriffszeiten etwa um einen Faktor bis 100 größer sind als die Taktzykluszeit des Prozessors. Durch den Einbau von schnellen Pufferspeichern zwischen Prozessor und
Hauptspeicher können die Geschwindigkeitsverluste bei Speicherzugriffen verringert werden. Diese Cache-Speicher halten häufig benötigte Speicherblöcke
aus dem Hauptspeicher für den Prozessor bereit.
5.2.4
Ein-/Ausgabe
Die Ein-/Ausgabe dient als Schnittstelle eines Computersystems zur Umwelt.
Sie verbindet Peripheriegeräte wie z.B. Tastatur, Monitor oder Drucker mit dem
Prozessor. Durch direkten Speicherzugriff (Direct Memory Access, DMA) oder
einen Ein-/Ausgabe-Prozessor (Input/Output Processor, IOP) kann die CPU
bei der Übertragung großer Datenblöcke entlastet werden. Die Ein-/Ausgabe
erfolgt dann ohne zeitraubende Umwege über das Rechenwerk des Prozessors
unmittelbar zwischen der Ein-/Ausgabe und dem Hauptspeicher. Dies ist besonders beim Anschluss von Festplatten wichtig, damit z.B. Daten von der
Festplatten-Steuereinheit (Controller) ohne unnötige Zeitverzögerung abgeholt
werden.
Die hier skizzierten Komponenten eines Computers finden sich bis heute
bei integrierten Prozessoren (Mikroprozessoren) wieder. Im Laufe der technologischen Entwicklung wurden jedoch Modifikationen bzw. Erweiterungen vorgenommen, um die Implementierung zu vereinfachen, die Leistung zu erhöhen
und die Programmierung zu erleichtern. Diese Maßnahmen werden im Folgenden vorgestellt.
5.3
Interne und externe Busse
Wir können die Zahl der Verbindungsleitungen für die Übertragung von Daten bzw. Befehlen nach Abb. 5.1 reduzieren, wenn wir einen Datenbus einfüh-
5.3. Interne und externe Busse
151
ren. Ein Bus besteht aus einem Bündel von Leitungen, die alle dem gleichen
Zweck dienen. Durch die zeitlich versetzte Nutzung (Zeitmultiplex) werden die
vorhandenen Leitungen besser ausgelastet. Dadurch kann die Gesamtzahl der
Leitungen reduziert werden. Mit Hilfe von Adress- und Steuerleitungen, die
Bustreiber (z.B. TriState) oder elektronische Schalter (CMOS2 -Transmission
Gates) ansteuern, können Datenpfade in zwei Richtungen (bidirektional) geschaltet werden. Der interne Datenbus ist im Allgemeinen auf die Maschinenwortbreite ausgelegt und kann von zwei verschiedenen Datenquellen angesteuert
werden (Abb. 5.3): mögliche Quellen sind die Rechenwerksregister und der externe Datenbus. Um die Zahl der Anschlusskontakte (Pins) eines Prozessorchips
zu minimieren, ist der externe Datenbus jedoch nicht immer auf die volle Maschinenwortbreite ausgelegt. So verfügt z.B. der Motorola 68008 über einen
internen Datenbus mit 32 Bit und einen externen Datenbus mit nur 8 Bit. Dem
geringeren Verdrahtungsaufwand steht jedoch ein Verlust an Übertragungsgeschwindigkeit (Busbandbreite) gegenüber. Der externe Datenbus wird über
bidirektionale Bustreiber an den internen Datenbus angekoppelt.
Prozessor
interner
Datenbus
externer Adressbus
Leitwerk
externer Steuerbus
interner
Adressbus
interner
Steuerbus
Speicher
Ein-/Ausgabe
Peripheriegeräte
Rechenwerk
externer Datenbus
Abbildung 5.3: Interne und externe Busse erleichtern die Realisierung eines
Prozessors.
Das Leitwerk versorgt das Rechenwerk mit Adressleitungen für die Register.
Die internen Steuerleitungen bilden zusammen mit den Zustandsflags des Rechenwerks den internen Steuerbus. Über Bustreiber werden die Steuersignale
und Adressen für das externe Bussystem verstärkt. Dies ist nötig, damit eine große Zahl von Speicher- und Ein-/Ausgabe-Bausteinen angeschlossen werden kann. Die Bustreiber wirken als Leistungsverstärker und erhöhen die Zahl
der anschließbaren Schaltglieder. Der Ausgang eines TriState-Bustreibers hat
wie sein Eingang entweder die logische Belegung 0 oder 1, oder er befindet
sich im hochohmigen Zustand, d.h. der Ausgang ist (wie durch einen geöffneten Schalter) von der Busleitung abgekoppelt. Dieser (dritte) Betriebszustand
2
Complementary Metal Oxide Semiconductor.
152
Kapitel 5. Aufbau und Funktionsweise eines Computers
kann über eine zusätzliche Steuervariable ausgewählt werden. Die bidirektionalen Bustreiber, mit denen die Speicher- und Ein-/Ausgabe-Bausteine an den
externen Datenbus angeschlossen sind, werden durch die (externen) Steuer- und
Adressleitungen geschaltet. Die Richtung der Datenübertragung wird mit einer
R/W -Steuerleitung (1 für Read/0 für Write) bestimmt.
Jeder externe Baustein wird durch eine Adresse bzw. innerhalb eines Adressbereichs angesprochen. Die Bustreiber-Ausgänge in Richtung Datenbus dürfen
unter einer bestimmten Adresse nur bei einem einzigen externen Baustein aktiviert werden. Die hierzu erforderliche Adressdecodierung übernimmt ein besonderes Vergleicher-Schaltnetz. Bei älteren Prozessoren wurde durch eine Steuerleitung I/O (Input/Output) zwischen einer Adresse für die Ein-/Ausgabe
und Adressen für den Hauptspeicher unterschieden. Man kann aber die Ein/Ausgabe auch wie einen Speicher bzw. -bereich behandeln. Dieses Verfahren
wird als Memory-Mapped Input/Output bezeichnet und ist heute gebräuchlich.
Systembus
Durch die Einführung interner und externer Busse wird die Realisierung von
Mikrochips und deren Einsatz zum Aufbau von Computersystemen erleichtert.
Die Gesamtheit von externem Adress-, Daten- und Steuerbus wird auch Systembus oder Systembusschnittstelle genannt. Wegen des geringeren Verdrahtungsaufwands ist es einfacher, den Schaltplan zu entflechten und ein Chipoder Leiterplattenlayout zu erstellen. Ein weiterer Vorteil ist die geringere Zahl
von Anschlüssen bei Prozessoren, Speicher- und Ein-/Ausgabe-Bausteinen.
5.4
Prozessorregister
Die in einem Prozessor enthaltenen Register können in drei Klassen eingeteilt
werden:
1. Datenregister zur Aufnahme von Operanden und zur Speicherung von
Ergebnissen,
2. Adressregister zur Adressierung von Operanden,
3. Steuerregister, die den Ablauf der Befehlsverarbeitung steuern und besondere Programmiertechniken unterstützen.
Die Datenregister dienen zur kurzzeitigen Speicherung von Variablen oder Konstanten eines Programms. Da die Datenregister im Gegensatz zum Hauptspeicher ohne zusätzliche Zeitverzögerungen benutzt werden können, ist es ratsam,
häufig benötigte Operanden in Datenregistern zu halten, die Ergebnisse zu berechnen und dann in den Hauptspeicher zurückzuschreiben.
Zum Zugriff auf Operanden im Hauptspeicher kann nach dem oben eingeführten Operationsprinzip der Programmzähler als Adresse benutzt werden.
5.4. Prozessorregister
153
Damit können aber nur diejenigen Speicherplätze adressiert werden, die unmittelbar auf einen Maschinenbefehl folgen. Um Operanden überall im Hauptspeicher ablegen zu können, verwendet man daher Adressregister. Die verschiedenen Adressierungsarten, die man in Verbindung mit Adressregistern realisieren
kann, werden später im Kurs Computersysteme 2 vorgestellt. Bei den meisten heutigen Prozessoren kann jedes Register aus dem Registerblock sowohl als
Daten- als auch Adressregister verwendet werden.
Selbsttestaufgabe 5.2 (Indexregister)
Ein Indexregister kann dazu benutzt werden, um einen ganzen Speicherbereich
zu durchlaufen“: Zunächst enthält das Indexregister die Anfangsadresse des
”
Speicherbereichs, so dass mittels eines Lade-Befehls und Adressierung mittels
Indexregister plus Offset 0 der Inhalt der ersten Speicherzelle des Bereichs in
ein Register geladen werden kann. Wird das Indexregister um 1 erhöht, so lädt
der nächste Lade-Befehl den Inhalt der zweiten Speicherzelle des Bereichs in
ein Register, usw. Wir erweitern die Schleife aus Selbsttestaufgabe 5.1 wie folgt,
um die Inhalte des Speicherbereichs aufzuaddieren. Die Befehle 0000 bis 0003
besetzen die benutzten Register mit Werten (Verknüpfungsbefehle), die Befehle
0004 bis 0006 enthalten den Schleifenrumpf (ein Lade–, zwei Verknüpfungsbefehle), der Verknüpfungsbefehl 0007 erhöht den Schleifenzähler, und Befehl
0008 verzweigt, wenn noch nicht alle Inhalte des Speicherbereichs angesprochen wurden. Charakterisieren Sie, welche der benutzten Register R0 bis R4 als
Daten– und welche als Adress-Register benutzt werden.
Speicherausschnitt:
0000 R0 erhält den Wert 0 und wird später die Summe enthalten
0001 R1 erhält den Wert 0 und zählt die Schleifendurchläufe
0002 R2 erhält die Größe des Speicherbereichs
0003 R3 erhält die Anfangsadresse des Speicherbereichs
0004 Lade den Inhalt von Zelle mit Adresse R3 in Register R4
0005 Addiere R4 und R0, speichere Ergebnis in R0
0006 erhöhe R3 um 1
0007 erhöhe R1 um 1
0008 Branch_Relative_if (R1 < R2), -5 (Rücksprung nach 0004)
0009 ...
Lösung auf Seite 175
Zu den Steuerregistern zählt das Befehlsregister, das Statusregister, der Programmzähler und der Stapelzeiger (engl. Stackpointer, SP), dessen Aufgabe es Stapelzeiger
ist, im Hauptspeicher einen Stapelspeicher 3 (engl. Stack) zu verwalten. Neben
den genannten Steuerregistern gibt es bei manchen Prozessoren (z.B. Intel x86Prozessoren) auch Segmentregister, welche die Speicherverwaltung durch das
Betriebssystem unterstützen. Daneben verwaltet das Leitwerk auch prozessorinterne Register, auf die der Anwender nicht zugreifen kann.
3
auch Kellerspeicher genannt.
154
Kapitel 5. Aufbau und Funktionsweise eines Computers
5.5
Anwendungen eines Stapelzeigers
Ein Stapel ist ein wichtiges Hilfsmittel, das die Verarbeitung von Unterprogrammen (engl. Subroutines) und Unterbrechungen (Interrupts) ermöglicht.
Man kann einen Stapel entweder direkt in Hardware auf dem Prozessorchip
realisieren oder mit Hilfe eines Stapelzeigers im Hauptspeicher abbilden. Die
erste Methode ist zwar schneller, erfordert aber mehr Chipfläche als ein einziges Stapelzeiger-Register. Außerdem kann mit dem Stapelzeiger-Register die
Speichergröße des Stapels durch zusätzlichen Hauptspeicher beliebig vergrößert
werden.
LIFO-Prinzip
Ein Stapel arbeitet nach dem LIFO-Prinzip (Last In, First Out). Dabei
sind nur zwei Operationen erlaubt: PUSH und POP. Mit der PUSH-Operation
wird ein Maschinenwort auf den Stapel gelegt und mit der POP-Operation
wird es wieder zurückgeholt. Während des Zugriffs auf den Hauptspeicher wird
der Stapelzeiger als Adresse (Zeiger) benutzt. Außerdem wird der Stapelzeiger
durch die Ablaufsteuerung so verändert, dass ein Zugriff das LIFO-Prinzip erfüllt. Die Organisation eines Stapels ist prozessorspezifisch. Meist beginnt er am
Ende des Hauptspeichers und wächst“ in Richtung zu den niedrigeren Adres”
sen. Für diesen Fall beginnt das Programm am Anfang des Hauptspeichers.
An dieses schließt sich meist der Datenbereich an. Der Stapel darf niemals
so groß werden, dass er den Daten- oder sogar Programmbereich überschreibt
(Stapel-Überlauf). Wenn der Stapel trotzdem überläuft (z.B. aufgrund eines
Programmierfehlers), muss das Betriebssystem das betreffende Programm abbrechen.
Es gibt zwei Möglichkeiten, den Stapelzeiger zu verändern:
1. bei der PUSH-Operation vor dem Schreiben in den Speicher und bei der
POP-Operation nach dem Lesen des Speichers,
2. bei der PUSH-Operation nach dem Schreiben in den Speicher und bei der
POP-Operation vor dem Lesen des Speichers, POP-Operation.
Hier wollen wir ein Beispiel für den ersten Fall betrachten. Der Stapel soll
am Ende des Hauptspeichers beginnen. Der Stapelzeiger muss deshalb mit der
letzten Hauptspeicheradresse +1 initialisiert werden. Wenn der Inhalt des Registers A auf den Stapel gelegt werden soll (PUSH A), muss die Ablaufsteuerung
zunächst den Stapelzeiger SP dekrementieren und dann den Inhalt von Register A in den Speicherplatz schreiben, auf den SP zeigt. In RTL-Schreibweise:
PUSH A:
SP ← SP − 1
M [SP ] ← A
Entsprechend dazu wird die POP-Operation in umgekehrter Richtung definiert:
5.5. Anwendungen eines Stapelzeigers
POP A:
155
A ← M [SP ]
SP ← SP + 1
Hier wird der Stapelzeiger zuerst zur Adressierung benutzt und inkrementiert, nachdem A vom Stapel geholt wurde.
Der Stapel kann auch benutzt werden, um andere Prozessorregister kurzzeitig zu speichern4 . Dies ist z.B. nötig, wenn diese Register von einem Unterprogramm oder einer Unterbrechung benutzt werden. Zu Beginn eines solchen Programmteils werden die betreffenden Register mit PUSH-Operationen
auf den Stapel gebracht. Vor dem Rücksprung an die Aufruf- bzw. Unterbrechungsstelle werden sie dann durch POP-Operationen in umgekehrter Reihenfolge in den Prozessor zurückgeholt. Man beachte, dass die Zahl der PUSHund POP-Operationen innerhalb eines Unterprogramms (bzw. Unterbrechung)
stets gleich groß sein muss.
Selbsttestaufgabe 5.3 (Stapel am Anfang des Hauptspeichers) Wie werden die
PUSH- und POP-Operationen für die zweite Variante auf Seite 154 realisiert?
Der Stapel soll am Anfang des Hauptspeichers beginnen. Wie muss der Stapelzeiger initialisiert werden?
Lösung auf Seite 175
5.5.1
Unterprogramme
Wenn an verschiedenen Stellen in einem Programm immer wieder die gleichen
Funktionen benötigt werden, fasst man die dazugehörenden Befehlsfolgen in
einem Unterprogramm (engl. Subroutine) zusammen. Dadurch wird nicht nur
Speicherplatz gespart, sondern auch die Programmierung modularisiert. Im Allgemeinen übergibt man an ein Unterprogramm Parameter, die als Eingabewerte
für die auszuführende Funktion benutzt werden. Ebenso müssen Ergebnisse an
das aufrufende Programm zurückgegeben werden. Parameter und Ergebnisse
einer Funktion können in bestimmten Registern oder über den Stapel übergeben werden. Eine Sammlung von häufig benötigten Unterprogrammen kann in
einer (Laufzeit-)Bibliothek bereitgestellt werden. Sie enthält lauffähige Maschinenprogramme, die in Anwenderprogrammen eingebunden werden können. Der
Benutzer muss lediglich die Einsprungadresse und die Schnittstelle für die Eingabe der Parameter bzw. Ausgabe der Ergebnisse kennen. Ein Unterprogramm
wird mit dem CALL-Befehl aufgerufen und mit einem RETURN -Befehl abgeschlossen.
4
Wird oft auch als retten“ bezeichnet.
”
156
Kapitel 5. Aufbau und Funktionsweise eines Computers
CALL-Befehl
Der CALL-Befehl bewirkt eine Programmverzweigung in das Unterprogramm
und speichert die Rücksprungadresse auf dem Stapel. Die Ausführung eines
CALL-Befehls in der Form Call Ziel läuft gewöhnlich in vier Schritten ab.
1. Nachdem der CALL-Befehl geholt wurde, wird der Operationscode dekodiert. Der Programmzähler wird inkrementiert, damit er auf den nachfolgenden Befehl zeigt.
P C++
2. Nun wird die Verzweigungsadresse5 in ein zusätzliches Adressregister AR
gerettet.
AR ← Ziel
3. Damit der Prozessor das Hauptprogramm nach Abarbeiten des Unterprogramms an dieser Stelle fortsetzen kann, muss er diese Rücksprungadresse
auf den Stapel legen.
SP ← SP − 1
M [SP ] ← P C
4. Im letzten Schritt wird die Startadresse des Unterprogramms aus dem
Adressregister AR in den Programmzähler geladen.
P C ← AR
Nun beginnt die Befehlsabarbeitung des Unterprogramms, indem der Opcode unter der neuen Programmzähleradresse geholt wird. Sollen Parameter an Unterprogramme über den Stapel übergeben werden, so werden
diese vor dem CALL-Befehl auf den Stapel gelegt.
Beim Eintritt in das Unterprogramm muss die Rücksprungadresse vom
Stapel in ein freies Prozessorregister gerettet werden. Unmittelbar vor
dem Rücksprung muss der Inhalt dieses Registers mit einer PUSH-Operation auf den Stapel zurückgeschrieben werden.
Eventuell werden zuvor auch noch Ergebnisse für das aufrufende Programm auf dem Stapel abgelegt.
RETURN-Befehl
Ein Unterprogramm muss mit einem RETURN-Befehl (oft mit dem Mnemonic RTS für Return from Subroutine bezeichnet) abgeschlossen werden. Der
RETURN-Befehl bewirkt eine Umkehrung von Schritt 3 des CALL-Befehls. Die
Rücksprungadresse wird durch eine POP-Operation vom Stapel geholt und in
den Programmzähler geschrieben.
5
Startadresse des Unterprogramms.
5.5. Anwendungen eines Stapelzeigers
P C ← M [SP ]
SP ← SP + 1
Nachdem die Rücksprungadresse im Programmzähler wiederhergestellt ist, kann
das Hauptprogramm, beginnend mit einer Befehlsholephase, fortgesetzt werden.
Verschachtelung und Rekursion. Das beschriebene Verfahren zur Unterprogramm-Verarbeitung ermöglicht auch den Aufruf von Unterprogrammen aus
Unterprogrammen. Wenn sich Unterprogramme selbst oder gegenseitig aufrufen, spricht man von direkter oder indirekter Rekursion. Rekursive Aufrufe von
Unterprogrammen sind nur dann zulässig, wenn die im Unterprogramm benutzten Registerinhalte zu Beginn mit PUSH-Befehlen auf den Stapel gerettet und
am Ende des Unterprogramms durch POP-Befehle (in umgekehrter Reihenfolge wie die PUSH-Befehle) wiederhergestellt werden. Die mögliche Verschachtelungstiefe hängt in allen Fällen von der Größe des für den Stapel verfügbaren
Hauptspeicherbereichs ab. Folglich muss auch ein entsprechendes Rekursionsende gewährleistet sein. Ist dies nicht der Fall, so kommt es zu einem Überlauf
(Stapel-Überlauf).
Natürlich ist es auch bei nicht-rekursiven Unterprogrammen ratsam, die darin benutzten Register zu Beginn des Unterprogramms auf den Stapel zu retten
und vor dem Rücksprung ins aufrufende Programm von dort wiederherzustellen. Der damit verbundene Zeitaufwand ist allerdings nur dann gerechtfertigt,
wenn das aufrufende Programm die Bewahrung des Prozessorzustands auch
tatsächlich erfordert. Dies trifft für die während rekursiver Unterprogrammaufrufe benutzten Register immer zu. Wenn das aufrufende Programm jedoch
bestimmte Prozessorregister nicht oder nur als Hilfsregister nutzt, müssen diese
von den Unterprogrammen auch nicht gerettet werden.
Zeitbedarf. Der dynamische Aufbau einer Verbindung zwischen dem Hauptund Unterprogramm mit Hilfe der Befehle CALL und RETURN erhöht den
Zeitbedarf zur Ausführung einer Funktion. Dieser zusätzliche Zeitaufwand ist
der Preis für den eingesparten Speicherplatz. Bei zeitkritischen Anwendungen
kann es erforderlich sein, auf Unterprogramme zu verzichten und stattdessen
Makros zu verwenden. Hier werden an die Stelle eines CALL-Befehls alle Ma- Makros
schinenbefehle der auszuführenden Funktion eingefügt. Obwohl sich dadurch
der Speicherbedarf erhöht, wird die Zeit für den Aufruf eines Unterprogramms
und für die Rückkehr zum Hauptprogramm eingespart. Dies ist insbesondere
bei einfachen Funktionen günstiger. Assembler, welche die Verwendung von Makros unterstützen, werden Makroassembler genannt. Der Programmierer kann
einer Folge von Maschinenbefehlen einen symbolischen Namen zuordnen. Immer wenn dieser Name im weiteren Verlauf des Programms auftritt, wird er
durch diese Befehlsfolge ersetzt. Neben Makroassemblern erlauben auch einige
problemorientierte Sprachen wie z.B. C“ die Verwendung von Makros.
”
157
158
Kapitel 5. Aufbau und Funktionsweise eines Computers
5.5.2
Unterbrechungen (Interrupts)
Besondere Ereignisse inner- oder außerhalb des Prozessors können Unterbrechungen (engl. Interrupts) erzeugen, die zu einer Unterbrechung des normalen
Programmablaufs führen. Im Folgenden benutzen wir den englischen Begriff
Interrupt, da dieser gebräuchlicher ist. Als Reaktion auf einen Interrupt verzweigt der Prozessor zu einem Programmteil, der auf das eingetretene Ereignis
reagiert (Interrupt Service Routine). Interrupts werden vom Prozessor ähnlich
wie Unterprogramme behandelt. Sie unterscheiden sich von Unterprogrammen
lediglich durch die Art des Aufrufs. Interrupts werden nicht durch einen CALLBefehl ausgelöst, sondern durch intern oder extern erzeugte (Hardware)Signale.
Sie können an jeder beliebigen Stelle (asynchron zum Prozessortakt) während
der Abarbeitung eines Programms eintreffen. Wenn der Prozessor einen Interrupt akzeptiert, kann eine (mehr oder weniger) schnelle Reaktion auf das durch
das Signal angezeigte Ereignis erfolgen.
Anwendungen
Es gibt eine Vielzahl von Anwendungen für Interrupts. Wir wollen im Folgenden einige Beispiele kurz beschreiben.
Ein-/Ausgabe. Bei der Ein-/Ausgabe muss sich der Prozessor mit den angeschlossenen Peripheriegeräten synchronisieren. Eine Möglichkeit hierzu besteht
darin, ständig den Zustand der Ein-/Ausgabe-Bausteine abzufragen (BusyWaiting). Wesentlich günstiger ist jedoch die Interrupt-gesteuerte Ein-/Ausgabe.
Hier wird der Prozessor nur dann unterbrochen, wenn der Ein-/Ausgabe-Baustein bereit ist, Daten zu senden oder zu empfangen. Erst wenn diese Bereitschaft vorhanden ist (Ereignis), wird sie mittels eines Signals gemeldet. In der
Zwischenzeit kann der Prozessor nützlichere Dinge tun, als auf das Peripheriegerät zu warten.
Betriebssysteme. In so genannten Multitasking-Systemen schaltet der Prozessor ständig zwischen verschiedenen Benutzern (bzw. Prozessen) um. Jeder
Benutzer erhält den Prozessor nur während einer bestimmten Zeitspanne (Time Slice). Die Zuteilung des Prozessors wird durch den Betriebssystemkern
vorgenommen, der nach dem Ablauf einer Zeitscheibe durch einen Interrupt
aufgerufen wird. Die Erzeugung dieser Interruptsignale erfolgt i.Allg. mit Hilfe von programmierbaren Zeitgebern (Timer). Mit Zeitgebern können genau
bestimmbare Zeitverzögerungen erzeugt werden. Sie sind daher auch für die
Echtzeitprogrammierung wichtig. Im Gegensatz zu einfachen Betriebssystemen
muss bei Echtzeitbetriebssystemen der Zeitbedarf zur Abarbeitung eines Programms genau eingehalten werden.
SoftwareInterrupts
Software-Interrupts sind Maschinenbefehle, welche die gleiche Wirkung haben wie durch Hardware ausgelöste Interrupts. Mit Hilfe von Software-Interrupts kann der Benutzer bestimmte Ein-/Ausgabe-Operationen aufrufen, die
5.5. Anwendungen eines Stapelzeigers
159
das Betriebssystem bereitstellt (System Calls) und die nur im System-Modus
(privileged Mode oder Supervisor Mode) erlaubt sind.
Traps und Exceptions. Sowohl Hardware- als auch Softwarefehler können
zu kritischen Zuständen eines Computersystems führen, die sofort bereinigt
werden müssen. Solche Fehler werden durch eine geeignete Hardware erkannt,
die dann einen besonderen Interrupt auslöst, der in jedem Fall vom Prozessor akzeptiert und unverzüglich bearbeitet wird. Typische Softwarefehler sind
die Division durch Null (Divide by Zero), die Überschreitung des darstellbaren
Zahlenbereichs (Überlauf) und das Ausführen nicht existierender Maschinenbefehle (Illegal Instruction). Der zuletzt genannte Fehler kann z.B. auftreten,
wenn fälschlicherweise in einem Unterprogramm eine unterschiedliche Zahl von
PUSH- und POP-Befehlen auf dem Stapel ausgeführt wurden. Die angeführten Interrupts entstehen innerhalb des Prozessors und werden häufig als Trap Trap
(Falle) oder Exceptions bezeichnet. Zu den extern auftretenden Fehlern zählen Exceptions
z.B. Speicherdefekte, die durch eine Paritätsprüfung erkannt werden können.
Weitere Fehlerquellen dieser Art sind Einbrüche der Betriebsspannung oder
die Verletzung von Zeitbedingungen bei Busprotokollen. Um solche Fehler zu
erkennen, benutzt man so genannte Watchdog-Schaltungen.
Verarbeitung eines einzelnen Interrupts
Moderne Prozessoren besitzen ein kompliziertes Interrupt-System, das mehrere
Interrupt-Quellen unterstützt. Wir wollen jedoch zunächst annehmen, dass es
nur eine einzige Interrupt-Quelle gibt und erst im nächsten Abschnitt kompliziertere Interrupt-Systeme mit mehreren Interrupt-Quellen betrachten.
Um mit einem Prozessor Interrupts verarbeiten zu können, muss die Ablaufsteuerung der Holephase erweitert werden. Nur so können externe oder interne
Signale auf die Befehlsverarbeitung des Prozessors Einfluss nehmen. Da eine
Interrupt-Anforderung IRQ (Interrupt Request) zu jedem beliebigen Zeitpunkt
während eines Befehlszyklus eintreffen kann, muss sie zunächst in einem Flipflop zwischengespeichert werden. Bis zur Annahme und Bearbeitung durch den
Prozessor bleibt die Interrupt-Anforderung anhängig (pending). Die notwendige
Erweiterung der Holephase ist in Abb. 5.4 dargestellt. Dabei wurde angenommen, dass der Stapel am Ende des Hauptspeichers (RAM-Bereich) beginnt. Die
Notation M [- -SP ] bedeutet, dass der Stapelzeiger zuerst dekrementiert und
dann zur Adressierung des Speichers benutzt wird. Der Interrupt-Opcode legt
implizit die Startadresse der Service-Routine fest, die auch Interrupt-Vektor ge- Interrupt-Vektor
nannt wird. Mit dem Quittungssignal IN T A (Interrupt Acknowledge) bestätigt
der Prozessor dem anfordernden Gerät die Interrupt-Anforderung. Mit diesem
Signal kann auch das IRQ-Flipflop zurückgesetzt werden. Bevor die eigentliche Service-Routine beginnt, sollte zunächst das Statusregister auf den Stapel
gerettet werden. Damit die während der Service-Routine möglicherweise veränderten Flags sich nicht auf den Programmfluss des unterbrochenen Programms
160
RETI-Befehl
Kapitel 5. Aufbau und Funktionsweise eines Computers
auswirken, wird der gesicherte Inhalt des Statusregisters vor dem Rücksprung
ins unterbrochene Programm wieder vom Stapel zurückgeholt. Die Sicherung
des Statusregisters wird normalerweise automatisch durch die Ablaufsteuerung
(Mikroprogramm) erledigt. Am Ende einer Interrupt-Service-Routine steht ein
RETI-Befehl (Return from Interrupt), um – wie bei Unterprogrammen – die
Rücksprungadresse vom Stapel zu holen. Da zusätzlich auch das Statusregister zurückgeschrieben wird, unterscheidet sich der RETI-Befehl von einem
Unterprogramm-RETURN-Befehl. Bei älteren Prozessoren (z.B. Intel i8085)
muss der Programmierer selbst die Service-Routine in PUSH- und POP-Befehle
einbetten, die den Inhalt des Statusregisters für das unterbrochene Programm
retten.
IRQ = 1
J
M[--SP]
N
PC
M[PC++]
INTA-Signal
IR
Interrupt-Opcode
IR
Abbildung 5.4: Erweiterung der Holephase zur Bearbeitung eines Interrupts.
Das Statusregister wird nicht bei allen Prozessoren automatisch gerettet.
Mehrere Interrupts
Wenn ein Prozessor in der Lage sein soll, mehrere Interrupt-Quellen zu berücksichtigen, müssen zwei Probleme gelöst werden:
1. Jedem Interrupt muss eine eigene Startadresse für die Service-Routine
zugeordnet werden.
2. Wenn mehrere Interrupts gleichzeitig hängend sind, muss eine Entscheidung getroffen werden, welcher Interrupt vorrangig bearbeitet wird.
Prioritäten
Die Einführung von Prioritäten für die einzelnen Interrupts kann durch
Hardware oder Software erfolgen. Außerdem ist es sinnvoll, zwei Kategorien von
Interrupts zu unterscheiden: maskierbare und nicht maskierbare Interrupts. Die
maskierbaren Interrupts können vom Programmierer freigegeben oder gesperrt
werden. Während zeitkritischer Programmabschnitte ist es z.B. ratsam, alle
Interrupts dieser Art zu sperren, damit keine zusätzlichen Verzögerungszeiten
5.5. Anwendungen eines Stapelzeigers
161
durch Service-Routinen entstehen. Nicht-maskierbare Interrupts (Non Maskable Interrupts, NMI) können nicht gesperrt werden. Sie dienen zur Fehlerbehandlung und müssen deshalb unverzüglich bearbeitet werden. Ein weiteres
Beispiel für eine unaufschiebbare Fehlerbehandlung ist die Reaktion auf einen
Abfall der Betriebsspannung, die von einer Watchdog-Schaltung ausgelöst wird.
Beispiele für Prozessor-interne Ereignisse (Traps) wurden oben bereits beschrieben. Traps sind ebenfalls nicht maskierbar und haben zudem stets die höchste
Priorität.
Startadresse der Service-Routine. Um die Startadresse der Service-Routine
zu bestimmen, gibt es drei Möglichkeiten:
1. Abfragemethode,
2. Vektormethode,
3. Codemethode.
Die Abfragemethode (Polling) hat den geringsten Hardwareaufwand, da am
Prozessor weiterhin nur ein Interrupt-Eingang nötig ist. Die Interrupt-Anforderungen der einzelnen Ein-/Ausgabe-Bausteine werden durch eine OR-Funktion
miteinander verknüpft, die dann diesen Eingang IRQ ansteuert. Wenn während
der Holephase eine hängende Interrupt-Anforderung erkannt wird (IRQ = 1),
unterbricht der Prozessor das laufende Programm, indem er die zu dem (einzigen) Interrupt gehörende Service-Routine aufruft. Dieses Programm verwaltet alle“ Interrupts und wird deshalb Interrupt Handler genannt. Zunächst Interrupt Handler
”
muss die Interrupt-Quelle ermittelt werden. Dazu werden die Statusregister
der einzelnen Ein-/Ausgabe-Bausteine nacheinander gelesen und geprüft, ob
das Interrupt-Flag gesetzt ist. Der Interrupt Handler kennt die Startadressen
der Service-Routinen für jeden einzelnen Baustein. Sobald die Abfrage des Interruptflags positiv ist, wird durch einen unbedingten Sprung zu der (dem
Ein-/Ausgabe-Baustein) zugeordneten Service-Routine verzweigt. Dieses Device Handler-Programm muss dann mit dem RETI-Befehl abgeschlossen sein.
Die Reihenfolge der Abfrage entspricht der Priorität der angeschlossenen Ein/Ausgabe-Bausteine. Wechselnde Prioritäten sind durch Änderung dieser Reihenfolge leicht zu realisieren. Ein großer Nachteil der Abfragemethode ist jedoch der hohe Zeitbedarf zur Abfrage der einzelnen Ein-/Ausgabe-Bausteine
und Ermittlung des richtigen Device Handlers.
Die Vektormethode (vectored Interrupts) verursacht den größten Hardwareaufwand, da für jede mögliche Interrupt-Anforderung ein eigener Eingang am
Prozessor vorhanden sein muss. Die eintreffenden Interrupt-Anforderungen werden in einem besonderen Register ISRQ (Interrupt Service ReQuest) aufgefangen und mit einer Interrupt-Maske IM , die Bestandteil des Statusregisters ist, bitweise AND-verknüpft. Nehmen wir zunächst einmal an, dass sich
die Interrupt-Anforderungen wechselseitig ausschließen. Wenn ein freigegebener Interrupt erkannt wird, kann die Ablaufsteuerung der betreffenden Anforderungsleitung einen Maschinenbefehl zuordnen, der implizit die Startadresse
162
Kapitel 5. Aufbau und Funktionsweise eines Computers
für eine Service-Routine festlegt. Mit der Vektormethode können InterruptAnforderungen sehr schnell beantwortet werden, da die Startadresse des Device Handlers spätestens nach einem Befehlszyklus bekannt ist. Nachteilig ist
jedoch, dass jeder Anforderungsleitung nur ein Device Handler zugeordnet werden kann. Abhängig von ihrem momentanen Zustand benötigen Peripheriegeräte jedoch verschiedene Device Handler. Um trotzdem mit nur einer Anforderungsleitung auszukommen, bietet sich die direkte Abfrage eines Codes für die
gewünschte Service-Routine an.
Die Codemethode wird von sehr vielen Prozessoren angeboten, da sie ein
hohes Maß an Flexibilität bietet. Jeder Anforderungsleitung IRQi wird ein
Quittungssignal IN T Ai zugeordnet. Wenn ein Ein-/Ausgabe-Baustein auf eine Interrupt-Anforderung hin ein Quittungssignal erhält, antwortet er mit einem Codewort auf dem Datenbus6 . Aus diesem Codewort wird dann die Startadresse des gewünschten Device Handlers bestimmt. Unterstützt der Prozessor
vektorisierte Interrupts, so entspricht dem Codewort eine Vektornummer aus
der Interrupt-Tabelle (s.u.). Das Codewort kann aber auch einen CALL-Befehl
darstellen, und der Ein-/Ausgabe-Baustein übergibt im Anschluss daran die
Startadresse direkt an den Prozessor (vgl. Intel i8085).
Prioritäten lösen Konflikte. Wenn mehrere Interrupt-Anforderungen gleichzeitig hängend sind, liegt eine Konfliktsituation vor. Dieser Fall kann z.B. eintreten, wenn in einem Befehlszyklus zwei Interrupts gleichzeitig oder kurz hintereinander eintreffen. Welcher der beiden Interrupts wird dann zuerst bearbeitet?
Oder nehmen wir an, der Prozessor sei gerade in einer Service-Routine und ein
neuer Interrupt tritt auf. Soll die Service-Routine zuerst beendet werden oder
wird sie selbst unterbrochen? Um solche Konfliktsituationen zu beheben, müssen Prioritäten definiert werden, welche die Bedeutung der einzelnen Interrupts
gewichten. Wie wir bereits weiter oben gesehen haben, können Prioritäten sehr
leicht durch die Abfragereihenfolge in einem Interrupt Handler implementiert
werden. Die Abfragemethode ist jedoch sehr langsam.
InterruptController
Wir wollen im Folgenden den Aufbau und die Funktionsweise eines Interrupt-Controllers vorstellen. Eine Hardware-Lösung ist wesentlich schneller, da
sie den Prozessor nicht belastet. Die Priorität einer Anforderungsleitung wird
durch einen auf dem Chip integrierten Interrupt-Controller festgelegt. Die Startadressen sind in einer Tabelle, der sogenannten Interrupt-Tabelle, abgelegt.
Jeder Interrupt-Eingang kann mit Hilfe eines externen Controllers in weitere
Prioritätsebenen unterteilt werden. Sowohl interne als auch externe InterruptController haben prinzipiell den gleichen Aufbau.
In Abb. 5.5 ist ein Interrupt-Controller für vier Prioritätsebenen dargestellt. Wenn alle Interrupts freigegeben sind (IM = 1111), gelangen hängende
Anforderungen im ISRQ zu einem Prioritätsencoder, der die Nummer der Anforderung höchster Priorität als Dualzahl ausgibt. Für den Fall, dass keine
Anforderung hängend ist, wird eine Null ausgegeben. Deshalb ist auch ein 36
Das Codewort hat meist nicht die volle Maschinenwortbreite.
5.5. Anwendungen eines Stapelzeigers
163
Abbildung 5.5: Aufbau eines Interrupt-Controllers für vier Prioritätsebenen.
IRQ4
1
0
0
0
0
IRQ3
×
1
0
0
0
IRQ2
×
×
1
0
0
IRQ1
×
×
×
1
0
Code
100
011
010
001
000
Tabelle 5.1: Wahrheitstabelle eines Prioritätsencoders für 4 Interrupt-Eingänge.
× steht für don’t care.
Bit-Code notwendig. Nehmen wir an, dass IRQ4 die höchste Priorität hat, so
ergibt sich die Funktionstabelle 5.1 für den Prioritätsencoder.
Der vom Prioritätsencoder ausgegebene Code wird mit den Interrupt-Statusbits IS des Statusregisters verglichen. Diese Bits codieren die Prioritätsebene, in der sich der Prozessor gerade befindet. Ist der vorliegende Prioritäts-Code
kleiner als der IS-Code oder gleich groß, so wird keine Interrupt-Anforderung
an die Ablaufsteuerung weitergeleitet. Alle vorliegenden Interrupt-Anforderungen bleiben hängend. Falls der am Vergleicher-Eingang A anliegende Prioritäts-Code größer als der IS-Code ist, wird die Anforderung mit der höchsten
Priorität akzeptiert und wie folgt bearbeitet:
1. Mit Hilfe des Prioritäts-Codes wird die Startadresse der Service-Routine
nach einer der oben genannten Methoden bestimmt und das passende
IN T Ai -Signal wird ausgegeben.
2. Die Rücksprungadresse wird zusammen mit dem alten IS-Code (Statusregister) auf den Stapel gerettet.
3. Die Startadresse der Service-Routine wird in den Programmzähler geladen und der IS-Teil des Statusregisters wird mit dem aktuellen Prioritätscode7 überschrieben.
7
Vom Eingang A des Vergleichers.
164
Kapitel 5. Aufbau und Funktionsweise eines Computers
4. Nun kann die Abarbeitung der Service-Routine erfolgen. Sie wird mit einem RETI-Befehl abgeschlossen. Da dieser Befehl das alte Statusregister
wiederherstellt, bewirkt er eine Rückkehr in die unterbrochene Prioritätsebene.
Mit dem beschriebenen Interrupt-Controller können beliebig ineinander verschachtelte Interrupts verarbeitet werden. Dies wollen wir an einem konkreten
Beispiel noch einmal verdeutlichen.
Beispiel. Betrachten wir zwei Peripheriegeräte, die unterschiedliche Geschwindigkeitsanforderungen an eine Service-Routine stellen. Das Lesen eines Sektors bei einer Festplatte erfordert die sofortige Reaktion des Prozessors, sobald sich die gewünschte Spur unter dem Schreib-/Lesekopf befindet. Die zugehörige Service-Routine HD (Hard Disk) darf nicht unterbrochen werden, da
sonst Daten verloren gehen. Wir ordnen deshalb der Festplatte die InterruptAnforderung höchster Priorität, hier IRQ4 , zu. Als zweites Peripheriegerät soll
ein Drucker betrachtet werden, der zeilen- oder blockweise Daten empfängt und
seine Bereitschaft zur Aufnahme neuer Daten durch einen Interrupt signalisiert.
Die Service-Routine LP (Line Printer) kann jederzeit unterbrochen werden, da
sich dadurch lediglich die Zeit zum Ausdrucken verlängert. Der Ein-/AusgabeBaustein zum Anschluss des Druckers wird daher mit der Anforderungsleitung
niedrigster Priorität, hier IRQ1 , verbunden. Wir wollen annehmen, dass während der Abarbeitung des Hauptprogramms je ein Prozess zum Drucken und zur
Datei-Eingabe aktiv sind und vom Betriebssystem blockiert wurden, d.h. diese
Prozesse warten auf Interrupts der Peripheriegeräte. Wenn der Drucker über
IRQ1 Bereitschaft zum Drucken signalisiert, kann der Prozessor zum Device
Handler LP verzweigen. Die Rücksprungadresse und das Statusregister werden
auf den Stapel gerettet und der IS-Code auf 001 gesetzt. Trifft während der
Bearbeitung von LP ein IRQ4 ein, so wird LP unterbrochen, da der aktuelle
Interrupt-Prioritätscode 100 größer ist als der IS-Code. Nach der Verzweigung
zum Programm HD ist der IS-Code 100. Der Device Handler der Festplatte
kann demnach nicht unterbrochen werden, da alle anderen Interrupts niedrigere
Prioritätscodes haben8 . Sobald das Programm HD abgeschlossen ist, setzt der
Prozessor die Bearbeitung des Device Handlers LP fort. Nach dem Rücksprung
aus HD ist der IS-Code wieder 001. Man beachte, dass beide Interrupts durch
die Interrupt-Maske IM freigegeben sein müssen. Um Fehler zu vermeiden,
dürfen Änderungen der Interrupt-Maske nur vom Betriebssystem vorgenommen werden. Die meisten Prozessoren bieten daher hardwaremäßig die zwei
Betriebsarten User Mode und Supervisor Mode. Die Interrupt-Maske kann nur
im Supervisor Mode verändert werden.
Die oben beschriebene Hardware eines Interrupt-Controllers ist i.Allg. auf
dem Prozessorchip integriert. Zusätzliche Prioritätsebenen können durch die
Abfragemethode (Software), externe Interrupt-Controller oder durch eine Verkettung der IN T A-Signale einer Ebene erreicht werden (Daisy-Chain). Die
letztgenannte Methode ist besonders häufig, da sie nur geringen Mehraufwand
an Hardware verursacht. Sie wird meist mit der Codemethode zur Ermittlung
8
Ausgenommen NMIs.
5.6. Rechenwerk
165
der Startadresse kombiniert. Die Daisy-Chain-Priorisierung führt eine ortsabhängige Prioritätenfolge innerhalb einer Ebene ein, indem das IN T A-Signal
vom Prozessor über hintereinandergeschaltete Busmodule weitergereicht wird.
Jedes Busmodul stellt eine mögliche Interrupt-Quelle dar, die über eine Sammelleitung eine Interrupt-Anforderung erzeugen kann. Das erste Busmodul, das
einen Interrupt-Service wünscht, antwortet dem Prozessor mit einem Codewort
zur Bestimmung der Startadresse der Service-Routine, sobald es ein IN T ASignal registriert. In diesem Fall reicht das betreffende Busmodul das IN T ASignal nicht an nachfolgende Busmodule weiter. Somit hat das direkt auf das
Prozessormodul folgende Busmodul die höchste Priorität.
Selbsttestaufgabe 5.4 (Schaltnetz Prioritätsencoder) Bestimmen Sie die Schaltfunktionen für den Prioritätsencoder nach Tab. 5.1.
Lösung auf Seite 175
5.6
Rechenwerk
Wie schon gesagt, besteht das Rechenwerk im Wesentlichen aus Registern, Multiplexern und einer ALU. Im Folgenden sollen diese Bestandteile näher betrachtet werden.
5.6.1
Daten- und Adressregister
Wenn im Rechenwerk adressierbare Datenregister vorhanden sind, spricht man
von einer Registerarchitektur. Die Datenregister bilden einen Register-Block Registerarchitektur
oder ein Register File9 . Bei Registerarchitekturen unterscheidet man Ein-, Zweiund Drei-Adress-Maschinen. Der Adresstyp wird von der Zahl der internen
Daten- und Adressbusse bestimmt, die den Registerblock mit der ALU und
dem Speicher verbinden. Je mehr Datenregister gleichzeitig ausgewählt werden
können, umso weniger Taktzyklen werden zur Ausführung eines Maschinenbefehls benötigt.
Oft wird der Begriff X-Adress-Maschine auch auf das Format eines Maschinenbefehls bezogen. Da die Zahl der Adressen, die in einem Befehl angegeben
werden können, keine Auskunft über die Hardware-Implementierung des Rechenwerks (Maschine) gibt, sollte man in diesem Zusammenhang besser von
einem X-Adress-Befehlssatz sprechen.
Neben Registerarchitekturen gibt es die Stapelarchitekturen oder NullStapelarchitektur
Adress-Maschinen. Anstelle eines Register Files wird hier ein Stapel benutzt,
um Operanden oder Ergebnisse zu speichern. Eine echte Stapelarchitektur verfügt über einen auf dem Prozessor integrierten LIFO-Speicher. Die Realisierung
9
Wenn sehr viele Register vorhanden sind (z.B. bei RISC-Prozessoren).
166
Kapitel 5. Aufbau und Funktionsweise eines Computers
des Stapels im Hauptspeicher (mit Hilfe eines Stapelzeigers) ist in diesem Fall
nicht empfehlenswert, da die hohe Zahl von Speicherzugriffen die Prozessorleistung herabsetzt. Null-Adress-Befehle enthalten keine direkten Adressangaben,
sondern benutzen die Daten, die oben auf dem Stapel liegen, als Operanden
oder als Adressen (für Zugriffe auf den Hauptspeicher). Diese Daten werden
kurzzeitig in Latches zwischengespeichert und durch die ALU miteinander verknüpft. Das Ergebnis wird dann wieder auf den Top of Stack (TOS) gelegt. Diese Vorgehensweise entspricht der Berechnung eines arithmetischen Ausdrucks
in der umgekehrten Polnischen Notation (Reverse Polish Notation, RPN). Erst
müssen mit PUSH-Befehlen die Operanden auf den Stapel gebracht werden
und danach wird die gewünschte Operation angegeben. Da die Adresse fehlt,
sind Maschinenbefehle von Stapelarchitekturen sehr kompakt. Zur Lösung einer
bestimmten Aufgabe müssen jedoch viele Maschinenbefehle verwendet werden.
Obwohl es stackorientierte Programmiersprachen (z.B. FORTH) gibt, die durch
entsprechende Stapelmaschinen unterstützt werden, hat sich die Stapelarchitektur nicht durchsetzen können. Der überwiegende Anteil heutiger Prozessoren
gehört zur Klasse der Registerarchitekturen.
5.6.2
Datenpfade
In Abb. 5.6 ist ein Rechenwerk dargestellt, das ALU und Registerfeld nur mit
einem internen (bidirektionalen) Datenbus verbindet. Nachteilig ist an dieser
Datenpfadstruktur, dass die Abarbeitung eines Maschinenbefehls drei Taktzyklen erfordert: Zunächst müssen die beiden Operanden in zwei Hilfs-Register
gebracht werden. Da immer nur ein Operand pro Takt aus dem Register File
gelesen werden kann, benötigt man hierzu zwei Taktzyklen. Im dritten Taktzyklus wird das Ergebnis der Verknüpfung vom F(unction)-Ausgang der ALU
ins Register File geschrieben.
Abbildung 5.6: Rechenwerk einer Ein-Adress-Maschine.
Beispiel. Angenommen, der Drei-Adress-Befehl SUB R1,R2,R3 soll auf
einer Ein-Adress-Maschine ausgeführt werden. Die Realisierung dieses Befehls
erfordert die folgenden Mikrooperationen:
5.6. Rechenwerk
167
Taktzyklus
1
2
3
Operation
R1 → A
R2 → B
F → R3
Bei einer Zwei-Adress-Maschine kann der gleiche Befehl in zwei Taktzyklen
ausgeführt werden, da die Latches A und B gleichzeitig geladen werden. In
Abb. 5.7 wird die Datenpfad-Struktur einer Drei-Adress-Maschine dargestellt,
die für RISC-Prozessoren typisch ist. Der angeführte Beispiel-Befehl kann mit
einem solchen Rechenwerk in einem Taktzyklus ausgeführt werden, da sowohl
für die Operanden als auch für das Ergebnis eigene Datenbusse bereitstehen,
die separat adressierbar sind. Das Rechenwerk einer Drei-Adress-Maschine wird
auch als Register-ALU oder kurz RALU bezeichnet.
RALU
Abbildung 5.7: Rechenwerk einer Drei-Adress-Maschine.
5.6.3
Schiebemultiplexer
Schiebeoperationen sind z.B. für die Multiplikation oder Division nützlich. Sie
können durch einen Schiebemultiplexer (Shifter) an einem Eingang der ALU
realisiert werden. Der Schiebemultiplexer besitzt drei Eingänge mit Maschinenwortbreite (Abb. 5.8). Ein Eingang ist ganz normal mit dem internen Datenbus verbunden. Bei den beiden anderen Eingängen sind die Datenleitungen
einerseits um eine Stelle nach links, andererseits um eine Stelle nach rechts
verschoben. Über zwei Steuerleitungen wird die gewünschte Positionierung eines ALU-Operanden ausgewählt. Wenn der Operand verschoben wird, muss
entweder von links oder rechts ein Bit nachgeschoben werden (Eingänge: Left
Input, LI, und Right Input, RI). Das herausfallende“ Bit steht je nach Schie”
berichtung an den Ausgängen (Left Output, LO, bzw. Right Output, RO).
Oft wird bei Schiebeoperationen das Carry Flag benutzt, um entweder das
herausfallende Bit zwischenzuspeichern oder um den Inhalt des Carry Flags
nachzuschieben. Wenn die Schiebe-Eingänge mit den zugehörigen Ausgängen
verbunden werden10 , rotieren die Bits um eine Stelle nach links oder rechts. Mit
10
LO → LI bzw. RO → RI.
168
Kapitel 5. Aufbau und Funktionsweise eines Computers
mehreren Rotationsoperationen können Bitgruppen in jede gewünschte Position gebracht werden. Oft ist es auch möglich, über das Carry Flag zu rotieren,
d.h. der Schiebe-Ausgang wird mit dem Eingang des Carry Flags verbunden
und dessen Ausgang mit dem Schiebe-Eingang.
Abbildung 5.8: 4-Bit-Schiebemultiplexer (Shifter) vor einem ALU-Eingang.
5.6.4
Logische Operationen
In Kapitel 2 haben wir schon Schaltungen für arithmetische Operationen kennengelernt. Wir wollen im Folgenden kurz auf logische Operationen eingehen.
Da bei logischen Operationen jede Stelle eines Maschinenworts unabhängig von
den anderen Stellen verarbeitet werden kann, ist die Entwicklung entsprechender Schaltnetze unkritisch. Die Verzögerungszeiten logischer Operationen sind
im Vergleich zu arithmetischen Operationen vernachlässigbar und haben folglich keinen Einfluss auf die Taktrate des Prozessors. Mit zwei Variablen xi und
yi können 16 verschiedene logische Verknüpfungen gebildet werden. Erzeugt
man alle vier Minterme und ordnet jedem Minterm eine Steuervariable zu, die
kontrolliert, ob der Minterm genutzt wird oder nicht, so können mit dem Steuerwort alle logischen Operationen ausgewählt werden.
zi = s3 xi yi ∨ s2 xi yi ∨ s1 xi yi ∨ s0 xi yi
Als Beispiele sollen die Steuerwörter für die drei Boole’schen Grundoperationen angegeben werden:
1. Negation
zi = xi = xi (yi ∨ y i ) = xi yi ∨ xi y i ⇒ s3 s2 s1 s0 = 0011
2. Disjunktion
zi = xi ∨ yi
= xi (yi ∨ y i ) ∨ (xi ∨ xi )yi
= xi yi ∨ xi y i ∨ xi yi ∨ xi yi ⇒ s3 s2 s1 s0 = 1110
5.6. Rechenwerk
3. Konjunktion
zi = xi yi ⇒ s3 s2 s1 s0 = 1000
5.6.5
Arithmetische Operationen
Durch eine weitere Steuervariable s4 kann man auch die Überträge aus einem
Addierschaltnetz miteinbeziehen und so zwischen arithmetischen und logischen
Operationen umschalten.
Die inverse XOR-Funktion (⊕) wird Äquivalenz -Funktion genannt und mit
dem Symbol ≡ notiert. Für jede Stelle wird nun die folgende Funktion mit der
zusätzlichen Steuervariablen s4 gebildet:
fi = zi ≡ (s4 ∨ ci )
Für s4 = 1 gilt dann
fi = zi ≡ 1 = zi
⇒ logische Operationen wie oben
Für s4 = 0 folgt
fi = zi ≡ ci
⇒ arithmetische Operationen
Zur Addition zweier N -stelliger Dualzahlen berechnet sich die Stellensumme
wie folgt:
Si = xi ⊕ yi ⊕ ci
= xi ≡ yi ≡ ci
= (xi yi ∨ xi y i ) ≡ ci
i = 0 . . . N − 1, c0 = 0
Die Addition kann demnach mit dem Steuerwort s4 s3 s2 s1 s0 = 01001 ausgewählt werden, d.h. fi = Si .
Die Subtraktion kann auf die Addition des Zweierkomplements des Subtrahenden zurückgeführt werden. Daraus folgt für die Stellendifferenz in der i-ten
Stelle:
di = xi ≡ y i ≡ ci
= (xi y i ∨ xi yi ) ≡ ci
i = 0 . . . N − 1, c0 = 1
Die Subtraktion wird also mit dem Steuerwort s4 s3 s2 s1 s0 = 00110 ausgewählt, d.h. fi = di . Mit dem beschriebenen Steuerprinzip können 16 logische
und 32 arithmetische Operationen (c0 = 1/0) realisiert werden. Dabei entstehen
auch exotische“ Funktionen, die selten oder gar nicht benutzt werden.
”
Nun wollen wir zeigen, wie die wichtigsten Status-Flags bestimmt werden.
5.6.6
Status-Flags
Die Ausgänge fN −1 , . . . , f0 bilden den Ergebnisbus der ALU (vgl. Abb. 5.6
und Abb. 5.7). Aus der Belegung dieser Bits und der Belegung des Übertrags
169
170
Kapitel 5. Aufbau und Funktionsweise eines Computers
cN werden die Status-Flags gebildet. Die folgenden Flags sind bei fast allen
Prozessoren zu finden, da sie sehr einfach bestimmt werden können:
1. Carry C: Übertrag in der höchsten Stelle, C = cN
2. Zero Z: alle Bits von F sind Null, Z = fN −1 ∨ fN −2 ∨ . . . ∨ f0
3. Minus M: negatives Vorzeichen bei Zweierkomplement-Darstellung,
M = fN −1
4. Overflow (bzw. Underflow) V: das Ergebnis ist zu groß (klein), um mit
N -Bit-Wortbreite dargestellt zu werden,
V = cN ⊕ cN −1
Die Entstehung eines Overflows (bzw. Underflows) soll an einem Beispiel
erläutert werden. Wir betrachten dazu die Addition von 2- Bit-Zahlen in der
Zweierkomplement-Darstellung (vgl. Abb. 5.9). Ein Overflow (bzw. Underflow)
liegt vor, wenn bei der Addition die Grenze von +1 nach -2 (bzw. -2 nach +1)
überschritten wird. Die Erkennung einer solchen Fehlersituation ist äußerst
wichtig, da sonst falsche Ergebnisse zurückgeliefert werden. Sie kann (mit Hilfe
eines Interrupt Handlers) korrigiert werden, indem die Berechnung anschließend
mit doppelter Wortbreite ausgeführt wird.
Abbildung 5.9: Zweierkomplement-Darstellung einer 2-Bit-Zahl; innen: Dezimalwert, außen: duale Codierung.
Selbsttestaufgabe 5.5 (MiniALU) Entwerfen Sie eine ALU, die insgesamt nur
sieben elementare Funktionen gemäß der Tabelle 5.2 ausführen kann.
Hierbei bezeichnen A und B die beiden Eingänge und F den Ausgang der
ALU. Cin bezeichnet den eingehenden Übertrag und Compl = 1 soll intern
das Einerkomplement des Eingangs B erzeugen. Neben logischen Schaltgliedern AND, OR und XOR steht ein Addierschaltnetz und ein 4:1-Multiplexer in
Maschinenwortbreite zur Verfügung.
Lösung auf Seite 175
5.7. Leitwerk
171
S1
0
0
0
0
0
1
1
S0
0
0
0
0
1
0
1
Compl Cin
0
0
0
1
1
0
1
1
X
X
X
X
X
X
F
A+B
A+B+1
A−B−1
A−B
A∧B
A∨B
A⊕B
Tabelle 5.2: Funktionstabelle der MiniALU
5.7
Leitwerk
Das Leitwerk hat die Aufgabe, Maschinenbefehle (Makrobefehle) aus dem Hauptspeicher ins Befehlsregister zu laden (Holephase) und anschließend zu interpretieren (Ausführungsphase). Obwohl die Maschinenbefehle auch durch eine
sogenannte Einzyklus-Implementierung umgesetzt werden können, wird in der
Praxis ausschließlich die Mehrzyklen-Implementierung angewandt. Der Grund
dafür ist, dass aufwendige Funktionseinheiten wie z.B. eine ALU zeitlich versetzt genutzt werden können und daher nicht mehrfach vorhanden sein müssen.
Außerdem ergeben sich aufgrund der tiefen Schaltnetze bei einer EinzyklenImplementierung sehr lange Verzögerungszeiten und somit deutlich geringere
Taktfrequenzen.
Ein Maschinenbefehl wird bei einer Multizyklen-Implementierung durch eine Folge von Steuerwörtern (Mikrobefehle) für Rechenwerk, Speicher und Ein/Ausgabe umgesetzt. Diese Steuerwörter werden durch eine Ablaufsteuerung
erzeugt, die entweder festverdrahtet ist oder als Mikroprogramm-Steuerwerk
aufgebaut wird. CISC-Prozessoren verfügen über einen sehr umfangreichen Befehlssatz, der nur mit Hilfe der Mikroprogrammierung implementiert werden
kann. Im Folgenden werden wir die Besonderheiten zur die Implementierung
solcher Leitwerke genauer betrachten.
RISC-Prozessoren nutzen ebenfalls die Mehrzyklen-Implementierung. Aufgrund der einfacheren Befehle und Adressierungsarten kann hier die Technik
der Fließbandverarbeitung (Pipelining) zum Einsatz kommen. Im Gegensatz
zu CISC-Prozessoren wird hier bei jedem Maschinenbefehl stets die gleiche
Anzahl von Mikrobefehlsschritten ausgeführt. Daher können mehrere Maschinenbefehle zeitlich überlappend in durch Register voneinander entkoppelten
Hardwarestufen ausgeführt werden. Hiermit erreicht man sehr hohe Taktraten und im günstigsten Fall kann pro Takt ein Maschinenbefehl abgeschlossen
werden. Das Leitwerk vereinfacht sich hierbei wesentlich und es besteht nur
noch aus einem Decodierschaltnetz für den Opcode. Aufgrund dieser Vorzüge
nutzen alle modernen Prozessoren die Mehrzyklen-Implementierung in Kombination mit Pipelining. Wir werden im Kurs Computersysteme 2 ausführlich
darauf eingehen.
172
Kapitel 5. Aufbau und Funktionsweise eines Computers
5.7.1
Mikroprogrammierung
Mikroprogramm-Steuerwerke können leichter entwickelt und gewartet werden
als festverdrahtete Steuerwerke. Sie sind aber auch wesentlich langsamer als
diese, da sie die Mikrobefehle erst aus dem Steuerwort-Speicher holen müssen.
Um eine hohe Taktrate zu erreichen, muss dieser Speicher sehr schnell sein. Die
Kosten pro Speicherbit sind entsprechend hoch (vgl. Kapitel 4 in Kurs Computersysteme 2). Um die Chipfläche und die Kosten eines Prozessors zu minimieren, muss die Speicherkapazität des Steuerwort-Speichers optimal ausgenutzt
werden. Die dabei angewandten Techniken werden im Folgenden behandelt.
Der Befehlssatz eines Prozessors und die Fähigkeiten des Rechenwerks werden durch Mikroprogramme miteinander verknüpft. Zu jedem Makrobefehl
gibt es einen Bereich im Steuerwort-Speicher, der die zugehörigen Mikrobefehle enthält und den man als Mikroprogramm bezeichnet. Der Befehlssatz eines
Prozessors wird durch die Menge sämtlicher Mikroprogramme definiert. Die
meisten Mikroprozessoren haben einen festen Befehlssatz, d.h. der Anwender
kann die Mikroprogramme (Firmware) nicht verändern. Mikroprogrammierbare Rechner verfügen über RAM-Speicher zur Aufnahme der Mikroprogramme.
Die Mikroprogrammierung bietet viele Möglichkeiten bei der Rechnerentwicklung und Anwendung, wie z.B. die Emulation anderer Rechner. Dies ist ein
weiterer Vorteil von Mikroprogramm-Steuerwerken gegenüber festverdrahteten
Steuerwerken. Ein Mikroprogramm-Steuerwerk ist ein Hardware-Interpreter für
den Maschinenbefehlssatz. Um Mikroprogramme zu entwickeln, gibt es symbolische Sprachen, die mit Assemblern vergleichbar sind. Man nennt sie daher
auch Mikroassembler. Sie werden gebraucht, um symbolische Mikroprogramme
in Steuerspeicher-Inhalte zu übersetzen. Der Mikro-“Programmierer braucht
”
detaillierte Kenntnisse über den Hardware-Aufbau des Prozessors.
Die grundlegende Struktur eines Mikroprogramm-Steuerwerks haben wir
bereits in Kapitel 3 kennengelernt. In Abb. 5.10 wurde das in Abb. 3.18 dargestellte Mikroprogramm-Steuerwerk so erweitert, dass es als Leitwerk verwendet
werden kann.
Der Opcode wird im Befehlsregister abgelegt und durch ein Schaltnetz in
die Startadresse des zugehörigen Mikroprogramms umgeformt. Der SteuerwortSpeicher wird über das Control Memory Address Register (CMAR) adressiert,
das auf Mikroprogramm-Ebene die gleiche Funktion hat wie der Programmzähler für Makroprogramme. Dieser Mikroprogrammzähler wird zu Beginn mit
der Startadresse geladen und bei einem linearen Mikroprogramm mit jedem
Taktzyklus um eins inkrementiert. Am Ende jedes Mikroprogramms muss das
Befehlsregister mit dem nächsten Maschinenbefehl geladen werden und der beschriebene Ablauf wiederholt sich. Das Mikroprogramm für diese Holephase
wird somit am häufigsten durchlaufen.
5.7. Leitwerk
Adressfeld
StartadressTransformation
+1
0
1
2
CMAR
Opcode
173
SteuerwortSpeicher
Statusregister
Testmultiplexer
Interrupts
Steuerwort
Abbildung 5.10: Aufbau eines reagierenden Mikroprogramm-Steuerwerks zur
Ablaufsteuerung.
5.7.2
Mikrobefehlsformat
Mikrobefehle enthalten nicht nur Steuerbits, sondern auch Information zur
Adresserzeugung für den Mikrobefehlszähler. Da während eines Mikroprogramms
Interrupts und Status-Flags zu Verzweigungen führen können, benötigt man ein
reagierendes Mikroprogramm-Steuerwerk. Ein Mikrobefehl setzt sich im Wesentlichen aus zwei Teilen zusammen:
1. einem Steuerwort zur Auswahl der Operationen im Rechenwerk,
2. einem Adressauswahlwort, um die Adresse des nächsten Mikrobefehls festzulegen.
Der überwiegende Teil des Steuerworts wird zur Steuerung von Mikrooperationen im Rechenwerk benötigt. Wenn mehrere Funktionseinheiten im Rechenwerk vorhanden sind, können auch mehrere Mikrooperationen gleichzeitig
ausgeführt werden. Es werden dann auch weniger Mikroprogramm-Schritte zur
Ausführung eines Befehls gebraucht. Andererseits erhöht die Zahl der parallelen Mikrooperationen auch die Zahl der Steuer-Bits bzw. den Hardwareaufwand
des Rechenwerks.
In der Praxis arbeitet man mit codierten Mikrobefehlen, da nur ein geringer
Prozentsatz der theoretisch möglichen Steuerwörter sinnvolle Mikrooperationen
bewirkt. Wenn anstelle von Multiplexern Schalter (z.B. CMOS Transmission
Gates) oder Bustreiber vor den Registern benutzt werden, können bei uncodierter Ansteuerung Datenpfade geschaltet werden, die auf dasselbe Register
führen. Dabei würden sich die Daten gegenseitig verfälschen. Um den Aufwand
zur Decodierung gering zu halten, unterteilt man das Steuerwort in mehrere
voneinander unabhängige Felder. Jedes Steuerfeld codiert eine Mikrooperation, die gleichzeitig zu den Mikrooperationen anderer Steuerfelder ausgeführt
174
Kapitel 5. Aufbau und Funktionsweise eines Computers
werden kann. Man beachte, dass mit der Decodierung eine Zeitverzögerung
verbunden ist, die sich zur Zugriffszeit des Steuerwort-Speichers addiert.
Allgemein können wir zwei grundlegende Mikrobefehlsformate unterscheiden: horizontale und vertikale Mikrobefehle. Horizontale Mikrobefehle sind gekennzeichnet durch viele Steuer-Bits und eine hohe Zahl paralleler Mikrooperationen. Vertikale Mikrobefehle benutzen nur ein Steuerfeld und haben einen
hohen Decodierungsaufwand. Es wird in jedem Taktzyklus immer nur eine einzige Mikrooperation ausgeführt. Die genannten Mikrobefehlsformate findet man
in der Praxis selten in ihrer Reinform. Sie liegen meist in einer Mischform vor.
Wenn z.B. ein zweiter Speicher zur Decodierung langer horizontaler Steuerwörter benutzt wird, so spricht man von Nanoprogrammierung.
Wie oben bereits erwähnt ist die Mikroprogrammierung der Goldstandard
bei CISC-Prozessoren. Die Komplexität der Maschinenbefehle sowie deren Adressierungsarten erfordern unterschiedlich viele Mikrobefehle (Taktzyklen), die nur
durch Mikroprogrammierung flexibel implementiert werden können. Im nachfolgenden Kurs Computersysteme 2 werden wir Prozessoren zunächst aus der
Sicht des Programmierers beschreiben. Man bezeichnet diese Sichtweise auch
als Befehlssatzarchitektur, da sie nur die vom Prozessor bereitgestellte Funktionalität und nicht deren Realisierung beschreibt. Die Befehlssatzarchitektur
hat aber entscheidenden Einfluss auf die (logische und technische) Implementierung eines Prozessors, die man als Mikroarchitektur bezeichnet. Wir werden eine
RISC-Befehlssatzarchitektur kennenlernen, die statt durch Mikroprogrammierung auch durch das so genannte Pipelining implementiert werden kann. Da mit
Pipelining-Mikroarchitekturen die Hardware effizienter ausgenutzt und gleichzeitig die Rechenleistung gesteigert werden kann, bilden sie die Basis moderner
Mikroprozessoren.
5.8
Zusammenfassung
Nach dem Durcharbeiten dieses Kapitels
• kennen Sie die Komponenten eines Computers und können seine Funktionsweise anhand des grundsätzlichen Ablaufs von Befehlen erklären,
• verstehen Sie die Bedeutung interner und externer Bussysteme,
• können Sie die Arten und Aufgaben verschiedener Prozessorregister beschreiben,
• kennen die Komponenten eines Rechenwerks,
• können Sie mikroprogrammierbare Leitwerke für Mehrzyklenbefehle erklären, und
• haben Sie die wesentlichen Speicherarten sowie deren Zugriffzeiten kennengelernt.
5.9. Lösungen der Selbsttestaufgaben
5.9
Lösungen der Selbsttestaufgaben
Selbsttestaufgabe 5.1 von Seite 147
Bei Auswertung der Verzweigungsbedingung gilt PC=0009, d.h. wir müssen als
Offset den Wert 0004 − 0009= −5 wählen.
Selbsttestaufgabe 5.2 von Seite 153
Das Register R3 dient als Indexregister und damit als Adressregister. Die Register R0, R1, R2 und R4 dienen als Datenregister.
Selbsttestaufgabe 5.3 von Seite 155
PUSH A:
M [SP ] ← A
SP ← SP + 1
Entsprechend dazu wird die POP-Operation in umgekehrter Richtung definiert:
POP A:
SP ← SP − 1
A ← M [SP ]
Der Stapelzeiger muss mit dem Wert 0 initialisiert werden.
Selbsttestaufgabe 5.4 von Seite 165
Die Codebits seien mit C2 , C1 und C0 notiert.
Die Schaltfunktionen lauten:
C2 = IRQ4
C1 = IRQ4 ∧ (IRQ3 ∨ IRQ2 )
C0 = IRQ4 ∧ (IRQ3 ∨ IRQ3 ∧ IRQ2 ∧ IRQ1 )
Selbsttestaufgabe 5.5 von Seite 170
Das Schaltbild der MiniALU ist Abb. 5.11 dargestellt. Der Eingang B wird
über XOR-Schaltglieder in den zweiten Eingang des Addierschaltnetzes eingespeist. Ein Eingang jedes dieser XOR-Schaltglieder ist mit Compl verbunden.
175
176
Lösungen der Selbsttestaufgaben
=1
n
≥1
n
&
n-Bit
4:1
MUX
n
F
n
S
1
S
0
n
n
A
B
n
=1
n-Bit
AddiererSchaltnetz
Compl
Cin
Abbildung 5.11: Aufbau der MiniALU. Der Ausgangsübertrag des Addierers
ist nicht gezeigt.
Daher wird bei Compl = 1 und Cin = 0 das Einerkomplement bzw. mit Cin = 1
das Zweierkomplement gebildet. Der Ausgangsübertrag des Addierers ist nicht
gezeigt, da er in einer ALU normalerweise nicht zum Ausgang geht (die Zielregister haben wie die Quellregister eine Breite von n Bit), sondern zu einem
Statusregister.
Index
Addierglieder, 46
Adressdecodierer, 45
Adressfeld, 148
ALU, 59, 119
Äquivalenz, Automaten, 92
Äquivalenz, Zustände, 100
Äquivalenzklasse, 101
Assembler, 149
Ausführungsphase, 145
Automat, 88
Automat, endlicher, 89
Automat, Vollständigkeit, 90
Automat, Widerspruchsfreiheit, 90
Automatenmodelle, 88
fetch, 145
Finite State Maschine, 89
Firmware, 172
Flags, 145
FSM, 89
Funktionsgleichung, 22
Funktionsschaltnetz, 123
Funktionstabelle, 21
Funktionstabelle, unvollstandige, 21
Funktionstabelle, vollstandige, 21
BCD–Code, 42
Befehlsregister, 145
Befehlszähler, 145
Binäre Codierung, 104
Boolesche Algebra, 15
Bootstrap Loader, 150
Halbaddierer, 47
Hauptspeicher, 150
Hazard, 71
Holephase, 145
Hot-one-Codierung, 103
Cache, 150
CISC-Prozessoren, 148
Code–Umsetzer, 42
Computer, Grundlagen, 142
Control Memory, 124
CPU, 143
Indexregister, 149
Interrupt, 154, 158
–Anwendungen, 158
–Beispiel, 164
–Betriebssysteme, 158
–Codemethode, 162
–Ein-/Ausgabe, 158
–Prioritäten, 162
–Service-Routine, 161
–Verarbeitung, 159
–maskierbarer, 160
–nicht maskierbarer, 160
–polling, 161
Interrupt Handler, 161
Interrupt-Controller, 162
Interrupt-Vektor, 159
Interrupts
–Abfragemethode, 161
–Vektormethode, 161
Darstellungsformen, 91
Datenabhängigkeiten, 123
Datenbus, 150
Demultiplexer, 55
Drei-Adress-Maschine, 165
Ein-/Ausgabe, 143, 150
Ein-Adress-Maschine, 165
Ein-Wort-Befehle, 149
EPROM, 70
Exceptions, 159
Fehlerbehandlung, 159
GAL, 104
Gate Array Logic, 104
Grundverknupfung, 19
177
178
Index
Karnaugh–Veitch, 27
Kernimplikant, 35
Komparator, 51
Konstruktionsregeln, 122
KV–Diagramm, 27
Leitwerk, 145, 171
–Mikroprogrammierung, 172
–Steuerwort-Speicher, 172
LIFO-Prinzip, 154
Logische Operationen, 168
Makroassembler, 157
Makros, 157
Maxterm, 24
Mealy-Automat, 89
Memory-Mapped IO, 152
Mikroassembler, 172
Mikroprogramm-Steuerwerk
–Mikrobefehlsformat, 173
–Mikrooperation, 173
–Mikroprogrammzähler, 172
–reagierendes, 173
Mikroprogrammierung, 124
Mikroprogrammsteuerwerk, 105
Mikroprozessor, 150
Minimierung, 29
Minterm, 24
Mnemonic, 149
Moore-Automat, 89
Multiplexer, 53
Normalform, disjunktive, 24
Normalform, konjunktive, 24
Null-Adress-Maschine, 165
Opcode, 142, 145, 148
Operationscode, 145
Operationswerk, 115
–universelles, 136
overflow, 60
PAL, 70
Paralleladdierer, 48
PLA, 70
Primimplikant, 34
Prioritäten, 160
Prioritätsencoder, 162
Produktterm, 65
Programmierbare Logikbausteine, 104
PROM, 69
Prozessor, 143
Prozessorregister, 152
Quine–McCluskey, 32
Races, 75
RALU, 167
Rechenwerk, 143
– Registerarchitektur, 165
– Stapelarchitektur, 165
–Adressregister, 153, 165
–Datenpfade, 166
–Datenregister, 152, 165
–Status-Flags, 169
–logische Operationen, 168
Registerblock, 123
Rekursion, 157
RETI-Befehl, 160
Ripple Carry Adder, 50
RISC-Prozessoren, 148
ROM, 67
Schaltalgebra, 15, 17
Schaltfunktion, 17, 18
Schaltnetz, 14
Schaltvariable, 18
Schaltwerk, Analyse, 94
Schaltwerk, Implementierung, 104
Schaltwerk, komplexes, 115
Schaltwerk, Synthese, 97
Schaltzeichen, 28
Schiebemultiplexer, 167
Segmentregister, 153
Shifter, 144, 167
Signallaufzeit, 71
Software-Interrupt, 158
Speicher, 142, 150
Speicherglieder, 83
Stapel, 153
–Stapelzeiger, 153
Stapelzeiger, 154
Status-Flags, 169
Statusregister, 145
Statusvektor, 116
Steuerbus, 151
Steuervektor, 116
Index
Steuerwerk, 115
–Entwurf, 124
Steuerwort-Speicher, 124
Systembus, 152
Systembusschnittstelle, 152
Trap, 159
Unterbrechnung, 158
Unterbrechung, 154
Unterprogramm, 154, 155
–CALL-Befehl, 156
–RETURN-Befehl, 156
–Zeitbedarf, 157
Urladeprogramm, 150
Vektorfunktion, 35
Verschachtelung, 157
Volladdierer, 47
Zustands-Codierung, 103
Zustands-Codierung, Binäre Codierung,
104
Zustands-Codierung, Hot-one-Codierung,
103
Zustands-Minimierung, 100
Zustandstabelle, 114
Zustandsgraph, 91
Zustandstabelle, 91
Zwei-Adress-Maschine, 165
Zweierkomplement, 60
179
Download