FC2カウンター FPGAの部屋 2019年12月
FC2ブログ

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

FPGAの部屋

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

Vitis 2019.2 のアプリケーション・プロジェクトの作り方3

Vitis 2019.2 のアプリケーション・プロジェクトの作り方2”の続き。

自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思うということで、前回は、ビルド後のSummary を観察した。
今回は、出来上がったSD_CARD イメージをMicroSD カードに書いて、実際にUltra96-V2 でテストしてみよう。

Vitis 2019.2 の左下の Assistant ウインドウで vitis_ctut_systerm -> vitis_ctut -> Hardware -> SD Card Image を右クリックし右クリックメニューから Open -> Open in File Browser を選択した。
Vitis_tub_38_191211.png

すると vitis_ctut/Hardware/sd_card ディレクトリが開く。
Vitis_tub_39_191211.png

このディレクトリの内容を、MircroSD カードの第 1 パーティションに書き込む。
Vitis_tub_33_191211.png

Root FS はすでに書いてあるので、Ultra96-V2 に挿入して、電源ON した。
PetaLinux が起動した。
root ノーパスでログインした。
zocl ドライバを insmod でロードした。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko

アプリケーションを起動した。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./vitis_ctut.exe binary_container_1.xclbin

Vitis_tub_34_191211.png

Vitis_tub_35_191211.png

TEST WITH ONE KERNEL PASSED と表示された。成功だ。

2 回目やってみた。
./vitis_ctut.exe binary_container_1.xclbin
Vitis_tub_36_191211.png

3 回目。
./vitis_ctut.exe binary_container_1.xclbin
Vitis_tub_37_191211.png
  1. 2019年12月11日 04:27 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis 2019.2 のアプリケーション・プロジェクトの作り方2

Vitis 2019.2 のアプリケーション・プロジェクトの作り方1”の続き。

自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思うということで、前回は、Xilinx 社のGitHub の Xilinx/Vitis-Tutorials の Mixing C++ and RTL Kernels のソースコードを使用してVitis 2019.2 のプロジェクトを作成し、ビルドする手順を行うことができた。今回は、ビルド後のSummary を見ていこう。

Vitis のビルド後のSummary を見るのに便利なのは、binary_container_1.xclbin.link_summary を見ることのようだ。
Vitis 2019.2 の左上のウインドウ Explorer の vitis_ctut_system -> vitis_ctut -> Hardware -> binary_container_1.xclbin.link_summary をダブルクリックすると、Vitis Analyzer が起動する。
Vitis_tub_16_191210.png

Vitis_tub_17_191210.png

binary_contaianer_1 (Hardware) のSummary が表示されている。

左ウインドウの項目をクリックしていく。

System Diagram をクリックした。
Vitis_tub_18_191210.png

これは、binary_contaianer_1 (Hardware) の接続ブロック図?かな?
Vivado のブロックデザインを見てみると、確かに Zynq UltraScale+ MPSoC の S_AXI_HP0_FPD にAXI4 Master のポートが接続されている。
Vitis_tub_32_191210.png

Platform Diagram をクリックした。
Vitis_tub_19_191210.png

これは、AXI4 Master が HP ポートで接続されていて、AXI4 Lite Slave がHPC ポートで接続されているという図かな?

System Estimate をクリックした。
Vitis_tub_20_191210.png

これはVivado HLS のSummary のようだ。

System Guidance をクリックした。
Vitis_tub_21_191210.png

Timing Summary をクリックした。
Vitis_tub_22_191210.png

これはVivado のタイミングのSummary のようだ。

Utilization をクリックした。
Vitis_tub_24_191210.png

リソース使用量の表だった。

Logs をクリックした。
Vitis_tub_25_191210.png


次に、krnl_vadd に移る。
Vitis_tub_26_191210.png

Kernel Estimate をクリックした。
Vitis_tub_27_191210.png

現状では、カーネルが 1 つなので、System Estimate と同じだけど、カーネルが 2 つになると、カーネルごとの Estimate 情報を表示するのだろう?

