Image processing Xilinx系统生成器IP中的AXI流接口
我有一个图像处理系统生成器的设计示例,它有一个输入图像和一个输出图像。 我想通过AXI stream接口发送数据,并将其作为IP核心导出到Vivado IP integrator,并使用DMA和SDK中的软件进一步开发设计 首先,在我的设计中是否可能有AXI流接口?如果是,我如何实施?有人能帮我吗 提前谢谢。 (我在此附上示例的图像)Image processing Xilinx系统生成器IP中的AXI流接口,image-processing,vivado,vivado-hls,Image Processing,Vivado,Vivado Hls,我有一个图像处理系统生成器的设计示例,它有一个输入图像和一个输出图像。 我想通过AXI stream接口发送数据,并将其作为IP核心导出到Vivado IP integrator,并使用DMA和SDK中的软件进一步开发设计 首先,在我的设计中是否可能有AXI流接口?如果是,我如何实施?有人能帮我吗 提前谢谢。 (我在此附上示例的图像) 我目前正在从事一个非常类似的项目(虽然我没有使用System Generator),所以我打赌我可以给你一些建议。据我所知,SysGen可以生成一些您设计的VHD
我目前正在从事一个非常类似的项目(虽然我没有使用System Generator),所以我打赌我可以给你一些建议。据我所知,SysGen可以生成一些您设计的VHDL或Verilog代码。因此: 在获得设计的HDL代码后,将其打包为Vivado中的新IP。关于如何实现这一点,有很多教程,只需稍加搜索即可轻松完成。您应该明智地选择要实现的接口。您肯定需要一个用于接收传入数据的AXI流从接口和一个用于传输结果的AXI流主接口 打包IP后,可以开始逐块构建系统(也有一些很好的教程,请参阅答案的结尾)。您将需要使用AXI DMA IP(或视频DMA,取决于您的需要),并且必须正确配置它,如选择寄存器模式或散射-聚集、通道等 要非常小心地正确生成正确的AXI同步信号,因为它们会完全破坏您的设计(和神经)。这很容易,但需要对Xilinx提供的AXI文档进行一些研究(ARM的文档太复杂了,我不喜欢) 最后,您肯定会找到关于以下资源的非常有用的信息: 祝你好运 PS:模拟器是你的朋友!永远不要尝试直接在系统设计中实现新编写的代码。Modelsim可以为您节省大量的时间和精力,否则这些时间和精力将花费在无意义的调试上 首先,在我的设计中是否可能有AXI流接口 是的 如果是,我如何实施?有人能帮我吗 我在Vivado 2015.3中开发了一个类似的项目:图像过滤器(通过“高级合成”创建)和此设计块: 高级合成代码应该如下所示:
#include "top.h"
void hls_sobel(
hls::stream< ap_axiu<8,1,1,1> > &video_in,
hls::stream< ap_axiu<8,1,1,1> > &video_out
)
{
ap_uint<16> Image_w=IMAGE_W_MAX;
ap_uint<16> Image_h=IMAGE_H_MAX;
// Create AXI streaming interfaces for the core
#pragma HLS INTERFACE axis port=video_in bundle=video_in
#pragma HLS INTERFACE axis port=video_out bundle=video_out
// No control interface - auto-start as soon as there's an input frame
#pragma HLS INTERFACE ap_ctrl_none port=return // no handshakes
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> mat_in(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> mat_out(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> inx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> iny(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> sobelx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> sobely(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> zerox(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_16SC1> zeroy(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> absx(Image_h, Image_w);
hls::Mat<IMAGE_H_MAX, IMAGE_W_MAX, HLS_8UC1> absy(Image_h, Image_w);
#pragma HLS dataflow
// read input and convert from axi-stream to Mat
hls::AXIvideo2Mat(video_in, mat_in);
// calculate Sobel in X and Y directions
hls::Duplicate(mat_in, inx, iny);
hls::Sobel<1,0,3>(inx, sobelx);
hls::Sobel<0,1,3>(iny, sobely);
// calculate abs of said Sobel
hls::Zero(zerox);
hls::Zero(zeroy);
hls::AbsDiff(sobelx, zerox, absx);
hls::AbsDiff(sobely, zeroy, absy);
// add both abs
hls::AddWeighted(absx, 1, absy, 1, 0, mat_out);
// write output
hls::Mat2AXIvideo(mat_out, video_out);
}
#包括“top.h”
索贝尔酒店(
hls::流&视频输入,
hls::流&视频输出
)
{
ap_uint Image_w=Image_w_MAX;
ap_uint Image_h=Image_h_MAX;
//为核心创建AXI流媒体接口
#pragma HLS接口轴端口=捆绑中的视频\ U=捆绑中的视频\ U
#pragma HLS接口轴端口=视频输出束=视频输出
//无控制界面-有输入帧时自动启动
#pragma HLS接口ap\u ctrl\u none端口=返回//无握手
hls::Mat Mat_in(图h、图w);
hls::Mat Mat out(图像h、图像w);
hls::Mat inx(图像h,图像w);
hls::Mat iny(图像h、图像w);
hls::Mat sobelx(图h、图w);
hls::Mat sobely(图h、图w);
hls::Mat zerox(图像h,图像w);
hls::Mat zeroy(图像h,图像w);
hls::Mat absx(图像h,图像w);
hls::Mat absy(图h、图w);
#pragma HLS数据流
//读取输入并将axi流转换为Mat
hls::AXIvideo2Mat(视频输入,矩阵输入);
//在X和Y方向计算Sobel
hls::重复(材料英寸、英寸、英寸);
hls::Sobel(inx,sobelx);
hls::Sobel(iny,sobely);
//计算所述Sobel的abs
hls::零(zerox);
hls::零(zeroy);
hls::AbsDiff(sobelx,zerox,absx);
hls::AbsDiff(sobely,zeroy,absy);
//添加两个abs
hls::添加加权(absx,1,absy,1,0,mat_out);
//写入输出
hls::Mat2AXIvideo(mat输出、视频输出);
}
正如您所注意到的,使用了DMA。对于视频图像应用程序,我建议使用视频DMA(VDMA)通过流接口发送所有像素信息。之后,在SDK中,可以使用Board Support Package(BSP)中的功能轻松管理传输
另外,您可以注意到,在上面的代码中明确指定了hls::stream&video\u in,
!通过这种方式,我创建了一个流接口
您可以找到关于HLS图像处理过滤器的教程。在最后一页中,有一些有用的链接。按照它们实现与示例相同的系统
如果我理解正确,我希望这能有所帮助,您想知道如何在system generator设计中创建AXI流接口
是的,这是可能的。您的设计中应该至少有两个名称为的输入,例如image_tdata和image_tvalid(中的网关)。当您生成IP核心时,sysgen会将其重新编码为AXI流。格式很重要。它必须是“$customname\u tdata”和“$customname\u tvalid”。您还可以添加其他输入,以添加到AXI流中,例如“$customname\u tlast”、“$customname\u tready”。如果以下答案之一有帮助,您可以投票支持或接受其中一个。如果你还有其他问题,当然可以继续问