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).
|