exponenta event banner

Создание кода HDL для резкости изображения

В этом примере показано, как использовать Vision HDL Toolbox™ для реализации модуля на основе FPGA для резкости изображения.

Vision HDL Toolbox предоставляет алгоритмы обработки изображений и видео, предназначенные для генерации читаемого, синтезируемого кода в VHDL и Verilog (с HDL Coder™). Сгенерированный код HDL при выполнении на FPGA (например, Xilinx XC7Z045) может обрабатывать изображения с полным разрешением 1920x1080 со скоростью 60 кадров в секунду.

В этом примере показано, как использовать панель инструментов Vision HDL для создания кода HDL, который резкость размытого изображения. Начиная с Видения алгоритмы Комплекта инструментов HDL доступны как MATLAB® System objects™ и блоки Simulink®, код HDL может быть сгенерирован от MATLAB или Simulink. В этом примере показаны оба рабочих процесса.

Рабочий процесс для проекта, предназначенного для FPGA:

1. Создание поведенческой модели для представления целей проектирования;

2. Репликация проекта с использованием алгоритмов, интерфейсов и типов данных, соответствующих FPGA и поддерживаемых для генерации кода HDL.

3. Моделирование двух конструкций и сравнение результатов для подтверждения того, что оптимизированная для ЛПВП конструкция соответствует поставленным целям.

4. Создайте код HDL из проекта, созданного на шаге 2.

Для шагов 2 и 3 в MATLAB необходимо иметь Designer™ MATLAB, Vision HDL Toolbox и Fixed-Point. В Simulink необходимы Simulink, Vision HDL Toolbox и Fixed-Point Designer. В обоих случаях для создания кода HDL необходимо иметь кодер HDL.

Поведенческая модель

Входное изображение imgBlur показано слева на диаграмме ниже. Справа изображение заточено с помощью функции Toolbox™ обработки изображений imfilter.

Время моделирования печатается как отметка для сравнения в будущем.

imgBlur = imread('riceblurred.png');
sharpCoeff = [0 0 0;0 1 0;0 0 0]-fspecial('laplacian',0.2);

f = @() imfilter(imgBlur,sharpCoeff,'symmetric');
fprintf('Elapsed time is %.6f seconds.\n',timeit(f));

imgSharp = imfilter(imgBlur,sharpCoeff,'symmetric');
figure
imshowpair(imgBlur,imgSharp,'montage')
title('Blurred Image and Sharpened Image')
Elapsed time is 0.000557 seconds.

Рекомендации по проектированию, оптимизированному для HDL

Для создания кода HDL необходимо внести три ключевых изменения.

  • Использование алгоритмов, удобных для HDL: Функции панели инструментов обработки изображений не поддерживают создание кода HDL. Vision HDL Toolbox предоставляет алгоритмы обработки изображений и видео, разработанные для эффективной реализации HDL. Из этих алгоритмов можно создать код HDL с помощью функций (Vision HDL Toolbox) и блоков (Vision HDL Toolbox). В этом примере представлены оба потока операций. Чтобы спроектировать модуль на основе FPGA, замените функции панели инструментов обработки изображений на удобные для HDL аналоги панели инструментов Vision HDL. Этот пример заменяет imfilter в поведенческой модели с visionhdl.ImageFilter Системный объект в MATLAB или Image Filter блок в Simulink.

  • Использование потокового пиксельного интерфейса: Функции из модели инструментария обработки изображений на высоком уровне абстракции. Они выполняют полнокадровую обработку, работая на одном кадре изображения за один раз. Однако реализации FPGA и ASIC выполняют обработку потока пикселей, работая на одном пикселе изображения за один раз. Блоки панели инструментов Vision HDL и системные объекты используют потоковый пиксельный интерфейс. Использовать visionhdl.FrameToPixels Системный объект в MATLAB или Frame To Pixels блок в Simulink для преобразования полного изображения кадра или видео в поток пикселей. Потоковый интерфейс пикселей включает в себя управляющие сигналы, которые указывают положение каждого пикселя в кадре. Алгоритмы, которые работают с соседством пикселей, используют внутреннюю память для хранения минимального количества строк. Vision HDL Toolbox обеспечивает потоковый пиксельный интерфейс и автоматическое внедрение памяти для решения распространенных проблем проектирования при нацеливании на FPGA и ASIC. Дополнительные сведения о потоковом пиксельном протоколе, используемом системными объектами из панели инструментов Vision HDL, см. в разделе Потоковый пиксельный интерфейс (панель инструментов Vision HDL).

  • Используйте представление данных с фиксированной точкой: Функции панели инструментов обработки изображений выполняют алгоритмы обработки видео в домене с плавающей запятой или целочисленном домене. Системные объекты и блоки из панели инструментов Vision HDL требуют данных с фиксированной точкой для создания кода HDL для целевых FPGA и ASIC. Преобразование конструкции в фиксированную точку может привести к ошибке квантования. Следовательно, благоприятная для HDL модель может генерировать выходной сигнал, немного отличный от полученного из поведенческой модели. Для большинства приложений допустимы небольшие ошибки квантования в пределах допуска. Настройки фиксированной точки можно настроить в соответствии с требованиями пользователя.

