FPGA-in-the-loop (FIL) позволяет выполнять моделирование Simulink ® или MATLAB ®, синхронизированное с конструкцией HDL, выполняемой на плате FPGA. Эта связь между симулятором и платой позволяет проверить реализацию HDL непосредственно по алгоритмам Simulink или MATLAB. Можно применить реальные данные и тестовые сценарии из этих алгоритмов к конструкции HDL, которая выполняется на FPGA.
В Simulink можно использовать блоки FIL Frame To Pixels и FIL Pixels To Frame для ускорения обмена данными между Simulink и платой FPGA. В MATLAB можно изменить сгенерированный код для ускорения связи с платой FPGA.
В этом примере показано, как изменить созданную модель FPGA-in-the-loop (FIL) для более эффективного моделирования протокола потокового видео Vision HDL Toolbox™.
Автоматически генерируемая модель FIL
При создании файла программирования для цели FIL в Simulink помощник по рабочим процессам HDL создает модель для сравнения моделирования FIL с конструкцией Simulink. Дополнительные сведения о создании артефактов FIL для модели Simulink см. в разделе Моделирование FIL с помощью помощника по рабочим процессам HDL для Simulink (проверка HDL).
Для систем Vision HDL Toolbox блок FIL в созданной модели воспроизводит потоковый интерфейс пикселей и отправляет по одному пикселю в FPGA. Показанная модель была создана на основе примерной модели в разделе «Разработка алгоритмов обработки видео для ЛПВП в Simulink».

Верхняя часть модели воспроизводит проект Simulink. Генерируемый блок FIL в нижней части взаимодействует с FPGA. Подсистема ToFILSrc копирует входной пиксельный поток блока алгоритма HDL в подсистему StartFILSrc. Подсистема ToFILSink копирует выходной сигнал пиксельного потока блока алгоритма HDL в подсистему сравнения, где он сравнивается с выходным сигналом блока Algorithm_fil HDL. Для обработки изображений и видео эта настройка является медленной, поскольку модель посылает только один пиксель и связанные с ним управляющие сигналы в каждом пакете на плату FPGA и с нее.
Измененная модель FIL для потоковой передачи пикселей
Для улучшения пропускной способности связи с платой FPGA можно использовать сгенерированный блок FIL с векторным вводом, а не потоковой передачей. Этот пример включает модель FILSimulinkWireVHTExample.slx, созданную путем изменения созданной модели FIL. Измененная модель использует блоки FIL Frame To Pixels и FIL Pixels To Frame для отправки одного кадра за раз в сгенерированный блок FIL. Нельзя запустить эту модель как есть. Необходимо создать собственный файл блока FIL и битового потока, в котором используются настройки платы и подключения.

