Het converteren van het afbeeldingsbestand naar een bitmap-indeling zorgt voor de gemakkelijkste manier om een afbeelding te lezen met VHDL. Ondersteuning voor het BMP-rasterafbeeldingsbestandsformaat is ingebouwd in het Microsoft Windows-besturingssysteem. Dat maakt BMP een geschikt beeldformaat voor het opslaan van foto's voor gebruik in VHDL-testbanken.
In dit artikel leert u hoe u een binair afbeeldingsbestand zoals BMP leest en de gegevens opslaat in dynamisch geheugen in de simulator. We zullen een voorbeeldbeeldverwerkingsmodule gebruiken om de afbeelding naar grijswaarden te converteren, dit zal ons te testen apparaat zijn (DUT). Ten slotte schrijven we de uitvoer van de DUT naar een nieuwe afbeelding die we visueel kunnen vergelijken met het origineel.
Deze blogpost maakt deel uit van een serie over het gebruik van de TEXTIO-bibliotheek in VHDL. Lees hier de andere artikelen:
Hoe RAM vanuit een bestand te initialiseren met TEXTIO
Stimulusbestand gelezen in testbench met TEXTIO
Waarom bitmap het beste formaat is voor VHDL
De meest voorkomende bestandsindelingen voor afbeeldingen op internet zijn JPEG en PNG. Beiden gebruiken compressie, JPEG is lossy terwijl PNG lossless is. De meeste formaten bieden een vorm van compressie omdat dit de opslaggrootte van de afbeelding drastisch kan verminderen. Hoewel dit prima is voor normaal gebruik, is het niet ideaal om in een VHDL-testbank te lezen.
Om een afbeelding in software of hardware te kunnen verwerken, moet u binnen uw applicatie toegang hebben tot de onbewerkte pixeldata. U wilt dat de kleur- en luminantiegegevens worden opgeslagen in een matrix van bytes, dit wordt bitmap- of rasterafbeeldingen genoemd.
De meeste bekende afbeeldingseditors zoals Photoshop of GIMP zijn op rasters gebaseerd. Ze kunnen een breed scala aan afbeeldingsindelingen openen, maar ze worden allemaal intern in de editor geconverteerd naar rasterafbeeldingen.
Je kunt dit ook in VHDL doen, maar dat zou een aanzienlijke codeerinspanning vergen omdat er geen kant-en-klare oplossingen zijn voor het decoderen van gecomprimeerde afbeeldingen. Een betere oplossing is om de testinvoerafbeeldingen handmatig te converteren naar een bitmap-indeling zoals BMP of door deze op te nemen in het script dat uw testbench start.
Het BMP-beeldbestandsformaat
Het BMP-bestandsformaat is goed gedocumenteerd op Wikipedia. Dit formaat heeft veel verschillende varianten, maar we gaan het eens worden over een aantal specifieke instellingen die het een stuk makkelijker voor ons zullen maken. Om onze invoerafbeeldingen te maken, openen we ze in Microsoft Paint, dat vooraf is geïnstalleerd met Windows. Vervolgens klikken we op Bestand → Opslaan als , selecteer Opslaan als type:24-bits bitmap (*bmp; *.dib) . Geef het bestand een naam die eindigt met het achtervoegsel .bmp en klik op opslaan.
Door ervoor te zorgen dat het bestand op deze manier wordt gemaakt, kunnen we aannemen dat de header altijd de 54 bytes lange BITMAPINFOHEADER-variant met pixelformaat RGB24 is die op de Wikipedia-pagina wordt vermeld. Bovendien geven we alleen om een paar geselecteerde velden in de koptekst. De onderstaande tabel toont de koptekstvelden die we gaan lezen.
Offset (december)
Maat (B)
Verwacht (Hex)
Beschrijving
0
2
“BM” (42 4D)
ID-veld
10
4
54 (36 00 00 00)
Pixel-array-offset
14
4
40 (28 00 00 00)
Kopgrootte
18
4
Lees waarde
Beeldbreedte in pixels
22
4
Lees waarde
Afbeeldingshoogte in pixels
26
1
1 (01)
Aantal kleurvlakken
28
1
24 (18)
Aantal bits per pixel
De groen gemarkeerde waarden zijn de enige waar we echt naar moeten kijken omdat we weten welke waarden we kunnen verwachten in de andere kopvelden. Als u ermee instemt om elke keer alleen afbeeldingen van vooraf gedefinieerde vaste afmetingen te gebruiken, kunt u de hele koptekst overslaan en beginnen met lezen bij byte offset nummer 54 in het BMP-bestand, dat is waar de pixelgegevens zullen worden gevonden.
Desalniettemin zullen we controleren of de andere vermelde waarden zijn zoals verwacht. Het is niet moeilijk om te doen, omdat we de kop al aan het lezen zijn. Het biedt ook een beveiliging tegen gebruikersfouten, mocht u of een van uw collega's in de toekomst een afbeelding van de verkeerde codering aan de testbench leveren.
De testcase
Deze blogpost gaat over het lezen van een afbeelding uit een bestand in een VHDL-testbench, maar voor de volledigheid heb ik een voorbeeld DUT bijgevoegd. We zullen de pixelgegevens door de DUT streamen terwijl we de afbeelding lezen. Ten slotte schrijven we de resultaten naar een ander BMP-uitvoerbestand dat kan worden bekeken in uw favoriete fotoviewer.
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;
De bovenstaande code toont de entiteit van onze TU Delft. De grijswaardenmodule neemt de 24-bits RGB-gegevens voor één pixel als invoer en converteert deze naar een grijswaardenweergave die op de uitvoer wordt weergegeven. Houd er rekening mee dat de uitvoerpixel een grijstint vertegenwoordigt die nog steeds binnen de RGB-kleurruimte valt. We converteren de BMP niet naar een grijswaarden-BMP die een ander formaat heeft.
De module is puur combinatorisch, er is geen klok- of reset-ingang. Het resultaat verschijnt direct op de uitgang als er iets aan de ingang wordt toegewezen. Voor de eenvoud gebruikt de conversie naar grijswaarden een benadering met een vast punt van de luma (helderheid) waarde volgens het ITU-R BT.2100 RGB naar luma coderingssysteem.
U kunt de code voor de grijswaardenmodule en het hele project downloaden via het onderstaande formulier.
De afbeelding van de Boeing 747 die u hieronder ziet, is onze voorbeeldinvoerafbeelding. Dat wil zeggen, het is niet de daadwerkelijke BMP-afbeelding die in deze blogpost is ingesloten, dat zou niet mogelijk zijn. Het is een JPEG-weergave van de BMP-afbeelding die we in onze testbank gaan lezen. U kunt de originele BMP-afbeelding aanvragen door uw e-mailadres in het bovenstaande formulier achter te laten en u ontvangt deze meteen in uw inbox.