21.07.2013 Aufrufe

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

DIPLOMARBEIT - FG Mikroelektronik, TU Berlin

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!