利用MATLAB数据路径体系结构跨MATLAB函数块边界的HDL优化
这个例子展示了如何在MATLAB函数块中使用各种优化,以及如何跨MATLAB函数块边界与Simulink®模型中的其他块进行优化。该示例还说明了在使用MATLAB函数块的不同HDL体系结构设置时,在区域和时间上的差异。
为什么使用MATLAB数据路径架构?
一个MATLAB函数块的HDL代码生成支持两种HDL架构:MATLAB函数
而且MATLAB Datapath公司
.指定高密度脂蛋白架构在MATLAB函数块的HDL块属性对话框中。
使用MATLAB Datapath公司
体系结构;
在MATLAB函数块中建模复杂的定点和浮点MATLAB算法,并将该算法与模型中的其他Simulink块连接。
通过优化MATLAB函数块内部的算法,并跨越MATLAB函数块边界与模型中的其他Simulink块,显著提高设计的面积和时间。
这种架构是浮点类型的MATLAB函数块的默认设置。通过支持MATLAB Datapath公司
定点操作的体系结构,您可以使用各种优化,包括:
层次结构压扁
资源共享和流
时钟频率流水线
自适应流水线
分布式流水线和分级分布式流水线
关键路径的估计
MATLAB数据路径体系结构如何工作
定点Simulink®模型使用MATLAB函数
默认架构。通过这种架构启用的某些HDL优化,如资源共享和分布式管道,会优化MATLAB函数块周围的块和MATLAB函数块内部的算法。要查看MATLAB函数块内部优化的效果,请检查为该块生成的HDL代码。该体系结构不应用优化跨越MATLAB函数块边界与其他Simulink块。
浮点Simulink模型使用MATLAB Datapath公司
架构,即使您指定了MATLAB函数
作为块的体系结构设置。使用浮点类型时,请指定本机浮点模式。在这种体系结构中,代码生成器将块视为一个普通的子系统块。HDL Coder将MATLAB函数块内的MATLAB代码的控制流算法转换为使用Simulink块的数据流表示。的MATLAB Datapath公司
由于这种转换,体系结构在代码中展开循环。如果要流化循环,可以使用循环流优化MATLAB函数
架构或使用流优化MATLAB Datapath公司
作为HDL架构。
通过使用MATLAB Datapath公司
您可以更有效地执行各种HDL Coder™优化与MATLAB函数块,否则您将执行一个子系统块。的MATLAB Datapath公司
体系结构应用您在MATLAB函数块内部的算法上指定的优化设置,并跨越MATLAB函数块边界与您的Simulink模型中的其他块。
例如,考虑这个带有DUT子系统的模型,该子系统由Product块和MATLAB函数块组成。
open_system (“hdlcoder_MLFB_simple_datapath”) set_param (“hdlcoder_MLFB_simple_datapath”,“SimulationCommand”,“更新”) open_system (“hdlcoder_MLFB_simple_datapath / HDL_DUT”)
MATLAB函数块实现了两个乘法。
open_system (“hdlcoder_MLFB_simple_datapath / HDL_DUT / MATLAB函数”)
将MATLAB函数块的HDL架构设置为MATLAB Datapath公司
.生成HDL代码HDL_DUT
子系统,运行这个命令:
makehdl (“hdlcoder_MLFB_simple_datapath / HDL_DUT”)
当生成HDL代码时,代码生成器将用执行乘法的子系统替换MATLAB函数块c * d
而且e * f
.
与MATLAB Datapath公司
您可以在MATLAB函数块内部执行优化,也可以跨MATLAB函数块与其他Simulink块执行优化。在本例中,您可以在MATLAB函数块中共享两个乘法器。要优化这些块,请设置SharingFactor来2
在MATLAB函数块上。
mlsubsys =“hdlcoder_MLFB_simple_datapath / HDL_DUT / MATLAB函数”;hdlset_param (mlsubsys“SharingFactor”, 2)
当您生成HDL代码时,代码生成器共享MATLAB函数块中的乘法。共享组显示在优化报告中。当您点击共享组中的链接时,HDL Coder会在生成的模型和原始模型的MATLAB函数块中显示共享乘数。
您可以在MATLAB函数块与其他Simulink块之间应用优化。在本例中,您可以将MATLAB函数块外部的Product块与MATLAB函数块内部的乘数共享。要共享这些资源,请删除SharingFactor在MATLAB函数块上,在父子系统上,HDL_DUT
,使FlattenHierarchy并设置SharingFactor来3.
.
hdlset_param (mlsubsys“SharingFactor”, 0) hdlset_param (“hdlcoder_MLFB_simple_datapath / HDL_DUT”,...“FlattenHierarchy”,“上”,“SharingFactor”3)
注意:不要使用InlineMATLABCode
财产的MATLAB Datapath公司
区块的架构。使用FlattenHierarchy
代替。
当您生成HDL代码时,代码生成器将MATLAB函数块内部的乘法与外部的Product块共享。您可以在优化报告中看到三个乘数的共享组。当您单击共享组中的链接时,共享乘数将在生成的模型和原始模型中突出显示。
MATLAB函数块模型,默认的MATLAB函数体系结构
的示例模型MATLAB Datapath公司
建筑和它与MATLAB函数
架构,打开模型hdlcoder_MLFB_share_pipeline
.该模型使用整数类型。的示例说明了如何使用MATLAB Datapath公司
浮点类型的体系结构,请参见使用原生浮点生成独立于目标的HDL代码.
open_system (“hdlcoder_MLFB_share_pipeline”) set_param (“hdlcoder_MLFB_share_pipeline”,“SimulationCommand”,“更新”)
该模型在顶层包含两个DUT子系统HDL_DUT_sharing
而且HDL_DUT_distpipe
.子系统演示了如何跨MATLAB函数块边界与其他块使用资源共享和分布式流水线优化。两个子系统在MATLAB函数块内部和外部执行基本的加法和乘法。
open_system (“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing”)
open_system (“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing /子系统”)
open_system (“hdlcoder_MLFB_share_pipeline / HDL_DUT_distpipe”)
要查看保存在模型上的HDL参数,请运行hdlsaveparams
函数。
hdlsaveparams (“hdlcoder_MLFB_share_pipeline”)
你可以看到这是默认值MATLAB函数
HDL架构保存在模型中。
使用MATLAB函数体系结构生成HDL代码
要为共享DUT生成HDL代码,运行以下命令:
makehdl (“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing”)
当您打开流媒体和共享报告时,该报告将显示四个乘数和三个加数作为共享资源。
当您单击第二个共享组时,代码生成器突出显示MATLAB函数块周围的三个加器。共享组包括子系统内部的两个Add块和外部的Add块。代码生成器不共享MATLAB函数块中的乘法器和加法器。
在模型上启用了关键路径估计。当您注释关键路径时,MATLAB函数块充当了这种优化的障碍。如果关键路径在MATLAB函数块中,并且如果您想突出显示关键路径,请使用MATLAB Datapath公司
体系结构。
生成HDL代码HDL_DUT_distpipe
,执行该命令:
makehdl (“hdlcoder_MLFB_share_pipeline / HDL_DUT_distpipe”)
当您打开分布式流水报告时,您会看到代码生成器将管道移动到HDL_DUT_distpipe
子系统,但没有在MATLAB函数块中分布管道。
该图显示了分布式管道如何移动子系统中的管道寄存器。
应用优化的MATLAB函数块和其他Simulink块
若要改进设计的面积和时间,请使用MATLAB Datapath公司
体系结构。为HDL_DUT_sharing
子系统中,您可以将资源共享与时钟速率管道结合起来,并在MATLAB函数块内部和跨MATLAB函数块与其他块共享资源。
共享资源:
1.启用FlattenHierarchy并指定一个SharingFactor在父子系统上HDL_DUT_sharing
.设置SharingFactor来8
.
share_subsys =“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing”;hdlset_param (share_subsys“FlattenHierarchy”,“上”,“SharingFactor”8);
2.指定MATLAB Datapath公司
体系结构的MATLAB函数块内部HDL_DUT_sharing
子系统。
share_mlfcn1 =“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing / MATLAB函数”;share_mlfcn2 =“hdlcoder_MLFB_share_pipeline / HDL_DUT_sharing /子系统/ MATLAB函数”;hdlset_param (share_mlfcn1“架构”,MATLAB Datapath公司的);hdlset_param (share_mlfcn2“架构”,MATLAB Datapath公司的);
当您打开流媒体和共享报告时,该报告显示了一个由8个乘数和2个加法共享组组成的共享组。
当您选择第一个共享组时,您会看到优化共享MATLAB函数内部的乘数与外部的四个增益块。第二个共享组由两个MATLAB函数块中的加德器组成。
方法可以使用分布式流水线优化Distributedpipe_MLFB
子系统。在顶层启用分层分布式流水线,并将MATLAB函数的HDL架构设置为MATLAB Datapath公司
与DistributedPipelining设置为在
.
hdlset_param (“hdlcoder_MLFB_share_pipeline”,“HierarchicalDistPipelining”,“上”);dist_subsys =“hdlcoder_MLFB_share_pipeline / HDL_DUT_distpipe / MATLAB函数”;hdlset_param (dist_subsys“架构”,MATLAB Datapath公司的);hdlset_param (dist_subsys“DistributedPipelining”,“上”);
生成HDL代码后,打开生成的模型。代码生成器使用分层分布式管道和分布式管道来移动管道寄存器跨越块和内部MATLAB函数
子系统。
此图显示了分布式流水如何移动管道寄存器MATLAB函数
子系统。