通过SDK向IP核发送数组

Sending an array to the IP core through SDK

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

让我们开始说有不同的方式将数据发送到 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 之间的数据