FC2カウンター FPGAの部屋 WSL2 上で動作する Vitis 2020.2 で ZYBO Z7-10 をコンフィグレーションして、アプリケーション・ソフトウェアを走らせる
fc2ブログ

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

FPGAの部屋

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

WSL2 上で動作する Vitis 2020.2 で ZYBO Z7-10 をコンフィグレーションして、アプリケーション・ソフトウェアを走らせる

WSL2 上で動作する Vivado 2020.2 で ZYBO Z7-10 をコンフィグレーションする”では WSL 上で動作する Linux 版の Vivado 2020.2 から Windows 10 上で動作する hw_server に接続している ZYBO Z7-10 にコンフィギュレーションすることができた。
今回は、WSL2 上で動作する Linux 版の Vitis 2020.2 から Windows 10 上で動作する hw_server に接続している ZYBO Z7-10 にコンフィギュレーションし、更にアプリケーション・ソフトウェアを起動して動作させてみよう。

最初に WSL2 上で Vitis HLS 2020.2 の DMA_pow2 プロジェクトを作成して、DMA pow2 IP を作成する。

WSL2 上の Vitis HLS 2020.2 の DMA_pow2 プロジェクトを示す。
WSL2_15_210622.png

DMA_pow2n.cpp のソース・ファイルを貼っておく。

// DMA_pow2.cpp
// 2018/05/08 by marsee
//

int DMA_pow2(volatile int *in, volatile int *out){
#pragma HLS INTERFACE s_axilite port=out
#pragma HLS INTERFACE s_axilite port=in
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
#pragma HLS INTERFACE s_axilite port=return

    for (int i=0; i<10; i++){
        int temp = in[i];
        out[i] = temp * temp;
    }

    return(0);
}



C コードの合成結果を示す。
WSL2_16_210623.png

Export RTL 結果を示す。
WSL2_17_210623.png

WSL2 上の Vivado 2020.2 で DMA_pow2_test プロジェクトを作成した。
下の図は、論理合成、インプリメンテーション、ビットストリームの生成が終了した状態だ。
WSL2_18_210623.png

DMA_pow2_test ブロックデザインを示す。
WSL2_19_210623.png

Address Map を示す。
WSL2_20_210623.png

Project Summary を示す。
WSL2_21_210623.png

ハードウェアをエクスポートして、XSAファイルを作成した。

Vivado 2020.2 の Tools メニューから Launch Vitis IDE を選択して、Vitis 2020.2 を起動する。

Vitis 2020.2 が起動して Workspace を設定するので、DMA_pow2_test フォルダに vitis_work フォルダを新規作成して、Workspace
として設定した。

DMA_pow2_test アプリケーション・プロジェクトの作成時に、DMA_pow2_test_wrapper プラットフォームを作成した。

tset_dma.c を作成して、DMA_pow2_test アプリケーション・プロジェクトの src フォルダに入れた。

DMA_pow2_test アプリケーション・プロジェクトのビルドを行って成功した。
WSL2_22_210623.png

Assistant ウインドウで、DMA_pow2_test_system -> DMA_pow2_test -> Debug を右クリックし、Run -> Run Configuration... を選択する。
Run Configuration ダイアログが開いた。
Single Application Debug を右クリックし、右クリックメニューから New Configuration を選択する。
WSL2_23_210623.png

Dubugger_DMA_pow2_test-Default コンフィグレーションが生成された。
Connection の New ボタンをクリックする。
WSL2_24_210624.png

Target Connection Details ダイアログが表示された。
ここで New Target Connection を作成して Test Connection ボタンをクリックして、テストしたのだが、パケットが届かないというダイアログばかりが表示された。(実際は届いていたようだ)
なお、Windows 10 のファイヤー・ウォールで、3121 TCPポートは開けてある。”WSL2 上で動作する Vivado 2020.2 で ZYBO Z7-10 をコンフィグレーションする”を参照。

いろいろと試行錯誤したときに”AR# 64759: SDK - リモート ターゲット デバッグ用の設定”を見つけた。これによると、PowerShell で hw_server を起動するのではなく、XSCT コンソールから hw_server を起動している。
XSCT コンソールを使用すると、2020.2 のインストール・フォルダに行く必要がないので、この方が良さそうだ。
XSCT コンソールはWindows 10 のスタートボタンをクリックし、Xilinx Design Tools -> Xilinx Software Commandline Tool (XSCT) v2020.2.2 で起動することができる。

XSCT コンソールで hw_server を起動した。
WSL2_25_210624.png

Target Connection Details ダイアログで、Target Name と Host に IP アドレスを入れて、Advanced ボタンをクリックすると Zybo Z7 が出ているので大丈夫そうだ。
OKボタンをクリックする。
クリック後にまた、パケット届いていないというダイアログが出るが無視して良いようだ。
WSL2_26_210624.png

Tera Term を立ち上げて、ZYBO Z7-10のシリアルポートに接続する。

Run Configuration ダイアログで、Apply ボタンをクリックし、Run ボタンをクリックした。
WSL2_27_210624.png

Tera Term に演算の結果が表示された。成功だ。
WSL2_28_210624.png

test_dma.c を貼っておく。
このコードのバグにフィックスでは、IDA さんにお世話になりました。ありがとうございます。

/* * test_dma.c * *  Created on: 2017/12/02 *      Author: masaaki */

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

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

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

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

    // 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_in_r(&XDMA_pow2_ap, (u32)&data[0]);
    XDma_pow2_Set_out_r(&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(); // Flush result[10] cache to memory

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

    return 0;

}


しかし、パケットが届いていないというダイアログが出ているのに、パケットが届いているとはどういう訳だろう。。。
人騒がせなバグだ。だいぶ時間をロスしてしまった。。。
  1. 2021年06月24日 05:14 |
  2. WSL2
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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