Ultra96用Vitisプラットフォームの作り方（BASE編）

#Vitisの紹介
ザイリンクス社から、Vitis(ヴィティス）という、開発ツールが2019年10月に発表されました。
ソフトウェア技術者でも、FPGA開発を、、というのを目標に、開発されたツールで、Linux上のアプリケーションを記述する感覚で、設計できるのが特徴です。また、ハードウェア特有の動作の高速化もVitis上で設計できるため、今まで以上に一体感のあった、システム設計ができるのが大きな特徴になります。

#Vitisプラットフォーム
Vitis自身はとても、便利な機能も多くて、使いやすいのですが、予め、プラットフォームというものを、用意しないと動作できないことになりました。
ザイリンクス社からは、自社製品のプラットフォームが提供されていますが、残念ながら、Ultra96はAvnet社製のため、後回しにされたようです。
ここでは、Ultra96向けプラットフォームの作り方をご紹介します。
プラットフォームは3種類用意する予定で、
１：BASE　本当に基本だけのプラットフォームの作成。とりあえずVitisプラットフォームの基本と、Vitisを動かしたい人向け
２：OOB　　Ultra96V2向けのWifi等ドライバーやアプリケーションを含んだバージョンの作成
３：OOB-AI　上記２の機能にVitis AIで動作するためのプラットフォームの作成
を用意する予定です。
今回は、BASE編でこれだけあれば、とりあえずプラットフォームができる、、というレベルで、Ultra96の機能はほとんど使っていません。
ただ、作り方の基本は学べると思っています。

###必要な開発環境
VitisとPetalinuxが必要となります。私の方でも、開発環境の設定の仕方を記述しましたので、参考にしていただければと思います。
[Ultra96の開発環境(Vitis2019.2版)](https://qiita.com/basaro_k/items/86811ed78397d2a3b4b1)

###Vitisプラットフォームの作成手順
大きく分けて次の動作が必要になります。
１：Vivadoでハードウェアを作成する。
２：Petalinuxで、Linuxカーネルと、sdkを作る
３：Vitisで、プラットフォームをつくる
４：Vitisで動作チェック
![Screenshot from 2020-01-04 12-26-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/1fb266c0-4ca0-41bf-f456-921a4c09c9ee.png)

#Vivado での設計（ハードウェアの設計）
Vitisプラットフォームは以前のツールである、SDSoCの作り方とほぼ同等になります。
必要なものは決まっていて、それを最低限組みます。また、今回は行いませんが、追加のIP(設計）も可能で、
予め固定のハードウェアを最初からのせることも可能になっています。
まずは、Vivadoを立ち上げます。　私は、コマンドプロンプトから立ち上げています。

```bin:vivado
vivado 
```

####新規プロジェクトの作成
まずは、新規作成から、行います。Vivadoを立ち上げてから、Quick Start の　Create Project で新しいプロジェクトを作ります。

![Screenshot from 2020-01-04 12-31-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/072e9788-ad1e-0927-dd77-d883c5a863a0.png)

新規プロジェクトを作りましたら、Nextを押して、プロジェクト名を決めます。ここでは、Vitisで使いやすい名前にしておいたほうが、望ましいです。![Screenshot from 2020-01-04 14-58-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e726b33f-1172-af77-6d5d-786c14bcd879.png)

次のProject Typeでは、RTL Projectを選択、Do not specify sources at this time にチェックを入れてNextです。

![Screenshot from 2020-01-04 12-40-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/dbe1ee66-3e4b-344c-9375-a0b548cf19cc.png)

パーツまたは、ボードを選択します。
開発ツールのインストール時に、BDFファイルを設定している方は、Ultra96がボードとして、選択できますので、それを使うと便利です。
また、他のボードでも使えます。今回はUltra96V2を選択しました。
まず、Board　タブを選択してから、Ultra96V2を探します。　Serch機能がありますので、Ultra96と打ってから、サーチをかけると簡単に見つかります。必要なボードをクリックします。

![Screenshot from 2020-01-04 12-46-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/9ecd8e46-b1e5-3c45-d66a-a22d8fdaa7e9.png)

終わりましたら、Nextを押して、最後にFinishで、新たなプロジェクトが完成します。

####ブロックデザインの作成、設計
次に、ブロックデザインを作ります。
Flow Navigator→IP ITEGRATOR → Create Block Design から始めます。
![Clipboard01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/6e745d64-5e23-c4bf-8a48-288239256ffd.png)

次にブロックデザインの名前を決めて、OKです。デフォルトでも大丈夫です。
![Screenshot from 2020-01-04 13-28-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/7362dd91-5c8b-f740-cbd8-d4b43c704804.png)

キャンパスができてきます。ここで、必要なブロックの追加、配線を行います。
![Screenshot from 2020-01-04 13-51-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/29137c27-5a82-07ef-6824-b09d88a99eec.png)

ブロックの追加は、＋のアイコンを叩くか、キャンパス上で、マウスを右クリックすると、Add IPと出てきますので、それで選択します。
IP（ブロック）の数は多いので、検索を使うと便利です。ここでは、zynq と入力しまして、出てきたものに、ダブルクリックでキャンパスに置きます。
![Screenshot from 2020-01-04 13-53-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/229ba876-c0c0-2a27-01ac-9adda5199e35.png)

zynqが置かれましたら、緑のバーにある、Run Block Automation をクリックします。これで、Ultra96向けのZynq UltraScale+ MPSoCの基本的な設定を終わります。なにか聞いてきましたら、デフォルトでOKなので、そのままOKを押してください。

![Screenshot from 2020-01-04 13-57-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/abdc6716-b43d-b9f2-73a3-6d7e6fed9f82.png)

次に不要なAXIポートを削除します。
zynq_ultrascale_ps_eをダブルクリック、Page Navigatorで、PS-PL Configurationをクリックします。PS-PL Interfaces と Master Interfaceを展開して、AXI HPM0 FPD と AXI HPM１FPD　のチェックを外して、OKを押します。
　![Screenshot from 2020-01-04 14-38-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/4a650802-c2b3-644f-e559-7050d31010c0.png)


次に、クロックのブロックを追加します。
マウス右クリックのAdd IP（または＋のアイコン）をクリックして、Serchにclock と入力　その中の Clocking Wizardを選択し、ダブルクリックします。この中にはPLLが入っており、クロックの変換を行ってくれます。出てきた、clk_wiz_0をダブルクリックして、出力周波数の設定を行います。
![Screenshot from 2020-01-04 14-11-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/1763da12-8a41-ed69-743c-26120d22cf92.png)

クロックは適当に設定します。Output Clockタブをクロックします。今回は５つ、１００MHｚから５０MHｚ刻みで、３００MHｚまで出力設定しました。ここはお好みで大丈夫です。ただ、後で、Vitisでのクロックに影響してきます。
リセットの関係上Reset tpyeは、Active Lowにします。
そのほかはデフォルトでOKです。
![Screenshot from 2020-01-04 14-17-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/6f9fbb43-6cd9-7166-35ef-228608cf49cf.png)

次に、リセットをクロックの数だけ設定します。Add IPをつかってseach で reset で見つかる、　Processer System Reset を選択します。今回はクロックを５つ設定したので、５個用意します。また割り込みの拡張のためConcatというIPも追加します。Concatはダブルクリックして、Number of Portを１にします。（図はConcatをダブルクリックして設定した時）
![Screenshot from 2020-01-04 14-31-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/0fbbf955-afdc-0e48-6e05-c6aac0e69d74.png)

配線をします。
zynq_ultra_ps_e_0のpl_reset0とpl_clk0をそれぞれ、clkwiz_0のresetn、clk_in1に配線します。
clk_wiz_0の各クロック出力を、各Proc_sys_resetのslowest_sync_clkに配線します。
clk_wiz_0のlockedを各、proc_sys_resetのdcm_lockedに配線します。
zynq_ultra_ps_e_0のpl_reset0を各proc_sys_resetのext_reset_inに配線します。
xlconcat_0のdout[0:0]をpl_ps_irq[0:0]に配線します。

Vitis側で割り込みが行えるように設定します。


配線が終わり、Regenelate　Layoutのアイコン　![Screenshot from 2020-01-04 14-46-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c9224268-d56f-0642-26ef-ee7eb8550fa5.png)　をクロックしたものが次のブロックになります。
![Screenshot from 2020-01-04 15-07-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/299b3f4c-6b1c-6e61-0f99-447489a1544c.png)

####プラットフォーム（PFM)インターフェースとプロパティーの定義
Vitisで使えるインターフェースをここで、定義しておきます。
メニューの Window →　Platform Interface をクリックして、プラットフォームの設定を行います。
Enable platform Interfaces をクリックして、プラットフォームを設定できるようにします。
![Screenshot from 2020-01-04 15-18-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c41bc245-329a-1037-a0d3-54132cca5f17.png)

Vitisのプラットフォームでわかりやすいようにboardの名前を変更します。
Platformを選択して、下の方のBoard：をUltra96v2に変更しました。
![Screenshot from 2020-01-05 07-07-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/4c9b928a-8d91-1f57-6f11-036768bc8617.png)

使えるインターフェース、ポートを定義します。各ポートはマウスの右クリックで、メニューがでます。ダブルクリックでも、Enable,Disenableの切り替えができます。
zynq_ultra_ps_e_0では、次のインターフェス、ポートをEnableにします。（それ以外はDienable)
M_AXI_HPM0_FPD
M_AXI_HPM1_FPD
M_AXI_HPM0_LPD
S_AXI_HPC0_FPD
S_AXI_HPC1_FPD
S_AXI_HP0_FPD
S_AXI_HP1_FPD
S_AXI_HP2_FPD
S_AXI_HP3_FPD
clk_wiz_0については全部Enableにします。
xlconcat_0については、In0〜In７までをEnableにします。
![Screenshot from 2020-01-04 15-31-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/01c432dd-3ac3-24d3-e984-a9f406f88f2d.png)

クロックにデフォルトを与えます。どこかひとつのクロックをデフォルトにする必要があります。
clk_out1を選択後、Platform Interface Properties の中の　Optionsのタブをクリックして、is_defaultを選択します。また、idを０にします。Vitisで使用できる、デフォルトのクロックです。
![Screenshot from 2020-01-04 23-38-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/2a80ac27-1351-0c9d-df7b-1f3728c1d84d.png)


次にXRT用の設定を行います。Tclコンソールにつぎのコマンドを入力します。TclコンソールはVivadoの下の方にTcl Consoleというタブがありますので、それをクリック、その中で、type a Tcl command here と薄くかいたボックスがありますので、そこに１行づつ入れていきます。

```tcl:xrt.tcl
set_property platform.design_intent.embedded true [current_project]
set_property platform.design_intent.server_managed false [current_project]
set_property platform.design_intent.external_host false [current_project]
set_property platform.design_intent.datacenter false [current_project]
set_property platform.default_output_type "sd_card" [current_project]
```

Vilitate Design(![Screenshot from 2020-01-04 15-11-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e33d1d7e-e3e7-79f4-38f6-0dea0a2d5604.png)のアイコン）をクリックして、間違えないかをチェックします。
OKが出たら、問題がありません。エラーが出たら、直してください。

####ビットストリームの作成、XSAファイルのエクスポート（出力）

次に、最上位ファイルを作成します。Sourceタブの中のdesign_1を右クリック　メニューから、Create HDL Wrapperを選択して、トップファイルを作ります。きかれたら、OKを押します。

![Screenshot from 2020-01-04 15-54-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/7e79624f-9435-885d-eafd-4cdd352bb9bf.png)

その後、Flow Navigatorの Generate Bitstreamをクリックします。ここで、ビットストリームを作ります。
ダイアログがいくつか出ますが、Save Yes Okの順でクリックすれば大丈夫です。
ここで、数十分かかります。
最後に終わりましたら、Cancelを押してください。

次にエクスポート（出力）します。
現在のところ、TCLコマンドでの運用になります。（2020.May.2 訂正）

```chk:write_hw_platform
write_hw_platform -include_bit <Write Path>/ultra96base.xsa
```

ハードウェアの最後は出力したファイルのチェックです。TCLコマンドで行います。

```chk:valid_hw_platform
validate_hw_platform <Write Path>/ultra96base.xsa
```

これで、ハードウェアの部分が終わりです。

#Petalinux でのビルド
今度はLinuxシステムを設計します。
こちらでは、Ultra96の基本の機能と、Vitisで使われる、機能を作成します。
作るのは、BSPとSDKのファイルを作る必要があります。
Petalinuxの動作環境を整えた状態で、すすめてください。
####プロジェクト作成とコンフィグレーション
まず、Petalinux用のプロジェクトを作成します。その後、ディレクトリーに移動します。

```sh:petalinux-create
 petalinux-create -t project -n petalinux --template zynqMP
 cd petalinux
```
次に、各種設定を行います。ここで、Vivadoで作成したファイルを取り込みます。ディレクトリーはXSAファイルのある場所に変更してください。ファイル名までは指定しなくていいです。

```
petalinux-config --get-hw-description=../ultra96base
```
少し時間が経つとコンソールによるメニュー形式が出てきます。キーボード上の矢印で項目を移動してください。
ここで、いくつかの設定をします。
![Screenshot from 2020-01-04 18-07-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/726f6c0d-989d-1b29-1559-6d3be82d0a65.png)

まずは、MACHINE NAMEの設定です。　DTG Settngs → MACHINE_NAME を選択して、 avnet-ultra96-rev1 に書き換えてください。全部ではないのですが、Ultra96のすでに入っている設定が反映されます。終わりましたら。OKにカーソルを合わせ、次にExitでトップ画面に移ります。
![Screenshot from 2020-01-04 18-04-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/13a7ef44-068d-45bd-53d9-ca26a35520f0.png)

Uartの設定をUltra96向けに変更します。これは、Ultra96のUARTがBluetoothにも使われているため、そこを正しく設定するためです。メニューのトップから、Subsystem AUTO Hardware Settings → Serial Settings を設定、その後、psu_uart_1に設定します。スペースバーを押すと設定が終わります。
![Screenshot from 2020-01-04 18-14-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/26ca09fc-6a45-383a-4d56-2c7e4c67f94a.png)

次にシステムを増やすために、SDカードの記録方法を指定します。トップメニューから、Image Packageing Configuration → Root filesystem type からEXT(SD/eMMC/QSPI/STAT/USB)を選択します。

![Screenshot from 2020-01-04 18-18-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/a8f4babe-f39e-896e-a3b8-c86eebf7d0aa.png)

ここではSelect後Exitを２回、その後、保存しますかを聞いてくるので、Yesを押します。ここで、すこし時間が取られます。
次に、XRTを使えるようにするため、追加ファイルを設定します。次のファイルを編集します。./ project-spec/meta-user/conf/user-rootfsconfig 適当なエディターを使ってください。　geditなら標準でついてきます。
ファイルは次のようになります。

```config:user-rootfsconfig
#Note: Mention Each package in individual line
#These packages will get added into rootfs menu entry

CONFIG_gpio-demo
CONFIG_peekpoke
CONFIG_xrt
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 
を次のように編集してください。これはZynqシリーズで、XRTドライバーが使えるようにするためです。

```dtsi:systm-user.dtsi
/include/ "system-conf.dtsi"
/ {
};
&amba {
    zyxclmm_drm {
        compatible = "xlnx,zocl";
        status = "okay";
    };
 };
 ```

次に先ほど設定したファイルを有効視します。
petalinux-cofing -c rootfs を実行して、有効なファイルを設定します。

```config:rootfs
petalinux-config -c rootfs
```
その後、user packages を選択して、出ているプログラムをすべて有効にします。
![Screenshot from 2020-01-04 18-59-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ad469431-3a7c-cda4-916d-ecbee854ee01.png)

２回Exitで、セーブして、Yesで保存します。

DMA転送用のメモリーを確保します。カーネルの操作をします。

```config:kernel
petalinux-config -c kernel
```

Device Drivers→ Generic Driver Options→ DMA Contiguous Memory Allocator　→ Size in Mega Bytes
をクリックして、２５６を１０２４に変更します。
![Screenshot from 2020-01-04 19-39-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/59b2174d-9206-6f91-9204-ee8fc3fe60c6.png)

終了して、保存して、終わります。
ここまでで、コンフィグレーションの設定は終わりです。

####ビルド
ここでは、２箇所ビルドをします。かなり時間がかかるところなので、気長に待ってください。
今回は行いませんが、ひとつ目のビルドが終わった時点で、Petalinux-packgeを使って、
BOOT.BINファイルを作成して、SDカードにコピーすれば、Ultra96が動作できます。

```build:petalinux-build
petalinux-build
cd images/linux
petalinux-build --sdk
cd ../../..
```

おわりましたら、sdk.shができています。
これは、自己解凍のファイルです。
これを解凍して、Vitisのプラットフォーム作りのsysrootにします。
次のようにしました。

```sh:sdk.sh
mkdir pfm
./petalinux/images/linux/sdk.sh
```
出力パスを聞いてきますので、したい場所を指定します。
私は[save full path]/pfm　にしました。
この場所は覚えておいてください。

ブートに使うファイルのコピーを行います。

```boot:boot
mkdir boot
cd petalinux/images/linux
cp image.ub zynqmp_fsbl.elf pmufw.elf bl31.elf u-boot.elf ../../../boot
cd ../../..
```

####BIFファイルの作成
BIFファイルはSDカードを作るときに必要となります。
これは、テキストファイルをそのまま作成します。boot/linux.bif として作成します。

```bif:linux.bif
/* 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>
}
```

#Vitisプラットフォームの作成
今まで作成したファイルを元にして、Vitisのプラットフォームを作成します。プラットフォームはVitisが作成します。

```
cd ./pfm
vitis -workspace wksp1
```

Vitisが立ち上がりましたら、Create Platform Project を選択します。（またはメニューから　File → New →　Platform Project でもいいです）

![Screenshot from 2020-01-04 22-57-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c7ed1300-2a99-efd6-85c7-024fa9420e76.png)

次の画面でプラッフォフォーム名を入れます。場所も指定できます。今回はultra96baseにしました。
![Screenshot from 2020-01-04 23-04-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/fd19cb62-9e5c-9b2a-7869-360ccc22d6e4.png)

次にどこから、プラットフォームを作るのか聞いてきます。
今回はXSAから作成するので、Create from hardware specification (XSA) を選択、Nextを押します。

![Screenshot from 2020-01-04 23-05-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e6245861-2ece-3649-b1ff-6c0f3d763015.png)

Vivadoで作成した、xsaファイルを指定します。Operating system は、Linuxで、Processorは psu_cortexa53に選択します。
まだ、ファイルが足りないので、ビックリマークは赤いままで、大丈夫です。　設定したら、Finishを押します。
![Screenshot from 2020-01-04 23-43-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/77fd1aa0-4418-638c-f8f1-389655ddc563.png)

次の画面が出ると、作成されました。linuxとzynqmp_fsblとzynqmp_pmufwがあることを確認してください。
linuxについてはまだ設定ファイルが足りないので、更に追加していきます。
![Screenshot from 2020-01-04 23-50-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/0e9c4bf7-0646-846d-e361-08cad45490b1.png)

linux on psu_cortexa53を選択して、エラーをなくします。Bifファイルは、linux.bif を、Boot ComponentDirectoryと　Linux image　Directoryには bootディレクトリーを　Sysrootディレクトリーには、sysroots/aarch64-xilinx-linuxをそれぞれ指定します。![Screenshot from 2020-01-05 00-01-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ec829037-73de-1051-6ef8-de3ea56fe92f.png)

その後、トンカチアイコン![Screenshot from 2020-01-05 00-06-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/cf9c8007-9118-5ab0-371c-4171e2f9fbac.png)をクリックして、ビルドします。
ここは、インデックスファイルを作っているらしく、時間がかかります。

少し待つとビルドがおわり、exportのフォルダーにプラットフォームのデータが作成されます。
![Screenshot from 2020-01-05 00-09-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c8ac5359-41ac-9b14-5596-c92f9c7f8c8d.png)

これで、ultra96向けプラットフォームが作成されました。

#テストアプリケーションの作成
試しにできたかを確認します。
Vitisのメニューから　File→New→Application Projectを選択します。
プロジェクトネームを適当に入れます。今回はHello Worldにしました。Nextをクリックします。
![Screenshot from 2020-01-05 10-52-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/0965a877-2f57-fa6f-6073-aedda58dfabc.png)

次に、プラットフォームを選択できますので、選択します。ultra96baseです。Nextを押します。
![Screenshot from 2020-01-05 10-52-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/cad75764-01a9-fda3-a246-2dc414864327.png)

次はsysroot等を聞いてきますが、今回はそのままNextです。
その後、お試しをいたします。Exampleを試します。
まだ、Exampleを取り込んでない場合は、取り込むとダウンロードできます。
![Screenshot from 2020-01-05 10-53-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d90f39d0-1365-6a37-ddde-ea1d7a72fb5e.png)

ビルドを行います。トンカチアイコンの右側の三角印![Screenshot from 2020-01-05 00-06-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/cf9c8007-9118-5ab0-371c-4171e2f9fbac.png)から、Hardwareを選択します。
その後、SDcardの中に必要なファイルができます。
Linux用のSDカードを用意してください。
Vitisでできたファイルは　SDカードのFATの領域にコピーします。(フォルダー名は適宜変えてください)

```
cp ./Hardware/sdcard/* /media/$USER/boot
```

またPetalinuxで作ったrootfs.tar.gzをSDカードのEXTフォルダーに入れます。(フォルダー名は適宜変えてください)

```tar:rootfs.tar.gz
sudo tar xzvf <petalinux path>/images/linux/rootfs.tar.gz -C /media/$USER/rootfs

```
その後、Ultra96で実機テストを行います。USB-UARTを接続してください。
ID:root PW:root でUlatra96でLoginします。

その後、次のコマンドで実行可能です。

```
cd /run/media/mmcblk0p1
export XILINX_XRT=/usr
./Hello_world.elf vadd.xclbin 
```
TEST PASS が通りまして、動作を行っています。

#次の展開
今回はプラットフォームの作成を流すだけでした。
途中で、QEMUにも挑戦したのですが、まだ情報が足りてないです。また別の機会に載せたいと思います。

次は、Wifi含めた、Ultra96のプラットフォーム作りを考えています。

##参考文献
[Vitis 統合ソフトウェア プラットフォームの資料 アプリケーション アクセラレーション 開発](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2019_2/ug1393-vitis-application-acceleration.pdf)

[FPGAの部屋　Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方1]
(https://marsee101.blog.fc2.com/blog-entry-4717.html)
[FPGAの部屋　Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方2]
(https://marsee101.blog.fc2.com/blog-entry-4718.html)
[FPGAの部屋　Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方3]
(https://marsee101.blog.fc2.com/blog-entry-4719.html)
[FPGAの部屋　Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方4]
(https://marsee101.blog.fc2.com/blog-entry-4720.html)

[Xilinx/Vitis_Embedded_Platform_Source](https://github.com/Xilinx/Vitis_Embedded_Platform_Source)