Wo soll ich anfangen, wenn ich überlege, eine GPU zu bauen?

8

Ich habe dieses Video neulich gesehen und darüber nachgedacht, wie ich so etwas wie die GPU entwerfen soll. Wo würdest du anfangen? Ich bin eher daran interessiert zu lesen, wie sie funktionieren, und (noch) keine aus TTL zu machen.

Ich weiß, dass dies wie eine Frage klingt, wie man eine Programmiersprache erstellt, aber alle Ausgangspunkte wären gut, da ich keine Ahnung habe, wo ich anfangen soll.

Dean
quelle
3
Interessieren Sie sich für "Hochgeschwindigkeits-3D-Grafik" oder "Fahren einer CRT / LCD"
Toby Jaffey
@Joby atm zeigt nur etwas auf einem Display an. Ein Farbquadrat wäre schön.
Dean
3
Kann mir jemand erklären, warum ich eine Abwertung bekommen habe? So kann ich alle Probleme mit der Frage lösen.
Dean
1
Die Schwierigkeit, die ich bei dieser Frage sehe, besteht darin, dass es eine Menge Gründe gibt, nur eine monochrome 80x25-Zeichenanzeige zu erzeugen, was früher als Videoanzeigegenerator bezeichnet wurde, und was mit "GPU" gemeint ist. Der Hinweis, dass Sie aus TTL eine machen möchten, bringt Sie dem alten Ende des 80x25-Displaygenerators viel näher.
JustJeff
@ JustJeff, Ok, ich wusste nicht, wie sie sonst genannt wurden. Warum sind sie dann so unterschiedlich, wenn sie einen ähnlichen Job machen?
Dean

Antworten:

16

Das ist so, als würden Sie zu Ihrer Collage-Abschlussprüfung für den naturwissenschaftlichen Unterricht gehen und dies als Ihre Frage haben: Beschreiben Sie das Universum. Seien Sie kurz und doch prägnant. Es gibt keine Möglichkeit, diese Frage auf praktische Weise zu beantworten - daher beantworte ich eine andere Frage.

Was muss ich wissen, bevor ich versuche, eine GPU zu entwerfen?

In einer groben chronologischen Reihenfolge sind sie:

  1. Entweder VHDL oder Verilog.
  2. FPGAs (nützlicher Bereich zum Schreiben digitaler Logik).
  3. Grundlegende Datenpfade wie FIFOs.
  4. Busschnittstellen wie PCIe- und DDR2 / 3-Schnittstellen
  5. Binäre Implementierungen von mathematischen Funktionen, einschließlich Gleitkomma usw.
  6. CPU-Design.
  7. Standards für Videoschnittstellen.
  8. Analoges Hochgeschwindigkeitsmaterial (die analoge Seite von digitalem Hochgeschwindigkeitsmaterial)
  9. PLLs und andere semi-fortgeschrittene Clocking-Sachen.
  10. PCB-Design von Hochgeschwindigkeitsschaltungen.
  11. Design des Niederspannungs- und Hochstrom-DC / DC-Wandlers.
  12. Viele, viele Software-Sachen.
  13. Und schließlich ASIC oder ein anderes kundenspezifisches Chip-Design.

Ich werde auch sagen, dass Sie so etwas nicht aus TTL-Logik-Chips machen werden. Ich bezweifle, dass Sie eine vernünftige DDR2 / 3-Speicherschnittstelle erhalten könnten, die mit normalen TTL-Chips funktioniert. Die Verwendung eines großen FPGA wäre viel einfacher (aber nicht einfach).

Wenn Sie mit Schritt 6 fortfahren, ist dies wahrscheinlich "gut genug, um Ihren intellektuellen Durst zu stillen". Dies könnte auch innerhalb eines angemessenen Zeitraums - etwa eines Jahres - geschehen, um ein kurzfristiges Ziel festzulegen.

