В этом примере показано, как развернуть модель преобразователя Simscape™ buck на программируемом модуле ввода-вывода Speedgoat IO334 Simulink ®, а затем запустить модель в режиме реального времени с размером шага выборки до 1 микросекунды. В этом примере используется топология преобразователя DCDC, чтобы показать, как подготовить модель силового электронного преобразователя для моделирования аппаратного обеспечения в цикле (HIL) на целевой машине Speedgoat в реальном времени.
Для использования этого рабочего процесса:
Преобразование модели в модель реализации, совместимую с HDL, с помощью Simscape HDL Workflow Advisor
Создайте код HDL и битовый поток FPGA для модуля IO334 с помощью помощника по рабочим процессам HDL.
Развертывание модели в режиме реального времени на машине Speedgoat в режиме реального времени с помощью Simulink Real-Time.
Модель работает в течение 1us до генерации кода HDL, а затем в течение 50us на процессоре в реальном времени. Чтобы создать код HDL и битовый поток FPGA, в примере показано, как запустить сценарий рабочего процесса HDL из командной строки. Пример использования пользовательского интерфейса помощника по рабочим процессам для запуска этого рабочего процесса см. в разделе Аппаратная реализация модели Simscape в модулях ввода-вывода FPGA Speedgoat.
Перед развертыванием алгоритма на модуле ввода-вывода Speedgoat:
1. Установите последнюю версию Xilinx ® Vivado ®, указанную в разделе Поддержка языка HDL и Поддерживаемые сторонние инструменты и оборудование.
Затем установите путь к установленному исполняемому файлу Xilinx Vivado с помощью hdlsetuptoolpath функция.
hdlsetuptoolpath('ToolName','Xilinx Vivado','ToolPath','C:\Xilinx\Vivado\2019.2\bin\vivado.bat')
2. Для моделирования в реальном времени настройте среду разработки и параметры целевого компьютера. См. раздел Начало работы с Simulink Real-Time (Simulink Real-Time).
3. Установите библиотеку Speedgoat Library и пакеты интеграции кодеров HDL Speedgoat. См. раздел Установка пакетов интеграции кодеров HDL Speedgoat.
Для просмотра модели конвертера баков выполните следующую команду:
open_system('sschdlexBuckConverterExample')
Эта модель изменена для развертывания в реальном времени и сохранена как sschdlex_IO334_BuckConverter. Модель была разделена на части, которые выполняются на FPGA, и части, которые выполняются на CPU. Детали внутри зеленого цвета FPGA выполнение подсистемы на FPGA. Компоненты вне этой подсистемы работают на CPU в режиме реального времени.
open_system('sschdlex_IO334_BuckConverter') set_param('sschdlex_IO334_BuckConverter', 'SimulationCommand', 'Update')

Код VHDL генерируется для блоков, находящихся в подсистеме FPGA зеленого цвета, содержащей генератор PWM и преобразователь баков. Затем код развертывается в FPGA на плате модуля IO334. Выходные сигналы субсистемы отображаются на интерфейсы DAC. Выходные сигналы от подсистемы Buck Converter масштабируются в пределах 10V диапазон и преобразованный для использования uint16 типы данных. 50 выборки упаковываются в один кадр для регистрации выходных сигналов на CPU.
open_system('sschdlex_IO334_BuckConverter/FPGA')

Для просмотра модели конвертера баков дважды щелкните подсистему конвертера баков. Понижающий преобразователь - это модель преобразователя мощности, которая понижает входное напряжение на выходе. Напряжение на выходе понижается на рабочий цикл, D. Выходное напряжение, Vout, рассчитывается как Vin/D
open_system('sschdlex_IO334_BuckConverter/FPGA/Buck Converter')

Вход моделирования представляет собой пошаговую волну рабочего цикла от 0.2 кому 0.8. Входные сигналы, которые включают входное напряжение постоянного тока, частоту ШИМ и рабочий цикл, генерируются на верхнем уровне модели. Время образца для модели Simscape устанавливается равным 1us. Регистрация сигналов включена на верхнем уровне модели.
sim('sschdlex_IO334_BuckConverter') % Display the buck converter output signals in SDI Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout(3,1); allIDs2 = Simulink.sdi.getAllRunIDs; runID2 = allIDs2(end); run2 = Simulink.sdi.getRun(runID2); run2.name = 'Simscape Desktop Simulation'; run2.getAllSignals; plotOnSubPlot(run2.getSignalsByName('Vout'),1,1,true); plotOnSubPlot(run2.getSignalsByName('Iinductor'),2,1,true); plotOnSubPlot(run2.getSignalsByName('Vdiode'),3,1,true); Simulink.sdi.view;

