Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing Xilinx系统生成器IP中的AXI流接口_Image Processing_Vivado_Vivado Hls - Fatal编程技术网

Image processing Xilinx系统生成器IP中的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

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

首先,在我的设计中是否可能有AXI流接口?如果是,我如何实施?有人能帮我吗

提前谢谢。 (我在此附上示例的图像)

我目前正在从事一个非常类似的项目(虽然我没有使用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”。

    如果以下答案之一有帮助,您可以投票支持或接受其中一个。如果你还有其他问题,当然可以继续问