Я хочу отправить массив в IP-дизайн через SDK, а не только номер, как показано в следующем фрагменте кода. Может ли кто-нибудь помочь мне в этом? code in SDKОтправка массива в ядро IP через SDK
ответ
Давайте начнем говорить о том, что есть разные способы отправки данных на IP (например, из ARM-процессора в пользовательский IP-адрес в Zynq). Xilinx дает возможность общаться с помощью:
- AXI4 полный интерфейс интерфейс
- AXI4 LITE
- AXI4 STREAM интерфейс
В зависимости от используемого интерфейса, способ, чтобы написать SDK- код, запущенный на ARM, может быть совсем другим. Есть много деталей, но в целом, когда вы создаете 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;
}
Это старый код, используемый для передачи данных от одного процессора ARM в FFT IP с использованием и AXI-DMA.
Here вы можете найти Справочное руководство Акси для того, чтобы иметь лучшее представление о том, как управлять данными между ИС на Xilinx FPGA
Спасибо большое за этот ответ. Это очень информативно. но я хочу знать, как использовать DMA с генерируемыми генераторами системных генераторов xilinx? Thnk вы заранее. – shashi
Задайте еще один вопрос, я буду рад быть полезным !!! в любом случае, если ответ здесь был также полезен, вы можете принять его или повысить! – Leos313
Спасибо вам большое, сэр. Вы использовали xilinx системный генератор IP-ядер в vivado и написали для них программные приложения ... ?? – shashi