Anzeigen von Zeichen in Verilog mit VGA

Ich mache als CS-Student eine Einführung in den ECE-Kurs und für ein Abschlussprojekt sollen wir ein in Verilog codiertes Spiel entwerfen, das das VGA-Display auf einem DE1-SoC-Board verwendet.

Ich habe mich entschieden, ein Henker-Spiel zu erstellen, aber ich weiß nicht, wie ich Charaktere auf dem VGA-Bildschirm anzeigen kann. Ich habe mir drei Optionen ausgedacht: Alphabet und Unterstriche als Bilder erstellen und auf das VGA-Display hochladen, eine Art eingebauten Zeichenpuffer verwenden (ich habe Informationen zu diesem Teil online gefunden, kann aber keine Beispiele für die Verwendung finden it) oder zeichne einfach jedes Zeichen Pixel für Pixel.

Der Pixel-für-Pixel-Weg scheint extrem kompliziert zu sein, aber gleichzeitig gibt es fast keine Ressourcen, die ich zu den anderen beiden Methoden finden konnte. Kann mir jemand sagen, welcher Weg für mein Spiel am effizientesten und einfachsten ist? Wir haben nur im Unterricht wirklich gelernt, wie man Formen darstellt, aber ich bin mir nicht sicher, ob es die effizienteste Methode ist, jeden Buchstaben zu zeichnen.

Es hängt davon ab, wie Ihr VGA-Controller funktioniert. Wenn Sie einen Bildpuffer haben, können Sie eine Zeichen-Nachschlagetabelle haben, die die Zeichenwerte auf Pixel-Bitmaps abbildet und dann die Pixel für jedes Zeichen zeichnet.

Antworten (1)

Letztendlich müssen Sie Pixeldaten an das Display senden. Daran führt kein Weg vorbei; So funktioniert VGA. Der Monitor am anderen Ende versteht nur Frames, das FPGA muss vollständige Frames mit der richtigen Rate generieren. Der einfachste Weg, dies zu tun, besteht darin, einen Frame-Puffer zu haben, der Pixeldaten für die gesamte Anzeige enthält. Dies erfordert im Allgemeinen mehr Speicher, als das FPGA intern hat, was bedeutet, dass Ihr Bildspeicher auf einem externen Speicher sitzen muss.

Wenn das, was Sie anzeigen möchten, jedoch eine gewisse Struktur aufweist, benötigen Sie möglicherweise keinen vollständigen Frame-Puffer. Wenn Sie beispielsweise eine reine Textanzeige erstellen möchten, benötigen Sie lediglich einen Zeichenpuffer, der angibt, welches Zeichen an jeder Position auf der Anzeige angezeigt werden soll, wobei jede Position einem zeichengroßen Pixelfeld entspricht. Dann können Sie eine „Zuordnung“ zwischen den Zeichen im Puffer und den Pixeln auf dem Display erstellen – einen Schriftpuffer. Um eine Videozeile zu erzeugen, ziehen Sie Zeichen aus der entsprechenden Zeile im Zeichenpuffer, verwenden Sie diese, um den Schriftpuffer zu indizieren, und zeigen Sie dann die Pixel an, die der bestimmten Zeile in den ausgewählten Zeichen entsprechen. Dies wäre eine sehr einfache Pipeline zum Zeichnen von Text. Es ist möglich, etwas Ähnliches auch mit Sprites zu machen, so dass Sie grundlegende Grafiken erstellen können, ohne einen vollständigen Framebuffer zu benötigen. Je nach Implementierung kann es effizienter sein, eine Hardware-Sprite-Zeichenmaschine zu verwenden, da das Verschieben des Sprites nur die Aktualisierung der Position in der Zeichenmaschine beinhaltet, anstatt alle Pixel, aus denen das Sprite besteht, neu zu schreiben.

Eine weniger speicherintensive Version wäre ein Zeilenpixelpuffer, wobei die Pufferaktualisierung durch die horizontale Synchronisation ausgelöst wird.
Nicht sicher, wie das weniger Speicher sein würde. Der Zeilenpuffer müsste bei jedem horizontalen Sync immer noch irgendwo gefüllt werden.
Die Pixel würden (höchstwahrscheinlich) aus einer Pixel-Nachschlagetabelle bereitgestellt, und diese Tabelle müsste nur eines von jedem möglichen Zeichen enthalten (64 würden wahrscheinlich ausreichen, oder höchstens 256), anstatt der 2000, die für einen Standardbildschirm von 80 x 25 erforderlich sind .
Das ist im Grunde das, was ich skizziert habe, oder? Sie haben ein Byte pro Zeichenposition (80 x 25 Zeichen wären 2000 Bytes, dies sollte in einen Block-RAM passen), dann eine Tabelle mit Bitmaps, die durch die Zeichen- und Pixelzeile indiziert ist. Um eine Abtastzeile auszugeben, durchlaufen Sie die Zeichen in der entsprechenden Zeile im Zeichenpuffer, verwenden Sie diese, um die richtige Zeile der entsprechenden Bitmap zu erhalten, und geben Sie diese aus, während Sie das nächste Zeichen abrufen. Ich bin mir nicht sicher, wie ein Zeilenpuffer hier hineinpasst. Es sei denn, ich verstehe falsch, was Sie mit Zeilenpuffer meinen.