Сгенерируйте HDL-код для повышения четкости изображения

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

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

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

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

1. Создайте поведенческую модель, чтобы представлять цели проекта;

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

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

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

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

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

Изображение входа imgBlur показано слева на схеме ниже. Справа изображение заостряется с помощью функции Image Processing 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-дружественные алгоритмы: Функции в Image Processing Toolbox не поддерживают генерацию HDL-кода. Vision HDL Toolbox предоставляет алгоритмы обработки изображений и видео, разработанные для эффективных реализаций HDL. Можно сгенерировать HDL-код из этих алгоритмов, используя Functions (Vision HDL Toolbox) и Blocks (Vision HDL Toolbox). Оба рабочих процессов приведены в этом примере. Чтобы спроектировать модуль на основе FPGA, замените функции из Image Processing Toolbox на их дружественные к HDL аналоги из Vision HDL Toolbox. Этот пример заменяет imfilter в поведенческой модели с visionhdl.ImageFilter Системный объект в MATLAB или Image Filter блок в Simulink.

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

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

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

Сгенерируйте HDL-код из MATLAB

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

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

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

В этом примере проект содержит системный объект 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 читается на размытом изображении. The 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. Смотрите Accelerate a Pixel-Streaming Design Using MATLAB Coder (Vision HDL Toolbox).

Шаг 4: Сгенерируйте HDL-код

Как только вы удовлетворены результатами FPGA-целевой модели, можно использовать HDL Coder, чтобы сгенерировать 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 Coder.

Сгенерируйте HDL-код из Simulink

Шаг 1: Создайте HDL-оптимизированную модель

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

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

Модель читается на размытом изображении. Блок Frame To Pixels преобразует изображение с полным кадром в поток пикселей, а блок Pixels To Frame преобразует поток пикселей обратно в изображение с полным кадром. HDL-система повышения четкости изображения содержит блок Image Filter, который является HDL-дружественным аналогом в Vision HDL Toolbox imfilter функция, представленная в поведенческой модели.

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

Сконфигурируйте блок Image Filter с теми же коэффициентами заточки и методом заполнения, что и в поведенческой модели, как показано на масках ниже.

Шаг 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 пикселей, 38554 imgOut отличаются от imgSharp. Однако максимальное различие в интенсивности равно 1. В шкале от 0 до 255 это различие визуально незаметно. (Это то же объяснение, что и в шаге 3 в разделе «Генерация HDL-кода из MATLAB».)

Шаг 3: Сгенерируйте HDL-код

Как только вы удовлетворены результатами FPGA-целевой модели, можно использовать HDL Coder, чтобы сгенерировать 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;
Для просмотра документации необходимо авторизоваться на сайте