通过SDK向IP核心发送阵列

通过SDK向IP核心发送阵列,sdk,ip,vivado,Sdk,Ip,Vivado,我想通过SDK向IP设计发送一个数组,而不仅仅是下面代码段中显示的一个数字。有人能帮我吗? 让我们开始说,有不同的方式将数据发送到IP(例如从ARM处理器发送到Zynq中的自定义IP)。Xilinx为您提供了通过以下方式进行沟通的可能性: AXI4全接口 AXI4 LITE接口 AXI4流接口 根据您使用的接口,编写在ARM上运行的SDK代码的方式可能会有很大不同。有很多细节,但一般来说,当您创建IP时,在导出硬件并使用SDK之后,Vivado会为您创建库和驱动程序,以便向每个特定IP发送数

我想通过SDK向IP设计发送一个数组,而不仅仅是下面代码段中显示的一个数字。有人能帮我吗?

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

  • AXI4全接口
  • AXI4 LITE接口
  • AXI4流接口
根据您使用的接口,编写在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;
}
#包括
#包括“xil_cache.h”
#包括“xaxidma.h”
#包括“xparameters.h”
#包括“math.h”
#包括“xtime_l.h”
xtimetstart,tstop;
//#定义调试
#定义N_样本64
int main()
{
printf(“Hello\n”);
Xil_DCacheDisable();
Xil_ICacheDisable();
/*****************变数*******************/
浮点输入_R_IM[N_samples*2];
浮点输出R_IM[N_样本*2];
int错误=-1;
Xaximma dma0_指针;
Xaximma_配置*dma0_配置;
/**********************DMA初始化***************************/
dma0_Config=XAxiDma_LookupConfig(XPAR_AXIDMA_0_设备_ID);
错误=XAxiDma\u cfg初始化(&dma0\u指针,dma0\u配置);
#ifdef调试
如果(错误==XST_成功)
printf(“…初始化成功\n”);
其他的
printf(“**错误初始化\n”);
#恩迪夫
浮点数d=2*(浮点数)M_PI/N_样本;
大小i=空;
对于(i=0;i%f--imag=>%f\n”,i,output\R\u IM[i*2],output\R\u IM[i*2+1]);
}
printf(“再见”);
返回0;
}
这是一个旧代码,用于使用和AXI-DMA将数据从ARM处理器之一发送到FFT IP。


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

非常感谢您的回复。它的信息量很大。但我想知道如何将DMA与xilinx system generator生成的IP核一起使用?提前谢谢你。再问一个问题,我很乐意帮忙!!!无论如何,如果这里的答案也有帮助,你可以接受它或投票!非常感谢你,先生。您是否在vivado中使用xilinx system generator IP核并为其编写软件应用程序…?是的,我使用过,而且通常不使用。你可以在这里提问,我会尽力帮助你。对不起,我不能给你个人信息。