Subprojekt: Grafikkarte          

Da ich mich mit einer Textausgabe auf einem 40x4 großem LC-Display nicht zufrieden gebe, habe ich eine Grafik"karte" für das MyCPU-System gebaut. Die Grafikkarte unterstützt einen Text- und einen monochromen Grafikmodus und generiert VGA-kompatible Videosignale, um einen normalen VGA-Monitor anzusteuern. Der Einfachheit halber arbeitet die Grafikkarte nur mit einer einzigen Auflösung (und Wiederholfrequenz), die für Text- und Grafikmodus genutzt wird. Als Modus habe ich den IBM-Textmodus gewählt, der auch zur Verwendung kommt, wenn der PC ins reine DOS gebootet wird. Der IBM-Textmodus hat folgende Daten:

sichtbare Auflösung: 640 x 400 Pixel
Textauflösung: 80 x 25 Zeichen, 1 Zeichen = 8 x 16 Pixel
Anzahl Farben: 16
Wiederholfrequenz: 70,248 Hz
Zeilenfrequenz: 31469 Hz
Zeit pro Pixel: 39,72ns (=25,175 MHz Pixeltakt)
horizontale Auflösung: 800 Pixel (48 Pixel linker Rand, 640 Pixel Video, 16 Pixel rechter Rand, 96 Pixel H-Sync)
vertikale Auflösung: 448 Zeilen (35 Zeilen oberer Rand, 400 Zeilen Video, 11 Zeilen unterer Rand, 2 Zeilen V-Sync)



Das Problem mit dem Dual-Port-RAM
Eine große Schwierigkeit beim Bau einer Grafikkarte besteht in der Anbindung des Grafik-RAMs. Das RAM, das die Grafikdaten enthält, muss quasi zeitgleich von der Grafikkarte gelesen und vom CPU-System beschrieben werden können. Heutzutage verwendet man für diesen Zweck sogenannte dual-port RAMs, dass sind RAMs, die über zwei getrennte Adress- und Datenbusse verfügen. Da ich aber nur Standardbauteile verwenden möchte, habe ich das Problem anders gelöst: Ich habe die Zugriffe auf das Grafik-RAM "portioniert": Ein Zugriff darf maximal 159ns dauern, das entspricht 4 Pixeltakten. Die Grafikwiedergabe ist dabei synchron zum RAM, die asynchronen Zugriffe der CPU werden gegebenenfalls solange verzögert, bis das RAM für externe Zugriffe bereit ist. Ein CPU-Zugriff kann somit im Schnitt zwischen 200ns und 360ns dauern (Zeit inklusive CPU-interner Gatterlaufzeiten). Das mag sehr langsam klingen, aber wenn man an den Commodore 64 zurückdenkt, der mit knapp 1MHz getaktet wurde, sind 360ns im Gegansatz zu 1000ns doch noch recht flink.


Der Prototyp
Natürlich ist es ein schwieriges Unterfangen, eine Grafikkarte mit einzelnen Gattern aufzubauen. Darum habe ich auch hier zuerst eine zeitexakte Simulation geschrieben, um mein Design auf Tauglichkeit zu prüfen. Mein Hardware-Entwurf umfasst rund 64 TTL-ICs der Serie 74AC.. , 2 RAMs des Typs 62256(70ns) und ein Eprom 27C256(70ns). Die Grafikkarte ist somit fast noch komplexer als die CPU :-). Die Simulation hatte bereits gezeigt, dass das Design sehr zeitkritisch ist. Selbst die Gatter 74AC.. sind mit ihren 8ns propagation delay teilweise noch zu langsam. Aber erstaunlicher Weise funktioniert der erste in Hardware umgesetzte Entwurf einwandfrei: Trotz des 25MHz Pixeltakts, der über insgesammt mehr als drei Meter Flachbandkabel auf die 6 Platinen geführt wurde, funktionierte die Grafikkarte in "spread-table"-Bauweise einwandfrei. Leider gibt es kein Foto davon, wäre als Beweis sicherlich interessant ;-). Ärger bekam ich allerdings, als ich versuchte, die Platinen übereinander zu stapeln, um Platz zu sparen. Da ich die Flachbandkabel vorerst nicht kürzen wollte, quetschte ich alles gut zusammen, und beim ersten Einschalten knallte es dann. Hm, was war passiert? Ein IC-Beinchen hat sich durch den Lack eines Fädeldrahtes gebohrt und somit einen Kurzen verursacht. Ein Bus-Treiber und ein anderes Gatter-IC sind in Rauch aufgegangen. Tja, aber die langen Leitungen hatten noch einen anderen Nachteil: Im Platinenstapel führten sie durch kapazitives Übersprechen zu Fehlfunktionen, so dass das Videobild ab und zu Störungen zeigte. Durch Kürzen aller Leitungen auf das aller nötigste waren die Probleme behoben. Ein Problem soll natürlich nicht verschwiegen werden: Bei so hohen Signalfrequenzen und einem solch luftigen Aufbau müssen alle kritischen Leitungen signalmäßig abgeschlossen werden, so wie ich es auch bei der CPU stellenweise getan habe (siehe dazu auch MyCPU-Hardware->CPU: Probleme).





Beweisfotos


Das sind sechs Platinen, die zusammen eine "Grafikkarte" ergeben. Ich hätte gerne noch alle Platinen einzeln fotografiert, aber ich hab mich nicht mehr getraut sie nocheinmal auseinander zu nehmen....



Der Digital-Analog-Wandler ist auf einer zusätzlichen Platine aufgebaut. Trotz der 25MHz funktioniert der simple Aufbau einwandfrei.



Und so sieht das ganze dann im Betrieb aus. Mehr Bilder dieser Art gibt es in der Rubrik "Fotos", dort ist auch ein vergrößertes Foto des Bildschirms zu finden.