FC2カウンター FPGAの部屋 AXI Master インターフェースを含む IP を DFX する2
fc2ブログ

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

FPGAの部屋

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

AXI Master インターフェースを含む IP を DFX する2

AXI Master インターフェースを含む IP を DFX する1”の続き。

DFX Coupler と DFX Shutdown Manager をブログで勉強してきたが、その内の DFX Coupler を使用して、前回 DFX に失敗した DMA_pow2 IP と DMA_square_root8 IP の DFX をやっていこうということで、前回は、Vivado 2021.1 で ZYBO Z7-20 の DFX_test プロジェクトを作成し、 DMA_pow2 IP と DMA_square_root8 IP の DFX のブロック・デザインを作成して、ビット・ファイルを作成できた。そして、ハードウェアをエクスポートして、 XSA ファイルを作成した。
今回は、Vitis 2021.1 でプラットフォームとアプリケーション・プロジェクトを作成し、DMA_pow2 と DMA_square_root8 の DFX を実機で確かめてみよう。

Vivado 2021.1 から Vitis 2021.1 を起動して、 DFX_test_211 ディレクトリの下に、 vitis_work ディレクトリを作成した。

DFX_trest_wrapper プラットフォームと DMA_pow2_test アプリケーション・プロジェクトを作成した。

DMA_pow2_test アプリケーション・プロジェクトに DMA_pow2_test3.c ファイルを新規作成した。
DMA_square_root8 IP のドライバから xdma_square_root8_hw.h を vitis_work/DMA_pow2_test/src ディレクトリにインポートした。
ビルドして成功した。
DFX2_16_210804.png

DMA_pow2_test3.c を貼っておく。

// DMA_pow2_test3.c
// 2021/08/01 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 0x40000000

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

    // 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]);
    }

    Xil_Out32(XPAR_DFX_DECOUPLER_0_BASEADDR, 1); // 1: Turn decoupling on

    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_DFX_DECOUPLER_0_BASEADDR, 0); // 1: Turn decoupling off

    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

    status = Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR);
    //while(!(status & 0x2)) // Wait ap_done
        //status = Xil_In32(XPAR_XDMA_SQUARE_ROOT8_0_BASEADDR);
    sleep(1);

    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;

}


ZYBO Z7-20 に電源をON にして、 gtkterm を立ち上げて 115200 bps, 8 bit, no stop bit で ZYBO Z7-20 に接続する。

VItis の Explorer ウインドウの DMA_pow2_test_system をクリックして、Run ボタンをクリックする。

ZYBO Z7-20 をコンフィギュレーションして、 DMA_pow2_test.elf が走る。

2 乗した結果を表示して、”Configure the partial bit file in Vivado and then press any key.”を表示して、キー入力待ちで停止した。
DFX2_17_210804.png

Vivado で Flow Navigator の PROGRAM AND DEBUG -> Open Hardware Manager -> Open Target をクリックして、出てきた Auto Connect をクリックする。
Hardware Manager が開く。 Program device をクリックする。
DFX2_18_210804.png

Prgram Device ダイアログが表示された。
Bitstream File に DFX_test_211/DFX_test_211.runs/child_0_impl_1/DFX_test_i_DMA_pow2_DMA_square_root8_0_inst_0_partial.bit を指定した。
Program ボタンをクリックする。
DFX2_19_210804.png

gtkterm に戻って、Enter キーを押したところ、平方根の値が表示された。
DFX2_20_210804.png

AXI4 Master インターフェースを持つブロック・デザイン・コンテナの DFX が成功した。
やった。。。IDAさんありがとうございました


追加で一言、RM のドライバが Vitis に伝わらないのが不満だな。。。それで、DMA_square_root8 のコードにドライバを使えなかった。Vitis が DFX 対応になって欲しい。
  1. 2021年08月05日 04:56 |
  2. Dynamic Function eXchange
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/5316-779d9ce3
この記事にトラックバックする(FC2ブログユーザー)