Kernel Guidance をクリックした。
Vitis_tub_28_191210.png

HLS Syntyesis では Vivado HLS のレポートがそのまま表示された。
Vitis_tub_29_191210.png

Logs をクリックした。
最初のログは、krnl_vadd.steps のログだった。
Vitis_tub_30_191210.png

krnl_vadd.steps のプルダウンメニューを選択し、viado_hls に変更すると、vivado_hls のログが表示された。
Vitis_tub_31_191210.png
  1. 2019年12月10日 04:55 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Vitis 2019.2 のアプリケーション・プロジェクトの作り方1

Ultra96-V2 のVitis アクセラレーション・プラットフォームを作成したが、それを使用して自分のアプリケーション・プロジェクトを動作させてみよう。そのために、まだVitis 2019.2 でサンプル・プロジェクトしかやっていないので、自分でアプリケーション・プロジェクトを作り、自分でアクセラレーションする関数を指定してビルドしていないので、それをやってみようと思う。

最初に自分で一からアプリケーションのソースコードを書くのは負担が重いので、Xilinx 社のGitHub の Xilinx/Vitis-Tutorials の Mixing C++ and RTL Kernels のソースコードを使用してVitis 2019.2 のプロジェクトを作成していこう。

まずは、”Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3(Vitis プラットフォーム作成)”で作成した ultra96v2_min2 Vitis 2019.2 アクセラレーション・プラットフォームをVitis 2019.2 から使用できるようにしよう。
Vitis 2019.2 のインストール・ディレクトリ(私の場合は、 tools/Xilinx/Vitis/2019.2)の下の platform ディレクトリに ultra96v2_min2/images/linux/ultra96v2_min2_pkg/pfm/wksp1/ultra96v2_min2/export/ultra96v2_min2 ディレクトリをコピーする。
Vitis_tub_1_191208.png

これで、Vitis 2019.2 のプラットフォームとして使用できる。

Vitis 2019.2 を立ち上げて、 workspace を指定する。
Vitis_tub_2_191208.png

Vitis 2019.2 が立ち上がった。
Vitis_tub_3_191208.png

ここからアプリケーション・プロジェクトを作成する。
File メニューから New -> Application Project ... を選択する。
New Application Project ダイアログの Create Application Project 画面が立ち上がる。
Project name に vitis_ctut と入力した。
Vitis_tub_4_191208.png

Platform 画面で、自分で作成した ultra96v2_min2 プラットフォームを選択することができるので、選択した。
Vitis_tub_5_191208.png

Domain 画面は、OS として linux が選択されているので、そのままとする。(というかプラットフォームで Domain が linux しか作っていないので、選べない)
Vitis_tub_6_191208.png

Templates 画面で、Empty Application を選択して、Finish ボタンをクリックする。
Vitis_tub_7_191208.png

vitis_ctut アプリケーション・プロジェクトが作成された。(スクリーンショットをトルのを忘れました。。。)

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut -> src を右クリックし、右クリックメニューから New -> File を選択した。
New File ダイアログが表示された。
File name に host_step1.cpp と入力し、Finish ボタンをクリックする。(これがホストのコード)
Vitis_tub_8_191208.png

host_step1.cpp を新規作成後に、Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/host ディレクトリから host_step1.cpp のコードをコピー&ペーストした。

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut -> src を右クリックし、右クリックメニューから New -> File を選択した。
New File ダイアログが表示された。
File name に kernel_vadd.cpp と入力し、Finish ボタンをクリックする。(これがカーネルのコード)
Vitis_tub_9_191208.png

kernel_vadd.cpp を新規作成後に、Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/kernel_cpp ディレクトリから krnl_vadd.cpp のコードをコピー&ペーストした。

Vitis 2019.2 の様子を示す。
Vitis_tub_10_191208.png

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut の vitis_ctut.prj をクリックする。
Application Project Settings 画面が表示される。
Add Hardware Functions... ボタンをクリックする。
Vitis_tub_11_191208.png

