2017-01-06 20 views

ответ

0

Давайте начнем говорить о том, что есть разные способы отправки данных на 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

+0

Спасибо большое за этот ответ. Это очень информативно. но я хочу знать, как использовать DMA с генерируемыми генераторами системных генераторов xilinx? Thnk вы заранее. – shashi

+0

Задайте еще один вопрос, я буду рад быть полезным !!! в любом случае, если ответ здесь был также полезен, вы можете принять его или повысить! – Leos313

+0

Спасибо вам большое, сэр. Вы использовали xilinx системный генератор IP-ядер в vivado и написали для них программные приложения ... ?? – shashi

 Смежные вопросы

  • Нет связанных вопросов^_^