BEARBEITEN: Wenn Sie nur ein Videosignal ausspucken möchten, ist dies relativ einfach. Es handelt sich im Wesentlichen um einen Speicherblock, der mit 60 Hz auf eine Anzeige verschoben wird. Der Teufel steckt im Detail, aber hier ist eine grobe Beschreibung, wie das geht:

Beginnen Sie mit einem Dual-Port-RAM. Es muss kein echter Dual-Port-RAM sein, sondern nur etwas RAM, das eine CPU lesen / schreiben kann und das Ihre Video-Schaltung lesen kann. Die Größe und Geschwindigkeit dieses RAM hängt davon ab, welche Art von Anzeige Sie steuern. Ich persönlich würde DDR2 SDRAM verwenden, das an die Speicherschnittstelle eines Xilinx Spartan-6 FPGA angeschlossen ist. Ihr "Memory Interface Generator" -Kern (MIG) macht es einfach, daraus einen Dual-Port-RAM zu machen.

Entwerfen Sie als Nächstes eine Schaltung, die steuert, wie dieser RAM gelesen wird, und spucken Sie diese Daten über einen einfachen Bus aus. Normalerweise lesen Sie den RAM nur nacheinander. Der "einfache Bus" ist wirklich genau das. Es sind einige Bits mit dem Pixelwert - und das war's. Diese Schaltung muss zwei weitere Dinge tun: Sie muss bei jedem Videobild zum Anfang des RAM zurückkehren und die Ausgabe während der horizontalen / vertikalen Rücklaufperioden "pausieren".

Drittens: Erstellen Sie eine Schaltung, die die Videosteuerungssignale (HSync, Vsync usw.) ausgibt, und teilen Sie der vorherigen Schaltung mit, wann sie angehalten und neu gestartet werden soll. Diese Schaltungen sind eigentlich ziemlich einfach zu machen. Es ist schwieriger, den geeigneten Videostandard zu finden.

Und zum Schluss: Verbinden Sie die Steuersignale und den Videopixel-Datenbus mit "etwas". Das könnte ein kleines Farb-LCD sein. Es könnte sich um einen Video-DAC zur Ausgabe eines VGA-kompatiblen Signals handeln. Es gibt NTSC / PAL-Encoder, die diese Signale aufnehmen würden. Usw.

Wenn die Auflösung sehr gering ist, können Sie möglicherweise den internen RAM des FPGA anstelle eines externen DDR2-SDRAM verwenden. Ich sollte Sie warnen, dass Sie, wenn DDR2 SDRAM verwendet wird, wahrscheinlich ein FIFO und einige andere Dinge benötigen - aber auch das ist nicht besonders schwierig. Mit DDR2 SDRAM können Sie jedoch Displays mit relativ hoher Auflösung unterstützen. Sie können auch FPGA-Entwicklungskarten mit integrierten VGA-DACs und anderen Formen von Videoausgängen finden.


quelle
Wow dann keine kurze Aufgabe. Ich verstehe, dass es keine präzise Antwort gab. Aber Sie haben mir einen guten Ausgangspunkt gegeben, und ich werde dies in meiner sehr begrenzten Freizeit tun müssen. Sollte aber eine interessante Erfahrung sein.
Dean
@ Dean Hmmm ... Hier gibt es DREI verschiedene Dinge: CPUs, GPUs und etwas, um ein Videosignal auszuspucken. Es ist einfach, etwas zu machen, um ein Videosignal auszuspucken. Eine GPU ähnelt eher einer CPU, die für die Verarbeitung von Videos / Grafiken ausgelegt ist: 3D-Grafik, 2D-Grafikbeschleunigung usw. Wenn Sie nur möchten, dass etwas ein Videosignal ausspuckt, sind Sie bereit. Wenn Sie 3D-Grafiken oder sogar fortgeschrittene 2D-Grafiken wünschen, müssen Sie meine Liste durchgehen.
1
Wie ist es einfach, ein Videosignal auszuspucken? Ich denke, das wäre ein besserer erster Schritt.
Dean
@ Dean Ich habe meine Antwort so bearbeitet, dass sie Informationen zum Ausspucken eines Videosignals enthält.
1
Ich habe einmal ein Buch über Computergrafik geschrieben (ISBN 0-471-13040-0), aber es ist sehr einleitend. In den 1990er Jahren, als ATI nur ihre MACH64-Chips hatte und in 3D einsteigen wollte, beauftragten sie mich als Berater, ihnen einige der Konzepte beizubringen, sie in Gang zu bringen und bei der Architektur zu helfen. Das Ergebnis waren die ersten RAGE-Chips. Ich war damals ein Grafiker. Überprüfen Sie das US-Patent 5097427, wenn Sie mir nicht glauben. Ich denke jedoch, dass das Patent für quadratische Interpolation (US 5109481) wichtiger, aber weniger auffällig war. Sie könnten einige andere Namen auf diesen erkennen ;-)
Olin Lathrop
8

