主要内容

使用HDL工作流程脚本部署Simscape Buck转换器模型到Speedgoat IO模块

本示例展示了如何将Simscape™buck转换器模型部署到Speedgoat IO334 Simulink®可编程I/O模块,然后以最小为1微秒的样例步长实时运行该模型。该示例使用DCDC转换器拓扑来展示如何准备功率电子转换器模型,以便在Speedgoat实时目标机器上进行硬件在环(HIL)仿真。

要使用此工作流:

  1. 通过使用Simscape HDL工作流顾问,将您的模型转换为一个与HDL兼容的实现模型

  2. 通过使用HDL工作流顾问生成IO334模块的HDL代码和FPGA位流。

  3. 通过使用Simulink real-time将实时模型部署到Speedgoat实时目标机器上。

该模型在生成HDL代码之前以1us的采样时间运行,然后在CPU上实时以50us运行。为了生成HDL代码和FPGA位流,该示例演示了如何从命令行运行HDL工作流脚本。有关演示如何使用工作流顾问用户界面来运行此工作流的示例,请参见Simscape模型在快速山羊FPGA I/O模块上的硬件在环实现

设置和配置

在部署算法到Speedgoat IO模块之前:

1.安装Xilinx®Vivado®的最新版本HDL语言支持和支持的第三方工具和硬件

然后,将工具路径设置为已安装的Xilinx Vivado可执行文件hdlsetuptoolpath函数。

