Сгенерируйте 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. Реплицируйте проект с помощью алгоритмов, интерфейсов и типов данных, подходящих для FPGAs и поддерживаемых для генерации 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.000547 seconds.

Оптимизированные HDL конструктивные соображения

Три ключевых изменения должны быть внесены, чтобы включить генерацию HDL-кода.

  • Используйте благоприятные для HDL алгоритмы: функции в Image Processing Toolbox не поддерживают генерацию HDL-кода. Vision HDL Toolbox предоставляет алгоритмы обработки изображений и обработки видеоданных, спроектированные для эффективных реализаций HDL. Можно сгенерировать HDL-код из этих алгоритмов с помощью Системных объектов в MATLAB и блоков в Simulink. Оба рабочих процесса обеспечиваются в этом примере. Чтобы спроектировать основанный на 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 предоставляет пикселю потоковой передачи интерфейсную и автоматическую реализацию памяти, чтобы решить проблемы общего умысла при предназначении для FPGAs и ASICs. Для получения дополнительной информации о пиксельном протоколе потоковой передачи, используемом Системными объектами от Vision HDL Toolbox, смотрите, что пиксель потоковой передачи взаимодействует через интерфейс.

  • Используйте представление данных фиксированной точки: Функции из Image Processing Toolbox выполняют алгоритмы обработки видеоданных в или целочисленной области с плавающей точкой. Системные объекты и блоки из Vision HDL Toolbox требуют, чтобы данные фиксированной точки сгенерировали HDL-код, чтобы предназначаться для FPGAs и ASICs. Преобразование проекта к фиксированной точке может ввести ошибку квантования. Поэтому благоприятная для 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 читает в размытом изображении. 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 146.213296 seconds to finish.

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

Как мы видим путем сравнения времени симуляции в MATLAB с той из поведенческой модели, передающий потоком пиксель протокол вводит значительные издержки. Можно использовать MATLAB Coder™, чтобы ускорить передающую потоком пиксель симуляцию в MATLAB. Смотрите Ускоряют Передающий потоком пиксель Проект Используя MATLAB Coder.

Шаг 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-код от 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 36.762625 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;