Этот пример показывает, как использовать 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.000399 seconds.
Три ключевых изменения должны быть внесены, чтобы включить генерацию 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, ваш код должен быть разделен на два файла: испытательный стенд и проект. Файл проекта используется для реализации алгоритма в 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 368.091661 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.
Шаг 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 20.761860 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;