Gibt es ein FPGA-basiertes Vektorgrafikkarten-Projekt?

Ich habe als mein neuestes Interesse mit VGA-Projekten herumgespielt. Ich habe ein Xilinx Spartan 3E 250K FPGA, das gerade knapp zu wenig RAM für einen vollen 640x480 Framebuffer hat. Also versuche ich, die Dinge "interessanter" zu machen. Nämlich, indem man sich stattdessen für einen Vektoransatz anstelle von Bitmap entscheidet. Es ist jedoch ein bisschen verwirrend, wie man es macht. Gibt es bekannte und quelloffene vektorbasierte VGA-Grafikkarten?

Ich werde dies in keinem "Produktions" -Szenario verwenden, daher ist es mir egal, ob es nur mit 1 fps oder so effektiv gerendert werden kann. Ich schaue mir gerade eine interessante Projektidee an.

Wenn Sie sie nicht kennen, sind fpgaarcade.com und opencores.org beide einen Blick wert, um nach Ideen zu suchen. Ich denke, Sie müssen sich für den zweiten anmelden, aber sie versenden keinen Spam oder ähnliches.

Antworten (1)

Bitte, bitte, bitte nimm das, was ich jetzt sagen werde, nicht persönlich. Ich denke, Ihre Frage ist eine, über die sich wahrscheinlich viele Leute schon einmal gewundert haben. Ich habe die Frage sogar positiv bewertet. Leider ist die Antwort "das geht so nicht". Und es gibt keine gute Möglichkeit, Ihre Frage zu beantworten, ohne dass Sie sich vielleicht schlecht fühlen, weil Sie sie gestellt haben - was schade ist, weil ich denke, dass die Antwort nützliche Informationen enthält. Also, ertragen Sie es mit mir und verstehen Sie, dass meine Motivation darin besteht, zu erklären, wie dieses Zeug funktioniert, und nicht, dass Sie sich schlecht fühlen.

Moderne Displays (Fernseher, LCDs, Plasma, die meisten CRTs) sind rasterbasierte Geräte. Das heißt, sie zeichnen den Bildschirm jeweils um eine Scanzeile neu. Die zur Kommunikation mit diesen Displays verwendeten Videoschnittstellen basieren auf einer Rasterschnittstelle. NTSC, VGA, HDMI usw. sind alle Rasteranzeigetechnologien.

Vor Jahren, hauptsächlich in den 70er und frühen 80er Jahren, gab es einige echte Vektoranzeigen. Anstatt die Dinge eine Scanlinie nach der anderen zu zeichnen, zeichneten sie tatsächlich die Form der Objekte nach. Die besten Beispiele dafür sind analoge O-Scopes und die Arcade-Spiele Asteroids und Battlezone. Es wurden nur sehr wenige Farbvektordisplays verwendet, und das beste Beispiel dafür ist das Arcade-Spiel Tempest. Eine andere Form der Vektoranzeige sind die Systeme, die für Laserlichtshows verwendet werden.

Die elektrische Schnittstelle zu einer Vektoranzeige hat Signale für die X- und Y-Position des Strahls, die Intensität und manchmal die Farbe. Dies unterscheidet sich stark von der Schnittstelle für eine Rasteranzeige.

Ältere CRT-Technologien könnten entweder für Vektor- oder Rasteranzeigen verwendet werden, aber LCDs, Plasmabildschirme, OLEDs usw. sind alle grundsätzlich rasterbasiert und können nicht einfach in einem Vektormodus verwendet werden.

Das Problem bei Ihrer Frage ist, dass Sie nach einer "vektorbasierten VGA-Grafikkarte" fragen. "Vector Based" geht nicht mit VGA. VGA ist ein rasterbasierter Anzeigestandard und eine rasterbasierte Schnittstelle, während Vektor dies nicht ist. Sie können die beiden nicht mischen, da es sich um unterschiedliche Systeme handelt.

Es ist möglich, eine Vektorgrafikkarte basierend auf einem FPGA zu erstellen, aber Sie können sie nicht an einen VGA-Monitor anschließen, ohne eine Vektor-zu-Raster-Konvertierung im FPGA durchzuführen - und das erfordert genauso viel RAM oder mehr als ein Standardraster Grafikkarte. Sie könnten eine Vektoranzeige erhalten, aber diese sind mit dem Untergang der CRT so gut wie verschwunden.