Add Hardware Functions ダイアログが表示された。
Matching items には、krnl_vadd のみ表示されて、選択されているので、そのまま OK ボタンをクリックする。
Vitis_tub_12_191208.png

krnl_vadd が Hardware Functions に入った。
Vitis_tub_13_191208.png

Active build configuration を Hardware に変更して、build ボタンをクリックする。
Vitis_tub_14_191208.png

ビルドが終了して、sd_card イメージが生成された。
Vitis_tub_15_191208.png
  1. 2019年12月09日 05:23 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

『御前山サイクリングフェスティバル』に出場します

今日は『御前山サイクリングフェスティバル』に参加します。

ロードバイク買って初めて大会に出場するのですが、とっても寒そうです。まだノーマルのペダルでビンディングペダルにもしていないのですが、大丈夫でしょうか?ちょっと不安です。。。高低差が 100 m なので登れるかどうか?も不安ですが、何とかなるでしょう?
楽しんでこようと思います。

また、雪の予想でしたが、雪は降らなそうなので良かったです。
出場するのは、3時間サイクルリレー(男子・女子・混合)のトリオチーム (3名)です。チームの他の方々は女性ですが、凄い方々なので、迷惑かけ内容に頑張ってきます。なお、交通規制が許可が降りなかったので、レースじゃなくなったそうです。

御前山まで車で、下道で行ってきました。約 1 時間 30 分くらい、約 65 km でした。
御前山ダムはとても風光明媚なロックフェラーダムで、ダムや周りの紅葉を見るだけでも心が安らぎます。
さて、コースは最初の高低差 100 m の登りがとても疲れましたが、何とか休まないで登り切れました。後は下りも含めて快適なコースでしたよ。私は 5 週しました。1 週が 6.1 km なので、30 km くらい走りましたね。無料の豚汁、パスタ、御前山ラーメン、デザートが無料で食べ放題だったので、楽しめました。ラーメン 2 杯とパンナコッタ食べました。
ただ、とっても寒かったです。。。
cycling_191208.jpg
  1. 2019年12月07日 04:07 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

array_patition example をultra96v2_min2 プラットフォームでやってみよう

Vitis アクセラレーション・プラットフォームの ultra96v2_min2 ができたので、array_patition example をやってみよう。
array_patition example は”Vitis_Accel_Examples を Ultra96V2 のプラットフォームでやってみる1(array_partition)”でやっているので、結果が出ている。これは、動作クロックが 100 MHz だったが、今回の動作クロックは 200 MHz にしてあるので、どのくらい性能向上したか?を確かめてみよう。

Vitis でarray partition のアプリケーション・プロジェクトを作成した。
Vitis_Platform2_87_191201.png

Hardware をビルドして sd_card ディレクトリの内容をMicroSD カードの第 1 パーティションにコピーした。MicroSD カードの第 2 パーティションには、Petalinux でビルドし sdk.sh で生成した aarch64-xilinx-linux ディレクトリの内容をコピーした。
MicroSD カードを Ultra96-V2 に入れて電源ON した。

root ノーパスでログインした。
zocl ドライバを insmod でロードした。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko

アプリケーションを起動した。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./ultra96v2_arrayp.exe matmul.xclbin

Vitis_Platform2_89_191204.png

どうやら
matmul: が 631730 ns で、 matmul: partition が 63230 ns のようだ。
前回、ultra96v2_min プラットフォームで実行した時は、matmul: が 927760 ns で、 matmul: partition が 134180 ns だったので、速くなっている。

matmul: は、927760 / 631730 ≒ 1.47 倍
matmul: partition は 134180 / 63230 ≒ 2.12 倍


になった。matmul: partition が 2 倍以上になっているのはクロック周波数以外の条件が効いているのかも知れない?

更に数回実行してみた。
Vitis_Platform2_90_191204.png

Vitis_Platform2_91_191204.png

2 回目以降は、うるさい [drm] メッセージが表示されなくなって見やすい。
  1. 2019年12月06日 05:27 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

AXI4 MasterとAXI4 Streamインターフェースがあって、AXI4 Masterにmemcpy()を使用しているVivado HLSの回路

