主要内容

基于框架算法的HDL代码生成

具有有限I/O的平台,如FPGA或ASIC设备,通常将大型数据集作为流像素或样本处理。要将基于框架的模型部署到这些设备上,您必须手动转换算法以操作数据流。您可以将此过程自动化,并从基于框架的模型或MATLAB生成HDL代码®通过使用HDL Coder™中的帧到样本优化函数与矩阵输入函数。这种优化将基于帧的矢量或矩阵输入转换为更小尺寸的样本或像素,以便HDL代码生成目标基于流的硬件,并减少处理大型输入和输出信号所需的FPGA I/O。您可以优化硬件设计,同时减少在具有大量输入的领域中的各种用例的算法开发时间,例如图像处理、数字信号处理、雷达应用程序和音频处理。

当您使用帧到样本优化时,HDL Coder从基于帧的算法生成硬件就绪的HDL代码,该算法具有在DUT中以行缓冲区、对齐流和平衡数据路径存储样本的必要逻辑。您可以使用多种建模模式,例如基于元素的操作、邻域操作以及迭代和约简操作,来编写由框架到样本优化支持的基于框架的算法。

从基于框架的算法生成HDL代码

当您使用帧到样本转换从基于帧的算法生成HDL代码时,HDL Coder将您的基于帧的算法转换为可合成的HDL代码,该代码具有基于样本的逻辑,具有有效和现成的控制信号,以及直接从基于帧的算法处理和对齐数据流的逻辑。你可以在Simulink中使用帧到样本的转换®模型或MATLAB函数。

工作流中的框架到样本的高级转换

当您从基于框架的算法生成HDL代码时,基于流的HDL代码和生成的模型包含基于样本的逻辑,其中包括数据信号、有效和就绪的控制信号。这个时序图映射了Valid、Data和Ready信号之间的关系。

帧到样本转换优化的时序图

有效信号表示何时数据可用。Ready信号表示DUT可以接受并处理数据。只有当Valid和Ready信号都很高时,才会发生数据传输。这由图像中的数据包A、B和C表示。当Ready信号较低时,DUT无法处理更多数据。如果在Ready信号断言之前发送Valid和Data信号,则Data信号将被丢弃。您可以取消对Valid信号的断言,并在Ready信号高时不发送数据。如果Ready信号取消断言,且Valid信号高,则Data信号将被丢弃。这由图像中的数据包D表示。

您可以通过使用基于元素的操作、邻域操作以及支持HDL代码生成的迭代和约简操作来创建基于矩阵或框架的算法。您可以创建:

  • 的邻域运算hdl.npufun函数a在MATLAB函数或社区处理子系统在Simulink模型中。您可以使用hdl.npufun在一个MATLAB函数块来对传入的图像或矩阵应用邻域处理和元素方面的操作,例如用核进行过滤。

  • 的迭代操作hdl.iteratorfun函数。例如,你可以用hdl.iteratorfun在一个MATLAB函数块在你的DUT中循环数组,以产生一个输出到传入图像或矩阵的直方图均衡化,并计算统计数据,如最小值而且马克斯

  • 的基于元素的函数或块来进行基于元素的操作获得产品总和减去,块。

在视觉或图像处理中,您可以使用这些帧操作来建模基于二维的算法,如过滤、直方图创建、直方图均衡和边缘检测。在信号处理中,可以对一个大的输入信号进行移动平均计算。

指定帧到样本转换优化

您可以从Simulink模型或MATLAB函数通过帧到样本转换优化生成HDL代码。

指定帧到样本转换优化动态仿真模块

