DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
DIPLOMARBEIT - FG Mikroelektronik, TU Berlin
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Aufgabenstellung:<br />
Prof. Dr. Otto Manck<br />
Institut für <strong>Mikroelektronik</strong><br />
Technische Universität <strong>Berlin</strong><br />
Lukas Bauer<br />
<strong>DIPLOMARBEIT</strong><br />
Entwicklung eines TI-34020-kompatiblen Hochleistungs-Grafikprozessors<br />
unter Verwendung modernster Werkzeuge der Logik-Synthese<br />
Am Institut für <strong>Mikroelektronik</strong> soll ein Hochleistungs-Grafikprozessor entwickelt werden, der sich durch<br />
große Flexibilität und hohe Geschwindigkeiten auszeichnen soll. Er soll in wesentlichen Punkten zum<br />
TMS 34020 von Texas Instruments kompatibel sein.<br />
Die Video-Einheit des Grafikprozessors sorgt für die Bilddarstellung. Dabei werden universelle Signale<br />
zur Synchronisation des Monitors erzeugt. Um auch hochauflösende Monitore mit einem kontinuierlichen<br />
Bilddatenstrom aus den extern angeschlossenen Video-RAMs zu versorgen, müssen Reload-Zyklen in Echtzeit<br />
ausgeführt werden. Alle Parameter der Videosignale sind über Register programmierbar. Des weiteren<br />
werden Zooming, Panning, die Synchronisation auf externe Videosignale sowie Voll- und Halbbildbetrieb<br />
unterstützt.<br />
Die Prozessor-Einheit ist in der Lage, selbständig Grafikbefehle auszuführen. Dazu gehören unter anderem<br />
der Pixel-Block-Transfer, das Füllen von Blöcken mit mehrfarbigen Mustern sowie das Clipping. Dabei<br />
werden spezielle Fähigkeiten der DRAMs und VRAMs, wie Fast-Page-Mode, Color-Register und Block-<br />
Write, unterstützt.<br />
Die Controller-Einheit soll eine universelle Schnittstelle zur Peripherie bilden, die alle gängigen, gemultiplexten<br />
und nicht gemultiplexten Bussysteme unterstützt. Dabei werden unabhängig voneinander verschiedene<br />
Breiten von Host- und Speicherbus zugelassen. Das Speicherinterface erlaubt die verschiedensten Konfigurationen<br />
von DRAMs und VRAMs und führt die Adreßrechnung und Refresh-Zyklen durch.<br />
Die Entwicklung soll mittels Logik-Synthese erfolgen. Dazu steht Speedchart-VHDL als graphisches Eingabe-<br />
Werkzeug für VHDL zur Verfügung; zur Synthese kann Silcsyn, zur Simulation VHDL2000 und Cadat<br />
verwendet werden. Ein wesentlicher Bestandteil der Aufgabe soll dabei die Analyse der Möglichkeiten sein,<br />
Speedchart-VHDL bei der Entwicklung integrierter Schaltungen einzusetzen.<br />
Aufgrund der sehr hohen Komplexität kann im Rahmen einer Diplomarbeit nicht der vollständige Grafikprozessor<br />
entwickelt werden. Daher soll nur die Video-Einheit bis ins Detail entwickelt, synthetisiert und<br />
auf Gatterebene simuliert werden. Die Prozessor- und Controller-Einheit sollen nur grob modelliert werden,<br />
wobei es z. B. ausreicht, wenn die Prozessor-Einheit exemplarisch nur einen Befehl beherrscht.<br />
Zuständiger Professor: Prof. Dr. O. Manck<br />
Betreuer: Thomas Lorenz<br />
Bearbeiter: Lukas Bauer, Matr.-Nr. 113 150<br />
Beginn der Arbeit: ∗ 01.07.1993<br />
Ende der Arbeit: 01.09.1993<br />
∗ Beginn der Einarbeitungszeit in Speedchart, Silcsyn und die Simulatoren: 04.01.1993
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Inhaltsverzeichnis<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Inhaltsverzeichnis<br />
Seite 2<br />
1 Moderne Werkzeuge der Logik-Synthese 5<br />
1.1 Schaltungsentwurf durch Logik-Synthese . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
1.2 Speedchart-VHDL als grafisches Eingabe-Werkzeug für VHDL . . . . . . . . . . . . 5<br />
1.3 Synthese-Werkzeuge und Simulatoren auf VHDL-Basis . . . . . . . . . . . . . . . . . 6<br />
2 Ein Hochleistungs-Grafikprozessor 7<br />
2.1 Anforderungen an einen Hochleistungs-Grafikprozessor . . . . . . . . . . . . . . . . . 7<br />
2.2 Gliederung des Grafikprozessors in funktionale Einheiten . . . . . . . . . . . . . . . . 8<br />
2.3 Prioritätssteuerung der ablaufenden Prozesse . . . . . . . . . . . . . . . . . . . . . . 9<br />
3 Die Video-Timing-Einheit 11<br />
3.1 Aufgaben der Video-Timing-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
3.2 Interne Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
3.2.1 Vollbildbetrieb (Non-Interlaced Mode) . . . . . . . . . . . . . . . . . . . . . . 12<br />
3.2.2 Halbbildbetrieb (Interlaced Mode), NTSC . . . . . . . . . . . . . . . . . . . . 14<br />
3.2.3 Halbbildbetrieb (Interlaced Mode), PAL . . . . . . . . . . . . . . . . . . . . . 16<br />
3.3 Externe Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
3.4 Realisierung in Speedchart-VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.4.1 Steuerung des horizontalen Timings . . . . . . . . . . . . . . . . . . . . . . . 19<br />
3.4.2 Steuerung des vertikalen Timings . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
3.4.3 Steuerung der externen Synchronisation . . . . . . . . . . . . . . . . . . . . . 21<br />
4 Die VRAM-Reload-Einheit 23<br />
4.1 Aufgaben der VRAM-Reload-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.2 Reload–Mechanismen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.2.1<br />
” Newline Reloads“ und Midline Reloads“ . . . . . . . . . . . . . . . . . . . .<br />
”<br />
23<br />
4.2.2<br />
” Split Reloads“ und Non-Split Reloads“<br />
”<br />
. . . . . . . . . . . . . . . . . . . . 24<br />
4.3 Taktsignale für Video-RAMs und Video-D/A-Wandler . . . . . . . . . . . . . . . . . 25<br />
4.4 Timing von Reload-Zyklen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
4.5 Realisierung in Speedchart-VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />
4.5.1 Vorausberechnung der Anzahl der notwendigen Reloads . . . . . . . . . . . . 27<br />
4.5.2 Steuerung des Zeitpunktes von Reloads . . . . . . . . . . . . . . . . . . . . . 30<br />
4.5.2.1 Zeitpunkt von Newline Reloads . . . . . . . . . . . . . . . . . . . . . 30<br />
4.5.2.2 Zeitpunkt von Non-Split Midline Reloads . . . . . . . . . . . . . . . 30<br />
4.5.2.3 Zeitpunkt von Split Midline Reloads . . . . . . . . . . . . . . . . . . 31<br />
4.5.3 Erzeugung der Taktsignale für die Video-D/A-Wandler . . . . . . . . . . . . . 32<br />
4.5.4 Refresh von DRAMs und VRAMs . . . . . . . . . . . . . . . . . . . . . . . . 32<br />
4.5.5 Die Arbitrierungslogik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33<br />
4.5.6 Modellierung eines Video-RAMs . . . . . . . . . . . . . . . . . . . . . . . . . 34
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Inhaltsverzeichnis<br />
Seite 3<br />
5 Die Controller-Einheit 35<br />
5.1 Aufgaben der Controller-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2 Host-Zugriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2.1 Handshake bei Host-Zugriffen . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2.2 Host-Zugriffe bei gemultiplextem Bus . . . . . . . . . . . . . . . . . . . . . . 35<br />
5.2.3 Host-Zugriffe bei nicht gemultiplextem Bus . . . . . . . . . . . . . . . . . . . 36<br />
5.2.4 Beschleunigter Handshake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
5.3 Speicherorganisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.4 Adreßrechnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />
5.5 Externe versus interne Host-Daten-Register bei nicht gemultiplextem Host-Bus . . . 40<br />
5.6 Realisierung in Speedchart-VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.6.1 Steuerung von Host-Zugriffen . . . . . . . . . . . . . . . . . . . . . . . . . . . 42<br />
5.6.2 Modellierung eines Hosts zum Test des Handshakes . . . . . . . . . . . . . . . 43<br />
5.6.3 Steuerung von Speicherzugriffen . . . . . . . . . . . . . . . . . . . . . . . . . 43<br />
6 Die Prozessor-Einheit 45<br />
6.1 Aufgaben der Prozessor-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
6.2 Funktionsweise der implementierten Befehle . . . . . . . . . . . . . . . . . . . . . . . 46<br />
6.2.1 Der “Clip”-Befehl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
6.2.2 Der “Pixel Block Transfer”-Befehl . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
6.3 Realisierung in Speedchart-VHDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
6.3.1 Befehlsauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
6.3.2 Realisierung des “Clip”-Befehls . . . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
6.3.3 Realisierung des “Pixel Block Transfer”-Befehls . . . . . . . . . . . . . . . . . 48<br />
6.3.3.1 Umwandlung der Bereichsgrenzen in lineare Pixel-Adressen . . . . . 48<br />
6.3.3.2 Zeilenweise Bearbeitung des Befehls . . . . . . . . . . . . . . . . . . 49<br />
6.3.3.3 Datenfluß beim Kopieren der Zeilendaten . . . . . . . . . . . . . . . 49<br />
6.3.3.4 Erweiterte Speicherzugriffs-Möglichkeiten der Controller-Einheit . . 51<br />
6.3.4 Implementierung weiterer Grafik-Befehle . . . . . . . . . . . . . . . . . . . . . 53<br />
6.3.5 Timing der Befehle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
7 Werkzeuge der Logik-Synthese in der Praxis 55<br />
7.1 Produktivitätssteigerung durch den Einsatz von Speedchart-VHDL . . . . . . . . . . 55<br />
7.2 Silcsyn als Synthese-Werkzeug auf VHDL-Basis . . . . . . . . . . . . . . . . . . . . . 56<br />
7.3 Simulation auf VHDL- und Gatterebene . . . . . . . . . . . . . . . . . . . . . . . . . 57<br />
7.4 Bilanz: grafisch-zustandsorientierte Eingabe mit teilautomatischer Synthese als<br />
leistungsfähiger Kompromiß . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58<br />
Literaturverzeichnis 59<br />
Glossar 60
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Inhaltsverzeichnis<br />
Seite 4<br />
Tabellenverzeichnis 61<br />
Abbildungsverzeichnis 62<br />
Anhang 66<br />
A Übersicht über den Grafikprozessor ” TIM“ . . . . . . . . . . . . . . . . . . . . . . . 66<br />
A.1 Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />
A.2 Externe Signale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
B Timing-Diagramme der DRAMs und VRAMs . . . . . . . . . . . . . . . . . . . . . . 71<br />
C Die Video-Timing- und VRAM-Reload-Einheit (Design ” VIDEO“) . . . . . . . . . . 78<br />
C.1 Hierarchie und Seitenverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . 78<br />
C.2 Speedchart-Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />
C.3 Simulationsergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102<br />
D Die Controller- und Prozessor-Einheit (Design ” TIM“) . . . . . . . . . . . . . . . . . 113<br />
D.1 Hierarchie und Seitenverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />
D.2 Speedchart-Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114<br />
D.3 Simulationsergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
1 Moderne Werkzeuge der Logik-Synthese<br />
1.1 Schaltungsentwurf durch Logik-Synthese<br />
Abschnitt 1.2<br />
Seite 5<br />
Fünfunddreißig Jahre ist es nun her, daß die ersten integrierten Schaltungen auf den Markt kamen.<br />
Waren diese noch von so geringer Komplexität (um die 10 Gatter), daß sich die Layouts per Hand<br />
auf Folien kleben ließen, so werden heute Schaltungen von 100.000 irregulären Gattern und mehr<br />
benötigt. Es ist sofort ersichtlich, daß der Entwickler hierbei die Unterstützung automatischer<br />
Werkzeuge benötigt. Da diese aber keine eigene Intelligenz oder Kreativität besitzen können,<br />
können sie dem Entwickler nur ” stupide“ Arbeiten nach einfachen Regeln (einschließlich Mutation<br />
und Selektion) abnehmen.<br />
Für viele Anwendungen akzeptiert werden heute Auto-Router, die das Layout zu einer Schaltung<br />
erstellen können. Doch auch der Entwurf synchroner Zustandsmaschinen (“finite<br />
state machine”, FSM) gehorcht so einfachen Regeln, daß er sich automatisieren läßt. Ausgangspunkt<br />
ist hierbei eine computerlesbare Form der Schaltungsspezifikation mittels einer Hardware-<br />
Beschreibungssprache wie z. B. VHDL. Ein Syntheseprogramm kann diese Beschreibung dann in<br />
eine Zustandsmaschine umsetzen, was dem Entwickler nicht nur Arbeit abnimmt, sondern auch Fehler<br />
bei der Aufstellung von Übergangsgleichungen etc. vermeidet und den Aufwand bei Änderungen,<br />
wie der Einführung von neuen Zuständen, von einem kompletten Neu-Entwurf des Schaltungsteils<br />
auf eine kleine Ergänzung im VHDL-Text reduziert.<br />
Mit modernen Synthese-Werkzeugen auf VHDL-Basis lassen sich heute (zumindest in der Theorie)<br />
nahezu alle Schaltungen realisieren, die im wesentlichen Synchronschaltwerke darstellen. Ein<br />
Grafikprozessor, gefertigt als CMOS Gate Array, ist ein typisches Beispiel hierfür. Doch auch angesichts<br />
der Produktivitätssteigerung, die die Verwendung von Logik-Synthese mit sich bringt, ist die<br />
Komplexität der benötigten Schaltungen in den letzten Jahren schneller gewachsen als die Effizienz<br />
der Entwurfsmethoden.<br />
Versucht man, die immer komplexer werdenden Schaltungen mit herkömmlichen Methoden zu entwerfen,<br />
so steigen nicht nur Personalaufwand und Entwicklungszeit in Grenzenlose. Die Fehlerwahrscheinlichkeit<br />
sowie Kommunikations-, Spezifikations- und Schnittstellenprobleme machen weitere<br />
Komplexitätssteigerungen ohne eine Revolutionierung der Design-Methoden ab einem bestimmten<br />
Punkt unmöglich [16].<br />
So ist auch am Institut für <strong>Mikroelektronik</strong> der <strong>TU</strong> <strong>Berlin</strong> bei der Entwicklung des Grafikprozessors<br />
zunächst der Versuch unternommen worden, ihn mittels Schaltplan-Eingabe zu realisieren. Nach<br />
etwa drei Mannjahren Arbeit kamen die Beteiligten zu den im vorigen Absatz dargestellten Erkenntnissen<br />
und stellten das Projekt ein, das nun im Rahmen dieser Diplomarbeit komplett neu<br />
begonnen wurde.<br />
1.2 Speedchart-VHDL als grafisches Eingabe-Werkzeug für VHDL<br />
Teil der Aufgabenstellung dieser Arbeit war die Untersuchung der Möglichkeiten, den Grafikprozessor<br />
mit dem neuen Programm ” Speedchart-VHDL“ [3] zu entwickeln, das die Eingabe von VHDL<br />
mittels einer grafischen Benutzeroberfläche unter Verwendung erweiterter Zustandsmaschinen erlaubt.<br />
Obwohl der Hersteller das Programm zunächst hauptsächlich als Werkzeug zur Spezifikation<br />
und Simulation konzipiert hatte, sollte hier die mögliche Bedeutung von Speedchart in Verbindung<br />
mit Synthese-Werkzeugen untersucht werden. Die zustandsorientierte Eingabe von VHDL<br />
könnte eine Revolutionierung der Design-Methoden bedeuten.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 1.3<br />
Seite 6<br />
Ein typisches Beispiel für einen zustandsorientierten Entwurf (“state machine design”) unter Speedchart<br />
ist im Diagramm auf Seite 120 zu sehen, das das Host-Interface des Grafikprozessors beschreibt.<br />
Zustände (“states”) werden hier als Kreise dargestellt, Transitionen (“transitions”) als<br />
Pfeile. Letztere kennzeichnen die möglichen Zustandsübergänge. Dabei kann jede Transition mit<br />
einer Bedingung (C), einer Priorität (#n, 0=höchste Priorität) und einem beim Zustandsübergang<br />
auszuführenden Aktionsblock (A) versehen werden.<br />
Als zusätzliches Hilfsmittel dienen Zustände (“drop-through states”, gestrichelt gezeichnet), bei<br />
denen die Übergangsbedingungen zum nächsten Zustand sofort ausgewertet werden, so daß bei<br />
einem erlaubten Austritt aus dem Zustand der Zustand selbst nicht aktiv wird. Dennoch werden<br />
die Aktionsblöcke in den zugehörigen Transitionen ausgeführt. Der Einsatz dieser Zustände erlaubt<br />
häufig eine übersichtlichere Gliederung bei Verzweigungen, z. B. beim Zustand AS.<br />
Zustände und Transitionen bilden zusammen eine synchrone Zustandsmaschine, bei der Zustandsübergänge<br />
nur mit der aktiven Flanke des Systemtaktes erfolgen können. Gleichzeitig lassen<br />
sich asynchrone Anweisungen in Form von Befehlsblöcken (“data path blocks”) definieren, von<br />
denen einer im Beispiel-Diagramm rechts zu sehen ist.<br />
In den synchronen und asynchronen Aktionsblöcken können Operationen sowie bedingte und unbedingte<br />
Variablen-Zuweisungen in VHDL-Syntax angegeben werden. An die Stelle von VHDL-<br />
Konstrukten, die Prozesse definieren, treten jedoch die Zustandsmaschinen. Dabei ist z. B. Konkurrenz<br />
(Parallelität) durch einfaches Nebeneinandersetzen zweier Diagramme (“subdiagrams”)<br />
möglich.<br />
Hierarchie wird in den Diagrammen durch doppelt umrandete Zustände angedeutet (z. B.<br />
reg read), wobei sich unter einem solchen Zustand ein oder mehrere Diagramme verbergen können,<br />
die ausgeführt werden, wenn der übergeordnete Zustand aktiv ist. Beim Eintritt in den hierarchischen<br />
Zustand werden die untergeordneten Zustandsmaschinen zunächst in den initialen Zustand<br />
entry versetzt.<br />
Nach der Eingabe eines solchen zustandsorientierten Entwurfs ist Speedchart<br />
selbsttätig in der Lage, den Entwurf in eine VHDL-Beschreibung umzusetzen, die<br />
alle zur Prozeßsteuerung notwendigen Konstrukte enthält. Im Idealfall kann die VHDL-<br />
Beschreibung anschließend von automatisierten Werkzeugen in eine integrierte Schaltung umgesetzt<br />
werden.<br />
Die eigentliche Aufgabe bei der Entwicklung des Grafikprozessors bestand daher im Rahmen dieser<br />
Arbeit darin, die in der Spezifikation [1] des Grafikprozessors grob skizzierten Funktionen in<br />
konkrete Algorithmen umzusetzen und diese in Form von Zustandsmaschinen einzugeben.<br />
1.3 Synthese-Werkzeuge und Simulatoren auf VHDL-Basis<br />
Als Synthese-Werkzeug (“silicon compiler”) konnte bei der Entwicklung das Racal-Redac-Produkt<br />
Silcsyn [6] eingesetzt werden, das auf Basis der von Speedchart erzeugten VHDL-Dateien Schaltungen<br />
synthetisiert und diese als Netzlisten von Gattern und Makro-Zellen eines Gate Arrays<br />
ablegt.<br />
Für die Simulation der Entwürfe stand der Simulator VHDL2000 [7] zur Verfügung, der ebenfalls auf<br />
Basis der erzeugten VHDL-Dateien arbeitet. Zur Verifikation der von Silcsyn erzeugten Schaltungen<br />
auf Gatterebene konnte der Simulator CADAT2000 [8] eingesetzt werden.<br />
Die Umsetzung der Netzlisten in ein Layout für ein CMOS Gate Array schließlich wird beim<br />
Hersteller mit Hilfe weiterer automatisierter Programme geschehen.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
2 Ein Hochleistungs-Grafikprozessor<br />
2.1 Anforderungen an einen Hochleistungs-Grafikprozessor<br />
Abschnitt 2.1<br />
Seite 7<br />
Ein Grafikprozessor ist ein wesentlicher Bestandteil jedes modernen Computersystems. Er dient<br />
in erster Linie dazu, vom Computer erzeugte Texte und Grafiken in darstellbare Signale für einen<br />
Monitor umzusetzen und so einen Dialog zwischen Mensch und Maschine auf alphanumerische oder<br />
grafische Weise zu ermöglichen. Eine Grafik, die als zweidimensionale Matrix von Bildpunkten auf<br />
dem Monitor angezeigt werden soll, wird dabei in einem Grafikspeicher (Video RAM) abgelegt. Zur<br />
Darstellung muß der Grafikprozessor diesen Speicher periodisch auslesen und die Daten seriell an<br />
den Monitor weiterleiten, zusammen mit Synchronisations-Signalen, welche indirekt die horizontale<br />
und vertikale Lage der Bildpunkte (Pixel) angeben.<br />
Moderne Grafikprozessoren sind darüber hinaus in der Lage, selbständig Grafikbefehle zu bearbeiten<br />
und dadurch den Hauptprozessor des Rechners (Host) zu entlasten. Dies bedeutet neben der<br />
parallelen Befehlsausführung noch einen zweiten Geschwindigkeitsvorteil: Da der Grafikprozessor<br />
direkt auf den Grafikspeicher zugreifen kann, müssen die zu verarbeitenden Bilddaten nicht das<br />
” Nadelöhr“, den Systembus zwischen Host und Grafikprozessor, passieren. Lediglich kurze Befehle<br />
müssen vom Host zum Grafikprozessor übertragen werden. Typische Befehle sind das Verschieben<br />
von Bildschirmbereichen oder das Füllen von Blöcken mit mehrfarbigen Mustern.<br />
An einen Grafikprozessor, der für den Einsatz in den verschiedensten Computersystemen konzipiert<br />
wird, werden hohe Anforderungen in puncto Flexibilität gestellt. Dies betrifft zum einen die Schnittstelle<br />
zwischen Host und Grafikprozessor – hier müssen einige grundsätzlich verschiedene Normen<br />
unterstützt werden –, zum anderen die Parameter des Monitorbildes, zu denen die Bildschirmauflösung,<br />
die Bildwiederholrate und die Farbtiefe der Pixel gehören. Da sich auf verschiedenen<br />
Computersystemen eine Unzahl von genormten und nicht genormten Video-Modi entwickelt hat,<br />
muß beispielsweise die Bildschirmauflösung frei programmierbar sein, nach Möglichkeit in Schritten<br />
von nur einem Pixel.<br />
Der Anwender ist in der Regel gleichzeitig an einer hohen Auflösung, also einem hohen Informationsgehalt<br />
des Bildes, und einer hohen Wiederholrate, also einem flimmerfreien Bild, interessiert.<br />
Aus diesen Bedürfnissen ergibt sich die Forderung nach einer möglichst hohen Pixelfrequenz, dem<br />
Takt, in dem jeweils der nächste Bildpunkt ausgegeben wird.<br />
Da der Auflösung durch die beschränkte Pixelfrequenz der Video-RAMs und durch die Kosten<br />
des Monitors Grenzen gesetzt sind, unterstützen moderne Grafikprozessoren virtuelle Bildschirmauflösungen,<br />
die deutlich oberhalb der physikalischen Matrixgröße des Monitors liegen können.<br />
Dabei befindet sich ein großes Bild im Speicher, von dem ein beliebiger Teilbereich beschränkter<br />
Größe dargestellt werden kann.<br />
Um Video-Bilder von hoher vertikaler Auflösung (Zeilenlänge) darstellen zu können, sind spezielle<br />
Zugriffe auf die Video-RAMs nötig. VRAMs enthalten neben der Speichermatrix Schieberegister,<br />
aus denen die Video-Daten seriell ausgegeben werden können. Liegt die Zeilenlänge des Monitors<br />
über der Länge der Schieberegister, so ist während der Darstellung der Bildschirmzeilen ein Nachladen<br />
der Schieberegister mit neuen Daten in Echtzeit erforderlich. Nur auf diese Weise ist auch<br />
bei hohen Auflösungen ein kontinuierlicher Bilddatenstrom zu erreichen.<br />
Auch die Geschwindigkeit, mit der die Grafikbefehle bearbeitet werden, soll möglichst hoch sein.<br />
Daher sollen verschiedene Möglichkeiten moderner Video-RAMs unterstützt werden, die es ermöglichen,<br />
mit einer geringen Zahl von Zugriffen auf den Speicher große Datenmengen zu übertragen.<br />
Speicherinternsive Anwendungen wie digitales Video schließlich machen einen großen Bilddatenspeicher<br />
erforderlich. Da die Kosten von Video-RAMs deutlich über denen normaler dynamischer
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 2.2<br />
Seite 8<br />
RAMs liegen, soll eine gemischte Bestückung mit VRAMs und DRAMs möglich sein. Zur Darstellung<br />
müssen die Daten aus den DRAMs in die VRAMs kopiert werden.<br />
Der im Rahmen dieser Arbeit zu entwickelnde Grafikprozessor ” TIM“ soll gemäß der Spezifikation<br />
[1] allen Anforderungen an einen modernen Hochleistungs-Grafikprozessor gerecht werden.<br />
Er soll zum TI-34020 in wesentlichen Punkten kompatibel sein, der Befehlssatz soll jedoch auf<br />
Befehle beschränkt sein, die auf rechteckigen Bildschirmbereichen arbeiten, da diese bei Desktop-<br />
Anwendungen fast ausschließlich verwendet werden. So soll z. B. das Ziehen diagonaler Linien<br />
nicht unterstützt werden. Stattdessen soll eine deutlich höhere Bearbeitungsgeschwindigkeit als<br />
beim TI-34020 erreicht werden.<br />
2.2 Gliederung des Grafikprozessors in funktionale Einheiten<br />
Der Grafikprozessor läßt sich den auszuführenden Funktionen nach in vier Einheiten gliedern:<br />
• Die Video-Timing-Einheit (Abschnitt 3) erzeugt Synchronisationssignale, die die Bilddarstellung<br />
auf dem Monitor steuern.<br />
• Die VRAM-Reload-Einheit (Abschnitt 4) steuert die Video-RAMs so, daß diese gleichzeitig<br />
einen kontinuierlichen Bilddatenstrom zur Verfügung stellen.<br />
• Die Controller-Einheit (Abschnitt 5) bildet die Schnittstelle zur Peripherie, die das Hostund<br />
das Speicherinterface verwaltet und Zugriffe des Hosts auf den Speicher und auf die<br />
Register des Grafikprozessors erlaubt.<br />
• Die Prozessor-Einheit (Abschnitt 6) ist in der Lage, selbständig Grafikbefehle zu bearbeiten.<br />
externe Sync-Signale<br />
❄<br />
Video-Timing-Einheit VRAM-Reload-Einheit<br />
✛<br />
Datenanforderung,<br />
Datentransfer<br />
Steuerung des Reload-Timings<br />
Registerwerte:<br />
Timing, Auflösung<br />
❄ ❄<br />
✲ Multiplexer<br />
✛ ✲<br />
✻<br />
✻<br />
Speicherbus<br />
Arbitrierung<br />
Speicher-<br />
Zugriffe<br />
❄ ❄<br />
❄ ❄ ❄<br />
Befehle ✛ Re-<br />
Speicherzugriffs-Einheit<br />
Prozessor-Einheit gi Controller-Einheit<br />
Parameter ✛ ster<br />
✛ ✲ Host-Interface<br />
lesen<br />
✻<br />
❄<br />
schreiben<br />
✲<br />
✲<br />
✲<br />
✻<br />
✻<br />
Reload &<br />
Refresh<br />
❄ Host-Interface<br />
Abbildung 1: Das Blockschaltbild des Grafikprozessors ” TIM“ läßt die Gliederung in vier Einheiten erkennen.<br />
Video- ✲<br />
Signale<br />
Takt✲<br />
signale
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 2.3<br />
Seite 9<br />
Die Video-Timing-Einheit und die VRAM-Reload-Einheit gehören dabei eng zusammen, denn die<br />
erste steuert die Zeitpunkte, zu denen die zweite die Daten bereitstellen muß. Die Einheiten haben<br />
einen gemeinsamen Systemtakt, den Video-Takt VClk.<br />
Die Controller-Einheit und die Prozessor-Einheit haben ebenfalls einen gemeinsamen Systemtakt,<br />
den Host-Takt MClk. Auch sie sind stark verflochten, so laufen z. B. Speicherzugriffe der Prozessor-<br />
Einheit über die Controller-Einheit ab.<br />
Im Speedchart-Entwurf wurden die Einheiten daher jeweils zu einem Design zusammengefaßt. Die<br />
entstehenden zwei Designs ” VIDEO“ und ” TIM“ sind funktional weitgehend unabhängig, so daß<br />
sich eine einfache Schnittstelle zwischen ihnen definieren läßt. Diese umfaßt hauptsächlich einige<br />
Registerwerte, die an die Video-Einheit übergeben werden, und einige Signale der Arbitrierungslogik,<br />
die dafür sorgt, daß die Einheiten zeitlich alternierend auf den gemeinsamen Speicherbus<br />
zugreifen können.<br />
Die Aufteilung auf zwei getrennte Designs war in der aktuellen Speedchart-Version zwingend erforderlich,<br />
da diese keine unterschiedlichen Systemtakte innerhalb eines Designs unterstützt. In<br />
einer zukünftigen Version wird dies aber möglich sein, so daß ein Gesamtentwurf unter Speedchart<br />
den kompletten Grafikprozessor beschreiben wird. Lediglich einige zum Teil bidirektionale<br />
Ausgangstreiber müssen dann noch per Hand angefügt werden.<br />
2.3 Prioritätssteuerung der ablaufenden Prozesse<br />
Im Grafikprozessor laufen verschiedene Prozesse ab, einige davon permanent, andere nur bei Bedarf.<br />
Dabei können die folgenden Prozesse unabhängig voneinander parallel ausgeführt werden:<br />
• Erzeugung der Video-Timing-Signale<br />
• Zugriffe des Hosts auf die Register des Grafikprozessors<br />
• Bearbeitung von Grafikbefehlen ohne Speicherzugriffe<br />
Bei allen Zugriffen auf den Speicher hingegen muß eine Arbitrierungslogik dafür sorgen, daß die<br />
Zugriffe zeitlich alternierend erfolgen. Dies gilt für die folgenden Zugriffe:<br />
• Refresh-Zyklen für die dynamischen RAMs<br />
• Reload-Zyklen (Laden der VRAM-Schieberegister mit Bilddaten)<br />
• Zugriffe des Hosts auf den Speicher (lesen, schreiben)<br />
• Speicherzugriffe bei der Bearbeitung von Grafikbefehlen<br />
Die Festlegung der Prioritäten dieser Prozesse muß sich nach einer Folgenabschätzung richten:<br />
Falls Refresh-Zyklen über einen längeren Zeitraum hinweg ausfallen, kann es zu Datenverlusten<br />
in den dynamischen RAMs kommen. Daher müssen Refresh-Zyklen, die bereits lange überfällig<br />
sind, die höchste Priorität erhalten. Wie in Abschnitt 4.5.4 noch erläutert wird, spielt der genaue<br />
Zeitpunkt von Refreshs jedoch keine Rolle; kleine Verzögerungen sind ohne weiteres tolerierbar.<br />
Daher können Refreshs normalerweise eine etwas niedrigere Priorität erhalten.<br />
Falls Reload-Zyklen nicht rechtzeitig durchgeführt werden können, werden temporäre<br />
Störstreifen auf dem Bildschirm sichtbar. Auch dies sollte unbedingt vermieden werden. In<br />
Abschnitt 4.2 werden verschiedene Arten von Reloads unterschieden, von denen manche zu einem<br />
exakten Zeitpunkt durchgeführt werden müssen. Solche Echtzeit-Reloads müssen daher ebenfalls
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 2.3<br />
Seite 10<br />
eine sehr hohe Priorität erhalten. Andere Reloads müssen nur innerhalb einer gewissen Zeitspanne<br />
durchgeführt werden. Dennoch sind sie höher zu priorisieren als z. B. Speicherzugriffe des Hosts.<br />
Die Speicherzugriffe von Host und Grafikprozessor sind untereinander lediglich so einzustufen,<br />
daß eine möglichst hohe Geschwindigkeit des Gesamtsystems erreicht wird. Daher<br />
sollten Host-Zugriffe gegenüber Speicherzugriffen der Prozessor-Einheit bevorzugt behandelt werden,<br />
damit der Host über die Handshake-Signale des Host-Interfaces nicht komplett ” lahmgelegt“<br />
wird, bis ein Grafikbefehl bearbeitet wurde. Die Prozessor-Einheit erhält somit die niedrigste<br />
Priorität. Sie führt Schreib- und Lesezugriffe in der Reihenfolge aus, in der sie anfallen.<br />
Für Schreibzugriffe des Hosts auf den Speicher wurde ein Schreib-Puffer implementiert, der es<br />
ermöglicht, daß der Datentransfer seitens des Hosts häufig schon abgeschlossen werden kann, ohne<br />
daß auf eine Freigabe des Speicherbusses gewartet werden muß. Das Schreiben der Daten aus dem<br />
Puffer in den Speicher ist dabei höher zu priorisieren als Lese-Zugriffe des Hosts, da anderenfalls<br />
Unstimmigkeiten bei Schreib- und Lese-Zugriffen auf die gleichen Daten auftreten könnten.<br />
Aus diesen Überlegungen ergibt sich die folgende Prioritätsverteilung:<br />
1) stark überfällige Refresh-Zyklen (theoretisch)<br />
2) Echtzeit-Reload-Zyklen<br />
3) sonstige Refresh-Zyklen<br />
4) sonstige Reload-Zyklen<br />
5) Schreiben von Host-Daten aus dem Schreib-Puffer<br />
6) Lese-Zugriffe des Hosts auf den Speicher<br />
7) Speicherzugriffe der Prozessor-Einheit<br />
Aus den Ausführungszeiten und den Prioritäten von Reload- und Refresh-Zyklen ergibt sich, daß<br />
Refresh-Zyklen unter normalen Umständen nie so lange verzögert werden, daß Punkt 1) eintritt.<br />
Um Datenverluste jedoch mit Sicherheit auszuschließen, wurden stark überfällige Refresh-Zyklen<br />
dennoch berücksichtigt.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
3 Die Video-Timing-Einheit<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
3.1 Aufgaben der Video-Timing-Einheit<br />
Abschnitt 3.1<br />
Seite 11<br />
Aufgabe der Video-Timing-Einheit ist es, für eine synchrone Bilddarstellung auf dem Monitor zu<br />
sorgen. Hierfür stehen die folgenden, ’0’-aktiven Signale zur Verfügung:<br />
• HSYNC, dessen fallende Flanke einen horizontalen Strahlrücklauf des Monitors einleitet,<br />
• VSYNC, dessen fallende Flanke einen vertikalen Strahlrücklauf einleitet,<br />
• CSYNC, das beide Sync-Informationen vereint und z. B. bei Fernsehbildern die HSYNCund<br />
VSYNC-Signale ersetzt,<br />
• und CBLANK, dessen inaktiver Bereich (CBLANK=’1’) den sichtbaren Bildbereich kennzeichnet.<br />
Außerdem werden interne Signale erzeugt, die das Laden der Schieberegister in den Video-RAMs<br />
steuern und so dafür sorgen, daß zur richtigen Zeit gültige Bilddaten ausgegeben werden (s. Abschnitt<br />
4). Die zeitliche Lage der Signale, aus der sich auch die Bildschirmauflösung ergibt, ist über<br />
Register programmierbar. Darüber hinaus kennt TIM zwei Synchronisations-Modi:<br />
• die interne Synchronisation, bei der TIM die oben genannten Signale selbst erzeugt,<br />
• und die externe Synchronisation, bei der mindestens eines der Sync-Signale als Eingang<br />
dient, so daß TIM die Bilddarstellung mit einer externen Signalquelle synchronisieren kann.<br />
So sind z. B. Einblendungen von Texten in externe Videobilder möglich.<br />
In beiden Synchronisations-Modi werden je zwei Video-Betriebsarten unterstützt:<br />
• der Vollbildbetrieb (Non-Interlaced Mode), bei dem mit jedem vertikalen Strahldurchlauf<br />
ein volles Videobild dargestellt wird,<br />
• und der Halbbildbetrieb (Interlaced Mode), bei dem nach dem Zeilensprung-Verfahren<br />
abwechselnd zwei Halbbilder aus den geraden bzw. den ungeraden Bildschirmzeilen aufgebaut<br />
werden, so daß sich die Vertikalfrequenz des Monitors bei gleichem Pixeltakt verdoppelt und<br />
das Bild scheinbar weniger flimmert.<br />
Des weiteren wurden zwei Spezialfunktionen realisiert:<br />
• Beim ZOOMing werden die Pixel aus dem Speicher vergrößert auf dem Monitor wiedergegeben.<br />
Höhe und Breite der Bildpunkte lassen sich getrennt voneinander um die Faktoren<br />
1, 2, 4, ... 128 vergrößern. Für die Vergrößerung in Y-Richtung werden dabei die Bildzeilen<br />
entsprechend häufig wiederholt; für das Zooming in X-Richtung wird der Ladetakt für<br />
die Schieberegister der VRAMs heruntergeteilt, so daß die Bilddaten langsamer ausgegeben<br />
werden (s. Abschnitt 4).<br />
• Beim PANning kann die Adresse, ab der die ersten Daten im Video-Speicher ausgegeben<br />
werden, frei programmiert werden. Dadurch ist es möglich, den Bildschirminhalt in X- und<br />
Y-Richtung zu verschieben, wenn der virtuelle Bildschirm (im Speicher) größer ist als der<br />
physikalische Bildschirm (auf dem Monitor).
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
3.2 Interne Synchronisation<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
3.2.1 Vollbildbetrieb (Non-Interlaced Mode)<br />
Abschnitt 3.2<br />
Seite 12<br />
Bei interner Synchronisation im Vollbildbetrieb bestimmen TIM-interne Register auf einfache Weise<br />
den zeitlichen Verlauf der Synchronisations-Signale.<br />
Ein Horizontal-Zähler HCOUNT zählt dabei die steigenden Flanken des Videotaktes VClk und<br />
wird nach Erreichen des Registerwertes HTOTAL auf Null zurückgesetzt.<br />
Die horizontalen Sync- und Blanking-Signale werden von HCOUNT abgeleitet. So wird HSYNC<br />
beim Zählerüberlauf aktiv ’0’ und nach Erreichen von HESYNC wieder inaktiv ’1’. HBLANK,<br />
die Komponente des CBLANK-Signals, die das Bild während der horizontalen Strahlrücklaufphase<br />
dunkeltastet, wird nach HCOUNT=HSBLNK aktiv ’0’ und nach HCOUNT=HEBLNK inaktiv ’1’.<br />
Ein Vertikal-Zähler VCOUNT wird mit jedem Überlauf von HCOUNT erhöht und nach Erreichen<br />
des Registerwertes VTOTAL auf Null zurückgesetzt. Aus VCOUNT leiten sich die vertikalen<br />
Signale VSYNC und VBLANK in entsprechender Weise ab, nur die Bedingung für das Ende des<br />
VSYNC-Pulses ist VCOUNT=VESYNC/2 und nicht VCOUNT=VESYNC.<br />
HCOUNT, VCOUNT Abbildung 2: Der Horizontalzähler HBLANK, VBLANK, CBLANK<br />
0<br />
HCOUNT repräsentiert die aktuelle<br />
VCOUNT= 1<br />
Bildschirmspalte, der Vertikalzähler<br />
2<br />
VCOUNT die Zeile. HCOUNT zählt<br />
✛ HBLANK=’1’ ✲<br />
3<br />
mit jeder VClk-Flanke und wird nach<br />
4<br />
5<br />
HCOUNT=HTOTAL auf 0 zurück-<br />
✻<br />
6<br />
gesetzt. In diesem Augenblick wird<br />
7<br />
VCOUNT erhöht.<br />
8<br />
VBLANK<br />
9<br />
CBLANK=’1’<br />
=’1’<br />
10<br />
Abbildung 3: Der sichtbare<br />
11<br />
12<br />
Bildschirmbereich ergibt sich aus ❄<br />
13<br />
HBLANK=VBLANK=’1’. Beginn<br />
14<br />
und Ende beider Blanking-Signale<br />
non-interlaced<br />
sind über Register programmierbar.<br />
non-interlaced<br />
HCOUNT=<br />
0 1 2 3 4 5 6 9 10 11 12 13 14 15<br />
Register Funktion<br />
Beispiel<br />
Abb. 2-7<br />
HTOTAL = (Anzahl der VClk-Zyklen pro Zeile) – 1 15<br />
HEBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Ende<br />
des HBLANK-Pulses) – 1<br />
3<br />
HSBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Start<br />
des HBLANK-Pulses) – 1<br />
13<br />
HESYNC = (Länge des HSYNC-Pulses in VClk-Zyklen) – 1 1<br />
HESERR = (Länge der Serrations-Pulse des CSYNC-Signals in VClk-Zyklen) – 1 13<br />
VTOTAL = (Anzahl der Zeilen pro Vollbild) – 1 14<br />
VEBLNK = (Anzahl der Zeilen vom Start des VSYNC-Pulses bis zum Ende des<br />
VBLANK-Pulses) – 1<br />
4<br />
HSBLNK = (Anzahl der Zeilen vom Start des VSYNC-Pulses bis zum Start des<br />
VBLANK-Pulses) – 1<br />
12<br />
VESYNC = (2 · Länge des VSYNC-Pulses in Zeilen) – 1 5<br />
Tabelle 1: Register zur Programmierung der Video-Signale im Vollbildbetrieb<br />
Das CBLANK-Signal ist die logische ODER-Verknüpfung und somit die physikalische UND-<br />
Verknüpfung von HBLANK und VBLANK (s. Abb. 3).
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.2<br />
Seite 13<br />
Das CSYNC-Signal (Abb. 5) ist die meiste Zeit mit HSYNC identisch; nur in der Phase, in<br />
der VSYNC=’0’ ist (Serrationsphase), werden Serrationspulse ausgegeben, die länger als die Synchronisationspulse<br />
sind. Im Monitor leiten die steigenden Flanken von CSYNC einen horizontalen<br />
Strahlrücklauf ein, während das vertikale Synchronsignal über einen Tiefpaß aus CSYNC gewonnen<br />
wird.<br />
HSYNC, VSYNC<br />
VSYNC=’0’<br />
❅<br />
❅VSYNC=’0’, HSYNC=’0’<br />
Abbildung 4: Die ’0’-aktiven Signale<br />
HSYNC und VSYNC beginnen<br />
am Zeilen- bzw. Vollbildanfang.<br />
Der HSYNC-Puls endet, nachdem<br />
HCOUNT den Wert HESYNC erreicht<br />
hat, während der VSYNC-Puls nach<br />
VCOUNT=VESYNC/2 endet.<br />
CSYNC<br />
0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
0 0 0 0 0 0 0 0 0 0 0 0 0 0<br />
0 0<br />
HSYNC=’0’<br />
non-interlaced<br />
Abbildung 5: Das CSYNC-Signal vereint<br />
die Informationen von HSYNC<br />
und VSYNC in einem Signal. In der<br />
Phase des vertikalen Strahlrücklaufs<br />
werden Serrationspulse erzeugt, deren<br />
Länge über das HESERR-Register<br />
programmiert werden kann.<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
non-interlaced<br />
Dafür, daß im sichtbaren Bildschirmbereich gültige Daten aus dem Video-Speicher angezeigt werden,<br />
sorgt die Reload-Einheit (Abschnitt 4). Da die dabei nötigen VRAM-Zugriffe Zeit benötigen,<br />
muß die Video-Timing-Einheit schon am Ende der jeweils vorigen Bildschirmzeile ein Signal an die<br />
Reload-Einheit senden, daß für die folgende Zeile Daten bereitgestellt werden sollen. Außerdem<br />
muß ihr mitgeteilt werden, welche Zeile ausgegeben werden soll und mit welcher Wort-Adresse im<br />
Speicher die Zeilendaten beginnen. Hierzu werden in Registern (vgl. Tabelle 16, S. 67) die Wortadresse<br />
DPYSTRT des ersten Pixels auf dem Bildschirm und die Länge DPYINC einer logischen<br />
Bildschirmzeile programmiert.<br />
Die Video-Timing-Einheit setzt zur Steuerung der Reload-Einheit das Register DPYNEXT immer<br />
auf die Startadresse der kommenden Bildschirmzeile, so daß sich ein Verlauf ähnlich Abbildung 7<br />
ergibt, nur daß DPYNEXT die Wort-Adressen und nicht die Zeilennummern enthält. In dem<br />
Augenblick, in dem DPYNEXT seinen Wert ändert, wird außerdem kurzzeitig das interne Signal<br />
RELOAD gesetzt, um der Reload-Einheit zu signalisieren, daß die Schieberegister geladen werden<br />
müssen.<br />
Ist Zooming in Y-Richtung aktiv, so wird mehrfach die gleiche Zeile ausgegeben. In diesem Fall<br />
wird RELOAD auch dann aktiv, wenn die nächste Zeile eine Wiederholung der vorangegangenen<br />
ist, damit die VRAMs noch einmal auf den Start der Daten der zu wiederholenden Zeile gesetzt<br />
werden können.<br />
IPHASE<br />
Abbildung 6: Im Vollbildbetrieb gibt<br />
es nur zwei Videophasen.<br />
VLINE<br />
Serration ”000”<br />
VLINE=0xFFFF<br />
Bild ”111”<br />
non-interlaced<br />
Abbildung 7: Die Variable VLINE<br />
gibt die gerade angezeigte physikalische<br />
Bildschirmzeile an. Damit Reloads<br />
rechtzeitig möglich sind, wechselt<br />
VLINE bereits am Ende der letzten<br />
Videozeile. Im Zoom-Modus wird<br />
die gleiche Zeile bis zu 128 mal wiederholt.<br />
0<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
non-interlaced<br />
0<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
3.2.2 Halbbildbetrieb (Interlaced Mode), NTSC<br />
Abschnitt 3.2<br />
Seite 14<br />
Im Interlaced Mode (Registerbit ILE=’1’) werden abwechselnd zwei Halbbilder erzeugt, die nur aus<br />
den geraden bzw. den ungeraden Bildschirmzeilen bestehen. Sie überlagern sich gemäß Abbildung 8<br />
zu einem Vollbild. Im Speicher stehen die Zeilen dabei hintereinander; bei der Ausgabe wird jede<br />
zweite Zeile übersprungen.<br />
ungerade Zeilen gerade Zeilen Überlagerung<br />
❳ ❳❳❳❳<br />
❳ ❳❳<br />
❳❳❳❳<br />
❳❳❳❳ 1 ❳<br />
❳❳<br />
❳<br />
❳❳❳ ❳❳❳<br />
❳ ❳❳❳<br />
❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ 3 ❳ ❳<br />
❳❳❳❳ ❳❳<br />
❳ ❳❳❳ ❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ 5<br />
❳<br />
❳❳❳❳ ❳❳<br />
❳ ❳<br />
❳❳❳ 7<br />
❳❳<br />
❳ ❳❳❳❳❳<br />
❳ ❳❳<br />
❳<br />
❳❳❳❳<br />
❳❳<br />
0<br />
❳❳❳<br />
❳❳ ❳❳❳ 2 ❳❳❳<br />
❳ ❳❳❳<br />
❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ ❳ ❳<br />
❳❳❳❳ 4 ❳❳<br />
❳ ❳❳❳ ❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ ❳<br />
❳❳❳❳ 6 ❳❳<br />
❳❳❳❳ ❳<br />
❳<br />
❳ ❳❳❳❳ ❳ ❳❳❳❳❳<br />
❳ ❳❳<br />
❳❳❳❳ 0<br />
❳❳❳❳ 1 ❳<br />
❳❳<br />
❳<br />
❳❳❳ 2 ❳❳❳<br />
❳ ❳❳❳<br />
❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ 3 ❳ ❳<br />
❳❳❳❳ 4 ❳❳<br />
❳ ❳❳❳ ❳❳❳❳ ❳<br />
❳❳<br />
❳❳❳❳ 5<br />
❳<br />
❳❳❳❳ 6 ❳❳<br />
❳ ❳❳❳ 7 ❳❳❳❳ ❳<br />
❳❳ ❳<br />
Abbildung 8: Im Halbbildbetrieb überlagern sich zwei Halbbilder aus geraden bzw. ungeraden Bildschirmzeilen zu<br />
einem Vollbild.<br />
Abbildung 9: Im Speicher stehen gerade<br />
und ungerade Bildschirmzeilen gemischt<br />
hintereinander, auf dem Monitor werden<br />
sie auf zwei Halbbilder aufgeteilt. Die<br />
Halbbilder bestehen aus einer nicht ganzzahligen<br />
Anzahl von Zeilen.<br />
VLINE=0xFFFF<br />
1<br />
3<br />
5<br />
7<br />
interlaced NTSC odd filed<br />
1<br />
3<br />
5<br />
7<br />
VLINE<br />
VLINE=0xFFFF<br />
0<br />
2<br />
4<br />
6<br />
interlaced NTSC even field<br />
Der Horizontalzähler HCOUNT verhält sich im Halbbildbetrieb genau wie im Vollbildbetrieb.<br />
Ebenso ist das Verhalten von HSYNC und HBLANK identisch.<br />
Abbildung 10: Damit Halbbild-, Signalund<br />
Phasenwechsel auch in der Zeilenmitte<br />
möglich sind, wird der Zeilenzähler<br />
VCOUNT zum Teil auch in der Zeilenmitte<br />
erhöht. Ein direkter Zusammenhang<br />
zwischen VTOTAL und der Anzahl<br />
der Zeilen pro Halbbild besteht im Halbbildbetrieb<br />
nicht mehr.<br />
VCOUNT<br />
0<br />
2<br />
4<br />
6<br />
8<br />
10<br />
17<br />
19<br />
21<br />
23<br />
12<br />
13<br />
14<br />
15<br />
16<br />
1<br />
3<br />
5<br />
7<br />
9<br />
11<br />
18<br />
20<br />
22<br />
1<br />
3<br />
5<br />
7<br />
9<br />
13<br />
18<br />
20<br />
22<br />
11<br />
12<br />
15<br />
16<br />
17<br />
0<br />
2<br />
4<br />
6<br />
8<br />
10<br />
14<br />
19<br />
21<br />
23<br />
interlaced NTSC odd filed interlaced NTSC even field<br />
Ein Unterschied besteht beim Vertikalzähler VCOUNT. Da im Halbbildbetrieb ein Vollbild eine<br />
ungerade Zeilenanzahl hat und somit während einer Vertikalperiode (Halbbild) eine nicht ganzzahlige<br />
Anzahl von Zeilen ausgegeben wird, kann VCOUNT keine ganzen Videozeilen zählen. Der<br />
0<br />
2<br />
4<br />
6
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.2<br />
Seite 15<br />
Vertikalzähler wurde daher beim TI-34020 so beschaltet, daß er in manchen Phasen des vertikalen<br />
Timings zweimal pro Zeile erhöht wird, was in Abbildung 10 zu sehen ist. Aus Kompatibilitätsgründen<br />
wurde das Verhalten des Zählers exakt vom TI-34020 übernommen.<br />
Auch VBLANK (vgl. Abb. 11) zeigt ein ungewöhnliches Verhalten. Die erste angezeigte Bildschirmzeile<br />
(Zeile 0 im geraden Halbbild) beginnt erst in der horizontalen Bildschirmmitte (hier<br />
wird VBLANK inaktiv ’1’), und die letzte Zeile des ungeraden Halbbildes endet in der Bildmitte<br />
(VBLANK wird aktiv ’0’). Aus Abbildung 8 wird jedoch deutlich, daß der sichtbare Bildschirmbereich<br />
aufgrund der Schräglage der Zeilen anderenfalls schief wirken würde.<br />
Abbildung 11: Die erste und letzte Zeile<br />
stehen komplett im Speicher, durch Blanking<br />
werden sie jedoch nur zur Hälfte angezeigt.<br />
Das VBLANK-Signal wechselt<br />
dabei in der Mitte einer Bildschirmzeile<br />
seinen Zustand.<br />
✻<br />
VBLANK<br />
=’1’<br />
❄<br />
✛ ✲<br />
HBLANK=’1’<br />
CBLANK=’1’<br />
interlaced NTSC odd filed<br />
CBLANK<br />
✻<br />
VBLANK<br />
=’1’<br />
❄<br />
✛ ✲<br />
HBLANK=’1’<br />
CBLANK=’1’<br />
interlaced NTSC even field<br />
Die Länge des VSYNC-Pulses entspricht bei NTSC einem ganzzahligen Vielfachen der Zeilenlänge,<br />
jedoch liegen sein Start- und Endpunkt je nach Halbbild abwechselnd in den Zeilenmitten und an<br />
den Zeilenanfängen.<br />
Das CSYNC-Signal schließlich macht im Halbbildbetrieb eine Aufteilung einer Vertikalperiode in<br />
mehrere Phasen nötig. In der Bildphase (vgl. Abb. 12 und 13) ist CSYNC mit HSYNC identisch.<br />
In der Serrationsphase werden auf CSYNC längere Serrationspulse ausgegeben, die bei richtiger<br />
Programmierung des HESERR-Registers so lange inaktiv ’1’ sind, wie HSYNC aktiv ’0’ ist. Sie<br />
werden zweimal pro Zeile ausgegeben, damit sichergestellt ist, daß bei beiden Halbbildern fallende<br />
Flanken von CSYNC am Zeilenanfang auftreten, die einen horizontalen Strahlrücklauf einleiten<br />
können. In den Equalisationsphasen schließlich werden zweimal pro Zeile Equalisationspulse erzeugt,<br />
die die halbe Länge der HSYNC-Pulse haben. Da der Monitor die VSYNC-Information<br />
aus dem CSYNC-Signal über einen Tiefpaß extrahiert, verbessert die Verkürzung der Pulse die<br />
Flankensteilheit des gewonnenen VSYNC-Signals.<br />
Abbildung 12: Im Halbbildbetrieb gibt<br />
es fünf Phasen vertikalen Timings. Die<br />
Serrations- und Bildphase sind bereits<br />
vom Vollbildbetrieb her bekannt. Die<br />
Länge der Serrationsphase entspricht bei<br />
NTSC einem ganzzahligen Vielfachen der<br />
Zeilenlänge. Neu sind die Equalisationsphasen,<br />
die gleich lang sind.<br />
Serration ”000”<br />
Equalis. II ”011”<br />
Bild I ”110”<br />
Bild II<br />
Equalis. I<br />
”111”<br />
”010”<br />
interlaced NTSC odd filed<br />
IPHASE<br />
Serration<br />
Equalis. II<br />
Bild I<br />
Bild II<br />
”000”<br />
”011”<br />
”110”<br />
”111”<br />
Equalis. I ”010”<br />
interlaced NTSC even field
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Abbildung 13: In der Bildphase ist<br />
CSYNC mit HSYNC identisch. In der<br />
Serrationsphase, der Phase des vertikalen<br />
Strahlrücklaufs, werden pro Zeile<br />
zwei längere Serrationspulse ausgegeben,<br />
aus denen der Monitor die VSYNC-<br />
Information extrahiert. In den Equalisationsbereichen<br />
werden Pulse am Beginn<br />
und in der Mitte der Zeilen erzeugt, die<br />
die halbe Länge der HSYNC-Pulse haben.<br />
Register Funktion<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
interlaced NTSC odd filed<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
CSYNC<br />
0<br />
0<br />
0<br />
0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0 0<br />
0<br />
0<br />
0<br />
00<br />
0 0 0 0 0<br />
0 0 0 0 0<br />
0 0 0 0 0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
Abschnitt 3.2<br />
Seite 16<br />
interlaced NTSC even field<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
0<br />
Beispiel<br />
Abb. 9-10<br />
HTOTAL = (Anzahl der VClk-Zyklen pro Zeile) – 1 15<br />
HEBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Ende<br />
des HBLANK-Pulses) – 1<br />
3<br />
HSBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Start<br />
des HBLANK-Pulses) – 1<br />
13<br />
HESYNC = (Länge des HSYNC-Pulses in VClk-Zyklen) – 1 1<br />
HESERR = (Länge der Serrations-Pulse des CSYNC-Signals in VClk-Zyklen) – 1 5<br />
VTOTAL = ((Anzahl der Zeilen pro Vollbild) – 1)/2<br />
+ (Anzahl der Zeilen in der Serrationsphase (vertikale Sync-Phase))<br />
+ (Anzahl der Halbzeilen pro Equalisationsphase)<br />
VEBLNK = (Anzahl der Zeilen vom Start des VSYNC-Pulses bis zum Ende des<br />
VBLANK-Pulses) – 1<br />
+ (Anzahl der Zeilen in der Serrationsphase)<br />
+ (Anzahl der Zeilen pro Equalisationsphase)<br />
HSBLNK = VTOTAL – Anzahl der Halbzeilen pro Equalisationsphase 17<br />
VESYNC = (2 · Länge des VSYNC-Pulses in Halbzeilen) – 1 11<br />
Tabelle 2: Register zur Programmierung der Video-Signale im Halbbildbetrieb (NTSC)<br />
3.2.3 Halbbildbetrieb (Interlaced Mode), PAL<br />
Die PAL-Norm unterscheidet sich von der NTSC-Norm vor allem darin, daß die Länge der vertikalen<br />
Strahlrücklaufphase (Serrationsphase) kein ganzzahliges Vielfaches der Zeilenlänge ist, sondern ein<br />
ungeradzahliges Vielfaches der Halbzeilenlänge.<br />
Dies führt dazu, daß bei PAL-Signalen die geradzahligen Halbbilder mit einem Zeilenwechsel beginnen,<br />
während sie bei NTSC in der Zeilenmitte anfangen (vgl. Abb. 14).<br />
Abbildung 14: Bei der PAL-Norm beginnen<br />
die geradzahligen Halbbilder mit<br />
einem Zeilenwechsel.<br />
VLINE=0xFFFF<br />
1<br />
3<br />
5<br />
7<br />
interlaced PAL odd field<br />
1<br />
3<br />
5<br />
7<br />
VLINE<br />
0<br />
2<br />
4<br />
6<br />
23<br />
13<br />
VLINE=0xFFFF<br />
interlaced PAL even filed<br />
0<br />
2<br />
4<br />
6
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Abbildung 15: Die Länge der Serrationsphase<br />
ist bei PAL ein ungeradzahliges<br />
Vielfaches der Halbzeilenlänge.<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Serration<br />
Equalis. II<br />
Bild I<br />
Bild II<br />
Equalis. I<br />
”000”<br />
”011”<br />
”110”<br />
”111”<br />
”010”<br />
interlaced PAL odd field<br />
IPHASE<br />
Serration<br />
Equalis. II<br />
Bild I<br />
Bild II<br />
Equalis. I<br />
Abschnitt 3.3<br />
Seite 17<br />
”000”<br />
”011”<br />
”110”<br />
”111”<br />
”010”<br />
interlaced PAL even filed<br />
Außerdem ist das Verhalten des Vertikalzählers VCOUNT, das vom TI-34020 übernommen wurde,<br />
beim Übergang von der Equalisationsphase II zur Bildphase I etwas ungewöhnlich (vgl. Abb. 16).<br />
Im Gegensatz zu NTSC-Bildern wird VCOUNT hier nicht erhöht. Daher ist auch die Berechnung<br />
des Registerwertes VTOTAL gemäß Tabelle 3 anders durchzuführen als bei NTSC.<br />
Abbildung 16: Werden Signale nach der<br />
PAL-Norm erzeugt, so wird VCOUNT<br />
beim Übergang von der Equalisationsphase<br />
II zur Bildphase I nicht erhöht.<br />
Register Funktion<br />
VCOUNT<br />
1<br />
3<br />
5<br />
7<br />
16<br />
18<br />
20<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
0<br />
2<br />
4<br />
6<br />
8<br />
17<br />
19<br />
21<br />
0<br />
2<br />
4<br />
6<br />
8<br />
12<br />
17<br />
19<br />
21<br />
10<br />
11<br />
14<br />
15<br />
16<br />
1<br />
3<br />
5<br />
7<br />
9<br />
13<br />
18<br />
20<br />
interlaced PAL odd field<br />
interlaced PAL even filed<br />
Beispiel<br />
Abb. 14-16<br />
HTOTAL = (Anzahl der VClk-Zyklen pro Zeile) – 1 15<br />
HEBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Ende<br />
des HBLANK-Pulses) – 1<br />
3<br />
HSBLNK = (Anzahl der VClk-Zyklen vom Start des HSYNC-Pulses bis zum Start<br />
des HBLANK-Pulses) – 1<br />
13<br />
HESYNC = (Länge des HSYNC-Pulses in VClk-Zyklen) – 1 1<br />
HESERR = (Länge der Serrations-Pulse des CSYNC-Signals in VClk-Zyklen) – 1 5<br />
VTOTAL = (Anzahl der Zeilen pro Vollbild)/2 – 1<br />
+ (Anzahl der Zeilen in der Serrationsphase (vertikale Sync-Phase))<br />
+ (Anzahl der Halbzeilen pro Equalisationsphase)<br />
VEBLNK = (Anzahl der Zeilen vom Start des VSYNC-Pulses bis zum Ende des<br />
VBLANK-Pulses) – 3/2<br />
+ (Anzahl der Zeilen in der Serrationsphase)<br />
+ (Anzahl der Zeilen pro Equalisationsphase)<br />
HSBLNK = VTOTAL – Anzahl der Halbzeilen pro Equalisationsphase 16<br />
VESYNC = (2 · Länge des VSYNC-Pulses in Halbzeilen) – 1 9<br />
Tabelle 3: Register zur Programmierung der Video-Signale im Halbbildbetrieb (PAL)<br />
3.3 Externe Synchronisation<br />
Neben der internen Synchronisation, bei der alle Synchronisationssignale von TIM erzeugt werden,<br />
gibt es gemäß Tabelle 4 drei Modi der externen Synchronisation, in denen TIM das Videobild<br />
21<br />
12
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.3<br />
Seite 18<br />
synchron zu einem externen Videosignal aufbaut und so das Überlagern und Einblenden von Bildern<br />
ermöglicht.<br />
Über die Registerbits VSD, HSD und CSD kann dabei für jedes der Synchronisationssignale<br />
VSYNC, HSYNC und CSYNC getrennt festgelegt werden, ob es als Ausgang oder als Eingang<br />
fungieren soll. Da nicht jede Kombination sinnvoll ist, werden unter bestimmten Bedingungen<br />
redundante Signale ignoriert. Tabelle 5 gibt hierüber Auskunft.<br />
Wichtig ist, daß im externen Synchronisationsmodus auch die Timing-Register entsprechend<br />
dem externen Video-Signal programmiert werden.<br />
Modus<br />
0 1<br />
Bedingung(en)<br />
Sync Direction<br />
( 0 = Eingang )<br />
Interl.<br />
Enable Beschreibung<br />
VSD HSD CSD ILE<br />
1<br />
0<br />
1<br />
0<br />
1<br />
1<br />
1<br />
1<br />
X<br />
X<br />
1<br />
VSYNC, HSYNC und CSYNC sind Ausgänge:<br />
Alle Synchronisationssignale werden intern von TIM erzeugt.<br />
1 0 1 1 0 VSYNC ist Eingang:<br />
Eine fallende Flanke an VSYNC lädt den Vertikalzähler; die horizontale<br />
Synchronisation erfolgt nur über den Videotakt und die Einstellung im<br />
HTOTAL-Register.<br />
CSYNC und HSYNC werden als Ausgangssignale erzeugt.<br />
2 0<br />
0<br />
3 1<br />
1<br />
0<br />
0<br />
0<br />
1<br />
0<br />
1<br />
1<br />
0<br />
0<br />
0<br />
0<br />
X<br />
X<br />
X<br />
X<br />
X<br />
HSYNC und VSYNC sind Eingänge:<br />
Eine fallende Flanke an HSYNC lädt den Horizontalzähler, eine fallende<br />
Flanke an VSYNC den Vertikalzähler.<br />
CSYNC wird als Ausgangssignal erzeugt.<br />
CSYNC ist Eingang:<br />
Eine fallende Flanke an CSYNC lädt den Horizontalzähler (im Halbbildbetrieb<br />
aber nicht, wenn sie in der Zeilenmitte auftritt); die VSYNC-<br />
Information wird ebenfalls aus dem CSYNC-Signal gewonnen, wobei ein<br />
’0’-Puls erkannt wird, dessen Länge um mindestens zwei Zyklen des Videotaktes<br />
länger ist als der interne HSYNC-Puls.<br />
HSYNC und VSYNC werden als Ausgangssignale erzeugt.<br />
Tabelle 4: Neben der internen Synchronisation kennt TIM drei Modi der externen Synchronisation.<br />
Sync Direction Interlaced Enable<br />
( 0 = Eingang ) ILE=’0’ ILE=’1’<br />
VSD HSD CSD ( Vollbildbetrieb ) ( Halbbildbetrieb )<br />
0 0 0 wie Modus 2; Signal an CSYNC ist redundant und wird ignoriert<br />
0 0 1 Modus 2<br />
0 1 0 wie Modus 3; Signal an VSYNC ist redundant und wird ignoriert<br />
0 1 1<br />
Modus 1<br />
wie Modus 0, da aus VSYNC allein nicht erkannt<br />
werden kann, welches Halbbild dargestellt<br />
werden muß<br />
1 0 0 wie Modus 3; Signal an HSYNC ist redundant und wird ignoriert<br />
1 0 1 wie Modus 0; Signal an HSYNC wird ignoriert, da es keine vertikale Synchronisation erlaubt<br />
1 1 0 Modus 3<br />
1 1 1 Modus 0<br />
Tabelle 5: In manchen, eigentlich nicht sinnvollen Konfigurationen werden redundante oder zur Synchronisation nicht<br />
ausreichende Signale an Sync-Eingängen ignoriert.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
3.4 Realisierung in Speedchart-VHDL<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.4<br />
Seite 19<br />
Im Speedchart-Design besteht die Video-Timing-Einheit aus drei Diagrammen. Das Diagramm<br />
S HCNT steuert das Horizontaltiming, das Diagramm S VCNT das Vertikaltiming. Das Diagramm<br />
CSYNC ist nur im externen Synchronisationsmodus wichtig, um aus einem externen<br />
CSYNC-Signal die VSYNC-Information zu extrahieren.<br />
3.4.1 Steuerung des horizontalen Timings<br />
Das Diagramm S HCNT (Seite 82) steuert das Horizontaltiming, also den Zähler HCOUNT, die<br />
Signale HSYNC, CSYNC und HBLANK, das DPYNEXT-Register, sowie die Reload-Anforderung.<br />
Bei interner Synchronisation sind neben den Initialisierungen durch Transition T1 nur die Aktionen<br />
von Transition T2 wichtig. Da es den Rahmen der Arbeit sprengen würde, jede VHDL-Zeile<br />
einzeln zu erklären, soll hier ein Beispiel die Struktur verdeutlichen. Das folgende VHDL-Listing<br />
ist vereinfacht in T2 enthalten und steuert den Zähler HCOUNT sowie die Signale HSYNC und<br />
HBLANK. Es kann als selbsterklärend gelten:<br />
if HCOUNT=HTOTAL then<br />
HCOUNT:=0; -- reset counter<br />
HSYNC out:=’0’; -- start HSYNC<br />
else<br />
HCOUNT:=HCOUNT+1; -- count up<br />
end if;<br />
if HCOUNT=HESYNC then<br />
HSYNC out:=’1’; -- end HSYNC<br />
end if;<br />
if HCOUNT=HSBLNK then<br />
HBLANK:=’0’; -- start HBLANK<br />
elsif HCOUNT=HEBLNK then<br />
HBLANK:=’1’; -- end HBLANK<br />
end if;<br />
Zu beachten ist, daß die Aktionen bei einem synchronen Schaltwerk jeweils mit der nächsten steigenden<br />
Flanke des Video-Taktes VClk ausgeführt werden. So behält z. B. HCOUNT den Wert<br />
VTOTAL für eine Taktperiode bei, bevor HCOUNT auf 0 gesetzt wird.<br />
Um einen beschleunigten Test des Chips zu ermöglichen, wurde das Register-Bit TEST eingeführt.<br />
Ist es aktiv ’1’, so zählen die obere und untere Hälfte der 16-Bit-Zähler HCOUNT und VCOUNT<br />
als unabhängige 8-Bit-Zähler.<br />
Das CSYNC out-Signal wird am Zeilenanfang (nach HCOUNT=HTOTAL) und beim Halbbildbetrieb<br />
in bestimmten Phasen auch in der Zeilenmitte (nach HCOUNT=HTOTAL/2) auf aktiv ’0’ gesetzt.<br />
Über der Vektor IPHASE, dessen Verlauf bereits in Abbildung 6, 12 und 15 dargestellt wurde,<br />
gibt der Vertikal-Steuerprozeß die Information über die aktuelle Video-Phase an den Horizontal-<br />
Steuerprozeß im Diagramm S HCNT weiter. Nach IPHASE richtet sich dabei auch die Länge<br />
der auf CSYNC out ausgegebenen Pulse. In der Serrationsphase z. B. endet der Puls, nachdem<br />
HCOUNT den Wert HESERR (bzw. den Wert ((HTOTAL–1)/2 + HESERR) für den Puls in der<br />
zweiten Zeilenhälfte) erreicht hat.<br />
Im Simulationsergebnis auf Seite 102 sind die im Vollbildbetrieb erzeugten Signale dargestellt. Man<br />
erkennt, daß HSYNC out streng periodisch ist, während auf CSYNC out in der Serrationsphase<br />
(IPHASE=0) längere Pulse erzeugt werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.4<br />
Seite 20<br />
Auf Abbildung 70 (S. 103) ist ein Simulationsergebnis für den Halbbildbetrieb zu sehen. In den<br />
Serrationsphasen (IPHASE=2 und IPHASE=3) werden an CSYNC out kurze Equalisationspulse<br />
generiert.<br />
Das DPYNEXT-Register (vgl. Tabelle 16, S. 67), das die Adresse des ersten Pixels der nächsten<br />
auszugebenden Zeile enthält, wird ebenfalls von S HCNT kontrolliert. Es ändert sich analog<br />
zu den Abbildungen 7, 9 und 14 mit dem Beginn der horizontalen Blank-Periode (nach<br />
HCOUNT=HSBLNK).<br />
Im Vollbildbetrieb und für gerade Halbbilder wird DPYNEXT auf den Wert von DPYSTRT initialisiert,<br />
wenn das Ende der vertikalen Blank-Periode bevorsteht. Für ungerade Halbbilder wird<br />
DPYNEXT zu diesem Zeitpunkt mit (DPYSTRT+DPYINC) geladen, da das Halbbild mit Zeile<br />
1 beginnt. Falls jedoch Zooming in Y-Richtung aktiv ist, wird auch bei ungeraden Halbbildern<br />
DPYNEXT=DPYSTRT gesetzt, da dann Zeile 0 in der ersten Zeile beider Halbbilder ausgegeben<br />
wird. Gleichzeitig mit DPYNEXT wird die Variable VLINE auf 0 bzw. auf 1 gesetzt, und<br />
RELAREA wird ’1’, was die Bildregion kennzeichnet, in der Reloads durchgeführt werden (noch<br />
immer T2 im Diagramm S HCNT, Seite 82).<br />
Beim normalen Vollbild wird DPYNEXT mit jedem Zeilenwechsel um den Wert DPYINC erhöht.<br />
Bei Halbbildern wird 2·DPYINC hinzugezählt, da jede zweite Zeile übersprungen wird. Ist Zooming<br />
in Y-Richtung aktiv, so sorgt der Zähler YZOOMCNT dafür, daß jede Zeile bis zu 128 mal<br />
wiederholt wird und sich DPYNEXT in dieser Zeit nicht ändert. YZOOMCNT wird auf den Wert<br />
YZOOMST (im Halbbildbetrieb YZOOMST/2) initialisiert, der im Diagramm S VCNT (S. 83 asynchron<br />
aus dem Zoom-Faktor YZ berechnet wird. Nur bei einem Zählerüberlauf von YZOOMCNT<br />
wird DPYNEXT um DPYINC erhöht.<br />
Am Beginn der vertikalen Blank-Periode wird VLINE auf 0xFFFF und RELAREA auf ’0’ gesetzt,<br />
da keine Reloads mehr nötig sind.<br />
Schließlich werden noch die Signale RELAT10 und RELAT6 erzeugt, die kennzeichnen, daß ein<br />
Reload am Ende einer Bildzeile bevorsteht. Gesetzt werden die Signale 10 bzw. 6 VClk-Zyklen vor<br />
Beginn des Reloads. Dies ist für die Arbitrierungslogik (s. Abschnitt 4.5.5) notwendig.<br />
Bei externer Synchronisation ist nicht die Bedingung HCOUNT=HTOTAL, sondern ein externer<br />
Sync-Puls Auslöser für einen Zeilenwechsel. Hierbei werden die Transitionen T3 und T4<br />
wichtig. Das asynchron erzeugte Signal HS Wait ist aktiv ’1’, wenn die horizontale Synchronisation<br />
durch ein externes Signal erfolgen soll. Das Signal HS Coming wird kurzzeitig aktiv ’1’, wenn ein<br />
gültiges externes Sync-Signal kommt, wobei dies je nach Modus ein Signal an CSYNC oder VSYNC<br />
sein kann.<br />
Ein gültiges Sync-Signal setzt sofort HCOUNT=SETHCNT und leitet damit die neue Zeile ein.<br />
Kommt am Zeilenende kein Sync-Signal, so bleibt HCOUNT wegen Transition T4 auf dem Wert<br />
HTOTAL, bis die externe Synchronisation erfolgt. HCOUNT wird auf den Wert des Registers<br />
SETHCNT und nicht auf 0 gesetzt, damit leichte Verschiebungen zwischen externen und internen<br />
Signalen ausgeglichen werden können.<br />
Ist CSYNC Eingang, so werden nur die fallenden Flanken von CSYNC in am Zeilenanfang akzeptiert.<br />
CSYNC-Flanken in der Zeilenmitte setzen den Horizontalzähler nicht zurück. Möglich wird<br />
dies durch das Signal HS Enable, das erst zu Beginn der horizontalen Blank-Periode aktiv ’1’ und<br />
mit erfolgtem Zeilenwechsel wieder ’0’ wird. Es maskiert das CSYNC in-Signal.<br />
3.4.2 Steuerung des vertikalen Timings<br />
Das Diagramm S VCNT (Seite 83) steuert das Vertikaltiming, also VHOUNT, VSYNC und<br />
VBLANK, sowie im Halbbildbetrieb den Wechsel zwischen geraden und ungeraden Halbbildern<br />
und den Ablauf der Videophasen (Serration, Equalisation, Bildphase).
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.4<br />
Seite 21<br />
Im Vollbildbetrieb ist der Zustand noninter aktiv, und das vertikale Timing entspricht im wesentlichen<br />
dem horizontalen. Auf eine Erklärung kann verzichtet werden.<br />
Im Halbbildbetrieb ist während der Anzeige eines geradzahligen Halbbildes der Zustand<br />
even field, sonst odd field aktiv. Im Vergleich mit dem Diagramm S HCNT des horizontalen<br />
Timings entsprechen hier die Transitionen T9 und T10 der Transition T2 dort; sie steuern<br />
die Erhöhung des Vertikalzählers und die damit zusammenhängenden Prozesse. So erfolgt hier die<br />
Steuerung des Signals für die Videophase IPHASE, von der nicht nur die Art der auf CSYNC out<br />
erzeugten Synchronpulse abhängt, sondern auch die Art und Weise, in der VCOUNT in der Zeilenmitte<br />
erhöht wird. Auch VBLANK wird hier erzeugt.<br />
Im Fall der internen Synchronisation übernehmen T5 und T6 die Funktion von T3 des horizontalen<br />
Timings; am Ende des Halbbildes (das auch in der Zeilenmitte auftreten kann) wird zum<br />
anderen Halbbild übergegangen, der Vertikalzähler zurückgesetzt und VSYNC out aktiviert.<br />
Bei externer Synchronisation darf der Vertikalzähler am Halbbildende erst zurückgesetzt werden,<br />
wenn ein gültiges externes Sync-Signal erkannt wird. T7 und T12 entsprechen hier T4; sie<br />
fangen die Erhöhung des Zählers ab. Das Rücksetzen des Zählers geschieht, wenn eines der Signale<br />
VS Coming oder CS Coming einen externen Sync-Puls anzeigt. Hierbei wird der Zustand<br />
next field (drop-through state) scheinbar aktiv; in Wirklichkeit erfolgt sofort wieder ein Wechsel<br />
in einen der Grundzustände. In der Regel wird beim Halbbildwechsel in den zuletzt inaktiven<br />
Zustand gewechselt; zum Beginn der externen Synchronisation muß aber das richtige Halbbild gefunden<br />
werden. Daher wird bei jedem Wechsel aus der Lage der externen Signale ermittelt, welches<br />
Halbbild das nächste ist.<br />
Falls VSYNC in Eingang ist, wird genau dann ein ungerades Halbbild begonnen (T11), wenn<br />
zum Zeitpunkt des VSYNC-Pulses HBLANK aktiv war (bei NTSC) bzw. inaktiv war (bei PAL).<br />
Anderenfalls wird ein gerades Halbbild begonnen (T13). Falls CSYNC in Eingang ist, ist die<br />
Entscheidung vom Signal Next odd abhängig, dessen Erzeugung im folgenden Abschnitt erläutert<br />
wird.<br />
Simulationsergebnisse sind auf Abbildung 69 (S. 102) für ein Vollbild mit sechs dargestellten<br />
Zeilen und auf Abbildung 70 (S. 103) für ein ungerades Halbbild mit vier dargestellten Zeilen zu<br />
sehen.<br />
Abbildung 71 (S. 104) zeigt die Synchronisation auf externe HSYNC- und VSYNC-Signale (Modus<br />
2) im Vollbildbetrieb. An den Horizontal- und Vertikalzählern ist zu erkennen, daß die Registerwerte<br />
HTOTAL und VTOTAL hier falsch programmiert wurden, daß die Synchronisation aber dennoch<br />
funktioniert. Die Zähler verbleiben einfach in ihren Endzuständen, bis das externe SYNC-Signal<br />
kommt.<br />
Im Halbbildbetrieb ist auf Abbildung 72 (S. 105) zu sehen, daß im externen Synchronisations-<br />
Modus 2 in das richtige Halbbild gewechselt wird. Der Puls an VSYNC in kommt hier am Zeilenanfang,<br />
gleichzeitig mit dem Puls an HSYNC in. Daher muß (bei NTSC) das ungerade Halbbild<br />
folgen.<br />
3.4.3 Steuerung der externen Synchronisation<br />
Das Diagramm CSYNC (Seite 84) ist nur im externen Synchronisationsmodus wichtig, um aus<br />
einem externen CSYNC-Signal die vertikale Sync-Information zu extrahieren.<br />
In diesem Modus werden Serrationspulse daran erkannt, daß ihre Länge um mindestens 2 VClk-<br />
Takte über der Länge der HSYNC-Pulse liegt, die im HESYNC-Register programmiert wurde.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 3.4<br />
Seite 22<br />
Wird, ausgehend vom Zustand wait sync, ein Puls auf CSYNC in erkannt, so wird in einen der<br />
Zustände CS nonint, CS midline oder CS newline gewechselt, je nachdem, ob Vollbildbetrieb aktiv<br />
ist oder ob im Halbbildbetrieb der Serrationspuls in der Zeilenmitte bzw. am Zeilenanfang auftrat.<br />
Falls der Puls in der Zeilenmitte begann (T4), wird im NTSC-Modus das Signal Next odd auf ’0’<br />
gesetzt, denn es soll ein gerades Halbbild folgen. Im PAL-Modus folgt in diesem Fall ein ungerades<br />
Halbbild, und Next odd wird auf ’1’ gesetzt. Falls der Puls am Zeilenende auftrat, wird Next odd<br />
bei NTSC auf ’1’ und bei PAL auf ’0’ gesetzt.<br />
Endet der CSync-Puls schnell, so wird in den Grundzustand zurückgewechselt. Erfüllt seine Dauer<br />
aber die oben genannte Bedingung, so wird in einen der Zustände start nonint, start even oder<br />
start odd gewechselt, wobei das Signal CS Coming an das Diagramm S VCNT meldet, daß jetzt<br />
ein Voll- bzw. Halbbildwechsel ausgeführt werden muß.<br />
Damit das vertikale Synchronsignal CS Coming nicht bei jedem, sondern nur beim ersten Serrationspuls<br />
jedes Voll- oder Halbbildes erzeugt wird, wird nach Deaktivierung des Signals auf das<br />
Ende der Serrationsphase gewartet (T15). Nur in der Serrationsphase treten an CSYNC in Pulse<br />
auf, die die Zeitbedingung erfüllen.<br />
Ein Simulationsergebnis für die Synchronisation auf ein externes CSYNC-Signal ist auf Abbildung<br />
73 (S. 106) dargestellt. Die Gewinnung der VSYNC-Information aus CSYNC in funktioniert,<br />
weist aber systembedingt eine geringe Verzögerung auf, die sich nicht auf die Bilddarstellung auswirkt.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
4 Die VRAM-Reload-Einheit<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
4.1 Aufgaben der VRAM-Reload-Einheit<br />
Abschnitt 4.2<br />
Seite 23<br />
Aufgabe der VRAM-Relaod-Einheit ist es, den Monitor synchron zu den erzeugten oder extern<br />
eingespeisten Videosignalen mit einem kontinuierlichen Bilddatenstrom aus den Video-RAMs<br />
zu versorgen.<br />
Wie in Abbildung 17 zu sehen ist, werden diese Video-Daten direkt von den VRAMs ausgegeben.<br />
VRAMs enthalten neben der Speichermatrix ein Schieberegister (SR), das parallel mit den Daten<br />
einer Speicherzeile geladen werden kann (Reload). Über den seriellen Ausgang des SR’s gelangen<br />
die Video-Daten an die Video-D/A-Wandler.<br />
Host ✛ ✲ TIM<br />
Video-Takt<br />
(VClk)<br />
✻<br />
✛ ✲ Daten<br />
relaod ✲<br />
control<br />
Lade-Takt (MSC)<br />
VRAM<br />
❄<br />
✻<br />
✲ Video-<br />
Daten<br />
✲ Video-<br />
Signale<br />
Abbildung 17: Die Video-Daten für den D/A-Wandler kommen direkt aus den VRAMs. TIM steuert<br />
das Nachladen (Reload) der Schieberegister.<br />
Die VRAM-Reload-Einheit sorgt über Steuersignale dafür, daß im richtigen Augenblick die benötigten<br />
Daten in die SR geladen werden. Außerdem muß TIM am MSC-Eingang der VRAMs den Takt<br />
vorgeben, in dem die SR ihre Daten seriell ausgeben. Stimmen die Breite eines Video-Datenwortes<br />
und die Farbtiefe eines Pixels überein, so entspricht der Lade-Takt gerade dem Pixel-Takt. Ist die<br />
Farbtiefe geringer, so werden mit jedem Lade-Takt parallel die Farbwerte mehrerer Pixel ausgegeben.<br />
Im diesem Fall muß der Lade-Takt durch Teilung aus dem Video-Takt erzeugt werden, und<br />
ein externer Multiplexer muß die parallelen Pixeldaten nacheinander an die D/A-Wandler geben.<br />
4.2 Reload–Mechanismen<br />
4.2.1 ” Newline Reloads“ und ” Midline Reloads“<br />
Ein Laden der SR mit neuen Daten ist zum einen rechtzeitig vor Beginn einer Videozeile<br />
nötig. Hierbei muß angegeben werden, welche Zeile aus der Speichermatrix ins SR geladen werden<br />
soll und ab welcher Position (TAP) im SR die serielle Ausgabe beginnen soll. Zeile und Position<br />
ergeben sich aus der Adresse des Pixels, mit dem die Zeile beginnt. Sicherheitshalber erfolgt dieser<br />
Reload bereits am Ende der vorigen Bildschirmzeile. Er wird im folgenden als ” Newline Reload“<br />
bezeichnet.<br />
Bei hochauflösenden Bildschirmen, bei denen die Bildzeilen mehr Daten enthalten können als die<br />
Schieberegister der VRAMs, wird jedoch auch während der Darstellung einer Videozeile ein<br />
Nachladen der SR nötig, was in Abbildung 18 exemplarisch dargestellt ist. Ein solcher Reload wird<br />
im folgenden als ” Midline Reload“ bezeichnet. Exakt in dem Augenblick, in dem die Daten aus
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.2<br />
Seite 24<br />
der letzten Position der SR ausgegeben werden, müssen die SR mit den Daten der nächsten Speicherzeile<br />
geladen werden. Der Reload-Zyklus muß dabei vor dem Datenwechsel beginnen, und der<br />
Zeitpunkt des Wechsels wird den VRAMs im Laufe des Zyklus über eine Steuerleitung signalisiert.<br />
Nur auf diese Weise ist ein kontinuierlicher Bilddatenstrom zu erreichen. Ohne die Fähigkeit zu<br />
Midline Reloads wäre die Länge einer Videozeile auf die Schieberegisterlänge beschränkt.<br />
Abbildung 18: Beispiel für eine Verteilung<br />
von VRAM-Relaods: Ein Laden des<br />
Schieberegisters wird z. B. durch 0080<br />
gekennzeichnet, hier ist 00 die RAM-Zeile<br />
und 80 der SR-Zeiger (TAP).<br />
Es ist Panning aktiv (DPYSTRT = 0),<br />
und die virtuelle Zeilenlänge DPYINC ist<br />
größer als die physikalische.<br />
DPYSTRT = 0x0080 Worte<br />
DPYINC = 0x0220 Worte<br />
phys. Zeilenläge = 0x0140 Worte<br />
SRL = 256 Worte<br />
SRE = ’0’<br />
Zeile 0: 0080 0100<br />
ˆ<br />
0500<br />
ˆ<br />
0300<br />
ˆ<br />
0100<br />
Zeile 1: 02A0 0300<br />
Zeile 2: 04C0 0500<br />
4.2.2 ” Split Reloads“ und ” Non-Split Reloads“<br />
Zeile 3: 06E0 0700 0800<br />
ˆ ˆ<br />
0700 0800<br />
Zeile 4: 0900 0A00<br />
0A00<br />
Zeile 5: 0B20 0C00<br />
Um das kritische Timing der Midline Reloads zu entschärfen, bieten moderne Video-RAMs die<br />
Möglichkeit, nur eine Hälfte des Schieberegisters zu laden. Aus der anderen Hälfte können<br />
dabei gleichzeitig Daten seriell ausgegeben werden. Dies zeigt, daß die VRAMs keine echten Schieberegister,<br />
sondern zählergesteuerte Multiplexer enthalten. Über das Register-Bit SRE kann programmiert<br />
werden, ob die angeschlossenen VRAMs solche ” Split Reloads“ unterstützen (SRE=’1’:<br />
Split-Reload-Modus).<br />
Auch im Split-Reload-Modus erfolgt für jede Videozeile ein Newline Reload am Ende der vorigen<br />
Videozeile. Beginnen die Daten dabei in der unteren Hälfte des SR’s (wie in Zeile 4 und 5 in<br />
Abbildung 19), so enthalten bereits beide SR-Hälften Daten, die in der folgenden Zeile benötigt<br />
werden. Beginnt die Ausgabe hingegen in der oberen SR-Hälfte, so kann bereits unmittelbar nach<br />
dem Newline Reload die untere SR-Hälfte mit Daten aus der nächsten VRAM-Zeile geladen werden<br />
(Zeile 0–3, Abb. 19).<br />
Abbildung 19: Beispiel für eine Verteilung<br />
von VRAM-Relaods im Split-Reload-<br />
Modus: Nur am Ende der jeweils vorigen<br />
Zeile wird das ganze SR geladen (Non-<br />
Split Reload). Beim Nachladen wird dann<br />
nur eine Hälfte geladen (Split Reload).<br />
Hier kennzeichnet z. B. 01L einen Split<br />
Reload. Dabei ist 01 die RAM-Zeile, und<br />
L (low) steht für ein Laden der unteren<br />
SR-Hälfte.<br />
DPYSTRT = 0x0080 Worte<br />
DPYINC = 0x0220 Worte<br />
phys. Zeilenläge = 0x0140 Worte<br />
SRL = 256 Worte<br />
SRE = ’1’<br />
ˆ<br />
0C00<br />
Zeile 0: 0080 0100 0180<br />
01H<br />
Zeile 1: 02A0 0300 0380<br />
03H<br />
Zeile 2: 04C0 0500 0580<br />
05H<br />
Zeile 3: 06E0 0700 0780 0800<br />
07H 08L<br />
Zeile 4: 0900 0980 0A00<br />
0CL<br />
0AL<br />
Zeile 5: 0B20 0B80 0C00<br />
ˆ<br />
0080<br />
02A0<br />
04C0<br />
06E0<br />
0900<br />
0B20<br />
0080 01L<br />
02A0 03L<br />
04C0 05L<br />
06E0 07L<br />
0900<br />
0B20
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.3<br />
Seite 25<br />
Während der Ausgabe jeder Videozeile erfolgen auch im Split-Reload-Modus Midline Reloads.<br />
Diese sind jedoch nicht mehr an einen exakten Zeitpunkt gebunden. So kann ein Nachladen der<br />
oberen SR-Hälfte (z. B. Zeile 2, Abb. 19) irgendwann während der Ausgabe der Daten aus der<br />
unteren SR-Hälfte erfolgen. Bei langen Zeilen müssen, wie in Zeile 3 schon ansatzweise zu erkennen<br />
ist, abwechselnd Split Midline Reloads der oberen und unteren SR-Hälfte durchgeführt werden.<br />
4.3 Taktsignale für Video-RAMs und Video-D/A-Wandler<br />
Neben den Reload-Zyklen, die immer bei Bedarf neue Daten in die SR laden und deren Timing<br />
im nächsten Abschnitt beschrieben wird, müssen innerhalb des Anzeigebereichs des Bildschirms<br />
permanent Taktsignale generiert werden, um die Daten aus den Video-RAMs zu takten und sie<br />
den Video-D/A-Wandlern zuzuführen.<br />
Im Gesamtsystem sind drei Taktsignale zur Steuerung des Datenstroms der Video-RAMs und der<br />
D/A-Wandler vorhanden:<br />
• VClk in ist der extern eingespeiste Video-Takt, aus dem alle Video-Timing-Signale abgeleitet<br />
werden.<br />
• LD out ist der Pixel-Takt, mit dem neue Daten an die Video-D/A-Wandler geleitet werden.<br />
Die Bit-Breite der Daten entspricht dabei der Farbtiefe PSIZE eines Pixels.<br />
Im Normalbetrieb ist der Pixel-Takt im Anzeigebereich (CBLANK=’1’) mit VClk in identisch;<br />
bei aktivem Zooming wird er aus VClk in mittels Teilung durch den Zoom-Faktor XZ<br />
gewonnen. Außerhalb des Anzeigebereichs (CBLANK=’0’) ist LD out nicht aktiv. Es gilt:<br />
fLD out = fVClk in ·<br />
• MSC out ist der Datenwort-Takt, mit dem die Schieberegister der Video-RAMs neue<br />
Daten bereitstellen. Die Bit-Breite entspricht dabei der Speicherbusbreite MBW. Der Datenwort-Takt<br />
ergibt sich aus dem Video-Takt nach der Gleichung<br />
fMSC out = fVClk in ·<br />
1<br />
XZ<br />
1<br />
XZ<br />
· PSIZE<br />
MBW .<br />
Ist die Speicherbusbreite MBW (z. B. 32 Bit) größer als die Farbtiefe PSIZE eines Pixels<br />
(z. B. 8 Bit), so werden mit einem MSC-Zyklus Daten zur Verfügung gestellt, die dann in mehreren<br />
LD-Zyklen an die Video-D/A-Wandler geleitet werden müssen. Im Beispiel muß der LD-Takt dem<br />
vierfachen MSC-Takt entsprechen, damit 4∗8 Bit an die D/A-Wandler geleitet werden können,<br />
bevor wieder 32 Datenbits aus den VRAMs kommen.<br />
Vor den D/A-Wandlern ist dabei eine programmierbare Einheit aus einem Zähler und einem Multiplexer<br />
notwendig, die für das gegebene Beispiel vereinfacht in Abbildung 20 wiedergegeben ist.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
VRAM<br />
❄<br />
MSC<br />
CBLANK<br />
LD<br />
✻<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
✄<br />
✂✁<br />
MBW<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
Reset<br />
Multiplexer<br />
✏<br />
✏<br />
Q 2<br />
✲<br />
✲<br />
✻ ✻<br />
Zähler<br />
∧<br />
<br />
✏ ✲ Register ✲<br />
Q 1<br />
∧<br />
PSIZE<br />
D/A-Wandler<br />
✏<br />
D<br />
✏✏✏ A<br />
✏<br />
D<br />
✏✏✏ A<br />
✏<br />
D<br />
✏✏✏ A<br />
Abschnitt 4.4<br />
Seite 26<br />
Abbildung 20: Eine externe Einheit aus Zähler und Multiplexer muß aktiv werden, wenn Farbtiefe und Speicherbusbreite<br />
nicht übereinstimmen (hier: MBW = 32 Bit, PSIZE = 8 Bit).<br />
Die Funktionsweise der Einheit dürfte allgemein verständlich sein. Aufgrund der Tatsache, daß<br />
die Daten aus den VRAMs erst mit einer geringen Verzögerung nach der steigenden Flanke von<br />
MSC out bereitstehen, muß die erste Flanke an MSC out bereits vor Beginn des Anzeigebereichs<br />
kommen. Die erste Flanke an LD out kommt mit Beginn des Anzeigebereichs, also wenn das<br />
CBLANK-Signal inaktiv ’1’ wird. Während des Anzeigebereichs eilt MSC out gegenüber LD out<br />
um eine VClk-Periode vor.<br />
Die Zählereinheit muß programmierbar sein; so müssen sich z. B. die Werte von PSIZE und MBW<br />
einstellen lassen. Am Institut für <strong>Mikroelektronik</strong> der <strong>TU</strong> <strong>Berlin</strong> ist bereits eine integrierte Schaltung<br />
( ” Muxer“) entwickelt worden, die sogar in der Lage ist, mittels einer PLL die Pixelfrequenz zu<br />
vervierfachen. Durch weitere Parallelschaltung von VRAMs in vier Ebenen können bis zu 128 Bit<br />
parallel in den Muxer geladen werden, die dann mit der vierfachen Frequenz (bis zu 120 MHz)<br />
als Worte mit bis zu 32 Bit Farbtiefe ausgegeben werden. Diese zusätzliche Option ist möglich,<br />
ohne daß TIM dafür ausgelegt sein müßte. TIM unterstützt zwar vier parallele VRAM-Ebenen mit<br />
Speicherbusbreiten von 32 Bit, bei der Datenausgabe berücksichtigt TIM aber nur eine der Ebenen.<br />
4.4 Timing von Reload-Zyklen<br />
Es werden drei Arten von Reload-Zyklen unterschieden:<br />
• Newline Reloads in der horizontalen Austastlücke werden bei Video-RAMs als “Read<br />
Transfer Cycle” bezeichnet, ihr Timing ist in Abbildung 38 (S. 74) wiedergegeben.<br />
• Midline Reloads, die in der Video-Zeile exakt zum Zeitpunkt des SR-Zählerüberlaufs erfolgen<br />
müssen, heißen “Real Time Read Transfer Cycle” (Abbildung 39, S. 75).<br />
• Split Midline Reloads, mit denen Timing-unkritisch eine SR-Hälfte geladen werden kann,<br />
sind als “Split Read Transfer Cycle” in Abbildung 40 (S. 76) dargestellt.<br />
Die Zeitbeschränkungen bei den Zugriffen unterscheiden sich je nach Hersteller. Für das VRAM<br />
Toshiba TC 524258 sind sie im Datenbuch [11] auf Seite 143 bis 145 zu finden.<br />
R<br />
G<br />
✲<br />
✲<br />
B ✲
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Alle drei Reload-Zyklen lassen sich grob in drei Phasen einteilen:<br />
Abschnitt 4.5<br />
Seite 27<br />
1. Über die RCA-Leitungen wird die Zeile angegeben, aus der die Daten ins SR geladen werden<br />
sollen. Die fallende Flanke von RAS (RAS) löst die Datenübernahme aus. Zu diesem<br />
Zeitpunkt bestimmen außerdem die Signale MSF (DSF), MOE (DT/OE) und MWE (WB/WE)<br />
die Art des RAM-Zugriffs.<br />
2. Dem RAM wird, ebenfalls über die RCA-Leitungen, die Spaltenposition (TAP) mitgeteilt,<br />
ab der die Ausgabe von Daten aus dem SR beginnen soll, wenn nach dem Reload-Zyklus<br />
die erste steigende Flanke von MSC (SC) kommt. Die Übernahme des TAPs erfolgt mit der<br />
fallenden Flanke von CAS (CAS).<br />
3. Der Zugriff wird beendet. Dabei wird durch die steigende Flanke von MOE (DT/OE) der<br />
Zeitpunkt des eigentlichen Reloads, des Ladens des Schieberegisters, bestimmt.<br />
Die RAS-Adresse (RAM-Zeile) und die CAS-Adresse (SR-Zeiger ” TAP“) werden beim Newline<br />
Reload gemäß Abbildung 21 aus der Wort-Adresse DPYNEXT des ersten Pixels der nächsten<br />
Zeile berechnet. Für den TAP werden stets die Bits 0 bis 11 verwendet. Die Lage der Bits von<br />
DPYNEXT, die für die Zeilenadresse verwendet werden, ergibt sich aus der Adreßlänge der VRAMs<br />
bzw. der Schieberegisterlänge SRL. Von den RAS- und CAS-Adressen bleiben je nach Adreßlänge<br />
der RAMs die ein bis vier obersten Adreßbits unberücksichtigt.<br />
DPYNEXT:<br />
RAS-Adresse:<br />
CAS-Adresse:<br />
26<br />
11<br />
18 17<br />
9<br />
8<br />
9 8<br />
Zeile TAP<br />
<br />
<br />
Abbildung 21: Ermittlung der RAS- und CAS-Adressen beim Newline-Reload,<br />
hier für SRL = 512, also für 9 Bit breite RAM-Adressen.<br />
4.5 Realisierung in Speedchart-VHDL<br />
4.5.1 Vorausberechnung der Anzahl der notwendigen Reloads<br />
Wesentlich für die Ablaufsteuerung und für eine effiziente Reload-Logik ist es, bereits vor Beginn<br />
einer Bildschirmzeile festzustellen, wieviele Midline-Reload-Zyklen in der Zeile notwendig werden.<br />
Anderenfalls könnte kurz vor dem Zeilenende ein Reload eingeleitet werden (weil die Daten im<br />
Schieberegister der Video-RAMs zur Neige gehen), der dann doch nicht nötig wird, da die Zeile<br />
vorher endet. In der Praxis könnte dieser Fall gehäuft auftreten, da das Ende von Bildschirmzeilen<br />
oft mit dem Ende von RAM-Zeilen zusammenfällt.<br />
Die Berechnung geht wie folgt vor sich:<br />
1) Es wird über CALC RLL := (HSBLNK – HEBLNK – 1) die (um 1 verminderte) Länge<br />
einer Bildschirmzeile berechnet, angegeben in VClk-Zyklen. CALC RLL berücksichtigt<br />
dabei nur den dargestellten Teil der Zeile (HBLANK=’1’), in dem Video-Daten ausgegeben<br />
werden sollen.<br />
❄<br />
Zeile<br />
11<br />
0<br />
9<br />
8<br />
❄<br />
TAP<br />
0<br />
0
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.5<br />
Seite 28<br />
2a) CALC RLL wird durch den Zoom-Faktor in X-Richtung, XZ, geteilt. Es ergibt sich die<br />
(um 1 verminderte) Länge einer Bildschirmzeile in dargestellten Pixeln, dies entspricht der<br />
(um 1 verminderten) Anzahl der auszugebenden LD-Pulse.<br />
2b) CALC RLL wird durch MBW/PSIZE geteilt. Dies entspricht der Anzahl von Pixeln pro<br />
Speicherwort. Es ergibt sich die (um 1 verminderte) Anzahl der Speicherworte pro Zeile,<br />
CALC ELL, also die (um 1 verminderte) Anzahl der auszugebenden MSC-Pulse, die jeweils<br />
ein neues Speicherwort aus den Schieberegistern der Video-RAMs zur Verfügung stellen.<br />
Tatsächlich werden die Schritte 2a und 2b gemeinsam ausgeführt. Dazu wird durch Addition<br />
und Subtraktion der dual-Logarithmen (MSC SFT := ld XZ + ld MBW – ld PSIZE)<br />
ermittelt, um wieviele Bits der Wert CALC RLL nach rechts geshiftet werden muß, damit<br />
sich CALC ELL ergibt.<br />
Aus den Tabellen 6, 8 und 9 geht die Kodierung der Register PSIZE, XZ und MBW hervor.<br />
PSIZE LD PSIZE Farbtiefe<br />
”00000001” 0 1<br />
”0000001x” 1 2<br />
”000001xx” 2 4<br />
”00001xxx” 3 8<br />
”0001xxxx” 4 16<br />
”001xxxxx” 5 32<br />
Tabelle 6: Über das PSIZE-Register kann die<br />
Farbtiefe eines Pixels in Bits programmiert<br />
werden.<br />
SRL SR-Länge VRAM-Adreßlänge<br />
”00” 256 8<br />
”01” 512 9<br />
”10” 1024 10<br />
”11” 2048 11<br />
Tabelle 7: Die Registerbits SRL legen die<br />
Länge der Schieberegister in Worten fest.<br />
XZ LD XZ X-Zoom-Faktor<br />
”000” 0 1<br />
”001” 1 2<br />
”010” 2 4<br />
”011” 3 8<br />
”100” 4 16<br />
”101” 5 32<br />
”110” 6 64<br />
”111” 7 128<br />
Tabelle 8: Der Zoom-Faktor in X-Richtung<br />
wird über die Registerbits XZ definiert.<br />
MWB LD MBW Speicherbusbreite<br />
”00” 3 8<br />
”01” 4 16<br />
”1x” 5 32<br />
Tabelle 9: Die Registerbits MBW bestimmen<br />
die Speicherbusbreite in Bits.<br />
3) Aus der Anzahl der Speicherworte pro Zeile CALC ELL, der Adresse DPYNEXT des ersten<br />
Speicherwortes der Zeile und der Länge SRL der Schieberegister in Speicherworten kann die<br />
Anzahl an notwendig werdenden Reloads berechnet werden. Dazu werden von CALC ELL<br />
und DPYNEXT so viele Bits (von unten) addiert, wie es der Länge der Schieberegister entspricht.<br />
Der untere Teil der Summe gibt dabei die Position des SR-Zeigers bei Anzeige des<br />
letzten Pixels der Zeile an. Die weitere Berechnung und die Bezeichnungen sind für eine<br />
Schieberegisterlänge von SRL=256 den folgenden Abbildungen zu entnehmen.<br />
3a) Falls keine Split-Reloads zugelassen sind (SRE=’0’, Abbildung 22), entspricht die Anzahl<br />
der notwendigen (Non-Split) Reloads dem höherwertigen Teil der effektiven Zeilenlänge,<br />
CALC ELL SFT. Falls am Ende der Zeile noch ein Überlauf des SR-Zeigers auftritt<br />
(SUM TE A=’1’), wird ein zusätzlicher Reload nötig.<br />
Der Newline Reload vor Beginn der Zeile wird nicht in CALC NRL mitgezählt.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.5<br />
Seite 29<br />
26 8 7 0<br />
DPYNEXT:<br />
CALC ELL:<br />
15 8<br />
CALC ELL SFT<br />
7<br />
TAP (Start)<br />
0<br />
✜<br />
SUM TAP ELL:<br />
11 9 8 7<br />
TAP (Ende)<br />
0<br />
✜<br />
❭ +<br />
❄<br />
SUM TE A<br />
✛ ✑<br />
Anzahl der notwendigen Non-Split Reloads:<br />
CALC NRL := CALC ELL SFT + SUM TE A<br />
Abbildung 22: Berechnung der Anzahl der notwendigen Reloads für SRE=’0’ am Beispiel SRL=256<br />
3b) Falls Split-Reloads zugelassen sind (SRE=’1’, Abbildung 23), ergibt sich auf identische Weise<br />
die Anzahl CALC NRL der notwendigen Reloads der unteren SR-Hälfte, wobei auch hier<br />
der Newline Reload des ganzen SRs vor Beginn der Zeile nicht mitgerechnet wird. Einer<br />
der berechneten Split-Reloads der unteren SR-Hälfte kann jedoch auch vor Beginn der Zeile<br />
erfolgen (vgl. Abb. 18, S. 24), dies entspricht nur einer zeitlichen Verlagerung.<br />
26 8 7 0<br />
DPYNEXT:<br />
CALC ELL:<br />
15 8<br />
CALC ELL SFT<br />
7<br />
TAP (Start)<br />
0<br />
✜<br />
SUM TAP ELL:<br />
11 9 8 7<br />
TAP (Ende)<br />
0<br />
✜<br />
❭ +<br />
❄ ❄<br />
✛ ✑<br />
SUM TE A SUM TE B<br />
Anzahl der notwendigen Split Reloads der unteren SR-Hälfte:<br />
CALC NRL := CALC ELL SFT + SUM TE A<br />
Anzahl der notwendigen Split Reloads der oberen SR-Hälfte:<br />
wenn SUM TE A=’0’ und SUM TE B=’0’ −→ CALC NRH := CALC ELL SFT − 1<br />
wenn SUM TE A=’1’ und SUM TE B=’1’ −→ CALC NRH := CALC ELL SFT + 1<br />
sonst −→ CALC NRH := CALC ELL SFT<br />
Abbildung 23: Berechnung der Anzahl der notwendigen Reloads für SRE=’1’ am Beispiel SRL=256<br />
Um die Anzahl CALC NRH der in der Zeile notwendigen Split-Reloads der oberen SR-<br />
Hälfte zu bestimmen, wird ebenfalls vom höherwertigen Teil der effektiven Zeilenlänge,<br />
CALC ELL SFT, ausgegangen. Es muß jedoch 1 addiert werden, falls SUM TE A=’1’ und<br />
SUM TE B=’1’ ist (Überlauf des SR-Zeigers bis in die obere SR-Hälfte), während 1 subtrahiert<br />
werden kann, wenn SUM TE A=’0’ und SUM TE B=’0’ ist (kein Überlauf des SR-<br />
Zeigers, und kein Erreichen der oberen SR-Hälfte am Zeilenende).<br />
Die Berechnung erfolgt parallel zu den ersten beiden Takten jedes Newline Reloads im Diagramm<br />
NEWL REL (Seite 95). Mit Transition T1 wird SUM TAP ELL berechnet, mit T2 werden<br />
CALC NRL und CALC NRH bestimmt.<br />
Einige zusätzlich nötige Rechenschritte werden im separaten Diagramm RL CALC (Seite 99)<br />
durchgeführt. Dort werden LD XZ, LD MBW und LD PSIZE aus den Registerwerten bestimmt,<br />
damit dann MSC SFT gebildet werden kann. Anschließend wird CALC RLL um entsprechend viele<br />
Stellen nach rechts geshiftet, so daß sich CALC ELL ergibt. Außerdem werden die Komponenten<br />
SUM TE A, SUM TE B und CALC ELL SFT ermittelt.<br />
Die Funktionsfähigkeit der Vorausberechnung kann anhand der Simulationsergebnisse auf den Abbildungen<br />
74 und 75 (S. 107 und 108) nachvollzogen werden. In Abbildung 74 endet die Zeile nach<br />
dem ersten Pixel einer neuen Speicher-Zeile (zu erkennen an den Signalen HBLANK, SR ROW<br />
(Zeile) und SR CNT (TAP)), daher muß der Midline Reload kurz vor Zeilenende noch erfolgen. In<br />
Abbildung 75 hingegen endet die Zeile gerade noch vor dem Wechsel zu einer neuen Speicher-Zeile,<br />
daher kann der Midline Reload hier entfallen.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
4.5.2 Steuerung des Zeitpunktes von Reloads<br />
4.5.2.1 Zeitpunkt von Newline Reloads<br />
Abschnitt 4.5<br />
Seite 30<br />
Newline Reloads erfolgen gemäß Abbildung 18 (S. 24) am Ende der jeweils vorausgehenden Bildschirmzeile.<br />
Bereits in Abschnitt 3.2.1 wurde beschrieben, daß im Diagramm S HCNT am Ende<br />
jeder Video-Zeile, auf die eine anzuzeigende Bildschirmzeile folgt, das Signal RELOAD gesetzt<br />
wird, um einen Newline Reload einzuleiten.<br />
Im Diagramm RL RAM (S. 93) ist nun in Transition T1 zu erkennen, daß dies, falls Reloads<br />
freigegeben sind (RLE=’1’), einen Newline Reload auslöst.<br />
Der eigentliche Reload-Zyklus wird eine Hierarchieebene tiefer, im Diagramm NEWL REL (S. 95)<br />
ausgeführt. Im Vergleich mit den Simulationsergebnissen (Abb. 75, S. 108) erkennt man deutlich<br />
den RAS-CAS-Zyklus, in dessen Verlauf Zeile (0x011) und TAP (0x1C9), ermittelt gemäß Abbildung<br />
21, übergeben werden. Im Anschluß an den eigentlichen Reload wird ein ’0’-Puls an MSC out<br />
erzeugt (über das mit MSC out verknüpfte Signal MSC reload), damit die ersten SR-Daten ausgegeben<br />
werden und am Zeilenanfang mit LD out gelatcht werden können.<br />
4.5.2.2 Zeitpunkt von Non-Split Midline Reloads<br />
Der Zeitpunkt von Midline Reloads ist exakt einzuhalten, wenn keine Split Reloads zugelassen sind.<br />
Gemäß Abbildung 18 (S. 24) müssen die Reload-Zyklen 5 VClk-Zyklen vor einem nötigen<br />
Wechsel der Schieberegister-Daten eingeleitet werden (dies entspricht der Dauer der Reload-<br />
Zyklen), damit der Zeitpunkt des Ladens am Ende des Zyklus genau dann stattfindet, wenn die<br />
letzte Position der Schieberegister erreicht ist.<br />
Um dies zu ermöglichen, ist es erforderlich, daß die momentane Position des SR-Zeigers (TAP)<br />
bekannt ist, um den Datenwechsel vorhersagen zu können. Der Zähler TAPCNT wird dazu beim<br />
ersten Schritt eines Newline Reloads (Diagramm NEWL REL, S. 95) auf den aus DPYNEXT<br />
berechneten TAP (die CAS-Adresse) gesetzt, evtl. angefüllt mit führenden Einsen, da der Zähler<br />
auf einen festen Endwert geprüft werden wird. Ein zweiter Zähler, ROWCNT, wird entsprechend<br />
auf die aktuelle RAM-Zeile (die RAS-Adresse) gesetzt.<br />
Während der Darstellung der Zeile wird der Zähler TAPCNT mit jeder erzeugten MSC-Flanke<br />
erhöht, mit der der Schieberegister-Zeiger im VRAM um eine Position weiterwandert. Auf diese<br />
Weise entspricht TAPCNT stets der aktuellen SR-Position. Erreicht der Zähler den Wert 7FA (SR-<br />
Ende minus 5), so wird ein Midline Reload Zyklus eingeleitet (T9 im Diagramm RL RAM, S. 93),<br />
falls laut der vorausberechneten Zahl an notwendigen Reloads (CALC NRL) noch mindestens ein<br />
Reload in der Zeile notwendig wird.<br />
Da beim Reload die Nummer der Zeile übergeben werden muß, aus der Daten in die SR geladen<br />
werden, muß mit jedem Midline Reload der Zähler ROWCNT erhöht und sein Wert übergeben<br />
werden. Dies geschieht mit dem ersten Takt jedes Midline Reloads (Diagramm MIDL REL, S. 94).<br />
Ist Zooming in X-Richtung aktiv oder die Speicherbusbreite größer als die Farbtiefe, also<br />
MSC SFT = 0, so beträgt der Abstand zwischen zwei Flanken von MSC ein Vielfaches der Taktperiode<br />
von VClk. In diesem Fall könnte ein Reload-Zyklus extrem lange dauern (bis zu 128 · 32 · 5<br />
VClk-Perioden), wenn er fünf MSC-Perioden vor dem nötigen Datenwechsel (bei TAPCNT=0x7FA)<br />
eingeleitet würde. Um dies zu vermeiden, wird bei MSC SFT = 0 nicht allein der TAP-Zähler<br />
TAPCNT, sondern ein weiterer Zähler MSCNT herangezogen, um für den Beginn des Reload-<br />
Zyklus den Zeitpunkt zu ermitteln, der 5 VClk-Perioden vor dem notwendigen Datenwechsel liegt.<br />
Der Zähler MSCNT wird mit jedem VClk-Zyklus erhöht und über die Modulo-Funktion auf eine<br />
Periodizität gebracht, die dem Verhältnis von fVClk in zu fMSC out entspricht. Ist z. B. MSC SFT=3,
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.5<br />
Seite 31<br />
so ist fVClk in / fMSC out = 2 3 = 8, und MSCNT muß alle 8 VClk-Zyklen seinen Endwert von 0xFFF<br />
erreichen. In diesem Augenblick wird ein Puls an MSC out generiert und TAPCNT erhöht, da der<br />
SR-Zeiger um 1 weiterwandert.<br />
Der Zeitpunkt für den Beginn eines Midline Reloads kann nun aus TAPCNT und MSCNT bestimmt<br />
werden (Transition T9, Diagramm RL RAM, S. 93). Für MSC SFT=0 wird weiterhin<br />
die Bedingung TAPCNT=0x7FA verwendet. Für MSC SFT=1 entsprechen 5 VClk-Perioden 2 1 /2<br />
Perioden von MSC out, also 2 MSC-Zyklen plus 1 VClk-Zyklus. Daher wird der Reload-Zyklus<br />
eingeleitet, wenn TAPCNT=0xFFD (Endwert minus 2) und MSCNT=0xFFE (Endwert minus 1)<br />
ist. Entsprechendes gilt für MSC SFT > 1.<br />
Der Midline Reload Zyklus wird im Diagramm MIDL REL (S. 94) durchgeführt. Sein Verlauf<br />
ist auf Abbildung 76 (S. 109) als Simulationsergebnis zu sehen, dort wird erst ein Newline Reload<br />
(Zeile 0x009, TAP 0x1FD) durchgeführt, dann der Midline Reload (Zeile 0x00A, TAP 0x000).<br />
Beginnt die Bildzeile, kurz bevor das SR-Ende erreicht ist (z. B. TAPCNT=FFE bei MSC SFT=0),<br />
so liegt der Punkt, zu dem der Reload eingeleitet werden müßte, bereits vor Beginn des Anzeigebereichs.<br />
Da TAPCNT aber bei 0xFFE beginnt, nimmt der Zähler nie den Wert 0xFFA an,<br />
und der Reload würde ausbleiben.<br />
Um auch solche Reloads nach den ersten Pixeln einer Zeile ( ” frühe Reloads“) ausführen zu können,<br />
wird in solchen Fällen der Horizontalzähler HCOUNT herangezogen, um den richtigen Zeitpunkt<br />
für den Beginn des Reload-Zyklus bestimmen zu können. Parallel zum zweiten Schritt jedes Newline<br />
Reloads (Diagramm NEWL REL, S. 95) wird dabei HC MLR auf den Wert gesetzt, den<br />
HCOUNT zum Zeitpunkt des SR-Überlaufs haben wird. Gleichzeitig wird überprüft, ob überhaupt<br />
ein früher Reload nötig wird. In diesem Fall wird HC MEN5 auf ’1’ gesetzt. Parallel zum dritten<br />
Schritt des Newline Reloads wird, falls ein früher Reload erfolgen muß, die Variable HC MLR5<br />
auf (HC MLR–5) gesetzt, also auf den Stand von HCOUNT, bei dem der frühe Midline Reload<br />
eingeleitet werden muß.<br />
Im Diagramm RL RAM (S. 93) kann nun “HCOUNT=HC MLR5 and HC MEN5=’1’ ” als weitere<br />
Bedingung für den Start eines Midline Reloads verwendet werden. Im Simulationsergebnis<br />
(Abb. 77, S. 110) erkennt man deutlich, daß der frühe Midline Reload (rechts) zu einem Zeitpunkt<br />
beginnt, zu dem der Zähler TAPCNT seinen Initialwert 0x7FE hat. Die normale Startbedingung<br />
(TAPCNT=0xFFA) wird also nicht erfüllt.<br />
4.5.2.3 Zeitpunkt von Split Midline Reloads<br />
Das Timing von Split Midline Reloads ist weniger kritisch als das von Non-Split Reloads. Gemäß<br />
Abbildung 19 (S. 24) können sie in einem recht weiten Zeitbereich innerhalb einer Bildzeile erfolgen.<br />
Beginnen die Zeilendaten in der oberen SR-Hälfte, so kann, wie schon erwähnt, der Split Midline<br />
Reload der unteren SR-Hälfte an das Ende der vorigen Zeile vorgezogen werden. Der Split Reload<br />
erfolgt dann direkt nach dem Newline Reload, was im Diagramm RL RAM (S. 93) zu sehen ist<br />
(T7).<br />
Die übrigen Split Midline Reloads können frühestens dann erfolgen, wenn die letzten ” alten“ Daten<br />
aus der neu zu ladenden SR-Hälfte ausgegeben wurden. Um dies zu signalisieren, wird das Signal<br />
SMR request im Diagramm RL MSC (S. 98) erzeugt. Es wird auf ’1’ gesetzt, wenn ein Split<br />
Midline Reload durchgeführt werden soll. Gleichzeitig zeigt das Signal SMR high an, ob die obere<br />
oder untere SR-Hälfte geladen werden soll. Zur Erzeugung der Signale wird getestet, ob die letzte<br />
Position der oberen bzw. unteren SR-Hälfte erreicht wurde.<br />
Das Signal SMR request wird später von der Arbitrierungslogik der Controller-Einheit ausgewertet.<br />
Wenn der gemeinsam von verschiedenen Einheiten genutzte VRAM-Bus frei ist, wird von dort die
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.5<br />
Seite 32<br />
Genehmigung erfolgen, den Refresh durchzuführen, indem das Signal SMR ack auf ’1’ gesetzt wird.<br />
Zur Zeit wird dieses Signal noch von der lokalen Arbitrierungslogik erzeugt (Diagramm RL ARBIT,<br />
S. 101, vgl. Abschnitt 4.5.5), um einen getrennten Test der Einheiten zu ermöglichen.<br />
Ein Beispiel für eine Abfolge von Split Midline Reloads ist als Simulationsergebnis auf Abbildung 78<br />
(S. 111) zu sehen. Man erkennt, daß nach dem Newline Reload (Zeile 0x00F, TAP 0x1F8) sofort ein<br />
vorgezogener Split Midline Reload der unteren SR-Hälfte (Zeile 0x010, TAP 0x000) durchgeführt<br />
wird. Anschließend ist Zeit für die Durchführung eines Refresh-Zyklus (vgl. Abschnitt 4.5.4).<br />
Nachdem im Anzeigebereich die letzten Daten der oberen SR-Hälfte ausgegeben wurden (SR ROW<br />
und SR CNT: Wechsel von 0x00F/0x1FF auf 0x010/0x000, SMR request=’1’), wird ein normaler<br />
Split Midline Reload der oberen SR-Hälfte (Zeile 0x010, TAP 0x000) durchgeführt. Hierbei wird<br />
zwar der TAP 0x000 übergeben, es wird aber nach Ende der unteren SR-Hälfte auf die TAP-<br />
Position 0x100 gewechselt. Das oberste Bit der CAS-Adresse wird beim Split Reload ignoriert;<br />
welche SR-Hälfte geladen werden muß, richtet sich danach, welche SR-Hälfte zum Zeitpunkt des<br />
Split Reloads aktiv war.<br />
4.5.3 Erzeugung der Taktsignale für die Video-D/A-Wandler<br />
Die Taktsignale MSC out und LD out, die bereits in Abschnitt 4.3 beschrieben wurden, werden im<br />
Diagramm RL MSC (S. 98) erzeugt.<br />
Bei der Generierung des MSC out-Signals wird ausgenutzt, daß die Periodizität des Zählers<br />
MSCNT genau der von MSC out entspricht. Daher wird MSC out einmal pro Periode von<br />
MSCNT auf ’0’ gesetzt. Damit MSC out gegenüber LD out um eine VClk-Periode voreilt, geschieht<br />
dies nicht beim Zählerendstand von MSCNT=0xFFF, sondern bereits bei MSCNT=0xFFE.<br />
Ist MSC SFT=0, so ist MSC out mit VClk in identisch. In diesem Fall wird MSC out während des<br />
Anzeigebereichs asynchron der Wert von VClk in zugewiesen.<br />
Das LD out-Signal wird ebenfalls aus dem Zähler MSCNT abgeleitet. Da es jedoch hochfrequenter<br />
als das MSC out-Signal sein kann, müssen pro Periode von MSCNT evtl. mehrere ’0’-Pulse an<br />
LD out generiert werden. Da fLD out = fVClk in / XZ ist, werden dazu so viele der unteren Bits von<br />
MSCNT auf ’1’ getestet, wie XZ angibt.<br />
Charakteristische Simulationsergebnisse sind auf Abbildung 75 (S. 108, MSC SFT=0, XZ=0), Abbildung<br />
76 (S. 109, MSC SFT=2, XZ=2) und Abbildung 79 (S. 112, MSC SFT=2, XZ=0) zu sehen.<br />
Zu beachten ist dabei auch der erste Puls an MSC out, der unmittelbar nach dem Newline Reload<br />
erfolgt.<br />
4.5.4 Refresh von DRAMs und VRAMs<br />
Bei dynamischen RAMs müssen in regelmäßigen Abständen Refresh-Zyklen durchgeführt werden,<br />
um dem stetigen Ladungsverlust der Kondensatoren in der Speichermatrix entgegenzuwirken. Moderne<br />
DRAMs und VRAMs erzeugen über interne Zähler Refresh-Zeilennummern, so daß automatisch<br />
eine Speicherzeile aufgefrischt und zur nächsten Zeile übergegangen wird, wenn am Bus des<br />
RAMs ein einfacher “CAS before RAS”-Refresh-Zyklus stattfindet, wie er in Abbildung 41 (S. 77)<br />
dargestellt ist.<br />
Der zeitliche Abstand zwischen zwei Refresh-Zyklen ergibt sich aus der Zeit, die die Ladung einer<br />
Speicherzelle ohne Refresh ” überlebt“ (8ms beim TC 524258 [11]), und der Anzahl der Zeilen,<br />
die innerhalb dieser Zeit aufgefrischt werden müssen. Der Abstand zweier Refreshs ist über die<br />
Registerbits RF (Tabelle 10) in Vielfachen des Video-Taktes VClk programmierbar.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Tabelle 10: Die Registerbits RF<br />
legen die Refresh-Rate in VClk-<br />
Zyklen fest.<br />
RF VClk-Zyklen<br />
”000” 32<br />
”001” 64<br />
”010” 128<br />
”011” 256<br />
RF VClk-Zyklen<br />
”100” 512<br />
”101” 1024<br />
”110” 2048<br />
”111” kein Refresh<br />
Abschnitt 4.5<br />
Seite 33<br />
Im Speedchart-Diagramm RL REFRESH (S. 100) wird der Zähler REFCNT so gesteuert, daß<br />
er in entsprechenden Abständen seinen Endwert 0x7FF erreicht. In diesem Fall muß jedoch nicht<br />
sofort ein Refresh ausgeführt werden. Zum einen sind Timing-kritische Vorgänge wie Midline<br />
Reloads vorrangig zu behandeln, zum anderen ist es unkritisch, wenn bei den Refresh-Zyklen eine<br />
Pause von einigen Zyklen entsteht: Solange diese nachgeholt werden, erhöht sich der Abstand zweier<br />
Refreshs der gleichen Speicherzeile kaum. Die Refresh-Zyklen können also eine geringe Priorität<br />
erhalten.<br />
Um sicherzustellen, daß ausgefallene Zyklen nachgearbeitet werden, wurden im Speedchart-Design<br />
zwei Zähler implementiert. Der Zähler REF RQNR wird erhöht, wenn der Refresh-Zähler<br />
REFCNT seinen Endwert erreicht; er zählt somit die Anzahl von angeforderten Refresh-Zyklen.<br />
Der Zähler REF PFNR wird im Diagramm RL RAM erhöht, wenn ein Refresh-Zyklus durchgeführt<br />
wurde. Aufgabe der Arbitrierungslogik ist es nun, dafür zu sorgen, daß bei freiem RAM-Bus<br />
so viele Refresh-Zyklen durchgeführt werden, daß dadurch der Zähler der durchgeführten Zyklen,<br />
REF PFNR, den Zähler der angeforderten Zyklen, REF RQNR, immer wieder erreicht.<br />
Der eigentliche Refresh-Zyklus wird vom Diagramm REFRESH (S. 97) gesteuert. Ein zusätzlich<br />
eingeführtes Registerbit FASTRAM bestimmt dabei, ob die Breite des RAS-Pulses vier oder (bei<br />
schnellen RAMs, FASTRAM=’1’) drei VClk-Zyklen beträgt. Im Simulationsergebnis (Abb. 79,<br />
S. 112) ist zu erkennen, daß zwei Refresh-Zyklen durchgeführt werden (bei 14µs und 14,55µs), von<br />
denen der erste eigentlich früher fällig gewesen wäre, aber wegen des höher priorisierten Newline<br />
Reloads (bei 13,75µs) aufgeschoben werden mußte.<br />
4.5.5 Die Arbitrierungslogik<br />
Aufgabe der Arbitrierungslogik ist es, den Bus der DRAMs und VRAMs so zu verwalten, daß ohne<br />
zeitliche Konflikte Reload- und Refresh-Zyklen sowie Schreib- und Lesebefehle der Prozessorund<br />
Controller-Einheit ausgeführt werden können. Das Speedchart-Diagramm RL ARBIT ist<br />
auf Seite 101 zu sehen.<br />
Von entscheidender Bedeutung ist bei der Arbitrierung, daß Reload-Zyklen zur richtigen Zeit stattfinden<br />
können. Daher werden diese (vgl. T1 und T9 im Diagramm RL RAM, S. 93) ohne ” Genehmigung“<br />
der Arbitrierungslogik durchgeführt. Stattdessen werden sie vorher angekündigt, so daß die<br />
Arbitrierungslogik der Controller-Einheit bei angekündigten Reloads nur noch solche RAM-Zugriffe<br />
freigibt, die mit Sicherheit rechtzeitig vor den Reloads beendet werden können.<br />
Die Anmeldung erfolgt in zwei Stufen. 10 bzw. 6 VClk-Zyklen vor Beginn des Reloads werden<br />
Newline Reloads über die Signale RELAT10 bzw. RELAT6 ankündigt, während vor Midline Reloads<br />
die Signale MLRAT10 bzw. MLRAT6 gesetzt werden.<br />
Der Zeitpunkt, zu dem die Signale gesetzt werden müssen, ergibt sich bei Newline Reloads aus<br />
dem Stand des Horizontalzählers HCOUNT und dem Start der horizontalen Austastlücke (siehe<br />
Seite 20). Bei Midline Reloads werden die Signale im Diagramm RL REFRESH (S. 100) erzeugt,<br />
wobei die Zähler TAPCNT und MSCNT herangezogen werden. Bei frühen Midline Reloads (analog<br />
zu Abschnitt 4.5.2.2) werden die Signale vom Horizontalzähler HCOUNT gesteuert.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 4.5<br />
Seite 34<br />
Unter Verwendung der Signale zur Anmeldung von Reloads können nun kurze Bus-Zugriffe genehmigt<br />
werden, falls keines der Signale RALAT6 und MLRAT6 gesetzt ist, während lange Zugriffe<br />
(mit mehr als 6 Zyklen) nur genehmigt werden, wenn auch RELAT10 und MLRAT10 inaktiv sind.<br />
Zugriffe, die länger als 10 Zyklen dauern, werden für die Durchführung der Reloads und Refreshs<br />
unterbrochen und danach fortgesetzt, wobei nach der Unterbrechung ein neuer RAS-Zyklus erforderlich<br />
werden kann.<br />
Die Freigabe von Refreshs und von Split Midline Reloads erfolgt bisher, ohne daß eine Bus-Freigabe<br />
durch die Controller-Einheit abgewartet wird (Diagramm RL ARBIT, S. 101, T4, T6 und T2),<br />
damit ein unabhängiger Test der Einheiten möglich wird.<br />
4.5.6 Modellierung eines Video-RAMs<br />
Um bei den Simulationsergebnissen zusätzlich zu den Verläufen der Steuersignale für die RAMs<br />
konkrete Aussagen über das Verhalten und das Innenleben der RAMs zu erhalten, wurde im<br />
Speedchart-Design ein an TIM angeschlossenes Video-RAM des Typs Toshiba TC 524258 [11]<br />
modelliert.<br />
Dies war nicht nur in der Entwicklungsphase hilfreich, sondern beweist auch anhand der gewonnenen<br />
Aussagen über die von den Schieberegistern ausgegebenen Daten, daß die Reload-Logik einwandfrei<br />
funktioniert. So sind beispielsweise in Abbildung 77 (S. 110) die Signale SR ROW und SR CNT<br />
zu erkennen, die die RAM-Zeile und die SR-Position der gerade ausgegebenen Daten wiedergeben.<br />
Es ist zu sehen, daß der frühe Midline Reload (rechts) tatsächlich im richtigen Augenblick erfolgt<br />
(Übergang von Zeile 0x005, TAP 0x1FF auf Zeile 0x006, TAP 0x000).<br />
Die Zustandssteuerung des VRAM-Modells ist im Speedchart-Diagramm VR RAM (S. 86) zu<br />
sehen. Ein CAS-vor-RAS-Zyklus wird als Refresh interpretiert, RAS-CAS-Zyklen entsprechen<br />
Schreib-, Lese- oder Reload-Zugriffen, die in den untergeordneten Diagrammen TRANSFER<br />
(S. 87) und READ WRITE (S. 88) behandelt werden. Die Art des Zugriffs richtet sich dabei<br />
nach den Zuständen der Signale MWE, MSF, MSE und MOE bei der fallenden Flanke von<br />
RAS.<br />
Im Diagramm READ WRITE werden Schreib- und Lesezugriffe einschließlich der speziellen<br />
Fähigkeiten des RAMs modelliert. Hierzu zählen der Fast-Page-Mode (Zugriff auf mehrere Worte<br />
einer Zeile in einem gemeinsamen RAS-Zyklus), Mask Write (maskiertes Schreiben von Bits), Block<br />
Write (Schreiben von bis zu vier Worten in einem Zugriff) und Flash Write (Schreiben einer gesamten<br />
Speicherzeile in einem Zugriff). Für die Block-Write- und Flash-Write-Funktionen kommen<br />
die Daten aus einem Color-Register, in das sie zuvor geschrieben werden müssen.<br />
Durch die Zustands-Namen und die ausgegebenen Klartext-Meldungen ist das Diagramm weitgehend<br />
selbsterklärend. Damit auch das synthetisierte Modell noch Informationen liefern kann,<br />
werden diese nicht nur als Texte, sondern auch als Signale ausgegeben. Die Variable A RAMw<br />
wird bei Schreibzugriffen, A RAMr bei Lesezugriffen auf einen Wert gesetzt, der codiert die Art<br />
des durchgeführten Zugriffs kennzeichnet. Gleichzeitig stehen an A ROW, A COL, A WM1 und<br />
A DATA Informationen über Zeile, Spalte, Schreib-Maske und Daten während des Zugriffs zur<br />
Verfügung.<br />
Im Diagramm TRANSFER werden entsprechend die Reload-Zugriffe behandelt. Hier wird über<br />
die Variable A SAM die Art des Zugriffs codiert ausgegeben; A ROW und A TAP zeigen Zeile und<br />
Spalte beim Zugriff an. Zusätzlich wurde der SR-Zähler implementiert, der mit jeder steigenden<br />
Flanke von MSC erhöht wird. Dies wird im Diagramm VR SAM (S. 89) gesteuert. Die Variablen<br />
SR ROW und SR CNT repräsentieren stets Zeile und Position der Daten, die momentan am<br />
Ausgang des Schieberegisters ausgegeben werden. Dies erlaubt eine optimale Kontrolle der Funktion<br />
der VRAM-Reload-Einheit.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
5 Die Controller-Einheit<br />
5.1 Aufgaben der Controller-Einheit<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.2<br />
Seite 35<br />
Aufgabe der Controller-Einheit als Schnittstelle zur Peripherie ist es, das Host- und das Speicherinterface<br />
so zu verwalten, daß Zugriffe des Hosts auf die TIM-internen Register und auf den extern<br />
angeschlossenen Speicher möglich sind. Dabei sollen beide Schnittstellen möglichst flexibel gehalten<br />
werden. Unterstützt werden sollen dabei<br />
• nicht-gemultiplexte Host-Schnittstellen (mit getrenntem Adreß- und Datenbus) und gemultiplexte<br />
Host-Schnittstellen (mit gemeinsamem Adreß- und Datenbus),<br />
• Host-Schnittstellen nach der NUBUS-Konvention (mit vertauschter Byte-Anordnung in der<br />
Datenphase),<br />
• unabhängig voneinander einstellbare Breiten von Host- und Speicherbus (8, 16 oder 32 Bit),<br />
• Speicher-Zugriffe im “Fast Page Mode”, wobei in einem RAS-Zyklus mehrere Zugriffe erfolgen<br />
können<br />
• sowie bis zu vier Speicher-Ebenen mit je vier Bänken von DRAMs oder VRAMs, deren<br />
Adreßlänge (Größe) getrennt einstellbar ist.<br />
Außerdem muß die Controller-Einheit die Adreßrechnung für die angeschlossenen RAMs<br />
durchführen, damit der Host in einem linearen Adreßraum auf sie zugreifen kann.<br />
Der Refresh der RAMs wird entgegen der Aufgabenstellung nicht von der Controller-Einheit, sondern<br />
von der VRAM-Reload-Einheit durchgeführt (vgl. Abschnitt 4.5.4).<br />
5.2 Host-Zugriffe<br />
5.2.1 Handshake bei Host-Zugriffen<br />
Damit der Host bei seinen Zugriffen auf den Grafikprozessor erkennen kann, wann ein Datentransfer<br />
abgeschlossen werden kann und wann TIM in der Lage ist, weitere Daten anzunehmen oder<br />
bereitzustellen, ist ein Handshake notwendig, der über das RDY-Signal erfolgt.<br />
Während des Resets ermittelt TIM den Pegel der RDY-Leitung, anhand dessen der aktiven Pegel<br />
des Signals festgelegt wird. Dabei wird davon ausgegangen, daß RDY beim Reset inaktiv ist.<br />
Die genaue Funktion des RDY-Signals wird in den folgenden Abschnitten für verschiedene Zugriffsarten<br />
beschrieben. Dabei wird davon ausgegangen, daß ein FIFO-Puffer (first in, first out) für zu<br />
schreibende Daten vorhanden ist.<br />
5.2.2 Host-Zugriffe bei gemultiplextem Bus<br />
Schreibzugriffe verlaufen bei gemultiplexten Bussen gemäß Abbildung 24.<br />
In der Adreßphase legt der Host zunächst ( ❤ 1 ) die Adresse auf den gemeinsamen Adreß- und<br />
Daten-Bus AD. Gleichzeitig wird festgelegt, ob der Speicher (RS=’1’) oder ein Register (RS=’0’)<br />
geschrieben wird, und die Datenbyte-Maske auf BS ausgegeben. Es wird HWE=’0’ gesetzt, was<br />
einen Schreibzugriff kennzeichnet. Diese Daten werden von TIM mit der fallenden Flanke von AS<br />
übernommen ( ❤ 2 ).
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.2<br />
Seite 36<br />
In der Datenphase gibt der Host die Daten auf dem AD-Bus aus ( ❤ 3 ). Mit der fallenden Flanke<br />
von DS werden sie von TIM übernommen ( ❤ 4 ).<br />
Anschließend führt TIM das Schreibkommando aus. Dabei können Registerzugriffe sofort erfolgen,<br />
während bei Speicherzugriffen nur dann eine sofortige Bearbeitung möglich ist, wenn noch Platz<br />
im FIFO-Puffer ist. Anderenfalls muß gewartet werden, bis einige Daten aus dem FIFO-Puffer in<br />
den Speicher übertragen wurden, bevor die aktuellen Daten im Puffer abgelegt werden können.<br />
Nach Abschluß der Bearbeitung ( ❤ 5 ) setzt TIM die RDY-Leitung auf ihren aktiven Pegel (im Beispiel<br />
auf ’1’). Der Host schließt daraufhin den Zugriff ab, indem er AS und DS deaktiviert ( ❤ 6 ). Daraufhin<br />
deaktiviert TIM die RDY-Leitung ( ❤ 7 ).<br />
AD: \/\/\/\/\/ Adr. \/\/\/\/\/ Schreib-Daten \/\/\/\/\/\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\/\ /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ / <br />
DS: \ /<br />
RDY: / ✁ ✂✲ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5 ❤ 6 ❤ 7<br />
TIM schreibt<br />
Daten<br />
AD: \/\/\/\/\/ Adr. 〉 〈Lese-Daten〉 〈\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\// \\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ / <br />
DS: \ /<br />
RDY: / ✁ ✂✲ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5 ❤ 6 ❤ 7 ❤ 8<br />
TIM liest<br />
Daten<br />
Abbildung 24: Schreibzugriff bei gemultiplextem Bus. Abbildung 25: Lesezugriff bei gemultiplextem Bus.<br />
Lesezugriffe verlaufen bei gemultiplexten Bussen gemäß Abbildung 25.<br />
Die Adreßphase entspricht der von Schreibzugriffen, es ist lediglich HWE=’1’.<br />
Die Datenphase beginnt damit, daß der Host den Adreß- und Datenbus AD in den hochohmigen<br />
Zustand versetzt ( ❤ 3 ) und dies durch die fallende Flanke von DS anzeigt ( ❤ 4 ).<br />
Anschließend führt TIM das Lesekommando aus. Bei Speicherzugriffen muß dabei gewartet werden,<br />
bis der FIFO-Puffer für zu schreibende Daten leer ist, bevor die notwendigen Lesezyklen auf dem<br />
Speicherbus durchgeführt werden. Stehen die Daten für den Host bereit ( ❤ 5 ), aktiviert TIM die<br />
RDY-Leitung ( ❤ 6 ), woraufhin der Host den Zugriff abschließt. Dabei liest er die Daten mit der steigenden<br />
Flanke von AS ( ❤ 7 ). Wenn TIM diese Flanke erkennt, deaktiviert TIM die RDY-Leitung ( ❤ 8 )<br />
und versetzt den Adreß- und Datenbus wieder in den hochohmigen Zustand.<br />
5.2.3 Host-Zugriffe bei nicht gemultiplextem Bus<br />
Host-Zugriffe bei nicht gemultiplextem Bus unterscheiden sich nur geringfügig von Zugriffen mit<br />
gemultiplextem Bus. Da ein getrennter Datenbus vorhanden ist, können die Daten bei Schreibzugriffen<br />
(Abbildung 26) gemeinsam mit der Adresse ausgegeben ( ❤ 1 ) und von TIM mit der fallenden<br />
Flanke von AS übernommen werden ( ❤ 2 ). Die getrennte Datenphase und das DS-Signal entfallen<br />
dabei.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
A: \/\/\/\/\/ Adr. \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
D: \/\/\/\/\/ Schreib-Daten \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\/\ /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ / <br />
RDY: / ✁ ✂✲ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5<br />
TIM schreibt<br />
Daten<br />
Abbildung 26: Schreibzugriff bei nicht gemultiplextem<br />
Bus.<br />
Abschnitt 5.2<br />
Seite 37<br />
A: \/\/\/\/\/ Adr. \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
D: \/\/\/\/〉 〈Lese-Daten〉 〈\/\/\/\/\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\// \\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ / <br />
RDY: / ✁ ✂✲ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5 ❤ 6<br />
TIM liest<br />
Daten<br />
Abbildung 27: Lesezugriff bei nicht gemultiplextem Bus.<br />
Auch bei Lesezugriffen (Abbildung 27) kann die DS-Leitung entfallen, wenn der Host bereits zu<br />
Beginn der Adreßphase ( ❤ 1 ) den Datenbus in den hochohmigen Zustand versetzt.<br />
5.2.4 Beschleunigter Handshake<br />
Falls der Host zwischen zwei Bus-Zugriffen darauf wartet, daß RDY wieder inaktiv wird, kann<br />
bei Schreibzugriffen ein beschleunigter Handshake durchgeführt werden. Dabei aktiviert TIM<br />
die RDY-Leitung bereits unmittelbar nach der Datenübernahme in die TIM-internen Register,<br />
bei gemultiplexten Bussen also nach der fallenden Flanke von DS (Abbildung 28, ❤ 4 / ❤ 5 ), bei nicht<br />
gemultiplexten Bussen nach der fallenden Flanke von AS (Abbildung 29, ❤ 2 / ❤ 3 ).<br />
Der Vorteil liegt darin, daß der Host den Zugriff daraufhin bereits abschließen und z. B. die nächsten<br />
Befehle aus dem Cache ausführen kann. Vor einem weiteren Bus-Zugriff allerdings muß er auf<br />
die Deaktivierung des RDY-Signals durch TIM warten. Dies geschieht, wenn TIM den internen<br />
Schreibzugriff abgeschlossen hat und bereit ist, neue Daten anzunehmen.<br />
Doch selbst wenn zwei Bus-Zugriffe unmittelbar aufeinander folgen, bedeutet die verfrühte Aktivierung<br />
des RDY-Signals einen Geschwindigkeitsvorteil, da der wechselseitige Handshake bei Abschluß<br />
des Zugriffs gespart wird (RDY und AS, vgl. Abb. 24 und 26).<br />
Beschleunigte Handshakes werden von TIM durchgeführt, wenn das Registerbit FASTRDY auf ’1’<br />
gesetzt ist.<br />
AD: \/\/\/\/\/ Adr. \/\/\/\/\/ Daten \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\/\ /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ /<br />
DS: \ /<br />
RDY: / ✁ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5 ❤ 6<br />
TIM schreibt<br />
Daten<br />
Abbildung 28: Schreibzugriff bei gemultiplextem Bus mit<br />
beschleunigtem Handshake.<br />
A: \/\/\/\/\/ Adr. \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
D: \/\/\/\/\/ Daten \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
RS: \/\/\/\/\/ RS \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
BS:<br />
\/\/\/\/\/ Maske \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
HWE: \/\/\/\/\ /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/<br />
AS: \ ✄✲ /<br />
RDY: / ✁ \<br />
❤1 ❤ 2 ❤ 3 ❤ 4 ❤ 5<br />
TIM schreibt<br />
Daten<br />
Abbildung 29: Schreibzugriff bei nicht gemultiplextem<br />
Bus mit beschleunigtem Handshake.<br />
Ein beschleunigter Handshake bei Lesezugriffen ist nicht möglich, da der Host einen Lesezugriff<br />
nicht abschließen kann, bevor die zu lesenden Daten von TIM bereitgestellt wurden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
5.3 Speicherorganisation<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.4<br />
Seite 38<br />
Da in modernen Computersystemen oft Bedarf nach einem sehr großen Video-Speicher besteht,<br />
Video-RAMs aber deutlich teurer als DRAMs sind, erlaubt TIM die gemischte Bestückung des<br />
externen Speichers mit VRAMs und DRAMs. Da aber nur die Anzeige von Daten aus Video-<br />
RAMs möglich ist, müssen die Daten aus den DRAMs bei Bedarf in die VRAMs kopiert werden.<br />
Die Speicherbusbreite kann 8, 16 oder 32 Bit betragen und wird durch Parallelschaltung von<br />
Speicherbausteinen erreicht. Zusätzlich können gemäß Abbildung 30 RAMs in einer Matrix von<br />
bis zu vier Bänken und vier Ebenen angeordnet werden, damit selbst mit kleinen RAMs ein großer<br />
Speicher realisiert werden kann. Auf der anderen Seite werden auch RAMs mit bis zu 14 Bit<br />
Adreßbreite unterstützt, so daß bereits mit acht Bausteinen der Organisation 256M∗4 ein Speicher<br />
von 1 GByte RAM bei 32 Bit Breite erreicht wird. Neben solchen “high-end”-Anwendungen sind<br />
natürlich auch “low-cost”-Bestückungen gemäß Abbildung 31 möglich.<br />
Bei der Parallelschaltung von Speicherbausteinen sind viele Kombinationen möglich. Bedingung ist<br />
jedoch, daß der Speicher eine einheitliche Datenwort-Breite hat, und daß die Speicher-Ebenen mit<br />
RAMs identischer Größe bestückt sind. Die Bänke hingegen dürfen mit RAMs unterschiedlicher<br />
Größe bestückt werden.<br />
Die Video-RAMs müssen immer in Bank 0 liegen. Falls mehrere Ebenen vorhanden sind, wird mit<br />
jedem Video-Datenwort-Takt MSC (vgl. Abschnitt 4.3) ein Video-Datenwort pro Ebene ausgegeben.<br />
Auf diese Weise können bis zu 128 Bit an Video-Daten pro Pixel geliefert werden. Der auf Seite<br />
26 beschriebene externe ” Muxer“ (ähnlich Abbildung 20) kann diese mit erhöhter Pixelfrequenz als<br />
4∗32 Bit ausgeben, so daß ein Pixeltakt von bis zu 120 MHz erreicht werden kann.<br />
Bei den Schieberegister-Reloads müssen dazu alle vier Ebenen gleichzeitig ein Freigabesignal über<br />
ACS3..0 erhalten, damit die Schieberegister der VRAMs in allen Ebenen parallel mit neuen Daten<br />
geladen werden. Das gleiche gilt für Refreshs.<br />
5.4 Adreßrechnung<br />
Aus Abbildung 30 wird deutlich, daß beim Zugriff auf ein Speicherwort nicht nur eine RAS-Adresse<br />
(Zeile) und eine CAS-Adresse (Spalte) übergeben werden muß, sondern daß auch die RAS-Bank<br />
und die Ebene ausgewählt werden müssen.<br />
Um trotz der möglichen Bestückung der RAS-Bänke mit RAMs unterschiedlicher Größe (also unterschiedlicher<br />
RCA-Adreßbreite) einen möglichst gut zusammenhängenden Adreßraum zu<br />
erreichen, muß sich getrennt für jede RAS-Bank die Lage der RAS-Adreßbits einstellen lassen.<br />
Dies ist nötig, da bei verschiedenen RCA-Adreßbreiten der RAMs die CAS-Adresse zwar stets<br />
beim gleichen Adreßbit (von unten) beginnt, aber verschieden lang sein kann. Somit ergeben sich<br />
für die RAS-Adresse andere Adreßbits, die stets direkt oberhalb der CAS-Adreßbits liegen sollen.<br />
Zur Bestimmung der RAS-Adreßbits wird zunächst gemäß Tabelle 11 (S. 40) anhand der Registerbits<br />
RSL geprüft, welche Adreßbits die aktive RAS-Bank auswählen. In der Regel werden diese<br />
Adreßbits direkt oberhalb der RAS-Adreßbits der größten Speicherbank liegen. Aus dem Wert<br />
dieser zwei Adreßbits wird nun nach Tabelle 12 bestimmt, welche RAS-Leitung zur Auswahl der<br />
Bank aktiviert werden muß und welche Registerbits (MOA bis MOD) die RAS-Adresse bestimmen.<br />
Aus dem Wert dieser (jeweils drei) Bits läßt sich nun nach Tabelle 13 ablesen, welche Adreßbits die<br />
RAS-Adresse bilden.<br />
Die CAS-Adresse ergibt sich unabhängig von der RAS-Bank aus der Speicherbusbreite. Bei 32 Bit<br />
Busbreite werden z. B. A15..A02 als CAS-Adresse verwendet, die unteren zwei Adreßbits steuern<br />
die CAS-Signale zur Byte-Auswahl.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
3 2 1 0<br />
RAS<br />
3<br />
2<br />
1<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
✲<br />
<br />
<br />
<br />
✲<br />
✲<br />
CS<br />
CS<br />
CS ✻ CS<br />
✻<br />
✻<br />
✻<br />
3 2 1 0<br />
ACS<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Ebene 0<br />
RAS<br />
RAS<br />
RAS<br />
RAS<br />
Bank 3<br />
A10..0 Steuerung<br />
✻ ✻<br />
Bank 2<br />
A11..0 Steuerung<br />
✻ ✻<br />
Bank 1<br />
A9..0 Steuerung<br />
✻ ✻<br />
Bank 0<br />
A8..0 Steuerung<br />
✻ ✻<br />
✻<br />
RCA13..0 Steuerung<br />
DRAM VRAM<br />
DRAM<br />
4M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
16M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
1M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
VRAM<br />
256k∗8<br />
SIO7..0<br />
D7..0 CAS<br />
✻ ✻<br />
TIM<br />
DRAM<br />
4M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
16M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
1M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
VRAM<br />
256k∗8<br />
SIO7..0<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
4M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
16M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
1M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
VRAM<br />
256k∗8<br />
SIO7..0<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
4M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
16M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
DRAM<br />
1M∗8<br />
D7..0 CAS<br />
✻ ✻<br />
VRAM<br />
256k∗8<br />
SIO7..0<br />
D7..0 CAS<br />
✻ ✻<br />
Abschnitt 5.4<br />
Seite 39<br />
✲<br />
✲<br />
✲<br />
✲<br />
⎫⎪ ⎬ 128<br />
Bit<br />
Video<br />
Daten<br />
⎪⎭<br />
❄ ❄ ❄ ❄<br />
D31..24 D23..16 D15..8 D7..0 3 2 1 0<br />
CAS<br />
Abbildung 30: In vier Ebenen können je vier Bänke von DRAMs und VRAMs unterschiedlicher Größe angeschlossen<br />
werden. Im Beispiel ergeben sich 336 MByte DRAM und 4 MByte VRAM. Eine externe Einheit mit Multiplexer<br />
kann die 128 Bit breiten Video-Daten als 4∗32 Bit mit erhöhter Geschwindigkeit ausgeben.<br />
Abbildung 31: In der einfachsten Konfiguration ist<br />
nur ein 8 Bit breites VRAM vorhanden. Selbstverständlich<br />
sind auch fast beliebige Mischformen<br />
möglich.<br />
RAS 0<br />
RAS<br />
Bank 0<br />
A8..0 Steuerung<br />
✻ ✻<br />
TIM<br />
✻<br />
RCA11..0 Steuerung<br />
DRAM VRAM<br />
VRAM<br />
256k∗8<br />
SIO7..0<br />
D7..0 CAS<br />
✻ ✻<br />
✲<br />
❄<br />
D7..0 CAS 0<br />
8 Bit<br />
Video<br />
Daten
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.5<br />
Seite 40<br />
Die verwendeten RAS- und CAS-Adressen sind stets 14 Bit breit. Ist die Adreßbreite der RAMs<br />
geringer, so werden die obersten Adreßbits von den RAMs ignoriert. Durch die beschriebene Auswahl<br />
der RAS-Adresse wird jedoch erreicht, daß innerhalb jeder RAS-Bank ein zusammenhängender<br />
Adreßraum vorliegt. Falls die RAS-Bänke mit RAMs gleicher Größe bestückt sind, ergibt sich sogar<br />
ein zusammenhängender Gesamtadreßraum.<br />
RSL<br />
Adreßbits zur Auswahl<br />
der RAS-Bank<br />
”000” A17..A16<br />
”001” A19..A18<br />
”010” A21..A20<br />
”011” A23..A22<br />
”100” A25..A24<br />
”101” A27..A26<br />
”110” A29..A28<br />
”111” A31..A30<br />
Tabelle 11: Die Registerbits RSL legen<br />
fest, welche Adreßbits der Auswahl<br />
der RAS-Bank dienen.<br />
RAS-Bank<br />
RAS<br />
3 2 1 0<br />
MOX<br />
”00” 1 1 1 0 MOA<br />
”01” 1 1 0 1 MOB<br />
”10” 1 0 1 1 MOC<br />
”11” 0 1 1 1 MOD<br />
Tabelle 12: Abhängig von der RAS-<br />
Bank werden die Registerbits MOA bis<br />
MOD ausgewählt, .....<br />
MOX RAS-Adresse<br />
”000” A21..A08<br />
”001” A22..A09<br />
”010” A23..A10<br />
”011” A24..A11<br />
”100” A25..A12<br />
”101” A26..A13<br />
”110” A27..A14<br />
”111” A28..A15<br />
Tabelle 13: ..... die bestimmen, welche<br />
Adreßbits die RAS-Adresse bilden.<br />
Die Auswahl der Ebene geschieht analog zur Auswahl der RAS-Bank. Hier bestimmen die<br />
Registerbits ASL (wie in Tabelle 11) die Adreßbits, die die Ebene auswählen. In Abhängigkeit<br />
von der Ebene werden analog zu Tabelle 12 die Signale ACS3..0 beim Zugriff gesetzt, um genau<br />
eine Ebene zu selektieren. Ein Analogon zu MOX existiert nicht, da sich die RAS-Adressen nur<br />
bei verschiedenen RAS-Bänken und nicht bei verschiedenen Ebenen unterscheiden dürfen.<br />
Im Beispiel aus Abbildung 30 ergibt sich die günstigste Programmierung der Register RSL und<br />
ASL aus der Adreßlänge der größten RAS-Bank, Bank 2. Bei 32 Bit Speicherbusbreite dienen A1<br />
und A0 der Byte-Auswahl. Da die Adreßlänge von Bank 2 12 Bit beträgt, bilden A13 bis A2 die<br />
CAS-Adresse und A25 bis A14 die RAS-Adresse für Bank 2. Daher sollte RSL so programmiert<br />
werden, daß A27 und A26 die RAS-Bank auswählen, während ASL festlegen sollte, daß A29 und<br />
A28 die Ebene bestimmen. A31 und A30 haben in diesem Fall keine Funktion.<br />
5.5 Externe versus interne Host-Daten-Register bei nicht gemultiplextem Host-<br />
Bus<br />
Die Spezifikation [1] des Grafikprozessors sieht vor, daß im Fall eines nicht gemultiplexten Host-<br />
Interfaces bidirektionale, 32 Bit breite Host-Daten-Register mit Tristate-Ausgängen extern angeschlossen<br />
werden (s. Abbildung 32), um den Datentransfer zwischen Host und Grafikprozessor über<br />
den Speicherbus zu ermöglichen und so Datenleitungen zu sparen.<br />
✲<br />
Adressen<br />
Adressen<br />
Host ✲ TIM ✲ RAM<br />
✛<br />
Steuerung<br />
Daten<br />
✲<br />
Register<br />
✛<br />
Steuerung<br />
Daten<br />
HBW MBW<br />
❄ Steuerung<br />
Abbildung 32: Ursprünglich waren in der Spezifikation [1] des Grafikprozessors externe Register für<br />
den Datenfluß zwischen Host und TIM vorgesehen.<br />
✛<br />
✲<br />
✲
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Steuerung<br />
✲<br />
Adressen<br />
Adressen<br />
Host ✲ TIM ✲ RAM<br />
Daten ✛ ✲<br />
✛<br />
Steuerung<br />
Daten<br />
HBW MBW<br />
Abbildung 33: Mit internen Registern werden mehr Pins benötigt, die Gesamtschaltung jedoch<br />
vereinfacht und der Datentransfer beschleunigt.<br />
✲<br />
✲<br />
Abschnitt 5.5<br />
Seite 41<br />
Für den Fall beispielsweise, daß der Host-Bus 32 Bit breit und der Datenbus 8 Bit breit ist, sollten<br />
bei Schreibzugriffen die Daten in die Host-Daten-Register getaktet und anschließend in vier Schritten<br />
in den Speicher übertragen werden. Bei Lesezugriffen sollten vier Bytes nacheinander aus dem<br />
Speicher in die Host-Daten-Register gebracht werden, um dann gemeinsam vom Host gelesen zu<br />
werden.<br />
Eine solche Vorgehensweise ist bei Host-Speicher-Zugriffen auch dann erforderlich, wenn TIMinterne<br />
Host-Daten-Register verwendet werden. Zugriffe des Hosts auf die Grafikregister hingegen<br />
können durch Verwendung TIM-interner Host-Daten-Register stark beschleunigt werden. Sie<br />
können dann mit vollen 32 Bit Breite ablaufen. In der folgenden Übersicht werden Vor- und Nachteile<br />
interner Host-Daten-Register gegenübergestellt:<br />
Vorteile interner Host-Daten-Register<br />
• Acht externe ICs plus Ansteuerlogik können entfallen. Das Gesamtsystem wird preiswerter<br />
und zuverlässiger.<br />
• Die Hostzugriffe werden beschleunigt, da das kritische Timing der externen Register entfällt.<br />
• Es treten keine Konflikte zwischen Zugriffen des Hosts auf Register des Grafikprozessors<br />
(Host–Tim) und Speicherzugriffen des Grafikprozessors (TIM–RAM) mehr auf, da diese über<br />
getrennte Busse laufen. Auch die Arbitrierungslogik wird dadurch stark vereinfacht.<br />
• Ein Pipelining (mit TIM-internem FIFO-Puffer) von Host-Speicher-Transfers ist möglich.<br />
• Datentransfers bei unterschiedlichen Breiten von Host- und Speicher-Interface werden vereinfacht.<br />
Host-Register-Transfers können mit der vollen Host-Busbreite erfolgen, auch wenn die<br />
Speicherbusbreite kleiner als die Host-Busbreite ist.<br />
Nachteile interner Host-Daten-Register<br />
• Es werden 32 zusätzliche Pins benötigt, zuzüglich Versorgungsspannungs-Pins, während nur<br />
8 Pins (die Steuerleitungen für die Register) entfallen.<br />
• Durch den zusätzlichen Bedarf an Pins wird ein größeres Gehäuse notwendig, das einen geringeren<br />
Pin-Abstand hat (0,65mm oder 0,5mm statt 0,8mm), so daß präzisere Lötanlagen<br />
erforderlich werden.<br />
Aufgrund der überwiegenden Vorteile wurde TIM mit internen Host-Daten-Registern und einem<br />
(zunächst nur vier Langworte umfassenden) FIFO-Puffer für die zu schreibenden Daten realisiert.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
5.6 Realisierung in Speedchart-VHDL<br />
5.6.1 Steuerung von Host-Zugriffen<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.6<br />
Seite 42<br />
Die Steuerung aller Host-Zugriffe auf den Grafikprozessor – des Lesens und Schreibens von Registern<br />
oder Speicherinhalten – erfolgt im Diagramm TIM ACCESS (Seite 120).<br />
Mit der fallenden Flanke von AS werden die Adresse, die Daten (bei nicht-gemultiplextem Bus),<br />
das Register-Select-Signal RS und die Byte-Select-Signale BS3 bis BS0 in interne Register (in die<br />
Variablen A lat, D lat, RS lat und BS lat) übernommen (T5). Bei Host-Busbreiten unter 32 Bit<br />
werden zur Bestimmung der Byte-Select-Signale auch die unteren Adreßleitungen herangezogen,<br />
da in diesem Fall eine Umsetzung des Zugriffs auf eine interne Datenbreite von 32 Bit<br />
geschieht, wobei nur die adressierten 1 oder 2 Bytes des Langworts über die BS-Signale freigegeben<br />
werden. Der weitere Zugriff wird auf diese Weise vereinfacht, da weitere Fallunterscheidungen nicht<br />
mehr nötig werden.<br />
Abhängig vom Zustand des HWE-Signals bei der fallenden Flanke von AS wird ein Lese- oder<br />
Schreibzugriff durchgeführt (T1, T13). Bei gemultiplexten Bussen (RS MUX=’1’) wird vorher auf<br />
die fallende Flanke von DS gewartet. In Abhängigkeit vom Signal RS lat wird dann ein Registerzugriff<br />
oder ein Speicherzugriff eingeleitet.<br />
Registerzugriffe erfolgen in den untergeordneten Diagrammen REG READ (S. 121) und<br />
REG WRITE (S. 122). Während die Register in REG READ als Langworte gelesen werden,<br />
aus denen anschließend evtl. die richtigen Bytes ausgewählt werden, dürfen in REG WRITE nur<br />
die Bytes geschrieben werden, die über die BS-Signale freigegeben wurden. Eine Besonderheit bilden<br />
einige Register, die nur gelesen werden können, sowie einige Konfigurations-Register, die durch<br />
eine Verriegelung vor unbefugtem Beschreiben geschützt werden können: Ein Schreiben ist nicht<br />
möglich, wenn das LOCK-Bit im CONFIG-Register gesetzt ist. Der Schutz kann jedoch durch<br />
Schreiben einer bestimmten Byte-Folge in das CONFIG-Register aufgehoben werden (T3).<br />
Bei Schreibzugriffen auf den Speicher werden Daten, Adresse und BS-Signale im FIFO-Puffer<br />
für zu schreibende Daten abgelegt (T10) und der Host-Zugriff sofort beendet. Das Beschreiben der<br />
RAMs übernimmt eine andere Einheit (s. Abschnitt 5.6.3). Falls der FIFO-Puffer voll ist, wird so<br />
lange gewartet, bis wieder Platz zum Ablegen des aktuellen Langworts ist.<br />
Bei Lesezugriffen auf den Speicher hingegen muß immer gewartet werden, bis der Schreibpuffer<br />
leer ist, da anderenfalls Unstimmigkeiten bei Schreib- und Lese-Zugriffen auf die gleichen<br />
Daten auftreten könnten. Zur Anforderung der zu lesenden Daten wird die Adresse in A READ<br />
abgelegt und MEM READ auf ’1’ gesetzt. Wenn die Daten bereitstehen, erfolgt die Rückmeldung<br />
(READ DONE=’1’) von der Speicherzugriffs-Einheit (Abschnitt 5.6.3). Daraufhin wird der<br />
Host-Zugriff abgeschlossen.<br />
Der Handshake über das RDY-Signal erfolgt in T14, T17 und T15 gemäß der Beschreibung in<br />
Abschnitt 5.2.<br />
In einem asynchronen Block (Seite 120 rechts) erfolgt für die oben beschriebenen Zugriffe die Umsetzung<br />
der Schreib- und Lese-Daten auf die Host-Busbreite. Bei 8 Bit Host-Busbreite<br />
z. B. werden die Daten vom Host auf allen vier Bytes des TIM-internen Daten-Langworts DATA IN<br />
wiedergegeben, von denen nur eines über BS zum Schreiben freigegeben wird. Die von TIM auszugebenden<br />
Daten werden anhand der untersten zwei Adreßbits aus dem internen Langwort DATA OUT<br />
ausgewählt und auf D7...D0 des Host-Busses ausgegeben. Bei 32 Bit Host-Busbreite erfolgt keine<br />
Umsetzung. Ist jedoch das NUBUS-Bit gesetzt, erfolgt eine Vertauschung der Bytes in der Datenphase.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
5.6.2 Modellierung eines Hosts zum Test des Handshakes<br />
Abschnitt 5.6<br />
Seite 43<br />
Da der Handshake ein Vorgang ist, bei dem nicht nur TIM vom Host, sondern auch der Host von<br />
TIM gesteuert (gebremst) wird, ist ein Test des Host-Interfaces mit normalen (fest definierten)<br />
Testmustern nicht möglich. Daher wurde der Systembus des Hosts ebenfalls unter Speedchart<br />
modelliert.<br />
Im Diagramm HOST ACC (S. 117) ist der Zustandsgraf des Systembusses (für einen gemultiplexten<br />
Bus) zu sehen; die Testmuster werden im Diagramm HOST CTRL (S. 118) generiert.<br />
Dort werden verschiedene Register- und Speicherzugriffe auf TIM durchgeführt, wobei Host- und<br />
Speicherbus auch mit verschiedenen Datenwortbreiten getestet werden.<br />
Die Kommunikation zwischen den Diagrammen erfolgt über die Variablen HOST A (Adresse),<br />
HOST D (Schreib-Daten), HOST BS (Byte-Maske), HOST RS (Register Select) und den Wert in<br />
HOST ACTION, der die Art des Zugriffs (lesen, schreiben) angibt. Ist ein Zugriff beendet, wird<br />
HOST ACTION im Diagramm HOST ACC auf Null gesetzt.<br />
5.6.3 Steuerung von Speicherzugriffen<br />
Die eigentlichen Speicherzugriffe – das Schreiben von Daten aus dem FIFO-Puffer in das RAM sowie<br />
das Lesen des RAMs – werden im Diagramm MEM CYCLES (S. 124) durchgeführt. Ausgelagert<br />
wurde jedoch die Verwaltung des FIFO-Puffers; sie erfolgt im Diagramm MEM ADDRESS<br />
(S. 128) oben. Dabei werden asynchron die Adresse RAM ADDR und die Datenbyte-Maske<br />
CAS MASK ermittelt. Das zu schreibende Daten-Langwort RAM D W wird aus der aktuellen<br />
Ausgabeposition FIFO OUT des FIFO-Puffers geholt. Bei einem Lesezugriff wird A READ als<br />
Adresse und CAS READ als Datenbyte-Maske verwendet.<br />
Ebenfalls asynchron, jedoch im Diagramm ADDR CALC (S. 125), erfolgt die Adreßrechnung<br />
gemäß Abschnitt 5.4. Ermittelt werden die Speicher-Zeile RAM ROW, die Speicher-Spalte<br />
RAM COL, sowie die Masken für die Ebenen- und Bank-Auswahl, ACS MASK und RAS MASK.<br />
Somit stehen alle Daten in der Form zur Verfügung, in der sie im Rahmen eines Speicherzugriffs<br />
an die RAMs übergeben werden können.<br />
Schreib- und Lese-Zugriffe erfolgen bei dynamischen RAMs grundsätzlich über einen RAS-CAS-<br />
Zyklus, in dessen Verlauf die Speicher-Zeile und die Spalte übergeben werden (vgl. Abb. 35, S. 71).<br />
Dieser Zyklus entspricht im Diagramm MEM CYCLES (S. 124) dem Weg von cold stb über<br />
RAS1, RAS2, CAS1, CAS2 und CAS3 zurück zu cold stb. Im Verlauf des Zyklus werden auch die<br />
Schreibdaten ausgegeben (Eintritt in CAS1) oder die Lesedaten von Speicherbus gelesen (Austritt<br />
aus CAS3).<br />
Falls die Host-Busbreite über der Speicherbusbreite liegt, kann es erforderlich werden, daß mehrere<br />
Speicherzugriffe durchgeführt werden. Die vier Bits der Datenbyte-Maske CAS MASK geben dabei<br />
grundsätzlich an, auf welche Bytes innerhalb eines Langworts zugegriffen werden soll. Bei kleinen<br />
Speicherbusbreiten wird stets mit dem Zugriff auf das unterste Speicherwort begonnen. Nach<br />
dem Zugriff werden die dabei übertragenen Datenbytes in der vier Bit umfassenden Variablen<br />
CAS DONE markiert und eventuell sofort der nächste Zugriff eingeleitet.<br />
Da häufig unmittelbar nacheinander auf verschiedene Daten aus einer Speicherzeile eines RAMs<br />
zugegriffen wird, bieten moderne dynamische RAMs zur Zeiteinsparung die Möglichkeit, Zugriffe<br />
im “Fast Page Mode” durchzuführen (s. Abb. 37, S. 73), wobei innerhalb eines RAS-Zyklus auf<br />
mehrere Datenworte zugegriffen werden kann. Zur Adressierung der Daten werden innerhalb des<br />
RAS-Zyklus lediglich die Spaltenadressen in getrennten CAS-Zyklen übergeben.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 5.6<br />
Seite 44<br />
Falls Zugriffe im Page Mode freigegeben sind (Registerbit PEN=’1’), hält TIM nach einem Speicherzugriff<br />
die RAS-Leitung aktiv (Zustand hot stb). Falls der nächste Zugriff auf dieselbe RAS-<br />
Adresse (LAST ROW) in derselben Bank (LAST RAS) und Ebene (LAST ACS) erfolgt, wird<br />
lediglich ein neuer CAS-Zyklus eingeleitet (T10). Sobald sich der Zugriff aber in RAS-Adresse,<br />
Bank oder Ebene vom vorigen Zugriff unterscheidet, wird RAS deaktiviert, zum Zustand cold stb<br />
zurückgekehrt und ein neuer RAS-Zyklus eingeleitet.<br />
Erfolgen Schreib- und Lesezugriffe auf die gleiche RAS-Adresse, so werden sie ebenfalls in einem<br />
gemeinsamen RAS-Zyklus durchgeführt. Diese gemischte Durchführung von Schreib- und<br />
Lesezugriffen im Page Mode wird für dynamische RAMs von Samsung [10] garantiert. Im<br />
Datenbuch von Toshiba [9] werden beliebig gemische Zugriffe nicht erwähnt, die prinzipielle Arbeitsweise<br />
der Ansteuerlogik für die Speichermatrix dürfte die Durchführbarkeit dieser Zugriffe aber<br />
garantieren.<br />
Der untere Teil des Diagramms MEM ADDRESS sowie die Diagramme BIT SHIFT, BIT MASK,<br />
GPU FIFO R, GPU FIFO W und PIXBLT PATH der Controller-Einheit sind nur für die Bearbeitung<br />
von Grafik-Befehlen von Bedeutung. Sie werden in Abschnitt 6.3.3.4 erläutert. Gleiches<br />
gilt im Diagramm MEM CYCLES für die Signale GPU READ, GPU WRITE, MEM GREAD und<br />
MEM GWRITE und für die Zustände RMW1 bis RMW3.<br />
Einige charakteristische Simulationsergebnisse sind auf den Abbildungen 115 bis 118 (S. 145<br />
bis 148) zu sehen. Durchgeführt werden hier jeweils ein Schreibzugriff auf ein volles Langwort,<br />
ein Schreibzugriff auf zwei Bytes des folgenden Langworts, ein Schreibzugriff auf ein Byte eines<br />
Langworts mit anderer RAS-Adresse sowie ein Lesezugriff auf zwei nicht benachbarte Bytes des<br />
zuletzt geschriebenen Langworts.<br />
Abbildung 115 zeigt diese Zugriffe bei 32 Bit Speicherbusbreite. Man erkennt die getrennten RAS-<br />
CAS-Zyklen und die Maskierung der Bytes über die vier CAS-Signale, deren Werte hier zu einer<br />
Hexadezimal-Ziffer zusammengefaßt wurden. Der Wert CAS=3 z. B. bedeutet, daß CAS3 und<br />
CAS2 aktiv ’0’ sind, während CAS1 und CAS0 inaktiv ’1’ sind.<br />
In Abbildung 116 ist der Fast Page Mode freigegeben. Daher können die ersten und die letzten<br />
beiden Zugriffe jeweils im gleichen RAS-Zyklus durchgeführt werden, da die RAS-Adressen übereinstimmen.<br />
Abbildung 117 zeigt die Zugriffe bei 8 Bit Speicherbusbreite. Man erkennt bis zu vier getrennte<br />
RAS-CAS-Zyklen pro Langwort-Zugriff, bei denen die CAS-Adresse automatisch erhöht wird. Auch<br />
die Wirkung des FIFO-Puffers für zu schreibende Daten ist deutlich zu sehen. Die Schreibzugriffe<br />
können Host-seitig (Signale oben) schnell abgeschlossen werden. Vor der Durchführung des Lesezugriffs<br />
wird jedoch auf den Abschluß der Speichertransfers gewartet.<br />
In Abbildung 118 schließlich erfolgen die Zugriffe wieder im Fast Page Mode, so daß z. B. die ersten<br />
4+2 Zugriffe in einem gemeinsamen RAS-Zyklus durchgeführt werden können.<br />
Im Diagramm MEM CYCLES fehlt zunächst die Kommunikation mit der Arbitrierungslogik<br />
der Video-Einheit. Wenn die Einheiten später zu einem Design zusammengefaßt werden, dürfen<br />
Speicherzugriffe hier nur erfolgen, wenn keine Reload- oder Refresh-Zyklen angekündigt oder angefordert<br />
wurden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
6 Die Prozessor-Einheit<br />
6.1 Aufgaben der Prozessor-Einheit<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.1<br />
Seite 45<br />
Die Prozessor-Einheit hat die Aufgabe, die folgenden Grafikbefehle selbständig zu bearbeiten:<br />
• Block Move: Kopieren eines linearen Datenblocks<br />
• Fill: Einfarbiges Füllen eines zweidimensionalen Bildschirmbereichs<br />
• Pattern Fill: Füllen eines zweidimensionalen Bildschirmbereichs mit einem mehrfarbigem<br />
Füllmuster<br />
• Pattern Fill Transparent: Füllen eines zweidimensionalen Bildschirmbereichs mit einem<br />
mehrfarbigem Füllmuster, das transparente Bereiche enthalten kann<br />
• Pixel Block Transfer (PixBlT): Kopieren eines zweidimensionalen Bildschirmbereichs mit<br />
beliebiger Verknüpfung von Quell- und Zieldaten<br />
• Pixel Block Transfer with Binary Expansion: Kopieren eines zweidimensionalen Bildschirmbereichs<br />
mit beliebiger Verknüpfung von Quell- und Zieldaten, wobei ein bzw. zwei<br />
Quelldaten-Bits eine von zwei bzw. vier Farben zum Beschreiben des Zielbereichs auswählen<br />
• Clip: Anpassung der Grenzen eines zweidimensionalen Bildschirmbereichs an ein vorgegebenes<br />
Zielfenster<br />
• VRAM Copy: Schnelles Kopieren ganzer VRAM-Zeilen unter Verwendung der VRAM-<br />
Schieberegister<br />
• VRAM Block Fill: Schnelles Füllen eines linearen Datenblocks im VRAM unter Verwendung<br />
des Block-Modus der VRAMs<br />
• VRAM Load Color Register: Laden der Color-Register der VRAMs mit einer Füllfarbe<br />
für den “VRAM Block Fill”-Befehl<br />
Bei allen Befehlen werden vom Host zunächst die Parameter des Befehls und dann der Befehls-<br />
Opcode in die TIM-internen Register geschrieben (vgl. Tabelle 18 auf Seite 68). Daraufhin führt<br />
TIM den Befehl aus und löscht nach Ende der Bearbeitung das Befehlsregister.<br />
Alle Befehle, die auf zweidimensionalen Bildschirmbereichen arbeiten, unterstützen zwei Adressierungsarten<br />
(hier am Beispiel des Zielbereichs):<br />
• Bei XY-Adressierung werden die Startkoordinaten DXADR und DYADR des Bildschirmbereichs<br />
angegeben. Abhängig von der Farbtiefe PSIZE eines Pixels und der Bit-Adresse<br />
DSTART bit des Bildschirmanfangs ergibt sich die physikalische Bit-Adresse des ersten Pixels<br />
zu<br />
DADRL L := DSTART bit + (DYADR · DINC + DXADR) · PSIZE .<br />
• Bei linearer Adressierung wird die lineare Pixel-Adresse DADR des Bildschirmbereichs<br />
angegeben. In diesem Fall ergibt ich die physikalische Bit-Adresse des ersten Pixels zu<br />
DADRL L := DSTART bit + DADR · PSIZE .<br />
Bei beiden Adressierungsarten wird die Größe des zweidimensionalen Bildschirmbereichs in X- und<br />
Y-Richtung in Pixeln angegeben (DX und DY, vgl. Tabelle 18 auf Seite 68). Bei den Befehlen<br />
hingegen, die auf linearen Datenblöcken arbeiten, wird die Bereichslänge in Pixeln angegeben.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.2<br />
Seite 46<br />
Bei Kopierbefehlen, die auf zweidimensionalen Bildschirmbereichen arbeiten, kann mit unterschiedlichen<br />
Startadressen und Zeilenlängen von Quell- und Zielbildschirm gearbeitet werden (vgl. Register<br />
SSTART, DSTART, SINC und DINC, Tabelle 18). Dadurch wird es möglich, verschiedene<br />
virtuelle Bildschirme unterschiedlicher Auflösung gleichzeitig im Speicher zu halten.<br />
Bei allen Kopierbefehlen erfolgen die Speicherzugriffe, falls freigegeben, im Fast Page Mode. Da<br />
dies beim abwechselnden Lesen und Schreiben von Daten aus unterschiedlichen Speicherbereichen<br />
nicht möglich wäre, werden die Daten erst in einer Page-Mode-Sequenz in einen internen Puffer<br />
gelesen, um dann in einer weiteren Page-Mode-Sequenz geschrieben zu werden. Dies bedeutet einen<br />
erheblichen Geschwindigkeitsvorteil.<br />
Aus Zeitgründen konnten im Rahmen dieser Arbeit nur zwei Befehle implementiert werden: der<br />
“Clip”-Befehl und der sehr umfangreiche “Pixel Block Transfer”-Befehl.<br />
6.2 Funktionsweise der implementierten Befehle<br />
6.2.1 Der “Clip”-Befehl<br />
Der Clip-Befehl dient dazu, die kartesischen Koordinaten des Zielbereichs eines Befehls, der auf<br />
zweidimensionalen Bildschirmbereichen arbeitet, auf ein vorgegebenes Zielfenster zu beschränken.<br />
Dies ist bei grafischen Benutzeroberflächen häufig erforderlich.<br />
Vor Ausführung des Befehls müssen in den Registern WSTARTX, WSTARTY, WENDX und<br />
WENDY die Koordinaten des Zielfensters angegeben werden.<br />
Bei der Ausführung des Befehls ermittelt TIM aus den Koordinaten des linken oberen Pixels (den<br />
Startkoordinaten) des Zielbereichs, die in DXADR und DYADR stehen, sowie den Ausdehnungen<br />
DX und DY des Zielbereichs die Start- und Endkoordinaten des Zielbereichs.<br />
Anschließend werden alle vier Koordinaten von Zielbereich und Zielfenster verglichen. Liegt eine<br />
Koordinate des Zielbereichs außerhalb des Zielfensters, so wird das Registerbit WINT gesetzt und,<br />
falls freigegeben, ein Interrupt ausgelöst. Außerdem wird die Koordinate des Zielbereichs durch<br />
den Wert der entsprechenden Zielfenster-Koordinate ersetzt. Dabei wird eine Rückrechnung in<br />
Startkoordinate und Ausdehnung erforderlich.<br />
Liegt kein Pixel der Zielbereichs innerhalb des Zielfensters, wird das Registerbit CINT gesetzt und<br />
evtl. ein Interrupt ausgelöst. In diesem Fall kann auf die Ausführung des sonst sofort nachfolgenden<br />
Grafikbefehls verzichtet werden.<br />
Nach der Anpassung der Koordinaten werden die kartesischen Startkoordinaten des Zielbereichs in<br />
eine lineare Pixeladresse umgerechnet, damit im Anschluß an den Clip-Befehl sofort ein Befehl mit<br />
linearer Adressierung ausgeführt werden kann.<br />
6.2.2 Der “Pixel Block Transfer”-Befehl<br />
Der “Pixel Block Transfer”-Befehl ist ein sehr mächtiger Kopierbefehl für zweidimensionale Bildschirmbereiche.<br />
Er erlaubt neben dem einfachen Kopieren auch vielfältige Möglichkeiten der<br />
Verknüpfung von Quell- und Zieldaten gemäß Tabelle 14. Zusätzlich kann angegeben werden,<br />
in welcher horizontalen und vertikalen Richtung die Daten bearbeitet werden sollen (Registerbits<br />
PBH und PBV, Tabelle 18, S. 68). Dies ist erforderlich, damit bei Überlappungen von Quellund<br />
Zielbereich in jedem Fall garantiert werden kann, daß keine Daten im Überlappungsbereich<br />
überschrieben werden, die noch nicht gelesen wurden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
S<br />
4 3 2 1 0<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Datenverknüpfung<br />
0 0 0 0 0 Ziel = Quelle<br />
0 0 0 0 1 Ziel = Ziel OR Quelle<br />
0 0 0 1 0 Ziel = Ziel XOR Quelle<br />
0 0 0 1 1 Ziel = Ziel + Quelle (8-Bit-weise für 8-Bit-Colormap oder 24-Bit-RGB)<br />
x x 1 x x zusätzliche Invertierung der Quelldaten<br />
x 1 x x x zusätzliche Invertierung der ursprünglichen Zieldaten<br />
1 x x x x zusätzliche Invertierung der Verknüpfung von Quell- und Zieldaten<br />
Tabelle 14: Die Registerbits S4 bis S0 bestimmen beim PixBlT-Befehl die Verknüpfung von Quellund<br />
Zieldaten.<br />
6.3 Realisierung in Speedchart-VHDL<br />
6.3.1 Befehlsauswahl<br />
Abschnitt 6.3<br />
Seite 47<br />
Die Auswahl der von der Prozessor-Einheit auszuführenden Grafik-Befehle erfolgt im Diagramm<br />
GP CMD (S. 134) anhand des Opcodes im COMMAND-Register. Nach der Befehlsausführung,<br />
beim Eintritt in den Zustand stdby, wird das COMMAND-Register wieder gelöscht.<br />
6.3.2 Realisierung des “Clip”-Befehls<br />
Die Realisierung des Clip-Befehls ist im Diagramm CLIP (S. 135) zu sehen. Dort wird zunächst<br />
geprüft (T5), ob möglicherweise alle Pixel des Bildschirmbereichs außerhalb des vorgegebenen Fensters<br />
liegen. Dies ist der Fall, sobald eine Begrenzung des Zielbereichs jenseits der gegenüberliegenden<br />
Grenze des Zielfensters liegt. In diesem Fall wird ein Interrupt (WINT, Fenster leer) ausgelöst<br />
und der Befehl abgeschlossen.<br />
Anderenfalls wird (im asynchronen Block unten rechts) für jede Bereichsgrenze (XS=linke,<br />
XE=rechte, YS=obere, YE=untere Begrenzung) festgestellt, ob die Grenze des Zielbereichs außerhalb<br />
des vorgegebenen Zielfensters liegt. Ist dies der Fall, wird das entsprechende Signal, z. B.<br />
XS viol, gesetzt.<br />
Die Anpassung der entsprechenden Grenzen an das Zielfenster erfolgt dann in T4. Entgegen dem<br />
in Abschnitt 6.2.1 beschriebenen Verfahren (Bestimmung der neuen Bereichsgrenzen und Rückrechnung<br />
in Startkoordinaten und Ausdehnungen) erfolgt hier in einem Schritt die Berechnung der<br />
angepaßten Startkoordinaten und Ausdehnungen.<br />
In T2 schließlich erfolgt die Umrechnung der XY-Adresse des Zielbereichs in eine lineare Pixel-<br />
Adresse. Hierbei wird auf den Wert DADR P aus dem Diagramm DADR SPLIT (S. 108) zurückgegriffen,<br />
dessen Funktion im folgenden Abschnitt erläutert wird.<br />
Die eigentliche Auslösung von Interrupts geschieht im Diagramm INTERRUPT (S. 132). Dabei<br />
wird in Abhängigkeit von der Art des Interrupts ein Bit im STA<strong>TU</strong>S-Register gesetzt. Außerdem<br />
wird, falls im IMASK-Register der entsprechende Interrupt freigegeben ist, die INT-Leitung<br />
aktiviert, bei der es sich um ein Open-Drain-Signal handelt.<br />
Die Simulation konnte beim Clip-Befehl unter Speedchart anhand von numerischen Ergebnissen<br />
erfolgen. Auf die Wiedergabe der (korrekten) Werte kann verzichtet werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
6.3.3 Realisierung des “Pixel Block Transfer”-Befehls<br />
6.3.3.1 Umwandlung der Bereichsgrenzen in lineare Pixel-Adressen<br />
Abschnitt 6.3<br />
Seite 48<br />
Als Befehlsparameter beim Pixel Block Transfer wird in den Registern SADR und DADR stets<br />
die Adresse des linken oberen Pixels des Quell- und Zielbereichs übergeben; beim PIXBLT L als<br />
lineare Pixeladresse, beim PIXBLT XY als XY-Adresse. Da die Befehlsbearbeitung aber je nach<br />
Programmierung der Registerbits PBH und PBV evtl. in einer anderen Ecke der Bereiche beginnen<br />
soll, kann zu Beginn der Befehlsausführung eine Umrechnung notwendig werden. Bei<br />
linearer Adressierung und bei XY-Adressierung müssen zunächst die linearen Pixeladressen, später<br />
die Langwort-Adressen der Bildschirmecken berechnet werden, in denen die Befehlsausführung<br />
beginnen soll.<br />
Benötigt werden für diese Berechnungen unter anderem die linearen Pixeladressen SADR P<br />
und DADR P des linken oberen Pixels von Quell- und Zielbereich. Diese sind beim<br />
PIXBLT L vorgegeben, während sie beim PIXBLT XY ermittelt werden müssen:<br />
Quellbereich: SADR P := SYADR · SINC + SXADR<br />
Zielbereich: DADR P := DYADR · DINC + DXADR<br />
Zu diesen Adressen muß, falls PBH=’1’ ist, der Wert (DX–1), die um 1 verminderte Bereichsbreite,<br />
addiert werden. Ist PBV=’1’, so ist die um eins verminderte Bereichshöhe zu addieren, die zuvor<br />
durch Multiplikation mit der Zeilenlänge in Pixel umgerechnet werden muß. Die zu addierenden<br />
Werte SY P bzw. DY P ergeben sich also wie folgt:<br />
Im Quellbereich: SY P := (DY − 1) · SINC<br />
Im Zielbereich: DY P := (DY − 1) · DINC<br />
Die Berechnung dieser vier Werte macht jeweils eine Multiplikation mit SINC bzw. DINC, den<br />
Zeilenlängen von Quell- und Zielbildschirm, erforderlich. Da eine volle Multiplikation mit 16·16 Bit<br />
jedoch sehr aufwendig wäre, wurde entsprechend der Spezifikation [1] eine Einschränkung vorgenommen:<br />
Die Zeilenlänge muß eine Zweierpotenz oder die Summe zweier Zweierpotenzen sein. Dies<br />
bedeutet, daß in einem Faktor der Multiplikation höchstens zwei Bits gesetzt sein dürfen, so daß<br />
sich die Multiplikation auf eine Addition von zwei (statt sechzehn) Summanden reduziert, die durch<br />
Bit-Schiebefunktionen aus dem zweiten Faktor hervorgehen.<br />
Die vier Werte SADR P, DADR P, SY P und DY P werden in den Diagrammen SADR SPLIT,<br />
DADR SPLIT, SY SPLIT und DY SPLIT (Seiten 137 bis 140) unter Verwendung eines so<br />
reduzierten Multiplikationsalgorithmus berechnet. Dabei werden z. B. zur Berechnung von<br />
SADR P zunächst die beiden Summanden SADR P HI und SADR P LO ermittelt, indem der<br />
zweite Faktor der Multiplikation, hier SYADR, um jeweils die Anzahl von Bits nach links geschoben<br />
wird, die den Positionen der beiden gesetzten Bits im ersten Faktor, hier SINC, entspricht. Die<br />
gesetzten Bits werden dabei gefunden, indem SINC von oben bzw. von unten nach dem ersten<br />
gesetzten Bit durchsucht wird. Ist nur ein Bit gesetzt, wird ein Summand auf Null gesetzt. Die<br />
ermittelten Summanden können nun zum Produkt (SYADR·SINC) addiert werden; wird zusätzlich<br />
SXADR addiert, ergibt sich der gesuchte Wert für SADR P.<br />
Im Diagramm AREA TO PIX (S. 141) erfolgt nun die Berechnung der Pixel-Adressen, an denen<br />
die Befehlsausführung beginnen soll. Sind z. B. PBV=’1’ und PBH=’1’ (Start in der rechten unteren<br />
Ecke), so ist die Startadresse des Zielbereichs DADR P + DY P + (DX – 1), wie in der<br />
untersten Zeile des Diagramms zu lesen ist. Abhängig davon, ob ein Befehl in linearer Adressierung<br />
(COMMAND(0)=’1’) oder XY-Adressierung (COMMAND(0)=’0’) vorliegt, werden oben
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 49<br />
im Diagramm die bereits vorliegenden linearen Adressen SADR und DADR oder die errechneten<br />
linearen Adressen SADR P und DADR P ausgewählt und in der Berechnung unten verwendet.<br />
Bestimmt werden zunächst unabhängig von PBH die Adressen der linken und rechten Ecken der<br />
Bereiche, da bei jeder horizontalen Bearbeitungsrichtung die Start- und die Endadresse benötigt<br />
werden.<br />
6.3.3.2 Zeilenweise Bearbeitung des Befehls<br />
Da bei der Ausführung des PixBlT-Befehls mit der ersten Zeile begonnen werden soll, für die die<br />
Pixel-Adressen der Ränder, SADR L, SADR R, DADR L und DADR R, soeben berechnet wurden,<br />
werden diese Werte beim Eintritt in das Diagramm PIXBLT (S. 136) in die Variablen CL SADR L,<br />
CL SADR R, CL DADR L und CL DADR R übertragen, die im folgenden die Adressen des linken<br />
und rechten Pixels der augenblicklich zu bearbeitenden Zeile angeben. Beim Übergang zur<br />
nächsten Zeile (T8) werden die Variablen entsprechend der vertikalen Bearbeitungsrichtung PBV<br />
jeweils um die Zeilenlänge erhöht bzw. erniedrigt. Ein Zähler LINCNT, der zu Beginn auf die<br />
Anzahl der Zeilen initialisiert wurde, steuert dabei die Wiederholungen.<br />
Für jede Zeile geschieht im Diagramm PIX TO BIT (S. 142) die Umrechnung der Pixel-Adressen<br />
in Langwort-Adressen in Abhängigkeit von der Farbtiefe PSIZE eines Pixels. Ermittelt werden<br />
hier die Langwort-Adressen des linken und des rechten Randes der aktuellen Zeile von Start- und<br />
Zielbereich, SADRLW L bis DADRLW R.<br />
Zusätzlich werden für die ersten bzw. letzten Bits, die zu Quell- und Zielzeile gehören, die Bit-<br />
Positionen innerhalb der Langworte, SBOS L bis DBOS R, bestimmt, damit beim Kopieren auf<br />
Langwort-Basis ∗ die ungültigen Bits ausmaskiert werden können.<br />
6.3.3.3 Datenfluß beim Kopieren der Zeilendaten<br />
Falls die Daten in Quell- und Zielbereich an Langwortgrenzen oder zumindest an der gleichen<br />
(Bit-)Position innerhalb von Langworten beginnen, ist ein Kopieren der Daten auf einfache Weise<br />
möglich. Im allgemeinsten Fall aber beginnen die Daten an unterschiedlichen Positionen, so daß<br />
ein bitweises Verschieben der Daten notwendig wird, wobei sich die Daten eines Langworts im<br />
Zielbereich aus den Daten zweier Langworte des Quellbereichs zusammensetzen. Ein Beispiel für<br />
den Datenfluß in diesem Fall ist in Abbildung 34 dargestellt.<br />
Das Kopieren der Zeilendaten beginnt stets damit, daß die Quelldaten gelesen und in einem Lese-<br />
Puffer so abgelegt werden, daß die Bit-Positionen bereits denen der Zieldaten entsprechen. Der<br />
Lese-Puffer umfaßt 9 (in Abbildung 34 nur 4) Langworte. Da ein Bit-genaues Einsetzen der gelesenen<br />
Daten in eine beliebige Position innerhalb des Lese-Puffers möglich sein muß, wäre hierfür<br />
ein Multiplexer erforderlich, der die Langworte an jeder von 9 · 32 = 288 Positionen ausgeben<br />
kann. Um den Aufwand zu verringern, erfolgt das Einsetzen der Daten in den Puffer stattdessen<br />
in zwei Schritten: Die gelesenen Daten (DATA OUT, Abb. 34) werden zunächst an die richtige<br />
Bit-Position innerhalb der Langworte S HI LW und S LO LW gebracht, die dann an den richtigen<br />
Langwort-Positionen in den Lese-Puffer eingefügt werden.<br />
Die Verschiebung an die korrekte Bit-Position erfolgt asynchron im Diagramm BIT SHIFT<br />
(S. 126). Dabei bestimmt die Differenz (DBOS L – SBOS L) der Bit-Offsets, die bei Ziel- und<br />
Quelldaten zwischen der linken Bereichsgrenze und der nächsten Langwortgrenze bestehen, die<br />
Position, auf der das Langwort DATA OUT in S HI LW und S LO LW eingetragen wird.<br />
∗ In der Prozessor-Einheit werden alle Kopierbefehle auf Langwort-Basis bearbeitet. Die eigentlichen Speicherzugriffe<br />
erfolgen jedoch in der Controller-Einheit (vgl. Abschnitt 6.3.3.4), wo eine Umsetzung auf die Speicherbusbreite<br />
erfolgt.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 50<br />
Da S HI LW und S LO LW mit Nullen aufgefüllt werden, ist ein Zusammenfügen der Langworte<br />
aus dem Quellbereich im Lese-Puffer einfach möglich, indem die Werte aus S LO LW in den Lese-<br />
Puffer geschrieben und die Werte aus S HI LW mit dem Inhalt des Lese-Puffers oder-verknüpft<br />
werden (Abb. 34, Mitte).<br />
Ist der Bit-Offset SBOS L im Quellbereich größer als der im Zielbereich, tritt wie in der Abbildung<br />
der Fall ein, daß die Daten aus S HI LW beim ersten Langwort keine gültigen Daten enthalten.<br />
Somit müssen die Daten aus S LO LW an die erste Position des Lese-Puffers geschrieben werden.<br />
Anderenfalls müssen die Daten aus beiden Langworten an den ersten beiden Positionen eingetragen<br />
werden.<br />
Das Kopieren der Daten aus dem Lese-Puffer in den Zielbereich kann nun auf Langwortbasis<br />
geschehen. Falls die Bereichsgrenzen mit Byte-Grenzen zusammenfallen, kann auf ein Lesen,<br />
Ausmaskieren und Zurückschreiben der Randdaten, wie es in Abbildung 34 oben dargestellt ist,<br />
verzichtet werden, da die Randdaten dann über die CAS-Signale byteweise ausmaskiert werden<br />
können.<br />
Zielbereich:<br />
Lese-Puffer:<br />
Quellbereich:<br />
DBOS ✛✲<br />
L ✛DBOS ✲R<br />
0 ... 0 1 ............................... 1 1 ................ 1 0 ................... DBMASK L DBMASK R<br />
0<br />
✻<br />
❄<br />
DATA OUT DATA OUT<br />
✻ ✻ ✻ ✻<br />
<br />
✻ ✻ ✻<br />
✻<br />
(or) (or) (or)<br />
✻<br />
( DBOS L – SBOS L )<br />
✲<br />
✛ SBOS L<br />
✻<br />
✻ ✻<br />
Langwort-Multiplexer, 2 Langworte auf 2 aus 9 (hier 2 aus 4) Positionen<br />
✲<br />
<br />
✻<br />
<br />
<br />
✻<br />
<br />
0 ....................... 0 0 ........... 0 S HI LW / S LO LW<br />
✻<br />
BIT SHIFT, Bit-Multiplexer,<br />
32 Bit auf 32 aus 64 Positionen<br />
✻<br />
DATA OUT<br />
✻RAM-Lese-Daten<br />
Abbildung 34: Beispiel für den Datenfluß beim Kopieren einer Zeile mit dem PixBlT-Befehl, wobei Quell- und<br />
Zieldaten an unterschiedlichen Positionen relativ zum Langwort-Anfang beginnen<br />
✻<br />
❄
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 51<br />
Die Speicherzugriffe beim Kopieren der Daten sowie die Verknüpfung von Quell- und Zieldaten<br />
werden von der Controller-Einheit übernommen. Auf diese Weise können die dort vorhandenen<br />
Einheiten für Adreßrechnung und Speicherzugriffe mit verwendet werden. Die Prozessor-<br />
Einheit muß der Controller-Einheit lediglich mitteilen, an welchen Adressen die Quell- und Zieldaten<br />
beginnen. Dies geschieht in T3 im Diagramm PIXBLT (S. 136) über die Variablen SADRLW C<br />
und DADRLW C, die je nach horizontaler Bearbeitungsrichtung PBH auf die Langwort-Adressen<br />
der linken oder rechten Zeilengrenzen in Quell- und Zielbereich gesetzt werden.<br />
Anschließend werden so viele Daten aus dem Quellbereich von der Controller-Einheit angefordert,<br />
daß 8 Langworte des Lese-Puffers nach dem Lesen vollständig mit gültigen Daten gefüllt sein<br />
werden. Falls der Bit-Offset SBOS L größer als DBOS L ist, müssen dazu nicht 8, sondern 9<br />
Langworte angefordert werden.<br />
Die Anforderung erfolgt in T3 im Diagramm PIXBLT, indem die Variable GPU RNUM auf die Anzahl<br />
der zu lesenden Langworte und GPU READ auf ’1’ gesetzt wird. Die Daten werden daraufhin<br />
von der Controller-Einheit (s. nächster Abschnitt) mit automatischer Erhöhung der Langwort-<br />
Adresse SADRLW C aus dem RAM gelesen und an den richtigen Positionen im Lese-Puffer abgelegt.<br />
Auch der Schreib-Zeiger GPU FIFO IN für den Lese-Puffer, der in T3 initialisiert wurde,<br />
wird von der Controller-Einheit automatisch erhöht.<br />
Falls beim Lesen der Quelldaten das Ende der aktuellen Zeile (Langwort-Adresse SADRLW C =<br />
SADRLW R) erreicht wird, bricht die Controller-Einheit den Lesevorgang ab und löscht die Variable<br />
GPU READ. Letzteres geschieht auch, wenn der Vorgang normal abgeschlossen wurde.<br />
Das Schreiben der Daten in den Zielspeicher wird daraufhin eingeleitet, indem in T6 im Diagramm<br />
PIXBLT das Signal GPU WRITE auf ’1’ und GPU WNUM auf 8 gesetzt wird. GPU WNUM<br />
gibt dabei an, daß die Controller-Einheit 8 Langworte in den Zielbereich schreiben soll, wenn<br />
nicht vorher das Zeilenende erreicht wird. Dabei erfolgt in der Controller-Einheit automatisch<br />
die korrekte Verknüpfung von Quell- und Zieldaten gemäß Tabelle 14. Falls, wie im Beispiel aus<br />
Abbildung 34, die Verknüpfung ” Quelle = Ziel“ ausgewählt wurde, werden dabei nur die Randdaten<br />
des Zielbereichs evtl. vor dem Schreiben gelesen. Anderenfalls werden alle Daten des Zielbereichs<br />
zunächst gelesen, mit den Quelldaten aus dem Lese-Puffer verknüpft und dann zurückgeschrieben.<br />
Das Lesen von Quelldaten und das Schreiben wiederholen sich nun so lange, bis beim Schreiben das<br />
Zeilenende erreicht wird. Dabei wird (Diagramm PIXBLT, S. 136) zwischen den Zuständen read<br />
und write gewechselt. Als Kennzeichen für ein Erreichen des Zeilenendes wird in der Controller-<br />
Einheit die Variable GPU WNUM auf den Wert 15 gesetzt. Falls keine weiteren Zeilen folgen (T8),<br />
wird die Befehlsausführung damit beendet.<br />
Der Fall, in dem die Daten von rechts nach links bearbeitet werden (PBH=’1’), ergibt sich analog<br />
(T3).<br />
6.3.3.4 Erweiterte Speicherzugriffs-Möglichkeiten der Controller-Einheit<br />
Die Controller-Einheit muß somit zwei neue, komplexe Arten des Speicherzugriffs beherrschen:<br />
• Wenn GPU READ=’1’ ist, müssen Quelldaten ab der Langwort-Adresse SADRLW C gelesen<br />
und im Lese-Puffer, um (DBOS L – SBOS L) Bits verschoben, abgelegt werden, damit die<br />
Bit-Positionen der Daten denen im Zielbereich entsprechen. Dabei müssen die Quelladresse<br />
SADRLW C und der Pufferzeiger GPU FIFO IN automatisch erhöht werden. Die Anzahl<br />
der zu lesenden Langworte richtet sich nach GPU RNUM, wenn nicht vorher das Zeilenende<br />
erreicht wird. Am Ende der Bearbeitung muß GPU READ gelöscht werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 52<br />
• Ist GPU WRITE=’1’, müssen die Daten aus dem Puffer mit korrekter Verknüpfung<br />
von Quell- und Zieldaten in den Zielbereich geschrieben werden, wobei die Zieladresse<br />
DADRLW C und der Pufferzeiger GPU FIFO OUT automatisch erhöht werden.<br />
Falls die aktuelle Zieladresse mit der Adresse des linken oder rechten Randes der Zielzeile übereinstimmt,<br />
müssen evtl. Randdaten, bei Übereinstimmung von linker und rechter Langwort-<br />
Adresse sogar an beiden Rändern des gleichen Langworts, vor dem Schreiben gelesen, ausmaskiert<br />
und in die zu schreibenden Daten bitweise eingeblendet werden, wenn nicht ein<br />
Ausmaskieren auf Byte-Basis über die CAS-Signale möglich ist.<br />
Die Anzahl der zu schreibenden Langworte richtet sich nach GPU WNUM, wenn nicht vorher<br />
das Zeilenende erreicht wird. Am Ende der Bearbeitung muß GPU WRITE gelöscht werden.<br />
Wurde das Zeilenende erreicht, muß GPU WNUM als Kennzeichen hierfür auf 15 gesetzt<br />
werden.<br />
Für die Lesezugriffe wird im Diagramm MEM ADDRESS (S. 128, Mitte) die Adresse<br />
RAM ADR des Zugriffs aus der aktuellen Langwort-Adresse SADRLW C ermittelt. Außerdem wird<br />
die CAS-Maske bestimmt, damit bei einer Umsetzung auf Byte-Zugriffe keine unnötigen Speicherzyklen<br />
durchgeführt werden. Herangezogen werden dabei evtl. die CAS-Masken SCMASK L und<br />
SCMASK R für das linke bzw. rechte Langwort der Zeile, die asynchron im Diagramm BIT MASK<br />
(S. 127, unten) ermittelt werden. Für Langworte, die nicht am Zeilenrand liegen, wird jedoch der<br />
Wert ”0000” (alle Bytes selektiert) als CAS-Maske verwendet.<br />
Im Diagramm MEM CYCLES (S. 124) erfolgen die eigentlichen Speicherzugriffe nun in derselben<br />
Weise wie bei Lesezugriffen des Hosts. Allerdings wird in T4 das Signal GPU READ DONE gesetzt,<br />
falls keine weiteren Teile des Langworts gelesen werden müssen. Daraufhin wird die Einheit im<br />
Diagramm GPU FIFO R (S. 129) aktiv. Dort werden die Adresse des Zugriffs und der Puffer-<br />
Zeiger erhöht, es wird überprüft, ob das Zeilenende erreicht wurde und die Lesephase beendet<br />
werden kann, und das gelesene Langwort wird (sobald es bereitsteht) an der richtigen Position im<br />
Lese-Puffer abgelegt, wobei es zuvor im Diagramm BIT SHIFT (S. 126) gemäß Abbildung 34 an<br />
die richtige Bit-Position geschoben wird.<br />
Die Schreibzugriffe der Prozessor-Einheit entsprechen ebenfalls denen bei Host-Zugriffen. Zusätzlich<br />
können jedoch Read-Modify-Write-Zyklen (RMW) durchgeführt werden, wenn Randdaten des<br />
Zielbereichs gelesen werden müssen oder eine Verknüpfung von Quell- und Zieldaten ausgewählt<br />
wurde.<br />
Auch bei Schreibzugriffen werden im Diagramm MEM ADDRESS (S. 128, unten) die Adresse<br />
RAM ADR des Zugriffs (aus der Langwort-Adresse DADRLW C) und die CAS-Maske ermittelt.<br />
Zusätzlich wird jedoch auch eine Bit-Maske PRE MASK bestimmt, in der (vgl. Abbildung 34 ganz<br />
oben) diejenigen Bits gesetzt sind, die zur Zielzeile gehören. In der Zeilenmitte werden alle Bits der<br />
Maske gesetzt, während bei Langworten am Zeilenrand die im Diagramm BIT MASK (S. 127)<br />
asynchron berechneten Masken herangezogen werden, in denen sich die Anordnung der gesetzten<br />
Bits aus den Bit-Offsets DBOS L und DBOS R ergibt. Fallen das linke und rechte Langwort der<br />
Zeile zusammen, müssen die entsprechenden Bit-Masken und-verknüpft werden.<br />
Des weiteren wird im Diagramm MEM ADDRESS bei jedem Schreibzugriff das aktuelle Langwort<br />
aus dem Lese-Puffer geholt, das in den Zielbereich geschrieben oder mit den Zieldaten verknüpft<br />
werden muß. Dabei dient GPU FIFO OUT als Puffer-Zeiger. Falls RMW-Zyklen erforderlich<br />
werden, wird dies erkannt und das Signal PRE READ auf ’1’ gesetzt.<br />
Die Verknüpfung von Quell- und Zieldaten wird asynchron im Diagramm PIXBLT PATH (S. 131)<br />
durchgeführt. Gemäß Tabelle 14 werden zunächst evtl. Quell- und/oder Zieldaten invertiert, dann<br />
wird eine Verknüpfung ausgewählt und schließlich evtl. noch das Ergebnis invertiert. Das Ergebnis
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 53<br />
wird im Diagramm MEM ADDRESS (unten) in die Variable RAM D W übertragen, die bei allen<br />
Schreibzugriffen die zu schreibenden Daten enthält.<br />
Bei RMW-Zyklen werden die Zieldaten zunächst auf gewohnte Weise im Diagramm<br />
MEM CYCLES (S. 124) gelesen. Nach dem Zustand CAS3 werden jedoch die Zustände RMW1<br />
bis RMW3 durchlaufen, die den Lese-Zyklus zum RMW-Zyklus ergänzen. Je nach Speicherbusbreite<br />
erfolgen bis zu vier derartige Zyklen pro Langwort.<br />
Wurde der letzte (oder einzige) Schreib- oder RMW-Zyklus des Langworts eingeleitet, so wird in T4<br />
oder T13 das Signal GPU WRITE DONE auf ’1’ gesetzt. Damit wird die Erhöhung der Adresse<br />
und des Puffer-Zeigers im Diagramm GPU FIFO W (S. 130) eingeleitet. Dort erfolgt auch die<br />
Kontrolle, ob das Zeilenende erreicht wurde.<br />
Einige typische Simulationsergebnisse sind auf den Abbildungen 119 bis 122 (S. 149 bis 152) zu<br />
sehen.<br />
Abbildung 119 zeigt die Speicherzugriffe bei einem PixBlT-Befehl, bei dem 3 Zeilen zu 104 Pixeln<br />
à 1 Bit kopiert werden, wobei die Daten nicht an Langwort-Grenzen beginnen oder enden.<br />
Abbildung 120 stellt einen Ausschnitt dar. Zu sehen ist der Kopiervorgang der ersten Zeile, die<br />
von der Länge und der Lage in Quell- und Zielbereich her exakt dem Beispiel aus Abbildung 34<br />
entspricht. Es ist deutlich zu erkennen, daß zunächst vier Langworte in einer Page-Mode-Sequenz<br />
gelesen werden. In der folgenden Page-Mode-Sequenz zum Schreiben der Daten werden beim ersten<br />
und beim letzten der vier Langworte RMW-Zyklen durchgeführt, damit die Randdaten ” gerettet“<br />
werden können.<br />
In diesem Beispiel wurde die Verknüpfung ” Ziel = Quelle“ gewählt. Quell- und Zielbereich enthielten<br />
vor der Befehlsausführung kontinuierlich den Wert 0x12345678. Aufgrund der unterschiedlichen<br />
Bit-Offsets (SBOS L=18, DBOS L=6) ergibt sich eine Verschiebung der Daten um 12 Bit<br />
nach links. Daraus resultiert der Wert 0x45678123, der in die mittleren beiden Langworte des Zielbereichs<br />
geschrieben werden (vgl. MD out). Die Daten, die in die äußeren Langworte geschrieben<br />
werden, ergeben sich aus der Mischung von Randdaten und kopierten Daten.<br />
Abbildung 121 (S. 151) zeigt die Zugriffe bei einem PixBlT-Befehl, bei dem 2 Zeilen zu 13 Pixeln<br />
à 32 Bit kopiert werden (zu sehen ist der Kopiervorgang der ersten Zeile). Als Verknüpfung wurde<br />
” Ziel = Quelle + Ziel“ gewählt, und die Pixel werden in der Reihenfolge von unten rechts nach<br />
oben links bearbeitet (PHV=PBH=’1’). Es werden zunächst 8 Langworte gelesen und dann in einer<br />
Page-Mode-RMW-Sequenz geschrieben, da der Lese-Puffer auf 8 gültige Langworte beschränkt ist.<br />
Anschließend wiederholt sich diese Abfolge, wobei allerdings nach jeweils 5 Langworten das (linke)<br />
Zeilenende erreicht wird.<br />
Abbildung 120 zeigt die letzte Abfolge als Ausschnitt. Man erkennt, daß die Adressen (RCA out)<br />
tatsächlich heruntergezählt werden, da die Daten von rechts nach links bearbeitet werden.<br />
6.3.4 Implementierung weiterer Grafik-Befehle<br />
Die Implementierung weiterer Grafik-Befehle ist aufgrund der Vorarbeiten, die in der<br />
Speicherzugriffs-Einheit in Zusammenhang mit dem PixBlT-Befehl geleistet wurden, zum Teil sehr<br />
einfach. So ist der “Block Move”-Befehl ein Spezialfall des PixBlT, bei dem der lineare Datenblock<br />
wie eine einzige Zeile eines zweidimensionalen Bildschirmbereichs behandelt werden kann,<br />
auch wenn diese sich evtl. über mehrere physikalische Bildschirmzeilen erstreckt. Der “Fill”-Befehl<br />
unterscheidet sich vom PixBlT darin, daß die Quelldaten konstant sind, so daß Speicherzugriffe auf<br />
diese entfallen können.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 6.3<br />
Seite 54<br />
Bei den “Pattern Fill”-Befehlen kann das Schreiben der Daten ebenfalls von der vorhandenen<br />
Speicherzugriffs-Einheit übernommen werden. Das Lesen der Füllmuster aus den Registern hingegen<br />
ist mit einem hohen Aufwand verbunden, da Silcsyn keine multidimensionalen Felder unterstützt.<br />
Hier ist zu überlegen, ob vielleicht auf eine Modellierung unter Speedchart verzichtet<br />
werden und stattdessen eine statische RAM-Zelle in das Design integriert werden sollte.<br />
Die Füll- und Kopierbefehle schließlich, die spezielle Eigenschaften der VRAMs benutzen, machen<br />
neue Speicherzugriffs-Zyklen erforderlich, so daß die Controller-Einheit noch erweitert werden muß.<br />
Die Befehle selbst sind weniger aufwendig als die Befehle auf Pixel-Basis.<br />
6.3.5 Timing der Befehle<br />
Was das Timing der Befehle angeht, müssen mit Sicherheit noch Änderungen vorgenommen werden.<br />
Dies betrifft zum einen die Additionen, die beim Clip-Befehl und bei der Adreßumrechnung für<br />
den PixBlT-Befehl durchgeführt werden. Es wäre illusorisch anzunehmen, daß diese in einem<br />
Taktzyklus (bei 60 MHz) ausgeführt werden können. Da aber das Timing durch das Synthese-<br />
Werkzeug Silcsyn noch nicht ordnungsgemäß beeinflußt werden kann, hat es wenig Sinn, hier jetzt<br />
schon etwas zu ändern.<br />
Den zweiten kritischen Punkt stellt die Speicherzugriffs-Einheit dar. Die durchgeführten Schreibund<br />
Lesezyklen entsprechen zwar den Timing-Anforderungen der RAMs, hierbei wurden jedoch die<br />
Ausgangstreiber nicht berücksichtigt. Da diese erst nach der Synthese angefügt werden können,<br />
wird sicher noch eine Anpassung erforderlich werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
7 Werkzeuge der Logik-Synthese in der Praxis<br />
7.1 Produktivitätssteigerung durch den Einsatz von Speedchart-VHDL<br />
Abschnitt 7.1<br />
Seite 55<br />
Der Umgang mit Speedchart erwies sich aufgrund der sehr gut durchdachten Benutzeroberfläche<br />
während der gesamten Arbeit als äußerst komfortabel. Der Einstieg fiel insbesondere dadurch<br />
leicht, daß sich die Verwendung von VHDL-Anweisungen im Speedchart-Entwurf auf Variablen-<br />
Deklarationen, Zuweisungen, IF- und CASE-Konstrukte beschränkt, die ohnehin jedem Ingenieur<br />
vertraut sein dürften. Ein Erlernen von VHDL war daher bis auf einige syntaktische Regeln<br />
nicht notwendig.<br />
Auch der von Speedchart erzeugte VHDL-Code benutzt nur eine so eingeschränkte Teilmenge von<br />
VHDL, daß er allgemein verständlich ist. Diese Einschränkungen im Sprachumfang erfolgen im<br />
Hinblick auf die Synthetisierbarkeit der Schaltungen, die eine harte Anforderung an den VHDL-<br />
Code bedeutet. Anderenfalls wäre die VHDL-Datei nicht mehr als ein Spezifikationsinterface.<br />
Nun handelte es sich bei Speedchart-VHDL nicht von vornherein um ein ausgereiftes Programm.<br />
Anfangs standen nur erste Beta-Versionen zur Verfügung. Vor Beginn der Entwicklung des Grafikprozessors<br />
mußte Speedchart daher auf Möglichkeiten und Einschränkungen hin untersucht werden.<br />
Im engen Dialog mit den Herstellern gelang es aber auf sehr erfreuliche Weise, Unzulänglichkeiten<br />
bald zu beseitigen oder Umgehungsmöglichkeiten [5] zu finden.<br />
Wenn ein Programm zum Schaltungsentwurf über mehrere Programmversionen hinweg nicht in der<br />
Lage ist, einen VHDL-Code zu generieren, aus dem ein gewöhnlicher Inverter synthetisiert werden<br />
kann, so ist das zwar peinlich (it’s not a bug, it’s a feature), kann aber als normales Zwischenstadium<br />
in der Entwicklung eines komplexen Programms angesehen werden. Auch daß etwa 30% der<br />
Entwicklungszeit zur Fehlersuche und zum Schreiben kleiner Konvertierungsprogramme zum Patchen<br />
der fehlerhaft erzeugten VHDL-Files aufgewendet werden mußte, kann für einen Beta-Kunden<br />
als normal gelten. Bei Betrachtung der neuesten Speedchart-Version und der bisherigen Verbesserungen<br />
kann man annehmen, daß sich Speedchart-VHDL in naher Zukunft zu einem ” fehlerfreien“<br />
Programm entwickeln wird, das die Design-Methoden tatsächlich revolutionieren kann und<br />
einen erheblichen Produktivitätsfortschritt beim Schaltungsentwurf bedeutet.<br />
Der neue zentrale Gedanke ist dabei der zustandsorientierte Entwurf einer Schaltung,<br />
der sich als besonders angenehm erweist, da der Mensch offenbar zustandsorientiert denkt. So<br />
berichtete ein Diplomand, daß er in VHDL programmiert, indem er seine Entwürfe zunächst als<br />
Zustandsgrafen auf dem Papier plant, diese in VHDL umsetzt und nach einigen Änderungen die<br />
endgültige Version zur Dokumentation wieder als Zustandsgrafen darstellt, wobei er ein Zeichenprogramm<br />
benutzt. Unter Speedchart hingegen erfolgen Entwurf, Simulation ∗ , Änderung und<br />
Dokumentation von vornherein in der gleichen Darstellungsform.<br />
Der Anwender von Speedchart entwickelt nach einiger Zeit eine vollkommen andere Design-<br />
Methodik, bei der er auf vorherige Planungen fast vollständig verzichtet. Dies ist jedoch kein<br />
Zeichen eines schlechten Programmierstils, sondern darauf zurückzuführen, daß Speedchart gleichzeitig<br />
ein Spezifikationswerkzeug und ein Eingabewerkzeug für synthetisierbare Designs ist. Es<br />
ergäbe unter Speedchart auch keinen Sinn, die Struktur einer neuen Einheit vor der Eingabe zu<br />
skizzieren: Eine Skizze auf Gatterebene wäre kaum umzusetzen, während ein Zustandsgraf unter<br />
Speedchart nicht vorab skizziert werden muß.<br />
Auch die Aufteilung des Gesamtentwurfs auf hierarchisch geordnete Seiten, die vollständig auf<br />
den Bildschirm passen und die sich auch ihrer Komplexität nach im wesentlichen noch mit einem<br />
∗ Unter Speedchart können bei der Simulation Variablenwerte numerisch und aktive Zustände grafisch angezeigt<br />
werden. Eine zusätzliche Anzeige von Signalverläufen (“Waveform Output”) ist erst seit der neuesten Version 2.2.0<br />
möglich; vorher mußte dafür der externe Simulator VHDL2000 (Racal-Redac) auf Basis der von Speedchart erzeugten<br />
VHDL-Dateien verwendet werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 7.2<br />
Seite 56<br />
Blick erfassen lassen, hat enorme Vorteile gegenüber einer mehrere tausend Zeilen langen VHDL-<br />
Datei: Das Wiederfinden einzelner Statements wird vereinfacht, denn das menschliche Gedächtnis<br />
ist offenbar zweidimensional orientiert; so können sich z. B. die meisten Menschen Positionen von<br />
Figuren auf einem Schachbrett wesentlich leichter merken als Positionen auf einem 64-mal-1–Brett.<br />
Die gemischte Verwendung von Grafik und Text erlaubt häufig eine Gliederung des Entwurfs<br />
in der Weise, daß sich die grobe Funktion eines Speedchart-Diagramms anhand der Grafik<br />
und der Namen der Zustände schnell erfassen läßt, während sich die Details übersichtlich geordnet<br />
in den VHDL-Befehlssequenzen verbergen, die den Zuständen und Transitionen zugeordnet sind.<br />
So bleiben selbst komplexe Entwürfe überschaubar. Es entsteht eine gleichermaßen ” maschinenund<br />
personenlesbare“ [16] Form der Schaltungsbeschreibung anstelle zweier verschiedener Darstellungsformen<br />
oder eines Kompromisses.<br />
Quantitativ läßt sich der Produktivitätsfortschritt, den die Verwendung von Speedchart mit sich<br />
bringt, nur schwer abschätzen. Gegenüber VHDL-Eingabe dürfte er (bezogen auf die Entwicklungszeit)<br />
zwischen 2:1 und 3:1, gegenüber Schaltplan-Eingabe (vollautomatische Synthetisierbarkeit<br />
vorausgesetzt) zwischen 10:1 und 30:1 liegen.<br />
7.2 Silcsyn als Synthese-Werkzeug auf VHDL-Basis<br />
Der Einsatz von Silcsyn als Synthese-Werkzeug hat sich bei der Entwicklung des Grafikprozessors<br />
zunächst ebenfalls sehr gut bewährt. Schaltungen, die von Silcsyn funktional falsch synthetisiert<br />
wurden, konnten nicht beobachtet werden, und die Einschränkungen durch Silcsyn waren gering.<br />
Bei Beachtung einiger einfacher Regeln [5] und dem Verzicht auf manche Konstrukte konnten die<br />
von Speedchart erzeugten VHDL-Dateien ohne Änderungen für die Synthese verwendet werden.<br />
Einen erheblichen Mangel stellte jedoch der Verzicht auf multi-dimensionale Felder dar. Die<br />
fehlende Möglichkeit, Registerbänke als Felder von Bit-Vektoren oder Integers zu definieren, machte<br />
bei der Adressierung der Register fünf CASE-Konstrukte mit je 96 Fällen notwendig. Auch variable<br />
Indizes wären wünschenswert gewesen.<br />
Eine Kontrolle der synthetisierten Schaltungen war unter Silcsyn nahezu unmöglich. Lediglich<br />
Simulationen auf Basis der erzeugten Netzlisten konnten belegen, daß die erzeugten Schaltungen<br />
korrekt arbeiteten. Silcsyn bietet zwar die Möglichkeit, die erzeugten Schaltungen grafisch anzuzeigen;<br />
es wird jedoch eine stark verschachtelte Hierarchie verwendet, und die Signale an den einzelnen<br />
Blöcken enthalten nur noch fortlaufende Nummern ohne die Möglichkeit einer Kreuz-Referenz, so<br />
daß der Anwender den Eindruck erhält, diese Option sei von den Herstellern des Programms nur zu<br />
Werbezwecken implementiert worden. Die erzeugten Schaltpläne sind einfach unlesbar. Vermutlich<br />
wäre aber auch eine bessere Darstellungsform bei Schaltungen von über 10.000 Gattern nicht<br />
mehr zu gebrauchen. Doch aufgrund der Tatsache, daß jede Nichtbeachtung von Einschränkungen<br />
sofort zu Fehlermeldungen führte, während bei fehlerfreiem VHDL-Code nie eine Abweichung zwischen<br />
den Simulationen auf Gatterebene und auf VHDL-Ebene beobachtet werden konnte, kann<br />
der Anwender von Silcsyn auf eine detaillierte Prüfung der Netzlisten wohl verzichten.<br />
Die Fehlerwahrscheinlichkeit ist im starken Gegensatz zur Hand-Synthese so gering, daß die<br />
funktionale Korrektheit der Schaltungen vorausgesetzt werden kann.<br />
Vorsicht ist jedoch geboten, was die Einhaltung der Timing-Anforderungen betrifft. Laut<br />
Handbuch ist es möglich, Silcsyn die Frequenz des Systemtaktes anzugeben und das Programm<br />
anzuweisen, die Laufzeiten in der gesamten Schaltung so zu optimieren, daß keine Verletzungen von<br />
Initialisierungs- und Übernahmezeiten von Flipflops (“set-up / hold violations”) auftreten, indem<br />
z. B. Addierer mit Ripple-Übertrag (“ripple carry”) durch Strukturen mit Parallelübertrag (“carry<br />
look-ahead”) ersetzt werden. Auch kann automatisch eine Kontrolle erfolgen, ob dies gelungen ist.<br />
In der Praxis zeigte sich jedoch, daß diese Optimierung bei Verwendung der Bibliothek zum Gate<br />
Array TC140G [14] von Toshiba nicht korrekt funktionierte. Bei Tests mit hohen Taktfrequenzen<br />
kam es sogar vor, daß sich synthetisierte Schaltungen aufgrund eklatanter Verletzungen der
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 7.3<br />
Seite 57<br />
Timing-Anforderungen funktional falsch verhielten, obwohl Silcsyn noch nicht einmal Verletzungen<br />
der Zeitbedingungen von Flipflops bemerkt hatte. Derartige Fehler traten allerdings erst weit<br />
oberhalb der Taktfrequenz des Grafikprozessors von 60 MHz auf. Wenn der Prozessor später auf<br />
dem schnelleren TC160G [15] gefertigt wird, wird vermutlich kein Fehlverhalten auftreten. Es wäre<br />
jedoch wünschenswert, bis zur Fertigung der Schaltung eine korrigierte Bibliothek zu bekommen,<br />
damit sich die einwandfreie Funktion der Schaltung nicht nur auf eine vage Vermutung stützt.<br />
Aus Zeitgründen konnten im Rahmen dieser Arbeit keine weiteren speziellen Fähigkeiten des<br />
Synthese-Werkzeugs Silcsyn untersucht werden. Dies betrifft z. B. die automatische Berechnung<br />
der Ausgangslasten (“fan-out”) und deren Treiber, die kapazitiven Belastungen sowie die Gewährleistung<br />
der Testbarkeit der synthetisierten Schaltung durch die automatische Erzeugung von Teststrukturen<br />
(“full scan path design”).<br />
Auch Gespräche mit anderen Anwendern von Silcsyn ließen erkennen, daß die Synthese einer funktional<br />
korrekten Schaltung nur ein erster, kleiner Schritt auf dem Weg zur Endabgabe einer integrierten<br />
Schaltung ist. Ein automatisches Werkzeug kann nie auch nur annähernd den Umfang<br />
an Möglichkeiten ausschöpfen, die bei einem Hand-Design gegeben sind, was sich insbesondere bei<br />
einer Optimierung auf maximale Geschwindigkeit bemerkbar macht. Daher kann mit Sicherheit<br />
davon ausgegangen werden, daß die Logik-Synthese in Bezug auf Gatterbedarf und Geschwindigkeit<br />
immer einen Schritt hinter dem Hand-Design zurückbleiben wird. Auf der anderen Seite stehen<br />
jedoch die enorme Ersparnis an Entwicklungszeit und die sehr stark reduzierte Fehlerwahrscheinlichkeit<br />
bei der Verwendung von Logik-Synthese.<br />
Da die Fehlerwahrscheinlichkeit – das bei integrierten Schaltungen wichtigste Maß – bei der Hand-<br />
Synthese von immer komplexer werdenden Schaltungen gegen 1 geht, ist die Entwicklung funktionsfähiger<br />
Schaltungen auf Dauer nur mittels Logik-Synthese möglich. Wenn das Zeitverhalten<br />
der Schaltungen dabei nicht optimal berücksichtigt wird, können Unzulänglichkeiten immer<br />
noch dadurch ausgeglichen werden, daß einige zeitkritische Schaltungsteile per Hand optimiert oder<br />
vollständig neu entworfen und modular in die synthetisierte Schaltung eingefügt werden. Besonders<br />
bei regulären Strukturen ist dieses Verfahren sinnvoll, während irreguläre Strukturen in der Regel<br />
von der Maschine besser optimiert werden können.<br />
Beachtlich war bei der Synthese der einzelnen Einheiten der Bedarf an Rechenleistung und Speicher.<br />
Für die Synthese der Video-Timing- und VRAM-Reload-Einheit (Design ” VIDEO“,<br />
2.500 VHDL-Zeilen, ca. 26.000 Gatter) benötigte eine SUN2-Station mit 64 MByte RAM etwa<br />
16 Stunden, wobei 360 MByte virtueller Speicherplatz auf der Festplatte benötigt wurden. Da<br />
diese Einheit nur bis zu einer Frequenz von 30 bis 40 MHz arbeiten muß und keine aufwendigen<br />
Rechenoperationen ausgeführt werden müssen (nur 16-Bit-Additionen), wurde selbst mit der<br />
fehlerhaften Bibliothek eine Schaltung synthetisiert, die allen Timing-Anforderungen gerecht wird.<br />
Eine Synthese der Controller- und Prozessor-Einheit (Design ” TIM“) scheiterte bisher am zu<br />
großen Speicherbedarf. Eine Analyse der VHDL-Datei (4600 Zeilen) unter Silcsyn war jedoch<br />
möglich; sie lieferte keine Fehlermeldungen. Der Bedarf an Gattern wurde von Silcsyn zu 74.000<br />
abgeschätzt. Bei diesem Design ist anzunehmen, daß bei einer maximalen Arbeitsfrequenz von<br />
60 MHz und aufwendigen Rechenoperationen (32-Bit-Additionen mit mehreren Summanden) an<br />
vielen Stellen Optimierungen per Hand notwendig werden.<br />
7.3 Simulation auf VHDL- und Gatterebene<br />
Für den Simulator VHDL2000 konnten die von Speedchart erzeugten VHDL-Dateien ebenfalls<br />
direkt verwendet werden. Sogar die Testmuster, deren Eingabe unter Speedchart komfortabel<br />
möglich ist, konnte Speedchart direkt in Dateien mit der korrekten Syntax umsetzen.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abschnitt 7.4<br />
Seite 58<br />
Der Umgang mit VHDL2000 war meist unproblematisch, extrem schwierig war jedoch die Ortung<br />
von Fehlern. Wurden Einschränkungen [5] von VHDL2000 (die nicht im Handbuch stehen) im<br />
Speedchart-Design nicht beachtet, stellte VHDL2000 die Funktion ein und meldete einen “assertion<br />
error” ohne Angabe einer Zeilennummer und ohne nähere Erklärung der Art des Fehlers. Insbesondere<br />
bei der Verwendung von n-Bit-Integer-Variablen, die in VHDL als Untertypen des Typs<br />
Integer definiert werden, traten Probleme auf. Während z. B. bei einem 8-Bit-Rückwärtszähler auf<br />
Gatterebene automatisch ein Zählerüberlauf vom Wert 0 auf 255 stattfindet, erwartet VHDL2000<br />
die Syntax “count:=(count + 255) mod 256”, nicht “count:=(count - 1) mod 256”. Warum<br />
VHDL2000 bei der Subtraktion, nicht aber bei der Addition eine Überschreitung des Wertebereichs<br />
feststellt, entzieht sich zwar jeder Logik, das Problem ist damit aber gelöst. Zuweisungen<br />
und Vergleiche von Integers und Bit-Vektoren sind teilweise ähnlich problematisch.<br />
Auf Gatterebene konnten die von Silcsyn erzeugten Schaltungen mit CADAT2000 simuliert<br />
werden. Dabei konnten die Netzlisten von Silcsyn direkt übernommen werden, nicht jedoch die<br />
von Speedchart erzeugten Testmuster. Testmuster im korrekten Format mußten aus VHDL2000<br />
heraus erzeugt werden. Anschließend war eine Nachbearbeitung mit selbstgeschriebenen Konvertierungsprogrammen<br />
nötig, da die Signalnamen unter CADAT auf acht Großbuchstaben beschränkt<br />
sind.<br />
Als sehr angenehm erwies sich, daß die Benutzeroberfläche von CADAT mit der von VHDL2000<br />
übereinstimmt. Dies erleichterte den visuellen Vergleich der Simulationsergebnisse mit den auf<br />
VHDL-Basis erzeugten. Ein automatisierter Vergleich wäre allerdings wünschenswert.<br />
Das Zeitverhalten der Schaltung entsprach in der Simulation bei Verwendung der entsprechenden<br />
Bibliotheken exakt dem der Elemente des Gate-Arrays TC140G [14]. CADAT meldete jedoch bei<br />
Tests mit zu hohen Arbeitsfrequenzen keine Verletzungen von Initialisierungs- und Übernahmezeiten<br />
der Flipflops (“set-up / hold violations”). Hierfür müßten bei jedem Flipflop einzeln Anweisungen<br />
eingefügt werden, die derartige Verletzungen überprüfen. Laut Racal-Redac ist es unter<br />
CADAT nicht möglich, die Zeiten global für alle Flipflops überprüfen zu lassen. Parallelversuche<br />
mit Verilog hingegen führten von vornherein zu korrekten Meldungen über Zeitverletzungen.<br />
7.4 Bilanz: grafisch-zustandsorientierte Eingabe mit teilautomatischer<br />
Synthese als leistungsfähiger Kompromiß<br />
Zusammenfassend läßt sich sagen, daß sich Speedchart als grafisch-zustandsorientiertes Eingabewerkzeug<br />
für VHDL in jeder Hinsicht bestens bewährt hat. Speedchart bietet eine neuartige,<br />
äußerst komfortable Designmethode für Synchronschaltwerke.<br />
Aufgrund der Leichtigkeit, mit der auch komplexe Strukturen entworfen werden können, konnten<br />
im Rahmen dieser Arbeit sogar einige Verbesserungen gegenüber der Spezifikation [1] vorgenommen<br />
werden. Über die Aufgabenstellung hinausgehend konnte neben der Video-Einheit auch die<br />
Controller-Einheit bis ins Detail entwickelt werden, ebenso der Teil der Prozessor-Einheit, der den<br />
Clip- und den PixBlT-Befehl ausführt.<br />
Als das zur Zeit schwächste Glied in der Kette vom Entwurf bis zum fertigen Chip erwies sich die<br />
Logik-Synthese. Dies ist nicht nur auf produktspezifische Einschränkungen in Silcsyn, sondern auch<br />
auf das prinzipielle Problem der mangelnden ” Intelligenz“ derartiger Werkzeuge zurückzuführen.<br />
Ein stellenweise nicht optimales Zeitverhalten von Schaltungsteilen ist die Folge. Bei integrierten<br />
Schaltungen aber stellen die Fehlerwahrscheinlichkeit und die Entwicklungszeit wesentlich wichtigere<br />
Merkmale dar, die bei Verwendung von Logik-Synthese um Größenordnungen besser als bei<br />
der Hand-Synthese sind.<br />
Einen zeitgemäßen und äußerst leistungsfähigen Kompromiß stellt daher die Verwendung von<br />
Speedchart als Eingabewerkzeug bei anschließender, teilweise automatischer, teilweise Handoptimierter<br />
Synthese dar.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Literaturverzeichnis<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Literaturverzeichnis<br />
Seite 59<br />
[1] Formac GmbH: ” Spezifikation für das Video-Timing-Generator ASIC (TIM)“, <strong>Berlin</strong>, 1991<br />
[2] Texas Instruments: “TMS 34020 User’s Guide”, 1990<br />
[3] Speed S.A.: “SPeeDCHART 2.2.0 Reference Manual”, CH-Neuchatel, 1993<br />
[4] Speed S.A.: “SPeeDCHART 2.2.0 First-Time User’s Guide”, CH-Neuchatel, 1993<br />
[5] Lukas Bauer: “SPeeDCHART Design Rules for Silcsyn Synthesis”, <strong>TU</strong> <strong>Berlin</strong>, 1993<br />
[6] Racal-Redac: “SilcSyn VHDL Synthesis Reference Guide”, Release 3.0 EAP, 1993<br />
[7] Racal-Redac: “VHDL2000 User’s Manual”, EAP Release, 1991<br />
[8] Racal-Redac: “CADAT 8.1 Language and Primitives Reference Manual”, 1990<br />
[9] Toshiba: “MOS Memory (DRAM) Data Book”, 1993, S. 87–104: Datenblatt TC 511000<br />
[10] Samsung: “MOS Memory Data Book (Vol.1)”, 1991, S. 129–142: Datenblatt KM41C1000B<br />
[11] Toshiba: “MOS Memory (VRAM) Data Book”, 1993, S. 139–193: Datenblatt TC 524258<br />
[12] Samsung: “MOS Memory Data Book (Vol.1)”, 1991, S. 723–752: Datenblatt KM424C257<br />
[13] Toshiba: “Gate Array Design Manual”, 1991<br />
[14] Toshiba: “TC140G Series Macrocell, ASIC Gate Array Library”, 1991<br />
[15] Toshiba: “TC160G Series Macrocell, ASIC Gate Array Library”, 1993<br />
[16] Claus Baumann, Prof. Dr. O. Manck: ” Schneller Einstieg in VHDL-Top-down-Designs“,<br />
Markt&Technik 28/1993<br />
Aus der Spezifikation [1] des Grafikprozessors wurden Befehls-, Signal- und Registerbeschreibungen<br />
zum Teil ohne besondere Kennzeichnung inhaltlich übernommen.<br />
Eidesstattliche Erklärung<br />
Hiermit erkläre ich, Lukas Bauer, an Eides Statt, diese Arbeit eigenhändig und selbständig angefertigt<br />
und keine anderen als die oben angegebenen Quellen verwendet zu haben.<br />
<strong>Berlin</strong>, den 01.09.1993
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Glossar<br />
Begriffe:<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Glossar<br />
Seite 60<br />
Signal: Hardware-Signal oder 1 Bit breite Speedchart-Variable (Typ “logic”)<br />
(gemeint ist nicht die VHDL-Klasse “signal”)<br />
Variable: Hardware-Bus oder mehr als 1 Bit breite Speedchart-Variable (Typ<br />
“logic vector” oder “integer”)<br />
(gemeint ist nicht die VHDL-Klasse “variable”)<br />
Diagramm: Speedchart-“subdiagram” (nicht “diagram”), das einen Zustandsgrafen<br />
und/oder einen asynchronen Anweisungsblock enthält<br />
Werte:<br />
’0’, ’1’ Werte Boole’scher Variablen (Typ “logic”)<br />
0, 256 Dezimal-Werte numerischer Variablen (Typ “integer”)<br />
”11011000” Binärdarstellung von Bit-Vektoren (Typ “logic vector”)<br />
0x100, 0x1FF Hexadezimal-Werte von Integer-Variablen und von Bit-Vektoren, die<br />
Integer-Werte enthalten<br />
Datenworte:<br />
Byte: 8 Bit<br />
Wort: 16 Bit (wegen Mehrdeutigkeit nicht verwendet)<br />
Langwort: 32 Bit<br />
Speicherwort: 8, 16 oder 32 Bit, je nach Speicherbusbreite MBW<br />
Hostdatenwort: 8, 16 oder 32 Bit, je nach Host-Busbreite HBW<br />
Adressen:<br />
Byte-Adresse: Zeiger auf ein Byte<br />
Adresse: s. Byte-Adresse<br />
Langwort-Adresse: Zeiger auf ein Langwort<br />
Speicherwort-Adresse: Zeiger auf ein Speicherwort der Speicherbusbreite MBW<br />
Bit-Adresse: Zeiger auf ein Bit; An...A3 bezeichnen ein Byte, A2...A0 ein Bit innerhalb<br />
des Bytes nach Motorola-Konvention, Adresse 0 entspricht dabei Bit 7<br />
Pixel-Adresse: Zeiger auf einen Pixel relativ zum ersten Pixel des Bildschirms:<br />
Pixel-Adresse = Y-Koordinate · (Zeilenlänge in Pixeln) + X-Koordinate<br />
Signalnamen:<br />
XXX in: Eingangssignal<br />
XXX out: Ausgangssignal<br />
XXX oe: Richtungsauswahl für bidirektionale Signale (“output enable”),<br />
’1’=Signal ist Ausgang<br />
XXX ot: Test-Ausgangssignal zu Simulationszwecken<br />
XXX ict: Speicherbus-Signal der Controller-Einheit,<br />
wird später mit XXX itv zu XXX out und-verknüpft<br />
XXX itv: Speicherbus-Signal der VRAM-Reload-Einheit,<br />
wird später mit XXX ict zu XXX out und-verknüpft
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Tabellenverzeichnis<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Tabellenverzeichnis<br />
Seite 61<br />
1 Register zur Programmierung der Video-Signale im Vollbildbetrieb . . . . . . . . . . 12<br />
2 Register zur Programmierung der Video-Signale im Halbbildbetrieb (NTSC) . . . . . 16<br />
3 Register zur Programmierung der Video-Signale im Halbbildbetrieb (PAL) . . . . . . 17<br />
4 Externe Synchronisations-Modi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
5 Behandlung redundanter Signale an den Sync-Eingängen . . . . . . . . . . . . . . . . 18<br />
6 Register PSIZE zur Programmierung der Farbtiefe eines Pixels . . . . . . . . . . . . 28<br />
7 Registerbits SRL zur Programmierung der Schieberegisterlänge . . . . . . . . . . . . 28<br />
8 Registerbits XZ zur Programmierung des Zoom-Faktors in X-Richtung . . . . . . . . 28<br />
9 Registerbits MBW zur Programmierung der Speicherbusbreite . . . . . . . . . . . . 28<br />
10 Registerbits RF zur Programmierung der Refresh-Rate . . . . . . . . . . . . . . . . . 33<br />
11 Registerbits RSL zur Auswahl der Adreßbits, die die RAS-Bank bestimmen . . . . . 40<br />
12 Auswahl von MOA bis MOD je nach RAS-Bank . . . . . . . . . . . . . . . . . . . . 40<br />
13 Registerbits MOX zur Bestimmung der RAS-Adresse . . . . . . . . . . . . . . . . . . 40<br />
14 Registerbits S: Verknüpfung von Quell- und Zieldaten beim PixBlT-Befehl . . . . . . 47<br />
15 Register der Video-Timing-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66<br />
16 Register der VRAM-Reload-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />
17 Register der Controller-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67<br />
18 Register der Prozessor-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68<br />
19 Signale der Video-Timing-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
20 Signale der VRAM-Reload-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69<br />
21 Signale der Controller-Einheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Abbildungsverzeichnis<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildungsverzeichnis<br />
Seite 62<br />
1 Blockschaltbild des Grafikprozessors ” TIM“ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />
2 Vollbildbetrieb: HCOUNT und VCOUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12<br />
3 Vollbildbetrieb: HBLANK, VBLANK und CBLANK . . . . . . . . . . . . . . . . . . . . . . . 12<br />
4 Vollbildbetrieb: HSYNC und VSYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
5 Vollbildbetrieb: CSYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
6 Vollbildbetrieb: IPHASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
7 Vollbildbetrieb: VLINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
8 Überlagerung zweier Halbbilder im Halbbildbetrieb . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
9 Halbbildbetrieb NTSC: VLINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
10 Halbbildbetrieb NTSC: VCOUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />
11 Halbbildbetrieb NTSC: CBLANK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
12 Halbbildbetrieb NTSC: IPHASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
13 Halbbildbetrieb NTSC: CSYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
14 Halbbildbetrieb PAL: VLINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
15 Halbbildbetrieb PAL: IPHASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
16 Halbbildbetrieb PAL: VCOUNT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17<br />
17 Blockschaltbild: Datenfluß zwischen TIM und dem Video-RAM . . . . . . . . . . . . . . . . . 23<br />
18 Beispiel-Verteilung von VRAM-Relaods für SRE=’0’ . . . . . . . . . . . . . . . . . . . . . . . 24<br />
19 Beispiel-Verteilung von VRAM-Relaods für SRE=’1’ . . . . . . . . . . . . . . . . . . . . . . . 24<br />
20 Blockschaltbild: externer Multiplexer für die Video-Daten . . . . . . . . . . . . . . . . . . . . 26<br />
21 Ermittlung der RAS- und CAS-Adressen beim Newline-Reload . . . . . . . . . . . . . . . . . 27<br />
22 Berechnung der Anzahl der notwendigen Reloads für SRE=’0’ . . . . . . . . . . . . . . . . . . 29<br />
23 Berechnung der Anzahl der notwendigen Reloads für SRE=’1’ . . . . . . . . . . . . . . . . . . 29<br />
24 Schreibzugriff bei gemultiplextem Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
25 Lesezugriff bei gemultiplextem Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />
26 Schreibzugriff bei nicht gemultiplextem Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
27 Lesezugriff bei nicht gemultiplextem Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
28 Schreibzugriff bei gemultiplextem Bus mit beschleunigtem Handshake . . . . . . . . . . . . . 37<br />
29 Schreibzugriff bei nicht gemultiplextem Bus mit beschleunigtem Handshake . . . . . . . . . . 37<br />
30 Beispiel einer Speicherkonfiguration mit 336 MByte DRAM und 4 MByte VRAM . . . . . . . 39
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildungsverzeichnis<br />
Seite 63<br />
31 Beispiel einer minimal-Speicherkonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
32 Blockschaltbild: TIM mit externen Registern . . . . . . . . . . . . . . . . . . . . . . . . . . . 40<br />
33 Blockschaltbild: TIM mit internen Registern . . . . . . . . . . . . . . . . . . . . . . . . . . . 41<br />
34 Datenfluß beim PixBlT-Befehl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50<br />
35 Timing-Diagramm: Read Cycle, Write Cycle . . . . . . . . . . . . . . . . . . . . . . . . . . . 71<br />
36 Timing-Diagramm: Fast Page Mode Read Cycle, Fast Page Mode Write Cycle . . . . . . . . 72<br />
37 Timing-Diagramm: Fast Page Mode Read-Modify-Write Cycle . . . . . . . . . . . . . . . . . 73<br />
38 Timing-Diagramm: Read Transfer Cycle ( Newline Reload ) . . . . . . . . . . . . . . . . . . . 74<br />
39 Timing-Diagramm: Real Time Read Transfer Cycle ( Midline Reload ) . . . . . . . . . . . . . 75<br />
40 Timing-Diagramm: Split Read Transfer Cycle ( Split Midline Reload ) . . . . . . . . . . . . . 76<br />
41 Timing-Diagramm: CAS Before RAS Refresh Cycle . . . . . . . . . . . . . . . . . . . . . . . 77<br />
42 Hierarchie der Video-Timing- und VRAM-Reload-Einheit (Design ” VIDEO“) . . . . . . . . . 78<br />
43 Typen, Konstanten und externe Signale im Design ” VIDEO“ . . . . . . . . . . . . . . . . . . 79<br />
44 Variablen im Diagramm VIDEO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
45 Speedchart-Diagramm VIDEO/SYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
46 Variablen im Diagramm VIDEO/SYNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
47 Speedchart-Diagramm VIDEO/VRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
48 Speedchart-Diagramm VIDEO/RELOAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
49 Speedchart-Diagramm VIDEO/SYNC/S HCNT . . . . . . . . . . . . . . . . . . . . . . . . . . 82<br />
50 Speedchart-Diagramm VIDEO/SYNC/S VCNT . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />
51 Speedchart-Diagramm VIDEO/SYNC/CSYNC . . . . . . . . . . . . . . . . . . . . . . . . . . 84<br />
52 Variablen im Diagramm VIDEO/VRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85<br />
53 Speedchart-Diagramm VIDEO/VRAM/VR RAM . . . . . . . . . . . . . . . . . . . . . . . . . 86<br />
54 Speedchart-Diagramm VIDEO/VRAM/VR RAM/TRANSFER . . . . . . . . . . . . . . . . . 87<br />
55 Speedchart-Diagramm VIDEO/VRAM/VR RAM/READ WRITE . . . . . . . . . . . . . . . 88<br />
56 Speedchart-Diagramm VIDEO/VRAM/VR SAM . . . . . . . . . . . . . . . . . . . . . . . . . 89<br />
57 Speedchart-Diagramm VIDEO/VRAM/VR ATTR . . . . . . . . . . . . . . . . . . . . . . . . 90<br />
58 Speedchart-Diagramm VIDEO/INTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />
59 Variablen im Diagramm VIDEO/RELOAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92<br />
60 Speedchart-Diagramm VIDEO/RELOAD/RL RAM . . . . . . . . . . . . . . . . . . . . . . . 93<br />
61 Speedchart-Diagramm VIDEO/RELOAD/RL RAM/MIDL REL . . . . . . . . . . . . . . . . 94
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildungsverzeichnis<br />
Seite 64<br />
62 Speedchart-Diagramm VIDEO/RELOAD/RL RAM/NEWL REL . . . . . . . . . . . . . . . . 95<br />
63 Speedchart-Diagramm VIDEO/RELOAD/RL RAM/SPLIT MLR . . . . . . . . . . . . . . . 96<br />
64 Speedchart-Diagramm VIDEO/RELOAD/RL RAM/REFRESH . . . . . . . . . . . . . . . . 97<br />
65 Speedchart-Diagramm VIDEO/RELOAD/RL MSC . . . . . . . . . . . . . . . . . . . . . . . 98<br />
66 Speedchart-Diagramm VIDEO/RELOAD/RL CALC . . . . . . . . . . . . . . . . . . . . . . . 99<br />
67 Speedchart-Diagramm VIDEO/RELOAD/RL REFRESH . . . . . . . . . . . . . . . . . . . . 100<br />
68 Speedchart-Diagramm VIDEO/RELOAD/RL ARBIT . . . . . . . . . . . . . . . . . . . . . . 101<br />
69 Video-Timing-Signale im Vollbildbetrieb, interne Synchronisation . . . . . . . . . . . . . . . . 102<br />
70 Video-Timing-Signale im Halbbildbetrieb (NTSC), interne Synchronisation . . . . . . . . . . 103<br />
71 Video-Timing-Signale im Vollbildbetrieb, HSYNC und VSYNC sind Eingänge . . . . . . . . . 104<br />
72 Video-Timing-Signale im Halbbildbetrieb (NTSC), HSYNC und VSYNC sind Eingänge . . . 105<br />
73 Video-Timing-Signale im Vollbildbetrieb, CSYNC ist Eingang . . . . . . . . . . . . . . . . . . 106<br />
74 VRAM-Reload-Signale: Midline Reload kurz vor Zeilenende . . . . . . . . . . . . . . . . . . . 107<br />
75 VRAM-Reload-Signale: Newline Reload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108<br />
76 VRAM-Reload-Signale: Newline Reload und Midline Reload, Zoom-Faktor 4 . . . . . . . . . 109<br />
77 VRAM-Reload-Signale: Midline Reload vor Beginn des Anzeigebereichs . . . . . . . . . . . . 110<br />
78 VRAM-Reload-Signale: Newline Reload, vorgezogener Split Midline Reload, Split Midline<br />
Relaod . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111<br />
79 VRAM-Reload-Signale: Newline Reload, Refresh, Midline Reload . . . . . . . . . . . . . . . . 112<br />
80 Hierarchie der Controller- und Prozessor-Einheit (Design ” TIM“) . . . . . . . . . . . . . . . . 113<br />
81 Typen, Konstanten und externe Signale im Design ” TIM“ . . . . . . . . . . . . . . . . . . . . 114<br />
82 Variablen im Diagramm TIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115<br />
83 Speedchart-Diagramm TIM/HOST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116<br />
84 Speedchart-Diagramm TIM/CONTROL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116<br />
85 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS . . . . . . . . . . . . . . . . . . . . 116<br />
86 Speedchart-Diagramm TIM/GR CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116<br />
87 Speedchart-Diagramm TIM/HOST/HOST ACC . . . . . . . . . . . . . . . . . . . . . . . . . 117<br />
88 Speedchart-Diagramm TIM/HOST/HOST CTRL . . . . . . . . . . . . . . . . . . . . . . . . 118<br />
89 Variablen im Diagramm TIM/CONTROL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119<br />
90 Speedchart-Diagramm TIM/CONTROL/TIM ACCESS . . . . . . . . . . . . . . . . . . . . . 120<br />
91 Speedchart-Diagramm TIM/CONTROL/TIM ACCESS/REG READ . . . . . . . . . . . . . 121<br />
92 Speedchart-Diagramm TIM/CONTROL/TIM ACCESS/REG WRITE . . . . . . . . . . . . . 122
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildungsverzeichnis<br />
Seite 65<br />
93 Variablen im Diagramm TIM/CONTROL/MEM ACCESS . . . . . . . . . . . . . . . . . . . 123<br />
94 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/MEM CYCLES . . . . . . . . . . . 124<br />
95 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/ADDR CALC . . . . . . . . . . . . 125<br />
96 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/BIT SHIFT . . . . . . . . . . . . . 126<br />
97 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/BIT MASK . . . . . . . . . . . . . 127<br />
98 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/MEM ADDRESS . . . . . . . . . . 128<br />
99 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/GPU FIFO R . . . . . . . . . . . . 129<br />
100 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/GPU FIFO W . . . . . . . . . . . . 130<br />
101 Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/PIXBLT PATH . . . . . . . . . . . 131<br />
102 Speedchart-Diagramm TIM/CONTROL/INTERRUPT . . . . . . . . . . . . . . . . . . . . . 132<br />
103 Variablen im Diagramm TIM/GR CPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133<br />
104 Speedchart-Diagramm TIM/GR CPU/GP CMD . . . . . . . . . . . . . . . . . . . . . . . . . 134<br />
105 Speedchart-Diagramm TIM/GR CPU/GP CMD/CLIP . . . . . . . . . . . . . . . . . . . . . 135<br />
106 Speedchart-Diagramm TIM/GR CPU/GP CMD/PIXPLT . . . . . . . . . . . . . . . . . . . . 136<br />
107 Speedchart-Diagramm TIM/GR CPU/SADR SPLIT . . . . . . . . . . . . . . . . . . . . . . . 137<br />
108 Speedchart-Diagramm TIM/GR CPU/DADR SPLIT . . . . . . . . . . . . . . . . . . . . . . 138<br />
109 Speedchart-Diagramm TIM/GR CPU/SY SPLIT . . . . . . . . . . . . . . . . . . . . . . . . . 139<br />
110 Speedchart-Diagramm TIM/GR CPU/DY SPLIT . . . . . . . . . . . . . . . . . . . . . . . . 140<br />
111 Speedchart-Diagramm TIM/GR CPU/AREA TO PIX . . . . . . . . . . . . . . . . . . . . . . 141<br />
112 Speedchart-Diagramm TIM/GR CPU/PIX TO BIT . . . . . . . . . . . . . . . . . . . . . . . 142<br />
113 Speedchart-Diagramm TIM/REG ALIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143<br />
114 Speedchart-Diagramm TIM/ASYNC ACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144<br />
115 Schreib- und Lesezugriffe (Host – Speicher) bei 32 Bit Speicherbusbreite . . . . . . . . . . . . 145<br />
116 Schreib- und Lesezugriffe (Host – Speicher) bei 32 Bit Speicherbusbreite im Fast Page Mode . 146<br />
117 Schreib- und Lesezugriffe (Host – Speicher) bei 8 Bit Speicherbusbreite . . . . . . . . . . . . . 147<br />
118 Schreib- und Lesezugriffe (Host – Speicher) bei 8 Bit Speicherbusbreite im Fast Page Mode . 148<br />
119 Speicherzugriffe beim PixBlT-Befehl, 3 Zeilen zu 104 Pixeln à 1 Bit . . . . . . . . . . . . . . . 149<br />
120 Speicherzugriffe beim PixBlT-Befehl (Ausschnitt) . . . . . . . . . . . . . . . . . . . . . . . . . 150<br />
121 Speicherzugriffe beim PixBlT-Befehl, 2 Zeilen zu 13 Pixeln à 32 Bit . . . . . . . . . . . . . . . 151<br />
122 Speicherzugriffe beim PixBlT-Befehl (Ausschnitt) . . . . . . . . . . . . . . . . . . . . . . . . . 152
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Register-Übersicht<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang A.1<br />
Seite 66<br />
Die Register des Grafikprozessors sind in den Tabellen 15, 16, 17 und 18 auf den folgenden Seiten<br />
nach Einheiten getrennt zusammengefaßt.<br />
Die Anordnung der Register im Adreßraum kann dem Diagramm REG READ (S. 121)<br />
entnommen werden, die Lage der Registerbits dem Diagramm REG ALIAS (S. 143).<br />
Für die Steuerung der Video-Timing-Einheit und der VRAM-Reload-Einheit werden dabei nicht<br />
die von der Controller-Einheit verwalteten Register selbst verwendet, sondern Kopien der Registerwerte:<br />
Im Diagramm INTER (S. 91) werden die Registerwerte einmal gelatcht, um metastabile<br />
Zustände zu vermeiden, die auftreten könnten, wenn Setup- und Hold-Zeiten unterschritten werden.<br />
Dies könnte passieren, wenn ein Registerwert vom Host synchron zum Host-Takt MClk in geschrieben<br />
und von der Video-Timing-Einheit oder der VRAM-Reload-Einheit synchron zum Video-Takt<br />
VClk in weiterverarbeitet wird. Während die Register-Namen in der Controller-Einheit mit R<br />
beginnen (R XXX), tragen die Kopien der Register die in den Tabellen angegebenen Namen.<br />
Register Funktion<br />
HTOTAL[15:0], HEBLNK[15:0], HSBLNK[15:0], HESYNC[15:0], HESERR[15:0]:<br />
horizontale Timing-Register, siehe Tabelle 1, 2 und 3 (S. 12, 16 und 17)<br />
HCOUNT[15:0]: Horizontalzähler, zählt mit VClk in. Register kann nur gelesen werden.<br />
SETHCNT[15:0]: Wert, auf den HCOUNT bei externer Synchronisation mit jedem externen horizontalen<br />
Synchronpuls gesetzt wird<br />
VTOTAL[15:0], VEBLNK[15:0], VSBLNK[15:0], VESYNC[15:0]:<br />
vertikale Timing-Register, siehe Tabelle 1, 2 und 3 (S. 12, 16 und 17)<br />
VCOUNT[15:0]: Vertikalzähler, vgl. Abbildung 2, 10 und 16 (S. 12, 14 und 17). Register kann nur gelesen<br />
werden.<br />
SETVCNT[15:0]: Wert, auf den VCOUNT bei externer Synchronisation mit jedem externen vertikalen Synchronpuls<br />
gesetzt wird<br />
LINTV[15:0]: Stand des Vertikalzählers VCOUNT, bei dem ein Zeileninterrupt erzeugt werden soll<br />
ILE: Interlaced Enable: ’1’ = Halbbildbetrieb<br />
’0’ = Vollbildbetrieb<br />
VSD: ’1’=VSYNC ist Eingang, vgl. Tabelle 4 und 5 (S. 18)<br />
HSD: ’1’=HSYNC ist Eingang, vgl. Tabelle 4 und 5 (S. 18)<br />
CSD: ’1’=CSYNC ist Eingang, vgl. Tabelle 4 und 5 (S. 18)<br />
TEST: schneller Zähler-Test: ’1’ = 16-Bit-Zähler arbeiten wie zwei 8-Bit-Zähler<br />
’0’ = Zähler arbeiten normal<br />
Tabelle 15: Register der Video-Timing-Einheit<br />
Eine Besonderheit in der VRAM-Reload-Einheit sind die Register DPYSTRT und DPYNEXT.<br />
Die eigentlichen Register, R DPYSTRT und R DPYNEXT, enthalten aus Gründen der Kompatibilität<br />
zum TI-34020 Bit-Adressen, von denen die unteren fünf Bits null sein müssen. Da für die<br />
VRAM-Reload-Einheit aber die Speicherwort-Adressen (bezogen auf die Speicherbusbreite MBW)<br />
entscheidend sind, wird dort mit diesen gerechnet. Im Diagramm INTER (S. 91) wird dann die<br />
nötige Umsetzung vorgenommen. Somit sind DPYSTRT und DPYNEXT Speicherwort-<br />
Adressen und R DPYSTRT und R DPYNEXT Bit-Adressen.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Register Funktion<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang A.1<br />
Seite 67<br />
DPYSTRT[26:0] Startadresse (Speicherwort-Adresse, s. einleitende Erläuterung) der Bildschirmdaten im<br />
Speicher.<br />
DPYINC[15:0] Länge einer logischen Bildschirmzeile in Speicherworten. Der Wert muß eine Zweierpotenz<br />
oder die Summe zweier Zweierpotenzen sein.<br />
DPYNEXT[26:0] Speicherwort-Adresse (s. einleitende Erläuterung) des ersten Pixels der nächsten Bildschirmzeile.<br />
DPYNEXT wird für Zeile 0 von der Video-Timing-Einheit auf den Wert<br />
von DPYSTRT gesetzt und bei jedem Zeilenwechsel um den Wert von DPYINC erhöht<br />
(vgl. Abschnitt 3.4.1).<br />
DPYNEXT kann nur gelesen werden.<br />
PSIZE[7:0] Farbtiefe eines Pixels in Bits, s. Tabelle 6 (S. 28)<br />
MBW[1:0] Speicherbusbreite in Bits, s. Tabelle 9 (S. 28)<br />
XZ[2:0] Zoom-Faktor für Bildvergrößerung in X-Richtung. Gibt den Teilerfaktor für den Takt an,<br />
der die Pixeldaten aus den Video-RAMs holt. Siehe Tabelle 8 (S. 28).<br />
YX[2:0] Zoom-Faktor für Bildvergrößerung in Y-Richtung. Gibt an, wie oft jede Bildschirmzeile<br />
wiederholt wird. Analog zu Tabelle 8 (S. 28).<br />
RLE: Reload Enable: ’1’ = es werden Reloads durchgeführt<br />
’0’ = es werden keine Reloads durchgeführt<br />
SRE: Split Reload Enable: ’1’ = Split Reloads sind freigegeben<br />
’0’ = Split Reloads sind gesperrt<br />
SRL[1:0] Schieberegister-Länge in Worten, s. Tabelle 7 (S. 28)<br />
RF[2:0] Refresh-Rate in VClk-Zyklen, s. Tabelle 10 (S. 33)<br />
FASTRAM Fast RAM Option: ’1’ = RAS-Pulse haben die Länge von 3 VClk-Zyklen<br />
’0’ = RAS-Pulse haben die Länge von 4 VClk-Zyklen<br />
Tabelle 16: Register der VRAM-Reload-Einheit<br />
Register Funktion<br />
HBW[1:0]: Host Bus Width (Host-Busbreite): ”00”= 8 Bit, ”01”= 16 Bit, ”1x”= 32 Bit<br />
NUBUS: Byte-Anordnung: ’1’ = NUBUS-Konvention, Bytes in der Datenphase vertauscht<br />
’0’ = normale Byte-Anordnung<br />
FASTRDY: schneller Handshake: ’1’ = schnelle Aktivierung des RDY-Signals<br />
’0’ = normaler Handshake<br />
LOCK: Schreibschutz: ’1’ = Schreibschutz für Register CONFIG, MUXOFF und RADSEL<br />
’0’ = kein Schreibschutz<br />
MBW[1:0]: Memory Bus Width (Speicherbusbreite): ”00”= 8 Bit, ”01”= 16 Bit, ”1x”= 32 Bit<br />
RSL[2:0]: RAS Bank Select (Auswahl der Adreßbits, die die RAS-Bank bestimmen),<br />
s. Tabelle 11 (S. 40)<br />
ASL[2:0]: Auxiliary Bank Select (Auswahl der Adreßbits, die die RAM-Ebene bestimmen),<br />
analog zu Tabelle 11 (S. 40)<br />
MOA[2:0]: Lage der RAS-Adreßbits in RAS-Bank 0, vgl. Tabelle 13 (S. 40)<br />
MOB[2:0]: Lage der RAS-Adreßbits in RAS-Bank 1<br />
MOC[2:0]: Lage der RAS-Adreßbits in RAS-Bank 2<br />
MOD[2:0]: Lage der RAS-Adreßbits in RAS-Bank 3<br />
RTO[1:0]: RAS Timeout, maximale Dauer eines RAS-Zyklus im Page Mode, angegeben in Perioden<br />
von HCOUNT:<br />
”00”= 1, ”01”= 2, ”10”= 3, ”11”= 4 Perioden des Horizontalzählers<br />
PEN: Page Mode Enable: ’1’ = Speicherzugriffe im Page Mode<br />
’0’ = kein Page Mode<br />
Tabelle 17: Register der Controller-Einheit
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Register Funktion<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang A.1<br />
Seite 68<br />
COMMAND[7:0]: Kommando-Register, wird vom Host mit dem OP-Code eines Grafikbefehls beschrieben<br />
und von TIM nach dessen Bearbeitung auf den Wert 0 zurückgesetzt.<br />
SSTART[31:0]: Bit-Adresse des ersten Pixels des Quellbildschirms im Speicher. Bit 4...0 müssen null sein.<br />
DSTART[31:0]: Bit-Adresse des ersten Pixels des Zielbildschirms im Speicher. Bit 4...0 müssen null sein.<br />
SINC[15:0]: Abstand zweier beim Quellbildschirm vertikal übereinanderliegender Pixel in Speicherworten<br />
DINC[15:0]: Abstand zweier beim Zielbildschirm vertikal übereinanderliegender Pixel in Speicherworten<br />
SADR[31:0]: Source Address, Startadresse (Pixel-Adresse relativ zum Bildschirmanfang) der Quelldaten<br />
(bei linearer Adressierung)<br />
SYADR[15:0]: Source Address Y, Y-Koordinate der Quelldaten<br />
(bei XY-Adressierung an Stelle des höherwertigen Teils SADR[31:16])<br />
SXADR[15:0]: Source Address X, X-Koordinate der Quelldaten<br />
(bei XY-Adressierung an Stelle des niederwertigen Teils SADR[15:0])<br />
DADR[31:0]: Destination Address, Startadresse (Pixel-Adresse relativ zum Bildschirmanfang) der Zieldaten<br />
(bei linearer Adressierung)<br />
DYADR[15:0]: Destination Address Y, Y-Koordinate der Zieldaten<br />
(bei XY-Adressierung an Stelle des höherwertigen Teils DADR[31:16])<br />
DXADR[15:0]: Destination Address X, X-Koordinate der Zieldaten<br />
(bei XY-Adressierung an Stelle des niederwertigen Teils DADR[15:0])<br />
DX[15:0]: horizontale Bereichsgröße in Pixeln<br />
bei linearen Datenblöcken: niederwertiger Teil der Bereichslänge<br />
DY[15:0]: vertikale Bereichsgröße in Pixeln<br />
bei linearen Datenblöcken: höherwertiger Teil der Bereichslänge<br />
WSTARTX[15:0]: Window Start X, X-Koordinate der linken oberen Ecke eines Fensters für Clip-Befehle<br />
WSTARTY[15:0]: Window Start Y, Y-Koordinate der linken oberen Ecke eines Fensters für Clip-Befehle<br />
WENDX[15:0]: Window End X, X-Koordinate der rechten unteren Ecke eines Fensters für Clip-Befehle<br />
WENDY[15:0]: Window End Y, Y-Koordinate der rechten unteren Ecke eines Fensters für Clip-Befehle<br />
PBV: PixBlT Vertical Direction: ’0’ = Pixel werden von oben nach unten bearbeitet<br />
’1’ = Pixel werden von unten nach oben bearbeitet<br />
PBH: PixBlT Horizontal Direction: ’0’ = Pixel werden von links nach rechts bearbeitet<br />
’1’ = Pixel werden von rechts nach links bearbeitet<br />
S[4:0]: Verknüpfung von Quell- und Zieldaten, s. Tabelle 14 (S. 47)<br />
PATTN000[7:0] bis PATTN1F7[7:0]:<br />
256 Byte RAM für Füllmuster<br />
COLOR0[31:0] bis COLOR3[31:0]:<br />
Farbwerte für die Füllmuster<br />
BMS: Bit Map Size: ’1’ = Füllmuster haben 2 Bit pro Pixel (4 Farben)<br />
’0’ = Füllmuster haben 1 Bit pro Pixel (2 Farben)<br />
PTS[1:0]: Pattern Size, Größe des quadratischen Füllmusters in den PATTN-Registern<br />
”00”= 8∗8 Pixel, ”01”= 16∗16 Pixel, ”1x”= 32∗32 Pixel<br />
PSIZE[5:0]: Pixel Size, Farbtiefe eines Pixels in Bit, s. Tabelle 6 (S. 28)<br />
Tabelle 18: Register der Prozessor-Einheit
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Übersicht über die externen Signale<br />
Anhang A.2<br />
Seite 69<br />
Die externen Signale des Grafikprozessors werden in der Spezifikation [1] und im Text dieser Arbeit<br />
ausführlich erläutert. Die Tabellen 19, 20 und 21 enthalten Übersichten, wiederum gegliedert nach<br />
den funktionalen Einheiten. Die Prozessor-Einheit verfügt nicht über eigene Chip-externe Signale,<br />
da alle Speicherzugriffe von der Controller-Einheit durchgeführt werden.<br />
Die Speicherbus-Signale der VRAM-Reload-Einheit (XXX itv) werden mit den entsprechenden<br />
Signalen der Controller-Einheit (XXX ict) und-verknüpft, bevor sie zum Speicherbus gehen. Auf<br />
diese Weise können beide Einheiten zeitlich alternierend auf die RAMs zugreifen. Voraussetzung<br />
hierfür ist, daß die jeweils inaktive Einheit alle Signale auf ’1’ setzt.<br />
Signal Richtung, aktiver Pegel, Funktion<br />
HSYNC: i/o – horizontales Synchronisations-Signal<br />
VSYNC: i/o – vertikales Synchronisations-Signal<br />
CSYNC: i/o – gemeinsames Synchronisations-Signal<br />
CBLANK: out – Dunkeltastung des Bildes<br />
VClk: in + Video Clock (Video-Takt)<br />
Tabelle 19: Signale der Video-Timing-Einheit<br />
Signal Richtung, aktiver Pegel, Funktion<br />
RCA itv[13:0]: out + Row/Column Address (RAM-Adresse)<br />
RAS itv[3:0]: out – Row Address Strobe (Zeilenadresse gültig, Auswahl der RAS-Bank)<br />
CAS itv[3:0]: out – Column Address Strobe (Spaltenadresse gültig, Byte-Auswahl)<br />
MWE itv: out – Memory Write Enable (Freigabe für Schreibzugriff)<br />
MOE itv: out – Memory Output Enable (Freigabe für Lesezugriff)<br />
MSF itv: out + Memory Special Function (Auswahl von Spezialfunktionen)<br />
ACS itv[3:0]: out – Auxiliary Chip Select (Auswahl der RAM-Ebene)<br />
VClk: in + Video Clock (Video-Takt, s. Abschnitt 4.3)<br />
LD: out + Load (Pixel-Takt, s. Abschnitt 4.3)<br />
MSC: out + Memory Shift Clock (Datenwort-Takt, s. Abschnitt 4.3)<br />
Tabelle 20: Signale der VRAM-Reload-Einheit
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Signal Richtung, aktiver Pegel, Funktion<br />
AD[31:0]: i/o + Host-Bus, (Adreßbus bzw. gemultiplexter Adreß- und Datenbus)<br />
HD[31:0]: i/o + Host-Datenbus<br />
BS[3:0]: in – Byte Select (Datenbyte-Maske)<br />
RS: in – Register Select (kennzeichnet einen Registerzugriff)<br />
HWE: in – Host Write Enable (kennzeichnet einen Schreibzugriff)<br />
AS: in – Address Strobe (Adresse gültig)<br />
DS: in – Data Strobe (Daten gültig)<br />
RDY: out +/– Ready (Freigabe für Ende des Host-Zugriffs), Open-Drain-Signal<br />
Wird während des Resets gelesen, um den inaktiven Pegel zu ermitteln.<br />
INT: out – Interrupt-Anforderung (Open-Drain-Signal)<br />
MUX: in – Muxed Bus Select (’0’=gemultiplexter Host-Bus)<br />
RCA ict[13:0]: out + Row/Column Address (RAM-Adresse)<br />
MD ict[31:0]: i/o + Speicher-Datenbus<br />
RAS ict[3:0]: out – Row Address Strobe (Zeilenadresse gültig, Auswahl der RAS-Bank)<br />
CAS ict[3:0]: out – Column Address Strobe (Spaltenadresse gültig, Byte-Auswahl)<br />
MWE ict: out – Memory Write Enable (Freigabe für Schreibzugriff)<br />
MOE ict: out – Memory Output Enable (Freigabe für Lesezugriff)<br />
MSF ict: out + Memory Special Function (Auswahl von Spezialfunktionen)<br />
ACS ict[3:0]: out – Auxiliary Chip Select (Auswahl der RAM-Ebene)<br />
MClk: in + Master Clock (Systemtakt)<br />
RESET: in – Reset<br />
Tabelle 21: Signale der Controller-Einheit<br />
Anhang A.2<br />
Seite 70
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 35: Beim “Read Cycle” und beim “Write Cycle” [9] (Lese- bzw. Schreib-Zugriff) wird in einem<br />
RAS-CAS-Zyklus erst die Speicherzeile und dann die Spalte übergeben.<br />
Anhang B<br />
Seite 71
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 36: Beim “Fast Page Mode Read Cycle” und beim “Fast Page Mode Write Cycle” [9] erfolgen<br />
in einem RAS-Zyklus mehrere Zugriffe auf Daten aus einer Speicherzeile.<br />
Anhang B<br />
Seite 72
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 37: Beim “Fast Page Mode Read-Modify-Write Cycle” [9] erfolgen in einem RAS-Zyklus gemischte<br />
Lese- und Schreibzugriffe auf Daten aus einer Speicherzeile.<br />
Anhang B<br />
Seite 73
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 38: Der “Read Transfer Cycle” [11] lädt das ganze Schieberegister. Er wird beim Newline Reload<br />
verwendet.<br />
Anhang B<br />
Seite 74
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 39: Der “Real Time Read Transfer Cycle” [11] wird beim Midline Reload nötig. Die steigende<br />
Flanke des MOE-Signals (DT/OE) bestimmt den Zeitpunkt des Reloads.<br />
Anhang B<br />
Seite 75
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang B<br />
Seite 76<br />
Abbildung 40: Der “Split Read Transfer Cycle” [11] lädt nur eine Hälfte des Schieberegisters. Er wird<br />
beim Split Midline Reload durchgeführt, während gleichzeitig Daten aus der anderen SR-Hälfte ausgegeben<br />
werden.
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 41: Der “CAS Before RAS Refresh Cycle” [11] löst einen Refresh einer Speicherzeile aus, deren<br />
Zeilennummer über einen RAM-internen Zähler automatisch erzeugt wird.<br />
Anhang B<br />
Seite 77
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
VIDEO<br />
INTER RELOAD<br />
VRAM<br />
SYNC<br />
RELOAD<br />
VRAM_4_258<br />
SYNC<br />
RL_MSC RL_CALC RL_REFRESH RL_ARBIT<br />
RL_RAM<br />
VR_SAM VR_ATTR<br />
VR_RAM<br />
S_HCNT S_VCNT CSYNC<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
REFRESH<br />
SPLIT_MLR<br />
NEWL_REL<br />
MIDL_REL<br />
TRANSFER<br />
READ_WRITE<br />
REFRESH<br />
SPLIT_MLR<br />
NEWL_REL<br />
MIDL_REL<br />
TRANSFER<br />
READ_WRITE<br />
Anhang C.1<br />
Seite 78<br />
Abbildung 42: Hierarchie der Video-Timing- und VRAM-Reload-Einheit (Design ” VIDEO“) mit Seitenangaben
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¥¢¢¢¡ ©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡©¢¢¢¡<br />
©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡¥¢¡ ©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡¥¢¡<br />
©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡¥©¢¡ ©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¥©¢¡<br />
©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡¥©¢¡ ©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡¢¡<br />
©¢<br />
¢¡¢£¥¤§¦©¨¢£¢¦¢¡©¥¢¡<br />
¦¥£¢¦¤£¢¦©¦©¡§¢¢<br />
¦¥£¢¦¥¤£¢¦©¦©¡§¢§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢¥¢<br />
¦¥£¢¦¤£¢¦©¦©¡§¢<br />
¦¥£¢¦¤£¢¦©¦©¡§©¢<br />
£¥¤£¨¥£<br />
£¨¥¡¦ <br />
£¨¥¡ ¢¡¡¦¢¦<br />
¢¡£¦<br />
<br />
£¨¥¡¦¦©©¤§¦¡¦¢¦<br />
£¥¤¡¥¢¡£¢¦©¨ ¢<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
¥ ¡¦ ¡¦¢¡ ¥<br />
©¥<br />
¡¦ ¡¦¢¡ ¥<br />
¢©§ ¡¦ ¡¦¢¡ ¥<br />
¥<br />
¡¦ ¡¦¢¡ ¥<br />
©§ ¡¦ ¡¦¢¡ ¥<br />
©©§<br />
£ £¢¡ ¥<br />
¥ £ £¢¡ ¥<br />
©¥<br />
£ £¢¡ ¥<br />
©¥ ¡ ¡¦¢¡ ¥<br />
¥<br />
¡ ¡¦¢¡ ¥<br />
¥ ¡ ¡¦¢¡ ¥<br />
¥<br />
£¥¤ <br />
¡¦¢ ¡¦¢¡ ¥<br />
¡ ¡¦¢¡ ¥<br />
<br />
£ £¢¡ ¥<br />
¢ ¡¦ ¡¦¢¡ ¥<br />
<br />
¢¤§¦©£¦¤ <br />
¥¥§ £¢¡ ¥<br />
<br />
©¢¥ £¢¡ ¥<br />
¢¥¥ £¢¡ ¥<br />
<br />
¢© £¢¡ ¥<br />
©© £¢¡ ¥<br />
<br />
¢§ £¢¡ ¥<br />
¢¥ £¢¡ ¥<br />
<br />
©§¥ £¢¡ ¥<br />
<br />
©¥¥ £¢¡ ¥<br />
©© £¢¡ ¥<br />
<br />
© £¢¡ ¥<br />
¢§ £¢¡ ¥<br />
<br />
©¢ ¢£¢¡ ¥<br />
¥ £¢¡ ¥<br />
<br />
¥ ¥ £¢¡ ¥<br />
¥ ¥ £¢¡ ¥<br />
<br />
¥©¢§ © £¢¡ ¥<br />
©¢ £¢¡ ¥<br />
<br />
£¢¡ ¥<br />
£¢¡ ¥<br />
<br />
£¢¡ ¥<br />
<br />
£¢¡ ¥<br />
©¢ £¢¡ ¥<br />
<br />
¥¢ £¢¡ ¥<br />
<br />
£¢¡ ¥<br />
© £¢¡ ¥<br />
<br />
£¢¡ ¥<br />
<br />
¥ £¢¡ ¥<br />
¥ ¢ £¢¡ ¥<br />
<br />
¢¤§¦©¡¦¢¦¤ <br />
¢¢¢¥ ¡¦¢¡ ¥<br />
¢¢¢¥ ¡¦¢¡ ¥<br />
<br />
¢¢¢¥ © ¡¦¢¡ ¥ ¤§©¡¦ ¢¡£¢¦©¤<br />
¢¢¢¥ © ¡¦¢¡ ¥<br />
<br />
¢¡¦¢¡ ¥<br />
¡¦¢¡ ¥<br />
<br />
£¥¤¡¦©§£© ¦¥¢¡¢£¥¤<br />
<br />
¥© £ £¢¡ ¥<br />
¡¦ ¡¦¢¡ ¥<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
¢£ £¢¡ ¥<br />
<br />
£¥¤¡¦©©¤§¦¤¡¢£©<br />
<br />
©¨©¤¡¦¥ ¡¦¢¡ ¥ ¤©¥ ¦¥¢<br />
¢ ¡¦ ¡¦¢¡ ¥<br />
<br />
¡¢¢¢ <br />
¡¦© ¡¦¢¡ ¥ ¤§©¡¦¥¢¡£<br />
¥ £¢¡ ¥<br />
¥<br />
¦©©¤§¦¥¨¦¦©£¤ ¦¥¢¡¢£<br />
£¡§£© ¦¥¢¡¢£ <br />
¦¡¦ ¡¦¢¡ ¥<br />
¡¡¦ ¡¦¢¡ ¥<br />
<br />
¡¡¦ ¡¦¢¡ ¥<br />
¦¡¦ ¡¦¢¡ ¥<br />
<br />
¡¡¦ ¡¦¢¡ ¥<br />
© £¨¡¦ ¡¦¢¡ ¥<br />
<br />
©¢© ¡¦ ¡¦¢¡ ¥<br />
<br />
© ¡¦ ¡¦¢¡ ¥<br />
© ¡¦ ¡¦¢¡ ¥<br />
<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
¡¦ ¡¦¢¡ ¥<br />
<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
¡¦¥¡¦¢¡ ¥<br />
<br />
¡¦¥¡¦¢¡ ¥<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
§<br />
§©¢<br />
¡¦¡¦¢¡ ¥<br />
§©¢ ¡¦ ¡¦¢¡ ¥<br />
<br />
¡¦¡¦¢¡ ¥<br />
§<br />
©§ ¡¦ ¡¦¢¡ ¥<br />
¢ ¡¦ ¡¦¢¡ ¥<br />
<br />
¡¡¦ ¡¦¢¡ ¥<br />
¢<br />
<br />
¡¡¦ ¡¦¢¡ ¥<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
§© ¡¦ ¡¦¢¡ ¥<br />
§©<br />
¡¦ ¡¦¢¡ ¥<br />
¢ ¡¦¥ ¡¦¢¡ ¥<br />
§©<br />
¦©©¤§¦¡¦¢¦¤ <br />
£¢¦¡¦ ¡¦¢¡ ¥ ¤§¥§¦¢ ¢¡£¢¦©<br />
<br />
<br />
¡¡¦ ¡¦¢¡ ¥ ¤§¥§¦¢¤§¦©¢¡<br />
<br />
¡¦¥ ¡¦¢¡ ©¢ ¤ <br />
<br />
<br />
¡¦¥ ¡¦¢¡ ©¢ ¤ <br />
¡¦¥ ¡¦¢¡ ¥ ¤ <br />
<br />
¡¦¥ ¡¦¢¡ ¥ ¤ <br />
<br />
Anhang C.2<br />
Seite 79<br />
§© ¡¦ ¡¦¢¡ ¥ §©<br />
<br />
<br />
¡¦ ¡¦¢¡ ¥ ¢¡ ¥¦©¡¥¢¨¦¥¢¡¢£¥¤¥<br />
¢ ¡¦ ¡¦¢¡ ¥ ¢¡¢©£ ¥¦©¡¥¢¨¦¥¢¡¢£¥¤¥<br />
<br />
¡¦ ¡¦¢¡ ¥ ¢¡ ¢¨¡¥¢¨¦¥¢¡¢£¥¤¥<br />
<br />
¢ ¡¦ ¡¦¢¡ ¥ ¢¡¢©£¢¨¡¥¢¨¦¥¢¡¢£¥¤¥<br />
<br />
<br />
¢ ¡¦¢¡¦¢¡ ¥ ¢¡¢©£¤¢ ¦<br />
¢ ¡¦¢ ¡¦¢¡ ¥ ¥¦©¥¨©¤ ¢ <br />
<br />
§ ¡¦¢¡¦¢¡ ¥ ¥¦©¨¦©¨<br />
<br />
¢¡¢£¢¦¥¢¡¤¢¢¢£¨¤<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
¡¦ ¡¦¢¡ ¥<br />
¢<br />
¡¦¥ ¡¦¢¡ ¥<br />
§ ¡¦¥ ¡¦¢¡ ¥<br />
<br />
§ ¡¦ ¡¦¢¡ ¥ ¡©¦¤<br />
¡¦ ¡¦¢¡ ¥<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
¡¦ ¡¦¢¡ ¥<br />
¥¢<br />
¢¢¡¨¢¡ ¤¢¢¢£¨¤<br />
<br />
¡¦ ¡¦¢¡ ¥<br />
§©©¥ ¡¦©¡¦¢¡ ¥<br />
¢¥<br />
¥¥ ¡¦¡¦¢¡ ¥<br />
§ ¡¦©¡¦¢¡ ¥<br />
<br />
¡¦©¡¦¢¡ ¥<br />
<br />
§<br />
¥¥¢¡¦ ¡¦¢¡ ¥<br />
<br />
¢¡¦ ¡¦¢¡ ¥<br />
Abbildung 43 (zweispaltig): Typen, Konstanten und externe Signale im Design ” VIDEO“
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diagram Variables:<br />
-- Variables of Diagram VIDEO<br />
-- registers<br />
HCOUNT: int16:=0;<br />
VCOUNT: int16:=0;<br />
HTOTAL: int16:=0;<br />
HESYNC: int16:=0;<br />
HSBLNK: int16:=0;<br />
HEBLNK: int16:=0;<br />
HESERR: int16:=0;<br />
VTOTAL: int16:=0;<br />
VESYNC: int16:=0;<br />
VSBLNK: int16:=0;<br />
VEBLNK: int16:=0;<br />
LINTV: int16:=0;<br />
SETHCNT:int16:=0;<br />
SETVCNT:int16:=0;<br />
DPYSTRT: int27:=0; -- hi 27 bits, lo 5 bits=0<br />
DPYHELP(27): logic; -- equals DPYSTRT(31 downto 5)<br />
DPYINC: int27:=0; -- hi 27 bits, lo 5 bits=0<br />
YZ(3): logic:="000"; -- Y zoom factor<br />
XZ(3): logic:="000"; -- X zoom factor<br />
RLE: logic:=’0’; -- reload enable<br />
SRE: logic:=’0’; -- split reload enable<br />
SRL(2): logic:="00"; -- shift reg length<br />
MBW(2): logic:="00"; -- memory bus width<br />
NTSC: logic:=’0’; -- ’1’=NTSC, ’0’=PAL<br />
ILE: logic:=’0’; -- interlaced enable<br />
VEN: logic:=’0’; -- video enable<br />
TEST: logic:=’0’; -- ’1’: counter test<br />
CSD: logic:=’0’; -- CSYNC direction<br />
HSD: logic:=’0’; -- HSYNC direction<br />
VSD: logic:=’0’; -- VSYNC direction<br />
RF(3): logic:="000"; -- refresh rate<br />
FASTRAM:logic:=’0’; -- ’1’=perform fast RAS cycles<br />
DPYNEXT: int27:=0; -- hi 27 bits, lo 5 bits=0<br />
DPYNEXTV(27): logic;<br />
-- reload control interface<br />
MLRAT10: logic:=’0’; -- attent.: midl. rel. -10<br />
MLRAT6: logic:=’0’; -- attent.: midl. rel. -6<br />
HC_MLR10: int16:=0; -- HCOUNT value at rel -10<br />
HC_MLR6: int16:=0; -- HCOUNT value at rel -6<br />
HC_MEN10: logic:=’0’; -- ’1’=enable HC_MLR10<br />
HC_MEN6: logic:=’0’; -- ’1’=enable HC_MLR6<br />
RELOAD: logic:=’0’; -- 1=do line end reload<br />
RELAT10: logic:=’0’; -- attent.: newl. rel. -10<br />
RELAT6: logic:=’0’; -- attent.: newl. rel. -6<br />
RELAREA: logic:=’0’;<br />
MSC_reload: logic:=’1’; -- ’0’: pulse after reload<br />
Clk_Div: logic; -- ’0’: MSC = VClk<br />
-- video components<br />
HBLANK: logic:=’0’;<br />
VBLANK: logic:=’0’;<br />
-- VRAM internal control signals<br />
RCA_itv(12): logic:=hi12;<br />
DIN_itv(32): logic:=hi32;<br />
MOE_itv: logic:=’1’;<br />
MWE_itv: logic:=’1’;<br />
MSF_itv: logic:=’0’;<br />
RAS_itv(4): logic:="1111";<br />
CAS_itv(4): logic:="1111";<br />
MSC_itv: logic;<br />
LD_itv: logic;<br />
-- substitutes for ’changing (for diagram SYNC)<br />
HSin_old: logic:=’1’;<br />
HSin_new: logic:=’1’;<br />
VSin_old: logic:=’1’;<br />
VSin_new: logic:=’1’;<br />
CSin_old: logic:=’1’;<br />
CSin_new: logic:=’1’;<br />
ILE_last: logic:=’0’;<br />
CSD_last: logic:=’0’;<br />
HSD_last: logic:=’0’;<br />
VSD_last: logic:=’0’;<br />
HTOTAL_last: int16:=0;<br />
VTOTAL_last: int16:=0;<br />
Abbildung 44: Variablen im Diagramm VIDEO<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 80
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
SYNC<br />
SYNC<br />
C: RESET_in=’0’<br />
T3<br />
T2<br />
C: RESET_in=’1’<br />
or ILE/=ILE_last<br />
or CSD/=CSD_last<br />
or HSD/=HSD_last<br />
or VSD/=VSD_last<br />
or HTOTAL/=HTOTAL_last<br />
or VTOTAL/=VTOTAL_last<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
entry<br />
T4<br />
reset<br />
Entry of <br />
A: CSYNC_out:=’1’;<br />
HSYNC_out:=’1’;<br />
VSYNC_out:=’1’;<br />
HBLANK :=’0’;<br />
VBLANK :=’0’;<br />
Abbildung 45: Speedchart-Diagramm VIDEO/SYNC<br />
VRAM<br />
VRAM<br />
C: RESET_in=’0’<br />
T3<br />
T2<br />
C: RESET_in=’1’<br />
entry<br />
T4<br />
reset<br />
Abbildung 47: Speedchart-Diagramm VIDEO/VRAM<br />
Anhang C.2<br />
Seite 81<br />
Diagram Variables:<br />
-- Variables of Diagram SYNC<br />
-- video timing control<br />
VCNEXT: int16;<br />
ODD: logic:=’0’;<br />
IPhase(3): logic:="000";<br />
YZOOMST: int7;<br />
YZOOMCNT: int7:=0;<br />
VLINE: int16:=0xFFFF;<br />
HS_Wait: logic;<br />
HS_Coming: logic;<br />
Line_Change: logic;<br />
HS_Enable: logic:=’1’;<br />
VS_Wait: logic;<br />
CS_Coming: logic:=’0’;<br />
VS_Coming: logic;<br />
CS_Start: int16:=0;<br />
Next_odd: logic:=’0’;<br />
Abbildung 46: Variablen im Diagramm VIDEO/SYNC<br />
RELOAD<br />
RELOAD<br />
C: RESET_in=’0’<br />
T3<br />
T2<br />
C: RESET_in=’1’<br />
entry<br />
T4<br />
reset<br />
Abbildung 48: Speedchart-Diagramm VIDEO/RELOAD
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
S_HCNT<br />
entry<br />
A: HCOUNT :=0;<br />
HSYNC_out:=’0’;<br />
CSYNC_out:=’0’;<br />
VLINE :=0xFFFF;<br />
RELAREA :=’0’;<br />
HS_Enable:=’1’;<br />
HBLANK :=’0’;<br />
T1<br />
T4 #1<br />
T2 #2<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
C: HS_Wait=’1’ and HCOUNT=HTOTAL<br />
S1<br />
T3 #0<br />
C: HS_Coming=’1’<br />
A: HCOUNT:=SETHCNT;<br />
HSYNC_out:=’0’;<br />
HS_Enable:=’0’;<br />
CSYNC_out:=’0’;<br />
HBLANK :=’0’;<br />
A: -- HCOUNT, start HSYNC<br />
if HCOUNT=HTOTAL then<br />
HCOUNT:=0; -- reset counter<br />
HSYNC_out:=’0’; -- start sync<br />
HS_Enable:=’0’; -- ignore CSYNC_in<br />
else<br />
HCOUNT:=(HCOUNT+257) mod 65536<br />
when TEST=’1’ and HCOUNT mod 256/=255<br />
else (HCOUNT+1) mod 65536; -- count up<br />
end if;<br />
-- end HSYNC<br />
if HCOUNT=HESYNC then<br />
HSYNC_out:=’1’; -- end sync<br />
end if;<br />
-- start HBLANK<br />
if HCOUNT=HSBLNK then<br />
HBLANK:=’0’; -- start blank<br />
HS_Enable:=’1’; -- accept CSYNC_in<br />
-- initialize DPYNEXT and YZOOMCNT at start of field<br />
if (ILE=’0’ and VCOUNT=VEBLNK) -- noninter line 0<br />
or (ILE=’1’ and ODD=’0’ and VCOUNT=VEBLNK-1) then -- evenfield line 0<br />
VLINE:=0;<br />
RELAREA:=’1’;<br />
DPYNEXT:=DPYSTRT;<br />
RELOAD:=’1’;<br />
if ILE=’1’ then<br />
YZOOMCNT:=YZOOMST shr 1;<br />
else<br />
YZOOMCNT:=YZOOMST;<br />
end if;<br />
elsif ILE=’1’ and ODD=’1’ and VCOUNT=VEBLNK then -- oddfield line 1<br />
VLINE:=1;<br />
RELAREA:=’1’;<br />
if YZ="000" then<br />
DPYNEXT:=(DPYSTRT+DPYINC) mod 0x8000000;<br />
else<br />
DPYNEXT:=DPYSTRT;<br />
end if;<br />
RELOAD:=’1’;<br />
YZOOMCNT:=YZOOMST shr 1;<br />
-- end of field<br />
elsif VCOUNT=VSBLNK -- last line<br />
or (ILE=’1’ and ODD=’1’ and VCOUNT=VSBLNK+1) then -- last line ILE ODD<br />
VLINE:=0xFFFF;<br />
RELAREA:=’0’;<br />
-- in the field: increment DPYNEXT<br />
elsif RELAREA=’1’ then<br />
VLINE:=(VLINE+1) mod 65536 when ILE=’0’ -- next line noninter<br />
else (VLINE+2) mod 65536; -- next line interlaced<br />
RELOAD:=’1’;<br />
if YZOOMCNT=0 then<br />
if ILE=’1’ then<br />
YZOOMCNT:=YZOOMST shr 1;<br />
if YZ="000" then<br />
DPYNEXT:=(DPYNEXT+(DPYINC shl 1)) mod 0x8000000;-- line +2 ILE<br />
else<br />
DPYNEXT:=(DPYNEXT+DPYINC) mod 0x8000000; -- line +1 ILE zoom<br />
end if;<br />
else<br />
YZOOMCNT:=YZOOMST;<br />
DPYNEXT:=(DPYNEXT+DPYINC) mod 0x8000000; -- line +1 NI<br />
end if;<br />
else<br />
YZOOMCNT:=(YZOOMCNT+127) mod 128; -- repeat last line<br />
end if;<br />
end if;<br />
-- end HBLANK<br />
elsif HCOUNT=HEBLNK then<br />
RELOAD:=’0’;<br />
HBLANK:=’1’; -- end blank<br />
RELAT10:=’0’;<br />
RELAT6:=’0’;<br />
else<br />
RELOAD:=’0’;<br />
end if;<br />
-- reload attention<br />
if (ILE=’0’<br />
and (VCOUNT=VEBLNK<br />
or (RELAREA=’1’ and VCOUNT/=VSBLNK))) -- line preceding reload<br />
or (ILE=’1’<br />
and ((ODD=’0’ and VCOUNT=VEBLNK-1)<br />
or (ODD=’1’ and VCOUNT=VEBLNK)<br />
or (RELAREA=’1’ and VCOUNT/=VSBLNK and<br />
(ODD=’0’ or VCOUNT/=VSBLNK+1)))) then<br />
if HCOUNT=(HSBLNK+65526) mod 65536 then -- HSBLANK-10 reload att.<br />
RELAT10:=’1’;<br />
end if;<br />
if HCOUNT=(HSBLNK+65530) mod 65536 then -- HSBLANK-6 reload att.<br />
RELAT6:=’1’;<br />
end if;<br />
end if;<br />
-- start CSYNC<br />
if HCOUNT=HTOTAL -- start hs/eq/serr<br />
or (HCOUNT=HTOTAL shr 1 and ILE=’1’ -- midline eq/serr<br />
and ((IPhase(2)=’0’ and VCOUNT/=(VESYNC shr 1) + VTOTAL - VSBLNK)<br />
-- midline csync in eq1/serr/eq2 but not when starting posteq.<br />
or (IPhase="111" and ODD=’1’ and VCOUNT=VSBLNK))) then<br />
-- midline csync when starting eq1<br />
CSYNC_out:=’0’; --> start csync<br />
end if;<br />
-- end CSYNC<br />
if (IPhase(2 downto 1)="11" and HCOUNT=HESYNC) -- end hsync<br />
or (IPhase(2 downto 1)="01" -- end equalization<br />
and (HCOUNT=HESYNC shr 1<br />
or (ILE=’1’ and HCOUNT=((HTOTAL+1) shr 1) + (HESYNC shr 1))))<br />
or (IPhase(2 downto 1)="00" -- end serration<br />
and (HCOUNT=HESERR or HCOUNT=(HTOTAL+1) shr 1 + HESERR)) then<br />
CSYNC_out:=’1’; --> end csync<br />
end if;<br />
Abbildung 49: Speedchart-Diagramm VIDEO/SYNC/S HCNT<br />
Anhang C.2<br />
Seite 82
Abbildung 50: Speedchart-Diagramm VIDEO/SYNC/S VCNT<br />
S_VCNT<br />
C: ILE=’0’<br />
A: VCOUNT:=0;<br />
IPhase:="000"; -- serration<br />
VSYNC_out:=’0’;<br />
VBLANK:=’0’;<br />
C: VS_Coming=’1’ or<br />
CS_Coming=’1’<br />
A: VCOUNT:=SETVCNT;<br />
VSYNC_out:=’0’;<br />
IPhase :="000";<br />
VBLANK :=’0’;<br />
T1 #0<br />
T3 #0 noninter T4 #1<br />
T2 #2<br />
C: Line_Change=’1’<br />
A: if VCOUNT=VTOTAL then<br />
VCOUNT:=0;<br />
else<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
entry<br />
C: VS_Wait=’1’ and<br />
VCOUNT=VTOTAL<br />
if VCOUNT=VTOTAL then<br />
VSYNC_out:=’0’; -- start sync<br />
IPhase:="000";<br />
elsif VCOUNT=VESYNC shr 1 then<br />
VSYNC_out:=’1’; -- end sync<br />
IPhase:="111";<br />
end if;<br />
if VCOUNT=VSBLNK then<br />
VBLANK:=’0’; -- start blank<br />
elsif VCOUNT=VEBLNK then<br />
VBLANK:=’1’; -- end blank<br />
end if;<br />
T8 #1<br />
A: -- C: ILE=’1’<br />
VCOUNT:=0;<br />
IPhase:="000"; -- serration<br />
VSYNC_out:=’0’;<br />
VBLANK:=’0’;<br />
C: VS_Wait=’1’ and<br />
VCOUNT=VTOTAL<br />
Entry of <br />
A: ODD:=’1’;<br />
T7 #1<br />
odd_field<br />
T9 #3<br />
T15 #0<br />
C: VS_Coming=’1’ or<br />
CS_Coming=’1’<br />
C: Line_Change=’1’ or HCOUNT=HTOTAL shr 1<br />
A: case IPhase is<br />
when "000" => -- serration<br />
VCOUNT:=VCNEXT;<br />
if VCOUNT=VESYNC shr 1 then<br />
IPhase:="011"; -- equaliz. II<br />
VSYNC_out:=’1’;<br />
end if;<br />
when "011" => -- equaliz. II<br />
if VCOUNT=(VESYNC shr 1)<br />
+ VTOTAL - VSBLNK then<br />
IPhase:="110"; -- picture I<br />
if NTSC=’1’ then<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
else<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
when "110" => -- picture I<br />
if Line_Change=’1’ then<br />
VCOUNT:=VCNEXT;<br />
if VCOUNT=VEBLNK then<br />
IPhase:="111"; -- picture II<br />
VBLANK:=’1’;<br />
end if;<br />
end if;<br />
when "111" => -- picture II<br />
if VCOUNT=VSBLNK then<br />
IPhase:="010"; -- equaliz. I<br />
VBLANK:=’0’;<br />
VCOUNT:=VCNEXT;<br />
elsif Line_Change=’1’ then<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
when others => -- equaliz. I<br />
VCOUNT:=VCNEXT;<br />
end case;<br />
Entry of <br />
A: VCOUNT:=SETVCNT;<br />
IPhase:="000"; -- serration<br />
VSYNC_out:=’0’;<br />
C: (CS_Coming=’1’ and Next_odd=’1’) or<br />
A: -- C: (CS_Coming=’1’ and Next_odd=’0’) or<br />
(VS_Coming=’1’ and<br />
-- (VS_Coming=’1’ and<br />
(HBLANK=’0’ xor NTSC=’0’))<br />
-- (HBLANK=’1’ xor NTSC=’0’))<br />
T11 #0<br />
next_field<br />
T13 #1<br />
T6 #2<br />
T5 #2<br />
T14 #0<br />
C: VS_Coming=’1’ or<br />
CS_Coming=’1’<br />
C: (Line_Change=’1’ or HCOUNT=HTOTAL shr 1)<br />
and VCOUNT=VTOTAL<br />
A: VCOUNT:=0;<br />
IPhase:="000"; -- serration<br />
VSYNC_out:=’0’;<br />
C: (Line_Change=’1’ or HCOUNT=HTOTAL shr 1)<br />
and VCOUNT=VTOTAL<br />
A: VCOUNT:=0;<br />
IPhase:="000"; -- serration<br />
VSYNC_out:=’0’;<br />
even_field<br />
T10 #3<br />
Entry of <br />
A: ODD:=’0’;<br />
C: VS_Wait=’1’ and<br />
VCOUNT=VTOTAL<br />
T12 #1<br />
C: Line_Change=’1’ or HCOUNT=HTOTAL shr 1<br />
A: case IPhase is<br />
when "000" => -- serration<br />
VCOUNT:=VCNEXT;<br />
if VCOUNT=VESYNC shr 1 then<br />
IPhase:="011"; -- equaliz. II<br />
VSYNC_out:=’1’;<br />
end if;<br />
when "011" => -- equaliz. II<br />
if VCOUNT=(VESYNC shr 1)<br />
+ VTOTAL - VSBLNK then<br />
IPhase:="110"; -- picture I<br />
else<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
when "110" => -- picture I<br />
if VCOUNT=VEBLNK then<br />
IPhase:="111"; -- picture II<br />
VBLANK:=’1’;<br />
VCOUNT:=VCNEXT;<br />
elsif Line_Change=’1’ then<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
when "111" => -- picture II<br />
if Line_Change=’1’ then<br />
VCOUNT:=VCNEXT;<br />
if VCOUNT=VSBLNK then<br />
IPhase:="010"; -- equaliz. I<br />
VBLANK:=’0’;<br />
VCOUNT:=VCNEXT;<br />
end if;<br />
end if;<br />
when others => -- equaliz. I<br />
VCOUNT:=VCNEXT;<br />
end case;<br />
Subdiag Actions of <br />
A: -- VCNEXT: next VCOUNT value<br />
VCNEXT:=(VCOUNT+257) mod 65536<br />
when TEST=’1’ and VCOUNT mod 256/=255<br />
else (VCOUNT+1) mod 65536;<br />
-- HS_Coming: 1=SYNC_in coming at line end<br />
HS_Coming:=’1’ when (HSin_new=’0’ and HSin_old=’1’<br />
and VSD=’0’ and HSD=’0’)<br />
or (VSin_new=’0’ and VSin_old=’1’<br />
and VSD=’0’ and HSD=’1’<br />
and CSD=’1’ and ILE=’0’)<br />
or (CSin_new=’0’ and CSin_old=’1’<br />
and CSD=’0’<br />
and (VSD=’1’ or HSD=’1’)<br />
and HS_Enable=’1’)<br />
else ’0’;<br />
-- HS_Wait: 1=wait for SYNC_in at line end<br />
HS_Wait:=’1’ when (VSD=’0’ and HSD=’0’)<br />
or CSD=’0’<br />
or (VSD=’0’ and HSD=’1’ and CSD=’1’<br />
and ILE=’0’ and VCOUNT=VTOTAL)<br />
else ’0’;<br />
-- Line_Change: 1=line change / HSYNC start<br />
Line_Change:=’1’ when (HCOUNT=HTOTAL and HS_Wait=’0’)<br />
or HS_Coming=’1’<br />
else ’0’;<br />
-- VS_Wait: 1=wait for SYNC_in at field end<br />
VS_Wait:=’1’ when (VSD=’0’ and HSD=’0’)<br />
or CSD=’0’<br />
or (VSD=’0’ and HSD=’1’ and CSD=’1’<br />
and ILE=’0’)<br />
else ’0’;<br />
-- VS_Coming: 1=VSYNC_in coming<br />
VS_Coming:=’1’ when VSin_new=’0’ and VSin_old=’1’<br />
and VSD=’0’<br />
and (HSD=’0’ or (CSD=’1’ and ILE=’0’))<br />
else ’0’;<br />
-- YZOOMST: start value for YZOOM countdown counter<br />
case YZ is<br />
when "000" => YZOOMST:=000;<br />
when "001" => YZOOMST:=001;<br />
when "010" => YZOOMST:=003;<br />
when "011" => YZOOMST:=007;<br />
when "100" => YZOOMST:=015;<br />
when "101" => YZOOMST:=031;<br />
when "110" => YZOOMST:=063;<br />
when "111" => YZOOMST:=127;<br />
end case;<br />
-- test outputs<br />
IPhase_ot :=IPhase;<br />
ODD_ot :=ODD;<br />
VLINE_ot :=VLINE mod 256;<br />
VS_Wt_ot :=VS_Wait;<br />
CS_Com_ot :=CS_Coming;<br />
VS_Com_ot :=VS_Coming;<br />
CS_St_ot :=CS_Start mod 65536;<br />
Nodd_ot :=Next_odd;<br />
HS_Ena_ot :=HS_Enable;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 83
Abbildung 51: Speedchart-Diagramm VIDEO/SYNC/CSYNC<br />
CSYNC<br />
entry<br />
T1<br />
wait_sync<br />
T15<br />
C: IPHASE/="000"<br />
T11 C: CSin_new=’1’<br />
C: CSin_new=’0’ and<br />
CSD=’0’ and<br />
(VSD=’1’ or HSD=’1’)<br />
T13<br />
CS_lo<br />
T2 T3 #0<br />
T12<br />
C: CSin_new=’1’<br />
C: CSin_new=’1’<br />
T4 #1<br />
C: ILE=’0’<br />
A: CS_Start:=SETHCNT;<br />
T9 #2<br />
CS_midline<br />
T6<br />
T5<br />
C: HS_Enable=’0’ -- and ILE=’1’<br />
A: CS_Start:=HCOUNT;<br />
Next_odd:=bnot NTSC;<br />
CS_nonint<br />
A: -- C: HS_Enable=’1’ and ILE=’1’<br />
CS_Start:=SETHCNT;<br />
Next_odd:=NTSC;<br />
CS_newline<br />
C: CSin_new=’0’ and<br />
HCOUNT=CS_Start+HESYNC+1<br />
A: CS_Coming:=’1’;<br />
C: CSin_new=’0’ and<br />
HCOUNT=CS_Start+HESYNC<br />
A: CS_Coming:=’1’;<br />
C: CSin_new=’0’ and<br />
HCOUNT=CS_Start+HESYNC<br />
A: CS_Coming:=’1’;<br />
T8<br />
start_even<br />
start_nonint<br />
start_odd<br />
T10<br />
A: CS_Coming:=’0’;<br />
A: CS_Coming:=’0’;<br />
T14<br />
A: CS_Coming:=’0’;<br />
T7<br />
wait_endserr<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 84
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Diagram Variables:<br />
-- Variables of Diagram VRAM_4_258<br />
RAS_WE: logic:=’0’; -- MWE at falling edge of RAS<br />
RAS_SF: logic:=’0’; -- MSF at falling edge of RAS<br />
RAS_SE: logic:=’0’; -- MSE at falling edge of RAS<br />
RAS_OE: logic:=’0’; -- MOE at falling edge of RAS<br />
flag: logic:=’0’;<br />
DIR_input: logic:=’1’; -- 1=input mode,<br />
-- last transfer was write<br />
DoLoad: logic:=’0’; -- 0=load SR counter<br />
MWE_old: logic:=’0’;<br />
MWE_falling: logic;<br />
MSC_old: logic:=’1’;<br />
MSC_rising: logic;<br />
CAS_old: logic:=’0’;<br />
CAS_falling: logic;<br />
Column(9): logic:=lo9;<br />
Row(9): logic:=lo9;<br />
WM1(32): logic:=lo32; -- write mask<br />
Color(32): logic:=lo32; -- color register<br />
Anhang C.2<br />
Seite 85<br />
TAP(9): logic:=lo9; -- TAP<br />
LTAP(9): logic:="000000000"; -- TAP for low half SR<br />
HTAP(9): logic:="100000000"; -- TAP for high half SR<br />
SRCNT: integer(0 to 511):=0; -- SR counter<br />
SRCNTV(9): logic; -- SR counter as a vector<br />
CLRow(9): logic:=lo9; -- current SR row low half<br />
CHRow(9): logic:=lo9; -- current SR row high half<br />
NRow(9): logic:=lo9; -- next SR row<br />
dummy2: logic:=’1’;<br />
Abbildung 52: Variablen im Diagramm VIDEO/VRAM
Abbildung 53: Speedchart-Diagramm VIDEO/VRAM/VR RAM<br />
VR_RAM<br />
C: RAS_itv(0)=’0’<br />
A: Row:=RCA_itv(8 downto 0); -- Address<br />
WM1:=DIN_itv; -- Data in W/IO<br />
RAS_OE:=MOE_itv; -- DT/OE<br />
RAS_WE:=MWE_itv; -- WB/WE<br />
RAS_SF:=MSF_itv; -- DSF<br />
RAS_SE:=MSE_in; -- SE<br />
entry<br />
T1<br />
standby<br />
T4 #1<br />
T28<br />
C: RAS_itv(0)=’1’ and CAS_itv(0)=’1’<br />
T3<br />
T2 #0<br />
T22 #1<br />
Entry of <br />
A: print "standby";<br />
C: RAS_itv(0)=’0’ and CAS_itv(0)=’0’<br />
C: CAS_itv(0)=’0’<br />
T5 #2<br />
C: RAS_itv(0)=’1’<br />
A: print "CAS before RAS refresh";<br />
C: RAS_itv(0)=’1’<br />
Entry of <br />
A: print "ERROR";<br />
C: CAS_itv(0)=’0’<br />
T24 #0<br />
ref_OK<br />
T19 #0<br />
RAS1<br />
error<br />
CAS1<br />
T20 #0<br />
C: CAS_itv(0)=’0’ and RAS_OE=’0’<br />
T7 #1<br />
T6 #1<br />
T37 #2<br />
C: CAS_itv(0)=’0’<br />
-- and RAS_OE=’1’<br />
C: CAS_itv(0)=’1’<br />
T23 #0<br />
C: RAS_itv(0)=’1’<br />
C: RAS_itv(0)=’0’<br />
C: CAS_itv(0)=’1’<br />
T21 #1<br />
CAS_RAS_ref<br />
Transfer<br />
done<br />
T8 OC#0<br />
T9 OC#0<br />
Read_Write<br />
C: RAS_itv(0)=’1’ and<br />
CAS_itv(0)=’1’<br />
A: A_SAM_ot :=0x0;<br />
C: RAS_itv(0)=’1’ and<br />
CAS_itv(0)=’1’<br />
A: A_RAMw_ot:=0x0;<br />
Subdiag Actions of <br />
A: if standby’active then<br />
A_CTRL_ot:=0x1;<br />
elsif ref_OK’active then<br />
A_CTRL_ot:=0x2;<br />
elsif error’active then<br />
A_CTRL_ot:=0x3;<br />
else<br />
A_CTRL_ot:=0x0;<br />
end if;<br />
D_oe:=’0’;<br />
VRAM test outputs:<br />
==================<br />
A_SAM_ot(4):<br />
-- 1 split write transfer<br />
-- 2 split read transfer low<br />
-- 3 split read transfer high<br />
-- 4 pseudo write transfer<br />
-- 5 mask write transfer<br />
-- 6 real time read transfer<br />
-- 7 read transfer after WT<br />
A_RAMw_ot(4):<br />
-- 1 mask flash write<br />
-- 2 mask block write<br />
-- 3 page mode mask block write<br />
-- 4 block write<br />
-- 5 page mode block write<br />
-- 6 load color (early)<br />
-- 7 load color (delayed)<br />
-- 8 write (early)<br />
-- 9 page mode link<br />
-- A write (WE controlled)<br />
-- B page mode write (early)<br />
-- C mask write (early)<br />
-- D mask write (WE controlled)<br />
-- E page mode mask write (early)<br />
A_RAMr_ot(4):<br />
-- 1 read<br />
-- 2 read_modify_write read<br />
-- 3 read color<br />
A_CTRL_ot(4):<br />
-- 1 standby<br />
-- 2 CAS before RAS refresh<br />
-- 3 error<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 86
Abbildung 54: Speedchart-Diagramm VIDEO/VRAM/VR RAM/TRANSFER<br />
TRANSFER<br />
C: RAS_WE=’0’ and RAS_SF=’1’<br />
A: print "Split_Write - not supported";<br />
A_SAM_ot:=0x1;<br />
Split_WT<br />
T10<br />
C: RAS_WE=’1’ and RAS_SF=’1’<br />
A: if SRCNTV(8)=’1’ then<br />
print "Load_low_half_SR"<br />
& " Tap=" & RCA_itv(7 downto 0)<br />
& " Row=" & Row;<br />
LTAP(7 downto 0):=RCA_itv(7 downto 0);<br />
LTAP(8):=’0’;<br />
CLRow:=Row;<br />
A_SAM_ot:=0x2;<br />
else<br />
print "Load_high_half_SR"<br />
& " Tap=" & RCA_itv(7 downto 0)<br />
& " Row=" & Row;<br />
HTAP(7 downto 0):=RCA_itv(7 downto 0);<br />
HTAP(8):=’1’;<br />
CHRow:=Row;<br />
A_SAM_ot:=0x3;<br />
end if;<br />
A_TAP_ot(8):=’0’;<br />
A_TAP_ot(7 downto 0):=RCA_itv(7 downto 0);<br />
A_ROW_ot:=Row;<br />
entry<br />
T12<br />
Split_RT<br />
T8<br />
C: RAS_WE=’0’ and RAS_SF=’0’<br />
and RAS_SE=’0’<br />
A: TAP:=RCA_itv(8 downto 0);<br />
C: RAS_WE=’0’ and RAS_SF=’0’<br />
and RAS_SE=’1’<br />
A: TAP:=RCA_itv(8 downto 0);<br />
T9<br />
T11<br />
C: RAS_WE=’1’ and RAS_SF=’0’<br />
A: TAP:=RCA_itv(8 downto 0);<br />
wt_RRT<br />
T4<br />
RT<br />
Mask_WT<br />
Pseu_WT<br />
T2<br />
A: DIR_input:=’1’;<br />
print"Write_Transfer - not supported";<br />
A_SAM_ot:=0x5;<br />
T3<br />
A: DIR_input:=’1’;<br />
print"Pseudo_Write_Transfer - not supported";<br />
A_SAM_ot:=0x4;<br />
T1<br />
end4<br />
end3<br />
C: DIR_input=’0’ and MOE_itv=’1’<br />
A: print "Real_time_read_transfer"<br />
& " Tap=" & TAP<br />
& " Row=" & Row;<br />
NRow:=Row;<br />
HTAP:="100000000";<br />
LTAP:="000000000";<br />
DIR_input:=’0’;<br />
DoLoad:=’1’; -- load counter<br />
A_SAM_ot:=0x6;<br />
A_TAP_ot:=TAP;<br />
A_ROW_ot:=Row;<br />
C: DIR_input=’1’<br />
A: print "Read_transfer_after_write"<br />
& " Tap=" & RCA_itv(8 downto 0)<br />
& " Row=" & Row;<br />
NRow:=Row;<br />
HTAP:="100000000";<br />
LTAP:="000000000";<br />
DIR_input:=’0’;<br />
DoLoad:=’1’; -- load counter<br />
A_SAM_ot:=0x7;<br />
A_TAP_ot:=RCA_itv(8 downto 0);<br />
A_ROW_ot:=Row;<br />
T6<br />
end2<br />
end1<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 87
Abbildung 55: Speedchart-Diagramm VIDEO/VRAM/VR RAM/READ WRITE<br />
READ_WRITE<br />
Subdiag Actions of <br />
A: A_RAMr_ot:=0x0;<br />
C: CAS_falling=’1’<br />
A: print "PageMode_Mask_BW"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv(8 downto 2)<br />
& " ColSel=" & DIN_itv<br />
& " Data(Col)=" & Color;<br />
A_RAMw_ot:=0x3;<br />
A_ROW_ot:=Row;<br />
A_COL_ot(8 downto 2):=RCA_itv(8 downto 2);<br />
A_COL_ot(1 downto 0):="00";<br />
A_RCSL_ot:=DIN_itv;<br />
A: A_RAMw_ot:=0x0;<br />
T31 #1<br />
T1 #2<br />
T32 #1<br />
Mask_BW<br />
T2 #2<br />
A: A_RAMw_ot:=0x0;<br />
Mask_FW<br />
C: CAS_falling=’1’<br />
A: print "PageMode_BW"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv(8 downto 2)<br />
& " Data(Col)=" & Color;<br />
A_RAMw_ot:=0x5;<br />
A_ROW_ot:=Row;<br />
A_COL_ot(8 downto 2):=RCA_itv(8 downto 2);<br />
A_COL_ot(1 downto 0):="00";<br />
A_DATA_ot:=Color;<br />
BW<br />
C: RAS_WE=’0’ and RAS_SF=’0’ and MSF_itv=’1’<br />
A: print "Mask_BW"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv(8 downto 2)<br />
& " ColSel=" & DIN_itv<br />
& " Data(Col)=" & Color;<br />
A_RAMw_ot:=0x2;<br />
A_ROW_ot:=Row;<br />
A_COL_ot(8 downto 2):=RCA_itv(8 downto 2);<br />
A_COL_ot(1 downto 0):="00";<br />
A_RCSL_ot:=DIN_itv;<br />
A_DATA_ot:=Color;<br />
C: RAS_WE=’0’ and RAS_SF=’1’<br />
A: print "Mask_FW"<br />
& " Row=" & Row<br />
& " Mask=" & WM1<br />
& " Data(Col)=" & Color;<br />
A_RAMw_ot:=0x1;<br />
A_ROW_ot:=Row;<br />
A_WM1_ot:=WM1;<br />
A_DATA_ot:=Color;<br />
T15<br />
T14<br />
T17<br />
C: RAS_WE=’1’ and RAS_SF=’0’ and MSF_itv=’1’<br />
A: print "BW"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv(8 downto 2)<br />
& " Data(Col)=" & Color;<br />
A_RAMw_ot:=0x4;<br />
A_ROW_ot:=Row;<br />
A_COL_ot(8 downto 2):=RCA_itv(8 downto 2);<br />
A_COL_ot(1 downto 0):="00";<br />
A_DATA_ot:=Color;<br />
C: RAS_WE=’0’ and RAS_SF=’0’ and MSF_itv=’0’<br />
A: if MWE_itv=’0’ then<br />
print "Mask_W(early)"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv<br />
& " Mask=" & WM1<br />
& " Data=" & DIN_itv;<br />
A_RAMw_ot:=0xC;<br />
A_ROW_ot:=Row;<br />
A_COL_ot:=RCA_itv(8 downto 0);<br />
A_WM1_ot:=WM1;<br />
A_DATA_ot:=DIN_itv;<br />
end if;<br />
Column:=RCA_itv(8 downto 0);<br />
entry<br />
T18<br />
T13<br />
C: RAS_WE=’1’ and RAS_SF=’0’<br />
and MSF_itv=’0’<br />
A: if MWE_itv=’0’ then<br />
print "Write(early)"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv<br />
& " Data=" & DIN_itv;<br />
A_RAMw_ot:=0x8;<br />
A_ROW_ot:=Row;<br />
A_COL_ot:=RCA_itv(8 downto 0);<br />
A_DATA_ot:=DIN_itv;<br />
end if;<br />
Column:=RCA_itv(8 downto 0);<br />
T16<br />
C: RAS_WE=’1’ and RAS_SF=’1’<br />
A: if MWE_itv=’0’ then<br />
Color:=DIN_itv;<br />
flag:=’1’;<br />
print "Load_Col(early)"<br />
& " C=" & DIN_itv;<br />
A_RAMw_ot:=0x6;<br />
A_DATA_ot:=DIN_itv;<br />
else<br />
flag:=’0’;<br />
end if;<br />
T25<br />
Color<br />
State_action of <br />
A: if MOE_itv=’0’ then<br />
D_out(24 downto 16):=Row;<br />
D_out( 8 downto 0):=Column;<br />
D_oe:=’1’;<br />
print "RMW_perBit_Read"<br />
& " Row=" & Row<br />
& " Col=" & Column;<br />
A_RAMr_ot:=0x2;<br />
A_RROW_ot:=Row;<br />
A_RCOL_ot:=Column;<br />
end if;<br />
A: A_RAMw_ot:=0x0;<br />
T3 #4<br />
Mask_W<br />
T35 #3<br />
T34 #2<br />
T33 #1<br />
C: CAS_falling=’1’<br />
-- and MWE_itv=’1’<br />
A: Column:=RCA_itv(8 downto 0);<br />
print "PageMode_Link";<br />
A_RAMw_ot:=0x9;<br />
State_action of <br />
A: if MOE_itv=’0’ then<br />
D_out(24 downto 16):=Row;<br />
D_out( 8 downto 0):=Column;<br />
D_oe:=’1’;<br />
print "Read"<br />
& " Row=" & Row<br />
& " Col=" & Column;<br />
A_RAMr_ot:=0x1;<br />
A_RROW_ot:=Row;<br />
A_RCOL_ot:=Column;<br />
end if;<br />
RW<br />
T38 #2<br />
C: CAS_falling=’1’ and MWE_itv=’0’<br />
A: print "PageMode_Mask_W(early)"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv<br />
& " Mask=" & WM1<br />
& " Data=" & DIN_itv;<br />
A_RAMw_ot:=0xE;<br />
A_ROW_ot:=Row;<br />
A_COL_ot:=RCA_itv(8 downto 0);<br />
A_WM1_ot:=WM1;<br />
A_DATA_ot:=DIN_itv;<br />
C: MWE_falling=’1’<br />
A: print "Mask_W(WE_ctr)"<br />
& " Row=" & Row<br />
& " Col=" & Column<br />
& " Mask=" & WM1<br />
& " Data=" & DIN_itv;<br />
A_RAMw_ot:=0xD;<br />
A_ROW_ot:=Row;<br />
A_COL_ot:=Column;<br />
A_WM1_ot:=WM1;<br />
A_DATA_ot:=DIN_itv;<br />
C: CAS_falling=’1’ and MWE_itv=’0’<br />
A: print "PageMode_Write(early)"<br />
& " Row=" & Row<br />
& " Col=" & RCA_itv<br />
& " Data=" & DIN_itv;<br />
A_RAMw_ot:=0xB;<br />
A_ROW_ot:=Row;<br />
A_COL_ot:=RCA_itv(8 downto 0);<br />
A_DATA_ot:=DIN_itv;<br />
A: A_RAMw_ot:=0x0;<br />
T4 #4<br />
C: MWE_falling=’1’<br />
A: print "Write(WE_ctr)"<br />
T39 #1<br />
& " Row=" & Row<br />
& " Col=" & Column<br />
T40 #3<br />
& " Data=" & DIN_itv;<br />
C: CAS_falling=’1’<br />
A_RAMw_ot:=0xA;<br />
-- and MWE_itv=’1’<br />
A_ROW_ot:=Row;<br />
A: Column:=RCA_itv(8 downto 0);<br />
A_COL_ot:=Column;<br />
print "PageMode_Link";<br />
A_RAMw_ot:=0x9;<br />
A_DATA_ot:=DIN_itv;<br />
C: MWE_falling=’1’ and MOE_itv=’1’<br />
A: Color:=DIN_itv;<br />
flag:=’1’;<br />
print "Load_Col(delayed) C=" & DIN_itv;<br />
A_RAMw_ot:=0x7;<br />
A_DATA_ot:=DIN_itv;<br />
State_action of <br />
A: if flag=’0’ and MOE_itv=’0’then<br />
D_out:=Color;<br />
D_oe:=’1’;<br />
print "Read_Col C=" & Color;<br />
A_RAMr_ot:=0x3;<br />
end if;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 88
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
VR_SAM<br />
entry<br />
T1<br />
S1<br />
T2<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 89<br />
Subdiag Actions of <br />
A: SR_Cnt_ot:=SRCNT;<br />
CLRow_ot:=CLRow;<br />
CHRow_ot:=CHRow;<br />
HTAP_ot :=HTAP;<br />
LTAP_ot :=LTAP;<br />
TAP_ot :=TAP;<br />
SRCNTV :=SRCNT; -- Int_to_Vec<br />
C: MSC_rising=’1’ or Clk_Div=’0’<br />
A: if DoLoad=’1’ then<br />
DoLoad:=’0’;<br />
SRCNT:=TAP;<br />
CLRow:=NRow;<br />
CHRow:=NRow;<br />
SR_Row_ot:=NRow;<br />
print "Load_tap SRCNT=" & TAP;<br />
print "SR_Row=" & NRow;<br />
elsif SRCNT=511 then<br />
SRCNT:=LTAP;<br />
SR_Row_ot:=CLRow;<br />
print "Wrap_to_lo SRCNT=" & LTAP;<br />
print "SR_Row=" & CLRow;<br />
elsif SRCNT=255 then<br />
SRCNT:=HTAP;<br />
SR_Row_ot:=CHRow;<br />
print "Wrap_to_hi SRCNT=" & HTAP;<br />
print "SR_Row=" & CHRow;<br />
else<br />
SRCNT:=(SRCNT+1) mod 512;<br />
print "Count SRCNT=" & SRCNT+1;<br />
if SRCNTV(8)=’1’ then<br />
print "SR_Row=" & CHRow;<br />
dummy2:=bnot dummy2; -- avoid null statement;<br />
else<br />
print "SR_Row=" & CLRow;<br />
dummy2:=bnot dummy2; -- avoid null statement;<br />
end if;<br />
end if;<br />
Abbildung 56: Speedchart-Diagramm VIDEO/VRAM/VR SAM
Abbildung 57: Speedchart-Diagramm VIDEO/VRAM/VR ATTR<br />
VR_ATTR<br />
entry<br />
T1<br />
S1<br />
T2<br />
Subdiag Actions of <br />
A: CAS_falling:=’1’<br />
when CAS_itv(0)=’0’ and CAS_old=’1’<br />
else ’0’;<br />
MWE_falling:=’1’<br />
when MWE_itv=’0’ and MWE_old=’1’<br />
else ’0’;<br />
MSC_rising:=’1’<br />
when MSC_itv=’1’ and MSC_old=’0’<br />
else ’0’;<br />
A: CAS_old:=CAS_itv(0); -- replace ’falling<br />
MWE_old:=MWE_itv; -- replace ’falling<br />
MSC_old:=MSC_itv; -- replace ’rising<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 90
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
INTER<br />
entry<br />
S1<br />
T2<br />
T1<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Entry of <br />
A: -- latch register values<br />
-- with VClk_in<br />
-- to avoid meta-stable states<br />
SETHCNT :=R_SETHCNT;<br />
HTOTAL :=R_HTOTAL;<br />
HESYNC :=R_HESYNC;<br />
HSBLNK :=R_HSBLNK;<br />
HEBLNK :=R_HEBLNK;<br />
HESERR :=R_HESERR;<br />
SETVCNT :=R_SETVCNT;<br />
VTOTAL :=R_VTOTAL;<br />
VESYNC :=R_VESYNC;<br />
VSBLNK :=R_VSBLNK;<br />
VEBLNK :=R_VEBLNK;<br />
LINTV :=R_LINTV;<br />
DPYSTRT :=DPYHELP;<br />
DPYINC :=R_DPYINC;<br />
YZ :=R_YZ;<br />
XZ :=R_XZ;<br />
MBW :=R_MBW;<br />
SRL :=R_SRL;<br />
SRE :=R_SRE;<br />
RLE :=R_RLE;<br />
NTSC :=R_VESYNC(1);<br />
ILE :=R_ILE;<br />
VEN :=R_VEN;<br />
TEST :=R_TEST;<br />
CSD :=R_CSD;<br />
HSD :=R_HSD;<br />
VSD :=R_VSD;<br />
RF :=R_RF;<br />
FASTRAM :=R_FASTRAM;<br />
-- latch SYNC inputs twice<br />
-- for detecting SYNC’rising<br />
-- in asynchronous blocks<br />
HSin_new:=HSYNC_in;<br />
HSin_old:=HSin_new;<br />
VSin_new:=VSYNC_in;<br />
VSin_old:=VSin_new;<br />
CSin_new:=CSYNC_in;<br />
CSin_old:=CSin_new;<br />
-- latch some signals<br />
-- to replace XXX’changing<br />
CSD_last:=CSD;<br />
VSD_last:=VSD;<br />
HSD_last:=HSD;<br />
ILE_last:=ILE;<br />
HTOTAL_last:=HTOTAL;<br />
VTOTAL_last:=VTOTAL;<br />
Abbildung 58: Speedchart-Diagramm VIDEO/INTER<br />
Subdiag Actions of <br />
A: -- video signals<br />
CBLANK_out :=HBLANK band VBLANK band VEN;<br />
HBLANK_out :=HBLANK;<br />
VBLANK_out :=VBLANK;<br />
CSYNC_oe :=R_CSD;<br />
HSYNC_oe :=R_HSD;<br />
VSYNC_oe :=R_VSD;<br />
-- VRAM signals<br />
MSC_out :=MSC_itv;<br />
-- interrupt outputs<br />
VIRQ_out :=VBLANK;<br />
HIRQ_out :=’0’ when VCOUNT=LINTV<br />
else ’1’;<br />
-- read-only registers<br />
R_HCOUNT :=HCOUNT mod 65536;<br />
S_HCOUNT :=HCOUNT mod 256;<br />
R_VCOUNT :=VCOUNT mod 65536;<br />
S_VCOUNT :=VCOUNT mod 256;<br />
Anhang C.2<br />
Seite 91<br />
if MBW(1)=’1’ then -- 32 bit MBW<br />
R_DPYNEXT(31 downto 5):=DPYNEXT mod 0x8000000;<br />
R_DPYNEXT(4 downto 0):="00000";<br />
S_DPYNEXT(11 downto 5):=DPYNEXT mod 128;<br />
S_DPYNEXT(4 downto 0):="00000";<br />
elsif MBW(0)=’1’ then -- 16 bit MBW<br />
R_DPYNEXT(31):=’0’;<br />
R_DPYNEXT(30 downto 5):=(DPYNEXT shr 1) mod 0x4000000;<br />
R_DPYNEXT(4 downto 0):="00000";<br />
S_DPYNEXT(11 downto 5):=(DPYNEXT shr 1) mod 128;<br />
S_DPYNEXT(4 downto 0):="00000";<br />
else<br />
R_DPYNEXT(31 downto 30):="00";<br />
R_DPYNEXT(29 downto 5):=(DPYNEXT shr 2) mod 0x2000000;<br />
R_DPYNEXT(4 downto 0):="00000";<br />
S_DPYNEXT(11 downto 5):=(DPYNEXT shr 2) mod 128;<br />
S_DPYNEXT(4 downto 0):="00000";<br />
end if;<br />
-- test outputs<br />
RELOAD_ot :=RELOAD;<br />
REL10_ot :=RELAT10;<br />
REL6_ot :=RELAT6;<br />
MLR10_ot :=MLRAT10;<br />
MLR6_ot :=MLRAT6;<br />
RELAREA_ot :=RELAREA;<br />
-- convert DPYNEXT to a vector<br />
DPYNEXTV :=DPYNEXT mod 0x8000000;<br />
-- determine DPYSTART memory word address<br />
if MBW(1)=’1’ then -- 32 bit MBW<br />
DPYHELP:=R_DPYSTRT(31 downto 5);<br />
elsif MBW(0)=’1’ then -- 16 bit MBW<br />
DPYHELP(26 downto 1):=R_DPYSTRT(30 downto 5);<br />
DPYHELP(0):=’0’;<br />
else<br />
DPYHELP(26 downto 2):=R_DPYSTRT(29 downto 5);<br />
DPYHELP(1 downto 0):="00";<br />
end if;
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diagram Variables:<br />
-- Variables of Diagram RELOAD<br />
-- MSC control<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
DISINC: logic:=’1’; -- ’1’ = disable TAPCNT increment<br />
DISCLK: logic:=’1’; -- ’1’ = disable MSC output<br />
MSCNT: int12:=0x0FFF; -- XZoom: counter for MSC/LD divider<br />
MSCNTV(12): logic; -- MSCNT as a logic vector<br />
TAPCNT: int11:=0; -- TAP position counter<br />
TAPCNTV(11): logic; -- TAPCNT as a logic vector<br />
ROWCNT: int12:=0; -- current row in SR<br />
-- determine number of VClk cycles per memory word of video data<br />
LD_XZ: int4; -- ld of XZOOM factor<br />
LD_MBW: int4; -- ld of memory bus width<br />
LD_PSIZE: int4; -- ld of bits per pixel<br />
MSC_SFT: int4:=0; -- ld of (VClk cycles per mem word)<br />
-- determine the number of reloads necessary in the next line<br />
Anhang C.2<br />
Seite 92<br />
CALC_RLL: int16; -- (Register Line Length) -1<br />
CALC_ELL: int16:=0; -- (Effective Line Length in VClk cycles)-1<br />
CALC_NRL: int8 :=0; -- # of low half SR reloads in next line<br />
CALC_NRH: int8 :=0; -- # of high half SR reloads in next line<br />
SUM_TAP_ELL: int12:=0; -- sum of TAP and ELL<br />
SUM_TE_V(12): logic; -- SUM_TAP_ELL as a logic vector<br />
SUM_TE_A: logic; -- sum of TAP and ELL, carry out bit<br />
SUM_TE_B: logic; -- sum of TAP and ELL, highest bit<br />
CALC_ELL_SFT: int8; -- ELL divided by Shift Reg Length<br />
-- reload control<br />
SMR_high: logic:=’0’; -- ’1’ = next split rel. of high half SR<br />
HC_MLR: int16:=0; -- HCOUNT value at point of midline reload<br />
HC_MLR5: int16:=0; -- HCOUNT value at start of early ml reload<br />
HC_MEN5: logic:=’0’; -- ’1’=enable HC_MLR5<br />
-- refresh control<br />
REFCNT: int11:=0x7FF; -- refresh rate counter<br />
-- arbitration control<br />
SMR_request: logic:=’0’; -- ’1’ = request split reload<br />
SMR_ack: logic:=’0’; -- ’1’=acknowledge, perform split midl. rel.<br />
REF_RQNR: int4:=0; -- number of refresh cycles desired<br />
REF_PFNR: int4:=0; -- number of refresh cycles performed<br />
-- n. of r.c. lagging: (REF_RQNR-REF_PFNR)<br />
REF_ack: logic:=’0’; -- ’1’=acknowledge, perform refresh cycle<br />
ARB_busy: logic; -- ’1’=reload or refresh unit busy<br />
Abbildung 59: Variablen im Diagramm VIDEO/RELOAD
Abbildung 60: Speedchart-Diagramm VIDEO/RELOAD/RL RAM<br />
RL_RAM<br />
refresh<br />
C: REF_ack=’1’<br />
T14<br />
C: refresh’complete<br />
A: REF_PFNR:=<br />
(REF_PFNR+1) mod 16;<br />
T15<br />
entry<br />
T5<br />
T2<br />
C: midl_rel’complete<br />
A: MLRAT6 :=’0’;<br />
MLRAT10 :=’0’;<br />
stdby<br />
T9<br />
midl_rel<br />
C: newl_rel’complete<br />
A: RELAT10 :=’0’;<br />
RELAT6 :=’0’;<br />
T1<br />
C: RELOAD=’1’ and RLE=’1’<br />
C: split_mlr’complete<br />
A: RELAT10 :=’0’;<br />
RELAT6 :=’0’;<br />
C: SMR_ack=’1’<br />
T6<br />
T3 #1<br />
C: RLE=’1’ and SRE=’0’ and CALC_NRL/=0 and<br />
(( (MSC_SFT=0 and TAPCNT=0x7FA and MSCNT=0xFFF<br />
and DISINC=’0’)<br />
or (MSC_SFT=0 and TAPCNT=0x7FB and DISINC=’1’)<br />
-- start of midl rel with start of display area<br />
or (MSC_SFT=1 and TAPCNT=0x7FD and MSCNT=0xFFE)<br />
or (MSC_SFT=2 and TAPCNT=0x7FE and MSCNT=0xFFE)<br />
or (MSC_SFT>2 and TAPCNT=0x7FF and MSCNT=0xFFA))<br />
or (HCOUNT=HC_MLR5 and HC_MEN5=’1’))<br />
T4<br />
newl_rel<br />
wait1<br />
T8<br />
T7 #0<br />
split_mlr<br />
C: newl_rel’complete<br />
and SRE=’1’<br />
and CALC_NRL/=0<br />
and ((SRL="00" and DPYNEXTV(7)=’1’)<br />
or (SRL="01" and DPYNEXTV(8)=’1’)<br />
or (SRL="10" and DPYNEXTV(9)=’1’)<br />
or (SRL="11" and DPYNEXTV(10)=’1’))<br />
-- TAP start in high half of SR<br />
A: SMR_high:=’0’; -- preload low half SR<br />
Subdiag Actions of <br />
A: ARB_busy:=’0’ when stdby’active<br />
else ’1’;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 93
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
MIDL_REL<br />
entry<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T9<br />
A: -- 1st cycle of midline reload<br />
RCA_itv:=(ROWCNT + 1) mod 4096;<br />
ROWCNT:=(ROWCNT + 1) mod 4096;<br />
CALC_NRL:=CALC_NRL - 1;<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";<br />
MWE_itv:=’1’;<br />
MOE_itv:=’0’;<br />
MSF_itv:=’0’;<br />
T10<br />
T1<br />
T2<br />
T13<br />
Abbildung 61: Speedchart-Diagramm VIDEO/RELOAD/RL RAM/MIDL REL<br />
T3<br />
S1<br />
S2<br />
S3<br />
S4<br />
S5<br />
exit<br />
Anhang C.2<br />
Seite 94<br />
A: -- 2nd cycle<br />
RAS_itv:="1110";<br />
A: -- 3rd cycle<br />
RCA_itv:=lo12;<br />
A: -- 4th cycle<br />
CAS_itv:="0000";<br />
A: -- 5th cycle<br />
RCA_itv:=0xFFF;<br />
MOE_itv:=’1’;<br />
A: -- 6th cycle<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";
Abbildung 62: Speedchart-Diagramm VIDEO/RELOAD/RL RAM/NEWL REL<br />
NEWL_REL<br />
entry<br />
T1<br />
S1<br />
T2<br />
S2<br />
T4<br />
A: -- 1st cycle of newline reload<br />
A: -- 2nd cycle<br />
A: -- 3rd cycle<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";<br />
RAS_itv:="1110";<br />
RCA_itv:=DPYNEXTV(11 downto 0);<br />
MWE_itv:=’1’;<br />
-- calculate # of reloads necessary in next line<br />
-- calculate HCOUNT value for start of<br />
MOE_itv:=’0’;<br />
-- CALC_NRL: SRE=’0’: number of non-split reloads<br />
-- MLRAT6 and MLRAT10 midl. rel. attention signals<br />
MSF_itv:=’0’;<br />
-- SRE=’1’: # of split low half SR rel.<br />
-- CALC_NRH: SRE=’0’: no function<br />
-- and MLRAT5 midline reload start signal<br />
-- and calculation of SUM_TAP_ELL<br />
-- SRE=’1’: # of split high half SR rel.<br />
if HC_MEN5=’1’ then<br />
-- and calculation of TAPCNT (TAP position)<br />
if HC_MLR>=5 then<br />
if SUM_TE_A=’1’ then<br />
HC_MLR5:=HC_MLR-5;<br />
case SRL is<br />
CALC_NRL:=(CALC_ELL_SFT + 1) mod 256;<br />
else<br />
when "00" => -- SRL: 256 words<br />
else<br />
HC_MLR5:=(HC_MLR+HTOTAL-4) mod 65536;<br />
RCA_itv:=DPYNEXTV(19 downto 8);<br />
CALC_NRL:=CALC_ELL_SFT;<br />
end if;<br />
ROWCNT:=(DPYNEXT shr 8) mod 4096;<br />
TAPCNT:=(DPYNEXT mod 256) + 0x700;<br />
end if;<br />
end if;<br />
SUM_TAP_ELL:=(DPYNEXT mod 256) + (CALC_ELL mod 256);<br />
CALC_NRH:=(CALC_ELL_SFT + 1) mod 256<br />
if HC_MEN6=’1’ then<br />
when SUM_TE_A=’1’ and SUM_TE_B=’1’<br />
if HC_MLR>=11 then<br />
when "01" => -- SRL: 512 words<br />
else (CALC_ELL_SFT - 1)<br />
HC_MLR6:=HC_MLR-11;<br />
RCA_itv:=DPYNEXTV(20 downto 9);<br />
when SUM_TE_A=’0’ and SUM_TE_B=’0’<br />
else<br />
ROWCNT:=(DPYNEXT shr 9) mod 4096;<br />
and CALC_ELL_SFT/=0<br />
HC_MLR6:=(HC_MLR+HTOTAL-10) mod 65536;<br />
TAPCNT:=(DPYNEXT mod 512) + 0x600;<br />
else CALC_ELL_SFT;<br />
end if;<br />
SUM_TAP_ELL:=(DPYNEXT mod 512) + (CALC_ELL mod 512);<br />
-- calculate HCOUNT value at point of midline reload<br />
end if;<br />
when "10" => -- SRL: 1024 words<br />
if HC_MEN10=’1’ then<br />
RCA_itv:=DPYNEXTV(21 downto 10);<br />
case MSC_SFT is<br />
if HC_MLR>=15 then<br />
ROWCNT:=(DPYNEXT shr 10) mod 4096;<br />
when 0 => HC_MLR:=(HEBLNK+(0x800-TAPCNT)) mod 65536;<br />
HC_MLR10:=HC_MLR-15;<br />
TAPCNT:=(DPYNEXT mod 1024) + 0x400;<br />
when 1 => HC_MLR:=(HEBLNK+(0x800-TAPCNT) shl 1) mod 65536;<br />
else<br />
SUM_TAP_ELL:=(DPYNEXT mod 1024) + (CALC_ELL mod 1024);<br />
when 2 => HC_MLR:=(HEBLNK+(0x800-TAPCNT) shl 2) mod 65536;<br />
HC_MLR10:=(HC_MLR+HTOTAL-14) mod 65536;<br />
when 3 => HC_MLR:=(HEBLNK+(0x800-TAPCNT) shl 3) mod 65536;<br />
end if;<br />
when "11" => -- SRL: 2048 words<br />
when 4 => HC_MLR:=(HEBLNK+(0x800-TAPCNT) shl 4) mod 65536;<br />
end if;<br />
RCA_itv:=DPYNEXTV(22 downto 11);<br />
when 5 => HC_MLR:=(HEBLNK+(0x800-TAPCNT) shl 5) mod 65536;<br />
ROWCNT:=(DPYNEXT shr 11) mod 4096;<br />
TAPCNT:=DPYNEXT mod 2048;<br />
end case;<br />
SUM_TAP_ELL:=(DPYNEXT mod 2048) + (CALC_ELL mod 2048);<br />
-- determine if HCOUNT has to be regarded to<br />
end case;<br />
-- generate midline reload attention signals<br />
-- disable HC_MLR6 and HC_MLR10 signals<br />
case MSC_SFT is<br />
when 0 => if TAPCNT>0x7FB then -- 0x800 -5<br />
HC_MEN5 :=’0’;<br />
HC_MEN5:=’1’;<br />
HC_MEN6 :=’0’;<br />
end if;<br />
HC_MEN10:=’0’;<br />
if TAPCNT>0x7F5 then -- 0x800 -11 (5+6)<br />
HC_MEN6:=’1’;<br />
end if;<br />
if TAPCNT>0x7F1 then -- 0x800 -15 (5+10)<br />
HC_MEN10:=’1’;<br />
end if;<br />
when 1 => if TAPCNT>0x7FD then -- 0x800 -(5/2 up)<br />
HC_MEN5:=’1’;<br />
end if;<br />
if TAPCNT>0x7FA then -- 0x800 -(11/2 up)<br />
HC_MEN6:=’1’;<br />
end if;<br />
if TAPCNT>0x7F8 then -- 0x800 -(15/2 up)<br />
HC_MEN10:=’1’;<br />
end if;<br />
when 2 => if TAPCNT=0x7FF then -- 0x800 -(5/4 up)<br />
HC_MEN5:=’1’;<br />
end if;<br />
if TAPCNT>0x7FD then -- 0x800 -(11/4 up)<br />
HC_MEN6:=’1’;<br />
end if;<br />
if TAPCNT>0x7FC then -- 0x800 -(15/4 up)<br />
HC_MEN10:=’1’;<br />
end if;<br />
when 3 => if TAPCNT=0x7FF then -- 0x800 -(11/8 up)<br />
HC_MEN6:=’1’;<br />
HC_MEN10:=’1’; -- 0x800 -(15/8 up)<br />
end if;<br />
end case;<br />
T6<br />
T7<br />
T3<br />
T5<br />
S3<br />
S4<br />
S5<br />
S6<br />
exit<br />
A: -- 4th cycle<br />
CAS_itv:="0000";<br />
A: -- 5th cycle<br />
RCA_itv:=0xFFF;<br />
MOE_itv:=’1’;<br />
A: -- 6th cycle<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";<br />
MSC_reload:=’0’; -- MSC low pulse<br />
-- after newline reload<br />
A: MSC_reload:=’1’;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 95
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
SPLIT_MLR<br />
entry<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T9<br />
A: -- 1st cycle of split midl. rel.<br />
if SMR_high=’1’ then<br />
RCA_itv:=ROWCNT;<br />
CALC_NRH:=CALC_NRH - 1;<br />
else<br />
RCA_itv:=(ROWCNT + 1) mod 4096;<br />
ROWCNT:=(ROWCNT + 1) mod 4096;<br />
CALC_NRL:=CALC_NRL - 1;<br />
end if;<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";<br />
MWE_itv:=’1’;<br />
MOE_itv:=’0’;<br />
MSF_itv:=’1’;<br />
SMR_request:=’0’;<br />
T10<br />
T1<br />
T2<br />
T13<br />
Abbildung 63: Speedchart-Diagramm VIDEO/RELOAD/RL RAM/SPLIT MLR<br />
T3<br />
S1<br />
S2<br />
S3<br />
S4<br />
S5<br />
exit<br />
Anhang C.2<br />
Seite 96<br />
A: -- 2nd cycle<br />
RAS_itv:="1110";<br />
A: -- 3rd cycle<br />
RCA_itv:=lo12;<br />
A: -- 4th cycle<br />
CAS_itv:="0000";<br />
A: -- 5th cycle<br />
RCA_itv:=0xFFF;<br />
MOE_itv:=’1’;<br />
MSF_itv:=’0’;<br />
A: -- 6th cycle<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
REFRESH<br />
entry<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T1<br />
A: -- 1st cycle of<br />
-- CAS before RAS<br />
-- refresh<br />
RAS_itv:="1111";<br />
CAS_itv:="0000";<br />
T7 #0<br />
C: FASTRAM=’1’<br />
T2<br />
T3<br />
T5<br />
T6<br />
S1<br />
S2<br />
S3<br />
S4<br />
exit<br />
Abbildung 64: Speedchart-Diagramm VIDEO/RELOAD/RL RAM/REFRESH<br />
S5<br />
T4 #1<br />
Anhang C.2<br />
Seite 97<br />
A: -- 2nd cycle<br />
RAS_itv:="0000";<br />
A: -- 3rd cycle<br />
A: -- 4th cycle<br />
A: -- 5th cycle<br />
A: -- 6th cycle<br />
RAS_itv:="1111";<br />
CAS_itv:="1111";
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
RL_MSC<br />
entry<br />
T1<br />
blank<br />
Subdiag Actions of <br />
A: MSCNTV:=MSCNT mod 4096;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
C: (HCOUNT+1) mod 65536=HSBLNK<br />
-- HCOUNT=HSBLNK-1<br />
A: DISCLK:=’1’;<br />
MSCNT:=0;<br />
T3 #0<br />
T2<br />
C: RELAREA=’1’ and RLE=’1’ and<br />
(HCOUNT+1) mod 65536=HEBLNK<br />
-- HCOUNT=HEBLNK-1<br />
A: DISCLK:=’0’;<br />
MSCNT:=0xFFF;<br />
DISINC:=’1’;<br />
if MSC_SFT=0 then<br />
MSC_itv:=(DISCLK bor VClk_in)<br />
band MSC_reload; -- pulse after reload<br />
else<br />
MSC_itv:=’0’<br />
when ((MSCNT=0xFFE and DISINC=’0’)<br />
or MSC_reload=’0’)<br />
else ’1’;<br />
end if;<br />
clock<br />
case XZ is<br />
when "000" => LD_itv:=DISCLK bor VClk_in;<br />
when "001" => LD_itv:=’0’<br />
when MSCNTV(0)=’1’ else ’1’;<br />
when "010" => LD_itv:=’0’<br />
when MSCNTV(1 downto 0)="11"<br />
else ’1’;<br />
when "011" => LD_itv:=’0’<br />
when MSCNTV(2 downto 0)="111"<br />
else ’1’;<br />
when "100" => LD_itv:=’0’<br />
when MSCNTV(3 downto 0)="1111"<br />
else ’1’;<br />
when "101" => LD_itv:=’0’<br />
when MSCNTV(4 downto 0)="11111"<br />
else ’1’;<br />
when "110" => LD_itv:=’0’<br />
when MSCNTV(5 downto 0)="111111"<br />
else ’1’;<br />
when "111" => LD_itv:=’0’<br />
when MSCNTV(6 downto 0)="1111111"<br />
else ’1’;<br />
end case;<br />
-- test outputs<br />
DISCLK_ot :=DISCLK;<br />
MSC_ot :=MSC_itv;<br />
LD_ot :=LD_itv;<br />
RAS_ot :=RAS_itv;<br />
CAS_ot :=CAS_itv;<br />
MOE_ot :=MOE_itv;<br />
MWE_ot :=MWE_itv;<br />
MSF_ot :=MSF_itv;<br />
RCA_ot :=RCA_itv(8 downto 0);<br />
MSCNT_ot :=MSCNT mod 4096;<br />
TAPCNT_ot :=TAPCNT mod 2048;<br />
ROWCNT_ot :=ROWCNT mod 4096;<br />
CALC_NRL_ot :=CALC_NRL mod 256;<br />
CALC_NRH_ot :=CALC_NRH mod 256;<br />
SMR_req_ot :=SMR_request;<br />
SMR_high_ot :=SMR_high;<br />
-- for VRAM model control:<br />
Clk_Div:=’0’ when MSC_SFT=0<br />
and DISCLK=’0’ -- MSC = VClk<br />
and DISINC=’0’ -- disable 1st pulse<br />
else ’1’;<br />
T4 #1<br />
Abbildung 65: Speedchart-Diagramm VIDEO/RELOAD/RL MSC<br />
Anhang C.2<br />
Seite 98<br />
A: case MSC_SFT is<br />
when 0 => MSCNT:=0xFFF;<br />
when 1 => MSCNT:=((MSCNT + 1) mod 2) + 0xFFE;<br />
when 2 => MSCNT:=((MSCNT + 1) mod 4) + 0xFFC;<br />
when 3 => MSCNT:=((MSCNT + 1) mod 8) + 0xFF8;<br />
when 4 => MSCNT:=((MSCNT + 1) mod 16) + 0xFF0;<br />
when 5 => MSCNT:=((MSCNT + 1) mod 32) + 0xFE0;<br />
when 6 => MSCNT:=((MSCNT + 1) mod 64) + 0xFC0;<br />
when 7 => MSCNT:=((MSCNT + 1) mod 128) + 0xF80;<br />
when 8 => MSCNT:=((MSCNT + 1) mod 256) + 0xF00;<br />
when 9 => MSCNT:=((MSCNT + 1) mod 512) + 0xE00;<br />
when 10 => MSCNT:=((MSCNT + 1) mod 1024) + 0xC00;<br />
when 11 => MSCNT:=((MSCNT + 1) mod 2048) + 0x800;<br />
when others => MSCNT:=(MSCNT + 1) mod 4096;<br />
end case;<br />
if MSCNT=0xFFF and DISINC=’0’ then<br />
TAPCNT:=TAPCNT + 1 when TAPCNT/=0x7FF<br />
else 0x000 when SRL="11" -- 2048-2048<br />
else 0x400 when SRL="10" -- 2048-1024<br />
else 0x600 when SRL="01" -- 2048-512<br />
else 0x700; -- 2048-256<br />
end if;<br />
if MSCNT=0xFFF and DISINC=’0’ and CALC_NRH/=0<br />
and TAPCNT=0x7FF then<br />
SMR_request:=’1’;<br />
SMR_high:=’1’; -- high half SR data just finished<br />
end if;<br />
if MSCNT=0xFFF and DISINC=’0’ and CALC_NRL/=0<br />
and ((SRL="00" and TAPCNT=0x77F)<br />
or (SRL="01" and TAPCNT=0x6FF)<br />
or (SRL="10" and TAPCNT=0x5FF)<br />
or (SRL="11" and TAPCNT=0x3FF)) then<br />
SMR_request:=’1’;<br />
SMR_high:=’0’; -- low half SR data just finished<br />
end if;<br />
DISINC:=’0’;
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
RL_CALC<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T5<br />
entry S1<br />
Subdiag Actions of <br />
A: -- determine number of VClk cycles<br />
-- per memory word of video data<br />
LD_XZ:=0 when XZ="000"<br />
else 1 when XZ="001"<br />
else 2 when XZ="010"<br />
else 3 when XZ="011"<br />
else 4 when XZ="100"<br />
else 5 when XZ="101"<br />
else 6 when XZ="110"<br />
else 7;<br />
LD_MBW:=5 when MBW(1)=’1’<br />
else 4 when MBW="01"<br />
else 3;<br />
LD_PSIZE:=5 when R_PSIZE(5)=’1’<br />
else 4 when R_PSIZE(5 downto 4)="01"<br />
else 3 when R_PSIZE(5 downto 3)="001"<br />
else 2 when R_PSIZE(5 downto 2)="0001"<br />
else 1 when R_PSIZE(5 downto 1)="00001"<br />
else 0;<br />
CALC_RLL:=((HSBLNK-HEBLNK) + 65535) mod 65536;<br />
-- (Register Line Length) -1<br />
SUM_TE_V:=SUM_TAP_ELL mod 4096;<br />
case SRL is<br />
when "00" => -- SRL: 256 bits<br />
SUM_TE_A:=SUM_TE_V(8);<br />
SUM_TE_B:=SUM_TE_V(7);<br />
CALC_ELL_SFT:=(CALC_ELL shr 8) mod 256;<br />
when "01" => -- SRL: 512 bits<br />
SUM_TE_A:=SUM_TE_V(9);<br />
SUM_TE_B:=SUM_TE_V(8);<br />
CALC_ELL_SFT:=(CALC_ELL shr 9) mod 256;<br />
when "10" => -- SRL: 1024 bits<br />
SUM_TE_A:=SUM_TE_V(10);<br />
SUM_TE_B:=SUM_TE_V(9);<br />
CALC_ELL_SFT:=(CALC_ELL shr 10) mod 256;<br />
when "11" => -- SRL: 2048 bits<br />
SUM_TE_A:=SUM_TE_V(11);<br />
SUM_TE_B:=SUM_TE_V(10);<br />
CALC_ELL_SFT:=(CALC_ELL shr 11) mod 256;<br />
end case;<br />
-- test output<br />
MSCSFT_ot :=MSC_SFT mod 16;<br />
Abbildung 66: Speedchart-Diagramm VIDEO/RELOAD/RL CALC<br />
T1<br />
A: -- determine number of VClk cycles<br />
-- per memory word of video data<br />
MSC_SFT:=(LD_XZ + LD_MBW) - LD_PSIZE;<br />
Anhang C.2<br />
Seite 99<br />
case MSC_SFT is<br />
when 0 => CALC_ELL:=CALC_RLL;<br />
when 1 => CALC_ELL:=CALC_RLL shr 1;<br />
when 2 => CALC_ELL:=CALC_RLL shr 2;<br />
when 3 => CALC_ELL:=CALC_RLL shr 3;<br />
when 4 => CALC_ELL:=CALC_RLL shr 4;<br />
when 5 => CALC_ELL:=CALC_RLL shr 5;<br />
when 6 => CALC_ELL:=CALC_RLL shr 6;<br />
when 7 => CALC_ELL:=CALC_RLL shr 7;<br />
when 8 => CALC_ELL:=CALC_RLL shr 8;<br />
when 9 => CALC_ELL:=CALC_RLL shr 9;<br />
when 10 => CALC_ELL:=CALC_RLL shr 10;<br />
when 11 => CALC_ELL:=CALC_RLL shr 11;<br />
when others => CALC_ELL:=CALC_RLL shr 12;<br />
-- (Effective Line Length in mem words) -1<br />
end case;
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
RL_REFRESH<br />
T1<br />
entry S1<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T2<br />
A: -- increment refresh counter<br />
if REFCNT=0x7FF then<br />
case RF is<br />
when "000" => REFCNT:=0x7E0; -- cycle 32<br />
when "001" => REFCNT:=0x7C0; -- cycle 64<br />
when "010" => REFCNT:=0x780; -- cycle 128<br />
when "011" => REFCNT:=0x700; -- cycle 256<br />
when "100" => REFCNT:=0x600; -- cycle 512<br />
when "101" => REFCNT:=0x400; -- cycle 1024<br />
when "110" => REFCNT:=0x000; -- cycle 2048<br />
when "111" => REF_RQNR:=0; -- no refresh<br />
end case;<br />
else<br />
REFCNT:=REFCNT+1;<br />
end if;<br />
-- increment number of refresh cycles requested<br />
if REFCNT=0x7FF and RF/="111" then<br />
REF_RQNR:=(REF_RQNR+1) mod 16;<br />
end if;<br />
-- set MLRAT6 and MLRAT10 attention signals<br />
-- 6 or 10 VClk cycles before midline reload starts<br />
-- (11 or 15 VClk cycles before actual reload)<br />
if RLE=’1’ and SRE=’0’ and CALC_NRL/=0 and<br />
( (MSC_SFT=0 and TAPCNT=0x7F4 and MSCNT=0xFFF<br />
and DISINC=’0’ ) -- 11+0<br />
or (MSC_SFT=0 and TAPCNT=0x7F5 and DISINC=’1’ ) -- 11+0<br />
or (MSC_SFT=1 and TAPCNT=0x7FA and MSCNT=0xFFE) -- 5*2+1<br />
or (MSC_SFT=2 and TAPCNT=0x7FD and MSCNT=0xFFC) -- 2*4+3<br />
or (MSC_SFT=3 and TAPCNT=0x7FE and MSCNT=0xFFC) -- 1*8+3<br />
or (MSC_SFT>3 and TAPCNT=0x7FF and MSCNT=0xFF4) -- 0*16+11<br />
or (HC_MEN6=’1’ and HCOUNT=HC_MLR6)) then<br />
MLRAT6:=’1’;<br />
end if;<br />
if RLE=’1’ and SRE=’0’ and CALC_NRL/=0 and<br />
( (MSC_SFT=0 and TAPCNT=0x7F0 and MSCNT=0xFFF<br />
and DISINC=’0’ ) -- 15+0<br />
or (MSC_SFT=0 and TAPCNT=0x7F1 and DISINC=’1’ ) -- 15+0<br />
or (MSC_SFT=1 and TAPCNT=0x7F8 and MSCNT=0xFFE) -- 7*2+1<br />
or (MSC_SFT=2 and TAPCNT=0x7FC and MSCNT=0xFFC) -- 3*4+3<br />
or (MSC_SFT=3 and TAPCNT=0x7FE and MSCNT=0xFF8) -- 1*8+7<br />
or (MSC_SFT>3 and TAPCNT=0x7FF and MSCNT=0xFF0) -- 0*16+15<br />
or (HC_MEN10=’1’ and HCOUNT=HC_MLR10)) then<br />
MLRAT10:=’1’;<br />
end if;<br />
Abbildung 67: Speedchart-Diagramm VIDEO/RELOAD/RL REFRESH<br />
Anhang C.2<br />
Seite 100
Abbildung 68: Speedchart-Diagramm VIDEO/RELOAD/RL ARBIT<br />
RL_ARBIT<br />
REF<br />
Subdiag Actions of <br />
A: REFPFNR_ot :=REF_PFNR;<br />
REFRQNR_ot :=REF_RQNR;<br />
HCMEN6_ot :=HC_MEN6;<br />
HCMLR6_ot :=HC_MLR6 mod 65536;<br />
HCMEN10_ot :=HC_MEN10;<br />
HCMLR10_ot :=HC_MLR10 mod 65536;<br />
A: REF_ack:=’0’;<br />
T4 #2<br />
T6 #0<br />
T5<br />
C: REF_PFNR/=REF_RQNR<br />
and RELAT6=’0’<br />
and MLRAT6=’0’<br />
and ARB_busy=’0’<br />
A: REF_ack:=’1’;<br />
C: ((REF_RQNR +16 -REF_PFNR) mod 16) > 12<br />
-- more than 12 refresh cycles lagging<br />
and ARB_busy=’0’<br />
A: REF_ack:=’1’;<br />
entry<br />
T1<br />
stdby<br />
A: SMR_ack:=’0’;<br />
T3<br />
T2 #1<br />
C: SRE=’1’ and RLE=’1’<br />
and SMR_request=’1’<br />
and ARB_busy=’0’<br />
A: SMR_ack:=’1’;<br />
SMR<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.2<br />
Seite 101
Abbildung 69: Video-Timing-Signale im Vollbildbetrieb, interne Synchronisation<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/s_hcount<br />
/s_hcounthex<br />
/s_vcount<br />
/s_vcounthex<br />
/hsync_in<br />
/hsync_ina1<br />
a1<br />
/hsync_out<br />
/hsync_outiX<br />
iX<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/csync_in<br />
/csync_ina1<br />
a1<br />
/csync_out<br />
/csync_outiX<br />
iX<br />
/vline_ot<br />
/vline_othex<br />
/cblank_out<br />
/cblank_outa0<br />
a0<br />
/vsync_in<br />
/vsync_ina1<br />
a1<br />
/vsync_out<br />
/vsync_outiX<br />
iX<br />
/vblank_out<br />
/vblank_outa0<br />
a0<br />
/iphase_ot<br />
/iphase_othex<br />
/odd_ot /odd_ota0<br />
a0<br />
VHDL 2000<br />
0<br />
07 08 09 00 01 02 03 04 05 06 07 08 09 00 01<br />
05 ff 00 01 02 03 04 05 ff<br />
7 0 7 0<br />
2.5us 3us 3.5us 4us 4.5us 5us 5.5us 6us 6.5us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 102
Abbildung 70: Video-Timing-Signale im Halbbildbetrieb (NTSC), interne Synchronisation<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/s_hcount<br />
/s_hcounthex<br />
/s_vcount<br />
/s_vcounthex<br />
/hsync_in<br />
/hsync_ina1<br />
a1<br />
/hsync_out<br />
/hsync_outiX<br />
iX<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/csync_in<br />
/csync_ina1<br />
a1<br />
/csync_out<br />
/csync_outiX<br />
iX<br />
/vline_ot<br />
/vline_othex<br />
/cblank_out<br />
/cblank_outa0<br />
a0<br />
/vsync_in<br />
/vsync_ina1<br />
a1<br />
/vsync_out<br />
/vsync_outiX<br />
iX<br />
/vblank_out<br />
/vblank_outa0<br />
a0<br />
/iphase_ot<br />
/iphase_othex<br />
/odd_ot /odd_ota0<br />
a0<br />
VHDL 2000<br />
1<br />
0d 0e 0f 10 11 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 00 01<br />
06 ff 01 03 05 07 ff<br />
7 2 0 3 6 7 2 0<br />
13.5us 14us 14.5us 15us 15.5us 16us 16.5us 17us 17.5us 18us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 103
Abbildung 71: Video-Timing-Signale im Vollbildbetrieb, HSYNC und VSYNC sind Eingänge<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/s_hcount<br />
/s_hcounthex<br />
/s_vcount<br />
/s_vcounthex<br />
/hsync_in<br />
/hsync_ina1<br />
a1<br />
/hsync_out<br />
/hsync_outiX<br />
iX<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/csync_in<br />
/csync_ina1<br />
a1<br />
/csync_out<br />
/csync_outiX<br />
iX<br />
/vline_ot<br />
/vline_othex<br />
/cblank_out<br />
/cblank_outa0<br />
a0<br />
/vsync_in<br />
/vsync_ina1<br />
a1<br />
/vsync_out<br />
/vsync_outiX<br />
iX<br />
/vblank_out<br />
/vblank_outa0<br />
a0<br />
/iphase_ot<br />
/iphase_othex<br />
/odd_ot /odd_ota0<br />
a0<br />
VHDL 2000<br />
6<br />
07 08 09 00 01 02 03<br />
05 ff 00<br />
7 0 7<br />
78.5us 79us 79.5us 80us 80.5us 81us 81.5us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 104
Abbildung 72: Video-Timing-Signale im Halbbildbetrieb (NTSC), HSYNC und VSYNC sind Eingänge<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/s_hcount<br />
/s_hcounthex<br />
/s_vcount<br />
/s_vcounthex<br />
/hsync_in<br />
/hsync_ina1<br />
a1<br />
/hsync_out<br />
/hsync_outiX<br />
iX<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/csync_in<br />
/csync_ina1<br />
a1<br />
/csync_out<br />
/csync_outiX<br />
iX<br />
/vline_ot<br />
/vline_othex<br />
/cblank_out<br />
/cblank_outa0<br />
a0<br />
/vsync_in<br />
/vsync_ina1<br />
a1<br />
/vsync_out<br />
/vsync_outiX<br />
iX<br />
/vblank_out<br />
/vblank_outa0<br />
a0<br />
/iphase_ot<br />
/iphase_othex<br />
/odd_ot /odd_ota0<br />
a0<br />
VHDL 2000<br />
1f 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 1f<br />
c<br />
ff 01 03 05 07 09 0b 0d 0f 11 13 15 17 ff<br />
2 0 3 6 7 2 0<br />
186us 188us 190us 192us 194us 196us 198us 200us 202us 204us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 105
Abbildung 73: Video-Timing-Signale im Vollbildbetrieb, CSYNC ist Eingang<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/s_hcount<br />
/s_hcounthex<br />
/s_vcount<br />
/s_vcounthex<br />
/hsync_in<br />
/hsync_ina1<br />
a1<br />
/hsync_out<br />
/hsync_outiX<br />
iX<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/csync_in<br />
/csync_ina1<br />
a1<br />
/csync_out<br />
/csync_outiX<br />
iX<br />
/vline_ot<br />
/vline_othex<br />
/cblank_out<br />
/cblank_outa0<br />
a0<br />
/vsync_in<br />
/vsync_ina1<br />
a1<br />
/vsync_out<br />
/vsync_outiX<br />
iX<br />
/vblank_out<br />
/vblank_outa0<br />
a0<br />
/iphase_ot<br />
/iphase_othex<br />
/odd_ot /odd_ota0<br />
a0<br />
VHDL 2000<br />
a<br />
0f 0f 0f 0f 0f 0f<br />
07 08 09 00 01 02<br />
04 05 ff<br />
7 0 7<br />
134us 134.5us 135us 135.5us 136us 136.5us 137us 137.5us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 106
Midline Reload kurz vor Zeilenende (Zeile 012, TAP 000) und Newline Reload (Zeile 013, TAP 1CA)<br />
Abbildung 74: VRAM-Reload-Signale für XZ=0, MSC SFT=0:<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
011 012 013<br />
7f7 7f8 7f9 7fa 7fb 7fc 7fd 7fe 7ff 7ca<br />
fff 000<br />
1ff 012 000 1ff 013 1ca 1ff<br />
011 012 013<br />
1f7 1f8 1f9 1fa 1fb 1fc 1fd 1fe 1ff 000 001 1ca<br />
00<br />
01 00 01<br />
5 6<br />
5<br />
3<br />
0 6 0 6 0<br />
1 0 1 0 1 0<br />
21.1us 21.15us 21.2us 21.25us 21.3us 21.35us 21.4us 21.45us 21.5us 21.55us 21.6us 21.65us 21.7us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 107
Abbildung 75: VRAM-Reload-Signale für XZ=0, MSC SFT=0:<br />
Newline Reload (Zeile 011, TAP 1C9) und Refresh<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
3<br />
00f 011<br />
7fa 7fb 7fc 7fd 7fe 7c9 7ca 7cb<br />
fff 000 fff<br />
1ff 011 1c9 1ff<br />
00f 011<br />
1fa 1fb 1fc 1fd 1fe 1ff 000 1c9 1ca 1cb<br />
00<br />
00 01<br />
3 4<br />
3 4<br />
0 6 0<br />
1 0 1 0<br />
19.15us 19.2us 19.25us 19.3us 19.35us 19.4us 19.45us 19.5us 19.55us 19.6us 19.65us 19.7us 19.75us 19.8us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 108
Abbildung 76: VRAM-Reload-Signale für XZ=2, MSC SFT=2:<br />
Newline Reload (Zeile 009, TAP 1FD) und Midline Reload (Zeile 00A, TAP 000)<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
1<br />
008 009 00a<br />
606 7fd 7fe 7ff 600 601<br />
000<br />
1ff 009 1fd 1ff 00a 000 1ff<br />
008 009 00a<br />
006 007 1fd 1fe 1ff 000 001<br />
00<br />
00 01 00<br />
3 4<br />
3<br />
0 6 0 6 0<br />
0 3 1 0 1 0 1 0<br />
8.6us 8.7us 8.8us 8.9us 9us 9.1us 9.2us 9.3us 9.4us 9.5us 9.6us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 109
Newline Reload (Zeile 005, TAP 1FE) und Midline Reload vor Beginn des Anzeigebereichs (Zeile 006, TAP 000)<br />
Abbildung 77: VRAM-Reload-Signale für XZ=0, MSC SFT=0:<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
004 005 006<br />
61d 61e 7fe 7ff 600 601 602<br />
fff 000 fff<br />
1ff 005 1fe 1ff 006 000 1ff<br />
004 005 006<br />
01d 01e 01f 020 1fe 1ff 000 001 002<br />
00<br />
00 01 00<br />
0<br />
0<br />
0<br />
0 6 0 6 0<br />
1 0 1 0 1<br />
2.8us 2.9us 3us 3.1us 3.2us 3.3us 3.4us 3.5us 3.6us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 110
Newline Reload (Zeile 00F, TAP 1F8), vorgezogener Split Midline Reload (Zeile 010, TAP 000), Refresh und Split<br />
Midline Relaod (Zeile 010, TAP 000)<br />
Abbildung 78: VRAM-Reload-Signale für XZ=0, MSC SFT=0:<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
000 00f 010<br />
000 7f8<br />
fff<br />
4<br />
1ff 00f 1f8 1ff 010 000 1ff 010 000 1ff<br />
013 00f 010<br />
000 1f8<br />
00 01 00<br />
00 02 01<br />
5 6<br />
5 6<br />
0 7 0 2 0 3 0<br />
1 0 1 0 1 0 3 1 0 1<br />
43.8us 43.9us 44us 44.1us 44.2us 44.3us 44.4us 44.5us 44.6us 44.7us 44.8us 44.9us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 111
Newline Reload (Zeile 005, TAP 1FF), Refresh, Midline Reload (Zeile 006, TAP 000) und Refresh<br />
Abbildung 79: VRAM-Reload-Signale für XZ=0, MSC SFT=2:<br />
0s<br />
0s<br />
/pattn /pattnhex<br />
/rowcnt_ot<br />
/rowcnt_othex<br />
/tapcnt_ot<br />
/tapcnt_othex<br />
/mscnt_ot<br />
/mscnt_othex<br />
/cas_ot(0) a1 a1<br />
/ras_ot(0) a1 a1<br />
/rca_ot /rca_othex<br />
/mwe_ot /mwe_ota1<br />
a1<br />
/moe_ot /moe_ota1<br />
a1<br />
/msf_ot /msf_ota0<br />
a0<br />
/ld_ot /ld_ota1<br />
a1<br />
/msc_ot /msc_ota1<br />
a1<br />
/hblank_out<br />
/hblank_outa0<br />
a0<br />
/sr_row_ot<br />
/sr_row_othex<br />
/sr_cnt_ot<br />
/sr_cnt_othex<br />
/vclk_in /vclk_ina1<br />
a1<br />
/calc_nrh_ot<br />
/calc_nrh_othex<br />
/calc_nrl_ot<br />
/calc_nrl_othex<br />
/smr_req_ot<br />
/smr_req_ota0<br />
a0<br />
/refrqnr_ot<br />
/refrqnr_othex<br />
/refpfnr_ot<br />
/refpfnr_othex<br />
/a_sam_ot<br />
/a_sam_othex<br />
/a_ctrl_ot<br />
/a_ctrl_othex<br />
/rel6_ot /rel6_ota0<br />
a0<br />
/mlr6_ot /mlr6_ota0<br />
a0<br />
VHDL 2000<br />
2<br />
004 005 006<br />
603 7ff 600 601<br />
000<br />
1ff 005 1ff 006 000 1ff<br />
004 005 006<br />
003 1ff 000 001<br />
00<br />
00 01 00<br />
1 2<br />
0 1<br />
0 6 0 6 0<br />
1 0 1 0 3 1 0 1 0<br />
13.5us 13.6us 13.7us 13.8us 13.9us 14us 14.1us 14.2us 14.3us 14.4us 14.5us 14.6us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang C.3<br />
Seite 112
Abbildung 80: Hierarchie der Controller- und Prozessor-Einheit (Design ” TIM“) mit Seitenangaben<br />
TIM<br />
HOST<br />
HOST<br />
HOST_ACC HOST_CTRL<br />
CONTROL<br />
CONTROL<br />
TIM_ACCESS<br />
REG_WRITE<br />
REG_WRITE<br />
REG_READ<br />
REG_READ<br />
MEM_ACCESS<br />
MEM_ACCESS<br />
MEM_CYCLES ADDR_CALC BIT_SHIFT BIT_MASK MEM_ADDRES.. GPU_FIFO_R GPU_FIFO_W PIXBLT_PAT..<br />
INTERRUPT<br />
GR_CPU<br />
GR_CPU<br />
GP_CMD<br />
CLIP<br />
CLIP<br />
PIXBLT<br />
PIXBLT<br />
DADR_SPLIT DY_SPLIT SADR_SPLIT SY_SPLIT PIX_TO_BIT AREA_TO_PI..<br />
REG_ALIAS ASYNC_ACT<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.1<br />
Seite 113
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Current setting:<br />
Synchronous mode: Synthesis Silcsyn<br />
External clock: MClk_in<br />
Rising edge<br />
Period: 1 ns<br />
External reset: RESET_in<br />
Active level high<br />
Asynchronous reset<br />
Resolution scale: ps<br />
Time scale: ns<br />
Language: VHDL-like<br />
Design Variable:<br />
-- constants<br />
constant lo32(32): logic :="00000000000000000000000000000000";<br />
constant hi32(32): logic :="11111111111111111111111111111111";<br />
constant lo31(31): logic :="0000000000000000000000000000000";<br />
constant lo27(27): logic :="000000000000000000000000000";<br />
constant lo16(16): logic :="0000000000000000";<br />
constant hi16(16): logic :="1111111111111111";<br />
constant lo14(14): logic :="00000000000000";<br />
constant hi14(14): logic :="11111111111111";<br />
constant lo8(8): logic :="00000000";<br />
constant hi8(8): logic :="11111111";<br />
constant lo4(4): logic :="0000";<br />
constant hi4(4): logic :="1111";<br />
type int27 is integer(0 to 0x07FFFFFF);<br />
type int16 is integer(0 to 0xFFFF);<br />
type int8 is integer(0 to 0x00FF);<br />
type int5 is integer(0 to 0x001F);<br />
type int4 is integer(0 to 0x000F);<br />
type int3 is integer(0 to 0x0007);<br />
type int2 is integer(0 to 0x0003);<br />
-- pins: name_in<br />
-- name_out<br />
-- name_oe ’1’ for output<br />
-- ’0’ for input<br />
-- pins for host interface<br />
-- AD_in(32): in logic;<br />
AD_out(32): out logic;<br />
AD_oe(32): out logic :=lo32;<br />
-- D_in(32): in logic;<br />
D_out(32): out logic;<br />
D_oe(32): out logic :=lo32;<br />
-- AS_in: in logic;<br />
-- DS_in: in logic;<br />
DS_out: out logic;<br />
DS_oe: out logic :=’0’;<br />
-- BS_in(4): in logic;<br />
CS_in: in logic;<br />
-- RS_in: in logic;<br />
-- HWE_in: in logic;<br />
INT_out: out logic :=’0’;<br />
INT_oe: out logic :=’0’;<br />
Rdy_in: in logic;<br />
-- Rdy_out: out logic;<br />
Rdy_oe: out logic :=’0’;<br />
MUX_in: in logic;<br />
-- pins for memory interface<br />
RCA_out(14): out logic;<br />
RAS_out(4): out logic;<br />
CAS_out(4): out logic;<br />
ACS_out(4): out logic;<br />
MWE_out: out logic;<br />
MOE_out: out logic;<br />
MSF_out: out logic;<br />
MSC_out: out logic;<br />
MD_in(32): in logic;<br />
MD_out(32): out logic;<br />
MD_oe(32): out logic;<br />
-- pins for asynchronous delay control<br />
MSC_del0: out logic;<br />
MSC_del2: out logic;<br />
MSC_del4: out logic;<br />
MSC_del8: out logic;<br />
MTR_del0: out logic;<br />
MTR_del2: out logic;<br />
MTR_del4: out logic;<br />
MTR_del8: out logic;<br />
LD_del0: out logic;<br />
LD_del2: out logic;<br />
LD_del4: out logic;<br />
LD_del8: out logic;<br />
-- pins / other functions<br />
RESET_in: in logic;<br />
MClk_in: in logic;<br />
DWE_out: out logic :=’1’;<br />
-- pins for tests only<br />
R_CONF_out(32): out logic;<br />
R_4_out(32): out logic;<br />
-- PATTN(4): in logic; -- test pattern section<br />
-- (no function)<br />
MBW_ot(2): out logic;<br />
HBW_ot(2): out logic;<br />
PATTN_ot(4): out logic;<br />
ADin_ot(32): out logic;<br />
ASin_ot: out logic;<br />
DSin_ot: out logic;<br />
BSin_ot(4): out logic;<br />
RSin_ot: out logic;<br />
HWEin_ot: out logic;<br />
Rdyout_ot: out logic;<br />
FIFOIN_ot(3): out logic;<br />
FIFOOUT_ot(3): out logic;<br />
CAS_MASK_ot(4): out logic;<br />
ANY_CYCLE_ot: out logic;<br />
MEM_GWRITE_ot: out logic;<br />
GPU_WNUM_ot(4): out logic;<br />
MEM_GREAD_ot: out logic;<br />
GPU_RNUM_ot(4): out logic;<br />
PRE_READ_ot: out logic;<br />
PRE_MASK_ot(32):out logic;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 81: Typen, Konstanten und externe Signale im Design ” TIM“<br />
Anhang D.2<br />
Seite 114
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
¨¢¨¢©¤¡© ¢¨¢¨ ¥ <br />
<br />
£¤§¦©¨¦©©¤¨¦¤¢£<br />
¦¥¢¨¢£¥¤¢¦¥¢¡¢£¡© ¥© £<br />
<br />
© ¢¡ ¢<br />
¢ ¢¡ ¢<br />
<br />
£©¢¡ ¢¦ ¡ ¢ ¡<br />
<br />
¢ ¢¡ ¢<br />
£©¢¡<br />
¢¤§¦©¤ <br />
¢§¥ © ¢¡ ©¢¡¥<br />
© ¢¡ ©¢¡¥<br />
<br />
¥¥§ ¢¡ ©¢¡¥<br />
¢ ¡ ¢¢¡ ©¢¡©¢¥<br />
<br />
© ¢¡ ©¢¡¥<br />
©¥© © ¢¡ ©¢¡¥<br />
<br />
¥ ¥ © ¢¡ ©¢¡¥<br />
©¥ ¢¡ ©¢¡¥<br />
<br />
¥ ¢¡ ©¢¡¥<br />
¢ ¢¡ ©¢¡©¢¥<br />
<br />
£¢¢ ¢¡ ©¢¡©¢¥<br />
¢§ ¢¢¡ ©¢¡©¢¥<br />
<br />
¥¢§ ¢¢¡ ©¢¡©¢¥<br />
©¢ ¢ ¢¡ ©¢¡©¢¥<br />
<br />
¢¢¡ ©¢¡©¢¥<br />
¥ ¢¡ ©¢¡¥<br />
<br />
¢¡ ©¢¡¥<br />
© ¢ ¢¡ ©¢¡©¢¥<br />
<br />
© ¢ ¢¡ ©¢¡©¢¥<br />
¢¡ ©¢¡¥<br />
<br />
¢¡ ©¢¡¥<br />
¥©¢§ © ¢¡ ©¢¡¥<br />
<br />
©¢§ ©¢¡ ©¢¡¥<br />
¢ ¢¡ ©¢¡¥<br />
<br />
© ¡ © ¢¡ ©¢¡¥<br />
¢ ¡ © ¢¡ ©¢¡¥<br />
<br />
¢ ©¢¡ ©¢¡¥<br />
¢ ©¢¡ ©¢¡¥<br />
<br />
¢¢ ¢¢¡ ©¢¡©¢¥<br />
¢¢ ¢¢¡ ©¢¡©¢¥<br />
<br />
¢¢ ¢¢¡ ©¢¡©¢¥<br />
¢¢ ¢¢¡ ©¢¡©¢¥<br />
<br />
¢§ ¢¡ ©¢¡¥<br />
¢ ¢¡ ©¢¡¥<br />
<br />
¢§ ¢ ¢¡ ©¢¡¥<br />
¢ ¢¡ ©¢¡¥<br />
<br />
©¢¥ ¢¡ ©¢¡¥<br />
©§¥ ¢¡ ©¢¡¥<br />
<br />
¢ ¢¡ ©¢¡©¢¥<br />
¢¢¢¥ ¢¡ ©¢¡¥<br />
<br />
¢¥¥ ¢¡ ©¢¡¥<br />
¢© ¢¡ ©¢¡¥<br />
<br />
©© ¢¡ ©¢¡¥<br />
¢§ ¢¡ ©¢¡¥<br />
<br />
¢¥ ¢¡ ©¢¡¥<br />
¢¢¢¥ ¢¡ ©¢¡¥<br />
<br />
©¥¥ ¢¡ ©¢¡¥<br />
©© ¢¡ ©¢¡¥<br />
<br />
© ¢¡ ©¢¡¥<br />
¢§ ¢¡ ©¢¡¥<br />
<br />
¥ ¢¡ ©¢¡¥<br />
¢ ¢¡ ©¢¡©¢¥<br />
<br />
¢ ¢¡ ©¢¡©¢¥<br />
© ¢¡ ©¢¡¥<br />
<br />
© ¢¡ ©¢¡¥<br />
© ¢¡ ©¢¡¥<br />
<br />
¢© ¢¡ ©¢¡¥<br />
¢© ¢¡ ©¢¡¥<br />
<br />
¤¢© ¢¡ ©¢¡¥<br />
© ¢¡ ©¢¡¥<br />
<br />
¢© ¢¡ ©¢¡¥<br />
<br />
¢¤§¦©¦¤¨¢¨©¤©¤<br />
<br />
©¢ ¢¡ ¥<br />
¢¡ ¥<br />
<br />
¢¡ ¥<br />
¢¡ ¥<br />
<br />
¢¡ ¥<br />
¢¡ ¥<br />
<br />
© ¢¡ ¥<br />
¢¡ ¥<br />
<br />
¥¢ ¢¡ ¥<br />
¢ ¢¡ ¥<br />
<br />
¢¡ ¥<br />
©¦¥<br />
¢¡ ¥<br />
§©¦¥<br />
¢¡ ¥<br />
¢ ¢¡ ¥<br />
©¦¥<br />
¥ ¢¡ ¥<br />
¢¡ ¥<br />
<br />
¢¡ ¥<br />
¥ ¢¡ ¥<br />
©¢<br />
¢ ¢¡ ¥<br />
¢¡ ¥<br />
<br />
§©¦¥ ¢¡ ¥<br />
¢¢ ¢¡ ¥<br />
<br />
¥ ¢¡ ¥<br />
¥ ¥ ¢¡ ¥<br />
¥<br />
¥ ¢¡ ¥<br />
¥ ¥ ¢¡ ¥<br />
¥<br />
¢ ¢¡ ¥<br />
¥ ¢¡ ¥<br />
<br />
¥ ¢¡ ¥<br />
¢ ¥ ¢¡ ¥<br />
©<br />
¢¡ ¥<br />
¢<br />
¢ ¥ ¢¡ ¥<br />
¢¡ ¥<br />
<br />
¢¡ ¥<br />
©<br />
¥ ¥ ¢¡ ¥<br />
¥ ¥ ¢¡ ¥<br />
<br />
¢¡ ¥<br />
¢¡ ¥<br />
<br />
§¢¥ ¢¡ ¥<br />
<br />
© ¢¡ ¥<br />
© ¢¡ ¥<br />
<br />
© ¢¡ ¥<br />
<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 82 (zweispaltig): Variablen im Diagramm TIM<br />
© ¢¡ ¥<br />
© © ¢¡ ©¢¡©<br />
<br />
¥© © ¢¡ ©¢¡©<br />
© £¢¦©¥<br />
<br />
£¢¦<br />
©<br />
©<br />
£¢¦<br />
© £¢¦©¥ <br />
£¢¦<br />
©<br />
© £¢¦<br />
©¥ £¢¦<br />
<br />
£¢¦<br />
¢§<br />
¥<br />
£¢¦ <br />
£¢¦<br />
¢§<br />
¢<br />
¢ £¢¦<br />
¢ £¢¦ <br />
£¢¦<br />
<br />
£¢¦<br />
<br />
¢ ¥ ¢¡ ©¢¡©<br />
¢ £¢¦¥<br />
<br />
¥¢ ¥ ¢¡ ©¢¡©<br />
<br />
¥¢ £¢¦¥<br />
¥¡¦ <br />
§ ¦¢¥ ¢¡ ¢¥©¢©<br />
§ ¦¥ ¢¡ ¢¥©<br />
<br />
¦¥ ¢¡ ¢¥©<br />
¦¥ ¢¡ ¢¥©<br />
<br />
¦ ¢¡ ¢<br />
¥¢ ¦ ¢¡ ¢<br />
<br />
¦¢ ¢¡ ¢¥¢¥<br />
¢ ¦¢ ¢¡ ©¢¡©¢¥<br />
<br />
¡£¢¦©£¨ ©¢ ¤¢§¥¢¨¦¥¢¡¢£<br />
<br />
£ ¢ ¢¡ ©¢¡©¢¥<br />
¥ £ ¥ ¢¡ ¢¥©<br />
©<br />
£ ¢¡ ¢<br />
£ ¢¡ ¢<br />
¥<br />
£ ¢¡ ¢<br />
£ ¢¡ ¢<br />
<br />
¡¦ ¢¡ ¢<br />
<br />
¢ ¢¡ ©¢¡©¢¥<br />
©¢ ¢ ¢¡ ©¢¡©¢¥<br />
©¢<br />
¥ ¥ ¢¡ ©¢¡©©<br />
©¢ <br />
©¢<br />
¢¡ ¢<br />
©¢ ¥§ £¢¦ <br />
¢ £¢¦<br />
©¢<br />
¥ ¢¡ ©¢¡©©<br />
<br />
¦¡©¤¦¤¢¢¡ ¨¢¢£¥¢£¢¦<br />
<br />
£¢¦¨¢ ¤¡¥ ¢¢©§¦<br />
© <br />
©<br />
£¢¦¨¢ ¤¡¥ ¢¢¦<br />
© £¢¦¨¢ ©¤§¦¢©§¦<br />
<br />
£¢¦¨¢ ©¤§¦¢¦<br />
©<br />
¢¡¢£¢¦¥¢¡© §£¢¦©¢¨ ¦¥¢¡¢£<br />
<br />
© ¢¡ ¢<br />
¡<br />
¢¡ ¢<br />
¡<br />
£¢¦<br />
¡<br />
£¢¦<br />
¡<br />
© £¢¦© ¥¢¢£¢¦£ © <br />
<br />
© £¢¦© ¥¢¢£¢¦£ © <br />
©<br />
<br />
£¢¦© ¥¢¢£¢¦£ © <br />
© £¢¦© ¥¢¢£¢¦£ © <br />
<br />
£¢¦©¥ £¨ ¨¢©¤¤ © <br />
©<br />
£¢¦©¥ £¨ ¨¢©¤¤ © <br />
©<br />
©<br />
£¢¦©¥ £¨ ¨¢©¤¤ © <br />
© £¢¦©¥ £¨ ¨¢©¤¤ © <br />
<br />
£¢¦© ¥£ ¥ ¤¡¥ ¥¡©¤<br />
©<br />
£¢¦© ¥£ ¥ ©¤§¦ ¥¡©¤<br />
©<br />
¥ ¢© £¢¦ ¡ ¢¡¡¦¢¦¥¡©¤¢¦¥¢¡¢£<br />
¡<br />
¥ £¢¦ ¡ ¢¡£¦¥¡©¤¢¦¥¢¡¢£<br />
¡<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥ ¡ ¥¦©¨¦©¨¢¡<br />
¡ ¥ ¢¢¢¡ ©¢¡©¢¥<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
¡ ¥ ¢¢¡ ©¢¡©¢¥<br />
<br />
£¢¦©¢¦¢©©¤§¦£©¤<br />
<br />
¢¡ ¢ ¢¨¦© ¢¢¡ ¤ ¦¥¢¡¢£<br />
¥ <br />
¥<br />
¢¡ ¢ ¢¨¦© ¢¢¡ ¤ ¦¥¢¡¢£<br />
<br />
¥ ¢¡ ¢ ¢¨¦© ¢¢¡ ¤ ¦¥¢¡¢£<br />
¥¥ ¢¡ ¢<br />
<br />
¢¡ ¢<br />
¥<br />
¥ ¢¡ ¢ ¢¨¦© ¢¢¡ ¤ ¦¥¢¡¢£<br />
<br />
Anhang D.2<br />
Seite 115
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
HOST<br />
T1<br />
entry host<br />
Abbildung 83: Speedchart-Diagramm TIM/HOST<br />
MEM_ACCESS<br />
T1<br />
entry mem_access<br />
Abbildung 85: TIM/CONTROL/MEM ACCESS<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
CONTROL<br />
entry<br />
T1<br />
A: RS_MUX :=MUX_in;<br />
RS_Rdy :=Rdy_in;<br />
R_CONFIG(1) :=AS_in;<br />
R_CONFIG(0) :=DS_in;<br />
Anhang D.2<br />
Seite 116<br />
control<br />
Abbildung 84: Speedchart-Diagramm TIM/CONTROL<br />
GR_CPU<br />
T1<br />
entry gr_cpu<br />
Abbildung 86: Speedchart-Diagramm TIM/GR CPU
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
HOST_ACC<br />
entry<br />
T2<br />
T3<br />
T4<br />
T8<br />
stdby<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T1<br />
C: HOST_ACTION=1<br />
A: RS_in:=HOST_RS;<br />
AD_in:=HOST_A;<br />
HWE_in:=’0’;<br />
BS_in:=HOST_BS;<br />
T9<br />
write<br />
S2<br />
S3<br />
S4<br />
A: AS_in:=’0’;<br />
A: AD_in:=HOST_D<br />
after 1ns;<br />
-- spdch only<br />
A: DS_in:=’0’;<br />
T6<br />
T10<br />
T12<br />
T11<br />
read<br />
S6<br />
S7<br />
wait_rdy<br />
Abbildung 87: Speedchart-Diagramm TIM/HOST/HOST ACC<br />
C: HOST_ACTION=2<br />
A: RS_in:=HOST_RS;<br />
AD_in:=HOST_A;<br />
HWE_in:=’1’;<br />
BS_in:=HOST_BS;<br />
A: AS_in:=’0’;<br />
A: DS_in:=’0’;<br />
T7<br />
C: RDY_OUT=’0’<br />
A: AS_in:=’1’;<br />
DS_in:=’1’;<br />
HWE_in:=’1’;<br />
AD_in:=hi32;<br />
HOST_ACTION:=0;<br />
Anhang D.2<br />
Seite 117<br />
T5<br />
C: RDY_out=’1’<br />
done
Abbildung 88: Speedchart-Diagramm TIM/HOST/HOST CTRL<br />
HOST_CTRL<br />
entry<br />
T1 T20 #0<br />
T3 #0<br />
S10<br />
S1<br />
A: HOST_STEP:=0;<br />
HOST_ACTION:=0;<br />
PATTN:=15;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- set registers<br />
-- (HBW32)<br />
T19<br />
case HOST_STEP is<br />
when 0 => -- write $____0303<br />
-- to reg. 1<br />
-- MBW32, HBW32<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000303;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $3E3F7E__<br />
-- to reg. 2<br />
-- MOD:="111" 13:11<br />
-- MOC:="110" 10:8<br />
-- RTO:="00" 7:6<br />
-- MOB:="111" 5:3<br />
-- MOA:="111" 2:0<br />
-- ASL:="111" 6:4 ACS=31:30<br />
-- PEN:=’1’ 3<br />
-- RSL:="110" 2:0 RAS=29:28<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x3E3F7E00;<br />
HOST_BS:="0001";<br />
HOST_ACTION:=1;<br />
when 2 => -- SSTART:=1MB<br />
HOST_A:=0x00000018; -- R6<br />
HOST_D:=0x00100000;<br />
HOST_BS:="0000";<br />
HOST_ACTION:=1;<br />
when 3 => -- DSTART:=2MB<br />
HOST_A:=0x0000001C; -- R7<br />
HOST_D:=0x00200000;<br />
HOST_BS:="0000";<br />
HOST_ACTION:=1;<br />
when 4 => -- SINC:=260 Pix<br />
-- DINC:=520 Pix<br />
HOST_A:=0x0000000C; -- R3<br />
HOST_D:=0x01040208;<br />
HOST_ACTION:=1;<br />
when 5 => -- SADR: Y=24, X=18<br />
HOST_A:=0x0000002C; -- R11<br />
HOST_D:=0x00180012;<br />
HOST_ACTION:=1;<br />
when 6 => -- DADR: Y=36, X=6<br />
HOST_A:=0x00000030; -- R12<br />
HOST_D:=0x00240006;<br />
HOST_ACTION:=1;<br />
when 7 => -- DX=104, DY=3<br />
HOST_A:=0x00000034; -- R13<br />
HOST_D:=0x00680003;<br />
HOST_ACTION:=1;<br />
when 8 => -- COMMAND PixBLT<br />
HOST_A:=0x0000003C; -- R15<br />
HOST_D:=0x00000032;<br />
HOST_BS:="1110";<br />
HOST_ACTION:=1;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
C: HOST_STEP=200<br />
A: HOST_STEP:=0;<br />
PATTN:=0;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- set registers<br />
-- (HBW32)<br />
T2<br />
case HOST_STEP is<br />
when 0 => -- SADR: Y=24, X=18<br />
HOST_A:=0x0000002C; -- R11<br />
HOST_D:=0x00180012;<br />
HOST_BS:="0000";<br />
HOST_ACTION:=1;<br />
when 1 => -- DADR: Y=36, X=6<br />
HOST_A:=0x00000030; -- R12<br />
HOST_D:=0x00240006;<br />
HOST_ACTION:=1;<br />
when 2 => -- DX=13, DY=2<br />
HOST_A:=0x00000034; -- R13<br />
HOST_D:=0x000D0002;<br />
HOST_ACTION:=1;<br />
when 3 => -- PSIZE 32bit/pix<br />
HOST_A:=0x00000038; -- R14<br />
HOST_D:=0x20000000;<br />
HOST_ACTION:=1;<br />
when 5 => -- COMMAND PixBLT<br />
-- start bot right<br />
-- des:=des + sou<br />
HOST_A:=0x0000003C; -- R15<br />
HOST_D:=0x0000E332;<br />
HOST_BS:="1100";<br />
HOST_ACTION:=1;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
C: HOST_STEP=361<br />
A: HOST_STEP:=0;<br />
PATTN:=1;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (no page mode)<br />
-- (MBW8, HBW32)<br />
S2<br />
T4<br />
case HOST_STEP is<br />
when 0 => -- write $____0003<br />
-- to reg. 1<br />
-- MBW8, HBW32<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000003;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $____76__<br />
-- to reg. 2<br />
-- PEN=’0’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007600;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 2 => -- write $23456789<br />
-- to mem 00918454<br />
HOST_A:=0x00918454;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0000";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 3 => -- write $1BCD____<br />
-- to mem 00918458<br />
HOST_A:=0x00918458;<br />
HOST_D:=0x1BCDEF01;<br />
HOST_BS:="0011";<br />
HOST_ACTION:=1;<br />
when 4 => -- write $__45____<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1011";<br />
HOST_ACTION:=1;<br />
when 5 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_BS:="0101";<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T5 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=2;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (page mode)<br />
-- (MBW8, HBW32)<br />
S3<br />
T6<br />
case HOST_STEP is<br />
when 0 => -- write $____7E__<br />
-- to reg. 2<br />
-- PEN=’1’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007E00;<br />
HOST_BS:="1101";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $23456789<br />
-- to mem 00918454<br />
HOST_A:=0x00918454;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0000";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 2 => -- write $1BCD____<br />
-- to mem 00918458<br />
HOST_A:=0x00918458;<br />
HOST_D:=0x1BCDEF01;<br />
HOST_BS:="0011";<br />
HOST_ACTION:=1;<br />
when 3 => -- write $__45____<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1011";<br />
HOST_ACTION:=1;<br />
when 7 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_BS:="0101";<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T7 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=3;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (page mode)<br />
-- (MBW16, HBW32)<br />
S4<br />
T8<br />
case HOST_STEP is<br />
when 0 => -- write $____0103<br />
-- to reg. 1<br />
-- MBW16, HBW32<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000103;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $____7E__<br />
-- to reg. 2<br />
-- PEN=’1’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007E00;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 2 => -- write $2345__89<br />
-- to mem 009188AC<br />
HOST_A:=0x009188AC;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0010";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 3 => -- write $2345__89<br />
-- to mem 009188B0<br />
HOST_A:=0x009188B0;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0010";<br />
HOST_ACTION:=1;<br />
when 4 => -- write $2345__89<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0010";<br />
HOST_ACTION:=1;<br />
when 5 => -- write $2345__89<br />
-- to mem 77700680<br />
HOST_A:=0x77700680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0010";<br />
HOST_ACTION:=1;<br />
when 6 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T9 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=4;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (no page mode)<br />
-- (MBW32, HBW32)<br />
S5<br />
T10<br />
case HOST_STEP is<br />
when 0 => -- write $____0303<br />
-- to reg. 1<br />
-- MBW32, HBW32<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000303;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $____76__<br />
-- to reg. 2<br />
-- PEN=’0’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007600;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 2 => -- write $23456789<br />
-- to mem 00918454<br />
HOST_A:=0x00918454;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0000";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 3 => -- write $1BCD____<br />
-- to mem 00918458<br />
HOST_A:=0x00918458;<br />
HOST_D:=0x1BCDEF01;<br />
HOST_BS:="0011";<br />
HOST_ACTION:=1;<br />
when 4 => -- write $__45____<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1011";<br />
HOST_ACTION:=1;<br />
when 5 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_BS:="0101";<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T11 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=5;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (page mode)<br />
-- (MBW32, HBW32)<br />
S6<br />
T12<br />
case HOST_STEP is<br />
when 0 => -- write $____7E__<br />
-- to reg. 2<br />
-- PEN=’1’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007E00;<br />
HOST_BS:="1101";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $23456789<br />
-- to mem 00918454<br />
HOST_A:=0x00918454;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="0000";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 2 => -- write $1BCD____<br />
-- to mem 00918458<br />
HOST_A:=0x00918458;<br />
HOST_D:=0x1BCDEF01;<br />
HOST_BS:="0011";<br />
HOST_ACTION:=1;<br />
when 3 => -- write $__45____<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1011";<br />
HOST_ACTION:=1;<br />
when 7 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_BS:="0101";<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T13 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=6;<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (page mode)<br />
-- (MBW32, HBW16)<br />
S7<br />
T14<br />
case HOST_STEP is<br />
when 0 => -- 16B-write $0301<br />
-- to reg. 1 (lo)<br />
-- MBW32, HBW16<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000301;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- 16B-write $7E__<br />
-- to reg. 2 (lo)<br />
-- PEN=’1’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007E00;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 2 => -- 16B-write $__89<br />
-- to 12345678<br />
HOST_A:=0x00919158;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1110";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 3 => -- 16B-write $2345<br />
-- to mem 12345682<br />
HOST_A:=0x12345682;<br />
HOST_D:=0x00002345;<br />
HOST_BS:="1100";<br />
HOST_ACTION:=1;<br />
when 4 => -- 16B-write $45__<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x00004500;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 5 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T15 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=7;<br />
S8<br />
T16<br />
C: HOST_ACTION=0<br />
A: --<br />
-- memory write & read<br />
-- (no page mode)<br />
-- (MBW32, HBW16)<br />
case HOST_STEP is<br />
when 0 => -- 16B-write $0301<br />
-- to reg. 1 (lo)<br />
-- MBW32, HBW16<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000301;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- 16B-write $76__<br />
-- to reg. 2 (lo)<br />
-- PEN=’0’<br />
HOST_A:=0x00000008;<br />
HOST_D:=0x00007600;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 2 => -- 16B-write $__89<br />
-- to 12345678<br />
HOST_A:=0x00919158;<br />
HOST_D:=0x23456789;<br />
HOST_BS:="1110";<br />
HOST_RS:=’1’;<br />
HOST_ACTION:=1;<br />
when 3 => -- 16B-write $2345<br />
-- to mem 12345682<br />
HOST_A:=0x12345682;<br />
HOST_D:=0x00002345;<br />
HOST_BS:="1100";<br />
HOST_ACTION:=1;<br />
when 4 => -- 16B-write $45__<br />
-- to mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_D:=0x00004500;<br />
HOST_BS:="1101";<br />
HOST_ACTION:=1;<br />
when 5 => -- read mem 77775680<br />
HOST_A:=0x77775680;<br />
HOST_ACTION:=2;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
T17 #0<br />
C: HOST_STEP=100<br />
A: HOST_STEP:=0;<br />
PATTN:=8;<br />
S9<br />
T18<br />
C: HOST_ACTION=0<br />
A: --<br />
-- register write & read<br />
-- and test of LOCK bit<br />
-- (HBW32)<br />
case HOST_STEP is<br />
when 0 => -- 16B-write $0303<br />
-- to reg. 1 (lo)<br />
-- MBW32, HBW32<br />
HOST_A:=0x00000004;<br />
HOST_D:=0x00000303;<br />
HOST_BS:="1100";<br />
HOST_RS:=’0’;<br />
HOST_ACTION:=1;<br />
when 1 => -- write $000000FF<br />
-- to reg. 1<br />
HOST_D:=0x000000FF;<br />
HOST_BS:="0000";<br />
HOST_ACTION:=1;<br />
when 2 => -- (LOCK)<br />
HOST_D:=0x123080FF;<br />
HOST_ACTION:=1;<br />
when 3 => -- (test LOCK)<br />
HOST_D:=0x12308045;<br />
HOST_ACTION:=1;<br />
when 4 => -- (1st step unlk)<br />
HOST_D:=0x12307FFF;<br />
HOST_ACTION:=1;<br />
when 5 => -- (test LOCK)<br />
HOST_D:=0x12300045;<br />
HOST_ACTION:=1;<br />
when 6 => -- (test LOCK)<br />
HOST_D:=0x12300045;<br />
HOST_ACTION:=1;<br />
when 7 => -- (1st step unlk)<br />
HOST_D:=0x12307FFF;<br />
HOST_ACTION:=1;<br />
when 8 => -- (2nd step unlk)<br />
HOST_D:=0x123055FF;<br />
HOST_ACTION:=1;<br />
when 9 => -- (test LOCK)<br />
HOST_D:=0x234000FF;<br />
HOST_ACTION:=1;<br />
when 10 => -- (test LOCK)<br />
HOST_D:=0x345000FF;<br />
HOST_ACTION:=1;<br />
end case;<br />
HOST_STEP:=HOST_STEP+1;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.2<br />
Seite 118
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diagram Variables:<br />
-- Variables of Diagram CONTROL<br />
-- address, data & control for RAM access<br />
AD_lat(32): logic;<br />
D_lat(32): logic;<br />
ADS_lat(7): logic;<br />
RS_lat: logic;<br />
BS_lat(4): logic;<br />
CAS_lat(4): logic;<br />
STAT_CLR: logic:=’0’;<br />
-- host input / output data<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
DATA_IN(32): logic; -- host write data<br />
DATA_OUT(32): logic:=lo32; -- read data from TIM<br />
-- ram write data FIFO buffer, 4*32 bits<br />
-- XXX_FIFO0 = position 0<br />
D_FIFO0(32): logic; -- write data<br />
D_FIFO1(32): logic;<br />
D_FIFO2(32): logic;<br />
D_FIFO3(32): logic;<br />
RAM_D_W(32): logic; -- write data of output position<br />
A_FIFO0(32): logic; -- address<br />
A_FIFO1(32): logic;<br />
A_FIFO2(32): logic;<br />
A_FIFO3(32): logic;<br />
RAM_ADDR(32): logic; -- address of output position<br />
CAS_FIFO0(4): logic; -- CAS mask (BS byte select)<br />
CAS_FIFO1(4): logic;<br />
CAS_FIFO2(4): logic;<br />
CAS_FIFO3(4): logic;<br />
CAS_MASK(4): logic; -- CAS mask of output position<br />
-- FIFO control<br />
signal FIFO_IN: int3:=0; -- FIFO input position (low 2 bits)<br />
--^^^^ SIGNAL makes the design behave FSM-like<br />
FIFO_OUT: int3:=0; -- FIFO output position (low 2 bits)<br />
CAS_DONE(4): logic:="0000"; -- ’1’=byte already written<br />
LAST_ROW(14): logic; -- page mode last RAM row<br />
LAST_RAS(4): logic; -- page mode last RAS select signals<br />
LAST_ACS(4): logic; -- page mode last ACS select signals<br />
-- RAM read control<br />
A_READ(32): logic; -- read address<br />
CAS_READ(4): logic; -- read byte mask<br />
READ_DONE: logic;<br />
MEM_READ: logic:=’0’; -- ’1’=perform RAM read<br />
-- RAS address calculation<br />
RS_A(2): logic; -- value of "RAS bank select" address bits<br />
RAS_MASK(4): logic; -- decoded RS_A bits<br />
MOX(3): logic; -- RAS address selector of selected bank<br />
RAM_ROW(14): logic; -- accessed RAM row<br />
RAM_COL(14): logic; -- accessed (1st) RAM column<br />
-- ACS bank calculation<br />
AS_A(2): logic; -- value of "ACS bank select" address bits<br />
ACS_MASK(4): logic; -- decoded AS_A bits<br />
-- source read data FIFO buffer and barrel shifter<br />
S_HI_LW(32): logic; -- high longword of shifted source data<br />
S_LO_LW(32): logic; -- low longword of shifted source data<br />
DBMASK_L(32): logic; -- data bit mask at line start<br />
DBMASK_R(32): logic; -- data bit mask at line end<br />
Abbildung 89: Variablen im Diagramm TIM/CONTROL<br />
Anhang D.2<br />
Seite 119
Abbildung 90: Speedchart-Diagramm TIM/CONTROL/TIM ACCESS<br />
TIM_ACCESS<br />
C: FIFO_IN=FIFO_OUT<br />
A: MEM_READ:=’1’;<br />
-- start read when<br />
-- FIFO is empty<br />
T12 #1<br />
C: RS_lat=’1’ and<br />
(DS_in=’0’ or RS_MUX=’0’)<br />
A: AD_oe:=hi32; -- oe enable<br />
A_READ :=AD_lat;<br />
CAS_READ:=BS_lat;<br />
READ_DONE:=’0’;<br />
if FIFO_IN=FIFO_OUT then<br />
MEM_READ:=’1’;<br />
end if;<br />
-- wait if FIFO not empty<br />
C: AS_in=’0’<br />
A: -- latch input lines<br />
A: RDY_out:=bnot RS_Rdy;<br />
-- ready active<br />
C: READ_DONE=’1’<br />
mem_read<br />
T11<br />
T9 #0<br />
read<br />
T7<br />
RDY<br />
T8<br />
reg_read<br />
T14<br />
ADS_lat :=AD_in(8 downto 2); -- register address<br />
AD_lat :=AD_in; -- full address<br />
D_lat :=AD_in; -- write data if nonmux<br />
RS_lat :=RS_in; -- register select<br />
-- get or calculate BS3..BS0 byte select signals<br />
C: RS_lat=’0’ and<br />
(DS_in=’0’ or<br />
RS_MUX=’0’)<br />
A: AD_oe:=hi32;<br />
-- output enable<br />
T1<br />
C: HWE_in=’1’<br />
wt_end<br />
if HBW="00" then -- convert 8 -> 32 bit<br />
case AD_in(1 downto 0) is<br />
when "00" => BS_lat:="0111";<br />
when "01" => BS_lat:="1011";<br />
when "10" => BS_lat:="1101";<br />
when "11" => BS_lat:="1110";<br />
end case;<br />
elsif HBW="01" then -- convert 16 -> 32 bit<br />
case AD_in(0) is<br />
when ’0’ => BS_lat(3 downto 2):=BS_in(1 downto 0);<br />
BS_lat(1 downto 0):="11";<br />
when ’1’ => BS_lat(3 downto 2):="11";<br />
BS_lat(1 downto 0):=BS_in(1 downto 0);<br />
end case;<br />
else -- 32 bit<br />
BS_lat:=BS_in;<br />
end if;<br />
T5<br />
AS<br />
wait_AS<br />
A: if FASTRDY=’0’ then<br />
RDY_out:=bnot RS_Rdy;<br />
-- ready active<br />
end if;<br />
T17<br />
T15<br />
w_done<br />
T4<br />
T6<br />
T13<br />
entry<br />
reg_write<br />
T3<br />
C: RS_lat=’0’<br />
DS<br />
write<br />
C: HWE_in=’0’<br />
T2<br />
T10<br />
C: AS_in=’1’<br />
A: RDY_out:=RS_Rdy;<br />
-- ready inactive<br />
-- enable next access<br />
C: RS_lat=’1’ and<br />
FIFO_IN/=<br />
(FIFO_OUT+4) mod 8<br />
A: -- write RAM data<br />
-- into FIFO buffer<br />
case (FIFO_IN mod 4) is<br />
when 0 =><br />
CAS_FIFO0:=BS_lat;<br />
A_FIFO0 :=AD_lat;<br />
D_FIFO0 :=DATA_IN;<br />
when 1 =><br />
CAS_FIFO1:=BS_lat;<br />
A_FIFO1 :=AD_lat;<br />
D_FIFO1 :=DATA_IN;<br />
when 2 =><br />
CAS_FIFO2:=BS_lat;<br />
A_FIFO2 :=AD_lat;<br />
D_FIFO2 :=DATA_IN;<br />
when 3 =><br />
CAS_FIFO3:=BS_lat;<br />
A_FIFO3 :=AD_lat;<br />
D_FIFO3 :=DATA_IN;<br />
end case;<br />
FIFO_IN:=(FIFO_IN+1) mod 8;<br />
C: DS_in=’0’ or RS_MUX=’0’<br />
A: if FASTRDY=’1’ then<br />
RDY_out:=bnot RS_Rdy;<br />
-- ready active<br />
end if;<br />
Subdiag Actions of <br />
A: -- convert read/write data from HBW bus size to 32 bit<br />
if HBW="00" then -- 32 -> 8 bit<br />
if RS_MUX=’1’ then<br />
DATA_IN(31 downto 24):=AD_in(7 downto 0); -- upper byte<br />
DATA_IN(23 downto 16):=AD_in(7 downto 0); -- higher byte<br />
DATA_IN(15 downto 08):=AD_in(7 downto 0); -- middle byte<br />
DATA_IN(07 downto 00):=AD_in(7 downto 0); -- lower byte<br />
else<br />
DATA_IN(31 downto 24):=D_lat(7 downto 0); -- upper byte<br />
DATA_IN(23 downto 16):=D_lat(7 downto 0); -- higher byte<br />
DATA_IN(15 downto 08):=D_lat(7 downto 0); -- middle byte<br />
DATA_IN(07 downto 00):=D_lat(7 downto 0); -- lower byte<br />
end if;<br />
-- 8 -> 32 bit<br />
case AD_lat(1 downto 0) is<br />
when "00" => AD_out(7 downto 0):=DATA_OUT(31 downto 24);<br />
D_out(7 downto 0) :=DATA_OUT(31 downto 24);<br />
when "01" => AD_out(7 downto 0):=DATA_OUT(23 downto 16);<br />
D_out(7 downto 0) :=DATA_OUT(23 downto 16);<br />
when "10" => AD_out(7 downto 0):=DATA_OUT(15 downto 08);<br />
D_out(7 downto 0) :=DATA_OUT(15 downto 08);<br />
when "11" => AD_out(7 downto 0):=DATA_OUT(07 downto 00);<br />
D_out(7 downto 0) :=DATA_OUT(07 downto 00);<br />
end case;<br />
elsif HBW="01" then -- 32 -> 16 bit<br />
if RS_MUX=’1’ then<br />
DATA_IN(31 downto 16):=AD_in(15 downto 0); -- high 2 bytes<br />
DATA_IN(15 downto 00):=AD_in(15 downto 0); -- low 2 bytes<br />
else<br />
DATA_IN(31 downto 16):=D_lat(15 downto 0); -- high 2 bytes<br />
DATA_IN(15 downto 00):=D_lat(15 downto 0); -- low 2 bytes<br />
end if;<br />
-- 16 -> 32 bit<br />
case AD_lat(0) is<br />
when ’0’ => AD_out(15 downto 0):=DATA_OUT(31 downto 16);<br />
D_out(15 downto 0) :=DATA_OUT(31 downto 16);<br />
when ’1’ => AD_out(15 downto 0):=DATA_OUT(15 downto 00);<br />
D_out(15 downto 0) :=DATA_OUT(15 downto 00);<br />
end case;<br />
else<br />
if RS_MUX=’1’ then<br />
if NUBUS=’1’ then<br />
DATA_IN(07 downto 00):=AD_in(31 downto 24); -- reverse<br />
DATA_IN(15 downto 08):=AD_in(23 downto 16); -- byte<br />
DATA_IN(23 downto 16):=AD_in(15 downto 08); -- order<br />
DATA_IN(31 downto 24):=AD_in(07 downto 00); -- for data<br />
else<br />
DATA_IN:=AD_in; -- 32 bit<br />
end if;<br />
else<br />
DATA_IN:=D_lat; -- 32 bit<br />
end if;<br />
if NUBUS=’1’ then<br />
AD_out(07 downto 00):=DATA_OUT(31 downto 24); -- reverse<br />
AD_out(15 downto 08):=DATA_OUT(23 downto 16); -- byte<br />
AD_out(23 downto 16):=DATA_OUT(15 downto 08); -- order<br />
AD_out(31 downto 24):=DATA_OUT(07 downto 00); -- for data<br />
else<br />
AD_out:=DATA_OUT; -- 32 bit<br />
end if;<br />
D_out:=DATA_OUT; -- 32 bit<br />
end if;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.2<br />
Seite 120
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
REG_READ<br />
entry<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T1<br />
A: case ADS_lat is<br />
when 0 => DATA_OUT(31 downto 24):=R_STA<strong>TU</strong>S;<br />
if BS_lat(3)=’0’ then<br />
STAT_CLR:=’1’; -- clear R_STA<strong>TU</strong>S<br />
end if;<br />
DATA_OUT(23 downto 16):=R_IMASK;<br />
DATA_OUT(15 downto 00):=R_LINTV;<br />
when 1 => DATA_OUT :=R_CONFIG;<br />
when 2 => DATA_OUT(31 downto 16):=R_MUXOFF;<br />
DATA_OUT(15 downto 08):=R_RADSEL;<br />
DATA_OUT(07 downto 00):=R_XYZOOM;<br />
when 3 => DATA_OUT(31 downto 16):=R_SINC;<br />
DATA_OUT(15 downto 00):=R_DINC;<br />
when 4 => DATA_OUT :=R_4;<br />
when 5 => DATA_OUT :=R_5;<br />
when 6 => DATA_OUT :=R_SSTART;<br />
when 7 => DATA_OUT :=R_DSTART;<br />
when 8 => DATA_OUT :=R_DPYSTRT;<br />
when 9 => DATA_OUT :=R_DPYNXT;<br />
when 10 => DATA_OUT(31 downto 16):=R_DPYINC;<br />
DATA_OUT(15 downto 00):=R_DPYMASK;<br />
when 11 => DATA_OUT :=R_SADR;<br />
when 12 => DATA_OUT :=R_DADR;<br />
when 13 => DATA_OUT(31 downto 16):=R_DX;<br />
DATA_OUT(15 downto 00):=R_DY;<br />
when 14 => DATA_OUT(31 downto 24):=R_PSIZE;<br />
DATA_OUT(23 downto 16):=R_PATTNSIZE;<br />
DATA_OUT(15 downto 00):=R_14;<br />
when 15 => DATA_OUT(31 downto 24):=R_AUXREG;<br />
DATA_OUT(23 downto 16):=R_HDREG;<br />
DATA_OUT(15 downto 08):=R_COMCTRL;<br />
DATA_OUT(07 downto 00):=R_COMMAND;<br />
when 16 => DATA_OUT :=R_COLOR0;<br />
when 17 => DATA_OUT :=R_COLOR1;<br />
when 18 => DATA_OUT :=R_COLOR2;<br />
when 19 => DATA_OUT :=R_COLOR3;<br />
when 20 => DATA_OUT(31 downto 16):=R_WSTARTX;<br />
DATA_OUT(15 downto 00):=R_WENDX;<br />
when 21 => DATA_OUT(31 downto 16):=R_WSTARTY;<br />
DATA_OUT(15 downto 00):=R_WENDY;<br />
when 22 => DATA_OUT(31 downto 16):=R_SETHCNT;<br />
DATA_OUT(15 downto 00):=R_SETVCNT;<br />
when 23 => DATA_OUT :=R_23;<br />
when 24 => DATA_OUT(31 downto 16):=R_HCOUNT;<br />
DATA_OUT(15 downto 00):=R_HESYNC;<br />
when 25 => DATA_OUT(31 downto 16):=R_HEBLNK;<br />
DATA_OUT(15 downto 00):=R_HSBLNK;<br />
when 26 => DATA_OUT(31 downto 16):=R_HTOTAL;<br />
DATA_OUT(15 downto 00):=R_HESERR;<br />
when 27 => DATA_OUT(31 downto 16):=R_VCOUNT;<br />
DATA_OUT(15 downto 00):=R_VESYNC;<br />
when 28 => DATA_OUT(31 downto 16):=R_VEBLNK;<br />
DATA_OUT(15 downto 00):=R_VSBLNK;<br />
when 29 => DATA_OUT(31 downto 16):=R_VTOTAL;<br />
DATA_OUT(15 downto 00):=R_29;<br />
when 30 => DATA_OUT :=R_30;<br />
when 31 => DATA_OUT :=R_31;<br />
when 32 => DATA_OUT(31 downto 24):=R_PATTN000;<br />
DATA_OUT(23 downto 16):=R_PATTN001;<br />
DATA_OUT(15 downto 08):=R_PATTN002;<br />
DATA_OUT(07 downto 00):=R_PATTN003;<br />
when 33 => DATA_OUT(31 downto 24):=R_PATTN004;<br />
DATA_OUT(23 downto 16):=R_PATTN005;<br />
DATA_OUT(15 downto 08):=R_PATTN006;<br />
DATA_OUT(07 downto 00):=R_PATTN007;<br />
-- etc...<br />
when others => DATA_OUT :=lo32;<br />
end case;<br />
print "read R#" & ADS_lat & " bytes " & BS_lat;<br />
T1<br />
exit<br />
Abbildung 91: Speedchart-Diagramm TIM/CONTROL/TIM ACCESS/REG READ<br />
T2<br />
Anhang D.2<br />
Seite 121
Abbildung 92: Speedchart-Diagramm TIM/CONTROL/TIM ACCESS/REG WRITE<br />
REG_WRITE<br />
entry<br />
T1 T2 T3 T4 T5<br />
S1<br />
S2<br />
S3<br />
S4<br />
A: -- write upper byte of register<br />
A: -- write higher byte of register<br />
A: -- write middle byte of register<br />
A: -- write lower byte of register<br />
if BS_lat(3)=’0’ then<br />
if BS_lat(2)=’0’ then<br />
if BS_lat(1)=’0’ then<br />
if BS_lat(0)=’0’ then<br />
case ADS_lat is<br />
case ADS_lat is<br />
case ADS_lat is<br />
case ADS_lat is<br />
-- when 0 => null; -- R_STA<strong>TU</strong>S is read only<br />
when 1 => if LOCK=’0’ then<br />
when 0 => R_IMASK := DATA_IN(23 downto 16);<br />
when 0 => R_LINTV (15 downto 08) := DATA_IN(15 downto 8);<br />
when 0 => R_LINTV (07 downto 00) := DATA_IN(7 downto 0);<br />
R_CONFIG (31 downto 24) := DATA_IN(31 downto 24);<br />
when 1 => if LOCK=’0’ then<br />
when 1 => if LOCK=’0’ then<br />
when 1 => if LOCK=’0’ then<br />
end if;<br />
R_CONFIG (23 downto 16) := DATA_IN(23 downto 16);<br />
R_CONFIG (15 downto 08) := DATA_IN(15 downto 8);<br />
R_CONFIG (07 downto 00) := DATA_IN(7 downto 0);<br />
when 2 => if LOCK=’0’ then<br />
end if;<br />
elsif (DATA_IN(15 downto 8)=0x7F) then<br />
end if;<br />
R_MUXOFF (15 downto 08) := DATA_IN(31 downto 24);<br />
when 2 => if LOCK=’0’ then<br />
unlock:=’1’; -- ready for 7F-unlock<br />
end if;<br />
R_MUXOFF (07 downto 00) := DATA_IN(23 downto 16);<br />
elsif (DATA_IN(15 downto 8)=0x55 and unlock=’1’) then when 2 => R_XYZOOM := DATA_IN(7 downto 0);<br />
end if;<br />
R_CONFIG (15):=’0’; -- 55 after 7F clears LOCK !<br />
when 3 => R_DINC (07 downto 00) := DATA_IN(7 downto 0);<br />
when 3 => R_SINC (15 downto 08) := DATA_IN(31 downto 24);<br />
unlock:=’0’;<br />
when 4 => R_4 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 4 => R_4 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 3 => R_SINC (07 downto 00) := DATA_IN(23 downto 16);<br />
else<br />
when 5 => R_5 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 5 => R_5 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 4 => R_4 (23 downto 16) := DATA_IN(23 downto 16);<br />
unlock:=’0’; -- other value, 7F will not unlock.<br />
when 6 => R_SSTART (07 downto 00) := DATA_IN(7 downto 0);<br />
when 6 => R_SSTART (31 downto 24) := DATA_IN(31 downto 24);<br />
when 5 => R_5 (23 downto 16) := DATA_IN(23 downto 16);<br />
end if;<br />
when 7 => R_DSTART (07 downto 00) := DATA_IN(7 downto 0);<br />
when 7 => R_DSTART (31 downto 24) := DATA_IN(31 downto 24);<br />
when 6 => R_SSTART (23 downto 16) := DATA_IN(23 downto 16);<br />
when 2 => if LOCK=’0’ then<br />
when 8 => R_DPYSTRT (07 downto 00) := DATA_IN(7 downto 0);<br />
when 8 => R_DPYSTRT (31 downto 24) := DATA_IN(31 downto 24);<br />
when 7 => R_DSTART (23 downto 16) := DATA_IN(23 downto 16);<br />
R_RADSEL := DATA_IN(15 downto 8);<br />
when 9 => R_DPYNXT (07 downto 00) := DATA_IN(7 downto 0);<br />
when 9 => R_DPYNXT (31 downto 24) := DATA_IN(31 downto 24);<br />
when 8 => R_DPYSTRT (23 downto 16) := DATA_IN(23 downto 16);<br />
end if;<br />
when 10 => R_DPYMASK (07 downto 00) := DATA_IN(7 downto 0);<br />
when 10 => R_DPYINC (15 downto 08) := DATA_IN(31 downto 24);<br />
when 9 => R_DPYNXT (23 downto 16) := DATA_IN(23 downto 16);<br />
when 11 => R_SADR (07 downto 00) := DATA_IN(7 downto 0);<br />
when 11 => R_SADR (31 downto 24) := DATA_IN(31 downto 24);<br />
when 10 => R_DPYINC (07 downto 00) := DATA_IN(23 downto 16);<br />
when 3 => R_DINC (15 downto 08) := DATA_IN(15 downto 8);<br />
when 12 => R_DADR (07 downto 00) := DATA_IN(7 downto 0);<br />
when 12 => R_DADR (31 downto 24) := DATA_IN(31 downto 24);<br />
when 11 => R_SADR (23 downto 16) := DATA_IN(23 downto 16);<br />
when 4 => R_4 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 13 => R_DY (07 downto 00) := DATA_IN(7 downto 0);<br />
when 13 => R_DX (15 downto 08) := DATA_IN(31 downto 24);<br />
when 12 => R_DADR (23 downto 16) := DATA_IN(23 downto 16);<br />
when 5 => R_5 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 14 => R_14 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 14 => R_PSIZE := DATA_IN(31 downto 24);<br />
when 13 => R_DX (07 downto 00) := DATA_IN(23 downto 16);<br />
when 6 => R_SSTART (15 downto 08) := DATA_IN(15 downto 8);<br />
when 15 => R_COMMAND := DATA_IN(7 downto 0);<br />
when 15 => R_AUXREG := DATA_IN(31 downto 24);<br />
when 14 => R_PATTNSIZE := DATA_IN(23 downto 16);<br />
when 7 => R_DSTART (15 downto 08) := DATA_IN(15 downto 8);<br />
when 16 => R_COLOR0 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 16 => R_COLOR0 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 15 => R_HDREG := DATA_IN(23 downto 16);<br />
when 8 => R_DPYSTRT (15 downto 08) := DATA_IN(15 downto 8);<br />
when 17 => R_COLOR1 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 17 => R_COLOR1 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 16 => R_COLOR0 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 9 => R_DPYNXT (15 downto 08) := DATA_IN(15 downto 8);<br />
when 18 => R_COLOR2 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 18 => R_COLOR2 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 17 => R_COLOR1 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 10 => R_DPYMASK (15 downto 08) := DATA_IN(15 downto 8);<br />
when 19 => R_COLOR3 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 19 => R_COLOR3 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 18 => R_COLOR2 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 11 => R_SADR (15 downto 08) := DATA_IN(15 downto 8);<br />
when 20 => R_WENDX (07 downto 00) := DATA_IN(7 downto 0);<br />
when 20 => R_WSTARTX (15 downto 08) := DATA_IN(31 downto 24);<br />
when 19 => R_COLOR3 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 12 => R_DADR (15 downto 08) := DATA_IN(15 downto 8);<br />
when 21 => R_WENDY (07 downto 00) := DATA_IN(7 downto 0);<br />
when 21 => R_WSTARTY (15 downto 08) := DATA_IN(31 downto 24);<br />
when 20 => R_WSTARTX (07 downto 00) := DATA_IN(23 downto 16);<br />
when 13 => R_DY (15 downto 08) := DATA_IN(15 downto 8);<br />
when 22 => R_SETVCNT (07 downto 00) := DATA_IN(7 downto 0);<br />
when 22 => R_SETHCNT (15 downto 08) := DATA_IN(31 downto 24);<br />
when 21 => R_WSTARTY (07 downto 00) := DATA_IN(23 downto 16);<br />
when 14 => R_14 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 23 => R_23 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 23 => R_23 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 22 => R_SETHCNT (07 downto 00) := DATA_IN(23 downto 16);<br />
when 15 => R_COMCTRL := DATA_IN(15 downto 8);<br />
when 24 => R_HESYNC (07 downto 00) := DATA_IN(7 downto 0);<br />
when 24 => R_HCOUNT (15 downto 08) := DATA_IN(31 downto 24);<br />
when 23 => R_23 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 16 => R_COLOR0 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 25 => R_HSBLNK (07 downto 00) := DATA_IN(7 downto 0);<br />
when 25 => R_HEBLNK (15 downto 08) := DATA_IN(31 downto 24);<br />
when 24 => R_HCOUNT (07 downto 00) := DATA_IN(23 downto 16);<br />
when 17 => R_COLOR1 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 26 => R_HESERR (07 downto 00) := DATA_IN(7 downto 0);<br />
when 26 => R_HTOTAL (15 downto 08) := DATA_IN(31 downto 24);<br />
when 25 => R_HEBLNK (07 downto 00) := DATA_IN(23 downto 16);<br />
when 18 => R_COLOR2 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 27 => R_VESYNC (07 downto 00) := DATA_IN(7 downto 0);<br />
when 27 => R_VCOUNT (15 downto 08) := DATA_IN(31 downto 24);<br />
when 26 => R_HTOTAL (07 downto 00) := DATA_IN(23 downto 16);<br />
when 19 => R_COLOR3 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 28 => R_VSBLNK (07 downto 00) := DATA_IN(7 downto 0);<br />
when 28 => R_VEBLNK (15 downto 08) := DATA_IN(31 downto 24);<br />
when 27 => R_VCOUNT (07 downto 00) := DATA_IN(23 downto 16);<br />
when 20 => R_WENDX (15 downto 08) := DATA_IN(15 downto 8);<br />
when 29 => R_29 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 29 => R_VTOTAL (15 downto 08) := DATA_IN(31 downto 24);<br />
when 28 => R_VEBLNK (07 downto 00) := DATA_IN(23 downto 16);<br />
when 21 => R_WENDY (15 downto 08) := DATA_IN(15 downto 8);<br />
when 30 => R_30 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 30 => R_30 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 29 => R_VTOTAL (07 downto 00) := DATA_IN(23 downto 16);<br />
when 22 => R_SETVCNT (15 downto 08) := DATA_IN(15 downto 8);<br />
when 31 => R_31 (07 downto 00) := DATA_IN(7 downto 0);<br />
when 31 => R_31 (31 downto 24) := DATA_IN(31 downto 24);<br />
when 30 => R_30 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 23 => R_23 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 32 => R_PATTN003 := DATA_IN(7 downto 0);<br />
when 32 => R_PATTN000 := DATA_IN(31 downto 24);<br />
when 31 => R_31 (23 downto 16) := DATA_IN(23 downto 16);<br />
when 24 => R_HESYNC (15 downto 08) := DATA_IN(15 downto 8);<br />
when 33 => R_PATTN007 := DATA_IN(7 downto 0);<br />
when 33 => R_PATTN004 := DATA_IN(31 downto 24);<br />
when 32 => R_PATTN001 := DATA_IN(23 downto 16);<br />
when 25 => R_HSBLNK (15 downto 08) := DATA_IN(15 downto 8);<br />
-- etc...<br />
-- etc...<br />
when 33 => R_PATTN005 := DATA_IN(23 downto 16);<br />
when 26 => R_HESERR (15 downto 08) := DATA_IN(15 downto 8);<br />
end case;<br />
end case;<br />
-- etc...<br />
when 27 => R_VESYNC (15 downto 08) := DATA_IN(15 downto 8);<br />
print "write R L#" & ADS_lat & " data " & DATA_IN(7 downto 0);<br />
print "write R U#" & ADS_lat & " data " & DATA_IN(31 downto 24); end case;<br />
when 28 => R_VSBLNK (15 downto 08) := DATA_IN(15 downto 8); end if;<br />
end if;<br />
print "write R H#" & ADS_lat & " data " & DATA_IN(23 downto 16);<br />
when 29 => R_29 (15 downto 08) := DATA_IN(15 downto 8);<br />
end if;<br />
when 30 => R_30 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 31 => R_31 (15 downto 08) := DATA_IN(15 downto 8);<br />
when 32 => R_PATTN002 := DATA_IN(15 downto 8);<br />
when 33 => R_PATTN006 := DATA_IN(15 downto 8);<br />
-- etc...<br />
end case;<br />
print "write R M#" & ADS_lat & " data " & DATA_IN(15 downto 8);<br />
end if;<br />
exit<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.2<br />
Seite 122
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Diagram Variables:<br />
-- Variables of Diagram MEM_ACCESS<br />
Anhang D.2<br />
Seite 123<br />
DCMASK_L(4): logic:=lo4; -- CAS mask left-hand side dest.<br />
DCMASK_R(4): logic:=lo4; -- CAS mask right-hand side dest.<br />
SCMASK_L(4): logic:=lo4; -- CAS mask left-hand side source<br />
SCMASK_R(4): logic:=lo4; -- CAS mask right-hand side source<br />
PRE_READ: logic:=’0’; -- ’1’: read dest. bef. write<br />
PRE_MASK(32): logic:=hi32; -- ’1’s mark valid destination bits<br />
GPU_READ_DONE: logic:=’0’; -- ’1’: write DATA_OUT into GPU fifo<br />
GPU_WRITE_DONE: logic:=’0’; -- ’1’: increment GPU fifo write ptr<br />
ANY_CYCLE: logic; -- ’1’: perform memory access<br />
MEM_GREAD: logic; -- ’1’: GPU read access<br />
MEM_GWRITE: logic; -- ’1’: GPU write/rmw access<br />
GREAD_END: logic:=’0’; -- ’1’: get RAM data after GPU read<br />
MEM_RMW: logic:=’0’; -- ’1’: perform rmw cycle<br />
WRITE_DATA(32): logic; -- write data for PixBlT destination<br />
D_GPU_FIFO(32): logic; -- data from GPU fifo current pos.<br />
--<br />
Abbildung 93: Variablen im Diagramm TIM/CONTROL/MEM ACCESS
Abbildung 94: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/MEM CYCLES<br />
MEM_CYCLES<br />
Entry of <br />
A: -- MWE_ict:=’0’ when write access<br />
-- D_ict :=(write data) & (activate D_oe when write)<br />
-- RCA_ict:=(CAS address)<br />
-- CAS_lat:=(CAS mask) (not applied to RAM port yet)<br />
-- mark written bytes in CAS_DONE<br />
if MEM_READ=’1’ or MEM_GREAD=’1’ then<br />
MOE_ict:=’0’; -- memory read<br />
MWE_ict:=’1’;<br />
elsif MEM_GWRITE=’1’ and PRE_READ=’1’ then<br />
MEM_RMW:=’1’; -- memory read-modify-write cycle<br />
MOE_ict:=’0’;<br />
MWE_ict:=’1’;<br />
else<br />
MWE_ict:=’0’; -- memory write<br />
DOE_ict:=hi32; -- data lines as outputs<br />
end if;<br />
case MBW is<br />
when "00" =><br />
CAS_lat:="1110";<br />
RCA_ict(13 downto 2):=RAM_COL(13 downto 2);<br />
if CAS_MASK(3)=’0’ then<br />
RCA_ict(1 downto 0):="00"; -- byte U<br />
CAS_DONE(3):=’1’; -- done<br />
D_ict(7 downto 0):=RAM_D_W(31 downto 24);<br />
end if;<br />
if CAS_MASK(3 downto 2)="10" then<br />
RCA_ict(1 downto 0):="01"; -- byte H<br />
CAS_DONE(2):=’1’; -- done<br />
D_ict(7 downto 0):=RAM_D_W(23 downto 16);<br />
end if;<br />
if CAS_MASK(3 downto 1)="110" then<br />
RCA_ict(1 downto 0):="10"; -- byte M<br />
CAS_DONE(1):=’1’; -- done<br />
D_ict(7 downto 0):=RAM_D_W(15 downto 08);<br />
end if;<br />
if CAS_MASK="1110" then<br />
RCA_ict(1 downto 0):="11"; -- byte L<br />
CAS_DONE(0):=’1’; -- done<br />
D_ict(7 downto 0):=RAM_D_W(07 downto 00);<br />
end if;<br />
when "01" =><br />
RCA_ict(13 downto 1):=RAM_COL(13 downto 1);<br />
CAS_lat(3 downto 2):="11";<br />
if CAS_MASK(3 downto 2)/="11" then<br />
CAS_lat(1 downto 0):=CAS_MASK(3 downto 2);<br />
RCA_ict(0):=’0’; -- byte U+H<br />
CAS_DONE(3 downto 2):="11"; -- done<br />
D_ict(15 downto 00):=RAM_D_W(31 downto 16);<br />
else<br />
CAS_lat(1 downto 0):=CAS_MASK(1 downto 0);<br />
RCA_ict(0):=’1’; -- byte M+L<br />
CAS_DONE(1 downto 0):="11"; -- done<br />
D_ict(15 downto 00):=RAM_D_W(15 downto 00);<br />
end if;<br />
when others =><br />
RCA_ict(13 downto 0):=RAM_COL(13 downto 0);<br />
CAS_lat:=CAS_MASK;<br />
CAS_DONE:="1111"; -- all bytes done<br />
D_ict:=RAM_D_W;<br />
end case;<br />
-- address: | 0 1 2 3 | 4 5 6...<br />
-- bytes: | U H M L | U H M...<br />
-- CAS: | 3 2 1 0 | 3 2 1...<br />
-- data bits:| 31-24 23-16 15-08 07-00 | ...<br />
Subdiagram MEM_CYCLES: read or write RAM data<br />
RAM_ADDR: address of read/write access<br />
CAS_MASK: CAS mask<br />
RAM_D_W: write data from current FIFO buffer pos.,<br />
if necessary, up to 4 write cycles<br />
are performed (HBW=32, MBW=8).<br />
DATA_OUT: data read from the RAM<br />
read: when RAM_READ=’1’ (HOST) or RAM_GREAD=’1’ (GPU)<br />
write: when FIFO_IN/=FIFO_OUT (HOST)<br />
or (RAM_GWRITE=’1’ and PRE_READ=’0’) (GPU)<br />
rmw: when (RAM_GWRITE=’1’ and PRE_READ=’1’) (GPU)<br />
Entry of <br />
A: RCA_ict:=RAM_ROW;<br />
T2<br />
A: RAS_ict :=RAS_MASK;<br />
LAST_RAS:=RAS_MASK;<br />
ACS_ict :=ACS_MASK;<br />
LAST_ACS:=ACS_MASK;<br />
LAST_ROW:=RAM_ROW;<br />
C: ANY_CYCLE=’1’<br />
RAS1<br />
T11<br />
RAS2 CAS1<br />
T3<br />
T10 #0<br />
entry<br />
C: ANY_CYCLE=’1’<br />
and LAST_ROW=RAM_ROW<br />
and LAST_RAS=RAS_MASK<br />
and LAST_ACS=ACS_MASK<br />
T4<br />
T1<br />
T6 #1<br />
A: CAS_ict:=CAS_lat;<br />
if CAS_MASK="1111" then<br />
if MEM_GWRITE=’1’ and<br />
PRE_READ=’0’then<br />
GPU_WRITE_DONE:=’1’;<br />
-- request addr inc<br />
-- (diagr. GPU_FIFO_W)<br />
elsif MEM_GREAD=’1’ then<br />
GREAD_END:=’1’;<br />
-- read last data<br />
GPU_READ_DONE:=’1’;<br />
-- request addr inc<br />
-- (diagr. GPU_FIFO_R)<br />
end if;<br />
end if;<br />
Entry of <br />
A: RAS_ict:="1111";<br />
MWE_ict:=’1’;<br />
MOE_ict:=’1’;<br />
RCA_ict:=hi14;<br />
DOE_ict:=lo32; -- input mode<br />
cold_stb<br />
C: ANY_CYCLE=’1’<br />
-- if different ROW/RAS/ACS<br />
or PEN=’0’<br />
-- or timeout<br />
T7<br />
T12<br />
hot_stb<br />
T8<br />
C: ANY_CYCLE=’0’ and PEN=’1’<br />
A: MWE_ict:=’1’;<br />
DOE_ict:=lo32; -- input mode<br />
MOE_ict:=’1’;<br />
RCA_ict:=hi14;<br />
if MEM_READ=’1’ and READ_DONE=’1’ then<br />
MEM_READ:=’0’;<br />
end if;<br />
C: ANY_CYCLE=’1’ and LAST_ROW=RAM_ROW<br />
and LAST_RAS=RAS_MASK<br />
and LAST_ACS=ACS_MASK<br />
-- access same RAS address<br />
and PEN=’1’<br />
CAS2<br />
T5<br />
A: if CAS_MASK="1111" then<br />
CAS_DONE:="0000";<br />
if MEM_READ=’1’ then<br />
READ_DONE:=’1’;<br />
elsif FIFO_IN/=FIFO_OUT then<br />
FIFO_OUT:=(FIFO_OUT+1) mod 8;<br />
end if;<br />
end if;<br />
C: (ANY_CYCLE=’1’<br />
and (LAST_ROW/=RAM_ROW<br />
or LAST_RAS/=RAS_MASK<br />
or LAST_ACS/=ACS_MASK))<br />
-- access different RAS address<br />
or PEN=’0’<br />
A: if MEM_READ=’1’ and READ_DONE=’1’ then<br />
MEM_READ:=’0’;<br />
end if;<br />
CAS3<br />
RMW1<br />
T9 #0<br />
T15<br />
CAS_END Exit of <br />
A: CAS_ict:="1111";<br />
T13<br />
T16<br />
C: MEM_RMW=’1’<br />
A: MOE_ict:=’1’;<br />
-- and exit action of CAS3<br />
-- (read RAM data into DATA_OUT)<br />
Subdiag Actions of <br />
A: -- test only<br />
FIFOIN_ot :=FIFO_IN mod 8;<br />
FIFOOUT_ot :=FIFO_OUT mod 8;<br />
CAS_MASK_ot :=CAS_MASK;<br />
ANY_CYCLE_ot :=ANY_CYCLE;<br />
MEM_GWRITE_ot :=MEM_GWRITE;<br />
GPU_WNUM_ot :=GPU_WNUM mod 16;<br />
MEM_GREAD_ot :=MEM_GREAD;<br />
GPU_RNUM_ot :=GPU_RNUM mod 16;<br />
PRE_READ_ot :=PRE_READ;<br />
PRE_MASK_ot :=PRE_MASK;<br />
Exit of <br />
A: if MEM_READ=’1’ or MEM_GREAD=’1’<br />
or (MEM_GWRITE=’1’ and PRE_READ=’1’) then<br />
case MBW is<br />
when "00" =><br />
case RCA_ict(1 downto 0) is<br />
when "00" => DATA_OUT(31 downto 24)<br />
:=MD_in(7 downto 0);<br />
when "01" => DATA_OUT(23 downto 16)<br />
:=MD_in(7 downto 0);<br />
when "10" => DATA_OUT(15 downto 8)<br />
:=MD_in(7 downto 0);<br />
when "11" => DATA_OUT( 7 downto 0)<br />
:=MD_in(7 downto 0);<br />
end case;<br />
when "01" =><br />
case RCA_ict(0) is<br />
when ’0’ => DATA_OUT(31 downto 16)<br />
:=MD_in(15 downto 0);<br />
when ’1’ => DATA_OUT(15 downto 0)<br />
:=MD_in(15 downto 0);<br />
end case;<br />
when others =><br />
DATA_OUT:=MD_in;<br />
end case;<br />
end if;<br />
GREAD_END:=’0’;<br />
A: GPU_WRITE_DONE:=’1’;<br />
-- output modified data:<br />
case MBW is<br />
when "00" =><br />
case RCA_ict(1 downto 0) is<br />
when "00" => D_ict(7 downto 0):=RAM_D_W(31 downto 24);<br />
when "01" => D_ict(7 downto 0):=RAM_D_W(23 downto 16);<br />
when "10" => D_ict(7 downto 0):=RAM_D_W(15 downto 08);<br />
when "11" => D_ict(7 downto 0):=RAM_D_W(07 downto 00);<br />
end case;<br />
when "01" =><br />
case RCA_ict(0) is<br />
when ’0’ => D_ict(15 downto 00):=RAM_D_W(31 downto 16);<br />
when ’1’ => D_ict(15 downto 00):=RAM_D_W(15 downto 00);<br />
end case;<br />
when others =><br />
D_ict:=RAM_D_W;<br />
end case;<br />
T14<br />
RMW3<br />
RMW2<br />
A: MWE_ict:=’0’;<br />
-- write enable<br />
MEM_RMW:=’0’;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.2<br />
Seite 124
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
ADDR_CALC<br />
Subdiag Actions of <br />
A: -- address calculation:<br />
-- RAM_ADDR(32): accessed address<br />
--<br />
-- MO_A(3),MO_B(3),MO_C(3),MO_D(3),<br />
-- RSL(3),ASL(3): registers<br />
--<br />
-- RAS_MASK(4): decoded RAS signals<br />
-- ACS_MASK(4): decoded ACS signals<br />
-- RAM_ROW(14): row address<br />
-- RAM_COL(14): column address<br />
-- get ACS bank<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
case ASL is -- address bits for ACS bank selection<br />
when "000" => AS_A:=RAM_ADDR(17 downto 16);<br />
when "001" => AS_A:=RAM_ADDR(19 downto 18);<br />
when "010" => AS_A:=RAM_ADDR(21 downto 20);<br />
when "011" => AS_A:=RAM_ADDR(23 downto 22);<br />
when "100" => AS_A:=RAM_ADDR(25 downto 24);<br />
when "101" => AS_A:=RAM_ADDR(27 downto 26);<br />
when "110" => AS_A:=RAM_ADDR(29 downto 28);<br />
when "111" => AS_A:=RAM_ADDR(31 downto 30);<br />
end case;<br />
case AS_A is -- value of "ACS bank select" address bits<br />
when "00" => ACS_MASK:="1110";<br />
when "01" => ACS_MASK:="1101";<br />
when "10" => ACS_MASK:="1011";<br />
when "11" => ACS_MASK:="0111";<br />
end case;<br />
-- get RAS address / RAM row<br />
case RSL is -- address bits for RAS bank selection<br />
when "000" => RS_A:=RAM_ADDR(17 downto 16);<br />
when "001" => RS_A:=RAM_ADDR(19 downto 18);<br />
when "010" => RS_A:=RAM_ADDR(21 downto 20);<br />
when "011" => RS_A:=RAM_ADDR(23 downto 22);<br />
when "100" => RS_A:=RAM_ADDR(25 downto 24);<br />
when "101" => RS_A:=RAM_ADDR(27 downto 26);<br />
when "110" => RS_A:=RAM_ADDR(29 downto 28);<br />
when "111" => RS_A:=RAM_ADDR(31 downto 30);<br />
end case;<br />
case RS_A is -- value of "RAS bank select" address bits<br />
when "00" => MOX:=MO_A;<br />
RAS_MASK:="1110";<br />
when "01" => MOX:=MO_B;<br />
RAS_MASK:="1101";<br />
when "10" => MOX:=MO_C;<br />
RAS_MASK:="1011";<br />
when "11" => MOX:=MO_D;<br />
RAS_MASK:="0111";<br />
end case;<br />
case MOX is -- RAS address selector of selected bank<br />
when "000" => RAM_ROW:=RAM_ADDR(21 downto 8);<br />
when "001" => RAM_ROW:=RAM_ADDR(22 downto 9);<br />
when "010" => RAM_ROW:=RAM_ADDR(23 downto 10);<br />
when "011" => RAM_ROW:=RAM_ADDR(24 downto 11);<br />
when "100" => RAM_ROW:=RAM_ADDR(25 downto 12);<br />
when "101" => RAM_ROW:=RAM_ADDR(26 downto 13);<br />
when "110" => RAM_ROW:=RAM_ADDR(27 downto 14);<br />
when "111" => RAM_ROW:=RAM_ADDR(28 downto 15);<br />
end case;<br />
-- get BS(0) CAS address / RAM column<br />
case MBW is<br />
when "00" => -- 8 bit memory bus<br />
RAM_COL(13 downto 2):=RAM_ADDR(13 downto 2);<br />
RAM_COL(1 downto 0):="00";<br />
-- bits 1+0 of col. addr. determined by BS3..BS0<br />
when "01" => -- 16 bit memory bus<br />
RAM_COL(13 downto 1):=RAM_ADDR(14 downto 2);<br />
RAM_COL(0):=’0’;<br />
-- bit 0 of col. addr. determined by BS1..BS0<br />
when others => -- 32 bit memory bus<br />
RAM_COL(13 downto 0):=RAM_ADDR(15 downto 2);<br />
end case;<br />
Abbildung 95: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/ADDR CALC<br />
Anhang D.2<br />
Seite 125
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
BIT_SHIFT<br />
Subdiag Actions of <br />
V: BOTH_LW(64): logic;<br />
A: -- fit DATA_OUT longword into (S_HI_LW / S_LO_LW)<br />
-- starting at bit number (DBOS_L-SBOS_L)<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
case ((DBOS_L+32)-SBOS_L) mod 32 is -- +32 for speedchart<br />
when 0 => BOTH_LW(63 downto 32):=DATA_OUT;<br />
BOTH_LW(31 downto 00):=lo32;<br />
when 1 => BOTH_LW(63):=’0’;<br />
BOTH_LW(62 downto 31):=DATA_OUT;<br />
BOTH_LW(30 downto 00):="0000000000000000000000000000000";<br />
when 2 => BOTH_LW(63 downto 62):="00";<br />
BOTH_LW(61 downto 30):=DATA_OUT;<br />
BOTH_LW(29 downto 00):="000000000000000000000000000000";<br />
when 3 => BOTH_LW(63 downto 61):="000";<br />
BOTH_LW(60 downto 29):=DATA_OUT;<br />
BOTH_LW(28 downto 00):="00000000000000000000000000000";<br />
when 4 => BOTH_LW(63 downto 60):="0000";<br />
BOTH_LW(59 downto 28):=DATA_OUT;<br />
BOTH_LW(27 downto 00):="0000000000000000000000000000";<br />
when 5 => BOTH_LW(63 downto 59):="00000";<br />
BOTH_LW(58 downto 27):=DATA_OUT;<br />
BOTH_LW(26 downto 00):="000000000000000000000000000";<br />
when 6 => BOTH_LW(63 downto 58):="000000";<br />
BOTH_LW(57 downto 26):=DATA_OUT;<br />
BOTH_LW(25 downto 00):="00000000000000000000000000";<br />
when 7 => BOTH_LW(63 downto 57):="0000000";<br />
BOTH_LW(56 downto 25):=DATA_OUT;<br />
BOTH_LW(24 downto 00):="0000000000000000000000000";<br />
when 8 => BOTH_LW(63 downto 56):="00000000";<br />
BOTH_LW(55 downto 24):=DATA_OUT;<br />
BOTH_LW(23 downto 00):="000000000000000000000000";<br />
when 9 => BOTH_LW(63 downto 55):="000000000";<br />
BOTH_LW(54 downto 23):=DATA_OUT;<br />
BOTH_LW(22 downto 00):="00000000000000000000000";<br />
when 10 => BOTH_LW(63 downto 54):="0000000000";<br />
BOTH_LW(53 downto 22):=DATA_OUT;<br />
BOTH_LW(21 downto 00):="0000000000000000000000";<br />
when 11 => BOTH_LW(63 downto 53):="00000000000";<br />
BOTH_LW(52 downto 21):=DATA_OUT;<br />
BOTH_LW(20 downto 00):="000000000000000000000";<br />
when 12 => BOTH_LW(63 downto 52):="000000000000";<br />
BOTH_LW(51 downto 20):=DATA_OUT;<br />
BOTH_LW(19 downto 00):="00000000000000000000";<br />
when 13 => BOTH_LW(63 downto 51):="0000000000000";<br />
BOTH_LW(50 downto 19):=DATA_OUT;<br />
BOTH_LW(18 downto 00):="0000000000000000000";<br />
when 14 => BOTH_LW(63 downto 50):="00000000000000";<br />
BOTH_LW(49 downto 18):=DATA_OUT;<br />
BOTH_LW(17 downto 00):="000000000000000000";<br />
when 15 => BOTH_LW(63 downto 49):="000000000000000";<br />
BOTH_LW(48 downto 17):=DATA_OUT;<br />
BOTH_LW(16 downto 00):="00000000000000000";<br />
when 16 => BOTH_LW(63 downto 48):="0000000000000000";<br />
BOTH_LW(47 downto 16):=DATA_OUT;<br />
BOTH_LW(15 downto 00):="0000000000000000";<br />
when 17 => BOTH_LW(63 downto 47):="00000000000000000";<br />
BOTH_LW(46 downto 15):=DATA_OUT;<br />
BOTH_LW(14 downto 00):="000000000000000";<br />
when 18 => BOTH_LW(63 downto 46):="000000000000000000";<br />
BOTH_LW(45 downto 14):=DATA_OUT;<br />
BOTH_LW(13 downto 00):="00000000000000";<br />
when 19 => BOTH_LW(63 downto 45):="0000000000000000000";<br />
BOTH_LW(44 downto 13):=DATA_OUT;<br />
BOTH_LW(12 downto 00):="0000000000000";<br />
when 20 => BOTH_LW(63 downto 44):="00000000000000000000";<br />
BOTH_LW(43 downto 12):=DATA_OUT;<br />
BOTH_LW(11 downto 00):="000000000000";<br />
when 21 => BOTH_LW(63 downto 43):="000000000000000000000";<br />
BOTH_LW(42 downto 11):=DATA_OUT;<br />
BOTH_LW(10 downto 00):="00000000000";<br />
when 22 => BOTH_LW(63 downto 42):="0000000000000000000000";<br />
BOTH_LW(41 downto 10):=DATA_OUT;<br />
BOTH_LW(09 downto 00):="0000000000";<br />
when 23 => BOTH_LW(63 downto 41):="00000000000000000000000";<br />
BOTH_LW(40 downto 09):=DATA_OUT;<br />
BOTH_LW(08 downto 00):="000000000";<br />
when 24 => BOTH_LW(63 downto 40):="000000000000000000000000";<br />
BOTH_LW(39 downto 08):=DATA_OUT;<br />
BOTH_LW(07 downto 00):="00000000";<br />
when 25 => BOTH_LW(63 downto 39):="0000000000000000000000000";<br />
BOTH_LW(38 downto 07):=DATA_OUT;<br />
BOTH_LW(06 downto 00):="0000000";<br />
when 26 => BOTH_LW(63 downto 38):="00000000000000000000000000";<br />
BOTH_LW(37 downto 06):=DATA_OUT;<br />
BOTH_LW(05 downto 00):="000000";<br />
when 27 => BOTH_LW(63 downto 37):="000000000000000000000000000";<br />
BOTH_LW(36 downto 05):=DATA_OUT;<br />
BOTH_LW(04 downto 00):="00000";<br />
when 28 => BOTH_LW(63 downto 36):="0000000000000000000000000000";<br />
BOTH_LW(35 downto 04):=DATA_OUT;<br />
BOTH_LW(03 downto 00):="0000";<br />
when 29 => BOTH_LW(63 downto 35):="00000000000000000000000000000";<br />
BOTH_LW(34 downto 03):=DATA_OUT;<br />
BOTH_LW(02 downto 00):="000";<br />
when 30 => BOTH_LW(63 downto 34):="000000000000000000000000000000";<br />
BOTH_LW(33 downto 02):=DATA_OUT;<br />
BOTH_LW(01 downto 00):="00";<br />
when 31 => BOTH_LW(63 downto 33):="0000000000000000000000000000000";<br />
BOTH_LW(32 downto 01):=DATA_OUT;<br />
BOTH_LW(0):=’0’;<br />
end case;<br />
S_HI_LW:=BOTH_LW(63 downto 32);<br />
S_LO_LW:=BOTH_LW(31 downto 00);<br />
Abbildung 96: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/BIT SHIFT<br />
Anhang D.2<br />
Seite 126
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
BIT_MASK<br />
Subdiag Actions of <br />
A: -- DBMASK_L: bit mask: valid bits in leftmost LW of line<br />
-- DBMASK_R: bit mask: valid bits in rightmost LW of line<br />
-- DCMASK_L: CAS mask: valid bytes in leftmost LW of line<br />
-- DCMASK_R: CAS mask: valid bytes in rightmost LW of line<br />
-- SCMASK_L: same as DCMASK_L, but for source<br />
-- SCMASK_R: same as DCMASK_R, but for source<br />
case DBOS_L is -- first valid bit<br />
when 0 => DBMASK_L:="11111111111111111111111111111111";<br />
when 1 => DBMASK_L:="01111111111111111111111111111111";<br />
when 2 => DBMASK_L:="00111111111111111111111111111111";<br />
when 3 => DBMASK_L:="00011111111111111111111111111111";<br />
when 4 => DBMASK_L:="00001111111111111111111111111111";<br />
when 5 => DBMASK_L:="00000111111111111111111111111111";<br />
when 6 => DBMASK_L:="00000011111111111111111111111111";<br />
when 7 => DBMASK_L:="00000001111111111111111111111111";<br />
when 8 => DBMASK_L:="00000000111111111111111111111111";<br />
when 9 => DBMASK_L:="00000000011111111111111111111111";<br />
when 10 => DBMASK_L:="00000000001111111111111111111111";<br />
when 11 => DBMASK_L:="00000000000111111111111111111111";<br />
when 12 => DBMASK_L:="00000000000011111111111111111111";<br />
when 13 => DBMASK_L:="00000000000001111111111111111111";<br />
when 14 => DBMASK_L:="00000000000000111111111111111111";<br />
when 15 => DBMASK_L:="00000000000000011111111111111111";<br />
when 16 => DBMASK_L:="00000000000000001111111111111111";<br />
when 17 => DBMASK_L:="00000000000000000111111111111111";<br />
when 18 => DBMASK_L:="00000000000000000011111111111111";<br />
when 19 => DBMASK_L:="00000000000000000001111111111111";<br />
when 20 => DBMASK_L:="00000000000000000000111111111111";<br />
when 21 => DBMASK_L:="00000000000000000000011111111111";<br />
when 22 => DBMASK_L:="00000000000000000000001111111111";<br />
when 23 => DBMASK_L:="00000000000000000000000111111111";<br />
when 24 => DBMASK_L:="00000000000000000000000011111111";<br />
when 25 => DBMASK_L:="00000000000000000000000001111111";<br />
when 26 => DBMASK_L:="00000000000000000000000000111111";<br />
when 27 => DBMASK_L:="00000000000000000000000000011111";<br />
when 28 => DBMASK_L:="00000000000000000000000000001111";<br />
when 29 => DBMASK_L:="00000000000000000000000000000111";<br />
when 30 => DBMASK_L:="00000000000000000000000000000011";<br />
when 31 => DBMASK_L:="00000000000000000000000000000001";<br />
end case;<br />
case DBOS_R is -- last valid bit<br />
when 0 => DBMASK_R:="10000000000000000000000000000000";<br />
when 1 => DBMASK_R:="11000000000000000000000000000000";<br />
when 2 => DBMASK_R:="11100000000000000000000000000000";<br />
when 3 => DBMASK_R:="11110000000000000000000000000000";<br />
when 4 => DBMASK_R:="11111000000000000000000000000000";<br />
when 5 => DBMASK_R:="11111100000000000000000000000000";<br />
when 6 => DBMASK_R:="11111110000000000000000000000000";<br />
when 7 => DBMASK_R:="11111111000000000000000000000000";<br />
when 8 => DBMASK_R:="11111111100000000000000000000000";<br />
when 9 => DBMASK_R:="11111111110000000000000000000000";<br />
when 10 => DBMASK_R:="11111111111000000000000000000000";<br />
when 11 => DBMASK_R:="11111111111100000000000000000000";<br />
when 12 => DBMASK_R:="11111111111110000000000000000000";<br />
when 13 => DBMASK_R:="11111111111111000000000000000000";<br />
when 14 => DBMASK_R:="11111111111111100000000000000000";<br />
when 15 => DBMASK_R:="11111111111111110000000000000000";<br />
when 16 => DBMASK_R:="11111111111111111000000000000000";<br />
when 17 => DBMASK_R:="11111111111111111100000000000000";<br />
when 18 => DBMASK_R:="11111111111111111110000000000000";<br />
when 19 => DBMASK_R:="11111111111111111111000000000000";<br />
when 20 => DBMASK_R:="11111111111111111111100000000000";<br />
when 21 => DBMASK_R:="11111111111111111111110000000000";<br />
when 22 => DBMASK_R:="11111111111111111111111000000000";<br />
when 23 => DBMASK_R:="11111111111111111111111100000000";<br />
when 24 => DBMASK_R:="11111111111111111111111110000000";<br />
when 25 => DBMASK_R:="11111111111111111111111111000000";<br />
when 26 => DBMASK_R:="11111111111111111111111111100000";<br />
when 27 => DBMASK_R:="11111111111111111111111111110000";<br />
when 28 => DBMASK_R:="11111111111111111111111111111000";<br />
when 29 => DBMASK_R:="11111111111111111111111111111100";<br />
when 30 => DBMASK_R:="11111111111111111111111111111110";<br />
when 31 => DBMASK_R:="11111111111111111111111111111111";<br />
end case;<br />
DCMASK_L:="0000" when DBOS_L
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
MEM_ADDRESS<br />
Subdiag Actions of <br />
V: CAS_M(4): logic:=lo4; -- CAS mask<br />
--<br />
A: RAM_ADDR:=lo32; -- no memory access<br />
CAS_MASK:=hi4; -------------------<br />
RAM_D_W:=lo32;<br />
ANY_CYCLE:=’0’;<br />
MEM_GREAD:=’0’;<br />
MEM_GWRITE:=’0’;<br />
if MEM_READ=’1’ then -- host data read<br />
-----------------<br />
ANY_CYCLE:=bnot READ_DONE; -- perform memory access<br />
RAM_ADDR:=A_READ; -- read address<br />
CAS_M:=CAS_READ; -- CAS mask<br />
elsif FIFO_IN/=FIFO_OUT then -- host data write<br />
------------------<br />
ANY_CYCLE:=’1’; -- perform memory access<br />
case (FIFO_OUT mod 4) is -- get from write fifo:<br />
when 0 =><br />
RAM_ADDR:=A_FIFO0; -- write address<br />
RAM_D_W :=D_FIFO0; -- write data<br />
CAS_M:=CAS_FIFO0; -- CAS mask<br />
when 1 =><br />
RAM_ADDR:=A_FIFO1;<br />
RAM_D_W :=D_FIFO1;<br />
CAS_M:=CAS_FIFO1;<br />
when 2 =><br />
RAM_ADDR:=A_FIFO2;<br />
RAM_D_W :=D_FIFO2;<br />
CAS_M:=CAS_FIFO2;<br />
when 3 =><br />
RAM_ADDR:=A_FIFO3;<br />
RAM_D_W :=D_FIFO3;<br />
CAS_M:=CAS_FIFO3;<br />
end case;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
elsif GPU_READ=’1’ or GREAD_END=’1’ then -- gr-command data read<br />
----------------------if<br />
GPU_READ=’1’ then<br />
ANY_CYCLE:=’1’; -- perform memory access<br />
end if;<br />
MEM_GREAD:=’1’;<br />
RAM_ADDR:=SADRLW_C shl 2; -- current read address (LW->byte)<br />
if SADRLW_C=SADRLW_L then<br />
if SADRLW_C/=SADRLW_R then -- leftmost longword ?<br />
CAS_M:=SCMASK_L; -- only read relevant bytes (l)<br />
else -- one longword only ?<br />
CAS_M:=SCMASK_L bor SCMASK_R; -- only read relevant bytes (m)<br />
end if;<br />
elsif SADRLW_C=SADRLW_R then -- rightmost longword ?<br />
CAS_M:=SCMASK_R; -- only read relevant bytes (r)<br />
else -- in between<br />
CAS_M:="0000"; -- read all 4 bytes<br />
end if;<br />
elsif GPU_WRITE=’1’ then -- gr-command data write<br />
------------------------<br />
ANY_CYCLE:=’1’; -- perform memory access<br />
MEM_GWRITE:=’1’;<br />
RAM_ADDR:=DADRLW_C shl 2; -- current write address (LW->byte)<br />
if DADRLW_C=DADRLW_L then<br />
if DADRLW_C/=DADRLW_R then -- leftmost longword ?<br />
CAS_M:=DCMASK_L; -- only write relev. bytes (l)<br />
PRE_MASK:=DBMASK_L; -- use left-hand side bit mask<br />
PRE_READ:=’1’ -- read dest. before writing<br />
when ((DBOS_L mod 8)/=0 -- if dest. isn’t byte-aligned<br />
or S(1 downto 0)/="00") -- or source and dest. are comb.<br />
else ’0’;<br />
else -- one longword only ?<br />
CAS_M:=DCMASK_L bor DCMASK_R; -- only write relev. bytes (m)<br />
PRE_MASK:=DBMASK_L band DBMASK_R; -- "and" bit masks<br />
PRE_READ:=’1’ -- read dest. before writing<br />
when ((DBOS_L mod 8)/=0 -- if source or destination<br />
or (DBOS_R mod 8)/=7 -- isn’t byte-aligned<br />
or S(1 downto 0)/="00") -- or source and dest. are comb.<br />
else ’0’;<br />
end if;<br />
elsif DADRLW_C=DADRLW_R then -- rightmost longword ?<br />
CAS_M:=DCMASK_R; -- only write relev. bytes (r)<br />
PRE_MASK:=DBMASK_R; -- use right-hand side bit mask<br />
PRE_READ:=’1’ -- read dest. before writing<br />
when ((DBOS_R mod 8)/=7 -- if dest. isn’t byte-aligned<br />
or S(1 downto 0)/="00") -- or source and dest. are comb.<br />
else ’0’;<br />
else -- in between<br />
CAS_M:="0000"; -- write all 4 bytes<br />
PRE_READ:=’1’ -- only read destination<br />
when S(1 downto 0)/="00" -- if source and dest. are comb.<br />
else ’0’;<br />
PRE_MASK:=hi32; -- all GPU FIFO data bits valid<br />
end if;<br />
case GPU_FIFO_OUT is -- get data from GPU fifo buffer<br />
when 0 => D_GPU_FIFO:=D_GPU_FIFO0;<br />
when 1 => D_GPU_FIFO:=D_GPU_FIFO1;<br />
when 2 => D_GPU_FIFO:=D_GPU_FIFO2;<br />
when 3 => D_GPU_FIFO:=D_GPU_FIFO3;<br />
when 4 => D_GPU_FIFO:=D_GPU_FIFO4;<br />
when 5 => D_GPU_FIFO:=D_GPU_FIFO5;<br />
when 6 => D_GPU_FIFO:=D_GPU_FIFO6;<br />
when 7 => D_GPU_FIFO:=D_GPU_FIFO7;<br />
when 8 => D_GPU_FIFO:=D_GPU_FIFO8;<br />
end case;<br />
RAM_D_W:=WRITE_DATA; -- from diagram PIXBLT_PATH<br />
end if;<br />
CAS_MASK:=CAS_M bor CAS_DONE; -- don’t read the same bytes again<br />
Abbildung 98: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/MEM ADDRESS<br />
Anhang D.2<br />
Seite 128
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
GPU_FIFO_R<br />
entry<br />
T3<br />
T1<br />
S1<br />
S2<br />
T4<br />
T2<br />
A: -- write data read from memory into GPU fifo buffer<br />
-- (write DATA_OUT via BIT_SHIFT, S_HI_LW/S_LO_LW)<br />
-- and increment LW address & buffer position<br />
if PBV=’0’ then -- left to right<br />
case GPU_FIFO_IN is<br />
when 0 => D_GPU_FIFO8:=D_GPU_FIFO8 bor S_HI_LW;<br />
D_GPU_FIFO0:=S_LO_LW;<br />
when 1 => D_GPU_FIFO0:=D_GPU_FIFO0 bor S_HI_LW;<br />
D_GPU_FIFO1:=S_LO_LW;<br />
when 2 => D_GPU_FIFO1:=D_GPU_FIFO1 bor S_HI_LW;<br />
D_GPU_FIFO2:=S_LO_LW;<br />
when 3 => D_GPU_FIFO2:=D_GPU_FIFO2 bor S_HI_LW;<br />
D_GPU_FIFO3:=S_LO_LW;<br />
when 4 => D_GPU_FIFO3:=D_GPU_FIFO3 bor S_HI_LW;<br />
D_GPU_FIFO4:=S_LO_LW;<br />
when 5 => D_GPU_FIFO4:=D_GPU_FIFO4 bor S_HI_LW;<br />
D_GPU_FIFO5:=S_LO_LW;<br />
when 6 => D_GPU_FIFO5:=D_GPU_FIFO5 bor S_HI_LW;<br />
D_GPU_FIFO6:=S_LO_LW;<br />
when 7 => D_GPU_FIFO6:=D_GPU_FIFO6 bor S_HI_LW;<br />
D_GPU_FIFO7:=S_LO_LW;<br />
when 8 => D_GPU_FIFO7:=D_GPU_FIFO7 bor S_HI_LW;<br />
D_GPU_FIFO8:=S_LO_LW;<br />
end case;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
GPU_FIFO_IN:=GPU_FIFO_IN+1 when GPU_FIFO_IN/=8 else 0;<br />
else -- right to left<br />
case GPU_FIFO_IN is<br />
when 8 => D_GPU_FIFO0:=D_GPU_FIFO0 bor S_LO_LW;<br />
D_GPU_FIFO8:=S_HI_LW;<br />
when 7 => D_GPU_FIFO8:=D_GPU_FIFO8 bor S_LO_LW;<br />
D_GPU_FIFO7:=S_HI_LW;<br />
when 6 => D_GPU_FIFO7:=D_GPU_FIFO7 bor S_LO_LW;<br />
D_GPU_FIFO6:=S_HI_LW;<br />
when 5 => D_GPU_FIFO6:=D_GPU_FIFO6 bor S_LO_LW;<br />
D_GPU_FIFO5:=S_HI_LW;<br />
when 4 => D_GPU_FIFO5:=D_GPU_FIFO5 bor S_LO_LW;<br />
D_GPU_FIFO4:=S_HI_LW;<br />
when 3 => D_GPU_FIFO4:=D_GPU_FIFO4 bor S_LO_LW;<br />
D_GPU_FIFO3:=S_HI_LW;<br />
when 2 => D_GPU_FIFO3:=D_GPU_FIFO3 bor S_LO_LW;<br />
D_GPU_FIFO2:=S_HI_LW;<br />
when 1 => D_GPU_FIFO2:=D_GPU_FIFO2 bor S_LO_LW;<br />
D_GPU_FIFO1:=S_HI_LW;<br />
when 0 => D_GPU_FIFO1:=D_GPU_FIFO1 bor S_LO_LW;<br />
D_GPU_FIFO0:=S_HI_LW;<br />
end case;<br />
GPU_FIFO_IN:=GPU_FIFO_IN-1 when GPU_FIFO_IN/=0 else 8;<br />
end if;<br />
S3<br />
C: GPU_READ_DONE=’1’<br />
A: -- decrement RNUM (number of longwords to go)<br />
-- and check for end of line<br />
GPU_READ_DONE:=’0’;<br />
if PBV=’0’ then -- left to right<br />
if SADRLW_C=SADRLW_R then<br />
GPU_RNUM:=15; -- end of line, abort read-in phase<br />
GPU_READ:=’0’;<br />
else<br />
if GPU_RNUM=1 then<br />
GPU_READ:=’0’; -- all LW’s done<br />
end if;<br />
GPU_RNUM:=GPU_RNUM-1;<br />
end if;<br />
SADRLW_C:=SADRLW_C+1; -- next source LW address<br />
else -- right to left<br />
if SADRLW_C=SADRLW_L then<br />
GPU_RNUM:=15; -- end of line, abort read-in phase<br />
GPU_READ:=’0’;<br />
else<br />
if GPU_RNUM=1 then<br />
GPU_READ:=’0’; -- all LW’s done<br />
end if;<br />
GPU_RNUM:=GPU_RNUM-1;<br />
end if;<br />
SADRLW_C:=SADRLW_C-1; -- next (prev.) source LW address<br />
end if;<br />
Abbildung 99: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/GPU FIFO R<br />
Anhang D.2<br />
Seite 129
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
GPU_FIFO_W<br />
entry<br />
T1<br />
S1<br />
T2<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
C: GPU_WRITE_DONE=’1’<br />
A: -- increment LW address & buffer position<br />
-- after writing data from GPU fifo buffer<br />
-- to the destination address<br />
GPU_WRITE_DONE:=’0’;<br />
if PBV=’0’ then -- left to right<br />
Anhang D.2<br />
Seite 130<br />
GPU_FIFO_OUT:=GPU_FIFO_OUT+1 when GPU_FIFO_OUT/=8 else 0;<br />
DADRLW_C:=DADRLW_C+1;<br />
if DADRLW_C=DADRLW_R then<br />
GPU_WNUM:=15; -- end of line, abort write phase<br />
GPU_WRITE:=’0’;<br />
else<br />
if GPU_WNUM=1 then<br />
GPU_WRITE:=’0’;<br />
end if;<br />
GPU_WNUM:=GPU_WNUM-1;<br />
end if;<br />
else -- right to left<br />
GPU_FIFO_OUT:=GPU_FIFO_OUT-1 when GPU_FIFO_OUT/=0 else 8;<br />
DADRLW_C:=DADRLW_C-1;<br />
if DADRLW_C=DADRLW_L then<br />
GPU_WNUM:=15; -- end of line, abort write phase<br />
GPU_WRITE:=’0’;<br />
else<br />
if GPU_WNUM=1 then<br />
GPU_WRITE:=’0’;<br />
end if;<br />
GPU_WNUM:=GPU_WNUM-1;<br />
end if;<br />
end if;<br />
Abbildung 100: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/GPU FIFO W
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
PIXBLT_PATH<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Subdiag Actions of <br />
V: INV_S_DATA(32): logic:=lo32; -- orig source data, inv. if S(2)=’1’<br />
INV_D_DATA(32): logic:=lo32; -- orig dest. data, inv. if S(3)=’1’<br />
FST_D_DATA(32): logic:=lo32; -- dest. data before inversion<br />
DEST_DATA(32): logic:=lo32; -- dest. data before PRE_MASK<br />
VEC_S_U(8): logic:=lo8; -- upper byte INV_S_DATA<br />
VEC_S_H(8): logic:=lo8; -- higher byte INV_S_DATA<br />
VEC_S_M(8): logic:=lo8; -- middle byte INV_S_DATA<br />
VEC_S_L(8): logic:=lo8; -- lower byte INV_S_DATA<br />
INT_S_U: int8:=0; -- upper byte INV_S_DATA as an INT<br />
INT_S_H: int8:=0; -- higher byte INV_S_DATA as an INT<br />
INT_S_M: int8:=0; -- middle byte INV_S_DATA as an INT<br />
INT_S_L: int8:=0; -- lower byte INV_S_DATA as an INT<br />
VEC_D_U(8): logic:=lo8; -- upper byte INV_D_DATA<br />
VEC_D_H(8): logic:=lo8; -- higher byte INV_D_DATA<br />
VEC_D_M(8): logic:=lo8; -- middle byte INV_D_DATA<br />
VEC_D_L(8): logic:=lo8; -- lower byte INV_D_DATA<br />
INT_D_U: int8:=0; -- upper byte INV_D_DATA as an INT<br />
INT_D_H: int8:=0; -- higher byte INV_D_DATA as an INT<br />
INT_D_M: int8:=0; -- middle byte INV_D_DATA as an INT<br />
INT_D_L: int8:=0; -- lower byte INV_D_DATA as an INT<br />
INT_SUM_U: int8:=0; -- upper byte of the sum as an INT<br />
INT_SUM_H: int8:=0; -- higher byte of the sum as an INT<br />
INT_SUM_M: int8:=0; -- middle byte of the sum as an INT<br />
INT_SUM_L: int8:=0; -- lower byte of the sum as an INT<br />
VEC_SUM_U(8): logic:=lo8; -- upper byte of the sum<br />
VEC_SUM_H(8): logic:=lo8; -- higher byte of the sum<br />
VEC_SUM_M(8): logic:=lo8; -- middle byte of the sum<br />
VEC_SUM_L(8): logic:=lo8; -- lower byte of the sum<br />
A: --<br />
-- D_GPU_FIFO: (in) source data (from FIFO buffer)<br />
-- DATA_OUT: (in) pre-read destination data<br />
-- PRE_MASK: (in) bit mask: ’1’= use source data<br />
-- ’0’= use pre-read data<br />
-- WRITE_DATA: (out) write data for PIXBLT destination<br />
INV_S_DATA:=D_GPU_FIFO when S(2)=’0’ else bnot D_GPU_FIFO;<br />
INV_D_DATA:=DATA_OUT when S(3)=’0’ else bnot DATA_OUT;<br />
VEC_S_U:=INV_S_DATA(31 downto 24); -- all this is<br />
VEC_S_H:=INV_S_DATA(23 downto 16); -- necessary<br />
VEC_S_M:=INV_S_DATA(15 downto 08); -- because<br />
VEC_S_L:=INV_S_DATA(07 downto 00); -- speedchart<br />
VEC_D_U:=INV_D_DATA(31 downto 24); -- doesn’t<br />
VEC_D_H:=INV_D_DATA(23 downto 16); -- support the<br />
VEC_D_M:=INV_D_DATA(15 downto 08); -- addition<br />
VEC_D_L:=INV_D_DATA(07 downto 00); -- of vectors !!<br />
INT_S_U:=VEC_S_U;<br />
INT_S_H:=VEC_S_H; -- so: get the 4 vectors<br />
INT_S_M:=VEC_S_M; -- (VHDL2000 doesn’t permit<br />
INT_S_L:=VEC_S_L; -- "int:=vec(subrange)")<br />
INT_D_U:=VEC_D_U;<br />
INT_D_H:=VEC_D_H; -- assign vectors to integers<br />
INT_D_M:=VEC_D_M;<br />
INT_D_L:=VEC_D_L;<br />
INT_SUM_U:=(INT_S_U + INT_D_U) mod 256; -- then add the<br />
INT_SUM_H:=(INT_S_H + INT_D_H) mod 256; -- integers !!<br />
INT_SUM_M:=(INT_S_M + INT_D_M) mod 256;<br />
INT_SUM_L:=(INT_S_L + INT_D_L) mod 256;<br />
VEC_SUM_U:=INT_SUM_U mod 256; -- and back to<br />
VEC_SUM_H:=INT_SUM_H mod 256; -- vectors !!<br />
VEC_SUM_M:=INT_SUM_M mod 256;<br />
VEC_SUM_L:=INT_SUM_L mod 256; -- how silly !!<br />
case S(1 downto 0) is<br />
when "00" => -- dest:= source<br />
FST_D_DATA:=INV_S_DATA;<br />
when "01" => -- dest:= source OR dest.<br />
FST_D_DATA:=INV_S_DATA bor INV_D_DATA;<br />
when "10" => -- dest:= source XOR dest.<br />
FST_D_DATA:=INV_S_DATA bxor INV_D_DATA;<br />
when "11" => -- dest:= source PLUS dest.<br />
-- (4 times 8+8 bits for<br />
-- 8-bit-colormap or 24-bit RGB)<br />
FST_D_DATA(31 downto 24):=VEC_SUM_U;<br />
FST_D_DATA(23 downto 16):=VEC_SUM_H;<br />
FST_D_DATA(15 downto 08):=VEC_SUM_M;<br />
FST_D_DATA(07 downto 00):=VEC_SUM_L;<br />
end case;<br />
DEST_DATA:=FST_D_DATA when S(4)=’0’ else bnot FST_D_DATA;<br />
WRITE_DATA:=(DEST_DATA band PRE_MASK)<br />
-- relevant bits from buffer<br />
bor (DATA_OUT band (bnot PRE_MASK));<br />
-- or relevant pre-read bits<br />
Abbildung 101: Speedchart-Diagramm TIM/CONTROL/MEM ACCESS/PIXBLT PATH<br />
Anhang D.2<br />
Seite 131
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
INTERRUPT<br />
T1<br />
entry<br />
S1<br />
T2<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
A: if STAT_CLR=’1’ then<br />
R_STA<strong>TU</strong>S:=lo8; -- clear R_STA<strong>TU</strong>S<br />
-- after register read<br />
STAT_CLR:=’0’;<br />
INT_oe:=’0’; -- end INT pulse<br />
else<br />
if VINT_RQ=’1’ then -- vertical int.rq.<br />
R_STA<strong>TU</strong>S(0):=’1’;<br />
if R_IMASK(0)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
VINT_RQ:=’0’;<br />
end if;<br />
if HINT_RQ=’1’ then -- horizontal int.rq.<br />
R_STA<strong>TU</strong>S(1):=’1’;<br />
if R_IMASK(1)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
HINT_RQ:=’0’;<br />
end if;<br />
if REFINT_RQ=’1’ then -- refresh int.rq.<br />
R_STA<strong>TU</strong>S(2):=’1’;<br />
if R_IMASK(2)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
REFINT_RQ:=’0’;<br />
end if;<br />
if CINT_RQ=’1’ then -- clipping int.rq.<br />
R_STA<strong>TU</strong>S(3):=’1’;<br />
if R_IMASK(3)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
CINT_RQ:=’0’;<br />
end if;<br />
if WINT_RQ=’1’ then -- window viol. int.rq.<br />
R_STA<strong>TU</strong>S(4):=’1’;<br />
if R_IMASK(4)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
WINT_RQ:=’0’;<br />
end if;<br />
if RLEINT_RQ=’1’ then -- reload error int.rq.<br />
R_STA<strong>TU</strong>S(5):=’1’;<br />
if R_IMASK(5)=’1’ and R_IMASK(7)=’1’ then<br />
INT_oe:=’1’;<br />
end if;<br />
RLEINT_RQ:=’0’;<br />
end if;<br />
end if;<br />
Abbildung 102: Speedchart-Diagramm TIM/CONTROL/INTERRUPT<br />
Anhang D.2<br />
Seite 132
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Diagram Variables:<br />
-- Variables of Diagram GR_CPU<br />
SADR_P_HI: integer:=0; -- 1st comp. of SYADR * R_SINC<br />
SADR_P_LO: integer:=0; -- 2nd comp. of SYADR * R_SINC<br />
SADR_P: integer:=0; -- (SYADR * R_SINC) + SXADR<br />
SY_P_HI: integer:=0; -- 1st comp. of (DY-1) * R_SINC<br />
SY_P_LO: integer:=0; -- 2nd comp. of (DY-1) * R_SINC<br />
SY_P: integer:=0; -- (DY-1) * R_SINC<br />
DADR_P_HI: integer:=0; -- 1st comp. of DYADR * R_DINC<br />
DADR_P_LO: integer:=0; -- 2nd comp. of DYADR * R_DINC<br />
DADR_P: integer:=0; -- (DYADR * R_DINC) + DXADR<br />
DY_P_HI: integer:=0; -- 1st comp. of (DY-1) * R_DINC<br />
DY_P_LO: integer:=0; -- 2nd comp. of (DY-1) * R_DINC<br />
DY_P: integer:=0; -- (DY-1) * R_DINC<br />
Anhang D.2<br />
Seite 133<br />
SADRL_L: integer:=0; -- source first line leftmost pixel<br />
SADRL_R: integer:=0; -- source first line rightmost pixel<br />
DADRL_L: integer:=0; -- dest. first line leftmost pixel<br />
DADRL_R: integer:=0; -- dest. first line rightmost pixel<br />
XS_viol: logic; -- window area violation X start<br />
XE_viol: logic; -- window area violation X end<br />
YS_viol: logic; -- window area violation Y start<br />
YE_viol: logic; -- window area violation Y end<br />
LINCNT: int16:=0; -- "lines left" counter for PixBLT<br />
constant C_FILL_L(8): logic:=0x21;<br />
constant C_FILL_XY(8): logic:=0x22;<br />
constant C_PixBLT_L(8): logic:=0x31;<br />
constant C_PixBLT_XY(8): logic:=0x32;<br />
constant C_CLIP(8): logic:=0x40;<br />
Abbildung 103: Variablen im Diagramm TIM/GR CPU
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
GP_CMD<br />
Entry of <br />
A: R_COMMAND:=0x00;<br />
C: CLIP’complete<br />
T3<br />
T2<br />
entry stdby<br />
CLIP<br />
T1<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
C: R_COMMAND=C_CLIP<br />
C: PixBLT’complete<br />
T6 T8<br />
C: R_COMMAND=C_PixBLT_XY or<br />
R_COMMAND=C_PixBLT_L<br />
Abbildung 104: Speedchart-Diagramm TIM/GR CPU/GP CMD<br />
PixBLT<br />
Anhang D.2<br />
Seite 134
Abbildung 105: Speedchart-Diagramm TIM/GR CPU/GP CMD/CLIP<br />
CLIP<br />
entry<br />
T1<br />
S1<br />
T4 #1<br />
A: -- clip coordinates if necessary<br />
-- set WINT:=1 if coord’s were clipped<br />
if YS_viol=’1’ then<br />
R_DADR(31 downto 16):=R_WSTARTY;<br />
-- clip Y start<br />
if YE_viol=’1’ then<br />
R_DY:=(WENDY-WSTARTY+1) mod 65536;<br />
-- two side clip, new area height<br />
else<br />
R_DY:=(DY+DYADR-WSTARTY) mod 65536;<br />
-- Y start clip, adapt DY<br />
end if;<br />
WINT_RQ:=’1’; -- interrupt: wind. viol.<br />
elsif YE_viol=’1’ then<br />
R_DY:=(WENDY-DYADR) mod 65536;<br />
-- clip Y end only, new area height<br />
WINT_RQ:=’1’; -- interrupt: wind. viol.<br />
end if;<br />
if XS_viol=’1’ then<br />
R_DADR(15 downto 00):=R_WSTARTX;<br />
-- clip X start<br />
if XE_viol=’1’ then<br />
R_DX:=(WENDX-WSTARTX+1) mod 65536;<br />
-- two side clip, new area width<br />
else<br />
R_DX:=(DX+DXADR-WSTARTX) mod 65536;<br />
-- X start clip, adapt DX<br />
end if;<br />
WINT_RQ:=’1’; -- interrupt: wind. viol.<br />
elsif XE_viol=’1’ then<br />
R_DX:=(WENDX-DXADR) mod 65536;<br />
-- clip X end only, new area width<br />
WINT_RQ:=’1’; -- interrupt: wind. viol.<br />
end if;<br />
C: (DXADR > WENDX) or<br />
((DXADR+DX-1) < WSTARTX) or<br />
(DYADR > WENDY) or<br />
((DYADR+DY-1) < WSTARTY)<br />
A: CINT_RQ:=’1’;<br />
-- interrupt: window empty<br />
T5 #0<br />
S2<br />
T2<br />
A: -- convert DXADR/DYADR<br />
-- (X/Y dest. address)<br />
-- to R_DYADR<br />
-- (linear destination pixel address)<br />
R_DADR:=DADR_P;<br />
exit<br />
Subdiag Actions of <br />
A: XS_viol:=’1’ when DXADR < WSTARTX else ’0’;<br />
XE_viol:=’1’ when (DXADR+DX-1) < WENDX else ’0’;<br />
YS_viol:=’1’ when DYADR < WSTARTY else ’0’;<br />
YE_viol:=’1’ when (DYADR+DY-1) < WENDY else ’0’;<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.2<br />
Seite 135
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
PIXBLT<br />
C: LINCNT/=1<br />
A: LINCNT:=LINCNT-1; -- next line<br />
if PBV=’0’ then<br />
CL_SADRL_L:=CL_SADRL_L + SINC;<br />
CL_SADRL_R:=CL_SADRL_R + SINC;<br />
CL_DADRL_L:=CL_DADRL_L + DINC;<br />
CL_DADRL_R:=CL_DADRL_R + DINC;<br />
else<br />
CL_SADRL_L:=CL_SADRL_L - SINC;<br />
CL_SADRL_R:=CL_SADRL_R - SINC;<br />
CL_DADRL_L:=CL_DADRL_L - DINC;<br />
CL_DADRL_R:=CL_DADRL_R - DINC;<br />
end if;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
T8 #0<br />
C: GPU_READ=’0’<br />
A: GPU_WRITE:=’1’;<br />
GPU_WNUM:=8;<br />
T1<br />
T3<br />
T6<br />
T2<br />
entry<br />
LINE<br />
read<br />
write<br />
Abbildung 106: Speedchart-Diagramm TIM/GR CPU/GP CMD/PIXBLT<br />
S1<br />
A: -- first line pixel addresses<br />
CL_SADRL_L:=SADRL_L;<br />
CL_SADRL_R:=SADRL_R;<br />
CL_DADRL_L:=DADRL_L;<br />
CL_DADRL_R:=DADRL_R;<br />
T4<br />
-- "lines left" counter<br />
LINCNT:=DY;<br />
A: if PBH=’0’ then<br />
SADRLW_C:=SADRLW_L;<br />
DADRLW_C:=DADRLW_L;<br />
T9 #1<br />
Anhang D.2<br />
Seite 136<br />
-- left to right<br />
GPU_FIFO_IN:=0 when SBOS_L>DBOS_L else 1;<br />
GPU_FIFO_OUT:=0;<br />
D_GPU_FIFO0:=lo32;<br />
GPU_READ:=’1’;<br />
GPU_RNUM:=9 when SBOS_L>DBOS_L else 8;<br />
else<br />
-- right to left<br />
SADRLW_C:=SADRLW_R;<br />
DADRLW_C:=DADRLW_R;<br />
GPU_FIFO_IN:=7 when SBOS_L>DBOS_L else 8;<br />
GPU_FIFO_OUT:=8;<br />
D_GPU_FIFO8:=lo32;<br />
GPU_READ:=’1’;<br />
GPU_RNUM:=9 when DBOS_L>SBOS_L else 8;<br />
end if;<br />
C: GPU_WNUM=0<br />
A: GPU_READ:=’1’;<br />
GPU_RNUM:=8;<br />
C: GPU_WNUM=15 -- end of line<br />
exit
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
SADR_SPLIT<br />
Subdiag Actions of <br />
A: -- multiplication of SYADR and R_SINC:<br />
-- assume the bits a and b are set in R_SINC,<br />
-- then SADR_P_HI:= SYADR shl a;<br />
-- and SADR_P_LO:= SYADR shl b;<br />
--<br />
-- SADR_P:= (SYADR * R_SINC) + SXADR;<br />
if R_SINC(15)=’1’ then<br />
SADR_P_HI:=SYADR shl 15;<br />
elsif R_SINC(14)=’1’ then<br />
SADR_P_HI:=SYADR shl 14;<br />
elsif R_SINC(13)=’1’ then<br />
SADR_P_HI:=SYADR shl 13;<br />
elsif R_SINC(12)=’1’ then<br />
SADR_P_HI:=SYADR shl 12;<br />
elsif R_SINC(11)=’1’ then<br />
SADR_P_HI:=SYADR shl 11;<br />
elsif R_SINC(10)=’1’ then<br />
SADR_P_HI:=SYADR shl 10;<br />
elsif R_SINC(9)=’1’ then<br />
SADR_P_HI:=SYADR shl 9;<br />
elsif R_SINC(8)=’1’ then<br />
SADR_P_HI:=SYADR shl 8;<br />
elsif R_SINC(7)=’1’ then<br />
SADR_P_HI:=SYADR shl 7;<br />
elsif R_SINC(6)=’1’ then<br />
SADR_P_HI:=SYADR shl 6;<br />
elsif R_SINC(5)=’1’ then<br />
SADR_P_HI:=SYADR shl 5;<br />
elsif R_SINC(4)=’1’ then<br />
SADR_P_HI:=SYADR shl 4;<br />
elsif R_SINC(3)=’1’ then<br />
SADR_P_HI:=SYADR shl 3;<br />
elsif R_SINC(2)=’1’ then<br />
SADR_P_HI:=SYADR shl 2;<br />
elsif R_SINC(1)=’1’ then<br />
SADR_P_HI:=SYADR shl 1;<br />
else<br />
SADR_P_HI:=SYADR;<br />
end if;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
if R_SINC(0)=’1’ and R_SINC/="0000000000000001" then<br />
SADR_P_LO:=SYADR;<br />
elsif R_SINC(1)=’1’ and R_SINC(15 downto 1)/="000000000000001" then<br />
SADR_P_LO:=SYADR shl 1;<br />
elsif R_SINC(2)=’1’ and R_SINC(15 downto 2)/="00000000000001" then<br />
SADR_P_LO:=SYADR shl 2;<br />
elsif R_SINC(3)=’1’ and R_SINC(15 downto 3)/="0000000000001" then<br />
SADR_P_LO:=SYADR shl 3;<br />
elsif R_SINC(4)=’1’ and R_SINC(15 downto 4)/="000000000001" then<br />
SADR_P_LO:=SYADR shl 4;<br />
elsif R_SINC(5)=’1’ and R_SINC(15 downto 5)/="00000000001" then<br />
SADR_P_LO:=SYADR shl 5;<br />
elsif R_SINC(6)=’1’ and R_SINC(15 downto 6)/="0000000001" then<br />
SADR_P_LO:=SYADR shl 6;<br />
elsif R_SINC(7)=’1’ and R_SINC(15 downto 7)/="000000001" then<br />
SADR_P_LO:=SYADR shl 7;<br />
elsif R_SINC(8)=’1’ and R_SINC(15 downto 8)/="00000001" then<br />
SADR_P_LO:=SYADR shl 8;<br />
elsif R_SINC(9)=’1’ and R_SINC(15 downto 9)/="0000001" then<br />
SADR_P_LO:=SYADR shl 9;<br />
elsif R_SINC(10)=’1’ and R_SINC(15 downto 10)/="000001" then<br />
SADR_P_LO:=SYADR shl 10;<br />
elsif R_SINC(11)=’1’ and R_SINC(15 downto 11)/="00001" then<br />
SADR_P_LO:=SYADR shl 11;<br />
elsif R_SINC(12)=’1’ and R_SINC(15 downto 12)/="0001" then<br />
SADR_P_LO:=SYADR shl 12;<br />
elsif R_SINC(13)=’1’ and R_SINC(15 downto 13)/="001" then<br />
SADR_P_LO:=SYADR shl 13;<br />
elsif R_SINC(14)=’1’ and R_SINC(15 downto 14)/="01" then<br />
SADR_P_LO:=SYADR shl 14;<br />
else<br />
SADR_P_LO:=0;<br />
end if;<br />
SADR_P:=SADR_P_HI + SADR_P_LO + SXADR;<br />
Abbildung 107: Speedchart-Diagramm TIM/GR CPU/SADR SPLIT<br />
Anhang D.2<br />
Seite 137
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
DADR_SPLIT<br />
Subdiag Actions of <br />
A: -- multiplication of DYADR and R_DINC:<br />
-- assume the bits a and b are set in R_DINC,<br />
-- then DADR_P_HI:= DYADR shl a;<br />
-- and DADR_P_LO:= DYADR shl b;<br />
--<br />
-- DADR_P:= (DYADR * R_DINC) + DXADR;<br />
if R_DINC(15)=’1’ then<br />
DADR_P_HI:=DYADR shl 15;<br />
elsif R_DINC(14)=’1’ then<br />
DADR_P_HI:=DYADR shl 14;<br />
elsif R_DINC(13)=’1’ then<br />
DADR_P_HI:=DYADR shl 13;<br />
elsif R_DINC(12)=’1’ then<br />
DADR_P_HI:=DYADR shl 12;<br />
elsif R_DINC(11)=’1’ then<br />
DADR_P_HI:=DYADR shl 11;<br />
elsif R_DINC(10)=’1’ then<br />
DADR_P_HI:=DYADR shl 10;<br />
elsif R_DINC(9)=’1’ then<br />
DADR_P_HI:=DYADR shl 9;<br />
elsif R_DINC(8)=’1’ then<br />
DADR_P_HI:=DYADR shl 8;<br />
elsif R_DINC(7)=’1’ then<br />
DADR_P_HI:=DYADR shl 7;<br />
elsif R_DINC(6)=’1’ then<br />
DADR_P_HI:=DYADR shl 6;<br />
elsif R_DINC(5)=’1’ then<br />
DADR_P_HI:=DYADR shl 5;<br />
elsif R_DINC(4)=’1’ then<br />
DADR_P_HI:=DYADR shl 4;<br />
elsif R_DINC(3)=’1’ then<br />
DADR_P_HI:=DYADR shl 3;<br />
elsif R_DINC(2)=’1’ then<br />
DADR_P_HI:=DYADR shl 2;<br />
elsif R_DINC(1)=’1’ then<br />
DADR_P_HI:=DYADR shl 1;<br />
else<br />
DADR_P_HI:=DYADR;<br />
end if;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
if R_DINC(0)=’1’ and R_DINC/="0000000000000001" then<br />
DADR_P_LO:=DYADR;<br />
elsif R_DINC(1)=’1’ and R_DINC(15 downto 1)/="000000000000001" then<br />
DADR_P_LO:=DYADR shl 1;<br />
elsif R_DINC(2)=’1’ and R_DINC(15 downto 2)/="00000000000001" then<br />
DADR_P_LO:=DYADR shl 2;<br />
elsif R_DINC(3)=’1’ and R_DINC(15 downto 3)/="0000000000001" then<br />
DADR_P_LO:=DYADR shl 3;<br />
elsif R_DINC(4)=’1’ and R_DINC(15 downto 4)/="000000000001" then<br />
DADR_P_LO:=DYADR shl 4;<br />
elsif R_DINC(5)=’1’ and R_DINC(15 downto 5)/="00000000001" then<br />
DADR_P_LO:=DYADR shl 5;<br />
elsif R_DINC(6)=’1’ and R_DINC(15 downto 6)/="0000000001" then<br />
DADR_P_LO:=DYADR shl 6;<br />
elsif R_DINC(7)=’1’ and R_DINC(15 downto 7)/="000000001" then<br />
DADR_P_LO:=DYADR shl 7;<br />
elsif R_DINC(8)=’1’ and R_DINC(15 downto 8)/="00000001" then<br />
DADR_P_LO:=DYADR shl 8;<br />
elsif R_DINC(9)=’1’ and R_DINC(15 downto 9)/="0000001" then<br />
DADR_P_LO:=DYADR shl 9;<br />
elsif R_DINC(10)=’1’ and R_DINC(15 downto 10)/="000001" then<br />
DADR_P_LO:=DYADR shl 10;<br />
elsif R_DINC(11)=’1’ and R_DINC(15 downto 11)/="00001" then<br />
DADR_P_LO:=DYADR shl 11;<br />
elsif R_DINC(12)=’1’ and R_DINC(15 downto 12)/="0001" then<br />
DADR_P_LO:=DYADR shl 12;<br />
elsif R_DINC(13)=’1’ and R_DINC(15 downto 13)/="001" then<br />
DADR_P_LO:=DYADR shl 13;<br />
elsif R_DINC(14)=’1’ and R_DINC(15 downto 14)/="01" then<br />
DADR_P_LO:=DYADR shl 14;<br />
else<br />
DADR_P_LO:=0;<br />
end if;<br />
DADR_P:=DADR_P_HI + DADR_P_LO + DXADR;<br />
Abbildung 108: Speedchart-Diagramm TIM/GR CPU/DADR SPLIT<br />
Anhang D.2<br />
Seite 138
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
SY_SPLIT<br />
Subdiag Actions of <br />
A: -- multiplication of (DY-1) and R_SINC:<br />
-- assume the bits a and b are set in R_SINC,<br />
-- then SY_P_HI:= (DY-1) shl a;<br />
-- and SY_P_LO:= (DY-1) shl b;<br />
--<br />
-- SY_P:=(DY-1) * R_SINC;<br />
if R_SINC(15)=’1’ then<br />
SY_P_HI:=(DY-1) shl 15;<br />
elsif R_SINC(14)=’1’ then<br />
SY_P_HI:=(DY-1) shl 14;<br />
elsif R_SINC(13)=’1’ then<br />
SY_P_HI:=(DY-1) shl 13;<br />
elsif R_SINC(12)=’1’ then<br />
SY_P_HI:=(DY-1) shl 12;<br />
elsif R_SINC(11)=’1’ then<br />
SY_P_HI:=(DY-1) shl 11;<br />
elsif R_SINC(10)=’1’ then<br />
SY_P_HI:=(DY-1) shl 10;<br />
elsif R_SINC(9)=’1’ then<br />
SY_P_HI:=(DY-1) shl 9;<br />
elsif R_SINC(8)=’1’ then<br />
SY_P_HI:=(DY-1) shl 8;<br />
elsif R_SINC(7)=’1’ then<br />
SY_P_HI:=(DY-1) shl 7;<br />
elsif R_SINC(6)=’1’ then<br />
SY_P_HI:=(DY-1) shl 6;<br />
elsif R_SINC(5)=’1’ then<br />
SY_P_HI:=(DY-1) shl 5;<br />
elsif R_SINC(4)=’1’ then<br />
SY_P_HI:=(DY-1) shl 4;<br />
elsif R_SINC(3)=’1’ then<br />
SY_P_HI:=(DY-1) shl 3;<br />
elsif R_SINC(2)=’1’ then<br />
SY_P_HI:=(DY-1) shl 2;<br />
elsif R_SINC(1)=’1’ then<br />
SY_P_HI:=(DY-1) shl 1;<br />
else<br />
SY_P_HI:=(DY-1);<br />
end if;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
if R_SINC(0)=’1’ and R_SINC/="0000000000000001" then<br />
SY_P_LO:=(DY-1);<br />
elsif R_SINC(1)=’1’ and R_SINC(15 downto 1)/="000000000000001" then<br />
SY_P_LO:=(DY-1) shl 1;<br />
elsif R_SINC(2)=’1’ and R_SINC(15 downto 2)/="00000000000001" then<br />
SY_P_LO:=(DY-1) shl 2;<br />
elsif R_SINC(3)=’1’ and R_SINC(15 downto 3)/="0000000000001" then<br />
SY_P_LO:=(DY-1) shl 3;<br />
elsif R_SINC(4)=’1’ and R_SINC(15 downto 4)/="000000000001" then<br />
SY_P_LO:=(DY-1) shl 4;<br />
elsif R_SINC(5)=’1’ and R_SINC(15 downto 5)/="00000000001" then<br />
SY_P_LO:=(DY-1) shl 5;<br />
elsif R_SINC(6)=’1’ and R_SINC(15 downto 6)/="0000000001" then<br />
SY_P_LO:=(DY-1) shl 6;<br />
elsif R_SINC(7)=’1’ and R_SINC(15 downto 7)/="000000001" then<br />
SY_P_LO:=(DY-1) shl 7;<br />
elsif R_SINC(8)=’1’ and R_SINC(15 downto 8)/="00000001" then<br />
SY_P_LO:=(DY-1) shl 8;<br />
elsif R_SINC(9)=’1’ and R_SINC(15 downto 9)/="0000001" then<br />
SY_P_LO:=(DY-1) shl 9;<br />
elsif R_SINC(10)=’1’ and R_SINC(15 downto 10)/="000001" then<br />
SY_P_LO:=(DY-1) shl 10;<br />
elsif R_SINC(11)=’1’ and R_SINC(15 downto 11)/="00001" then<br />
SY_P_LO:=(DY-1) shl 11;<br />
elsif R_SINC(12)=’1’ and R_SINC(15 downto 12)/="0001" then<br />
SY_P_LO:=(DY-1) shl 12;<br />
elsif R_SINC(13)=’1’ and R_SINC(15 downto 13)/="001" then<br />
SY_P_LO:=(DY-1) shl 13;<br />
elsif R_SINC(14)=’1’ and R_SINC(15 downto 14)/="01" then<br />
SY_P_LO:=(DY-1) shl 14;<br />
else<br />
SY_P_LO:=0;<br />
end if;<br />
SY_P:=SY_P_LO + SY_P_HI;<br />
Abbildung 109: Speedchart-Diagramm TIM/GR CPU/SY SPLIT<br />
Anhang D.2<br />
Seite 139
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
DY_SPLIT<br />
Subdiag Actions of <br />
A: -- multiplication of (DY-1) and R_DINC:<br />
-- assume the bits a and b are set in R_DINC,<br />
-- then DY_P_HI:= (DY-1) shl a;<br />
-- and DY_P_LO:= (DY-1) shl b;<br />
--<br />
-- DY_P:=(DY-1) * R_DINC;<br />
if R_DINC(15)=’1’ then<br />
DY_P_HI:=(DY-1) shl 15;<br />
elsif R_DINC(14)=’1’ then<br />
DY_P_HI:=(DY-1) shl 14;<br />
elsif R_DINC(13)=’1’ then<br />
DY_P_HI:=(DY-1) shl 13;<br />
elsif R_DINC(12)=’1’ then<br />
DY_P_HI:=(DY-1) shl 12;<br />
elsif R_DINC(11)=’1’ then<br />
DY_P_HI:=(DY-1) shl 11;<br />
elsif R_DINC(10)=’1’ then<br />
DY_P_HI:=(DY-1) shl 10;<br />
elsif R_DINC(9)=’1’ then<br />
DY_P_HI:=(DY-1) shl 9;<br />
elsif R_DINC(8)=’1’ then<br />
DY_P_HI:=(DY-1) shl 8;<br />
elsif R_DINC(7)=’1’ then<br />
DY_P_HI:=(DY-1) shl 7;<br />
elsif R_DINC(6)=’1’ then<br />
DY_P_HI:=(DY-1) shl 6;<br />
elsif R_DINC(5)=’1’ then<br />
DY_P_HI:=(DY-1) shl 5;<br />
elsif R_DINC(4)=’1’ then<br />
DY_P_HI:=(DY-1) shl 4;<br />
elsif R_DINC(3)=’1’ then<br />
DY_P_HI:=(DY-1) shl 3;<br />
elsif R_DINC(2)=’1’ then<br />
DY_P_HI:=(DY-1) shl 2;<br />
elsif R_DINC(1)=’1’ then<br />
DY_P_HI:=(DY-1) shl 1;<br />
else<br />
DY_P_HI:=(DY-1);<br />
end if;<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
if R_DINC(0)=’1’ and R_DINC/="0000000000000001" then<br />
DY_P_LO:=(DY-1);<br />
elsif R_DINC(1)=’1’ and R_DINC(15 downto 1)/="000000000000001" then<br />
DY_P_LO:=(DY-1) shl 1;<br />
elsif R_DINC(2)=’1’ and R_DINC(15 downto 2)/="00000000000001" then<br />
DY_P_LO:=(DY-1) shl 2;<br />
elsif R_DINC(3)=’1’ and R_DINC(15 downto 3)/="0000000000001" then<br />
DY_P_LO:=(DY-1) shl 3;<br />
elsif R_DINC(4)=’1’ and R_DINC(15 downto 4)/="000000000001" then<br />
DY_P_LO:=(DY-1) shl 4;<br />
elsif R_DINC(5)=’1’ and R_DINC(15 downto 5)/="00000000001" then<br />
DY_P_LO:=(DY-1) shl 5;<br />
elsif R_DINC(6)=’1’ and R_DINC(15 downto 6)/="0000000001" then<br />
DY_P_LO:=(DY-1) shl 6;<br />
elsif R_DINC(7)=’1’ and R_DINC(15 downto 7)/="000000001" then<br />
DY_P_LO:=(DY-1) shl 7;<br />
elsif R_DINC(8)=’1’ and R_DINC(15 downto 8)/="00000001" then<br />
DY_P_LO:=(DY-1) shl 8;<br />
elsif R_DINC(9)=’1’ and R_DINC(15 downto 9)/="0000001" then<br />
DY_P_LO:=(DY-1) shl 9;<br />
elsif R_DINC(10)=’1’ and R_DINC(15 downto 10)/="000001" then<br />
DY_P_LO:=(DY-1) shl 10;<br />
elsif R_DINC(11)=’1’ and R_DINC(15 downto 11)/="00001" then<br />
DY_P_LO:=(DY-1) shl 11;<br />
elsif R_DINC(12)=’1’ and R_DINC(15 downto 12)/="0001" then<br />
DY_P_LO:=(DY-1) shl 12;<br />
elsif R_DINC(13)=’1’ and R_DINC(15 downto 13)/="001" then<br />
DY_P_LO:=(DY-1) shl 13;<br />
elsif R_DINC(14)=’1’ and R_DINC(15 downto 14)/="01" then<br />
DY_P_LO:=(DY-1) shl 14;<br />
else<br />
DY_P_LO:=0;<br />
end if;<br />
DY_P:=DY_P_LO + DY_P_HI;<br />
Abbildung 110: Speedchart-Diagramm TIM/GR CPU/DY SPLIT<br />
Anhang D.2<br />
Seite 140
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
AREA_TO_PIX<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Subdiag Actions of <br />
V: THE_SADR: integer:=0; -- SADR or SADR_P<br />
THE_DADR: integer:=0; -- DADR or DADR_P<br />
A: if R_COMMAND(0)=’0’ then<br />
-- XY-addr. SXADR/SYADR and DXADR/DYADR<br />
-- to linear SADRL and DADRL<br />
-- (source/dest. pixel address)<br />
THE_SADR:=SADR_P;<br />
THE_DADR:=DADR_P;<br />
else<br />
-- linear addr. SADR and DADR (top left)<br />
-- to linear SADRL/DADRL (dep. on PBV)<br />
THE_SADR:=SADR;<br />
THE_DADR:=DADR;<br />
end if;<br />
-- SADRL_L/DADRL_L: first line, leftmost pixel<br />
-- SADRL_R/DADRL_R: first line, rightmost pixel<br />
-- (dependent on PBV: top line/bottom line)<br />
Anhang D.2<br />
Seite 141<br />
if PBV=’0’ then -- top<br />
SADRL_L:=THE_SADR;<br />
DADRL_L:=THE_DADR; -- left top<br />
SADRL_R:=THE_SADR + DX -1;<br />
DADRL_R:=THE_DADR + DX -1; -- right top<br />
else -- bottom<br />
SADRL_L:=THE_SADR + SY_P;<br />
DADRL_L:=THE_DADR + DY_P; -- left bottom<br />
SADRL_R:=THE_SADR + SY_P + DX -1;<br />
DADRL_R:=THE_DADR + DY_P + DX -1; -- right bottom<br />
end if;<br />
Abbildung 111: Speedchart-Diagramm TIM/GR CPU/AREA TO PIX
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
PIX_TO_BIT<br />
Subdiag Actions of <br />
A: -- convert pixel addresses<br />
-- to longword addresses<br />
-- and bit offsets<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
if R_PSIZE(5)=’1’ then -- 32 bit/pix<br />
SADRLW_L:=CL_SADRL_L + SSTLW;<br />
SADRLW_R:=CL_SADRL_R + SSTLW;<br />
DADRLW_L:=CL_DADRL_L + DSTLW;<br />
DADRLW_R:=CL_DADRL_R + DSTLW;<br />
SBOS_L:=0;<br />
SBOS_R:=31;<br />
DBOS_L:=0;<br />
DBOS_R:=31;<br />
elsif R_PSIZE(4)=’1’ then -- 16 bit/pix<br />
SADRLW_L:=(CL_SADRL_L shr 1) + SSTLW;<br />
SADRLW_R:=(CL_SADRL_R shr 1) + SSTLW;<br />
DADRLW_L:=(CL_DADRL_L shr 1) + DSTLW;<br />
DADRLW_R:=(CL_DADRL_R shr 1) + DSTLW;<br />
SBOS_L:=(CL_SADRL_L shl 4) mod 32;<br />
SBOS_R:=((CL_SADRL_R shl 4) mod 32) + 15;<br />
DBOS_L:=(CL_DADRL_L shl 4) mod 32;<br />
DBOS_R:=((CL_DADRL_R shl 4) mod 32) + 15;<br />
elsif R_PSIZE(3)=’1’ then -- 8 bit/pix<br />
SADRLW_L:=(CL_SADRL_L shr 2) + SSTLW;<br />
SADRLW_R:=(CL_SADRL_R shr 2) + SSTLW;<br />
DADRLW_L:=(CL_DADRL_L shr 2) + DSTLW;<br />
DADRLW_R:=(CL_DADRL_R shr 2) + DSTLW;<br />
SBOS_L:=(CL_SADRL_L shl 3) mod 32;<br />
SBOS_R:=((CL_SADRL_R shl 3) mod 32) + 7;<br />
DBOS_L:=(CL_DADRL_L shl 3) mod 32;<br />
DBOS_R:=((CL_DADRL_R shl 3) mod 32) + 7;<br />
elsif R_PSIZE(2)=’1’ then -- 4 bit/pix<br />
SADRLW_L:=(CL_SADRL_L shr 3) + SSTLW;<br />
SADRLW_R:=(CL_SADRL_R shr 3) + SSTLW;<br />
DADRLW_L:=(CL_DADRL_L shr 3) + DSTLW;<br />
DADRLW_R:=(CL_DADRL_R shr 3) + DSTLW;<br />
SBOS_L:=(CL_SADRL_L shl 2) mod 32;<br />
SBOS_R:=((CL_SADRL_R shl 2) mod 32) + 3;<br />
DBOS_L:=(CL_DADRL_L shl 2) mod 32;<br />
DBOS_R:=((CL_DADRL_R shl 2) mod 32) + 3;<br />
elsif R_PSIZE(1)=’1’ then -- 2 bit/pix<br />
SADRLW_L:=(CL_SADRL_L shr 4) + SSTLW;<br />
SADRLW_R:=(CL_SADRL_R shr 4) + SSTLW;<br />
DADRLW_L:=(CL_DADRL_L shr 4) + DSTLW;<br />
DADRLW_R:=(CL_DADRL_R shr 4) + DSTLW;<br />
SBOS_L:=(CL_SADRL_L shl 1) mod 32;<br />
SBOS_R:=((CL_SADRL_R shl 1) mod 32) + 1;<br />
DBOS_L:=(CL_DADRL_L shl 1) mod 32;<br />
DBOS_R:=((CL_DADRL_R shl 1) mod 32) + 1;<br />
else -- 1 bit/pix<br />
SADRLW_L:=(CL_SADRL_L shr 5) + SSTLW;<br />
SADRLW_R:=(CL_SADRL_R shr 5) + SSTLW;<br />
DADRLW_L:=(CL_DADRL_L shr 5) + DSTLW;<br />
DADRLW_R:=(CL_DADRL_R shr 5) + DSTLW;<br />
SBOS_L:=CL_SADRL_L mod 32;<br />
SBOS_R:=CL_SADRL_R mod 32;<br />
DBOS_L:=CL_DADRL_L mod 32;<br />
DBOS_R:=CL_DADRL_R mod 32;<br />
end if;<br />
Abbildung 112: Speedchart-Diagramm TIM/GR CPU/PIX TO BIT<br />
Anhang D.2<br />
Seite 142
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
REG_ALIAS<br />
entry<br />
S1<br />
T2<br />
T1<br />
A: SYADR :=R_SYADR; -- INT source addr. Y<br />
SXADR :=R_SXADR; -- INT source addr. X<br />
DYADR :=R_DYADR; -- INT dest. addr. Y<br />
DXADR :=R_DXADR; -- INT dest. addr. X<br />
SINC :=R_SINC; -- INT source increment<br />
DINC :=R_DINC; -- INT dest. increment<br />
SADR :=R_SSADR; -- INT source addr.<br />
DADR :=R_DSADR; -- INT dest. addr.<br />
WSTARTX :=R_WSTARTX; -- INT window start X<br />
WENDX :=R_WENDX; -- INT window end X<br />
WSTARTY :=R_WSTARTY; -- INT window start Y<br />
WENDY :=R_WENDY; -- INT window end Y<br />
DX :=R_DX; -- INT area width<br />
DY :=R_DY; -- INT area height<br />
SSTLW :=R_SSTLW; -- INT SSTART LW addr<br />
DSTLW :=R_DSTLW; -- INT DSTART LW addr<br />
-- Latching these signals is silly, they could<br />
-- be assigned in the asynchronous DP block,<br />
-- but it seems to be the only way of<br />
-- avoiding ASSERTION ERRORS using VHDL2000<br />
-- and of avoiding abortions of the Speedchart<br />
-- simulation.<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Abbildung 113: Speedchart-Diagramm TIM/REG ALIAS<br />
Subdiag Actions of <br />
A: -- aliases for register bits<br />
Anhang D.2<br />
Seite 143<br />
R_VEN :=R_CONFIG(31); -- video enable<br />
R_ILE :=R_CONFIG(30); -- interlaced enable<br />
R_RLE :=R_CONFIG(29); -- reload enable<br />
R_SRE :=R_CONFIG(28); -- split reload enable<br />
R_VCE :=R_CONFIG(27); -- video capture enable<br />
R_CSD :=R_CONFIG(26); -- composite sync direction<br />
R_HSD :=R_CONFIG(25); -- horizontal sync direction<br />
R_VSD :=R_CONFIG(24); -- vertical sync direction<br />
R_TEST :=R_CONFIG(23); -- test 16 bit counters<br />
CWAIT :=R_CONFIG(22); -- CAS delay 1/2 MClk<br />
SADJ :=R_CONFIG(21 downto 20); -- MSC adjust<br />
TADJ :=R_CONFIG(19 downto 18); -- MTR adjust<br />
LDADJ :=R_CONFIG(17 downto 16); -- LD adjust<br />
LOCK :=R_CONFIG(15); -- lock configuration<br />
R_RF :=R_CONFIG(14 downto 12); -- refresh rate<br />
R_SRL :=R_CONFIG(11 downto 10); -- shift register length<br />
MBW :=R_CONFIG(09 downto 08); -- memory bus width<br />
NUBUS :=R_CONFIG(07); -- NUBUS byte order<br />
FASTRDY :=R_CONFIG(06); -- fast handshake mode<br />
RMMX :=R_CONFIG(03); -- A1,A0 mapping (RCA13,12/1,0)<br />
RCAADJ :=R_CONFIG(02); -- RCA delay 1/2 MClk<br />
HBW :=R_CONFIG(01 downto 00); -- host bus width<br />
MO_D :=R_MUXOFF(13 downto 11); -- RAS address skew RAS(3)<br />
MO_C :=R_MUXOFF(10 downto 08); -- RAS address skew RAS(2)<br />
RTO :=R_MUXOFF(07 downto 06); -- RAS timeout<br />
MO_B :=R_MUXOFF(05 downto 03); -- RAS address skew RAS(1)<br />
MO_A :=R_MUXOFF(02 downto 00); -- RAS address skew RAS(0)<br />
ACS :=R_AUXREG(7 downto 4); -- AUX port/cs select<br />
AUX :=R_AUXREG(3 downto 0); -- AUX port data<br />
ASL :=R_RADSEL(6 downto 4); -- ACS address bits<br />
PEN :=R_RADSEL(3); -- page mode enable<br />
RSL :=R_RADSEL(2 downto 0); -- RAS bank select address bits<br />
BMS :=R_PATTNSIZE(4); -- bit map size<br />
PTS :=R_PATTNSIZE(1 downto 0); -- pattern size<br />
R_YZ :=R_XYZOOM(6 downto 4); -- zoom factor Y<br />
R_XZ :=R_XYZOOM(2 downto 0); -- zoom factor X<br />
PBV :=R_COMCTRL(6); -- PixBlt vertical direction<br />
PBH :=R_COMCTRL(5); -- PixBlt horizontal direction<br />
S :=R_COMCTRL(4 downto 0); -- PixBlt control bits<br />
R_SYADR :=R_SADR(31 downto 16); -- source address Y component<br />
R_SXADR :=R_SADR(15 downto 00); -- source address X component<br />
R_SSADR :=R_SADR(30 downto 00); -- source address 31 bit<br />
R_DYADR :=R_DADR(31 downto 16); -- dest. address Y component<br />
R_DXADR :=R_DADR(15 downto 00); -- dest. address X component<br />
R_DSADR :=R_DADR(30 downto 00); -- dest. address 31 bit<br />
R_SSTLW :=R_SSTART(31 downto 5); -- SSTART LW address<br />
R_DSTLW :=R_DSTART(31 downto 5); -- DSTART LW address
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
ASYNC_ACT<br />
Subdiag Actions of <br />
A: -- asynchronous delays<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
MSC_del0:=’1’ when SADJ="00" else ’0’;<br />
MSC_del2:=’1’ when SADJ="01" else ’0’;<br />
MSC_del4:=’1’ when SADJ="10" else ’0’;<br />
MSC_del8:=’1’ when SADJ="11" else ’0’;<br />
MTR_del0:=’1’ when TADJ="00" else ’0’;<br />
MTR_del2:=’1’ when TADJ="01" else ’0’;<br />
MTR_del4:=’1’ when TADJ="10" else ’0’;<br />
MTR_del8:=’1’ when TADJ="11" else ’0’;<br />
LD_del0 :=’1’ when LDADJ="00" else ’0’;<br />
LD_del2 :=’1’ when LDADJ="01" else ’0’;<br />
LD_del4 :=’1’ when LDADJ="10" else ’0’;<br />
LD_del8 :=’1’ when LDADJ="11" else ’0’;<br />
-- test outputs<br />
R_CONF_out :=R_CONFIG;<br />
R_4_out :=R_4;<br />
MBW_ot :=MBW;<br />
HBW_ot :=HBW;<br />
PATTN_ot :=PATTN;<br />
ADin_ot :=AD_in;<br />
ASin_ot :=AS_in;<br />
DSin_ot :=DS_in;<br />
BSin_ot :=BS_in;<br />
RSin_ot :=RS_in;<br />
HWEin_ot :=HWE_in;<br />
Rdyout_ot :=Rdy_out;<br />
-- RAM interface<br />
RCA_out :=RCA_ict;<br />
RAS_out :=RAS_ict;<br />
CAS_out :=CAS_ict;<br />
MD_out :=D_ict;<br />
MWE_out :=MWE_ict;<br />
MOE_out :=MOE_ict;<br />
MD_oe :=DOE_ict;<br />
ACS_out(3):=AUX(3) when ACS(3)=’1’ -- out port<br />
else ACS_ict(3); -- aux. CS<br />
ACS_out(2):=AUX(2) when ACS(2)=’1’ -- out port<br />
else ACS_ict(2); -- aux. CS<br />
ACS_out(1):=AUX(1) when ACS(1)=’1’ -- out port<br />
else ACS_ict(1); -- aux. CS<br />
ACS_out(0):=AUX(0) when ACS(0)=’1’ -- out port<br />
else ACS_ict(0); -- aux. CS<br />
Abbildung 114: Speedchart-Diagramm TIM/ASYNC ACT<br />
Anhang D.2<br />
Seite 144
Abbildung 115: Schreib- und Lesezugriffe (Host – Speicher) bei 32 Bit Speicherbusbreite<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/mclk_in /mclk_ina1<br />
a1<br />
/fifoin_ot<br />
/fifoin_othex<br />
/fifoout_ot<br />
/fifoout_othex<br />
VHDL 2000<br />
23456789 ffffffff 1bcdef01 ffffffff 23456789 ffffffff 77775680<br />
0 3 b 5<br />
4<br />
3<br />
3<br />
56785678 12345678<br />
3fff 0123 2115 3fff 0123 2116 3fff 2eee 15a0 3fff 2eee 15a0 3fff<br />
f e f e f 7 f 7 f<br />
f 0 f 3 f b f 5 f<br />
24680000 23456789 1bcdef01 23456789 00000000<br />
12345678<br />
2 3 4 5<br />
2 3 4 5<br />
23.6us 23.65us 23.7us 23.75us 23.8us 23.85us 23.9us 23.95us 24us 24.05us 24.1us 24.15us 24.2us 24.25us 24.3us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 145
Abbildung 116: Schreib- und Lesezugriffe (Host – Speicher) bei 32 Bit Speicherbusbreite im Fast Page Mode<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/mclk_in /mclk_ina1<br />
a1<br />
/fifoin_ot<br />
/fifoin_othex<br />
/fifoout_ot<br />
/fifoout_othex<br />
VHDL 2000<br />
23456789 ffffffff 1bcdef01 ffffffff 23456789 ffffffff 77775680<br />
0 3 b 5<br />
5<br />
3<br />
3<br />
12345678<br />
3fff 0123 2115 3fff 2116 3fff 2eee 15a0 3fff 15a0 3fff<br />
f e f 7<br />
f 0 f 3 f b f 5 f<br />
00000000 23456789 1bcdef01 23456789 00000000<br />
12345678<br />
5 6 7 0<br />
5 6 7 0<br />
26.4us 26.45us 26.5us 26.55us 26.6us 26.65us 26.7us 26.75us 26.8us 26.85us 26.9us 26.95us 27us 27.05us 27.1us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 146
Abbildung 117: Schreib- und Lesezugriffe (Host – Speicher) bei 8 Bit Speicherbusbreite<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/mclk_in /mclk_ina1<br />
a1<br />
/fifoin_ot<br />
/fifoin_othex<br />
/fifoout_ot<br />
/fifoout_othex<br />
VHDL 2000<br />
77775680<br />
0 3 b 5<br />
1<br />
3<br />
0<br />
12345678 78345678<br />
3fff 0454 0455 0456 0457 0458 0459 1681 1680 1682 3fff<br />
f e f e f e f e f e f e f 7 f 7 f 7 f<br />
f e f e f e f e f e f e f e f e f e f<br />
2468acf0 2468ac23 2468ac45 2468ac67 2468ac89 2468ac1b 2468accd 2468ac45 2468ac00<br />
12345678<br />
0 1 2 3<br />
0 1 2 3<br />
13.9us 14us 14.1us 14.2us 14.3us 14.4us 14.5us 14.6us 14.7us 14.8us 14.9us 15us 15.1us 15.2us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 147
Abbildung 118: Schreib- und Lesezugriffe (Host – Speicher) bei 8 Bit Speicherbusbreite im Fast Page Mode<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/mclk_in /mclk_ina1<br />
a1<br />
/fifoin_ot<br />
/fifoin_othex<br />
/fifoout_ot<br />
/fifoout_othex<br />
VHDL 2000<br />
ffffffff 77775680<br />
0 3 b 5<br />
2<br />
3<br />
0<br />
78347878<br />
3fff 0123 0454 0455 0456 0457 0458 0459 2eee 1681 1680 1682 3fff<br />
f e f 7<br />
f e f e f e f e f e f e f e f e f e f<br />
2468ac00 2468accd 2468ac45 2468ac00<br />
12345678<br />
3 4 5 6<br />
3 4 5 6<br />
17.2us 17.3us 17.4us 17.5us 17.6us 17.7us 17.8us 17.9us 18us 18.1us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 148
Abbildung 119: Speicherzugriffe beim PixBlT-Befehl, 3 Zeilen zu 104 Pixeln à 1 Bit, ” Ziel=Quelle“, PBH=PBV=’0’<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/any_cycle_ot<br />
/any_cycle_ota0<br />
a0<br />
/mem_gread_ot<br />
/mem_gread_ota0<br />
a0<br />
/gpu_rnum_ot<br />
/gpu_rnum_othex<br />
/mem_gwrite_ot<br />
/mem_gwrite_ota0<br />
a0<br />
/gpu_wnum_ot<br />
/gpu_wnum_othex<br />
/pre_read_ot<br />
/pre_read_ota0<br />
a0<br />
/cas_mask_ot<br />
/cas_mask_othex<br />
/pre_mask_ot<br />
/pre_mask_othex<br />
/mclk_in /mclk_ina1<br />
a1<br />
VHDL 2000<br />
f<br />
3<br />
3<br />
ffffffff<br />
e<br />
00000000 12345678<br />
3fff 0249 024c 0259 0269 026c 3fff<br />
f e f e f e f e f e f e<br />
f c 0 0 0 f 0 0 0 3 f c 0 0 0 f 8 0 0 1 f e 0 0 0 7 f c 0 0 0 f<br />
00000000 45645678 00000000 00000000 23456780<br />
12345678<br />
0 9 8 7 6 f 9 8 7 6 f 9 8 7 6 5 f<br />
0 8 7 6 5 f 8 7 6 5 f 8 7 6 5 f<br />
0 c f f f f 0 f 0 f f f 3 c f f f f 8 f 8 f f f 1 e f f f f f c f c f f f 0<br />
ffffffff fffc0000 fffffc00 fffffffc<br />
1.6us 1.8us 2us 2.2us 2.4us 2.6us 2.8us 3us 3.2us 3.4us 3.6us 3.8us 4us 4.2us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 149
Abbildung 120: Speicherzugriffe beim PixBlT-Befehl, 3 Zeilen zu 104 Pixeln à 1 Bit, Ziel=Quelle“, PBH=PBV=’0’,<br />
”<br />
Ausschnitt: erste Zeile gemäß Abbildung 34 (S. 50)<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/any_cycle_ot<br />
/any_cycle_ota0<br />
a0<br />
/mem_gread_ot<br />
/mem_gread_ota0<br />
a0<br />
/gpu_rnum_ot<br />
/gpu_rnum_othex<br />
/mem_gwrite_ot<br />
/mem_gwrite_ota0<br />
a0<br />
/gpu_wnum_ot<br />
/gpu_wnum_othex<br />
/pre_read_ot<br />
/pre_read_ota0<br />
a0<br />
/cas_mask_ot<br />
/cas_mask_othex<br />
/pre_mask_ot<br />
/pre_mask_othex<br />
/mclk_in /mclk_ina1<br />
a1<br />
VHDL 2000<br />
00000032 ffffffff<br />
0 e<br />
00000000 12345678<br />
f<br />
3<br />
3<br />
3fff 0004 00c3 00c4 00c5 00c6 3fff 0008 0249 024a 024b 024c 3fff<br />
f e f e f<br />
f c f 0 f 0 f 0 f 0 f 0 f 0 f 3 f<br />
ffffffff 00000000 11678123 45678123 45645678<br />
12345678<br />
0 9 8 7 6 f 9<br />
0 8 7 6 5 f<br />
0 c f 0 f 0 f 0 f 0 f 0 f 0 f 3 f 3 c<br />
ffffffff 03ffffff ffffffff fffc0000<br />
1.6us 1.7us 1.8us 1.9us 2us 2.1us 2.2us 2.3us 2.4us 2.5us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 150
Abbildung 121: Speicherzugriffe beim PixBlT-Befehl,<br />
2 Zeilen zu 13 Pixeln à 32 Bit, Ziel=Quelle + Ziel“, PBH=PBV=’1’<br />
”<br />
Ausschnitt: Kopiervorgang bei der ersten Zeile<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/any_cycle_ot<br />
/any_cycle_ota0<br />
a0<br />
/mem_gread_ot<br />
/mem_gread_ota0<br />
a0<br />
/gpu_rnum_ot<br />
/gpu_rnum_othex<br />
/mem_gwrite_ot<br />
/mem_gwrite_ota0<br />
a0<br />
/gpu_wnum_ot<br />
/gpu_wnum_othex<br />
/pre_read_ot<br />
/pre_read_ota0<br />
a0<br />
/cas_mask_ot<br />
/cas_mask_othex<br />
/pre_mask_ot<br />
/pre_mask_othex<br />
/mclk_in /mclk_ina1<br />
a1<br />
VHDL 2000<br />
0<br />
3<br />
3<br />
ffffffff<br />
c<br />
12345678<br />
3fff 0b3a 0b39 0b38 0b37 0b36 0b35 0b34 0b33 0b32 0b31 0b30 0b2f 0b2e<br />
e e e e f e<br />
f 0 0 0 0 0 0 f 0 0 0 0 0 0 0 0 f 0 0 0 0 f 0 0 0 0 0 f<br />
00000000 2468acf0 00000000 2468acf0<br />
12345678<br />
f 8 7 6 5 4 3 2 1 0 8 7 6 5 4 f 8<br />
f 8 7 6 5 4 3 2 1 0 8 7 6 5 4 f<br />
0 f f f f f f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 0 f f f 0 0 0 0 0 0<br />
fffffffc ffffffff<br />
6.2us 6.4us 6.6us 6.8us 7us 7.2us 7.4us 7.6us 7.8us 8us 8.2us 8.4us 8.6us 8.8us 9us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 151
Ausschnitt: Lese- und RMW-Sequenz am Ende der ersten Zeile<br />
Abbildung 122: Speicherzugriffe beim PixBlT-Befehl,<br />
2 Zeilen zu 13 Pixeln à 32 Bit, ” Ziel=Quelle + Ziel“, PBH=PBV=’1’<br />
0s<br />
0s<br />
/pattn_ot<br />
/pattn_othex<br />
/hbw_ot /hbw_othex<br />
/mbw_ot /mbw_othex<br />
/adin_ot /adin_othex<br />
/bsin_ot /bsin_othex<br />
/rsin_ot /rsin_ota0<br />
a0<br />
/hwein_ot<br />
/hwein_ota1<br />
a1<br />
/asin_ot /asin_ota1<br />
a1<br />
/dsin_ot /dsin_ota1<br />
a1<br />
/rdyout_ot<br />
/rdyout_ota1<br />
a1<br />
/ad_oe(0) a0 a0<br />
/ad_out /ad_outhex<br />
/rca_out /rca_outhex<br />
/ras_out /ras_outhex<br />
/cas_out /cas_outhex<br />
/mwe_out /mwe_outa1<br />
a1<br />
/moe_out /moe_outa1<br />
a1<br />
/md_oe(0) a0 a0<br />
/md_out /md_outhex<br />
/md_in /md_inhex<br />
/any_cycle_ot<br />
/any_cycle_ota0<br />
a0<br />
/mem_gread_ot<br />
/mem_gread_ota0<br />
a0<br />
/gpu_rnum_ot<br />
/gpu_rnum_othex<br />
/mem_gwrite_ot<br />
/mem_gwrite_ota0<br />
a0<br />
/gpu_wnum_ot<br />
/gpu_wnum_othex<br />
/pre_read_ot<br />
/pre_read_ota0<br />
a0<br />
/cas_mask_ot<br />
/cas_mask_othex<br />
/pre_mask_ot<br />
/pre_mask_othex<br />
/mclk_in /mclk_ina1<br />
a1<br />
VHDL 2000<br />
0<br />
3<br />
3<br />
ffffffff<br />
c<br />
12345678<br />
197a 1979 1978 1977 1976 0b32 0b31 0b30 0b2f 0b2e 3fff<br />
e f e f e f<br />
0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f<br />
2468acf0 00000000 2468acf0<br />
12345678<br />
0 8 7 6 5 4 f 8<br />
0 8 7 6 5 4 f<br />
0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0 f 0<br />
ffffffff<br />
8us 8.1us 8.2us 8.3us 8.4us 8.5us 8.6us 8.7us 8.8us 8.9us 9us 9.1us<br />
Technische Universität <strong>Berlin</strong><br />
Institut für <strong>Mikroelektronik</strong><br />
Lukas Bauer<br />
Diplomarbeit<br />
Hochleistungs-Grafikprozessor in Speedchart-VHDL<br />
Anhang D.3<br />
Seite 152