Imagem de bitmap de arquivo BMP lida usando TEXTIO
Converter o arquivo de imagem em um formato de bitmap torna a maneira mais fácil de ler uma imagem usando VHDL. O suporte para o formato de arquivo de imagem de gráficos raster BMP está embutido no sistema operacional Microsoft Windows. Isso torna o BMP um formato de imagem adequado para armazenar fotos para uso em testbenches VHDL.
Neste artigo, você aprenderá a ler um arquivo de imagem binário como o BMP e armazenar os dados na memória dinâmica do simulador. Usaremos um exemplo de módulo de processamento de imagem para converter a imagem em tons de cinza, este será nosso dispositivo em teste (DUT). Por fim, escrevemos a saída do DUT em uma nova imagem que podemos comparar visualmente com a original.
Esta postagem de blog é parte de uma série sobre o uso da biblioteca TEXTIO em VHDL. Leia os outros artigos aqui:
Como inicializar a RAM do arquivo usando TEXTIO
Arquivo de estímulo lido no testbench usando TEXTIO
Por que bitmap é o melhor formato para VHDL
Os formatos de arquivo de imagem mais comuns na internet são JPEG e PNG. Ambos usam compactação, JPEG é com perdas enquanto PNG é sem perdas. A maioria dos formatos oferece alguma forma de compactação porque isso pode reduzir drasticamente o tamanho de armazenamento da imagem. Embora isso seja bom para uso normal, não é ideal para leitura em um testbench VHDL.
Para poder processar uma imagem em software ou hardware, você precisa ter acesso aos dados brutos de pixel em seu aplicativo. Você deseja ter os dados de cor e luminância armazenados em uma matriz de bytes, isso é chamado de bitmap ou gráficos raster.
A maioria dos editores de imagem conhecidos, como Photoshop ou GIMP, são baseados em raster. Eles podem abrir uma ampla variedade de formatos de imagem, mas todos são convertidos em gráficos raster internamente no editor.
Você também pode fazer isso em VHDL, mas isso exigiria um esforço de codificação considerável porque não há soluções prontas para decodificar imagens compactadas. Uma solução melhor é converter as imagens de entrada de teste em um formato de bitmap como BMP manualmente ou incorporá-lo no script que inicia seu testbench.
O formato de arquivo de imagem BMP
O formato de arquivo BMP está bem documentado na Wikipedia. Esse formato tem muitas variantes diferentes, mas vamos concordar com algumas configurações específicas que facilitarão muito para nós. Para criar nossas imagens de entrada, nós as abrimos no Microsoft Paint que vem pré-instalado com o Windows. Em seguida, clicamos em Arquivo→Salvar como , selecione Salvar como tipo:Bitmap de 24 bits (*bmp; *.dib) . Dê um nome ao arquivo que termine com o sufixo .bmp e clique em salvar.
Ao garantir que o arquivo seja criado assim, podemos supor que o cabeçalho sempre é a variante BITMAPINFOHEADER de 54 bytes com formato de pixel RGB24 mencionado na página da Wikipedia. Além disso, vamos nos preocupar apenas com alguns campos selecionados dentro do cabeçalho. A tabela abaixo mostra os campos de cabeçalho que vamos ler.
Deslocamento (dezembro)
Tamanho (B)
Esperado (Hex)
Descrição
0
2
“BM” (42 4D)
Campo de ID
10
4
54 (36 00 00 00)
Deslocamento da matriz de pixels
14
4
40 (28 00 00 00)
Tamanho do cabeçalho
18
4
Ler valor
Largura da imagem em pixels
22
4
Ler valor
Altura da imagem em pixels
26
1
1 (01)
Número de planos de cores
28
1
24 (18)
Número de bits por pixel
Os valores marcados em verde são os únicos que realmente precisamos observar porque sabemos quais valores esperar nos outros campos de cabeçalho. Se você concordou em usar apenas imagens de dimensões fixas predefinidas todas as vezes, pode pular o cabeçalho inteiro e começar a ler no deslocamento de byte número 54 dentro do arquivo BMP, é onde os dados de pixel serão encontrados.
No entanto, verificaremos se os demais valores listados estão de acordo com o esperado. Não é difícil de fazer, pois já estamos lendo o cabeçalho. Ele também fornece uma proteção contra erros do usuário, caso você ou um de seus colegas forneça uma imagem da codificação errada ao testbench a qualquer momento no futuro.
O caso de teste
Esta postagem de blog é sobre como ler uma imagem de um arquivo em um testbench VHDL, mas para completar, incluí um exemplo de DUT. Transmitiremos os dados de pixel através do DUT enquanto lemos a imagem. Finalmente, gravamos os resultados em outro arquivo BMP de saída que pode ser examinado em seu visualizador de imagens 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;
O código acima mostra a entidade do nosso DUT. O módulo em tons de cinza pega os dados RGB de 24 bits para um pixel como entrada e os converte em uma representação em tons de cinza que é apresentada na saída. Observe que o pixel de saída representa um tom de cinza ainda dentro do espaço de cores RGB, não estamos convertendo o BMP em um BMP em escala de cinza, que é um formato diferente.
O módulo é puramente combinacional, não há entrada de clock ou reset. O resultado aparece imediatamente na saída quando algo é atribuído à entrada. Para simplificar, a conversão para escala de cinza usa uma aproximação de ponto fixo do valor de luma (brilho) de acordo com o sistema de codificação ITU-R BT.2100 RGB para luma.
Você pode baixar o código para o módulo de tons de cinza e todo o projeto usando o formulário abaixo.
A imagem do Boeing 747 que você está vendo abaixo será nossa imagem de entrada de exemplo. Ou seja, não é a imagem BMP real que está incorporada nesta postagem do blog, isso não seria possível. É uma representação JPEG da imagem BMP que vamos ler em nosso testbench. Você pode solicitar a imagem BMP original deixando seu endereço de e-mail no formulário acima e você a receberá imediatamente em sua caixa de entrada.