通过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 之间的数据
我想通过 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 之间的数据