Der einfachste Weg, heutzutage eine Vektoranzeige zu erhalten, ist ein O-Scope mit X/Y-Modus. Tatsächlich gibt es viele Projekte im Internet, die ein altes O-Scope mit CRT-Röhre als Display für etwas verwenden. Hier ist ein Projekt, das eine verwendet, um eine Uhr zu machen . Und hier ist noch einer . Es gibt Dutzende anderer ähnlicher Projekte im Internet.

Diese Projekte sind zwar interessant, aber kaum mehr als Neuheiten. Sie sind coole Neuheiten, aber eben Neuheiten. Und keine davon kommt an die Darstellungsqualität einer normalen VGA-Karte heran.

Eine alternative Lösung besteht darin, einfach ein FPGA mit etwas externem RAM zu erhalten. Es gibt viele Möglichkeiten, dies zu tun, aber der einfachste und schmerzloseste Weg ist die Verwendung eines Xilinx Spartan-6-basierten Boards mit externem DDR2-SDRAM. Es gibt mehrere FPGA-Entwicklungsplatinen auf dem Markt, die mit diesen beiden Chips funktionieren. Einige von ihnen verfügen sogar über VGA-Schnittstellen.

Ich würde kein externes SRAM verwenden. SRAM, insbesondere Async-SRAM, wird auch langsam in der Schnittstelle sein und die Speichergröße wird begrenzt sein. Es ist nicht unmöglich, SRAM zu verwenden, aber es ist nicht einfacher, SRAM als DDR2-SDRAM auf einem Spartan-6 zu verwenden.

Ich würde auch keinen Spartan-3 verwenden. Die DDR-SDRAM-Schnittstelle des S3 ist nicht sehr gut und es ist schwierig, das Signal-Timing zuverlässig zum Laufen zu bringen. Der Spartan-6 hat ein „hartes Makro“ für die DDR2-Schnittstelle, was das Ganze deutlich vereinfacht. Der S6 hat auch mehr internen RAM für Puffer, FIFOs usw. Xilinx hat einen netten "Memory Interface Generator"-Kern, der das Verbinden mehrerer verschiedener Logikblöcke mit dem DDR2-SDRAM viel einfacher macht (auch mit mehreren Lese-/Schreibports).

Was einen Open-Source-Vektorgrafik-Kern betrifft - ich kenne keinen. Das heißt nicht, dass es keinen gibt, nur dass ich noch keinen gesehen habe. Aber ich bezweifle auch, dass Sie einen sehen werden, der sehr gut ist. Es gibt einfach nicht so viel Bedarf, da die Displays etwas selten und begrenzt sind. Wenn Sie eine finden, ist sie wahrscheinlich ziemlich spezialisiert (sie zeigt nur eine Uhr an).

Holen Sie sich ein FPGA-Board mit einem Spartan-6, DDR2-SDRAM und einem VGA-Port und Sie werden viel glücklicher sein.

