La conversion du fichier image au format bitmap constitue le moyen le plus simple de lire une image à l'aide de VHDL. La prise en charge du format de fichier d'image graphique raster BMP est intégrée au système d'exploitation Microsoft Windows. Cela fait de BMP un format d'image approprié pour stocker des photos à utiliser dans des bancs de test VHDL.
Dans cet article, vous apprendrez à lire un fichier image binaire comme BMP et à stocker les données en mémoire dynamique dans le simulateur. Nous allons utiliser un exemple de module de traitement d'image pour convertir l'image en niveaux de gris, ce sera notre appareil sous test (DUT). Enfin, nous écrivons la sortie du DUT dans une nouvelle image que nous pouvons comparer visuellement à l'original.
Ce billet de blog fait partie d'une série sur l'utilisation de la bibliothèque TEXTIO en VHDL. Lisez les autres articles ici :
Comment initialiser la RAM à partir d'un fichier à l'aide de TEXTIO
Fichier Stimulus lu dans testbench avec TEXTIO
Pourquoi le bitmap est le meilleur format pour le VHDL
Les formats de fichiers image les plus courants sur Internet sont JPEG et PNG. Les deux utilisent la compression, JPEG est avec perte tandis que PNG est sans perte. La plupart des formats offrent une certaine forme de compression, car cela peut réduire considérablement la taille de stockage de l'image. Bien que cela convienne à une utilisation normale, ce n'est pas idéal pour lire dans un banc de test VHDL.
Pour pouvoir traiter une image dans un logiciel ou un matériel, vous devez avoir accès aux données de pixel brutes dans votre application. Vous voulez que les données de couleur et de luminance soient stockées dans une matrice d'octets, c'est ce qu'on appelle des graphiques bitmap ou raster.
La plupart des éditeurs d'images bien connus tels que Photoshop ou GIMP sont basés sur raster. Ils peuvent ouvrir un large éventail de formats d'image, mais ils sont tous convertis en graphiques raster en interne dans l'éditeur.
Vous pouvez également le faire en VHDL, mais cela nécessiterait un effort de codage considérable car il n'existe pas de solutions toutes faites pour décoder les images compressées. Une meilleure solution consiste à convertir manuellement les images d'entrée de test dans un format bitmap tel que BMP ou en les incorporant dans le script qui lance votre testbench.
Le format de fichier image BMP
Le format de fichier BMP est bien documenté sur Wikipedia. Ce format a de nombreuses variantes différentes, mais nous allons nous mettre d'accord sur certains paramètres spécifiques qui nous faciliteront grandement la tâche. Pour créer nos images d'entrée, nous les ouvrons dans Microsoft Paint qui est préinstallé avec Windows. Ensuite, nous cliquons sur Fichier→Enregistrer sous , sélectionnez Type de fichier :Bitmap 24 bits (*bmp ; *.dib) . Donnez au fichier un nom se terminant par le suffixe .bmp et cliquez sur Enregistrer.
En s'assurant que le fichier est créé comme ceci, nous pouvons supposer que l'en-tête est toujours la variante BITMAPINFOHEADER de 54 octets avec le format de pixel RGB24 mentionné sur la page Wikipedia. De plus, nous ne nous soucierons que de quelques champs sélectionnés dans l'en-tête. Le tableau ci-dessous montre les champs d'en-tête que nous allons lire.
Décalage (déc.)
Taille (B)
Attendu (Hex)
Description
0
2
« BM » (42 4D)
Champ ID
10
4
54 (36 00 00 00)
Décalage du tableau de pixels
14
4
40 (28 00 00 00)
Taille de l'en-tête
18
4
Lire la valeur
Largeur de l'image en pixels
22
4
Lire la valeur
Hauteur de l'image en pixels
26
1
1 (01)
Nombre de plans de couleur
28
1
24 (18)
Nombre de bits par pixel
Les valeurs marquées en vert sont les seules que nous devons vraiment examiner car nous savons à quelles valeurs s'attendre dans les autres champs d'en-tête. Si vous avez accepté de n'utiliser que des images de dimensions fixes prédéfinies à chaque fois, vous pouvez ignorer tout l'en-tête et commencer à lire au décalage d'octet numéro 54 dans le fichier BMP, c'est là que les données de pixel seront trouvées.
Néanmoins, nous vérifierons que les autres valeurs listées sont bien celles attendues. Ce n'est pas difficile à faire puisque nous lisons déjà l'en-tête. Il fournit également une protection contre les erreurs de l'utilisateur, si vous ou l'un de vos collègues fournissez une image du mauvais codage au testbench à tout moment dans le futur.
Le cas de test
Ce billet de blog explique comment lire une image à partir d'un fichier dans un banc d'essai VHDL, mais pour être complet, j'ai inclus un exemple DUT. Nous diffuserons les données de pixels via le DUT au fur et à mesure que nous lirons l'image. Enfin, nous écrivons les résultats dans un autre fichier BMP de sortie qui peut être examiné dans votre visionneuse d'images préférée.
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;
Le code ci-dessus montre l'entité de notre DUT. Le module en niveaux de gris prend les données RVB 24 bits pour un pixel en entrée et les convertit en une représentation en niveaux de gris qui est présentée sur la sortie. Notez que le pixel de sortie représente une nuance de gris toujours dans l'espace colorimétrique RVB, nous ne convertissons pas le BMP en un BMP en niveaux de gris qui est un format différent.
Le module est purement combinatoire, il n'y a pas d'entrée d'horloge ou de réinitialisation. Le résultat apparaît immédiatement sur la sortie lorsque quelque chose est assigné à l'entrée. Pour plus de simplicité, la conversion en niveaux de gris utilise une approximation à virgule fixe de la valeur luma (luminosité) selon le système de codage ITU-R BT.2100 RVB vers luma.
Vous pouvez télécharger le code du module en niveaux de gris et l'ensemble du projet en utilisant le formulaire ci-dessous.
L'image du Boeing 747 que vous voyez ci-dessous sera notre exemple d'image d'entrée. Autrement dit, ce n'est pas l'image BMP réelle qui est intégrée dans ce billet de blog, ce ne serait pas possible. C'est une représentation JPEG de l'image BMP que nous allons lire dans notre testbench. Vous pouvez demander l'image BMP originale en laissant votre adresse e-mail dans le formulaire ci-dessus et vous la recevrez immédiatement dans votre boîte de réception.