主要内容

使用HDL工作流脚本部署Simscape网格绑定转换器模型到Speedgoat IO模块

本示例展示了如何将三相两级电压源转换器连接到Simscape™中建模的低压电网到Speedgoat IO334 Simulink®可编程I/O模块,以实现1微秒(us)的仿真时间步长。

通过使用子周期平均方法对转换器进行建模,可以以更高的分辨率捕获PWM信号。最大分辨率可达4ns,可模拟开关频率高于100kHz的最先进功率转换器。本例的开关频率为20kHz。

这个例子演示了如何:

  1. 通过使用Simscape HDL Workflow Advisor将您的Simscape模型转换为与HDL兼容的实现模型

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

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

植物模型最终以1us的时间步长运行FPGA所述控制器在所述实时系统的CPU上以50us时间步长执行。生成HDL代码和FPGAbitstream,这个例子展示了如何从命令行运行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模拟输出的信号。

另请参阅

功能

相关的话题

Baidu
map