【问题标题】:Sending an array to the IP core through SDK通过 SDK 向 IP 核发送数组
【发布时间】:2017-01-06 04:27:13
【问题描述】:

我想通过 SDK 向 IP 设计发送一个数组,而不仅仅是一个数字,如下面的代码 sn-p 所示。有人可以帮我这样做吗? code in SDK

【问题讨论】:

    标签: sdk ip vivado


    【解决方案1】:

    让我们开始说有不同的方式将数据发送到 IP(例如从 ARM 处理器到 Zynq 中的自定义 IP)。 Xilinx 让您可以使用以下方式进行交流:

    • AXI4 全接口
    • AXI4 LITE 接口
    • AXI4 STREAM 接口

    根据您使用的接口,编写在 ARM 上运行的 SDK 代码的方式可能会大不相同。有很多细节,但一般来说,当您创建 IP 时,在导出硬件并启动 SDK 后,Vivado 会为您创建库和驱动程序,以便将数据和命令发送到每个特定 IP。举个例子,假设您正在使用 AXI STREAM 接口。在这里,您应该添加另一个 IP(由 Xilinx 提供)来管理从内存到 IP 的数据传输,反之亦然(DMA - 直接内存访问)。这里的代码应该是:

    #include <stdio.h>
    #include "xil_cache.h"
    #include "xaxidma.h"
    #include "xparameters.h"
    #include "math.h"
    #include "xtime_l.h"
    XTime tstart,tstop;
    
    //#define DEBUG
    #define N_samples 64
    
    
    int main()
    {
    
    
        printf("Hello\n");
        Xil_DCacheDisable();
        Xil_ICacheDisable();
        /***************** Variables *******************/
    
        float input_R_IM[N_samples*2];
        float output_R_IM[N_samples*2];
        int error=-1;
        XAxiDma dma0_pointer;
        XAxiDma_Config *dma0_Config;
    
    
        /**********************DMA initialization***************************/
    
        dma0_Config=XAxiDma_LookupConfig(XPAR_AXIDMA_0_DEVICE_ID);
        error=XAxiDma_CfgInitialize(&dma0_pointer,dma0_Config);
    #ifdef DEBUG
        if(error==XST_SUCCESS)
            printf("...initialization successful\n");
        else
            printf("**ERROR INITIALIZATION\n");
    #endif
        float d = 2 * (float)M_PI / N_samples;
    
    
    
        size_t i=NULL;
        for (i = 0; i < N_samples; i++)
        {
            input_R_IM[i*2]=sin(0 + d*i);
            input_R_IM[i*2+1]=0;
        }
    
        /**********************STARTING FFT************************/
        error=-1;
        XTime_GetTime(&tstart);
        error = XAxiDma_SimpleTransfer(&dma0_pointer,(u32)input_R_IM,2*N_samples*sizeof(float),XAXIDMA_DMA_TO_DEVICE);
    #ifdef DEBUG
        if(error==XST_SUCCESS)
            printf("...simply transfer 1 successful\n");
        else
            printf("**ERROR SIMPLY TRANSFER 1\n");
    #endif
    
        /***********************COPY BACK THE RESULTS************************/
    //  error=-1;
        error = XAxiDma_SimpleTransfer(&dma0_pointer,(u32)output_R_IM,2*N_samples*sizeof(float),XAXIDMA_DEVICE_TO_DMA);
    #ifdef DEBUG
        if(error==XST_SUCCESS)
            printf("...simply transfer 2 successful\n");
        else
            printf("**ERROR SIMPLY TRANSFER 2\n");
    #endif
        XTime_GetTime(&tstop);
        u64 cycles = tstop-tstart;
        float t = ((float)cycles / COUNTS_PER_SECOND)*1000000;
        printf("cycles= %lld (time = %f us)\n",cycles,t);
    
        for (i = 0; i < N_samples; i++)
        {
            printf("i: %d real=> %f  --imag==> %f \n" ,i, output_R_IM[i*2], output_R_IM[i*2+1]);
        }
    
        printf("Goodbye\n");
        return 0;
    }
    

    这是一个旧代码,用于使用 AXI-DMA 将数据从一个 ARM 处理器发送到 FFT IP。

    Here您可以找到 AXI 参考指南,以便更好地了解如何在 Xilinx FPGA 上管理 IP 之间的数据

    【讨论】:

    • 非常感谢您的回复。它的信息量很大。但我想知道如何将 DMA 与 xilinx 系统生成器生成的 IP 核一起使用?提前谢谢你。
    • 再问一个问题,我很乐意为您提供帮助!!!无论如何,如果这里的答案也有帮助,您可以接受或投票!
    • 非常感谢先生。您是否在 vivado 中使用过 xilinx 系统生成器 IP 内核并为它们编写软件应用程序...??
    • 是的,我经常这样做
    • 没有。你可以在这里提问,我会尽力帮助你。我不能给你个人信息,很抱歉。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2014-06-05
    • 2016-02-17
    相关资源
    最近更新 更多