Racing the Beam ist ein detaillierter Blick auf das Design und den Betrieb des Atari VCS. Der Television Interface Adapter wird gründlich behandelt .

Bei der TIA geht es um die einfachste, praktischste GPU.

Das Verstehen eines kleinen, aber vollständigen Arbeitssystems kann ein guter Weg sein, um ein neues Fach zu lernen.

Komplette Schaltpläne sowie ein technisches Handbuch sind verfügbar .

Toby Jaffey
quelle
Atari 2600 Regeln! Die meisten Spielesysteme verwenden Hardware, um das Display zu generieren, aber der 2600 erledigt alles auf magische Weise. Vergleichen Sie etwas wie Combat oder sogar Asteroids mit etwas wie Toyshop Trouble (Asteroids und Toyshop Trouble sind beide 8K). Combat zeigt zwei einfarbige Objekte mit einer Auflösung von 2 Zeilen. Toyshop Trouble zeigt 16 Objekte mit einzeiliger Auflösung und pro Zeile Farbe (und ohne Flimmern). Keine zusätzliche Hardware für Toyshop Trouble außer einem Bank-Switcher, um 8 KB Code zuzulassen. Nur eine clevere Codierung und etwas Magie.
Supercat
Übrigens mag die 2600-Programmierung dunkel sein, aber ein PSOC-basiertes Video-Overlay-Design, das ich für einen Kunden gemacht habe, fühlte sich eher 2600-artig an. Konfigurieren Sie die On-Chip-Hardware so, dass einige der Timings generiert werden, und verwenden Sie Code, um Daten an einen SPI-Slave weiterzuleiten, damit diese als Pixel getaktet werden können.
Supercat
Unglaublich, dass der gesamte
Spielcode
5

Wenn Sie nur ein paar Dinge auf den Bildschirm bringen möchten und glauben, dass Ihnen die Verkabelung wirklich, wirklich Spaß macht, könnten Sie ein Grafiksystem für Charaktere aus den frühen 1980er Jahren anstreben. Wenn Sie das Timing für RS-170A einstellen können, können Sie das Signal möglicherweise sogar in einen Ersatz-AV-Eingang eines 50-Zoll-Plasmafernsehers übertragen und in großem Stil retro gehen.

Einige frühe Systeme verwendeten ihre 8-Bit-CPUs, um die Anzeige direkt zu generieren, beispielsweise der 6507 im Atari 2600 und der Z-80 im Timex Sinclair ZX-81. Mit modernen Mikrocontrollern können Sie sogar das Gleiche tun. Der Vorteil auf diese Weise ist, dass die Hardware einfach ist, die Software jedoch im Allgemeinen im Assembler sein muss und sehr genau ist, und die Ergebnisse werden wirklich überwältigend sein. Wahrscheinlich verwendete der 2600 zusätzliche Hardware, aber der TIA hatte nicht viel FIFO, und der 6502 (nun ja, 6507, wirklich) musste in Echtzeit Bytes darauf ablegen. Bei diesem Ansatz gibt es keinen Standardvideomodus. Jede Anwendung, die Video verwendet, muss eng mit den Anforderungen kombiniert werden, die Pixel fließen zu lassen.

