В этом примере показано, как использовать 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 алгоритмы: функции в 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 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.
Шаг 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;