War Tempest nicht ein Schwarz-Weiß-Display mit einem durchscheinenden Aufkleber auf dem Bildschirm, damit es mehrfarbig aussieht?
@ThePhoton Nein. Es gab einige Versionen von Battlezone wie dieser, aber nicht Tempest. Wenn Sie sich Bilder von Tempest ansehen, werden Sie sehen, dass sich auf dem Bildschirm mehrfarbige „Feinde“ auf eine Weise bewegten, die mit einem festen durchscheinenden Aufkleber möglicherweise nicht funktionieren würde.
Einige Anmerkungen: 1. Spartan 3 ist genau das, was ich zur Hand habe. Ich werde eine Weile nicht upgraden. 2. Ich habe kein SDRAM, also bin ich auf BRAMs beschränkt :( 3. Mein Punkt in Bezug auf eine "Vektor" -Anzeige ist, sozusagen direkt als "Beam Scans" zu zeichnen und keinen Framebuffer zu haben. Ich weiß, dass dies nicht der Fall ist eine echte Vektoranzeige, aber es klingt nach einem interessanten Versuch
@Earlz Sie haben nicht genug Verarbeitungsgeschwindigkeit, um im Wesentlichen Dinge zu zeichnen, während der Strahl scannt. Wenn Sie darüber nachdenken, haben Sie eine begrenzte Anzahl von Takten pro Pixel und eine variable Anzahl von Zeilen im Speicher. Für jedes Pixel müssen Sie jeden Vektor auf einen Schnittpunkt überprüfen. Die maximale Anzahl von Vektoren ist die Anzahl von Takten pro Pixel. VGA hat einen Pixeltakt von etwa 25 MHz. Wenn Ihr Haupttakt 125 MHz beträgt, haben Sie 5 Takte/Pixel. Sie können also jederzeit 5 Vektoren in Ihrem Puffer haben. Das ist nicht sehr interessant anzusehen.
@David Kessner stimmt das aber mit einem FPGA? Vermutlich würden Sie eine "Schaltung" bauen, um über jedes Pixel auf dem Bildschirm zu scannen, und dann eine "Schaltung", um jeden Vektor zu halten, und dann würde jeder Vektor parallel entscheiden, ob das aktuell gescannte Pixel beleuchtet werden soll. Das Limit ist also, wie viele Vektor-Positionskomparatoren Sie auf dem FPGA unterbringen können, was nichts mit Taktzyklen zu tun hat.
@JohnBurton Hier ist das Problem: Sie können nicht genug dieser Schaltkreise in einen Spartan-3 einbauen, um eine nützliche Anzahl von Vektoren zu erstellen. Wenn Sie Glück haben, erhalten Sie die Gesamtzahl der Vektoren auf etwa hundert. Die Ziffern 0-9 erfordern im Durchschnitt 5 Vektoren zum Zeichnen. Sie könnten also vielleicht 20 Ziffern gleichzeitig auf dem Bildschirm anzeigen. Das ist nicht sinnvoll.
Ok das macht Sinn. Ich hätte erwartet, dass Sie mehr hätten bekommen können, aber ich denke, sie sind ziemlich "breit" in Bezug auf die Anzahl der Bits, also haben Sie Recht.
Gute Argumente. Ich habe nicht erwartet, dass es zu großen Leistungen fähig ist, aber das ist ziemlich begrenzt
@DavidKessner: Du denkst sehr brutal. Nicht jeder Vektor schneidet jede Scanlinie. Wenn Sie also die Vektorbegrenzungsrahmen im Auge behalten, sollten Sie in der Lage sein, "etwa hundert" Vektoren pro Scanlinie zu verarbeiten . Und es gibt viele Möglichkeiten, viele Informationen ohne einen vollen Grafik-Framebuffer auf ein VGA-Display zu bringen ... mit einer zweistufigen Speicherarchitektur könnten Sie einen einfachen Zeichengenerator für (viel) Text oder ein Sprite erstellen -basiertes Grafiksystem.
@DaveTweed Es gibt viele Möglichkeiten, Dinge zu optimieren, aber es wird immer Einschränkungen geben. Um die Vektorbegrenzungsboxen richtig zu verfolgen, müssen Sie den Vektorspeicher so organisieren, dass Sie a priori wissen, welche Vektoren die aktuelle Abtastlinie schneiden. Im schlimmsten Fall ist dieser Speicher tatsächlich größer als der entsprechende normale VGA-Bildspeicher. Der beste Weg, meiner Meinung nach, die BRAM-Anforderungen zu minimieren, ist die Verwendung eines Zeichengenerators + Sprites. Das Char RAM+ROM benötigt 32kbits, was viel Platz für Sprites lässt.
Ich habe einmal über die Verwendung eines lauflängencodierten Bildpuffers für ein kleines Hobby nachgedacht, das nie irgendwohin ging. Für die gewünschten Bildschirme habe ich berechnet, dass ich genügend Pixel speichern kann. Das Problem war, dass es SEHR schwierig war, die Anzeige speziell in einem FPGA-System ohne CPU zu aktualisieren, was ich wollte, also ist es nicht praktikabel, aber es könnte ein Komprimierungsschema geben, das Sie verwenden könnten?