Wenn Sie wirklich etwas aus TTL erstellen möchten, besteht die nächste Komplexitätsstufe darin, eine auf Zeichen-ROM basierende Textanzeige zu wählen. Auf diese Weise können Sie beispielsweise 256 Zeichen in beispielsweise 40 Spalten und 25 Zeilenpositionen einfügen. Es gibt verschiedene Möglichkeiten, dies zu tun.

Ein Weg - mach was das TRS80 Modell ich gemacht habe. Eine Gruppe von 74161 Zählern mit einer Auswahl von Gates erzeugte die Videoadresse; Drei 74157 haben 12 Bits der CPU-Adresse mit der Videoadresse gemultiplext, um eine Adresse einem statischen 2K-RAM zuzuführen. RAM-Daten wurden zurück in die CPU gepuffert, aber ungepuffert als Adresse in den Zeichensatz-ROM eingespeist. Es gab keine Busschiedsgerichtsbarkeit; Wenn die CPU Video-RAM wollte, wurde das Videosystem betreten, was zu dem "Schnee" -Effekt führte. Die gemuxte Videoadresse wurde mit einigen Zeilen aus dem Zählerabschnitt kombiniert, um die niedrigen Adressen abzurunden. Die Zeichen-ROM-Ausgabe wurde in ein 74166-Schieberegister ausgegeben. Das Ganze lief von einem 14,31818-MHz-Kristall ab. Bei diesem Ansatz wäre genau ein Videomodus vollständig in Hardware implementiert, z. B. 40 x 25 oder 64 x 16 usw.

Ein anderer Weg - graben Sie einen sogenannten CRTC-Chip wie einen 6845 aus. Diese kombinierten den größten Teil der Zähler- und Klebelogik und versorgten den Prozessor mit einer Steuerregister-Schnittstelle, sodass Sie einen Teil des Timings neu programmieren konnten. Systeme wie dieses könnten etwas flexibler gestaltet werden, z. B. könnten Sie 40x25 und 80x25 aus derselben Hardware unter Registersteuerung erhalten. Wenn Sie sich mit den Taktfrequenzen vertraut machen, können Sie Ihrer CPU möglicherweise während der einen Hälfte des Takts freien Zugriff auf den Video-RAM und während der anderen Hälfte des Takts auf den Zugriff auf den Video-Adressgenerator gewähren, wodurch die Notwendigkeit einer Bus-Arbitrierung entfällt und Beseitigung des Schneeeffekts.

Wenn Sie sich jedoch für echte Grafikmodi entscheiden möchten, werden Sie schnell feststellen, dass das Rollen Ihrer eigenen problematisch ist. Das ursprüngliche Apple 2 hat es geschafft, aber dieses System hatte ungefähr 110 MSI TTL-Chips, und trotzdem gab es einige lustige Dinge zu erledigen, wie die nichtlineare Zuordnung des Videopuffers zum Display und extrem begrenzte Farbpaletten , um zwei zu nennen. Und Woz hat allgemein eine Ahnung. Als die '2e' auf den Markt kam, steckte Apple das Videosystem bereits in einen benutzerdefinierten Chip. Ungefähr zur gleichen Zeit verdankte der C-64 seine Grafikfähigkeiten kundenspezifischen Chips.

Also ... ich würde dort zwei Möglichkeiten nennen, dies zu tun. Ein Weg - holen Sie Ihren Eimer mit altem TTL heraus und streben Sie nach einer einfarbigen 80x25-Textanzeige. Umgekehrt: Besorgen Sie sich ein gutes FPGA-Evaluierungsboard, erledigen Sie das Ganze in VHDL und beginnen Sie mit einer 80x25-Textanzeige.

JustJeff
quelle
1

Sie müssen mit einigen Grundlagen der Computerarchitektur beginnen und parallel mit dem grundlegenden ASIC-Design unter Verwendung von VHDL oder einer anderen Beschreibungssprache beginnen.

