2017-01-06 67 views

回答

0

讓我們開始說有不同的方式發送數據到IP(例如從ARM處理器到Zynq中的自定義IP)。賽靈思讓你使用溝通的可能性:

  • AXI4全接口
  • AXI4 LITE接口
  • AXI4流接口

根據所使用的接口,寫SDK-道路上在ARM上運行的代碼可能完全不同。有很多細節,但通常在創建IP時,在導出硬件並啓動SDK後,Vivado會爲您創建庫和驅動程序,以便將數據和命令發送到每個特定的IP。只是給你一個例子,假設你正在使用AXI STREAM接口。在這裏您應該添加另一個IP(由賽靈思提供),用於管理從內存到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 IP之間的數據

+0

非常感謝該回復一個更好的主意找一個AXI參考指南。它非常豐富。但我想知道如何使用xilinx系統生成器生成的IP內核使用DMA?請提前告訴你。 – shashi

+0

問另一個問題,我會很樂意提供幫助!無論如何,如果這裏的答案也有幫助,你可以接受它或upvote! – Leos313

+0

謝謝你,先生。您是否在Vivado中使用了xilinx系統生成器IP內核併爲它們編寫軟件應用程序......? – shashi