我想通过SDK将数组发送到IP设计,而不仅仅是一个数字,如下面的代码片段所示。有人可以帮我这么做吗? code in SDK
答案 0 :(得分:1)
让我们开始说有不同的方式将数据发送到IP(例如从ARM处理器到Zynq中的自定义IP)。 Xilinx为您提供了使用以下方式进行通信的可能性:
根据您使用的界面,编写在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之间管理数据