Растровое изображение файла BMP, прочитанное с помощью TEXTIO
Преобразование файла изображения в формат растрового изображения обеспечивает самый простой способ чтения изображения с использованием VHDL. Поддержка формата файлов растровых графических изображений BMP встроена в операционную систему Microsoft Windows. Это делает BMP подходящим форматом изображения для хранения фотографий для использования в тестовых стендах VHDL.
В этой статье вы узнаете, как читать двоичный файл изображения, такой как BMP, и сохранять данные в динамической памяти симулятора. Мы будем использовать пример модуля обработки изображений для преобразования изображения в оттенки серого, это будет наше тестируемое устройство (DUT). Наконец, мы записываем выходные данные тестируемого устройства в новое изображение, которое можно визуально сравнить с исходным.
Этот пост в блоге является частью серии статей об использовании библиотеки TEXTIO в VHDL. Прочтите другие статьи здесь:
Как инициализировать ОЗУ из файла с помощью TEXTIO
Файл стимула считывается в тестовом стенде с помощью TEXTIO
Почему растровый формат является лучшим форматом для VHDL
Наиболее распространенными форматами файлов изображений в Интернете являются JPEG и PNG. Оба они используют сжатие, JPEG с потерями, а PNG без потерь. Большинство форматов предлагают ту или иную форму сжатия, потому что это может значительно уменьшить размер хранения изображения. Это нормально для обычного использования, но не идеально для чтения на тестовом стенде VHDL.
рисунок>
Чтобы иметь возможность обрабатывать изображение в программном или аппаратном обеспечении, вам необходимо иметь доступ к необработанным пиксельным данным в вашем приложении. Вы хотите, чтобы данные о цвете и яркости хранились в матрице байтов, это называется растровой или растровой графикой.
Большинство известных графических редакторов, таких как Photoshop или GIMP, основаны на растровом изображении. Они могут открывать широкий спектр форматов изображений, но все они конвертируются в растровую графику внутри редактора.
Вы можете сделать это и на VHDL, но это потребует значительных усилий по кодированию, потому что не существует готовых решений для декодирования сжатых изображений. Лучшим решением будет преобразование тестовых входных изображений в растровый формат, такой как BMP, вручную или путем включения его в скрипт, который запускает ваш тестовый стенд.
Формат файла изображения BMP
Формат файла BMP хорошо задокументирован в Википедии. У этого формата есть много разных вариантов, но мы собираемся согласовать некоторые конкретные настройки, которые сделают его намного проще для нас. Чтобы создать наши входные изображения, мы открываем их в Microsoft Paint, который предустановлен в Windows. Затем мы нажимаем Файл→Сохранить как. , выберите Тип файла:24-битное растровое изображение (*bmp; *.dib). . Назовите файл с расширением .bmp и нажмите «Сохранить».
Убедившись, что файл создан таким образом, мы можем предположить, что заголовок всегда представляет собой вариант BITMAPINFOHEADER длиной 54 байта с форматом пикселей RGB24, упомянутый на странице Википедии. Кроме того, нас будут интересовать только несколько выбранных полей в заголовке. В таблице ниже показаны поля заголовков, которые мы собираемся прочитать.
Смещение (декабрь)
Размер (B)
Ожидается (Hex)
Описание
0
<тд>2тд>
«БМ» (42 4D)
Поле идентификатора
10
<тд>4тд>
54 (36 00 00 00)
Смещение массива пикселей
14
<тд>4тд>
40 (28 00 00 00)
Размер заголовка
18
<тд>4тд>
Читать значение
Ширина изображения в пикселях
22
<тд>4тд>
Читать значение
Высота изображения в пикселях
26
<тд>1тд>
1 (01)
Количество цветовых плоскостей
28
<тд>1тд>
24 (18)
Количество бит на пиксель
Значения, отмеченные зеленым, — это единственные, на которые нам действительно нужно смотреть, потому что мы знаем, какие значения ожидать в других полях заголовка. Если вы согласились каждый раз использовать только изображения предопределенных фиксированных размеров, вы можете пропустить весь заголовок и начать чтение со смещения в байтах 54 в файле BMP, где будут найдены данные о пикселях.
Тем не менее, мы проверим, что другие перечисленные значения соответствуют ожиданиям. Это не сложно сделать, так как мы уже читаем шапку. Это также обеспечивает защиту от пользовательских ошибок, если вы или один из ваших коллег предоставите тестовому стенду образ с неправильной кодировкой в будущем.
Тестовый пример
Этот пост в блоге посвящен тому, как читать изображение из файла в тестовом стенде VHDL, но для полноты картины я включил пример тестируемого устройства. Мы будем передавать пиксельные данные через тестируемое устройство по мере считывания изображения. Наконец, мы записываем результаты в другой выходной BMP-файл, который можно просмотреть в вашей любимой программе просмотра изображений.
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;
Приведенный выше код показывает сущность нашего тестируемого устройства. Модуль оттенков серого принимает 24-битные данные RGB для одного пикселя в качестве входных данных и преобразует их в представление в оттенках серого, которое представляется на выходе. Обратите внимание, что выходной пиксель представляет собой оттенок серого, который все еще находится в цветовом пространстве RGB. Мы не преобразовываем BMP в BMP в оттенках серого, который является другим форматом.
Модуль чисто комбинационный, нет ни часов, ни входа сброса. Результат сразу появляется на выходе, когда что-то назначается на вход. Для простоты преобразование в оттенки серого использует аппроксимацию с фиксированной точкой значения яркости (яркости) в соответствии с системой кодирования RGB ITU-R BT.2100 для яркости.
Вы можете загрузить код модуля оттенков серого и всего проекта, используя форму ниже.
Изображение Boeing 747, которое вы видите ниже, будет нашим примером входного изображения. То есть это не фактическое изображение BMP, встроенное в этот пост в блоге, это было бы невозможно. Это JPEG-представление BMP-изображения, которое мы собираемся прочитать на нашем тестовом стенде. Вы можете запросить исходное изображение BMP, оставив свой адрес электронной почты в форме выше, и вы сразу получите его в свой почтовый ящик.