AXI4 Master インターフェースと AXI4 Stream インターフェースを持っているVivado HLS で作成した回路でAXI4 Master に memcpy() を使用していると合成時のレポートがでないということをツィッターで聞いた。ツィッターでつぶやいていたのは、 @lp6m2 さんで、聞いていみると、Xilinx のCommunity Forums にも、”Is it possible to set internal BRAM values using AXI4 protocol in HLS IP using AXI-Stream protocol?”で質問しているそうだ。

私も試してみることにした。ソースコードはmemcpy() の代わりに for() 文でコピーする行も追加させていただいた。今はコメントアウトしてある。bram_setparam_test.cpp を示す。

#include "hls_video.h"
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <iostream>
#include <string.h>

void bram_setparam_test(bool mode, int *inputparam,
        hls::stream<ap_axiu<32,1,1,1> >& instream, hls::stream<ap_axiu<32,1,1,1> >& outstream){
#pragma HLS INTERFACE axis port = instream
#pragma HLS INTERFACE axis port = outstream
#pragma HLS INTERFACE s_axilite port = mode
#pragma HLS INTERFACE m_axi port = inputparam offset=slave depth=100
#pragma HLS INTERFACE s_axilite port = mode
#pragma HLS INTERFACE s_axilite port = return
    static int internal_param[100];
#pragma HLS RESOURCE variable=internal_param core=RAM_1P_BRAM
    if(mode == true){
        //AXI4 set parameter mode
        memcpy(internal_param, inputparam, sizeof(int) * 100);
        /*for(int i=0; i<100; i++){
#pragma HLS PIPELINE II=1
            internal_param[i] = inputparam[i];
        }*/
    }else{
        //AXI4-stream MODE
        for(int i = 0; i < 100; i++){
#pragma HLS PIPELINE II=1
            int inval = instream.read().data;
            ap_axiu<32,1,1,1> outval;
            outval.data = inval * internal_param[i];
            outval.last = (i == 99 ? 1 : 0);
            outstream.write(outval);
        }
    }
}


自分なりにテストベンチのbram_setparam_test_tb.cpp を作ったので、それを示す。

// bram_setparam_test_tb.cpp
// 2019/12/04 by marsee
//

#include "hls_video.h"
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <iostream>
#include <string.h>

void bram_setparam_test(bool mode, int* inputparam,
        hls::stream<ap_axiu<32,1,1,1> >& instream, hls::stream<ap_axiu<32,1,1,1> >& outstream);

int inputparam[100];

int main(){
    using namespace std;

    hls::stream<ap_axiu<32,1,1,1> > ins;
    hls::stream<ap_axiu<32,1,1,1> > outs;
    ap_axiu<32,1,1,1> streamd;
    ap_axiu<32,1,1,1> vals;

    for(int i=0; i<100; i++){
        inputparam[i] = i;
    }

    bram_setparam_test(true, inputparam, ins, outs);

    for(int i=0; i<100; i++){
        streamd.data = i;
        if(i == 0)
            streamd.user = 1;
        else
            streamd.user = 0;
        if(i == 100-1)
            streamd.last = 1;
        else
            streamd.last = 0;
        ins << streamd;
    }

    bram_setparam_test(false, inputparam, ins, outs);

    for(int i=0; i<100; i++){
        outs >> vals;
        if((int)vals.data != i*i){
            fprintf(stderr, "Error: i = %d, i^2 = %d; outs = %d\n", i, i*i, (int)vals.data);
            exit(1);
        }
        printf("i = %d, i^2 = %d; outs = %d\n", i, i*i, (int)vals.data);
    }
    return(0);
}


Vivado HLS 2019.2 のプロジェクトを示す。
Vivado_HLS_MS_memcpy_2_191205.png

C シミュレーションを行って成功した。結果を示す。
Vivado_HLS_MS_memcpy_1_191205.png

C コードの合成を行った。この結果はスカスカだった。レポートが表示されない。
Vivado_HLS_MS_memcpy_3_191205.png