Для обеспечения совместимости генерации кода HDL запустите Simscape HDL Workflow Advisor для создания модели реализации HDL.
Решатель Simscape настроен на выполнение двух итераций на каждом шаге образца. Помощник Simscape HDL Workflow Advisor использует настройки решателя на следующем шаге для детерминированного поведения в реальном времени.
set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','DoFixedCost','on') set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','MaxNonlinIter','2')
Чтобы открыть Advisor, запустите sschdladvisor функция для модели:
sschdladvisor('sschdlex_IO334_BuckConverter')
### Running Simscape HDL Workflow Advisor for <a href="matlab:(sschdlex_IO334_BuckConverter)">sschdlex_IO334_BuckConverter</a>
Чтобы создать модель реализации, в Simscape HDL Workflow Advisor сохраните параметры по умолчанию для задач, а затем запустите задачи. Запустите задачи в Advisor, нажав кнопку Выполнить все. Ссылка на модель отображается в задаче Создать модель внедрения. Эта модель имеет то же имя, что и исходная модель с префиксом gmStateSpaceHDL_.
Чтобы открыть модель реализации, щелкните ссылку в задаче Создать модель реализации.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'SimulationCommand', 'Update')

Модель содержит коммутируемую линейную замену Simulink исходной модели конвертера buck. Вы видите, что модель Simscape была заменена.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter');

Модель реализации заменяет подсистему Simscape на HDL-совместимый алгоритм, который выполняет вычисления пространства состояний. При навигации внутри этой подсистемы отображается несколько блоков задержки, сумматоров и матричного умножения, которые моделируют уравнения состояния-пространства. Блоки From и Goto внутри этой подсистемы обеспечивают тот же вход, что и исходная модель, для HDL Subsystem.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter/HDL Subsystem/HDL Algorithm')

Тип данных выходных сигналов бак-преобразователя устанавливается в плавающую точку с одной точностью для генерации кода ЛПВП.
set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification','OutDataTypeStr','single'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification1','OutDataTypeStr','single'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification2','OutDataTypeStr','single'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification3','OutDataTypeStr','single'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Signal Specification4','OutDataTypeStr','single');
В Simulink можно смоделировать модель переключаемого линейного состояния-пространства преобразователя buck и отобразить сигналы в инспекторе данных моделирования. Сравнение прогонов показывает, что числовые результаты совпадают.
Моделирование модели внедрения ЛПВП.
sim('gmStateSpaceHDL_sschdlex_IO334_BuckConverte') % % Display output signals of buck converter Simscape model in Simulation % Data Inspector. Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout(3,1); allIDs2 = Simulink.sdi.getAllRunIDs; runID2 = allIDs2(end); run2 = Simulink.sdi.getRun(runID2); run2.name = 'HDL Desktop Simulation'; run2.getAllSignals; plotOnSubPlot(run2.getSignalsByName('Vout'),1,1,true); plotOnSubPlot(run2.getSignalsByName('Iinductor'),2,1,true); plotOnSubPlot(run2.getSignalsByName('Vdiode'),3,1,true); Simulink.sdi.view;

