FC2カウンター FPGAの部屋 2021年07月27日
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DFX をやってみよう12(DMA_square_root8 の実行)

DFX をやってみよう11(ハードウェアのエクスポートとフル・ビット・ファイルの動作確認)”の続き。

前回は、ハードウェアをエクスポートして、Vitis 2021.1 を立ち上げて、フル・ビット・ファイルを ZYBO Z7-20 にコンフィギュレーションし、実機動作を確認できた。今回は、DMA_pow2 IP の代わりに DMA_square_root8 IP のフル・ビット・ファイルの動作を確認してから、パーシャル・ビット・ファイルをコンフィグレーションして動作を確認する。

DFX_test_wrapper プラットフォームを元に DMA_square_root8 アプリケーション・プロジェクトを作成した。
DFX_107_210725.png

Explorer ウインドウで DMA_square_root8_system -> DMA_square_root8 -> src に DMA_square_root8.c を作成した。同じディレクトリに DMA_square_root8 IP の xdma_square_root8_hw.h をインポートした。

DMA_square_root8.c を貼っておく。

// DMA_square_root8.c
// 2021/07/26 by marsee
//

#include "xil_io.h"
#include "xdma_square_root8_hw.h"

volatile int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile int result[10];

void Xil_DCacheFlush(void);
void Xil_DCacheInvalidate(void);

#define XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR 0x40010000

int main(){
    int i;

    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_DATA_DATA), (u32)&data[0]);
    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_RESULT_DATA), (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    Xil_Out32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR,(u32)1); // Start

    while(!(Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR)&0x2)); // Wait ap_done

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Assistant ウインドウで DMA_square_root8_system -> DMA_square_root8 -> Debug を右クリックし右クリックメニューから Run -> Run Configuration... を選択する。
Single Application Debug をクリックして、 Debugger_DMA_square_root8 を作成した。
DFX_108_210725.png

Bitstream File に child_0_impl_1/DFX_test_wrapper.bit を指定して、 Run ボタンをクリックする。
DFX_109_210725.png

gtkterm の結果を示す。平方根が取れている。
DFX_110_210725.png

次に DMA_pow2_test.c を DFX 用に変更した。
DMA_pow2_test.c のコードを示す。

// DMA_pow2_test.c
// 2021/07/25 by marsee
//

#include <stdio.h>
#include "xdma_pow2.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xdma_square_root8_hw.h"

volatile int data[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile int result[10];

void Xil_DCacheFlush(void);
void Xil_DCacheInvalidate(void);

#define XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR 0x40010000

int main(){
    XDma_pow2 XDMA_pow2_ap;
    XDma_pow2_Config *XDMA_pow2_apPtr;
    int i, inbyte_in;

    // Look Up the device configuration
    XDMA_pow2_apPtr = XDma_pow2_LookupConfig(0);
    if (!XDMA_pow2_apPtr){
        fprintf(stderr, "XDma_pow2 configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XDma_pow2_CfgInitialize(&XDMA_pow2_ap, XDMA_pow2_apPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XDma_pow2\n");
        return(-1);
    }

    XDma_pow2_Set_data(&XDMA_pow2_ap, (u32)&data[0]);
    XDma_pow2_Set_result(&XDMA_pow2_ap, (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    XDma_pow2_Start(&XDMA_pow2_ap);

    while(!XDma_pow2_IsDone(&XDMA_pow2_ap)) ;

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    printf("Configure the partial bit file in Vivado and then press any key.");
    fflush(stdout);
    inbyte_in = inbyte();
    printf("\n"); fflush(stdout);

    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_DATA_DATA), (u32)&data[0]);
    Xil_Out32((XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR+XDMA_SQUARE_ROOT8_CONTROL_ADDR_RESULT_DATA), (u32)&result[0]);

    Xil_DCacheFlush(); // Flush data[10] cache to memory

    Xil_Out32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR,(u32)1); // Start

    while(!(Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR)&0x2)); // Wait ap_done

    Xil_DCacheInvalidate(); // Invalidate result[10]
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Run ボタンをクリックして、アプリケーション・ソフトウェアを起動した。
2乗を行って、”Configure the partial bit file in Vivado and then press any key.”で止まっている。
DFX_112_210725.png

Vivado で Flow Navigator の PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして、出てきた Auto Connect をクリックする。
Hardware Manager が開く。 Program device をクリックする。
Prgram Device ダイアログが表示された。
Bitstream File に DFX_test_211/DFX_test_211.runs/child_0_impl_1/DFX_test_i_DMA_pow2_DMA_square_root8_inst_0_partial.bit を指定した。
Program ボタンをクリックする。
DFX_113_210725.png

gtkterm の”Configure the partial bit file in Vivado and then press any key.”で Enter キーをクリックすると、止まっている。
DFX_114_210725.png

どうやら、最初の Xil_Out32() で止まってしまうようだ。
DFX うまく行かない。

因みに、途中で、 DMA_square_root8 のパーシャル・ビット・ファイルをコンフィグレーションしないと動作する。
DFX_115_210725.png

どうしよう?
ソフトウェア無しで、テストできる IP を作ってテストしてみようか?
  1. 2021年07月27日 22:04 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0