Dieses Kapitel besteht aus zwei Teilen. Um die Kontrollhierarchie PC
-> Hilfs-FPGA -> Mikroprozessor zu realisieren, muß das Hilfs-FPGA
eine Reihe von Kommandos des PCs verstehen; diese werden in der nachfolgenden
Tabelle kurz aufgezählt und in 2.2.2 einzeln erläutert. Die acht Bits der
Schnittstelle zum PC sind aber nur ein kleiner Teil des Pin-Layouts, welches
im Rest des Kapitels, unterteilt in reine Eingänge, bidirektionale Signale
und reine Ausgänge, erläutert wird.
Bezeichnung |
Oberes Nibble |
Unteres Nibble |
Operanden |
Rückgabewerte |
Möglich wann |
Halt |
0000 |
**** |
- |
5 Bytes |
immer |
Go |
0111 |
**** |
- |
- |
immer |
Single Step |
0001 |
**** |
- |
5 Bytes |
halted/s. step |
Single Instruction |
0101 |
**** |
- |
5 Bytes |
immer |
Store Address |
1000 |
**** |
3 Bytes |
- |
immer |
Store Data |
1001 |
**** |
2 Bytes |
- |
immer |
Write RAM |
1010 |
**** |
- |
- |
halted |
Read RAM |
1011 |
**** |
- |
2 Bytes |
halted |
Read Register |
1101 |
Registernr. |
- |
5 Bytes |
halted |
Reset Processor |
1110 |
**** |
- |
- |
immer |
Eval Keys |
0011 |
**** |
- |
- |
running |
Don't Eval Keys |
0010 |
**** |
- |
- |
running |
Config Start |
0100 |
001* |
- |
- |
immer |
Config Data |
0100 |
010* |
1 Byte |
- |
immer |
Config End |
0100 |
100* |
- |
1 Byte |
immer |
Report Status |
1100 |
**** |
- |
1 Byte |
immer, auch bei Warten auf |
Abort |
0110 |
**** |
- |
- |
m_halt_ack o. m_reg_ack |
Kommandowörter: halt, halt2, si
Dieser Befehl wurde mit Single Instruction zusammengefaßt und ist nun in jedem Modus erlaubt.
In den Modi running oder single step beendet der Mikroprozessor die laufende Instruktion und hält dann, bei halted wird genau eine neue Instruktion ausgeführt. Rückgabewerte sind erst die letzte gültige Adresse, auf 24 Bit erweitert, dann das letzte gültige Datum, jeweils most significant byte (höchstwertiges Byte) voran.
Der Mikroprozessor hält als Reaktion auf m_halt '0', die Clock läuft normal weiter. Soll im Modus halted die nächste Instruktion ausgeführt werden, wird m_halt bei den Kommandowörtern halt und si für einen Takt auf '1' gezogen. Bei einigen Prozessor-Designs jedoch reicht dieses nicht aus, so daß mit halt2 das Signal m_halt für zwei Takte auf '1' bleibt.
Dieser Befehl wartet auf m_halt_ack vom Mikroprozessor und kann mit Reset abgebrochen werden; mit Report läßt sich status_reg(7) ermitteln, bei '1' wartet das Hilfs-FPGA noch.
Dieser Befehl ist stets erlaubt.
Hilfs-FPGA geht in Zustand halted, d.h. in status_reg(5 downto
4) steht "10".
Kommandowort: go
Der Mikroprozessor nimmt Normalbetrieb wieder auf.
Hilfs-FPGA geht in Zustand running, d.h. in status_reg(5 downto
4) steht "00".
Kommandowort: si
Der Mikroprozessor führt genau einen Arbeitsschritt durch, d.h. bekommt eine Clockflanke. Rückgabewerte sind erst die letzte gültige Adresse, auf 24 Bit erweitert, dann das letzte gültige Datum, jeweils most significant byte (höchstwertiges Byte) voran.
Nur erlaubt, wenn der Mikroprozessor nicht mehr läuft (status_reg(5 downto 4) "00").
Hilfs-FPGA geht in Zustand single step, d.h. in status_reg(5
downto 4) steht "11".
Kommandowörter: halt, halt1, si
Dieser Befehl wurde mit Single Instruction zusammengefaßt und ist nun in jedem Modus erlaubt.
Weitere Beschreibung siehe Halt.
Kommandowort: sta
Soll ein Gerät im Adreßbereich des Mikroprozessors gelesen oder beschrieben werden, so erfolgt dies stets an der Adresse, die in einem internen Register des Hilfs-FPGA - areg_rollin - steht. Dieser Befehl setzt areg_rollin.
Zu senden sind 3 Bytes, das most significant byte (höchstwertiges Byte) zuerst, dessen oberste drei Bits ignoriert werden (21 Bit Adressen).
Dieser Befehl ist stets erlaubt.
Kommandowort: std
Soll ein Gerät im Adreßbereich des Mikroprozessors beschrieben werden, so erfolgt dies stets mit den Daten, die in einem internen Register des Hilfs-FPGA - dreg_rollin - steht. Dieser Befehl setzt dreg_rollin.
Zu senden sind 2 Bytes, das most significant byte (höchstwertiges Byte) zuerst (16 Bit Daten).
Dieser Befehl ist stets erlaubt.
Kommandowort: wr
Die Adresse aus areg_rollin wird mit dem Wert aus dreg_rollin beschrieben.
Nur erlaubt, wenn der Mikroprozessor hält (status_reg(5 downto 4) =
"10"), nicht im Single-Step-Modus! Letzterer nämlich ist für
den Prozessor transparent, seine verlangsamte Arbeitsweise wird ja nur
durch ein Aussetzen der Taktung erreicht, was bedeutet, daß sich der Prozessor
mitten in einem Schreib- oder Lesezyklus befinden kann, der nicht so einfach
zu unterbrechen und fehlerfrei fortzuführen ist.
Kommandowort: rr
Der Wert an der Adresse areg_rollin wird in einem internen Register des Hilfs-FPGA - dreg_muxout - gespeichert. Anschließend wird dessen Wert, most significant byte (höchstwertiges Byte) voran, gesendet (16 Bit Daten).
Nur erlaubt, wenn der Mikroprozessor hält (status_reg(5 downto 4) =
"10"), nicht im Single-Step-Modus! Letzterer nämlich ist für
den Prozessor transparent, seine verlangsamte Arbeitsweise wird ja nur
durch ein Aussetzen der Taktung erreicht, was bedeutet, daß sich der Prozessor
mitten in einem Schreib- oder Lesezyklus befinden kann, der nicht so einfach
zu unterbrechen und fehlerfrei fortzuführen ist.
Kommandowort: read_reg
Das Befehlswort selbst enthält hier vier Bits, die an den Mikroprozessor mit der Aufforderung geschickt werden, den Wert des durch diese Bits bezeichneten Mikroprozessor-Registers auf Adreß- oder Datenbus zu legen (je nach Bitbreite des Registers und vorhandenen Datenpfaden).
Sowohl Adresse als auch Datum werden gepuffert - in areg_muxout und dreg_muxout - und anschließend wie bei Halt übertragen.
Dieser Befehl wartet auf m_reg_ack vom Mikroprozessor und kann mit Reset abgebrochen werden; mit Report läßt sich status_reg(6) ermitteln, bei '1' wartet das Hilfs-FPGA noch.
Nur erlaubt, wenn der Mikroprozessor hält (status_reg(5 downto 4) =
"10"), nicht im Single-Step-Modus! Letzterer nämlich ist für
den Prozessor transparent, seine verlangsamte Arbeitsweise wird ja nur
durch ein Aussetzen der Taktung erreicht, was bedeutet, daß sich der Prozessor
mitten in einem Schreib- oder Lesezyklus befinden kann, der nicht so einfach
zu unterbrechen und fehlerfrei fortzuführen ist.
Kommandowort: dreset
Sendet für einen Takt einen synchronen Hardware-Reset an das Prozessor-FPGA. Dessen Konfiguration ("Programmierung") bleibt erhalten, sämtliche Flipflops werden aber auf ihre Standardwerte zurückgesetzt.
Dieser Befehl ist stets erlaubt.
Dieser Befehl bleibt momentan ohne Auswirkungen.
Wäre es vom Platzbedarf her möglich gewesen, so hätte es ein zukünftiges Design des Hilfs-FPGAs erlaubt, einige der Debugging-Befehle wie Lesen oder Schreiben des Speichers über die "Hex-Tastatur" (5x4 Tasten) auf dem MPB durchzuführen. Der PC hätte aber stets als oberstes in der Kontrollhierarchie stehen sollen und mit diesem Befehl die Möglichkeit gehabt, die "Hex-Tastatur" zu deaktivieren.
Nur erlaubt, wenn der Mikroprozessor läuft (status_reg(5 downto 4) =
"00"); ein Halt-Kommando sperrt automatisch die Tastatur, Go
entsperrt sie jedoch nicht.
Kommandowort: load_processor <Dateiname>
(lädt Konfigurationsdaten aus einer .ttf-Datei, konfiguriert Prozessor via Config Start und Config Data, sendet Config End und zeigt das Ergebnis an)
Der Mikroprozessor wird von diesem Kommando in den Konfigurationsmodus geschaltet. Außerdem wird status_reg(1 downto 0) auf "01" (Signal progr_conf_done kam noch nicht) zurückgesetzt.
Dieser Befehl ist stets erlaubt.
Mit diesem Befehl kann ein Byte an Konfigurationsdaten für das Prozessor-FPGA übertragen werden, welches automatisch bit-seriell weitergereicht wird.
Dieser Befehl ist stets erlaubt, ist aber selbstverständlich nur sinnvoll,
wenn das Prozessor-FPGA zuvor in den Konfigurationsmodus versetzt wurde.
Nachdem alle zur Konfigurierung des Mikroprozessor notwendigen Bytes per Config Data übertragen worden sind, sollte dieser Befehl folgen. Als Rückgabewert wird das status_reg übertragen, status_reg(1 downto 0) enthält Angaben über Erfolg oder Mißerfolg der Konfiguration (siehe Report Status).
Dieser Befehl ist stets erlaubt, ist aber selbstverständlich nur nach
Config Data sinnvoll.
Kommandowort: report
Es wird das interne status_reg des Hilfs-FPGAs zurückgeliefert. Dessen
Bits bedeuten:
Stelle | Wert: Bedeutung |
7 | '1': Hilfs-FPGA wartet auf m_halt_ack vom Mikroprozessor |
6 | '1': Hilfs-FPGA wartet auf m_reg_ack vom Mikroprozessor |
5, 4 | "00": Mikroprozessor läuft (running)
"10": Mikroprozessor wurde angehalten (halted) "11": Mikroprozessor ist im Single-Step-Modus |
3 | '1': Unbekanntes Kommando aufgetreten |
2 | '1': Ein Kommando war im damaligen Modus (running/halted/single step) nicht erlaubt |
1, 0 | "00": Konfiguration war erfolgreich
"01": Signal progr_conf_done kam noch nicht "10": Signal progr_conf_done kam zu früh "11": Ein allgemeiner Konfigurationsfehler ist aufgetreten (Signal progr_m_status = '0') |
Die Bits 4 bis 7 werden ständig neu gesetzt.
Die Bits 2 und 3 werden nur durch Report Status zurückgesetzt.
Die Bits 1 und 0 werden durch Config Start auf "01" gesetzt.
Dieses Kommando ist immer erlaubt, auch wenn das Hilfs-FPGA auf m_halt_ack
oder m_reg_ack wartet.
Kommandowort: reset
Sollte der Mikroprozessor nicht mit m_halt_ack/m_reg_ack antworten, falls das Hilfs-FPGA solches erwartet, läßt sich der wartende Befehle mit Abort beenden. Die Werte aller internen Register bleiben jedoch erhalten.
Zu möglichen anderen "hängenden" Befehlen siehe 2.3.2.9 .
Dieses Kommando ist immer erlaubt, auch wenn das Hilfs-FPGA auf m_halt_ack
oder m_reg_ack wartet.
Dieses ist ein asynchrones, low-aktives Reset-Signal und wird vor der
Verwendung als reset noch mit der Clock synchronisiert. Es ist kein Power-On-Reset
(nach dem Einschalten ist das Hilfs-FPGA ja auch noch "leer"),
sondern dient der jederzeitigen Initialisierung des Hilfs-FPGAs. Es führt
also keinesfalls zu einem Verlust der Konfiguration des Hilfs-FPGAs.
Clock für alle speichernden Elemente im Hilfs-FPGA. clk_invers wird extern als das Inverse von clk erzeugt, um Flipflops rückflankengesteuert zu verwenden. Außerdem ist es durch die bereits außerhalb des FPGAs vorgenommene Invertierung möglich, die sogenannten Clock-Netze der Altera FLEX8000-Bausteine zu verwenden. Durch diese Clock-Netze können zwei Signale, auf die keine Logik mehr einwirken soll, direkt und somit mit sehr geringer Verzögerung an alle Flipflops geführt werden. Damit werden Hazards durch zu unterschiedlichen Zeitpunkten eintreffende relevante Clockflanken vermieden.
Sollte aufgrund einfach zu ändernder Design-Annahmen 1 MHz nicht überschreiten
(siehe 2.3.5.3).
Dieses low-aktive Signal hat während der Konfiguration des Prozessor-FPGAs
zweierlei Bedeutung. Erstens geht es zu Beginn als Bestätigung kurz auf
'0', zweitens bleibt es später dauerhaft auf '0', sollte ein allgemeiner
Fehler auftreten.
Mit diesem low-aktiven Signal teilt der Mikroprozessor mit, daß eine
gültige Adresse auf dem Adreßbus liegt; diese wird in areg_muxout gespeichert.
Um interne Register des Mikroprozessors auszulesen, wird mit reg_select
eines bezeichnet und m_reg_request auf '0' gesetzt. Liegt der Wert des
Registers auf Adreß- oder Datenbus an (je nach Bitbreite des Registers
und vorhandenen Datenpfaden), so muß der Prozessor m_reg_ack auf '0' nehmen
und den Wert von Bussen und m_reg_ack mindestens so lange halten,
bis m_reg_request wieder '1' annimmt.
Um den Mikroprozessor sicher erst dann anzuhalten, wenn die aktuelle
Instruktion beendet wurde, wird m_halt auf '0' gesetzt und die Clock weiter
erzeugt. Ist das Ende der Instruktion/der Anfang der nächsten erreicht,
muß der Mikroprozessor m_halt_ack auf '0' setzen und darf den aktuellen
Zustand solange nicht verlassen, wie m_halt '0' bleibt.
Bestätigung vom Prozessor-FPGA: Das letzte Konfigurationsdatenbit wurde
empfangen, der 81500-Baustein enthält nun z.B. einen Prozessor-Entwurf
oder das Ladedesign für das Mikrocode-RAM.
Dieses low-aktive Signal wird nach Synchronisation mit der Clock zu
m_obf, der "Output Buffer Full"-Benachrichtigung vom 8255
Portbaustein. Übergibt der PC dem 8255 ein Befehlswort oder Daten zur weiteren
Versendung, werden diese gelatcht und m_obf geht auf '0'. Wird vom
Hilfs-FPGA abgefragt, um zu ermitteln, wann das nächste Byte abgeholt werden
kann.
Dieses high-aktive Signal wird nach Synchronisation mit der Clock zu
ibf, der "Input Buffer Full"-Benachrichtigung vom 8255
Portbaustein. Wurde ein Byte von außerhalb des PCs mittels m_stb in den
8255 geschrieben, geht ibf solange auf '1', bis der PC die Daten ausgelesen
und somit Platz für neue gemacht hat.
Siehe tast_spalte unter 2.2.5.16 .
Dies ist das achte (höchstwertige) Datenbit des 20x2-Zeichen-Displays
in eingehender Richtung. Es ist bidirektional ausgelegt, da es als Busy
Flag fungiert, über das man abfragen kann, ob das Display, welches
im Verhältnis zum Prozessor sehr langsam arbeitet, das letzte Kommando
schon abgeschlossen, also z.B. das letzte Zeichen schon angezeigt hat.
Aufgrund der Beschränkung des 81188 auf vier Gruppen von Signalen mit Tri
State-Charakteristik muß ein externer Tri State-Treiber benutzt
werden, zu dem die Signale disp_d7_in (Wert vom Display), disp_d7_out (Wert
zum Display) und disp_d7_oe (Output Enable - Aktivierung des Treibers)
führen.
Dies ist der Datenbus der Mikrorechner-Platine.
Dies ist der Adreßbus der Mikrorechner-Platine.
Dies sind die bidirektional fließenden Daten des Interfaces zwischen
PC (genauer Portbaustein 8255) und Hilfs-FPGA. Der bidirektionale Datenfluß
wird gesteuert durch die Handshaking-Signale m_obf und m_ack sowie
ibf und m_stb.
Dies ist das "Output Enable"-Signal an die im Adreßbereich
eingeblendeten Geräte. Höchstens ein Gerät (SRAM, parallele Ein-/Ausgabe,
serielle Ein-/Ausgabe, EPROM, Tastatur, Display) wird durch eine anliegende
Adresse selektiert und via Chip Enable-Signal aktiviert. Diese Einheit
treibt den Datenbus, solange m_oe '0' ist.
Dies ist das "Write Enable"-Signal an die im Adreßbereich
eingeblendeten Geräte. Höchstens ein Gerät (SRAM, parallele Ein-/Ausgabe,
serielle Ein-/Ausgabe, EPROM, Display) wird durch eine anliegende Adresse
selektiert und via Chip Enable-Signal aktiviert. Diese Einheit liest
vom Datenbus, wenn m_we '0' ist (die Tastatur-Ansteuerung sieht kein Beschreiben
vor, der Tastatur-Puffer wird automatisch nach dem Auslesen gelöscht).
Dieses "Acknowledge"-Signal dient zum Auslesen des
"Output Buffers" des 8255-Portbausteins, d.h. zum Lesen
eines vom PC gesandten Bytes. Der 8255 treibt pc_if_data, solange m_ack
= '0'.
Dieses "Strobe"-Signal dient zum Beschreiben des "Input
Buffers" des 8255-Portbausteins, d.h. zum Senden eines Bytes an
den PC. Der 8255 puffert pc_if_data, falls m_stb = '0'.
Dies sind die unteren sieben Datenbits des 20x2-Zeichen-Displays (das
achte mit Namen disp_d7 ist bidirektional, da gleichzeitig Busy Flag).
Dies ist das "Enable"-Signal des 20x2-Zeichen-Displays.
Mit seiner Rückflanke werden die Werte von disp_d, disp_d7, disp_rw und
disp_rs gepuffert und der entsprechende Befehl ausgeführt, z.B. ein Zeichen
dargestellt und der Cursor (Einfügemarke) weitergerückt oder der
Bildschirm gelöscht.
Dies ist das "ReadWrite"-Signal des 20x2-Zeichen-Displays.
Im Verlaufe der Ausgabe eines Zeichens hat es erst den Wert '0' (Write),
das Display soll also Daten empfangen. Nachdem mit der Ausführung des Befehls
durch eine Rückflanke von disp_e begonnen wurde, kann durch disp_rw '1'
das Busy Flag abgefragt werden, also der Zeitpunkt bestimmt werden,
zu dem der Befehl vollständig abgearbeitet wurde.
Dieses zum 20x2-Zeichen-Display führende Signal ist quasi das neunte
Datenbit. Ist es '1', so wird ein "normales" ASCII-Zeichen angezeigt,
mit '0' hat man Zugriff auf Steuerzeichen, um z.B. die Anzeige zu löschen,
den Cursor zu positionieren oder verschiedene Betriebsmodi einzustellen.
Globale Clocks für alle speichernden Elemente im Mikroprozessor. Sind normalerweise nur durchgereichte clk und clk_invers, d.h. der Prozessor läuft mit demselben Takt wie das Hilfs-FPGA. Für den single step-Modus können beide aber abgeschaltet werden.
Auch dem Mikroprozessor wird durch diese zwei Taktsignale, selbst bei
Verwendung beider Taktflanken, die Benutzung der Clock-Netze der Altera
FLEX8000-Bausteine ermöglicht.
Dieses Signal ist kein Power-On-Reset (nach dem Einschalten ist
das Prozessor-FPGA ja auch noch "leer"), sondern dient der jederzeitigen
Initialisierung des Mikroprozessors. Es führt also keinesfalls zu einem
Verlust der Konfiguration des Prozessor-FPGAs.
Dieses Signal steuert Tri-State-Treiber für die Signale databus,
address, m_oe und m_we im Mikroprozessor, so daß dieser, sobald m_highz
auf '0' geht, asynchron und für ihn selbst transparent die Busse freigibt.
Damit ist es sicher möglich, im Modus single instruction / halted den
Speicher zu behandeln.
In Abhängigkeit von der Adresse soll höchstens ein Ein-/Ausgabegerät
aktiviert sein. Keines dieser Gerät darf aktiv sein, falls der Adreßbus
nicht getrieben wird (wegen der Pull Up-Widerstände erscheint die
Adresse $FFFFF), die Adresse sich auf Tastatur, Display oder einen
nicht vergebenen Bereich bezieht oder das Mikrocode-RAM adressiert wird
(das intern im Hilfs-FPGA vorhandene 21. Adreßbit ist '1'). Ansonsten ist
genau eines der vier Chipselect-Signale '0'; eine Komponente ohne
Chipselect verhält sich wie vom Bus abgeklemmt.
Low-aktives Signal, um das Mikroprozessor-FPGA in den Konfigurations-Modus
zu versetzen.
Clock für Konfiguration des Mikroprozessors.
Das FPGA, welches den Mikroprozessor beherbergen soll, bekommt über
diese Leitung bit-seriell seine Konfigurationsdaten (passive serielle Konfiguration).
Die Serialisierung erfolgt mit einem Schieberegister im Hilfs-FPGA.
Um interne Register des Mikroprozessors auszulesen, wird mit reg_select
eines bezeichnet und m_reg_req auf '0' gesetzt. Liegt der Wert des Registers
auf Adreß- oder Datenbus an (je nach Bitbreite des Registers und
vorhandenen Datenpfaden), so muß der Prozessor m_reg_ack auf '0' nehmen
und den Wert von Bussen und m_reg_ack mindestens so lange halten,
bis m_reg_request wieder '1' annimmt.
Um den Mikroprozessor sicher erst dann anzuhalten, wenn die aktuelle
Instruktion beendet wurde, wird m_halt auf '0' gesetzt und die Clock weiter
erzeugt. Ist das Ende der Instruktion/der Anfang der nächsten erreicht,
muß der Mikroprozessor m_halt_ack auf '0' setzen und darf den aktuellen
Zustand nicht verlassen.
Die "Hex-Tastatur" mit 20 Tasten ist als Matrix von einfachen Schaltern (Drucktaster) mit 5 Spalten und 4 Reihen realisiert. Die Eingänge aller Schalter einer Spalte hängen an tast_spalte(x), die Ausgänge führen in jeder Zeile auf tast_reihe(y). Keine zwei Schalter sind also mit Ein- und Ausgang an den gleichen Signalen angeschlossen. Nun wird durch tast_spalte immer genau eine Spalte mit '1' getrieben, alle anderen mit '0'. Meldet eine Reihe durch '1', daß in ihr eine Taste gedrückt wird, so muß es sich um diejenige Taste handeln, die in der gerade getriebenen Spalte liegt.
Falls mehrere Tasten gleichzeitig gedrückt werden sollten, könnte es bei diesem Aufbau zu Kurzschlüssen zwischen zwei Spalten kommen. Deswegen werden die fünf Spaltensignale zwischen Hilfs-FPGA und Tastaturmatrix durch Schutzdioden in Durchlaßrichtung geführt, welche die Nullen nicht durchlassen; es trifft also immer '1' auf 'Z' (Leitung offen), was sicher wieder '1' ergibt.
Damit das Drücken einer Taste in der gerade aktivierten Spalte sich
von dem in einer anderen Spalte bzw. keinem Tastendruck unterscheidet,
damit also '1' und 'Z' an tast_reihe unterschiedlich aussehen, wurde tast_reihe
mit Pull Down-Widerständen versehen, die aus 'Z' eine (schwache)
'0' machen.
Dies ist das achte (höchstwertige) Datenbit des 20x2-Zeichen-Displays in ausgehender Richtung. Es ist bidirektional ausgelegt, da es als Busy Flag fungiert, über das man abfragen kann, ob das Display, welches im Verhältnis zum Prozessor sehr langsam arbeitet, das letzte Kommando schon abgeschlossen, also z.B. das letzte Zeichen schon angezeigt hat. Aufgrund der Beschränkung des 81188 auf vier Gruppen von Signalen mit Tri State-Charakteristik muß ein externer Tri State-Treiber benutzt werden, zu dem die Signale disp_d7_in (Wert vom Display), disp_d7_out (Wert zum Display) und disp_d7_oe (Output Enable - Aktivierung des Treibers) führen.