主要内容

使用AXI4-Stream接口部署基于框架的模型

这个例子展示了如何利用HDL Coder™的帧采样优化,从基于帧的Simulink®模型生成具有AXI4-Stream接口的基于样本的IP核。生成的IP核可以部署到硬件上,并使用MATLAB®的直播数据进行验证。

在MATLAB和Simulink中建模基于框架的算法是很常见的。这种建模风格允许直观的算法设计,使用基于帧的操作将数据作为整个帧处理。然而,这些操作在FPGA/ASIC设备上实现时效率不高,因为FPGA/ASIC设备通常处理大型数据集作为样本。因此,基于框架的算法在部署之前需要手动转换为基于样本的对应算法,这为设计过程增加了耗时和容易出错的工作。

使用帧到样本优化,HDL Coder自动化了帧到样本转换过程,并为基于帧的算法生成基于样本的HDL代码,使用元素操作、邻域习语、迭代器和约简操作建模。当你使用帧到采样转换,HDL Coder自动转换你的基于帧的算法到一个基于样本的模型,有效的和现成的控制信号和逻辑处理和对齐数据流如下所示:

frameBasedModel.png

在这个例子中,你:

  1. 利用邻域处理函数建模一种基于帧的边缘检测算法。

  2. 生成一个带有AXI4-Stream接口的HDL IP核。

  3. 将生成的IP核与DMA控制器集成到参考设计中。

  4. 使用一个简单的脚本在使用实时数据的硬件上运行设计原型。

先决条件

