我在用于图像处理的系统生成器中有一个示例设计,它具有一个输入图像和一个输出图像。我想通过 AXI 流接口发送数据并将其作为 IP 核导出到 Vivado IP 集成器,并使用 DMA 和 SDK 中的软件进一步开发设计。
首先,我的设计中是否可以使用 AXI 流接口?如果是,我该如何实施?有谁能够帮我?
提前致谢。(我在这里附上了示例的图像) Image_filter
我在用于图像处理的系统生成器中有一个示例设计,它具有一个输入图像和一个输出图像。我想通过 AXI 流接口发送数据并将其作为 IP 核导出到 Vivado IP 集成器,并使用 DMA 和 SDK 中的软件进一步开发设计。
首先,我的设计中是否可以使用 AXI 流接口?如果是,我该如何实施?有谁能够帮我?
提前致谢。(我在这里附上了示例的图像) Image_filter
我目前正在从事一个非常相似的项目(虽然我没有使用 System Generator),所以我敢打赌我可以给你一些指示。据我所知,SysGen 可以为您的设计生成一些 VHDL 或 Verilog 代码。所以:
获得设计的 HDL 代码后,将其打包为 Vivado 中的新 IP。有很多关于如何做到这一点的教程,稍微搜索一下应该很容易。您应该明智地选择要实现的接口。您肯定需要一个 AXI Stream Slave 接口来接受传入的数据,以及一个 AXI Stream Master 接口来传输结果。
打包 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);
}
如您所见,使用了 DMA。对于 Video-Image 应用程序,我建议使用 Video-DMA (VDMA) 通过流接口发送所有像素信息。之后,在 SDK 中,使用 Board Support Package (BSP) 中的功能可以轻松管理传输。
此外,您可以注意到在上面的代码中明确指定hls::stream< ap_axiu<8,1,1,1> > &video_in,
!这样,我正在创建一个流接口。
在这里您可以找到有关 HLS 图像处理过滤器的教程。在最后一页,有有用的链接。按照它们实现与示例相同的系统。
我希望这可以帮助
如果我理解正确,您想知道如何在系统生成器设计中创建 AXI Stream 接口。
是的,有可能做到这一点。您的设计中应该至少有两个输入名称,例如 image_tdata 和 image_tvalid(网关输入)。当您生成 IP 内核时,sysgen 会将其识别为 AXI STREAM。格式很重要。它必须是“$customname_tdata”和“$customname_tvalid”。您也可以添加其他输入以添加到 AXI STREAM,例如“$customname_tlast”、“$customname_tready”。