通过SDK将阵列发送到IP核

时间:2017-01-06 04:27:14

标签: sdk ip vivado

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

1 个答案:

答案 0 :(得分:1)

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

  • AXI4 FULL界面
  • 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之间管理数据