Imagen de mapa de bits de archivo BMP leída usando TEXTIO
Convertir el archivo de imagen a un formato de mapa de bits es la forma más fácil de leer una imagen usando VHDL. La compatibilidad con el formato de archivo de imagen de gráficos de trama BMP está integrada en el sistema operativo Microsoft Windows. Eso hace que BMP sea un formato de imagen adecuado para almacenar fotos para su uso en bancos de pruebas VHDL.
En este artículo, aprenderá cómo leer un archivo de imagen binario como BMP y almacenar los datos en la memoria dinámica del simulador. Usaremos un módulo de procesamiento de imágenes de ejemplo para convertir la imagen a escala de grises, este será nuestro dispositivo bajo prueba (DUT). Finalmente, escribimos la salida del DUT en una nueva imagen que podemos comparar visualmente con la original.
Esta publicación de blog es parte de una serie sobre el uso de la biblioteca TEXTIO en VHDL. Lea los otros artículos aquí:
Cómo inicializar RAM desde un archivo usando TEXTIO
Archivo de estímulo leído en el banco de pruebas usando TEXTIO
Por qué el mapa de bits es el mejor formato para VHDL
Los formatos de archivo de imagen más comunes en Internet son JPEG y PNG. Ambos usan compresión, JPEG tiene pérdida mientras que PNG no tiene pérdida. La mayoría de los formatos ofrecen algún tipo de compresión porque esto puede reducir drásticamente el tamaño de almacenamiento de la imagen. Si bien esto está bien para un uso normal, no es ideal para leer en un banco de pruebas VHDL.
Para poder procesar una imagen en software o hardware, debe tener acceso a los datos de píxeles sin procesar dentro de su aplicación. Desea tener los datos de color y luminancia almacenados en una matriz de bytes, esto se denomina mapa de bits o gráficos de trama.
La mayoría de los editores de imágenes más conocidos, como Photoshop o GIMP, se basan en tramas. Pueden abrir una amplia gama de formatos de imagen, pero todos se convierten a gráficos de trama internamente en el editor.
También puede hacer esto en VHDL, pero eso requeriría un esfuerzo de codificación considerable porque no hay soluciones preparadas para decodificar imágenes comprimidas. Una mejor solución es convertir las imágenes de entrada de prueba a un formato de mapa de bits como BMP manualmente o incorporándolo al script que inicia su banco de pruebas.
El formato de archivo de imagen BMP
El formato de archivo BMP está bien documentado en Wikipedia. Este formato tiene muchas variantes diferentes, pero vamos a acordar unos ajustes concretos que nos lo van a facilitar mucho. Para crear nuestras imágenes de entrada, las abrimos en Microsoft Paint, que viene preinstalado con Windows. Luego, hacemos clic en Archivo→Guardar como , seleccione Guardar como tipo:mapa de bits de 24 bits (*bmp; *.dib) . Asigne un nombre al archivo que termine con el sufijo .bmp y haga clic en guardar.
Al asegurarnos de que el archivo se crea de esta manera, podemos suponer que el encabezado siempre es la variante BITMAPINFOHEADER de 54 bytes con formato de píxel RGB24 mencionado en la página de Wikipedia. Además, solo nos preocuparemos por unos pocos campos seleccionados dentro del encabezado. La siguiente tabla muestra los campos de encabezado que vamos a leer.
Compensación (diciembre)
Tamaño (B)
Esperado (Hex)
Descripción
0
2
“BM” (42 4D)
campo de identificación
10
4
54 (36 00 00 00)
Desplazamiento de matriz de píxeles
14
4
40 (28 00 00 00)
Tamaño del encabezado
18
4
Leer valor
Ancho de la imagen en píxeles
22
4
Leer valor
Altura de la imagen en píxeles
26
1
1 (01)
Número de planos de color
28
1
24 (18)
Número de bits por píxel
Los valores marcados en verde son los únicos que realmente necesitamos mirar porque sabemos qué valores esperar en los otros campos de encabezado. Si acordó usar solo imágenes de dimensiones fijas predefinidas cada vez, puede omitir todo el encabezado y comenzar a leer en el número de desplazamiento de bytes 54 dentro del archivo BMP, ahí es donde se encontrarán los datos de píxeles.
No obstante, comprobaremos que los demás valores enumerados son los esperados. No es difícil de hacer ya que ya estamos leyendo el encabezado. También proporciona una protección contra los errores del usuario, en caso de que usted o uno de sus colegas proporcione una imagen de la codificación incorrecta al banco de pruebas en cualquier momento en el futuro.
El caso de prueba
Esta publicación de blog trata sobre cómo leer una imagen de un archivo en un banco de pruebas VHDL, pero para completar, he incluido un DUT de ejemplo. Transmitiremos los datos de píxeles a través del DUT mientras leemos la imagen. Finalmente, escribimos los resultados en otro archivo BMP de salida que se puede examinar en su visor de imágenes favorito.
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;
El código anterior muestra la entidad de nuestro DUT. El módulo de escala de grises toma los datos RGB de 24 bits de un píxel como entrada y los convierte en una representación en escala de grises que se presenta en la salida. Tenga en cuenta que el píxel de salida representa un tono de gris aún dentro del espacio de color RGB, no estamos convirtiendo el BMP en un BMP en escala de grises, que es un formato diferente.
El módulo es puramente combinacional, no hay reloj ni entrada de reinicio. El resultado aparece inmediatamente en la salida cuando se asigna algo a la entrada. Para simplificar, la conversión a escala de grises utiliza una aproximación de punto fijo del valor de luma (brillo) de acuerdo con el sistema de codificación ITU-R BT.2100 RGB to luma.
Puede descargar el código para el módulo de escala de grises y todo el proyecto utilizando el siguiente formulario.
La imagen del Boeing 747 que está viendo a continuación será nuestra imagen de entrada de ejemplo. Es decir, no es la imagen BMP real la que está incrustada en esta publicación de blog, eso no sería posible. Es una representación JPEG de la imagen BMP que vamos a leer en nuestro banco de pruebas. Puede solicitar la imagen BMP original dejando su dirección de correo electrónico en el formulario de arriba y la recibirá de inmediato en su bandeja de entrada.