В этом примере в качестве источника используется статическое изображение. Эта модель также способна обрабатывать непрерывный видеовход.

Создание кода HDL из MATLAB

Для генерации HDL из MATLAB код необходимо разделить на два файла: тестовый стенд и дизайн. Файл проекта используется для реализации алгоритма в FPGA или ASIC. Файл тестового стенда предоставляет входные данные в файл проекта и получает выходные данные проекта.

Шаг 1: Создание файла проекта

Функция ImageSharpeningHDLDesign.m принимает поток пикселей и структуру управления, состоящую из пяти управляющих сигналов, и возвращает модифицированный поток пикселей и структуру управления.

В этом примере конструкция содержит объект System visionhdl.ImageFilter. Это дружественный HDL аналог imfilter функция. Сконфигурируйте его с теми же коэффициентами и методом заполнения, что и imfilter.

function [pixOut,ctrlOut] = ImageSharpeningHDLDesign(pixIn,ctrlIn)
% ImageSharpeningHDLDesign  Implement algorithms using pixel-stream 
%       System objects from the Vision HDL Toolbox

%   Copyright 2015 The MathWorks, Inc.

%#codegen
persistent sharpeningFilter;
if isempty(sharpeningFilter)   
    sharpCoeff = [0 0 0;0 1 0;0 0 0]-fspecial('laplacian',0.2);
    sharpeningFilter = visionhdl.ImageFilter(...
    'Coefficients',sharpCoeff,...
    'PaddingMethod','Symmetric',...
    'CoefficientsDataType','Custom',...
    'CustomCoefficientsDataType',numerictype(1,16,12));              
end

[pixOut,ctrlOut] = step(sharpeningFilter,pixIn,ctrlIn);


Шаг 2: Создание файла тестового стенда

Тестовый стенд ImageSharpeningHDLTestBench.m считывает размытое изображение. frm2pix объект преобразует полный кадр изображения в поток пикселей и структур управления. Стенд вызывает функцию проектирования ImageSharpeningHDLDesign обрабатывать по одному пикселю за один раз. После обработки всего потока пикселей pix2frm преобразует выходной поток пикселей в полнокадровое изображение. Испытательный стенд сравнивает выходное изображение с опорным. imgSharp.

...
[pixInVec,ctrlInVec] = step(frm2pix,imgBlur);
for p = 1:numPixPerFrm
    [pixOutVec(p),ctrlOutVec(p)] = ImageSharpeningHDLDesign(pixInVec(p),ctrlInVec(p));
end
imgOut = step(pix2frm,pixOutVec,ctrlOutVec);
% Compare the result
imgDiff = imabsdiff(imgSharp,imgOut);
fprintf('The maximum difference between corresponding pixels is %d.\n',max(imgDiff(:)));
fprintf('A total of %d pixels are different.\n',nnz(imgDiff));
...

Шаг 3: Моделирование проекта и проверка результата

Смоделировать конструкцию с помощью тестового стенда до создания кода HDL, чтобы убедиться в отсутствии ошибок во время выполнения.

ImageSharpeningHDLTestBench
The maximum difference between corresponding pixels is 1.
A total of 41248 pixels are different.

Simulation took 107.544594 seconds to finish.