Sobald Sie die Grundlagen der Computerarchitektur erlernt haben, würde ich empfehlen, sich mit Computergrafik zu beschäftigen, vielleicht mit einigen einfachen OpenGL-Projekten. Das Hauptproblem wäre hier, sich ein Bild von der Rendering-Architektur der Grafik-Pipeline zu machen .

Der nächste Schritt wäre die Überlegung, wie diese Rendering-Pipeline mit dedizierter Hardware und nicht mit Software ausgeführt werden könnte.

In Bezug auf den tatsächlichen Aufbau einer GPU und den Anschluss an Ihren Computer denke ich nicht, dass dies mit dem Budget eines Enthusiasten möglich ist, aber vielleicht gibt es etwas sehr Grundlegendes, das Sie mit einer eingebetteten ARM-Linux-Plattform ausprobieren können (welche legt einen Systembus frei) und ein FPGA (in diesem Fall ist das FPGA Ihre in VHDL geschriebene GPU), die als Bindegliedprojekt auf ein VGA-Display mit niedriger Auflösung ausgegeben werden. Dies würde auch das Schreiben von Treibern erfordern. Wenn Sie es schaffen, wäre es ein Killer in einem Lebenslauf.

Jon L.
quelle
1

Schauen Sie sich die allgemeinen Blockdiagramme der GPUs von AMD und NVidia an. Sie werden wahrscheinlich eine Menge Informationen von den Opengraphics-Leuten finden, die Open-Source-Grafikhardware mit Open-Source-Treibern entwerfen.

Dann müssen Sie sich ansehen, was Sie wollen.

  • Ausgang, HDMI, DVI oder VGA?
  • Scheitelpunkttransformationen?
  • Texturierung?
  • Pixelschattierung?
  • Triangle Clipping und Rasterisierung?
  • Irgendeine Texturierung?
  • Rasteroperationen?

Wenn Sie noch keine Programmierung mit GPU-Funktionen durchgeführt haben, ist dies möglicherweise auch eine gute Sache.

Ich denke, Leon hat es auch geschafft. Ich würde Verilog verwenden, wenn ich das tun würde.

Wenn Sie nur Compsite-Videos möchten, wie in dem von Ihnen geposteten Video. Es gibt viele Beispiele da draußen. Schauen Sie sich Woz 'Implementierung des Apple II an. :) :)

Joe
quelle
1
Hat @Leon einen Kommentar hinterlassen? Wenn ja, kann ich es nicht sehen.
Dean
Ich habe es gelöscht. Ich schlug vor, ein FPGA zu verwenden, um eine einfache CPU zu implementieren. Ich habe es vor einigen Jahren mit einem Design aus einem in VHDL geschriebenen Buch gemacht, das ich für meine Hardware modifiziert habe.
Leon Heller
Ahh ok dann kann ich es deshalb sehen.
Dean
1

Klingt so, als würden Sie nicht so sehr nach einer GPU (im Sinne von 3D und Schattierung) als nach einem Videogenerator suchen. Viele FPGA-Evaluierungskarten verfügen über einen Anschluss für einen VGA- oder einen anderen Monitortyp und über Beispielprojekte des Herstellers oder anderer Benutzer zur Anzeige von Dingen auf diesem Monitor. Es gibt auch einige Boards mit eingebauten LCDs, aber sie sind in der Regel in der Klasse ab 300 US-Dollar, während die grundlegenden Boards, die einen Standardmonitor betreiben können, zwischen 60 und 120 US-Dollar kosten.

Die meisten FGPAs haben nicht genug internen Speicher, um mehr als eine kleine Anzeige zu machen, aber dann haben viele der Karten externe Speicher mit mehr Kapazität. Viele von ihnen steuern analoge VGA-Monitore digital, dh RG und B sind entweder voll ein oder voll aus, obwohl einige Ihnen zwei Ebenen bieten und Sie wahrscheinlich eine mit einem Video-DAC oder einem Anschluss für eine digitale Monitorschnittstelle finden.

Chris Stratton
quelle