2017-01-06 25 views

答えて

0

たとえば、ARMプロセッサからZynqのカスタムIPにデータを送信する方法が異なるとしましょう。ザイリンクスは、あなたの使用して通信する可能性を与えます:

  • AXI4 FULLインタフェース
  • 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あなたは、ザイリンクスFPGA上でその返信用

+0

おかげでたくさんのIPとの間でデータを管理する方法について良いアイデアを持っているために、AXIリファレンスガイドを見つけることができます。その非常に有益な。しかし、私は、ザイリンクスシステムジェネレータがIPコアを生成してDMAを使用する方法を知りたいですか?あなたは事前にThnk。 – shashi

+0

別の質問をする、私は助けになることを嬉しく思う!とにかく、ここの答えが役に立つのであれば、それを受け入れるかupvoteすることができます! – Leos313

+0

ありがとうございました。あなたは、vivadoでザイリンクスのシステムジェネレータのIPコアを使用し、それらのためのソフトウェアアプリケーションを書いていますか? – shashi

関連する問題