На стенде отображается результат сравнения и время, затраченное на моделирование. Из-за ошибки квантования и ошибки округления, из общего числа 256 * 256 = 65536 пикселей, 38554 imgOut отличаются отimgSharp. Однако максимальная разница в интенсивности равна 1. В масштабе от 0 до 255 это различие визуально незаметно.

Как мы можем видеть, сравнивая время моделирования в MATLAB с временем поведенческой модели, протокол потоковой передачи пикселей вносит значительные издержки. Для ускорения моделирования потоковой передачи пикселей в MATLAB можно использовать Coder™ MATLAB. См. раздел Ускорение пиксельной потоковой разработки с помощью кодера MATLAB (панель инструментов Vision HDL).

Шаг 4: Создание кода HDL

После того, как вы удовлетворены результатами целевой модели FPGA, вы можете использовать кодер HDL для генерации кода HDL из проекта. Сгенерированный код HDL можно запустить в имитаторах HDL или загрузить в FPGA и запустить в физической системе.

Убедитесь, что файлы конструктора и тестового стенда находятся в одном каталоге с возможностью записи. Для создания кода HDL используется следующая команда:

hdlcfg = coder.config('hdl');
hdlcfg.TestBenchName = 'ImageSharpeningHDLTestBench';
hdlcfg.TargetLanguage = 'Verilog';
hdlcfg.GenerateHDLTestBench = false;
codegen -config hdlcfg ImageSharpeningHDLDesign

Дополнительные сведения о создании и настройке MATLAB для проектов HDL см. в учебном пособии «Начало работы с MATLAB для рабочих процессов HDL» в документации по кодеру HDL.

Создание кода HDL из Simulink

Шаг 1: Создание модели, оптимизированной для HDL

Модель ImageSharpeningHDLModel показана ниже.

modelname = 'ImageSharpeningHDLModel';
open_system(modelname);
set_param(modelname,'Open','on');

Модель считывает размытое изображение. Блок «От кадра к пикселям» преобразует полнокадровое изображение в поток пикселей, а блок «От пикселей к кадру» преобразует поток пикселей обратно в полнокадровое изображение. Система резкости изображения HDL содержит блок фильтра изображения, который является удобным для HDL аналогом в панели инструментов Vision HDL imfilter функция представлена в поведенческой модели.

set_param(modelname,'Open','off');
set_param([modelname '/Image Sharpening HDL System'],'Open','on');

Настройте блок «Фильтр изображения» с теми же коэффициентами заточки и методом заполнения, что и в поведенческой модели, как показано на масках ниже.

Шаг 2: Моделирование проекта и проверка результата

tic
sim(modelname);
toc
Elapsed time is 32.122551 seconds.

Simulink использует преимущества генерации кода C для ускорения моделирования. Поэтому он намного быстрее, чем моделирование MATLAB, хотя все еще медленнее, чем поведенческая модель.

При моделировании в рабочей области создается новая переменная imgOut. Используйте следующие команды для сравнения imgOut с imSharp сгенерирована на основе поведенческой модели.

imgDiff = imabsdiff(imgSharp,imgOut);
fprintf('The maximum difference between corresponding pixels is %d.\n',max(imgDiff(:)));
fprintf('A total of %d pixels are different.\n',nnz(imgDiff));
The maximum difference between corresponding pixels is 1.
A total of 41248 pixels are different.

Из-за ошибки квантования и ошибки округления, из общего числа 256 * 256 = 65536 пикселей, 38554imgOut отличаются от imgSharp. Однако максимальная разница в интенсивности равна 1. В масштабе от 0 до 255 это различие визуально незаметно. (Это то же объяснение, что и на шаге 3 в разделе «Генерация кода HDL из MATLAB».)

Шаг 3: Создание кода HDL

После того, как вы удовлетворены результатами целевой модели FPGA, вы можете использовать кодер HDL для генерации кода HDL из проекта. Сгенерированный код HDL можно запустить в имитаторах HDL или загрузить в FPGA и запустить в физической системе.

Создайте код HDL из системы резкости изображения HDL с помощью следующей команды:

makehdl('ImageSharpeningHDLModel/Image Sharpening HDL System')
set_param([modelname '/Image Sharpening HDL System'],'Open','off');
close_system(modelname,0);
close all;