В этом примере показано, как развернуть модель понижающего конвертера Simscape™ в модуль ввода-вывода Speedgoat IO334 Simulink®-programmable и затем запустить модель в режиме реального времени в демонстрационном размере шага всего 1 микросекунда. Пример использует топологию конвертера DCDC, чтобы показать, как подготовить вашу степень электронная модель конвертера к оборудованию в цикле (HIL) симуляция на машине реального времени Speedgoat.
Использовать этот рабочий процесс:
Преобразуйте свою модель в совместимую с HDL модель реализации при помощи HDL Workflow Advisor Simscape
Сгенерируйте HDL-код и поток битов FPGA для модуля IO334 при помощи HDL Workflow Advisor.
Разверните модель реального времени в Speedgoat taret машина в реальном времени при помощи Simulink Real-Time.
Запуски модели в шаге расчета 1us до генерации HDL-кода и затем запускаются в 50us на центральном процессоре в режиме реального времени. Чтобы сгенерировать HDL-код и поток битов FPGA, пример показывает, как запустить скрипт рабочего процесса HDL из командной строки. Для примера, который показывает, как можно использовать Советника по вопросам Рабочего процесса Пользовательский интерфейс, чтобы запустить этот рабочий процесс, смотрите Оборудование в Реализации цикла Модели Simscape на Модулях ввода-вывода FPGA Speedgoat.
Прежде, чем развернуть ваш алгоритм на модуле Speedgoat IO:
1. Установите последнюю версию Xilinx® Vivado®, как перечислено в Поддержке Языка HDL и Поддерживаемых Сторонних программах и Оборудовании.
Затем установите инструмент path на установленный исполняемый файл 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 и пакеты Интегрирования HDL Coder Speedgoat. Смотрите Установку Пакеты Интегрирования HDL Coder Speedgoat.
Чтобы видеть модель понижающего конвертера, запустите эту команду:
open_system('sschdlexBuckConverterExample')
Эта модель изменяется для развертывания приложений и сохраненная как sschdlex_IO334_BuckConverter
. Модель была разделена в части, которые работают на FPGA и частях, которые работают на центральном процессоре. Части в зеленом 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')
Вход Simulation является волной шага рабочего цикла от 0.2
к 0.8
. Входные сигналы, которые включают входное напряжение DC, частоту PWM и рабочий цикл, сгенерированы на верхнем уровне модели. Шаг расчета для модели 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-кода вы запускаете HDL Workflow Advisor Simscape, чтобы сгенерировать модель реализации HDL.
Решатель Simscape собирается запуститься для двух итераций на каждом демонстрационном шаге. HDL Workflow Advisor Simscape использует настройки решателя на следующем шаге для детерминированного поведения в реальном времени.
set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','DoFixedCost','on') set_param('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/Solver Configuration','MaxNonlinIter','2')
Чтобы открыть Советника, запустите sschdladvisor
функционируйте для своей модели:
sschdladvisor('sschdlex_IO334_BuckConverter')
### Running Simscape HDL Workflow Advisor for <a href="matlab:(sschdlex_IO334_BuckConverter)">sschdlex_IO334_BuckConverter</a>
Чтобы сгенерировать модель реализации, в HDL Workflow Advisor Simscape, сохраняют настройки по умолчанию для задач, и затем запускают задачи. Запустите задачи в Советнике путем нажатия на Run вся кнопка. Вы видите ссылку на модель в Сгенерировать задаче модели реализации. Эта модель имеет то же имя как ваша исходная модель с префиксным 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 алгоритм, который выполняет расчеты пространства состояний. Когда вы перешли в этой подсистеме, вы видите несколько задержек, сумматоров, и Умножение матриц блоки, которые моделируют уравнения пространства состояний. От и блоки 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 и отобразить сигналы в Инспекторе Данных моделирования. Сравнение запусков показывает, что числовые результаты соответствуют.
Симулируйте модель реализации 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, сгенерируйте модель валидации пространства состояний. В Сгенерировать задаче модели реализации выберите логику валидации Generate для флажка модели реализации и затем запустите эту задачу. Симуляция модели не отображает утверждения, который указывает, что числовые результаты соответствуют. Смотрите Подтверждают Модель Реализации HDL к Алгоритму Simscape.
HDL Workflow Advisor проводит вас по генерации HDL-кода и процессу проектирования FPGA. Используйте Советника:
Проверяйте модель на совместимость генерации HDL-кода и зафиксируйте несовместимые настройки.
Сгенерируйте HDL-код, испытательный стенд и скрипты, чтобы создать и запустить код и испытательный стенд.
Выполните синтез, синхронизировав анализ, и разверните сгенерированный код на SoCs, FPGAs и модулях ввода-вывода Speedgoat.
Вы запускаете Советника по подсистеме FPGA в вашей модели. Чтобы открыть HDL Workflow Advisor для подсистемы в модели, используйте hdladvisor
функция. Например:
hdladvisor('gmStateSpaceHDL_sschdlex_IO334_BuckConverte/FPGA')
Чтобы узнать о задачах в Советнике, щелкните правой кнопкой по той задаче и выберите What, Это?. Смотрите Начало работы с 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. Установите Входную обработку установки Simulation Data Inspector на Columns as channels (frame based)
для сигналов PCIe_V_out_frame
, PCIe_V_diode_frame
и PCIe_I_inductor_frame
. В маске File Log
блоки, щелкните правой кнопкой по символу логгирования и перейдите к диалоговому окну Instrumentation Properties. Чтобы заставить сигнал логгирования появиться, вам придется обновить модель.
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 целевой машины. Данные автоматически загружаются на хост - компьютер, если модель останавливается. Данные визуализируются в Инспекторе Данных моделирования. Можно проверить, что результаты симуляции в реальном времени совпадают с исходной моделью 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.