Чтобы преобразовать созданную модель в измененную, выполните следующие действия.
Удалите подсистемы «ToFILSrc», «StartFILSrc», «ToFILSink» и «Compare» и создайте ветвь на кадровом входе блока «Frame To Pixels».
Вставьте блок FIL Frame To Pixels перед блоком Algorithm_fil HDL. Вставьте блок FIL Pixels To Frame после блока HDL Algorithm_fil.
Ответвление выходного кадра блока Pixels To Frame для сравнения. Можно сравнить весь кадр сразу с блоком Diff. Сравните validOut сигналы с использованием блока исключающее ИЛИ.
В блоках FIL Frame To Pixels и FIL Pixels To Frame установите параметр Video format таким образом, чтобы он соответствовал формату видео блоков Frame To Pixels и Pixels To Frame.
Задайте размер вектора в блоках FIL Frame To Pixels и FIL Pixels To Frame равным Frame или Line. Размер вывода вектора FIL Frame To Pixels должен соответствовать размеру ввода вектора FIL Pixels To Frame. Размер вектора интерфейсов блока FIL не изменяет сгенерированный код HDL. Это влияет только на размер пакета связи между симулятором и платой FPGA.
Модифицированная модель посылает полный кадр на плату FPGA в каждом пакете, значительно повышая эффективность линии связи.
При использовании FPGA-in-the-Loop с многопиксельной потоковой конструкцией необходимо выровнять пиксельные порты до векторов для ввода и вывода блока FIL. Блоки селектора используются для разделения входных потоков пикселей на векторы NumPixels, а блок векторной конкатенации используется для рекомбинации выходных векторов.
Если каждый пиксель представлен более чем одним компонентом, блок FIL Frame To Pixels имеет один порт данных на компонент, а блок FIL имеет порты NumPixels × NumComponents. Разбейте каждую матрицу компонентов на векторы NumPixels.
В этой модели показана мультипиксельная однокомпонентная конструкция.
![]()
Для генерации кода VHDL в меню «Параметры конфигурации» > «Создание кода HDL» > «Глобальные настройки» > «Порты» задайте для параметра Scalarize ports значение DUT Level.
![]()
В этом примере показано, как изменить сгенерированный сценарий FPGA-in-the-loop (FIL) для более эффективного моделирования протокола потокового видео Vision HDL Toolbox™. Дополнительные сведения о создании артефактов FIL для системного object™ MATLAB ® см. в разделе Моделирование FIL с помощью консультанта по рабочим процессам HDL для MATLAB (проверка HDL ).
Автоматически генерируемая функция FIL
При создании файла программирования для цели FIL в MATLAB консультант по рабочим процессам HDL создает тестовый стенд для сравнения моделирования FIL с конструкцией MATLAB. Для проектов панели инструментов Vision HDL DUTname_fil функция на тестовом стенде реплицирует интерфейс потоковой передачи пикселей и отправляет по одному пикселю за раз в FPGA. DUTname - это имя функции, из которой был создан код HDL.
Этот фрагмент кода берется из созданного стенда TBname_fil.m, созданный из примера сценария в Pixel-Streaming Design в MATLAB. Код вызывает сгенерированный DUTname_fil функция один раз для каждого пикселя в кадре.
for p = 1:numPixPerFrm [pixOutVec( p ),ctrlOutVec( p )] = PixelStreamingDesignHDLDesign_fil( pixInVec( p ), ctrlInVec( p ) ); end
Произведенный DUTname_fil функция вызывает функцию, предназначенную для HDL. Он также вызывает DUTname_sysobj_fil , которая содержит объект System, который подключается к FPGA. DUTname_fil сравнивает выходные данные двух функций для проверки соответствия реализации FPGA исходным результатам MATLAB. Этот фрагмент находится в файле DUTname_fil.m.
% Call the original MATLAB function to get reference signal
[ref_pixOut,tmp_ctrlOut] = PixelStreamingDesignHDLDesign(pixIn,ctrlIn);
...
% Run FPGA-in-the-Loop [pixOut,ctrlOut_hStart,ctrlOut_hEnd,ctrlOut_vStart,ctrlOut_vEnd,ctrlOut_valid] ... = PixelStreamingDesignHDLDesign_sysobj_fil(pixIn,ctrlIn_hStart,ctrlIn_hEnd,ctrlIn_vStart,ctrlIn_vEnd,ctrlIn_valid);
...
% Verify the FPGA-in-the-Loop output hdlverifier.assert(pixOut,ref_pixOut,'pixOut');
Для обработки изображений и видео эта настройка является медленной, поскольку функция посылает только один пиксель и связанные с ним управляющие сигналы в каждом пакете на плату FPGA и с нее.
Модифицированный тест-стенд FIL для потоковой передачи пикселей
Для улучшения пропускной способности связи с платой FPGA можно изменить автоматически созданный стенд тестирования. TBname_fil.m. Модифицированный стенд вызывает объект FIL System напрямую, с одним кадром за раз. Эти фрагменты из PixelStreamingDesignHDLTestBench_fil_frame.m сценарий, измененный из артефактов FIL, созданных из примера сценария в Pixel-Streaming Design в MATLAB. Этот сценарий нельзя запустить как есть. Необходимо создать собственный объект, функцию и файл битового потока FIL System, в которых используются настройки платы и подключения. Затем измените версию созданного стенда тестирования или измените этот сценарий, чтобы использовать созданный объект FIL.
Объявите экземпляр созданного объекта FIL System.
fil = class_PixelStreamingDesignHDLDesign_sysobj;
Закомментируйте цикл над пикселями в кадре.
% for p = 1:numPixPerFrm % [pixOutVec( p ),ctrlOutVec( p )] = PixelStreamingDesignHDLDesign_fil( pixInVec( p ), ctrlInVec( p ) ); % end
Замените закомментированный цикл приведенным ниже кодом. Позвоните в step способ fil объект с векторами, содержащими весь кадр пикселей данных и управляющие сигналы. Передавайте каждый управляющий сигнал объекту отдельно, как вектор логических значений. Затем рекомбинируют векторы управляющих сигналов в вектор структур.
[pixOutVec,hStartOut,hEndOut,vStartOut,vEndOut,validOut] = ... step(fil,pixInVec,[ctrlInVec.hStart]',[ctrlInVec.hEnd]',[ctrlInVec.vStart]',[ctrlInVec.vEnd]',[ctrlInVec.valid]'); ctrlOutVec = arrayfun(@(hStart,hEnd,vStart,vEnd,valid) ... struct('hStart',hStart,'hEnd',hEnd,'vStart',vStart,'vEnd',vEnd,'valid',valid),... hStartOut,hEndOut,vStartOut,vEndOut,validOut);
Эти изменения кода устраняют пиксельную проверку результатов FIL относительно результатов MATLAB. При необходимости можно добавить цикл пикселей для вызова опорной функции и покадровое сравнение результатов. Однако вызов исходной функции для привязки замедляет моделирование.
for p = 1:numPixPerFrm [ref_pixOutVec(p),ref_ctrlOutVec(p)] = PixelStreamingDesignHDLDesign(pixInVec(p),ctrlInVec(p)); end
После звонка в fil сравните выходные векторы.
hdlverifier.assert(pixOutVec',ref_pixOutVec,'pixOut') hdlverifier.assert([ctrlOutVec.hStart],[ref_ctrlOutVec.hStart],'hStart') hdlverifier.assert([ctrlOutVec.hEnd],[ref_ctrlOutVec.hEnd],'hEnd') hdlverifier.assert([ctrlOutVec.vStart],[ref_ctrlOutVec.vStart],'vStart') hdlverifier.assert([ctrlOutVec.vEnd],[ref_ctrlOutVec.vEnd],'vEnc') hdlverifier.assert([ctrlOutVec.valid],[ref_ctrlOutVec.valid],'valid')
Этот модифицированный тестовый стенд посылает весь кадр на плату FPGA в каждом пакете, значительно повышая эффективность линии связи.