HaDesWWW logo
Startseite

Downloads
Geschichte(n)
 
Hardware
FPGA-Board
Prozessor
  Instruktionssatz
Peripherie
  XBus-Referenz
PS/2-Board
Soundboard
USB-MMC-Board
 
PC-Software
HaCom
HoAsm, HLink
Emulator
Connectivity
 
Embedded Software
HAL
Dateimanager
Tetris
PacMan
3D-Engine
Pong
PacMan 3D
 
Kontakt

HaDes XP - Integrated Peripherals

Im Stil des "System-On-A-Chip" Konzeptes trägt das Spartan FPGA der HaDes XP neben der CPU auch noch diverse andere Peripheriekomponenten, die die komplette Hardware ansteuern. 

Speichercontroller XMemory & XFlash

PS/2 Controller XPS2

Die XPS2 stellt die Schnittstelle zwischen CPU und einem PS/2-Endgerät dar. Dem XBus-kompatiblen Interface auf CPU-Seite stehen vier 1-Bit breite Leitungen gegenüber, die mit dem Erweiterungsboard verbunden sind. Die Kommunikation mit einem PS/2-Endgerät findet über zwei bidirektionale Leitungen statt, Data und Clock. Beide sind als Eingänge an die XPS2 angeschlossen. Der Schreibzugriff erfolgt indirekt über zwei weitere Signale, mit denen die XPS2 die Pegel der PS/2-Leitungen auf logisch 0 ziehen kann. Die entsprechende Schaltung ist auf dem Erweiterungsboard implementiert.
Die Datenübertragung erfolgt bitseriell über die Data-Leitung, wobei immer Byte-Pakete verschickt werden. Dabei wird dem zu sendenden Byte zunächst ein Start-Bit vorangesetzt, welches immer 0 ist. Anschließend wird das Byte selbst übertragen, beginnend mit dem niedrigstwertigen Bit. Zum Schluss werden noch ein Parity-Bit und das Stop-Bit (immer 1) auf die Leitung geschrieben. Während der Übertragung wird das Clock-Signal für die Synchronisation verwendet. Der Takt wird immer vom PS/2-Gerät (Device) erzeugt, d.h. sowohl bei Host-zu-Device Transfers als auch bei Device-zu-Host Transfers. Um diese und weitere Einzelheiten des Low-Level Übertragungsprotokolls kümmert sich die XPS2 vollständig. Der Benutzer kann direkt byteweise über den Datenport der XPS2 arbeiten; er muss jedoch, je nach angeschlossenem Gerät, das entsprechende High-Level Protokoll selbst in Software implementieren.
Bevor die XPS2 nach dem Start bzw. Reset benutzt werden kann, muss in einer Pollingschleife Bit 5 des Kontrollregisters abgefragt werden. Der Grund dafür ist, dass bei einem CPU-Reset auch die angeschlossene PS/2-Hardware zurückgesetzt wird. Bei einer Tastatur macht sich dies z.B. durch das kurze Aufblinken der 3 Kontroll-LEDs bemerkbar. Dieser Vorgang und die nachfolgende automatische Geräteerkennung durch die XPS2 benötigen etwas Zeit, während dieser das Bit 5 des Kontrollregisters auf 0 gehalten wird. Erst nachdem die Geräteinitialisierung abgeschlossen wurde, wird dieses Bit auf 1 gesetzt. Die XPS2 und das PS/2-Gerät (sofern angeschlossen) können von nun an benutzt werden und Befehle entgegen nehmen.
Der nächste Schritt nach dieser Warteschleife ist die Überprüfung des angeschlossenen Geräts. Dazu können bequem die Bits 6 und 7 des Kontrollregisters abgefragt werden. Bit 6 wird durch die XPS2 genau dann gesetzt, wenn sie ein angeschlossenes Gerät finden konnte (wenn also ein Taktsignal generiert wurde, siehe oben). Das Bit 7 gibt schließlich an, ob es sich bei dem angeschlossenen Gerät um eine Tastatur (1) oder um eine Maus (0) handelt. Übrigens: Die XPS2 erkennt eine Maus an ihrer Device-ID 0x00, die sie direkt nach dem BAT (Basic Assurance Test) Completion Code (0xAA) schickt. Eine Tastatur sendet hingegen keine ID, sondern nur den BAT Completion Code.
Folgendes Code-Fragment (HaDes Assembler) fasst die Vorgehensweise bei der Initialisierung kurz zusammen. In diesem Beispiel wird angenommen, dass eine Maus gewünscht wird. Ist stattdessen eine Tastatur oder überhaupt kein Gerät angeschlossen, führt dies zu einem Abbruch (#ERROR).

@ldef stat "r3"
@ldef temp "r4"

INIT_LOOP:
  in @stat, #PORTNUMBER
  andi @temp, @stat, #0b100000     ; Bit 5 auswählen
  beqz @temp, #INIT_LOOP           ; warte, bis Initialisierung abgeschlossen
  // Hier ist die Initialisierung abgeschlossen;
  // wir prüfen, ob eine Maus angeschlossen ist:
  andi @temp, @stat, #0b11000000   ; Bits 6 und 7 auswählen
  seqi @temp, #temp, #0b01000000   ; "Gerät vorhanden" & "Gerät = Maus"
  beqz @temp, #ERROR               ; Abbruch, falls Vergleich fehlgeschlagen

Die High-Level Kommunikation mit dem angeschlossenen PS/2-Gerät muss in Software implementiert werden. Da es sich bei den unterstützten PS/2-Geräten ausschließlich um Eingabegeräte handelt, beschränkt sich die Tätigkeit des Programmierers hauptsächlich auf das Entgegennehmen und Interpretieren von speziell formatierten Datenpaketen. Nur selten müssen Befehle an das PS/2-Gerät gesendet werden. An dieser Stelle sei erwähnt, dass Tastaturen sofort nach der Initialisierung Datenpakete verschicken, sobald eine Taste gedrückt wurde. Mäuse hingegen bleiben zunächst stumm. Sie warten zuerst auf einen speziellen Befehl (”Enable Data Reporting“), bevor sie die Bewegungsdaten über die PS/2-Leitung versenden. Ausführliche Informationen rund um das Thema PS/2 befinden sich z.B. auf der Internetseite
http://www.computer-engineering.org/ps2protocol/.
Ein besonderes Feature der XPS2 ist der automatische Hardware-Reset bei Druck auf die PAUSE-Taste. Das bedeutet unweigerlich, dass Programme die PAUSE-Taste nicht verwenden können, da dieser Tastencode von der Hardware abgefangen wird und zu einem Reset führt. Alle anderen Datenpakete werden jedoch byteweise an den Datenport weitergereicht, wo sie von der CPU abgeholt werden können.
Die XPS2 kann so konfiguriert werden, dass sie Interrupts generiert nach Erhalt bzw. nach dem Versand eines Datenpaketes. Hierzu müssen lediglich die Bits 1 und 2 des Kontrollregisters entsprechend beschrieben werden. Sendet die XPS2 einen Interrupt, setzt sie gleichzeitig auch das Bit 0 (”Interrupt ausgelöst“) ihres Kontrollregisters. Dieses Bit wird jedoch nicht automatisch zurückgesetzt; dies sollte die behandelnde Interrupt-Routine durch Schreiben einer 0 erledigen.
Die XPS2 kann natürlich auch ohne die Verwendung von Interrupts eingesetzt werden. Diese Initialkonfiguration der XPS2 kann durch Schreiben einer 0 in das Kontrollregister wiederhergestellt werden.Wenn keine Interrupts benutzt werden, muss die CPU das Kontrollregister ständig abfragen (Polling), um über eventuell eingetroffene bzw. verschickte Datenpakete informiert zu werden. Dazu stehen die Bits 3 und 4 des Kontrollregisters zur Verfügung. Beide Bits (sowie auch die Bits 5 bis 7) können von der CPU nicht direkt verändert werden, dies geschieht indirekt durch gewisse Ereignisse. Bit 3 wird z.B. beim Eintreffen eines Datenpaketes gesetzt und beim Auslesen durch die CPU (Datenport) wieder zurückgesetzt. Bit 4 sollte abgefragt werden, nachdem ein Byte auf den Datenport geschrieben wurde. Der nächste Schreibzugriff auf den Datenport wird nämlich erst dann wieder akzeptiert, wenn der alte vollständig abgeschlossen wurde.

Grafikschnittstelle XPix

Die XBus-Komponente XPix steuert die Grafikausgabe auf dem angeschlossenen VGA-Monitor. Dabei wird die Auflösung 640x480 Pixel mit den 16 Standard-VGA-Farben verwendet. Pro Pixel werden also 4 Bit Speicherplatz benötigt. Und da Speicherplatz knapp ist, werden in jedem Byte des Grafikspeichers auf dem Erweiterungsboard auch zwei Pixel abgelegt. Der Preis ist allerdings eine deutlich kompliziertere Ansteuerung. Denn der Benutzer möchte pixelweise auf den Grafikspeicher zugreifen. Soll z.B. Pixel Nr. i beschrieben werden, muss zunächst das Byte i/2 ausgelesen, das entsprechende Halbbyte aktualisiert und schließlich das gesamte Byte wieder zurückgeschrieben werden. Um die Gesamtperformance beim Füllen großer Flächen zu erhöhen, wurde noch ein zweiter Datenport, der Fast Data Port, hinzugefügt. Mit diesem kann gleich ein ganzes Wort (also 4 Byte = 8 Pixel) gelesen bzw. geschrieben werden. Die höchstwertigen Bits werden dabei auf die niedrigste Adresse abgebildet (Big Endian). Da hier keine Einschränkungen bezüglich der Startadresse gemacht werden - die XPix erlaubt also auch ungerade Startadressen - muss eventuell gleich zweimal das gleiche Prozedere wie beim Beschreiben einzelner Pixel durchgeführt werden, also zuerst auslesen, aktualisieren und dann wieder zurückschreiben.
Das Adressregister enthält zu jeder Zeit die aktuelle Pixeladresse, die entsprechende Speicherstelle im Grafikspeicher wird jeweils von der XPix "berechnet". Die Pixel werden zeilenweise von oben nach unten durchnummeriert, d.h. Pixel 639 befindet sich rechts oben, Pixel 640 in der zweiten Zeile ganz links. Die Pixeladresse bestimmt den Bildpunkt, auf den sich die nächste Pixeloperation (Lesen oder Schreiben) bezieht. Bei einer Wortoperation (Fast Data Port) stellt sie die Startadresse dar, auf die das höchstwertige Halbbyte zu liegen kommt. Jeder Zugriff auf den Grafikspeicher führt zu einer automatischen Erhöhung der Pixeladresse, und zwar um die Anzahl gelesener bzw. geschriebener Pixel (also entweder 1 oder 8).
Ein besonderes Feature der XPix ist die Transparenz: Die CPU kann jede beliebige Farbe als transparent markieren. Diese Farbe wird daraufhin für Schreibzugriffe blockiert, d.h. immer wenn die transparente Farbe geschrieben werden soll, wird stattdessen die ursprüngliche Farbe beibehalten. Dies erweist sich gerade für die Darstellung von Icons als hilfreich und nützlich, weil dadurch der Fast Data Port verwendet werden kann, ohne softwareseitig einzelne transparente Pixel überspringen zu müssen.
Für die flimmerfreie Darstellung von bewegten 3D-Szenen sind folgende Zusatzfunktionen erwünscht: Clear Screen und Double Buffering. Beide implementiert die XPix in Hardware. Die erste Operation könnte natürlich auch leicht mit Hilfe des Fast Data Port in Software realisiert werden. Doch bei 640x480 Pixeln werden hierfür immerhin 80x480 Schreibzugriffe benötigt, was jede Menge Zeit kostet. Um diese Zeit für sinnvollere Aufgaben wie z.B. Koordinatentransformationen nutzen zu können, wurde ein nicht blockierendes Clear Screen in Hardware implementiert. Die CPU muss hierzu lediglich den entsprechenden Befehl absetzen und kann dann parallel weiterarbeiten. Allerdings sollte ein sofortiger erneuter Zugriff auf die XPix vermieden werden, da die CPU sonst bis zum Ende der Löschoperation blockiert wird.
Standardmäßig werden die Adressen 0 bis 307199 über die VGA-Schnittstelle ausgegeben. Die XPix kann jedoch auch so konfiguriert werden, dass die Pixel 524288 bis 831487 sichtbar sind. Auf diese Weise kann jeweils einer der beiden Puffer neu beschrieben werden, während der andere für die Ausgabe herangezogen wird (Double Buffering).

 
rrobek.de Hauptseite
 
Valid HTML 4.01!