使用AXI4-Stream接口部署基于框架的模型
这个例子展示了如何利用HDL Coder™的帧采样优化,从基于帧的Simulink®模型生成具有AXI4-Stream接口的基于样本的IP核。生成的IP核可以部署到硬件上,并使用MATLAB®的直播数据进行验证。
在MATLAB和Simulink中建模基于框架的算法是很常见的。这种建模风格允许直观的算法设计,使用基于帧的操作将数据作为整个帧处理。然而,这些操作在FPGA/ASIC设备上实现时效率不高,因为FPGA/ASIC设备通常处理大型数据集作为样本。因此,基于框架的算法在部署之前需要手动转换为基于样本的对应算法,这为设计过程增加了耗时和容易出错的工作。
使用帧到样本优化,HDL Coder自动化了帧到样本转换过程,并为基于帧的算法生成基于样本的HDL代码,使用元素操作、邻域习语、迭代器和约简操作建模。当你使用帧到采样转换,HDL Coder自动转换你的基于帧的算法到一个基于样本的模型,有效的和现成的控制信号和逻辑处理和对齐数据流如下所示:
在这个例子中,你:
利用邻域处理函数建模一种基于帧的边缘检测算法。
生成一个带有AXI4-Stream接口的HDL IP核。
将生成的IP核与DMA控制器集成到参考设计中。
使用一个简单的脚本在使用实时数据的硬件上运行设计原型。
先决条件
要运行此示例,您必须安装以下软件和硬件板:
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接口,其中包含以下图像中的信号:
生成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。
点击运行这个任务.
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)板发送和接收数据帧,如下图所示为系统的高层架构:
这个实时脚本使用生成的脚本文件作为起点,测试部署在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);