C/RTL 協調シミュレーションを行った。結果を示す。
Vivado_HLS_MS_memcpy_4_191205.png

波形を見ると、正常に動作しているようだ。
Vivado_HLS_MS_memcpy_5_191205.png

Vivado_HLS_MS_memcpy_6_191205.png

Export RTL もそれらしく動いている。
Vivado_HLS_MS_memcpy_7_191205.png

レポートの結果にも問題は無いようだ。

次に、memcpy() をコメントアウトして、for() を活かしてみよう。

 if(mode == true){
  //AXI4 set parameter mode
  //memcpy(internal_param, inputparam, sizeof(int) * 100);
  for(int i=0; i<100; i++){
#pragma HLS PIPELINE II=1
   internal_param[i] = inputparam[i];
  }
 }else{


これでC コードの合成を行った。結果を示す。今度はちゃんとレポートが出た。
Vivado_HLS_MS_memcpy_8_191205.png

C/RTL 協調シミュレーションのレイテンシも memcpy() の場合と同一だ。
Vivado_HLS_MS_memcpy_9_191205.png

Export RTL を示す。memcpy() とあまり変わりがない。
Vivado_HLS_MS_memcpy_10_191205.png

今までも memcpy() は使っていたので、それだけの原因では無いと思う。
AXI4 Master を memcpy() でやっている時に、AXI4 Stream インターフェースを使ったことは無いので、その時にC コードの合成のレポートが消えてしまうのかも知れない?
なお、Vivado HLS 2018.3 でも、Vivado HLS 2017.4 でも、同様にC コードの合成のレポートが消えてしまう。
  1. 2019年12月05日 05:44 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方4(Vitis アプリケーション・プロジェクトの作成)

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3(Vitis プラットフォーム作成)”の続き。

Vitis のアクセラレーション・プラットフォームを作成できたので、それを使用してアプリケーション・プロジェクトを作成し、Ultra96-V2 で動作させてみよう。

Vitis 2019.2 のGUI で、New -> Application Project... を選択する。
Vitis_Platform2_72_191201.png

New Application Project ダイアログの Create a New Application Project 画面で、Project Name に ultra96v2_app1 を入力した。
Vitis_Platform2_73_191201.png

Platform では、今回作成したプラットフォームの ultra96v2_min2 を選択した。Flow を見ると Embedded Acceleration と表示されていることが分かる。これは、アクセラレーションができるプラットフォームということらしい?
Vitis_Platform2_74_191201.png

Domain 画面はディフォルトのままとした。
Vitis_Platform2_75_191201.png

Template 画面は、最初は下図の様には項目がなかったが、Download ボタンをクリックして、チュートリアルをダウンロードするとサンプル・プロジェクトが増えた。その内の最初から入っている Vector Addition を選択して、Finish ボタンをクリックした。
Vitis_Platform2_76_191201.png

ultra96v2_app1 アプリケーション・プロジェクトが作成された。
Vitis_Platform2_77_191201.png

Qemu を設定してないので、無駄とは思うがEmulation-SW をビルドしてみよう。
Assistant ウインドウの ultra96v2_app1_system を展開して、 ultra96v2_app1 -> Emulation -SW を右クリックし、右クリックメニューから Build を選択した。
Vitis_Platform2_78_191201.png

エラーになった。
Vitis_Platform2_79_191201.png

Emulation-HW もビルドしてみたが、同様にエラーになった。
Vitis_Platform2_80_191201.png

Hardware をビルドすると、こちらは成功した。
sd_card のディレクトリもできている。
Vitis_Platform2_81_191201.png

Hardware -> binary_container_1 -> SD Card Image を右クリックし、右クリックメニューから Open -> Open File Browser を選択すると、ファイル・ブラウザで sd_card ディレクトリが表示された。
Vitis_Platform2_82_191201.png

sd_card ディレクトリをMicroSD カードの第 1 パーティションにコピーした。
Vitis_Platform2_84_191201.png

MicroSD カードの第 2 パーティションには、PetaLinux で生成した ultra96v2_min2/images/linux/ultra96v2_min2_pkg/pfm/sysroots/aarch64-xilinx-linux ディレクトリの内容を書き込んだ。
(注意: Vitis プラットフォームのRoot FS を使用するとLinux が起動しません)
Vitis_Platform2_84_191201.png

MicroSD カードをUltra96V2 に入れて、電源ON するとLinux が起動した。
root ノーパスでログインした。
zocl ドライバを insmod でロードする。
insmod /lib/modules/4.19.0-xilinx-v2019.2/extra/zocl.ko
Vitis_Platform2_85_191201.png

アプリケーションを起動する。
cd /run/media/mmcblk0p1/
export XILINX_XRT=/usr
./ultra96v2_app.exe bianry_container_1.xclbin

Vitis_Platform2_86_191201.png

TEST_PASSED が表示され、アクセラレーションされたアプリケーションの実行に成功した。
  1. 2019年12月03日 05:21 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3(Vitis プラットフォーム作成)

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方2(ソフトウェア・コンポーネント編)”の続き。

ハードウェア・コンポーネント編、ソフトウェア・コンポーネント編で作成したファイルを元に、Vitis 2019.2 を起動してプラットフォームを作成しよう。

まずは、Vitis 2019.2 のGUI が立ち上がるように、環境を設定しておく必要がある。
source <Vitis 2019.2 のインストール・ディレクトリ>/settings64.sh
を実行しよう。

ultra96v2_min2_pkg/pfm ディレクトリに移動して、その下の wksp1 をワークスペースに指定して、Vitis GUI を立ち上げた。
cd ultra96v2_min2_pkg/pfm
vitis -workspace wksp1

Vitis_Platform2_62_191130.png

Vitis 2019.2 の GUI が立ち上がった。
Vitis_Platform2_63_191201.png

Create Platform Project をクリックした。
New Platform Project ダイアログが立ち上がった。
Project name に ultra96v2_min2 と入力した。
Vitis_Platform2_64_191201.png

Platform Project では、Create from hardware specification のラジオボタンがクリックされていることを確認した。
Vitis_Platform2_65_191201.png

Platform Project Specification では、”Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方(ハードウェア・コンポーネント編)”で作成した。 xsa ファイルをXSA file に指定した。
Software Specification の Operating system を linux に変更した。
Vitis_Platform2_67_191201.png

Platform Project が作成された。
Vitis_Platform2_68_191201.png

Bif File は、”Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方2(ソフトウェア・コンポーネント編)”で指定した。
た linux.bif を指定した。
Boot Component Directory と Linux Image Directory には、ultra96v2_min2_pkg/pfm/boot ディレクトリを指定した。
Sysroot Directory に ultra96v2_min2_pkg/pfm/sysroots/aarch64-xilinx-linux/ ディレクトリを指定した。
Vitis_Platform2_69_191201.png

トンカチ・ボタンをクリックして、プラットフォームのビルドを行った。
プラットフォームがビルドされた。
Vitis_Platform2_70_191201.png

プラットフォームのディレクトリを示す。
ultra96v2_min2/export の下の ultra96v2_min2 ディレクトリがプラットフォームだ。
その下に hw と sw にディレクトリがあって、各ファイルが入っている。
Vitis_Platform2_71_191201.png


今回は、linux のプラットフォームしか作成しなかったが、ベアメタルのプラットフォームの作り方は、”Vitis 2019.2 の組み込みプロセッサ プラットフォームの開発をやってみる4(プラットフォームの作成)”を参照のこと。

参考文献
(1). Vitis Unified Software Development Platform Documentation, Embedded Processor Platform Development, Creating the Platform
  1. 2019年12月02日 05:09 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方2(ソフトウェア・コンポーネント編)

Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方(ハードウェア・コンポーネント編)”の続き。

Ultra96-V2 の Vitis アクセラレーション・プラットフォームのハードウェア・コンポーネント編の続きで、ソフトウェア・コンポーネント編をやっていこう。
私の使用環境はUbuntu 18.04 となっている。

まずは、PetaLinux 2019.2 の環境設定をしよう。
source [PetaLinux 2019.2 インストール・ディレクトリ].settings.sh
を実行していなようだったら実行しておく。

PetaLinux プロジェクトの作成
実行ディレクトリ(私の場合は /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/PetaL_Proj/2019.2 ディレクトリ)で PetaLinux のプロジェクトを作成する。(ハードウェア・コンポーネントとの名前の一致が必要なので、プロジェクト名は ultra96v2_min2 とする)
プロジェクトを作成したら ultra96v2_min2 ディレクトリに入る。
cd /media/masaaki/Ubuntu_Disk/tools/Xilinx/PetaLinux/PetaL_Proj/2019.2
petalinux-create --type project --template zynqMP --name ultra96v2_min2
cd ultra96v2_min2

Vitis_Platform2_33_191130.png

petalinux-config でハードウェア・コンポーネントの情報を取り込む。
petalinux-config --get-hw-description=[XSAファイルのあるディレクトリのパス]
私の場合は、~/HDL/Ultra96/Vitis_platform/2019.2/ultra96v2_min2

Image Packaging Configuration -> Root filesystem type で EXT (SD/eMMC/QSPI/SATA/USB) を選択した。
< Exit >を選択して上の階層に行く。
Vitis_Platform2_34_191130.png

Yocto Settings -> Enable Debug Tweaks を有効にする (Spaceキーを押す)
Vitis_Platform2_35_191130.png

Subsystem AUTO Hardware Settings -> Serial Settings -> Primary stdin/stdout を psu_uart_1 に変更する。
Vitis_Platform2_36_191130.png

一番上のメニューから< Exit >を選択し、セーブ表示になったら< Yes >を選択し、選択画面を終了する。
Vitis_Platform2_37_191130.png

Linux カーネルの設定
カーネルの petalinux-config を行って、設定をしていこう。
petalinux-config -c kernel
を実行する。

Device Drivers -> Generic Driver Options -> Size in MB(1024)に変更した。
Vitis_Platform2_38_191130.png

Device Drivers -> Staging drivers -> Xilinx APF Accelerator driver (ON) した。
Vitis_Platform2_39_191130.png

Device Drivers -> Staging drivers -> Xilinx APF Accelerator driver -> Xilinx APF DMA engines support (ON)
Vitis_Platform2_40_191130.png

CPU Power Management -> CPU idle -> CPU idle PM support (OFF)
(CPU idle や周波数が変わると面倒なことになるので、OFF したほうが良い。モバイル用途で電池の持ちを気にする場合は別途設定しよう)
Vitis_Platform2_41_191130.png

CPU Power Management -> CPU Frequency scaling -> CPU Frequency scaling (OFF)
Vitis_Platform2_42_191130.png

一番上のメニューから< Exit >を選択し、セーブ表示になったら< Yes >を選択し、選択画面を終了する。
Vitis_Platform2_43_191130.png

rootfs の設定
rootfs を設定する前に、rootfs に XRT を組み込む。
ultra96v2_min2/project-spec/meta-user/conf/user-rootfsconfig を編集する。

CONFIG_xrt
CONFIG_xrt-dev
CONFIG_zocl
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv

を追加した。
Vitis_Platform2_47_191130.png

Vitis_Platform2_44_191130.png

#Note: Mention Each package in individual line
#These packages will get added into rootfs menu entry

CONFIG_gpio-demo
CONFIG_peekpoke
CONFIG_xrt-dev
CONFIG_zocl
CONFIG_opencl-clhpp-dev
CONFIG_opencl-headers-dev
CONFIG_packagegroup-petalinux-opencv


/project-spec/meta-user/recipes-bsp/device-tree/files ディレクトリの system-user.dtsi を編集した。その際に、zoclドライバを含めた。(石原ひでみさんにご協力をいただいて、Ultra96V2の無線LANドライバのデバイスツリーも含めたが、うまく行かなかったので、今後の課題とするので、情報がある方、お知らせください)
Vitis_Platform2_45_191130.png

Vitis_Platform2_46_191130.png

/include/ "system-conf.dtsi"
/ {
    xlnk {
        compatible = "xlnx,xlnk-1.0";
    };

    wlcore: wilc_sdio@0  {
        compatible    = "microchip,wilc1000", "microchip,wilc3000";
        status        = "okay";
    };
};

&amba {
    zyxclmm_drm {
        compatible = "xlnx,zocl";
        status = "okay";
        reg = <0x0 0xA0000000 0x0 0x10000>;
    };
};

&sdhci0 {
    disable-wp;
};



rootfs を設定する。
petalinux-config -c rootfs

Filesystem Packages -> misc -> gcc-runtime -> libstdc++ (ON)
Vitis_Platform2_48_191130.png

追加した user packages をすべて有効にする。
Vitis_Platform2_50_191130.png

一番上のメニューから< Exit >を選択し、セーブ表示になったら< Yes >を選択し、選択画面を終了する。
Vitis_Platform2_49_191130.png

PetaLinux プロジェクトのビルド
今まで設定してきたPetaLinux プロジェクトをビルドする。
petalinux-build
Vitis_Platform2_51_191130.png

ultra96v2_min2/images/linux ディレクトリにファイルがビルドされている。
Vitis_Platform2_52_191130.png

ultra96v2_min2/images/linux ディレクトリの下に ultra96v2_min2_pkg ディレクトリを生成する。その下に pfm ディレクトリを生成する。その下に boot 、 wksp1 ディレクトリを生成する。
Vitis_Platform2_53_191130.png

ultra96V2_min_pkg/pfm/boot ディレクトリには、Ultra96V2_Platform1/image/linux にビルドされたファイルの中から bl31.elf, image_ub, pmufw.elf, u-boot.elf, zynqmp_fsbl.elf, system.dtb をコピーした。
Vitis_Platform2_54_191130.png

sysroot の生成
ターゲットLinuxシステム用のsysrootセルフインストーラーを作成する。
cd images/linux
petalinux-build --sdk

Vitis_Platform2_55_191130.png

エラーが出ているが、 x86 のエラーなのか? successfully でビルドできてしまった?

sdk.sh が生成された。
Vitis_Platform2_56_191130.png

sdk.sh を実行して、 sysroot を生成する。
./sdk.sh
Vitis_Platform2_57_191130.png

Vitis_Platform2_58_191130.png

ultra96v2_min2_pkg/pfm/sysroot ディレクトリの下に、aarch64-xilinx-linux ディレクトリと x86_64-petalinux-linux ができた。
Vitis_Platform2_59_191130.png

ここに生成されたのは rootfs だ。

linux.bif の作成
linux.bif を作成する。
エディタに”Creating the Software Component”の linux.bif の内容をコピー&ペーストした。
Vitis_Platform2_60_191130.png

/* linux */
 the_ROM_image:
 {
  [fsbl_config] a53_x64
  [bootloader] <zynqmp_fsbl.elf>
  [pmufw_image] <pmufw.elf>
  [destination_device=pl] <bitstream>
  [destination_cpu=a53-0, exception_level=el-3, trustzone] <bl31.elf>
  [destination_cpu=a53-0, exception_level=el-2] <u-boot.elf>
 }


ultra96v2_min2_pkg ディレクトリ上に linux.bif としてセーブした。
Vitis_Platform2_61_191130.png

参考文献
(1). Vitis Unified Software Development Platform Documentation, Embedded Processor Platform Development,
Creating the Software Component
(2). Xilinx/SDSoC-Tutorialsplatform-creation-tutorial/
(3). Building Custom SDSoC Platform with PetaLinux
(4). Vitis 2019.2 の組み込みプロセッサ プラットフォームの開発をやってみる2(ソフトウェア・コンポーネントの作成1)
(5). Vitis 2019.2 の組み込みプロセッサ プラットフォームの開発をやってみる3(ソフトウェア・コンポーネントの作成2)
  1. 2019年12月01日 05:51 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0