BMP-Datei-Bitmap-Bild, das mit TEXTIO gelesen wird
Das Konvertieren der Bilddatei in ein Bitmap-Format ist die einfachste Möglichkeit, ein Bild mit VHDL zu lesen. Die Unterstützung für das BMP-Rastergrafik-Bilddateiformat ist in das Microsoft Windows-Betriebssystem integriert. Damit ist BMP ein geeignetes Bildformat zum Speichern von Fotos für die Verwendung in VHDL-Testbenches.
In diesem Artikel erfahren Sie, wie Sie eine binäre Bilddatei wie BMP lesen und die Daten im dynamischen Speicher des Simulators speichern. Wir werden ein beispielhaftes Bildverarbeitungsmodul verwenden, um das Bild in Graustufen umzuwandeln, dies wird unser zu testendes Gerät (DUT) sein. Schließlich schreiben wir die Ausgabe des DUT in ein neues Bild, das wir visuell mit dem Original vergleichen können.
Dieser Blogbeitrag ist Teil einer Reihe über die Verwendung der TEXTIO-Bibliothek in VHDL. Lesen Sie die anderen Artikel hier:
So initialisieren Sie RAM aus einer Datei mit TEXTIO
Stimulus-Datei in Testbench mit TEXTIO eingelesen
Warum Bitmap das beste Format für VHDL ist
Die gängigsten Bilddateiformate im Internet sind JPEG und PNG. Beide verwenden Komprimierung, JPEG ist verlustbehaftet, während PNG verlustfrei ist. Die meisten Formate bieten eine Form der Komprimierung, da dies die Speichergröße des Bildes drastisch reduzieren kann. Während dies für den normalen Gebrauch in Ordnung ist, ist es nicht ideal zum Lesen in einer VHDL-Testbench.
Um ein Bild in Software oder Hardware verarbeiten zu können, müssen Sie Zugriff auf die Pixel-Rohdaten in Ihrer Anwendung haben. Sie möchten die Farb- und Luminanzdaten in einer Byte-Matrix gespeichert haben, dies wird als Bitmap- oder Rastergrafik bezeichnet.
Die meisten bekannten Bildbearbeitungsprogramme wie Photoshop oder GIMP sind rasterbasiert. Sie können eine Vielzahl von Bildformaten öffnen, werden aber alle intern im Editor in Rastergrafiken umgewandelt.
Das geht auch in VHDL, aber das würde einen erheblichen Codierungsaufwand erfordern, da es keine vorgefertigten Lösungen zum Decodieren komprimierter Bilder gibt. Eine bessere Lösung besteht darin, die Testeingabebilder manuell in ein Bitmap-Format wie BMP zu konvertieren oder sie in das Skript einzubinden, das Ihre Testbench startet.
Das BMP-Bilddateiformat
Das BMP-Dateiformat ist auf Wikipedia gut dokumentiert. Dieses Format hat viele verschiedene Varianten, aber wir werden uns auf einige spezifische Einstellungen einigen, die es uns viel einfacher machen werden. Um unsere Eingabebilder zu erstellen, öffnen wir sie in Microsoft Paint, das mit Windows vorinstalliert ist. Dann klicken wir auf Datei→Speichern unter , wählen Sie Dateityp:24-Bit-Bitmap (*bmp; *.dib) aus . Benennen Sie die Datei mit der Endung .bmp und klicken Sie auf Speichern.
Indem wir sicherstellen, dass die Datei so erstellt wird, können wir davon ausgehen, dass der Header immer die 54 Bytes lange BITMAPINFOHEADER-Variante mit Pixelformat RGB24 ist, die auf der Wikipedia-Seite erwähnt wird. Darüber hinaus kümmern wir uns nur um einige wenige ausgewählte Felder innerhalb der Kopfzeile. Die folgende Tabelle zeigt die Header-Felder, die wir lesen werden.
Offset (Dez)
Größe (B)
Erwartet (Hex)
Beschreibung
0
2
„BM“ (42 4D)
ID-Feld
10
4
54 (36 00 00 00)
Pixel-Array-Offset
14
4
40 (28 00 00 00)
Kopfzeilengröße
18
4
Wert lesen
Bildbreite in Pixel
22
4
Wert lesen
Bildhöhe in Pixel
26
1
1 (01)
Anzahl der Farbebenen
28
1
24 (18)
Anzahl Bits pro Pixel
Die grün markierten Werte sind die einzigen, die wir uns wirklich ansehen müssen, weil wir wissen, welche Werte in den anderen Header-Feldern zu erwarten sind. Wenn Sie zugestimmt haben, jedes Mal nur Bilder mit vordefinierten festen Abmessungen zu verwenden, können Sie den gesamten Header überspringen und bei Byte-Offset-Nummer 54 innerhalb der BMP-Datei mit dem Lesen beginnen, dort befinden sich die Pixeldaten.
Wir werden trotzdem prüfen, ob die anderen aufgeführten Werte wie erwartet sind. Es ist nicht schwierig, da wir bereits die Überschrift lesen. Es bietet auch einen Schutz vor Benutzerfehlern, falls Sie oder einer Ihrer Kollegen in Zukunft ein Bild mit der falschen Codierung an die Testbench liefern sollten.
Der Testfall
In diesem Blogbeitrag geht es darum, wie man ein Bild aus einer Datei in einer VHDL-Testbench liest, aber der Vollständigkeit halber habe ich ein Beispiel-DUT beigefügt. Wir werden die Pixeldaten durch das DUT streamen, während wir das Bild lesen. Schließlich schreiben wir die Ergebnisse in eine andere BMP-Ausgabedatei, die Sie in Ihrem bevorzugten Bildbetrachter betrachten können.
entity grayscale is
port (
-- RGB input
r_in : in std_logic_vector(7 downto 0);
g_in : in std_logic_vector(7 downto 0);
b_in : in std_logic_vector(7 downto 0);
-- RGB output
r_out : out std_logic_vector(7 downto 0);
g_out : out std_logic_vector(7 downto 0);
b_out : out std_logic_vector(7 downto 0)
);
end grayscale;
Der obige Code zeigt die Entität unseres DUT. Das Graustufenmodul nimmt die 24-Bit-RGB-Daten für ein Pixel als Eingabe und wandelt sie in eine Graustufendarstellung um, die am Ausgang präsentiert wird. Beachten Sie, dass das Ausgabepixel einen Grauton darstellt, der sich immer noch im RGB-Farbraum befindet. Wir konvertieren das BMP nicht in ein Graustufen-BMP, das ein anderes Format hat.
Das Modul ist rein kombinatorisch, es gibt keinen Clock- oder Reset-Eingang. Das Ergebnis erscheint sofort am Ausgang, wenn dem Eingang etwas zugewiesen wird. Der Einfachheit halber verwendet die Umwandlung in Graustufen eine Festkomma-Annäherung des Luma-Werts (Helligkeit) gemäß dem ITU-R BT.2100 RGB-zu-Luma-Codierungssystem.
Sie können den Code für das Graustufenmodul und das gesamte Projekt herunterladen, indem Sie das folgende Formular verwenden.
Das Bild der Boeing 747, das Sie unten sehen, ist unser Beispiel-Eingabebild. Das heißt, es ist nicht das eigentliche BMP-Bild, das in diesen Blog-Beitrag eingebettet ist, das wäre nicht möglich. Es ist eine JPEG-Darstellung des BMP-Bildes, das wir in unserer Testbench lesen werden. Sie können das Original-BMP-Bild anfordern, indem Sie Ihre E-Mail-Adresse in das obige Formular eingeben, und Sie erhalten es sofort in Ihrem Posteingang.