В этом примере показано, как развернуть модель конвертера Simscape™ buck на модуль ввода-вывода Speedgoat IO334 Simulink ®, а затем запустить модель в реальном времени при размере шага выборки, равном 1 микросекунде. Пример использует топологию преобразователя DCDC, чтобы показать, как подготовить степень модель электронного преобразователя к оборудованию в цикле (HIL) симуляции на машину реального времени Speedgoat.
Чтобы использовать этот рабочий процесс:
Преобразуйте свою модель в HDL-совместимую модель реализации с помощью Simscape HDL Workflow Advisor
Сгенерируйте HDL-код и битовый поток FPGA для модуля IO334 с помощью HDL Workflow Advisor.
Разверните модель реального времени на машине Speedgoat в реальном времени с помощью Simulink Real-Time.
Модель работает во шаге расчета 1us до генерации HDL-кода, а затем в 50us на центральном процессоре в режиме реального времени. Чтобы сгенерировать HDL-код и битовый поток FPGA, в примере показано, как запустить скрипт рабочего процесса из командной строки. Для примера, который показывает, как можно использовать интерфейс пользователя Workflow Advisor для запуска этого рабочего процесса, смотрите Оборудование в цикле Реализация модели Simscape на ввод-вывод модулях Speedgoat FPGA.
Перед развертыванием алгоритма на модуле Speedgoat IO:
1. Установите последнюю версию Xilinx ® Vivado ®, указанную в HDL Language Support и поддерживаемых сторонних программах и оборудовании.
Затем установите инструмент путь к установленному исполняемому файлу 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 и пакеты Speedgoat HDL Coder Integration. См. раздел Установка пакетов HDL Coder Интегрирование Speedgoat.
Чтобы увидеть модель понижающего конвертера, запустите эту команду:
open_system('sschdlexBuckConverterExample')
Эта модель изменена для развертывания приложений и сохранена как sschdlex_IO334_BuckConverter
. Модель была разделена на части, выполняемые в FPGA, и части, выполняемые в центральный процессор. Части внутри зеленого FPGA
выполнение подсистемы на ПЛИС. Части за пределами этой подсистемы запускаются на центральном процессоре в режиме реального времени.
open_system('sschdlex_IO334_BuckConverter') set_param('sschdlex_IO334_BuckConverter', 'SimulationCommand', 'Update')
Вы генерируете код VHDL для блоков, которые находятся внутри зеленой подсистемы FPGA, которая содержит генератор PWM и понижающий конвертер. Код затем развертывается в FPGA на борту модуля IO334. Выходы подсистемы сопоставлены с интерфейсами DAC. Сигналы выхода от подсистемы Понижающего конвертера масштабируются в 10V
область значений и преобразована в использование uint16
типы данных. 50
выборки упаковываются вместе в одну систему координат для регистрации выходных сигналов на центральном процессоре.
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, чтобы сгенерировать модель реализации.
Решатель 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, нажав кнопку Run all. Вы видите ссылку на модель в задаче Генерация модели реализации. Эта модель имеет то же имя что и ваша исходная модель с префиксом gmStateSpaceHDL_
.
Чтобы открыть модель реализации, щелкните ссылку в задаче Генерация модели реализации.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte'); set_param('gmStateSpaceHDL_sschdlex_IO334_BuckConverte', 'SimulationCommand', 'Update')
Модель содержит переключённую линейную замену Simulink исходной модели понижающего конвертера. Вы видите, что модель Simscape была заменена.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter');
Модель реализации заменяет подсистему Simscape на HDL-совместимый алгоритм, который выполняет расчеты пространства состояний. Когда вы перемещаетесь внутри этой подсистемы, вы видите несколько задержек, сумматоров и блоков Matrix Multiply, которые моделируют уравнения пространства состояний. Блоки From и Goto внутри этой подсистемы обеспечивают тот же вход, что и исходная модель, HDL Subsystem
.
open_system('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA/Buck Converter/HDL Subsystem/HDL Algorithm')
Тип данных выходных сигналов понижающего конвертера устанавливается на одну точность с плавающей точкой для генерации HDL-кода.
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 и отобразить сигналы в Данные моделирования Inspector. Сравнение запусков показывает, что числовые результаты совпадают.
Моделируйте модель реализации HDL.
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 Workflow Advisor поможет вам с генерацией HDL-кода и процессом проекта FPGA. Используйте Advisor для:
Проверьте модель на совместимость генерации HDL-кода и исправьте несовместимые настройки.
Сгенерируйте HDL-код, испытательный стенд и скрипты для создания и запуска кода и испытательного стенда.
Выполните синтез, анализ временных параметров и развертывание сгенерированного кода на SoCs, FPGA и модулях ввода-вывода Speedgoat.
Вы запускаете Advisor для подсистемы FPGA в своей модели. Чтобы открыть HDL Workflow Advisor для подсистемы в модели, используйте hdladvisor
функция. Для примера:
hdladvisor('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA')
Чтобы узнать о задачах в Advisor, щелкните правой кнопкой мыши эту задачу и выберите «Что это?». См. Раздел «Начало работы с HDL Workflow Advisor».
Для быстрого прототипирования экспортируйте параметры HDL Workflow Advisor в скрипт. Скрипт является файлом MATLAB ®, который вы запускаете из командной строки. Можно изменить и запустить скрипт или импортировать настройки в интерфейс пользователя HDL Workflow Advisor. См. раздел Запуск рабочего процесса HDL со скриптом.
В этом примере показано, как запустить HDL скрипт рабочего процесса. Чтобы сгенерировать модель Simulink Real-Time Interface, откройте и запустите этот скрипт 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 Real-Time Interface.
Перед развертыванием модели на машину реального времени Speedgoat:
1. Установите шаг расчета для всех блоков, работающих на центральном процессоре машины реального времени Speedgoat, равным 50us (включая блоки драйверов для FPGA).
generated_model = gcs; Ts = 50e-6; set_param([generated_model,'/FPGA'],'ts','Ts');
2. Установите настройку Данных моделирования Inspector Входа обработки равной 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. Модель понижающего конвертера автоматически загружается в FPGA на IO334.
Подключитесь к машине реального времени Speedgoat.
tg = slrealtime; tg.connect;
Создайте и загрузите модель на целевую машину.
rtwbuild(generated_model); tg.load(generated_model);
Запустите выполнение модели.
tg.start; pause(10);
Блоки регистрации файлов хранят сигналы на SSD целевой машины. Данные автоматически загружаются в хост-компьютер после остановки модели. Данные визуализируются в Данные Моделирования Inspector. Можно проверить, что результаты симуляции в реальном времени совпадают с исходной моделью 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.