使用HDL工作流脚本部署Simscape网格绑定转换器模型到Speedgoat IO模块
本示例展示了如何将三相两级电压源转换器连接到Simscape™中建模的低压电网到Speedgoat IO334 Simulink®可编程I/O模块,以实现1微秒(us)的仿真时间步长。
通过使用子周期平均方法对转换器进行建模,可以以更高的分辨率捕获PWM信号。最大分辨率可达4ns,可模拟开关频率高于100kHz的最先进功率转换器。本例的开关频率为20kHz。
这个例子演示了如何:
通过使用Simscape HDL Workflow Advisor将您的Simscape模型转换为与HDL兼容的实现模型
生成HDL代码和
FPGA
位流的IO334模块使用HDL工作流顾问。利用Simulink real-time将实时模型部署到Speedgoat实时目标机上。
植物模型最终以1us的时间步长运行FPGA
所述控制器在所述实时系统的CPU上以50us时间步长执行。生成HDL代码和FPGA
bitstream,这个例子展示了如何从命令行运行HDL工作流脚本。您可以使用工作流顾问用户界面来运行此工作流。有关更多信息,请参见基于Speedgoat FPGA I/O模块的Simscape模型的硬件在环实现.
设置和配置
在Speedgoat IO模块上部署算法之前:
1.安装Xilinx®Vivado®的最新版本HDL语言支持和支持的第三方工具和硬件.
文件将工具路径设置为已安装的Xilinx Vivado可执行文件hdlsetuptoolpath
函数。
hdlsetuptoolpath(“ToolName”、“Xilinx Vivado”、“路径”,“C: \ Xilinx \ Vivado \ 2020.1 \ bin \ vivado.bat”)
2.进行实时仿真,设置开发环境和目标计算机设置。看到开始使用Simulink实时(实时仿真软件).
3.安装Speedgoat库和Speedgoat HDL Coder集成包。看到安装Speedgoat HDL Coder集成包.
三相两电平电压源转换器模型
使用实例查看三相两级转换器模型。
open_system(“sschdlexThreePhaseConverterWithGridExample”)
该示例模型包括一个三相两级电压源转换器,通过LC滤波器连接到低压电网。断路器可以断开转换器与电网的连接。电网侧有低压负荷,中压电网有变压器连接。
第一步,通过桌面仿真对闭环控制进行验证。该控制器由电网同步锁相环和同步参考系PI电流控制两部分组成。
在第二步中,该模型可以部署到嵌入式控制器的实时平台进行HIL测试。
模型已被划分为运行在FPGA
以及在CPU上实时运行的部分。果岭内的零件FPGA
子系统运行在FPGA
.该子系统之外的部件在CPU上实时运行。
open_system (sschdlexThreePhaseConverterWithGridExample / FPGA的)
运行Simscape模型的桌面仿真
基本采样率设置为1/(180e6),以匹配硬件上180 MHz目标频率的时钟滴答声。为了加速桌面模拟,可以考虑增加基本采样率的值。
Tbase = 1/(180e6);
设置闭合断路器的模拟和步长
set_param (' sschdlexThreePhaseConverterWithGridExample ', ' StopTime ', ' 0.09 ');set_param ([' sschdlexThreePhaseConverterWithGridExample ', ' /一步'],“时间”,“0.03”);
桌面仿真模型
sim(“sschdlexThreePhaseConverterWithGridExample”)
在Simulink Data Inspector中显示三相两电平电压源变换器的输出信号
Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout (2, 1);
allIDs = Simulink.sdi.getAllRunIDs;runID1 = allIDs(end);run1 = Simulink.sdi.getRun(runID1);run1.name = '桌面模拟';
Vabc_grid = run1.getSignalsByName('Vabc_grid');Iabc_conv = run1.getSignalsByName('Iabc_conv');plotOnSubPlot (Vabc_grid.Children (1), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (2), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (3), 1, 1, true);plotOnSubPlot (Iabc_conv.Children(1)、2、1,true);plotOnSubPlot (Iabc_conv.Children(2)、2、1,true);plotOnSubPlot (Iabc_conv.Children(3)、2、1,true);
Simulink.sdi.view;
生成HDL实现模型
为了兼容HDL代码生成,您可以运行Simscape HDL Workflow Advisor来生成HDL实现模型。
Simscape求解器设置为在每个示例步骤中运行一次迭代。Simscape HDL Workflow Advisor在下一步中使用求解器设置来确定实时行为。
平均开关模型允许我们将求解器迭代设置为1
set_param(['sschdlexThreePhaseConverterWithGridExample','/FPGA/Solver Configuration'],'DoFixedCost','on') set_param(['sschdlexThreePhaseConverterWithGridExample','/FPGA/Solver Configuration'],'MaxNonlinIter','1')
为了加速sschdladvisor
我们减少了模型的采样时间。调整断路器关闭的时间,以确保工作流顾问在模拟过程中捕获所有开关模式。
set_param (' sschdlexThreePhaseConverterWithGridExample ', ' StopTime ', ' 0.002 ');set_param ([' sschdlexThreePhaseConverterWithGridExample ', ' /一步'],“时间”,“0.001”);
要打开Advisor,请运行sschdladvisor
为你的模型函数:
sschdladvisor(“sschdlexThreePhaseConverterWithGridExample”)
要生成实现模型,在Simscape HDL Workflow Advisor中,保持任务的默认设置,然后运行任务。控件运行Advisor中的任务运行所有按钮。控件中可以看到到生成模型的链接生成实现模型的任务。此模型具有与您的原始模型相同的名称gmStateSpaceHDL_
.
我们将模拟和步长设置为原始值
set_param (' sschdlexThreePhaseConverterWithGridExample ', ' StopTime ', ' 0.09 ');set_param ([' sschdlexThreePhaseConverterWithGridExample ', ' /一步'],“时间”,“0.03”);
为HDL代码生成准备实现模型
中的链接,以打开实现模型生成实现模型的任务。
open_system(“gmStateSpaceHDL_sschdlexThreePhaseConverter”)
set_param (' gmStateSpaceHDL_sschdlexThreePhaseConverter ', ' StopTime ', ' 0.09 ');set_param ([' gmStateSpaceHDL_sschdlexThreePhaseConverter ', ' /一步'],“时间”,“0.03”);
该模型包含一个开关线性Simulink替换原来的三相两电平电压源变换器模型。您可以看到Simscape模型被替换了。
open_system (gmStateSpaceHDL_sschdlexThreePhaseConverter / FPGA的)
该实现模型用执行状态空间计算的与hdl兼容的算法替换了Simscape子系统。当您在这个子系统中导航时,您会看到几个用于对状态空间方程建模的延迟、加法器和Matrix Multiply块。子系统中的From和Goto块提供了与原始模型相同的输入高密度脂蛋白子系统
.
open_system('gmStateSpaceHDL_sschdlexThreePhaseConverter/FPGA/HDL子系统/HDL算法')
运行HDL实现模型的桌面仿真,验证HDL算法
您可以在Simulink中模拟三相两级电压源变换器的开关线性状态空间模型,并在仿真数据检查器中显示信号。运行的比较表明数值结果与原始的Simscape模型相匹配。
模拟HDL实现模型。
sim(“gmStateSpaceHDL_sschdlexThreePhaseConverter”)
在Simulink Data Inspector中显示三相两电平电压源变换器Simscape模型的输出信号
Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout (2, 1);
allIDs = Simulink.sdi.getAllRunIDs;runID1 = allIDs(end);run2 = Simulink.sdi.getRun(runID1);run2.name = 'HDL模型仿真';
Vabc_grid = run2.getSignalsByName('Vabc_grid');Iabc_conv = run2.getSignalsByName('Iabc_conv');plotOnSubPlot (Vabc_grid.Children (1), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (2), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (3), 1, 1, true);plotOnSubPlot (Iabc_conv.Children(1)、2、1,true);plotOnSubPlot (Iabc_conv.Children(2)、2、1,true);plotOnSubPlot (Iabc_conv.Children(3)、2、1,true);
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_sschdlexThreePhaseConverter / FPGA的)
要了解Advisor中的任务,右键单击该任务并选择这是什么?.看到开始使用HDL工作流顾问.
运行工作流脚本生成Simulink实时接口模型
您可以将HDL Workflow Advisor设置导出到脚本,以加快和自动化您的工作流。该脚本是从命令行运行的MATLAB®文件。您可以修改并运行脚本,或者将设置导入HDL Workflow Advisor用户界面。看到用脚本运行HDL工作流.
这个例子展示了如何运行HDL Workflow脚本。要生成Simulink实时接口模型,请打开并运行此MATLAB脚本。
编辑(“hdlworkflow_IO334”)
%% ------------------------------------------------------------------------此脚本包含模型、目标设置、接口映射和用于为HDL生成HDL代码的工作流配置设置为三相两级电压源生成%实现模型%转换器模型,并用于将代码部署到FPGA上的% Speedgoat IO334-325K模块。%% -----------------------------------------------------------------------为HDL代码生成做好模型准备将所有数据类型转换块设置为单一类型(除了模拟输出信号的%转换。DataTypeConversionBlocks = Simulink.findBlocksOfType([HDLModelName,' / FPGA '),“DataTypeConversion”仿真软件。FindOptions (“SearchDepth”1));为i = 1:length(DataTypeConversionBlocks) BlockName = get_param(DataTypeConversionBlocks(i),“名字”);如果~任何(strcmp (BlockName, {数据类型转换DAC1,“数据类型转换DAC2”})) set_param ([HDLModelName,“/ FPGA /”, BlockName],“OutDataTypeStr”,“单一”);结束结束set_param ([HDLModelName,'/数据类型转换Vg'),“OutDataTypeStr”,“单一”);set_param ([HDLModelName,'/数据类型转换断路器'),“OutDataTypeStr”,“单一”);设置基本采样时间为(1/180e6)(等于180MHz目标的时钟滴答%的频率)。注:基准速率决定了PWM的分辨率%信号时,在硬件上运行模型。Tbase = 1/180e6;模型HDL参数% -------------------------------------------------------------------------设置模型HDL参数hdlset_param (HDLModelName“FloatingPointTargetConfiguration”hdlcoder.createFloatingPointTargetConfig (“NativeFloatingPoint”,“LatencyStrategy”,“马克斯”));hdlset_param (HDLModelName“HDLSubsystem”(HDLModelName' / FPGA ']);hdlset_param (HDLModelName过采样的1);hdlset_param (HDLModelName“ScalarizePorts”,“DUTLevel”);hdlset_param (HDLModelName“TargetFrequency”, 180);hdlset_param (HDLModelName“工作流程”,Simulink实时FPGA I/O);hdlset_param (HDLModelName“TargetPlatform”,“Speedgoat io334 - 325 k”);hdlset_param (HDLModelName“TargetDirectory”,“c: \ hdl_prj \ hdlsrc”);hdlset_param (HDLModelName“ResetType”,“同步”) hdlset_param (HDLModelName“AdaptivePipelining”,“上”);hdlset_param (HDLModelName“ReferenceDesignParameter”, {“PCIe_Link_Width”,“X4”,“RearPlugin”,“没有”,“AuroraMode”,“没有”,“AuroraByteswap”,“真正的”});为矩阵向量乘积设置共享因子。2022世界杯八强谁会赢?共享因素%的设置使矩阵向量乘积逐行计算%(共享因子>=矩阵行数)。hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/输出/倍增输入'),“SharingFactor”1);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/输出/多重状态'),“SharingFactor”, 30);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新/多重输入'),“SharingFactor”, 30);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新/多重状态'),“SharingFactor”, 30);%块内存选项hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新/多重输入'),“UseRAM”,“上”);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新/多重状态'),“UseRAM”,“上”);设置输入和输出管道寄存器hdlset_param ([HDLModelName,/FPGA/HDL子系统/HDL算法),“ConstrainedOutputPipeline”2);hdlset_param ([HDLModelName,/FPGA/HDL子系统/HDL算法),“InputPipeline”2);hdlset_param ([HDLModelName,/FPGA/HDL子系统/HDL算法),“OutputPipeline”2);hdlset_param ([HDLModelName,/FPGA/HDL子系统/HDL算法/模式选择),“ConstrainedOutputPipeline”2);hdlset_param ([HDLModelName,/FPGA/HDL子系统/HDL算法/模式选择),“OutputPipeline”2);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/输出'),“ConstrainedOutputPipeline”2);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/输出'),“OutputPipeline”2);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新'),“ConstrainedOutputPipeline”2);hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/状态更新'),“OutputPipeline”2);%启用扁平化层次hdlset_param ([HDLModelName,' / FPGA '),“FlattenHierarchy”,“上”);将MATLAB函数的代码生成选项设置为“数据路径”hdlset_param ([HDLModelName,'/FPGA/HDL子系统/HDL算法/模式选择/生成模式矢量'),“架构”,MATLAB Datapath公司的);的所有输入和输出端口定义了硬件接口FPGA子系统设置导入HDL参数hdlset_param ([HDLModelName,“/ FPGA / modWave”),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,“/ FPGA / modWave”),“IOInterfaceMapping”,“x“100””);hdlset_param ([HDLModelName,“/ FPGA /时间”),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,“/ FPGA /时间”),“IOInterfaceMapping”,“x“114””);hdlset_param ([HDLModelName,/ FPGA /启用的),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,/ FPGA /启用的),“IOInterfaceMapping”,“x“118””);hdlset_param ([HDLModelName,“/ FPGA /死区”),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,“/ FPGA /死区”),“IOInterfaceMapping”,“x“11 c”);hdlset_param ([HDLModelName,/ FPGA /栅极电压的),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,/ FPGA /栅极电压的),“IOInterfaceMapping”,“x“120””);hdlset_param ([HDLModelName,/ FPGA /断路器的),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,/ FPGA /断路器的),“IOInterfaceMapping”,“x“134””);设置输出HDL参数hdlset_param ([HDLModelName,“/ FPGA / PCIe_FrameData”),“IOInterface”,“作为PCIe接口”);hdlset_param ([HDLModelName,“/ FPGA / PCIe_FrameData”),“IOInterfaceMapping”,“x“1000””);hdlset_param ([HDLModelName,“/ FPGA / DAC_1”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_1”),“IOInterfaceMapping”,“01频道”);hdlset_param ([HDLModelName,“/ FPGA / DAC_2”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_2”),“IOInterfaceMapping”,“频道02”);hdlset_param ([HDLModelName,“/ FPGA / DAC_3”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_3”),“IOInterfaceMapping”,“频道03”);hdlset_param ([HDLModelName,“/ FPGA / DAC_5”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_5”),“IOInterfaceMapping”,“05频道”);hdlset_param ([HDLModelName,“/ FPGA / DAC_6”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_6”),“IOInterfaceMapping”,“频道06”);hdlset_param ([HDLModelName,“/ FPGA / DAC_7”),“IOInterface”,“IO334 AO Data[0:15]”);hdlset_param ([HDLModelName,“/ FPGA / DAC_7”),“IOInterfaceMapping”,“频道07年”);hdlset_param ([HDLModelName,'/FPGA/DAC触发器1_8'),“IOInterface”,IO334 AO触发器[0:1]);hdlset_param ([HDLModelName,'/FPGA/DAC触发器1_8'),“IOInterfaceMapping”,“01到08频道”);%%工作流配置设置使用默认设置构造工作流配置对象hWC = hdlcoder。WorkflowConfig (“SynthesisTool”,“Xilinx Vivado”,“TargetWorkflow”,Simulink实时FPGA I/O);指定顶级项目目录(确保定义了一个简短的%特定路径)中国。ProjectFolder =“c: / hdl_prj”;中国。IgnoreToolVersionMismatch = true;设置“RunTaskCreateProject”任务相关属性中国。Objective = hdlcode .Objective. speedoptimized;设置运行工作流任务中国。runtaskgeneratertlcodeanddipcore = true;中国。RunTaskCreateProject = true;中国。RunTaskBuildFPGABitstream = true;中国。RunTaskGenerateSimulinkRealTimeInterface = true;运行工作流hdlcoder.runWorkflow ([HDLModelName,' / FPGA '),中国);为在Speedgoat实时目标机上部署模型做好准备获取生成的实时模型的名称SLRTModelName = [“gm_”HDLModelName,“_slrt”];注释所有速率转换块。整个CPU模型运行在% 50秒的时间步长。FPGA和CPU模型之间的速率转换%通过CPU的读写操作隐式发生。RateTransitionBlocks = Simulink.findBlocksOfType(SLRTModelName,“RateTransition”仿真软件。FindOptions (“SearchDepth”1));为i = 1:length(RateTransitionBlocks) BlockName = get_param(RateTransitionBlocks(i),“名字”);如果~任何(strcmp (BlockName, {数据类型转换DAC1,“数据类型转换DAC2”})) set_param ([SLRTModelName,' / ', BlockName],“评论”,“通过”);结束结束取消在实时CPU上记录数据的子系统的注释set_param ([SLRTModelName,'/CPU信号记录'),“评论”,“关闭”);在Speedgoat实时目标机上部署并运行实时模型连接到快速山羊实时目标机。Tg = slrealtime;tg.connect;构建模型并将其下载到目标计算机。rtwbuild (SLRTModelName);tg.load (SLRTModelName);开始模型执行。tg.start%等待模型停止而比较字符串(tg.status“奔跑”)暂停(10);结束在SDI中显示电网电压和转换器电流Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout (2, 1);allIDs = Simulink.sdi.getAllRunIDs;runID1 = allIDs(end);run3 = Simulink.sdi.getRun(runID1);run3.name =“实时仿真”;convertToFrames (run3.getSignalsByName (“Va_grid”));convertToFrames (run3.getSignalsByName (“Vb_grid”));convertToFrames (run3.getSignalsByName (“Vc_grid”));convertToFrames (run3.getSignalsByName (“Ia_conv”));convertToFrames (run3.getSignalsByName (“Ib_conv”));convertToFrames (run3.getSignalsByName (“Ic_conv”));plotOnSubPlot (run3.getSignalsByName (“Va_grid”), 1, 1,真实);plotOnSubPlot (run3.getSignalsByName (“Vb_grid”), 1, 1,真实);plotOnSubPlot (run3.getSignalsByName (“Vc_grid”), 1, 1,真实);plotOnSubPlot (run3.getSignalsByName (“Ia_conv”)、2、1,真实);plotOnSubPlot (run3.getSignalsByName (“Ib_conv”)、2、1,真实);plotOnSubPlot (run3.getSignalsByName (“Ic_conv”)、2、1,真实);Simulink.sdi.view;
为实时仿真建立Simulink实时接口模型
运行工作流脚本生成RTL代码和IP核,创建Vivado项目,构建FPGA位流,然后生成Simulink实时接口模型。
在将模型部署到Speedgoat实时目标机之前,为模型的实时测试做好准备:
generated_model = get_param(gcs,'Name');
RateTransitionBlocks = Simulink.findBlocksOfType(generated_model,'RateTransition',Simulink.FindOptions('SearchDepth',1));for i = 1:length(RateTransitionBlocks) BlockName = get_param(RateTransitionBlocks(i),'Name');if ~any(strcmp(BlockName,{'Data Type Conversion DAC1','Data Type Conversion DAC2'}) set_param([generated_model,'/',BlockName],' comments ','through');结束结束
取消注释set_param([generated_model,'/CPU信号日志'],'已注释','off');
连接到目标计算机并运行实时仿真
该模型现在可以部署到快速山羊实时目标机上。三相两电平电压源转换器模型自动加载到IO334上的FPGA上。
连接到快速山羊实时目标机。
Tg = slrealtime;tg.connect;
构建模型并将其下载到目标机器。
rtwbuild (generated_model);tg.load (generated_model);
开始模型执行。
tg.start;
当strcmp(tg.status,'running')暂停(10);结束
文件日志记录块将信号存储在目标机器的SSD上。一旦模型停止,数据就会自动上传到主机。数据在模拟数据检查器中可视化。您可以验证实时模拟的结果是否与原始的Simscape模型相匹配。
在SDI Simulink.sdi.clearAllSubPlots Simulink.sdi.setSubPlotLayout(2,1)中显示电网电压和转换器电流;
allIDs = Simulink.sdi.getAllRunIDs;runID1 = allIDs(end);run3 = Simulink.sdi.getRun(runID1);run3.name = '实时仿真';
Vabc_grid = run3.getSignalsByName('Vabc_grid');Iabc_conv = run3.getSignalsByName('Iabc_conv');plotOnSubPlot (Vabc_grid.Children (1), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (2), 1, 1, true);plotOnSubPlot (Vabc_grid.Children (3), 1, 1, true);plotOnSubPlot (Iabc_conv.Children(1)、2、1,true);plotOnSubPlot (Iabc_conv.Children(2)、2、1,true);plotOnSubPlot (Iabc_conv.Children(3)、2、1,true);
Simulink.sdi.view;
或者,您可以测量IO334模拟输出的信号。