2

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

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

提前致谢。(我在这里附上了示例的图像) Image_filter

4

3 回答 3

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. 赛灵思论坛

  2. FPGA开发者的例子

  3. 另一个基于 AXI 流的设计示例

  4. FPGA笔记维基

  5. AXI DMA 产品指南

  6. TU Kaiserslautern 的 Sadri 博士频道,对深入理解 AXI 设计理念很有帮助

祝你好运!

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

于 2017-02-02T00:51:31.613 回答
1

首先,我的设计中是否可以使用 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);

}

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

此外,您可以注意到在上面的代码中明确指定hls::stream< ap_axiu<8,1,1,1> > &video_in,!这样,我正在创建一个流接口。

在这里您可以找到有关 HLS 图像处理过滤器的教程。在最后一页,有有用的链接。按照它们实现与示例相同的系统。

我希望这可以帮助

于 2017-02-02T13:43:42.943 回答
0

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

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

于 2021-02-05T23:37:43.317 回答