Xilinx系统生成器IP中的AXI流接口

时间:2017-02-01 05:33:51

标签: image-processing vivado vivado-hls

我在系统生成器中有一个用于图像处理的示例设计,它具有一个输入图像和一个输出图像。 我想通过AXI流接口发送数据并将其作为IP核导出到Vivado IP集成商,并使用SDK中的DMA和软件进一步开发设计。

首先,我的设计中是否可以使用AXI流接口?如果是,我该如何实施呢?有人能帮助我吗?

提前致谢。 (我附上了这个例子的图像) Image_filter

3 个答案:

答案 0 :(得分:1)

我目前正在开展一个非常类似的项目,(我现在不使用System Generator),所以我打赌我可以给你一些指示。据我所知,SysGen可以为您的设计生成一些VHDL或Verilog代码。所以:

获得设计的HDL代码后,将其打包为Vivado中的新IP。有很多关于如何做到这一点的教程,通过一点点搜索应该很容易。您应该明智地选择要实现的接口。您肯定需要AXI Stream Slave接口来接收输入数据,而AXI Stream Master接口则需要传输结果。

打包IP后,您可以开始逐块构建系统(还有一些很好的教程,请参阅答案结束)。您将需要使用AXI DMA IP(或视频DMA,​​具体取决于您的需要),您必须正确配置它,如选择寄存器模式或分散 - 聚集,通道等。

要非常小心地正确生成正确的AXI同步信号,因为它们可能完全破坏您的设计(和神经)。这很容易但是需要对Xilinx提供的AXI文档进行一些研究(ARM的文档太复杂了我的口味)。

最后,您肯定会找到有关以下资源的非常有用的信息:

  1. https://en.wikipedia.org/wiki/Adapter_pattern

  2. Xilinx Forum

  3. FPGAdeveloper's example

  4. another AXI-stream based design example

  5. FPGA note wiki

  6. AXI DMA Product Guide

  7. 祝你好运!

    PS:模拟器是你的朋友!切勿尝试将新编写的代码直接应用到系统设计中。 Modelsim可以为您节省大量的时间和精力,否则将花费在无意义的调试上。

答案 1 :(得分:0)

  

首先,我的设计中是否可以使用AXI流接口?

是的,是的。

  

如果是,我该如何实施?有人能帮助我吗?

我在Vivado 2015.3中开发了类似的项目:图像过滤器(使用“高级综合”创建)和此设计块: Design Block of the complete system

高级综合代码应如下所示:

#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);

}

您可以注意到,使用了DMA。对于视频图像应用程序,我建议使用视频DMA(VDMA)通过流接口发送所有像素信息。之后,在SDK中,可以使用Board Support Package(BSP)中的功能轻松管理传输。

另外,您可以注意到,在上面的代码中明确指定了hls::stream< ap_axiu<8,1,1,1> > &video_in,!通过这种方式,我正在创建一个流媒体界面。

Here您可以找到有关HLS图像处理过滤器的教程。在最后一页中,有一些有用的链接。跟着他们来实现这个例子的相同系统。

我希望这可以提供帮助

答案 2 :(得分:0)

如果我理解正确,您想知道如何在系统生成器设计中创建 AXI Stream 接口。

是的,可以做到。您的设计中应该至少有两个输入名称,例如 image_tdata 和 image_tvalid(网关输入)。当您生成 IP 核时,sysgen 会将其识别为 AXI STREAM。格式很重要。它必须是“$customname_tdata”和“$customname_tvalid”。您也可以添加其他输入以添加到 AXI STREAM,例如“$customname_tlast”、“$customname_tready”。