要运行此示例,您必须安装以下软件和硬件板:

  • Xilinx®Zynq®平台的HDL编码器支持包

  • Xilinx Vivado®(要查看支持的版本,请参见HDL语言支持和支持的第三方工具和硬件

  • Xilinx SoC。本例使用Xilinx Zynq ZC706评估套件。

  • 主板SD卡上的MathWorks®固件映像。有关SD卡设置的帮助,请参见引导SD卡设置(Xilinx Zynq平台的HDL编码器支持包)

利用邻域处理函数建模边缘检测算法

打开基于帧的边缘检测模型。

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

该模型由待测设计(DUT)和试验台组成。DUT包含一个MATLAB®函数块,该函数块通过使用Sobel边缘检测算法建模hdl.npufun函数。边缘计算使用非采样参数,cThreshold而且cAlpha,用采样的帧输入计算原始帧输入上的边缘叠加。有关使用的更多信息hdl.npufun与非采样输入和帧输入,见hdl.npufun

函数[O,E] = edgedetectionanddoverlay (I, cThreshold, cAlpha) E = hdl。npufun(@sobel_kernel, [3 3], I,“NonSampleInput”, cThreshold);O =高密度脂蛋白。npufun(@mix_kernel, [1 1], E, I,“NonSampleInput”, cAlpha);结束函数e = sobel_kernel(in,cThreshold) u = fi(in);hGrad = u (1) + (2) * u (2) + (3) - (u (7) + fi (2) * (8) + u (9));vGrad = u (1) + (2) * u (4) + u (7) - (u (3) + fi (2) * u (6) + u (9));hGrad = bitshift(hGrad, -3);%除以8vGrad = bitshift(vGrad, -3);%除以8thresholdValueSq = fi (cThreshold);%边缘阈值e = (hGrad*hGrad + vGrad*vGrad) > thresholdValueSq;结束函数O = mix_kernel(E, I, cAlpha) alpha = fi(cAlpha);组合图像的参数scaleE = E * fi (255 0 8,0);O = scaleE * (fi(1)- α) + I* α;结束

您可以使用hdl.npufun用于帧到样本转换的函数,将基于帧的算法转换为基于样本的算法。您可以将基于样本的算法的流I/O连接到流接口。此外,可以将可调参数(非采样输入)映射到AXI4-Lite或外部端口。

当您使用HDL Coder工作流顾问转换此模型时,您将生成一个AXI4-Stream接口,其中包含以下图像中的信号:

IPCoreModified.png

生成HDL IP Core

使用HDL Workflow Advisor从基于框架的DUT生成IP核。

1.通过输入以下命令启用帧到样本的转换:

hdlset_param (“hdlcoder_tunable_edge_detection”“FrameToSampleConversion”“上”);

2.启用HDL块属性ConvertToSamples输入图像的流媒体格式为(的日记)使用这个命令:

hdlset_param (“hdlcoder_tunable_edge_detection / EdgeDUT /日记”“ConvertToSamples”“上”);

3.设置Xilinx Vivado合成工具路径hdlsetuptoolpath命令。运行该命令时,请使用自己的Vivado安装路径。

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

4.打开HDL Coder应用程序应用程序选项卡,然后打开高密度脂蛋白编码器.单击工作流的顾问按钮打开HDL Workflow Advisor。

5.点击1.设置“目标器> 1.1”。设置目标装置和合成工具,然后设置目标工作流程IP核心代而且目标平台Xilinx Zynq ZC706评估试剂盒.如果您的目标是不同的Xilinx SoC,请从目标平台上下文菜单。

6.点击1.2.设定目标参考设计,然后设置参考设计默认系统具有AXI4-Stream接口

7.点击1.3.设置目标接口.DUT子系统的端口映射到IP核心接口。AXI4-Stream接口以主/从模式通信,在这种模式下,主设备向从设备发送数据。对于本例,对于输入端口,的日记,设置目标平台的接口AXI4-Stream奴隶并设置输出端口,Overlay_Edges,AXI4-Stream主.的细胞数据类型列,包括流端口指定可以映射到流接口的端口。最后,为了控制运行时的可调参数,设置目标平台的接口AXI4-Lite对于未采样的输入,cAlpha而且cThreshold。

点击运行这个任务

2022 - 07 - 01 - _9 - 00 - 02. png

AXI4-Stream接口包含数据(Data_In, Data_Out)和控制信号,例如数据有效(Valid_In, Valid_Out)、背压(Ready_In, Ready_Out)和数据边界(TLAST).它只需要将您的帧输入和输出映射为数据.的有效的准备好了,TLAST控制信号自动生成。指AXI4-Stream接口生成的模型设计获取协议信号的详细描述。

8.右键单击3.2生成RTL代码和IP核并选择运行到所选任务生成IP核。

将IP集成到兼容AXI4-Stream的参考设计中

在HDL Workflow Advisor中,运行下面的任务4.嵌入式系统集成在Zynq硬件上部署生成的HDL IP核。

1.点击4.1创建项目,然后单击运行这个任务.将生成的IP核插入默认系统具有AXI4-Stream接口参考设计。如IP核报告所示,数据从ARM处理系统通过DMA控制器和AXI4-Stream接口流向HDL Coder生成的边缘检测IP核。处理系统接收边缘检测IP核处理后的输出。

2.可选地,单击Result窗格中的链接来打开生成的Vivado项目。在Vivado工具中,单击开放块设计查看Zynq设计图表。

生成主机与IP核之间的接口

1.在生成软件界面中,选择生成主机接口脚本并点击运行这个任务.HDL Coder工作流顾问在您当前文件夹中生成两个MATLAB文件,您可以使用它直接从MATLAB中原型化生成的IP核:

  • gs_hdlcoder_tunable_edge_detection_setup.m此函数配置fpga类中映射的相同端口和接口的硬件对象1.3设置目标接口的任务。

  • gs_hdlcoder_tunable_edge_detection_interface.m该文件创建到FPGA硬件的连接,用于读写数据。

2.在HDL Workflow Advisor中,运行其余的任务来构建和下载FPGA位流。

在FPGA上运行的实时框架模型

您可以通过在主机上从MATLAB中读取和写入数据与FPGA设计进行交互,如从上位机与FPGA设计交互部分的基于MATLAB命令的实时数据硬件原型FPGA设计.主机从片上系统(SoC)板发送和接收数据帧,如下图所示为系统的高层架构:

Picture4.jpg

这个实时脚本使用生成的脚本文件作为起点,测试部署在FPGA上的基于框架的模型。

开放hdlcoder_frame_edge_detection_script.mlx

的写/读DUT端口部分hdlcoder_frame_edge_detection_script脚本,代码执行边缘检测的前200帧的每20帧visiontraffic.avi并更改cAlpha和cThreshold参数,如下所示

vidObj = VideoReader (“visiontraffic.avi”);h =图();集(h,“位置”, [0 0 800 800])2 = 1:20:200%修改参数cThreshold =兰迪([90],1);%改变cthreshold从20到90将cThreshold值写入DUT中的“cThreshold”端口(AXI4-Lite)writePort (hFPGA“cThreshold”, cThreshold);cAlpha = rand ();%改变cAlpha从0到1将cAlpha值写入DUT中的“cAlpha”端口(AXI4-Lite)writePort (hFPGA“cAlpha”, cAlpha);读取vidObj的第iith帧vidFrame =阅读(vidObj ii);vidFrameGr = rgb2gray (vidFrame);写入inputImage DUT端口(AXI4-Stream)wrValid = writePort (hFPGA,“日记”, vidFrameGr);如果wrValid次要情节(2、2、1),显示亮度图像(vidFrameGr);轴图像;轴;colormap(灰色);标题(sprintf (“帧% d '(二))结束%从inputImage DUT端口读取(AXI4-Stream)[outputFrame, rdValid] = readPort(hFPGA,“Overlay_Edges”);如果rdValid显示从DUT读取的数据次要情节(2 2 2),显示亮度图像(uint8 (bitsliceget (fi (outputFrame), 16日9)));轴图像;轴;colormap(灰色);标题(“叠加”)次要情节(2、2、3),显示亮度图像(uint8 (bitsliceget (fi (outputFrame) 8 1)));轴图像;轴;colormap(灰色);标题(“边缘”) sgtitle (sprintf ('阈值%0.2f, alpha %0.2f'drawnow cThreshold cAlpha))其他的继续结束结束

完成示例后,运行脚本的最后一行以释放控件使用的所有硬件资源fpga对象:

释放(hFPGA);
Baidu
map