启用Simulink模型的帧到样本转换优化:

  1. 单独启用HDL块属性ConvertToSamples轮廓尺寸块上的传入矢量或矩阵输入信号转换为样本,使用帧对样本转换优化。指定一个轮廓尺寸Block作为帧到样本转换的输入信号,输入:

    hdlset_param (“<路径/ /尺寸>”ConvertToSamples =“上”

  2. 选择启用帧样本转换参数。使用帧到样本转换参数将帧到样本优化选项应用到设计中。要在Simulink模型上启用帧到样本的转换,在命令行中输入:

    hdlset_param (“< model_name >”FrameToSampleConversion =“上”
    有关更多信息,请参见帧到样本转换参数

  3. 如果你设计基于帧的算法使用MATLAB函数block,设置HDL block属性体系结构MATLAB函数MATLAB Datapath公司

在生成HDL代码之后,您可以检查生成的模型和HDL代码,以查看每个矩阵输入流都包含一个示例、有效和就绪的包。您可以使用验证模型来比较原始的基于框架的模型和生成的基于样本的模型。您还可以使用IP核生成工作流将生成的HDL代码部署到FPGA。示例请参见使用AXI4-Stream接口部署基于框架的模型

指定帧到样本的转换MATLAB

启用MATLAB函数的帧到样本转换优化:

  1. 打开MATLAB HDL工作流顾问。要开始使用MATLAB HDL工作流顾问,请参见基于MATLAB的基本HDL代码生成和FPGA合成

  2. 在左窗格中,单击HDL代码生成的任务。在右窗格中,导航到优化选项卡并选择积极的数据流转换

  3. 单击帧到样本的转换选项卡并选择启用帧样本转换.使用此选项卡中的框架到样本转换参数将优化选项应用到设计中。

从基于框架的模型示例生成HDL代码

仿真软件模型hdlFrame_Blur_2D_MLFB建模了一种常用的基于图像处理框架的模糊算法,该算法采用邻域处理模式。

打开模型查看基于框架的模糊算法。该模型将图像模糊核应用于图像cameraman.tif

open_system (“hdlFrame_Blur_2D_MLFB”);set_param (gcs,“SimulationCommand”“更新”);

DUT包含一个MATLAB函数称为image_blur在MATLAB函数块中。的image_blur函数调用支持帧到样本的函数hdl.npufun它应用了模糊核函数模糊函数的输入图像。有关更多信息,请参见hdl.npufun

open_system (“hdlFrame_Blur_2D_MLFB / DUT / MATLAB函数”

通过设置模型配置参数,实现帧到样本转换优化FrameToSampleConversion从命令行。

hdlset_param (“hdlFrame_Blur_2D_MLFB”FrameToSampleConversion =“上”);

通过设置HDL import块属性,指定哪个传入的基于帧的信号要转换为基于样本的信号ConvertToSamples的输入.在本例中,设置ConvertToSamples财产的唯一导入块DUT子系统,

hdlset_param (“hdlFrame_Blur_2D_MLFB / DUT /我”ConvertToSamples =“上”);

要查看从基于框架的模型到基于样本的版本的转换,请启用模型生成。生成HDL代码和生成的模型DUT子系统。

hdlset_param (“hdlFrame_Blur_2D_MLFB”GenerateModel =“上”);makehdl (“hdlFrame_Blur_2D_MLFB / DUT”);bdclose (“原来hdlFrame_Blur_2D_MLFB /”);bdclose (“hdlFrame_Blur_2D_MLFB / Equalized1”);
为'hdlFrame_Blur_2D_MLFB/DUT'生成HDL。使用模型的配置集hdlFrame_Blur_2D_MLFB用于HDL代码生成参数。在模型'hdlFrame_Blur_2D_MLFB'上运行HDL检查。###开始编译模型'hdlFrame_Blur_2D_MLFB'…在模型'hdlFrame_Blur_2D_MLFB'上应用HDL优化…您所选择的代码生成和优化选项引入了额外的管道延迟。延迟平衡功能自动插入匹配的延迟进行补偿。DUT需要一个初始的管道设置延迟。每个输出端口都会经历这些额外的延迟。 ### Output port 1: 127 cycles. ### Output port 1: The first valid output of this port will be after an initial latency of 257 valid inputs. ### Output port 2: 127 cycles. ### Output port 2: The first valid output of this port will be after an initial latency of 257 valid inputs. ### Working on... GenerateModel ### Begin model generation. ### Model generation complete. ### Begin VHDL Code Generation for 'hdlFrame_Blur_2D_MLFB'. ### MESSAGE: The design requires 65536 times faster clock with respect to the base rate = 1. ### Working on counterNetwork as hdlsrc/hdlFrame_Blur_2D_MLFB/counterNetwork.vhd. ### Working on NeighborhoodCreator_3x3/row3_col2 as hdlsrc/hdlFrame_Blur_2D_MLFB/row3_col2.vhd. ### Working on NeighborhoodCreator_3x3/row2_linebuffer/SimpleDualPortRAM_generic as hdlsrc/hdlFrame_Blur_2D_MLFB/SimpleDualPortRAM_generic.vhd. ### Working on NeighborhoodCreator_3x3/row2_linebuffer as hdlsrc/hdlFrame_Blur_2D_MLFB/row2_linebuffer.vhd. ### Working on NeighborhoodCreator_3x3 as hdlsrc/hdlFrame_Blur_2D_MLFB/NeighborhoodCreator_3x3.vhd. ### Working on BoundaryCheck_3x3 as hdlsrc/hdlFrame_Blur_2D_MLFB/BoundaryCheck_3x3.vhd. ### Working on ValidDelay_257 as hdlsrc/hdlFrame_Blur_2D_MLFB/ValidDelay_257.vhd. ### Working on I_NeighborhoodCreator as hdlsrc/hdlFrame_Blur_2D_MLFB/I_NeighborhoodCreator.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur/nfp_div_single as hdlsrc/hdlFrame_Blur_2D_MLFB/nfp_div_single.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur/nfp_add_single as hdlsrc/hdlFrame_Blur_2D_MLFB/nfp_add_single.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function/blur as hdlsrc/hdlFrame_Blur_2D_MLFB/blur.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/MATLAB Function as hdlsrc/hdlFrame_Blur_2D_MLFB/MATLAB_Function.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/Input FIFOs/I_FIFO as hdlsrc/hdlFrame_Blur_2D_MLFB/I_FIFO.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/Input FIFOs as hdlsrc/hdlFrame_Blur_2D_MLFB/Input_FIFOs.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/Output_FIFOs/Output_FIFOs as hdlsrc/hdlFrame_Blur_2D_MLFB/Output_FIFOs.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT/Output_FIFOs as hdlsrc/hdlFrame_Blur_2D_MLFB/Output_FIFOs_block.vhd. ### Working on hdlFrame_Blur_2D_MLFB/DUT as hdlsrc/hdlFrame_Blur_2D_MLFB/DUT.vhd. ### Generating package file hdlsrc/hdlFrame_Blur_2D_MLFB/DUT_pkg.vhd. ### Code Generation for 'hdlFrame_Blur_2D_MLFB' completed. ### Creating HDL Code Generation Check Report file:///tmp/Bdoc22b_2054784_3457281/tp345f4fbf/hdlcoder-ex36441221/hdlsrc/hdlFrame_Blur_2D_MLFB/DUT_report.html ### HDL check for 'hdlFrame_Blur_2D_MLFB' complete with 0 errors, 2 warnings, and 1 messages. ### HDL code generation complete.

打开生成的模型,gm_hdlFrame_Blur_2D_MLFB.该模型包含基于样本的DUT版本,并包含Valid、Ready和Data信号。

open_system (“gm_hdlFrame_Blur_2D_MLFB”);Simulink.BlockDiagram.arrangeSystem (“gm_hdlFrame_Blur_2D_MLFB”);

打开生成的模型DUT。与原始的基于框架的模型相比,基于采样的生成模型中有更多的硬件细节。在DUT子系统中,有一个输入和输出FIFO处理和存储来自所生成的流矩阵分区的数据。流矩阵分区包含模糊算法和将算法部署到基于流的硬件所需的其他基于样本的逻辑。

open_system (“gm_hdlFrame_Blur_2D_MLFB / DUT”);

如果运行生成的模型,请注意获取输出图像的时间比原始模型要长。将基于帧的算法转换为基于样本的算法(每次流式传输图像的一个像素)需要比基于帧的版本更多的时间来处理每个像素。为原始输入帧的有效输入像素处理有效输出像素的延迟取决于几个因素,例如输入图像的大小、每个周期的样本和算法。的输出makehdl命令在MATLAB命令窗口中显示增加的延迟。在本例中,在257个有效输入的初始延迟之后可以访问第一个有效输出。

采样率、延迟和图像大小决定了生成模型所需的模拟停止时间。为了在生成的模型中从基于样本的算法生成模糊的输出图像,原始和后续生成的模型都有2秒的停止时间,这是在引入延迟后显示整个输出图像所需的时间。

硬件方面的考虑

在从基于框架的算法为硬件部署生成HDL代码之前:

  • 在应用基于流的算法之前和之后,检查目标硬件应该有足够的内存在内存中存储帧。基于样本的算法需要更多的内存,但是使用更少的I/O。

  • 确保您的设计能够处理一些延迟。基于样本的算法根据算法、设计和输入数据大小增加延迟和延迟。

支持的块和操作

帧到样本转换支持这些块和操作:

  • MATLAB函数块使用HDL block属性体系结构设置为MATLAB Datapath公司.在MATLAB函数中,可以使用:

    • 关注帧到样本的函数,例如hdl.npufun而且hdl.iteratorfun

    • 流数据之间的基于元素的操作。

    • 标量数据和流数据之间的操作。

  • 社区处理子系统块。

  • Element-wise操作。例如,可以使用支持基于元素的操作的块,例如获得产品总和减去,块。

  • 恒定的输入或源。

  • 饱和度。

  • 三角函数的操作。

  • 按位操作,例如位切片、位和和位或。

  • 比较操作。

  • 偏见块。

  • 腹肌块。

  • 复杂Real-Imag块和Real-Imag复杂块。

  • √6块。

  • 数据类型转换块。

  • 开关块。

限制

帧到样本转换不支持:

  • 三维矩阵。

  • 列向量。

  • 持续的变量。

  • 矩阵乘积的操作。

  • 对流数据的矩阵运算。例如,Simulink中的帧到样本转换不支持使用选择器赋值,或重塑阻塞流数据。

  • 元素运算的和。

  • 元素运算的乘积。

  • MATLAB系统对象等高密度脂蛋白。内存

  • 为每个子系统。

  • 延迟块。

  • 包含设计延迟的块。

  • 公共汽车对象作为数据类型。

另请参阅

||

相关的例子

更多关于

Baidu
map