hdlsetuptoolpath (“ToolName”“Xilinx Vivado”“路径”“C: \ Xilinx \ Vivado \ 2019.2 \ bin \ vivado.bat '

2.对于实时仿真,设置开发环境和目标计算机设置。看到开始使用Simulink实时(实时仿真软件)

3.安装Speedgoat库和Speedgoat HDL Coder集成包。看到安装Speedgoat HDL Coder集成包

Buck变换器模型

要查看buck转换器的模型,运行以下命令:

open_system (“sschdlexBuckConverterExample”

此模型为实时部署而修改,并保存为sschdlex_IO334_BuckConverter.该模型被划分为运行在FPGA上的部分和运行在CPU上的部分。绿色内的部分FPGA子系统在FPGA上运行。子系统之外的部分实时运行在CPU上。

open_system (“sschdlex_IO334_BuckConverter”) set_param (“sschdlex_IO334_BuckConverter”“SimulationCommand”“更新”

您可以为包含PWM生成器和降压转换器的绿色FPGA子系统内部的块生成VHDL代码。然后将代码部署到IO334模块上的FPGA。子系统的输出被映射到DAC接口。来自Buck转换器子系统的输出信号在a内缩放10 v范围并转换为使用uint16数据类型。50样本被打包到一个帧中,以记录CPU上的输出信号。

open_system (“sschdlex_IO334_BuckConverter / FPGA”

要查看buck转换器模型,双击buck转换器子系统。降压变换器是一种功率变换器模型,在输出处逐步降低输入电压。输出电压随占空比d下降。输出电压,计算为文/ D

open_system (“sschdlex_IO334_BuckConverter / FPGA /巴克转换器”

运行Simscape模型的Desktop Simulation

模拟输入是占空比阶跃波0.20.8.输入信号包括直流输入电压、PWM频率和占空比产生在模型的顶层。Simscape模型的采样时间设置为1我们.在模型的顶层启用了信号日志记录。

sim卡(“sschdlex_IO334_BuckConverter”在SDI中显示降压转换器输出信号Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout (3,1);allIDs2 = Simulink.sdi.getAllRunIDs;runID2 = allIDs2(end);run2 = Simulink.sdi.getRun(runID2);run2.name =“Simscape桌面模拟”;run2.getAllSignals;plotOnSubPlot (run2.getSignalsByName (输出电压的), 1, 1,真实);plotOnSubPlot (run2.getSignalsByName (“Iinductor”)、2、1,真实);plotOnSubPlot (run2.getSignalsByName (“Vdiode”)、3、1、真实);Simulink.sdi.view;

生成HDL实现模型

为了使HDL代码生成兼容,您可以运行Simscape HDL工作流Advisor来生成一个HDL实现模型。

Simscape求解器设置为在每个示例步骤中运行两次迭代。Simscape HDL Workflow Advisor在下一步中使用求解器设置确定实时行为。

set_param ('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/求解器配置'“DoFixedCost”“上”) set_param ('sschdlex_IO334_BuckConverter/FPGA/Buck Converter/求解器配置'“MaxNonlinIter”' 2 '

要打开Advisor,请运行sschdladvisor函数为您的模型:

sschdladvisor (“sschdlex_IO334_BuckConverter”

要生成实现模型,请在Simscape HDL Workflow Advisor中保持任务的默认设置,然后运行任务。在Advisor中运行任务运行所有按钮。可以看到模型的链接生成实现模型的任务。此模型具有与您的原始模型相同的名称和前缀gmStateSpaceHDL_

为HDL代码生成准备实现模型

要打开实现模型,请单击生成实现模型的任务。

open_system (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”);set_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“SimulationCommand”“更新”

该模型包含了一个切换线性Simulink替换原有的buck变换器模型。您可以看到Simscape模型被替换了。

open_system (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /巴克转换器”);

该实现模型用执行状态空间计算的与hdl兼容的算法替换了Simscape子系统。当您在这个子系统中导航时,您会看到几个延迟、加法器和矩阵乘法块,它们为状态空间方程建模。该子系统中的From和Goto块提供与原始模型相同的输入高密度脂蛋白子系统

open_system (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/Buck转换器/HDL子系统/HDL算法'

buck转换器输出信号的数据类型设置为单精度浮点,用于HDL代码生成。

set_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /信号规范”“OutDataTypeStr”“单一”);set_param (“Specification1 gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /信号”“OutDataTypeStr”“单一”);set_param (“Specification2 gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /信号”“OutDataTypeStr”“单一”);set_param (“Specification3 gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /信号”“OutDataTypeStr”“单一”);set_param (“Specification4 gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /信号”“OutDataTypeStr”“单一”);

运行HDL实现模型的桌面仿真,验证HDL算法

您可以在Simulink中模拟buck变换器的开关线性状态空间模型,并在仿真数据检查器中显示信号。运行的比较表明,数值结果是一致的。

模拟HDL实现模型。

sim卡(“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”在仿真中显示buck转换器Simscape模型的输出信号%数据检查器。Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout (3,1);allIDs2 = Simulink.sdi.getAllRunIDs;runID2 = allIDs2(end);run2 = Simulink.sdi.getRun(runID2);run2.name =“HDL桌面模拟”;run2.getAllSignals;plotOnSubPlot (run2.getSignalsByName (输出电压的), 1, 1,真实);plotOnSubPlot (run2.getSignalsByName (“Iinductor”)、2、1,真实);plotOnSubPlot (run2.getSignalsByName (“Vdiode”)、3、1、真实);Simulink.sdi.view;

要验证HDL实现模型是否与原始Simscape模型匹配,请生成一个状态空间验证模型。在生成实现模型任务,选择为实现模型生成验证逻辑复选框,然后运行此任务。模拟模型不显示断言,这表明数值结果是匹配的。看到验证HDL实现模型对Simscape算法的有效性

HDL工作流顾问

HDL工作流顾问指导您通过HDL代码生成和FPGA设计过程。使用Advisor来:

  • 检查模型的HDL代码生成兼容性,并修复不兼容的设置。

  • 生成HDL代码、测试台架和脚本来构建和运行代码和测试台架。

  • 执行合成、时序分析,并将生成的代码部署到soc、fpga和Speedgoat I/O模块上。

您可以在模型中为FPGA子系统运行Advisor。要打开模型内部子系统的HDL Workflow Advisor,请使用hdladvisor函数。例如:

hdladvisor (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA”

要了解Advisor中的任务,右键单击该任务并选择这是什么?.看到开始使用HDL工作流顾问

运行工作流脚本生成Simulink实时接口模型

为了快速原型,导出HDL工作流顾问设置到一个脚本。该脚本是一个MATLAB®文件,您可以从命令行运行。您可以修改并运行脚本,或者将设置导入到HDL Workflow Advisor用户界面中。看到使用脚本运行HDL工作流

这个例子展示了如何运行HDL工作流脚本。要生成一个Simulink实时接口模型,打开并运行这个MATLAB脚本。

编辑(“hdlworkflow_buck_IO334”
%% ------------------------------------------------------------------------此脚本包含模型、目标设置、接口映射和为HDL生成HDL代码的工作流配置设置%的实现模型为降压转换器模型生成,而为%将代码部署到快速山羊IO334-325K模块上的FPGA。%% -----------------------------------------------------------------------设置HDL代码生成参数模型HDL参数% -------------------------------------------------------------------------hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“FloatingPointTargetConfiguration”hdlcoder.createFloatingPointTargetConfig (“NativeFloatingPoint”“LatencyStrategy”“最小值”));hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“HDLSubsystem”“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA”);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”过采样的, 100);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“ScalarizePorts”“DUTLevel”);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“TargetFrequency”, 200);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“工作流程”'Simulink实时FPGA I/O');hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“TargetPlatform”“Speedgoat io334 - 325 k”);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte”“AdaptivePipelining”“关闭”);将DUT端口映射到目标接口输入端口映射% -------------------------------------------------------------------------“FPGA”子系统的所有输入信号都映射到PCIe上%的接口。即这些信号将从CPU的%实时目标机到IO334 FPGA通过PCIe总线。hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA / PWM周期”“IOInterface”“作为PCIe接口”);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /责任周期”“IOInterface”“作为PCIe接口”);hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DC输入电压'“IOInterface”“作为PCIe接口”);输出端口映射% -------------------------------------------------------------------------转换器的缩放输出信号映射到模拟信号IO334的%输出接口。hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC V Out'“IOInterface”'IO334 AO Data [0:15]');hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC V Out'“IOInterfaceMapping”“01频道”);hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC V二极管'“IOInterface”'IO334 AO Data [0:15]');hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC V二极管'“IOInterfaceMapping”“频道02”);hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC I电感'“IOInterface”'IO334 AO Data [0:15]');hdlset_param (' gmstatespacehdl_sschdlex_io334_buckconvert /FPGA/DAC I电感'“IOInterfaceMapping”“频道03”);hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA / DAC触发”“IOInterface”'IO334 AO Trigger [0:1]');hdlset_param (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA / DAC触发”“IOInterfaceMapping”“01至08频道”);信号帧映射到PCIe寄存器。它们由CPU读取以记录数据。hdlset_param (“作为PCIe出gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA /”“IOInterface”“作为PCIe接口”);%%工作流配置设置使用以下设置打开HDL工作流顾问。hWC = hdlcoder。WorkflowConfig (“SynthesisTool”“Xilinx Vivado”“TargetWorkflow”'Simulink实时FPGA I/O');指定顶级项目目录。中国。ProjectFolder =“hdl_prj”;中国。ReferenceDesignToolVersion =“2019.2”设置工作流任务运行。中国。runtaskgeneratertlcodeanddipcore = true;中国。RunTaskCreateProject = true;中国。RunTaskBuildFPGABitstream = true;中国。RunTaskGenerateSimulinkRealTimeInterface = true;%%运行工作流hdlcoder.runWorkflow (“gmStateSpaceHDL_sschdlex_IO334_BuckConverte / FPGA”、中国);