Чтобы убедиться, что модель реализации HDL соответствует исходной модели Simscape, создайте модель проверки состояния пространства. В задаче Создать модель реализации установите флажок Генерировать логику проверки для модели реализации и затем запустите эту задачу. При моделировании модели не отображаются утверждения, указывающие на совпадение числовых результатов. См. раздел Проверка модели реализации HDL в алгоритме Simscape.
Консультант по рабочим процессам HDL помогает создавать коды HDL и разрабатывать FPGA. Используйте Advisor для:
Проверьте модель на совместимость генерации кода HDL и исправьте несовместимые настройки.
Создание кода HDL, тестового стенда и сценариев для создания и запуска кода и тестового стенда.
Выполните синтез, анализ синхронизации и развертывание сгенерированного кода на модулях SoC, FPGA и Speedgoat I/O.
В модели запускается Advisor для подсистемы FPGA. Чтобы открыть помощник по рабочим процессам HDL для подсистемы внутри модели, используйте hdladvisor функция. Например:
hdladvisor('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA')
Чтобы узнать о задачах в Advisor, щелкните эту задачу правой кнопкой мыши и выберите «Что это?». См. раздел Начало работы с помощником по рабочим процессам HDL.
Для быстрого создания прототипов экспортируйте параметры помощника по рабочим процессам HDL в сценарий. Сценарий представляет собой файл MATLAB ®, запускаемый из командной строки. Можно изменить и запустить сценарий или импортировать настройки в пользовательский интерфейс помощника по рабочим процессам HDL. См. раздел Запуск потока операций HDL со сценарием.
В этом примере показано, как запустить сценарий рабочего процесса HDL. Чтобы создать модель интерфейса Simulink в реальном времени, откройте и запустите этот сценарий MATLAB.
edit('hdlworkflow_buck_IO334')
%% ------------------------------------------------------------------------ % This script contains the model, target settings, interface mapping, and % the Workflow Configuration settings for generating HDL code for the HDL % implementation model generated for the buck converter model, and for % deploying the code to the FPGA on board the Speedgoat IO334-325K module. %% ----------------------------------------------------------------------- %% Set Parameters for HDL Code Generation % Model HDL parameters % ------------------------------------------------------------------------- hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'FloatingPointTargetConfiguration', hdlcoder.createFloatingPointTargetConfig('NativeFloatingPoint', 'LatencyStrategy', 'MIN')); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'HDLSubsystem', 'gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'Oversampling', 100); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'ScalarizePorts', 'DUTLevel'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'TargetFrequency', 200); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'Workflow', 'Simulink Real-Time FPGA I/O'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'TargetPlatform', 'Speedgoat IO334-325k'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'AdaptivePipelining', 'off'); %% Map DUT Ports to Target Interfaces % Input port mapping % ------------------------------------------------------------------------- % All input signals to the "FPGA" subsystem are mapped to the PCIe % interface. I.e. these signals will be transferred from the CPU of the % real-time target machine to the IO334 FPGA over the PCIe bus. hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/PWM Period', 'IOInterface', 'PCIe Interface'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Duty Cycle', 'IOInterface', 'PCIe Interface'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DC Input Voltage', 'IOInterface', 'PCIe Interface'); % Output port mapping % ------------------------------------------------------------------------- % The scaled output signals of the converter are mapped to the analog % output interface of the IO334. hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Out', 'IOInterface', 'IO334 AO Data [0:15]'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Out', 'IOInterfaceMapping', 'Channel 01'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Diode', 'IOInterface', 'IO334 AO Data [0:15]'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC V Diode', 'IOInterfaceMapping', 'Channel 02'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC I Inductor', 'IOInterface', 'IO334 AO Data [0:15]'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC I Inductor', 'IOInterfaceMapping', 'Channel 03'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC Trigger', 'IOInterface', 'IO334 AO Trigger [0:1]'); hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/DAC Trigger', 'IOInterfaceMapping', 'Channel 01 to 08'); % The signal frames are mapped to PCIe registers. They are read by the CPU for data logging. hdlset_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/PCIe Out', 'IOInterface', 'PCIe Interface'); %% Workflow Configuration Settings % HDL Workflow Advisor is opened with the following settings. hWC = hdlcoder.WorkflowConfig('SynthesisTool','Xilinx Vivado','TargetWorkflow','Simulink Real-Time FPGA I/O'); % Specify the top level project directory. hWC.ProjectFolder = 'hdl_prj'; hWC.ReferenceDesignToolVersion = '2019.2'; % Set Workflow tasks to run. hWC.RunTaskGenerateRTLCodeAndIPCore = true; hWC.RunTaskCreateProject = true; hWC.RunTaskBuildFPGABitstream = true; hWC.RunTaskGenerateSimulinkRealTimeInterface = true; %% Run the Workflow hdlcoder.runWorkflow('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA', hWC);
Выполнение сценария рабочего процесса генерирует код RTL и ядро IP, создает проект Vivado, строит битовый поток FPGA, а затем генерирует модель интерфейса Simulink в реальном времени.

Перед развертыванием модели на целевой машине Speedgoat в реальном времени:
1. Установите время выборки для всех блоков, работающих на ЦП целевой машины Speedgoat в реальном времени, равным 50us (включая блоки драйверов для FPGA).
generated_model = gcs; Ts = 50e-6; set_param([generated_model,'/FPGA'],'ts','Ts');
2. Установка для инспектора данных моделирования значения «Обработка ввода» Columns as channels (frame based) для сигналов PCIe_V_out_frame, PCIe_V_diode_frame и PCIe_I_inductor_frame. Внутри маски File Log блоки, щелкните правой кнопкой мыши символ регистрации и перейдите в диалоговое окно «Свойства инструментария». Для отображения сигнала регистрации может потребоваться обновить модель.
set_param(generated_model, 'SimulationCommand', 'update');

Кроме того, с помощью этих команд можно установить режим регистрации сигналов на основе кадров.
Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log/Demux'], 1,'frame'); Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log 1/Demux'], 1,'frame'); Simulink.sdi.setSignalInputProcessingMode([generated_model,'/File Log 2/Demux'], 1,'frame');
Теперь модель можно развернуть на целевой машине Speedgoat в реальном времени. Модель buck converter автоматически загружается в FPGA на IO334.
Подключитесь к целевой машине Speedgoat в реальном времени.
tg = slrealtime; tg.connect;
Постройте и загрузите модель на целевой компьютер.
rtwbuild(generated_model); tg.load(generated_model);
Запустите выполнение модели.
tg.start; pause(10);
Блоки регистрации файлов хранят сигналы на твердотельном накопителе целевой машины. Данные автоматически загружаются на главный компьютер после остановки модели. Данные визуализируются в инспекторе данных моделирования. Можно проверить, что результаты моделирования в реальном времени соответствуют исходной модели Simscape.
Simulink.sdi.setSubPlotLayout(3,1);
allIDs = Simulink.sdi.getAllRunIDs;
runID = allIDs(end);
run = Simulink.sdi.getRun(runID);
run.name = 'Real Time Simulation on IO334';
run.getAllSignals plotOnSubPlot(run.getSignalsByName('PCIe_V_out_frame'),1,1,true); plotOnSubPlot(run.getSignalsByName('PCIe_I_inductor_frame'),2,1,true); plotOnSubPlot(run.getSignalsByName('PCIe_V_diode_frame'),3,1,true);
Simulink.sdi.view

В качестве альтернативы можно измерить сигналы на аналоговом выходе IO334. На этом рисунке показан график сигналов в MATLAB.
