Im Sommersemester 1995 fand am Fachbereich Informatik, Arbeitsbereich Technische Grundlagen der Informatik, seit längerer Zeit wieder das Grundstudiums-Projekt "Entwurf eines Mikrorechners" statt.
Dabei sollten die Teilnehmer ihr im Grundstudium erworbenes theoretisches
Wissen dazu verwenden, den Zentralprozessor (Central Processing Unit,
CPU) eines Mikrorechners von Grund auf zu entwerfen, ihn sodann mittels
noch zu erwerbender Kenntnis einer Hardware-Beschreibungssprache in FPGA-Technik
zu "fertigen" und in eine vorgegebene und -gefertigte Rechnerumgebung
einzufügen, so daß ein funktionsfähiger Mikrorechner mit Standardkomponenten
entsteht. Gegenüber dem letzten solchen Projekt im Jahre 1989 hatten die
Teilnehmer dabei den Vorteil, daß die Hardware sich vor Ort erstellen und,
durch simples Neuprogrammieren des FPGAs, „reparieren" läßt.
Die Ziele einer so aufwendigen Veranstaltung wie des "Mikrorechner-Praktikums" lassen sich grundsätzlich in zwei Gruppen aufteilen: Zunächst sichtbar und den Teilnehmern ständig als Maßstab, an dem sie ihren Fortschritt und die noch verbleibende Zeit messen, vor Augen, ist das primäre, das Fertigungsziel. Am Ende eines jeden Projektes sollte wiederum eine jede Gruppe ein vorzeigbares Endprodukt ihrer Bemühungen vorweisen können; entweder ist dieses greifbar, wie in dem vorliegenden Fall, wenn ein Mikroprozessor gefertigt wurde, dessen Gehäuse man in die Hand nehmen und den man in der Mikrorechnerplatine in Aktion bewundern kann, oder lediglich vortragbar, etwa wenn sich das Projekt mit der Verabschiedung einer Spezifikation, der Ausarbeitung einer technischen Empfehlung etc. befaßt hat.
Das Fertigungsziel stellt eine nicht zu unterschätzende Motivationshilfe für die Teilnehmer dar. Wird es erreicht, werden die Teilnehmer nicht nur (zu Recht) stolz auf sich sein, sondern sie können auch davon ausgehen, daß sie die weniger offensichtlichen Ziele der Veranstaltung, die Lernziele, erreicht haben. Diese Annahme scheitert selbstverständlich bei "Fertigungshilfen" wie dem blinden Kopieren fremder Teillösungen oder dem geschickten Aushorchen der Veranstalter immer dann, wenn eigenes Denken gefragt wäre.
Wie schon erwähnt, ist das Fertigungsziel gleichzeitig Meßlatte für den Erfolg (mit den oben genannten Einschränkungen) des Projektes bezogen auf den einzelnen Teilnehmer, wie mahnender Hinweis auf die noch verbleibende Zeit. Wird das Fertigungsziel in Unterziele zerlegt, was bei komplexen technischen Zielen sowieso unabdingbar ist, kann jederzeit anhand der schon erledigten, der bereits angegangenen und der noch nicht gelösten Aufgaben grob abgeschätzt werden, ob man sich noch im Zeitplan befindet. Nebenbei erweitert sich dabei der Katalog der Lernziele um zwei weitere: die Fähigkeit zur Aufspaltung von Problemen in sinnvoll bearbeitbare Teilprobleme (und deren Verteilung im Team) sowie das Umgehen mit der knappen Ressource Zeit.
Es ist einleuchtend, daß im Rahmen eines Hochschulstudiums, dessen Ziel
der Erwerb von Wissen und darauf basierenden Fähigkeiten ist, den schon
mehrfach erwähnten Lernzielen größere Bedeutung beizumessen ist, als dem
Fertigungsziel. Am Ende seiner Zeit an der Universität soll der Student
ja nicht über ein Sammelsurium an selbstgefertigten Prototypen, Programmen
und Protokollen verfügen, sondern über das fachliche und allgemeine Wissen,
das notwendig ist, um ihn guten Gewissens für bestimmte Aufgaben einzusetzen
bzw. sich mit Aussicht auf Erfolg selbständig zu machen. Das „fachliche
und allgemeine Wissen" umfaßt, um dieses noch einmal explizit zu sagen,
nicht nur die Kenntnis fachlicher, technischer Tatsachen, sondern eben
auch die Beherrschung allgemeingültiger Vorgehensweisen wie des selbständigen
Arbeitens und des teamwork. Auch in diesem Bereich konnten die Teilnehmer
wegen des Projektcharakters der Veranstaltung dazulernen.
Nach diesen Vorbetrachtungen sind wir nun in der Lage, das Grundstudiums-Projekt
"Entwurf eines Mikrorechners" auf seine Fertigungs- und Lernziele
hin zu untersuchen; dazu betrachten wir zunächst seine inhaltliche Ankündigung
im kommentierten Vorlesungsverzeichnis:
Lernziel: Umsetzen des Lehrstoffes der Vorlesungen B1 und B2
am praktischen Beispiel einschließlich Chip-Entwurf.
Inhalt: Der Mikrorechner soll alle typische Merkmale eines von Neumann-Rechners aufweisen. Jedoch soll der Befehlssatz einfacher als in der Vorlesung gehalten werden; dadurch wird auch der Hardware-Aufbau einfacher. Das Steuerwerk wird dadurch relativ unkompliziert, so daß neben einer Mikroprogrammsteuerung auch eine Alternative, nämlich ein Steuerwerk als Moore-/Mealy-Automat möglich wird.
Andererseits werden am praktischen Beispiel einige Fragekomplexe in
ihrer Bedeutung mehr in den Vordergrund treten als in der Vorlesung, nämlich:
korrektes Umgehen mit Zeitbegriffen (Flanken-/Pegelsteuerungen), drohende
Taktimpulsverschiebungen, Anschluß von Hauptspeicherbausteinen, Simulationstechnik.
Zum praktischen Betrieb des Rechners wird auch der Entwurf eines einfachen
Assemblers nötig.
Vorgehen: Begleitet durch eine studentische Hilfskraft wird ein Platinenaufbau vorbereitet, so daß über Schnittstellen auch der Anschluß eines Terminals und weiterer einfacher peripherer Einheiten möglich wird. Im Projektverlauf selbst sollen sich kleine Gruppen bilden, die sich schwerpunktartig auf ein Teilthema konzentrieren; z.B. "Operationswerk", "Steuerwerk", "Assembler", "Anschluß eines Terminals". Es gibt regelmäßig "Plenarsitzungen", in denen die Gruppen berichten und bei denen die Ergebnisse diskutiert und aufeinander abgestimmt werden. Wer sich besonders für die Fragen des Chip-Entwurfs interessiert, kann sich parallel zur Entwurfsarbeit in die Fragen der Bedienung des vor Ort existierenden FPGA-Entwurfssystems einarbeiten (FPGA: Field Programmable Gate Array); dieses System erlaubt es, Chips vor Ort - und somit noch innerhalb des Sommersemesters 95 - fertig entstehen zu lassen (FPGAs bilden das derzeit erfolgreichste Verfahren zur Chip-Herstellung in kleinen Stückzahlen).
Durch die Diskussion in den Plenarsitzungen erhalten alle Teilnehmer
zu allen Gesichtspunkten eine solide Vertiefung ihres bisherigen Wissens.
Das primäre Fertigungsziel war eindeutig der auf dem MPB einzusetzende Zentralprozessor, genauer gesagt eine Hardwarebeschreibung, die aus dem 81500-FPGA einen solchen Zentralprozessor macht. Als Unterziele, die am Endprodukt nicht mehr sichtbar auftreten, können dabei die für einen von Neumann-Rechner typischen Komponenten Steuer- und Operationswerk gelten. Das dritte Spezifikum, der gemeinsame Speicher für Programme und Daten, steht für alle Gruppen einheitlich als SRAM auf dem MPB zur Verfügung - erstellt werden muß nur ein Automat, der das RAM und alle anderen Speicherbereich anspricht. Für die Abfassung von Programmen in der dem jeweiligen Prozessor eigenen Maschinensprache ist der einfache Assembler von Nutzen, der sicherlich ein vorzeigbares Endprodukt darstellt.
Wie man sieht, hält sich die Anzahl der Fertigungsziele in Grenzen, doch hinter dem Ziel "Prozessor" stecken viele Aufgaben, die gelöst sein wollen, was sich in der wesentlich größeren Zahl an Lernzielen ausdrückt: Zunächst einmal gilt es für die Projektteilnehmer, eine Spezifikation ihres Prozessors abzufassen. Dabei wird sicherlich die Erkenntnis vertieft, daß man nur durch stepwise refinement (schrittweise Verfeinerung) der Spezifikation von einem groben Bild in den Köpfen zu einer technischen Beschreibung kommt, die eine große Zahl von Vorgaben, wie z.B. Protokolle auf den Leitungen, einhält. Schon frühzeitig wird man ausreichendes Wissen über die Realisierung des Steuerwerkes als state machine (Unterschied Moore-/Mealy-Automat) oder per Mikrocode erwerben müssen, um sich für eine Variante zu entscheiden. Viel mehr Entscheidungen stehen bei der Festlegung der Kommandos an, die der zukünftige Prozessor verstehen und abarbeiten soll; grundsätzlich gibt es keine Vorgaben für den Befehlssatz, doch sollte den Teilnehmern durch Vorträge im Plenum über allgemeinen Aufbau und Familien von Prozessoren sowie die FPGA-Technologie klar werden, daß ihnen nur recht begrenzte Kapazitäten auf dem Chip zur Verfügung stehen und zudem nicht jeder Befehl für einen Demonstrationsrechner notwendig ist - ein Multiplikationsbefehl z.B. kann durch ein einfaches Programm auf Basis der Addition ersetzt werden. Manche Befehle lassen sich auch durch die konkrete Ausgestaltung des MPB vermeiden; In-/Out-Instruktionen beispielsweise sind überflüssig, weil Peripherie-Geräte in den Speicher eingeblendet werden, so daß die üblichen Lese- und Schreibbefehle ausreichen. Oftmals läuft die Entscheidung für oder gegen einen Befehlssatz auf die Frage "CISC oder RISC?" hinaus. Weil diese Frage nur in sehr konkreten Fällen allein durch technische Notwendigkeiten beantwortet werden kann, sie somit zu einem guten Teil ideologisch, mit anderen Worten "aus dem Bauch heraus" entschieden wird, wird schnell klar, daß, zumindest für manche Teilnehmer, auch das Erhalten der Arbeitsfähigkeit der Gruppe durch Beschränkung auf die Sachfragen zum Lernstoff gehört. Wegen der Fülle der anstehenden Aufgaben (Spezifikation, Entwurf von Operationswerk und Steuerwerk, Programmierung eines Assemblers, Einarbeitung in die Hardwarebeschreibungssprache AHDL und den zugehörigen "logic synthesizer" Max+plus II, Umsetzen der Entwürfe in AHDL, intensives Austesten auf mehreren Ebenen, Schreiben einfacher Programme, eventuell Anschluß eines Terminals) ist es sinnvoll, den Begriff teamwork so zu verstehen, daß teams zusammenarbeiten, die die einzelnen Aufgaben erledigen. Das Aufteilen des Gesamtprojektes in Teile ist bei dem vorliegenden Beispiel noch recht simpel, schwieriger wird das Zusammenfügen der Ergebnisse, besonders, wenn man nebenbei das Ziel verfolgt, allen Gruppenmitgliedern das Verständnis der Gesamtarbeit zu ermöglichen, also zu starke Arbeitsteilung zu vermeiden. Sofern die Gruppe sich nicht dafür entscheidet, die Spezifikationsarbeit zu Beginn so weit wie möglich zu erledigen, wird sie feststellen, wie wichtig es ist, allen Arbeitsgruppen den jeweils aktuellen Stand mitzuteilen.
Kommen wir zurück zu den Lernzielen, die spezifisch für die technische
Seite des Studienganges Informatik sind: Eine "solide Vertiefung"
des Verfügungswissens erfolgt zu Beginn des Projektes für alle Teilnehmer
durch Vorträge im Plenum. Nach der Spezifikationsphase folgt die der Realisierung
mit einem konkreten Software-Instrument auf einer konkreten Hardware-Plattform,
wobei der Entwurf folgende Stufen durchläuft:
Diese Aufzählung der Entwurfsstufen ist keinesfalls so zu verstehen, daß jede Stufe nur einmal und alle nacheinander durchlaufen werden. Überall wo es sinnvoll ist, kann zu einer früheren Stufe zurückgekehrt werden, etwa stets zu 1., wenn ein Fehler im AHDL-Kode erkannt wurde. Selbstverständlich kann auch parallel gearbeitet werden: Ein team kann beispielsweise auf den ersten drei Stufen arbeiten, um einen Prozessor mit neuen Fähigkeiten zu versehen, während ein anderes für den schon existierenden Entwurf Programme schreibt und diese unter 4. testet.
Ein letztes, aber sehr wichtiges Lernziel, welches spätestens in der
zweiten Hälfte von 3. auftritt, sei abschließend erläutert: das Erkennen
und Beherrschen des weiten Feldes von Fehlermöglichkeiten bei Übergang
in die physikalische Ebene. Was bedeutet dies? In den vorbereitenden Plenumssitzungen
wird bereits auf den "korrekten Umgang mit Zeitbegriffen" (Flanken-
oder Pegelsteuerung) hingewiesen, sowie auf "drohende Taktimpulsverschiebungen";
Hazards sollten aus dem B-Vorlesungszyklus bekannt sein. Dennoch
wird den meisten Projektteilnehmern das Gewicht dieser möglichen Gründe
für das Abweichen ihres Prozessors von seiner Beschreibung erst dann bewußt,
wenn eben die Strukturbeschreibung oder der reale Prozessor an einem (Teil-)Befehl
scheitern, den die Verhaltensbeschreibung perfekt ausführt. Daraufhin sollten
sie ihre Hardwarebeschreibungen nach folgenden Schwächen durchsuchen und
die genannten "Gegenmittel" erlernen und anwenden:
Wie auf der Abbildung zu erkennen ist, erfolgte der Aufbau des MPB auf einer Lochrasterplatine. Bei rund 1000 notwendigen Leitungen hätte nur eine aufwendige Multilayer-Platine (fünf bis sechs Verdrahtungsebenen; siehe auch Kap. 2.4.5 Unerfüllte Wünsche) den Anforderungen entsprochen, so daß die Verdrahtung vollständig mit Wrap-Drähten erfolgte.
Sehr gut zu erkennen sind die beiden Altera FPGA-Bausteine - der etwas größere 280polige EPF 81500 für den Prozessor oben, der 232polige EPF 81188 für das Hilfs-FPGA unten. Rechts neben den beiden befinden sich das 20x2-Zeichen-Display und die 20 Tasten der "Hex"-Tastatur.
Eine Reihe von ICs im klassischen DIL-Gehäuse erstreckt sich über Prozessor und Display über die ganze Breite des Mikroprozessorboards; dies sind von links nach rechts: Mikrocode-RAM (fünf ICs), SRAM (zwei ICs), EPROM (zwei ICs, unbestückt), paralleler Schnittstellenbaustein PIO 8255, serieller Schnittstellenbaustein UART 2681. Zwischen Mikrocode- und SRAM ebenso wie an der linken Seite des Prozessors befinden sich senkrechte Reihen aus roten Leuchtdioden, einmal zur Anzeige von Steuersignalen, einmal zur freien Verwendung durch den Prozessor.
Ebenfalls deutlich sichtbar sind die neunpoligen Anschlüsse für zwei
serielle RS232-Schnittstellen rechts oben (zum Anschluß von Terminals).
Dunkle waagerechte und senkrechte Linien sind Pull Up- und Pull Down-Widerstände,
die die Busse auf definierte Logik-Pegel bringen.
Das Blockschaltbild 3.1.1 zeigt die wesentlichen Einheiten auf dem Mikroprozessorboard
und ihre Verbindungen. Aus der Detailansicht 3.1.2 sind sämtliche ICs und
elektrischen Bauteile mit ihren (Sockel-)Bezeichnungen ersichtlich; diese
umfassen:
Nur aus 3.1.1 gehen einige der notwendigen Leitungen zwischen den Bauteilen
hervor; diese umfassen unter anderem:
Die meisten Komponenten aus obiger Auflistung erklären sich selbst, insbesondere die "Pfennigbauteile". Auf einige komplexere sei aber doch noch näher eingegangen, um zu erläutern, welche Aufgaben aus der Fülle der denkbaren diese auf welche Art erfüllen:
Das Mikrocode-RAM für auf Mikrocode basierende Prozessor-Entwürfe (im Gegensatz zu solchen, die komplexe endliche Automaten realisieren) ist nicht mit Adreß- und Datenbus verbunden, sondern "hängt" direkt am Prozessor, welcher es ja auch benutzen soll.
Um dieses RAM vom Hilfs-FPGA aus zu beschreiben, muß ein besonderer
"Prozessor" in das 81500-FPGA geladen werden, das sogenannte
Mikrocodeladedesign. Diese Logik reicht address und databus, sowie m_oe
und m_we an das Mikrocode-RAM durch und erzeugt passende Chip Select-Signale.
Zur Aufteilung des globalen Adreßraumes und zu erforderlichen Sicherheitsmaßnahmen
siehe Kap. 2.3.1.7 Die Chipselect-Logik.
Die EPROM-Bausteine für den Prozessor sollen einmal unveränderliche
Routinen in der Maschinensprache des jeweiligen Entwurfes enthalten (bzw.
Code für unterschiedliche Entwürfe an verschiedenen Adressen), also z.B.
ein rudimentäres Betriebssystem und Diagnoseprogramme. Demgegenüber soll
der Nur-Lese-Speicher an der Seite des Hilfs-FPGAs dessen Konfigurationsdaten
enthalten, um einen Einplatinenbetrieb zu ermöglichen. Durch Umstecken
von J8 kann das Hilfs-FPGA dann von der sogenannten passiven seriellen
auf die aktive serielle Konfiguration umgestellt werden, in der
es selbsttätig Adressen im richtigen Zeittakt für diese Konfigurations-EPROMs
generiert.
Der parallele Schnittstellenbaustein ist der gleiche, wie der
für das PC-Interface verwendete, welcher auf einer ISA-Steckkarte im PC
sitzt. Siehe Erläuterung der Jumper weiter unten.
Der serielle Schnittstellenbaustein UART 2681 ist ein Standardbauteil,
um bit-seriell und asynchron zu kommunizieren, also die aus der Datenfernübertragung
bekannten "Pakete" aus Startbit(s), fünf bis acht Datenbits (eventuell
mit Paritätsbit) und Stopbit(s) über einen einzigen Kanal zu senden bzw.
von dort zu empfangen und auf die reinen Datenbits zu reduzieren. Mit seiner
Hilfe können die Projektteilnehmer zwei VT200-kompatible Terminals ansteuern
und so ihren Prozessor mit den üblichen Peripheriegeräten Tastatur und
Bildschirm verbinden.
Die Leuchtdiodenreihe LED1 ist direkt mit dem Prozessor verbunden
und in dessen Top Level-Design altera1500.tdf als 16 Ausgänge
definiert. Die Entwerfer einer CPU können also z.B. zum Debugging die
LEDs gezielt aufleuchten lassen. Die Leuchtdiodenreihe LED2 hingegen ist
fest mit einigen Steuersignalen verbunden, und zwar von oben nach unten:
m_halt, m_halt_ack, bus_grant_n , bus_ack_n , irq_n[1], irq_n[0], m_astrobe,
dstrobe_n, m_we, m_oe (Signale, die auch am Hilfs-FPGA auftauchen, sind
mit dessen Namen aufgeführt, andere Namen stammen aus altera1500.tdf).
Die Jumper J0 bis J7 sind direkt mit dem Prozessor verbunden und in dessen Top Level-Design altera1500.tdf als 8 Eingänge definiert. Damit können Entwerfer einer CPU extern den Programmverlauf steuern oder unter verschiedenen Konfigurationen auswählen. Die Jumper J8 bis J11 haben folgende Aufgaben:
Ein weiteres FPGA, Modell EPM 610, ersetzt einen vorher an gleicher Stelle vorhandenen TTL-Baustein mit vier NOR-Gattern und stellt zusätzlich einen Tristate-Treiber zur Verfügung. Letzterer wurde notwendig, als mehr als vier Signale aus dem Hilfs-FPGA über Tristate-Charakteristik verfügen mußten - der FLEX8000 EPF 81188 besitzt nämlich nur vier globale Output Enable-Leitungen. Glücklicherweise blieb den Projektteilnehmern eine ähnliche Ressourcenknappheit erspart - der FLEX8000 81500 besitzt zehn solche Leitungen.