编写实时仿真的Simulink实时接口模型

运行工作流脚本生成RTL代码和IP核,创建Vivado项目,构建FPGA位流,然后生成Simulink实时接口模型。

在将模型部署到Speedgoat实时目标机器之前:

1.设置Speedgoat实时目标机CPU上运行的所有块的采样时间为50us(包括FPGA的驱动块)。

Generated_model = gcs;Ts = 50e-6;set_param ([generated_model,' / FPGA '],“t”“t”);

2.设置模拟数据检查器设置输入处理列作为通道(基于框架)对于信号PCIe_V_out_framePCIe_V_diode_frame而且PCIe_I_inductor_frame.里面的面具文件日志块,右键单击日志符号并导航到Instrumentation属性对话框。要显示日志信号,您可能必须更新模型。

set_param (generated_model“SimulationCommand”“更新”);

或者,您可以使用这些命令将信号记录设置为基于帧的模式。

Simulink.sdi.setSignalInputProcessingMode ([generated_model,' /文件日志/多路分配器'), 1“帧”);Simulink.sdi.setSignalInputProcessingMode ([generated_model,“/文件日志1/Demux”), 1“帧”);Simulink.sdi.setSignalInputProcessingMode ([generated_model,“/File Log 2/Demux”), 1“帧”);

连接到目标机并运行实时仿真

该模型现在可以部署到Speedgoat实时目标机器上。buck转换器模型自动加载到IO334上的FPGA上。

连接到“速羊”实时目标机。

Tg = slrealtime;tg.connect;

构建模型并将其下载到目标机器。

rtwbuild (generated_model);tg.load (generated_model);

开始模型执行。

tg.start;暂停(10);

文件日志记录块将信号存储在目标机器的SSD上。一旦模型停止,数据将自动上传到主机。数据在仿真数据检查器中可视化。您可以验证实时模拟的结果是否与原始Simscape模型相匹配。

Simulink.sdi.setSubPlotLayout (3,1);
allIDs = Simulink.sdi.getAllRunIDs;runID = allid (end);run = Simulink.sdi.getRun(runID);run.name =IO334的实时仿真
运行。getAllSignals plotOnSubPlot (run.getSignalsByName (“PCIe_V_out_frame”), 1, 1,真实);plotOnSubPlot (run.getSignalsByName (“PCIe_I_inductor_frame”)、2、1,真实);plotOnSubPlot (run.getSignalsByName (“PCIe_V_diode_frame”)、3、1、真实);
Simulink.sdi.view

或者,你可以测量IO334模拟输出的信号。这个图显示了MATLAB中信号的图形。

Baidu
map