KRIA XILINXのSOMボードのVitisプラットフォームの作り方(2022.1 版）

# KRIA KV260(K26) とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c6603d60-72b4-581c-ae7d-81bf6266573a.png)
XILINXが提供したCPU 付きFPGAのSOMボードです。
機能の割には安価の上、半導体不足でも比較的優先的に生産されるため、入手性にも優れています。
また同じ規模のデバイスに比べて、価格が安いというのが特徴です。（ZYNQ MP ZU5EV相当品）
半導体デバイスから作る作るのに比べると、安定動作と製作費が安いこと、
スターターキットなどの充実度が高いこと、また今後注目されるFPGAになりますので情報量の期待も多くなる予定です。

今回はKRIAを動かすためのVitisプラットホームの作成を行います。

KRIAの場合はまだ進化途中のため、バージョンが上がるごとに使い方が変わっていくってことがあります。
そのため、まとまった情報が追いつくのが難しく、今回は現時点での情報として提供いたします。
- -- 
# KRIAにおける、開発の特徴
今までの FPGA 開発に比べてKRIAでは、ハードウェアの開発部分を前段階のVivadoで行うか、後半段階のVitisで行うか選べるようになりました。
それぞれ次のような特徴があります。
| 開発ツール | Vivado | Vitis | 
|:-:|:-:|:-:|
|設計サイクル|時間がかかる|設計サイクルが早い| 
|FPGAの動作速度|スピードが出やすい|メモリーアクセスの影響で動作速度にロスが出やすい。| 
|IOの設計|可能|不可能|
|HLS(C言語設計）|可能|可能|
|HDL(VHDL,Verilog）|可能|可能|
|設計者|ハードウェア設計者向き|ソフトウェア設計者でも対応可能|

それぞれ設計に特徴がありますので、特徴に応じて設計がが可能になります。
開発時期にはいろんな機能を試したいケースがありますので、後半部分のVitisで、
ある程度機能がまとまったら、動作速度が足りない場合のみ前半部分のVivadoで対応することが可能です。
- - - 
# 開発の流れ

https://github.com/Xilinx/Vitis-Tutorials/blob/2022.1/Vitis_Platform_Creation/Design_Tutorials/01-Edge-KV260/README.md
KRIAを開発するには、次のステップが必要になります。
ステップ1、プラットフォーム向けハードウェアの作成
ステップ2、Vitisプラットフォームの作成
ステップ3、アプリケーション向けハードウェアおよびソフトウェアの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/51200237-d65a-8264-d559-dcfc89c74323.png)
- - -
# 必要な開発環境
Vitisプラットフォームを作るためにはザイリンクスの開発ツールが必要になります。

Vitis エンベデッド ベース プラットフォーム - 2022.1  Full Product Installation
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-platforms.html

STEP１のVivadoは、Vitisの中に含まれています。
改めてVivadoをインストールする必要はありません。

Petalinux
https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-design-tools.html

動作する SD カードイメージを作成するために必要となります。
ただし、動作する SD カードイメージを、あらかじめ準備ができるならば必要ではなくなりました。
今回はイメージファイルの提供をしますので、特に必要はありません。
- - - 
## 予め必要なファイル
開発にあたってあらかじめ用意しておくファイルを説明します。

Peta Linux SD カードイメージファイル

https://qiita.com/drafts/15bf24e9c4d631e53add/

KRIAが起動する、Linuxのイメージファイルです。バージョンはPetalinux2022.1を使用します。
今回は上記ホームページ用で作ったものを使用しますが、ザイリンクスその他が提供するものでも構いません。
ザイリンクスの方も、KRIA Wiki で Petalinux用イメージファイルを提供しているのですが、編集日時現在、2022.1のバージョンでは起動ができない状態です。

ZYNQMP の共通イメージ (TAR/GZIP - 1.89 GB)
次のホームページから、ZYNQMPの共通イメージをダウンロードします。

https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-platforms.html

# ステップ1 Vivadoでの開発
ステップ1はXSAファイルを作ることを目標にいたします。今回は最も基本的なハードウェアの構成になります。必要に応じてオリジナルの設計情報を入れることも可能になります。特に、IO部分はVivadoでしか設定できませんので、ここで設計する必要が出てきます。

#### Vivado 起動
1-1 作業ディレクトリを作成し、Vivadoを起動させます。今回は作業ディレクトリを workspace にしました。ディレクトリーを作成して、
そこに移動 vivalo を起動しさせます
Vitis_Install_Directory は通常ですと、/tools/Xilinx/Vivado/2022.1になります。

```vivado_start.sh
mkdir WorkSpace
cd WorkSpace
source <Vitis_Install_Directory>/settings64.sh
vivado &
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/da92aa8e-6ca0-0b02-964e-58a72388865a.png)

#### vivadoのプロジェクト作成
1-2 vivadoのプロジェクト作成をいたします。下記の図のようにcreate Project をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f92c886f-d10d-1d36-f2ef-1cc945166674.png)

1-3 案内画面が出てきます。Next を押して次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/00846281-5ad0-930e-38d6-b2db3a239ab2.png)

1-4 Project name を入れます。今回は kv260_hardwar_platformにしました。入力しましたら NEXT を押して次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/87a28539-fec1-9cc0-7fd0-2889ed64d5a4.png)

1-5 Project Typeを選択します。通常はRTL Projectを使用します。また、KRIAの場合は、Vitisプラットホームを作るのが前提のため、Project is an extensble Vits platformにチェックを入れます。入力しましたら NEXT を押します。
他のメニューの項目は、他の論理合成ツールを使ったり IO の入力を行ったりサンプルプロジェクトの作成を行ったりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/62d06e28-552f-1ac2-ce67-d53d3acd6267.png)

1-6 Default Partの選択です。ボートの選択をします。まず、Boardタブを選択します。KV 260スターターキットを使用します。K26 SOM もメニューの中にありますので、スターターキットを使わない場合はそちらを選択してください。スターターキットの場合はconnectionsの選択前も行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/eefbb0a0-86b6-4a90-5ca1-443a74e031a9.png)

1-7 connectionsの選択で、Vision AI Starter Kit carrier card の選択をいたします。OK ボタンを押します。自作ボードの場合はここは選択しなくて大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/469c46dc-c0a1-0a20-6253-b38b19cd9a0b.png)

1-8 New Project の確認です。特に間違いないか確認してください。確認が終わりましたらFinishを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f1a3ac48-f414-bb8e-ddd9-1e2b0dc72a3c.png)
- - -
#### IP Integraterの作成
KIRAでは IP ベースの作成を主に行います。今まで通りのRTL(Verilog、VHDL)も可能なのですが、回路規模が大きくなったこと、豊富になってきたこと、自作 IP も IP として登録でき、再利用ができるようになってきたことからIP ベースの設計が多くなりました。RTLベースに比べると設計速度が3倍ほど効率が良くなっています。
また、IPとしては、XILINX社、RTL、C言語設計など混雑することも可能です。設計の自由度が上がるメリットもあります。
今回必要になるのは、CPU、クロックジェネレーター、リセットシステム、割り込みコントローラーの IP が必要になります。また同時にVitisプラットフォームに必要な設定も行います。

1-9 ブロックデザインの作成をいたします。画面左側のPROJECT MANAGERから、Create BlockDesignをマウスでクリックします。ブロックデザインが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f5d81799-9233-42a2-1799-14529c80779d.png)

1-10 ブロックデザインを作成します。Design nameを入力します今回はsysmtemにしました。OK ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/07dbcadf-dd66-559c-cf14-4181b5ce7b9b.png)

1-11 必要となる IP デザインを置きます。白いキャンパスの中で、マウスを右クリックします。メニューが出てきます。その中からAdd IP を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/4145e1f3-b4bf-6dc4-6f26-4990b556c9d6.png)
- - -
###### CPUの設定
1-12 IP の選択ができます。IP は200以上ありますので必要な IP を探すのはなかなか困難です。そのためサーチ機能を使った方が便利になってます。KRIAに使用されている CPU はZynq UltraScale+ MPSoC なので、SerchにZynqを入れて、表示件数を絞り込みます。その中からZynq UltraScale+ MPSoCをクリックいたします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c9562e9f-805c-dcc0-b0b5-a827f85ded9b.png)

1-13 Zynqのブロックができました。次にZynqMPの設定を行います。それに決まったボードがありますので、ほとんどが自動的に行うことが可能です。左上のRun BLock Automation の文字をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/fc044c5a-52db-464a-565d-b3ee8c4fb199.png)

1-14 CPU の初期設定を行います。ここではデフォルトで使用します。自作ボードの場合は設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e2ba281f-5682-88e8-d157-a49d9317095d.png)
- - -
###### クロックジェネレータの設定
1-15 次にクロックジェネレーターを追加します。この IP はFPGA 内部で PLL を持ってまして周波数の変換等を行ってくれます。最近の FPGAは、複数クロックを使うことが多くなってきました。複数クロックの作成も FPGA 内部で行うことができます。今回は100MHz、200MHz、400MHzを作成します。キャンパスを右クリックしてメニューを出し、Add IPを選択してください。その後SerchにClockを入力して、選択項目を絞り込み、CLocking Wizardをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c5859dc6-9d64-a4bd-1af6-f9d2c70669d1.png)

1-16 Cloking Wizardの設定を行います。出てきたIPのClock Wizardをダブルクリックします。これで設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/4554fbb2-bab9-7a71-16b2-1b6d25afe75e.png)

1-17 クロックの設定およびリセットの設定を行います。まず上のタブをOutput Clocksを選択します。クロックは三つの主力を出したいので、clk_out2 clk_out3 にチェックを入れます。ブロックはそれぞれ100MHz、200MHz、400MHzを入力します。Reset Typeも変更します。Active Lowを選択してください。入力が終わりましたら OK ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/90952bb5-4f15-7d69-d5b4-2338af83be18.png)
- - -
###### リセット IP の設定
1-18 リセットIPを追加します。キャンパスの空いてるところを右クリックしてメニューを出します。Serchにresetを入力して選択項目を絞り込みます。Processor System Resetを選択してクリックします。このリセットIP は３つ必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ec8a8cc1-4ea3-8a5c-8648-2110d94c68dd.png)

1-19 リセットIPは3個置きます。1回ずつ Add IPを使用して追加してもいいのですが、一つを選択してコピーするっていう方法も取れます。リセット IP を選択肢、CTRL+Cでコピー、CTRL+Vで貼り付けが可能です。これで3個のIPを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/5c9ba0c1-0f09-fde0-172f-912cc8d72c64.png)

1-20 クロックの配線を行います。キャンパスで配線を行っても良いのですが、Vivadoでは、自動的に配線する機能を持っています。今回はその機能を使用します。左上のRun Connection Automationをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/052869ac-d2ca-963f-c7f9-899c72149784.png)

1-21 クロックの設定を行います。それぞれリセットIPに対して、異なる周波数を設定します。まず使用するブロックが全てチェックを入れてください。その後、clk_in1を選択し、Clock Sourceを/zynq_ultra_ps_0/pl_clk0(99MHz)を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/b36dc2b4-de46-5b90-eb54-913fad3629c0.png)

1-22 リセットIPについてはそれぞれ、異なる周波数を選択します。各リセットIPのslowest_sync_clkごとに、/clk_wiz_0/clk_out1(100MHz)、/clk_wiz_0/clk_out2(200MHz)、/clk_wiz_0/clk_out3(400MHz)を選択してください。終了しましたら OK ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/7ed49750-6e92-2ead-ea8a-be572ca173eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d8c38656-3f9a-80c1-1fea-48e50e194f42.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/67f4b68c-ba6b-533f-4f18-88b49dd7f655.png)



1-23 できましたら再配置ボタンを押します。次のように配置されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/a03cff4f-f396-e287-81da-11a8f13ea139.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d90140fe-cf0b-3ca8-09e8-39f2be2e89f1.png)

1-24 clk_wiz_0のロック信号をリセットIPのdcm_lockedに配線します。lockedをクリックして、ドラッグしながらリセットIP の dcm_lockedに持っていき、ドラッグを話します。3個のリセットIPを全て接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e4397d79-4b2d-1b0e-e7c7-f019a656df6a.png)

1-25　ロック信号を接続した回路図は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/29e82285-5e5a-2230-a1db-a26a46acd639.png)


- - -
###### Vitis プラットフォームの設定（クロック）

1-26 Vitisプラットフォームを作成するには、ハードウェアの情報を知らせる必要があります。それを行うのがplatform Setupです。今回はクロックのみ行います。また後で他の設定項目を行います。Platform Setup タブをクリックします。Clockをマウスでクリックします。Enableにはすべてチェックを入れます。ID は入力し直します。０，１，２とそれぞれ入れます。数字は0から順番に入れないとVitisプラットフォームの方で使用できません。is DefaultはVitis側で選択できるクロックを自動設定する場合に使用します。200MHzのところにチェックします。is Defaultは、必ずひとつは、入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/e4611689-920d-a220-0d84-5a00491664f6.png)
- - -
###### 割り込みコントローラーの設定
割り込みをVitisプラットフォームで使えるように、割り込みコントローラの追加をします。また同時にVitisプラットフォームの設定もします。
割り込みコントローラ自体は CPU にもついているのですが、数が16個しかなくVitisで使用しますと、足りなくなるケースがあります。そのためCPU の外側に割り込みコントローラを追加して最大32本の割り込みを受付出られるようにします。
割り込みコントローラと CPU を接続するために、CPU 側のインターフェイスの設定も行います。同時にインターフェースのVitisプラットフォームで使える設定も行います。


1-27 CPUのインターフェースの設定を行います。zynq_ultra_ps_e_0 をマウスでダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/da42c14f-878f-0dad-835e-28bd1f520e98.png)


1-28 CPU の設定を行います。PS-PL configuration クリックしてインターフェースの部分の設定ができるようにします。ここでは主に CPU 部分（PSといいます。)とFPGA 部分（PLといいます。)の間にどういう信号を接続するかの設定を行います。今回はインターフェイスの設定を行います。ここはAXIインターフェイスっていうものを使ってます。PS-PL interefaces の右側の＞をクリックして、項目を展開します。Master Interfaceも展開します。AXI HPM0 FPDとAX HPM1 FPDの設定を外して、AXI HPM0 LPDの設定を有効にします。AXI HPM0 LPD Data Widthのデータ幅は32 Bit にします。
今回ここで使用してないインターフェースはVitisプラットフォームで使えるように設定します。OK をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/5ce7b386-20c4-961c-721b-477c2ce2b83b.png)

1-29 割り込みコントローラを追加します。キャンパスの空いてるところを、右クリックしまして、メニューを出しAdd IPを選択します。
Serchにintcと入力して、AXI Interrupt Controller をダブルクリック、または選択してからエンターキーでで IP を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/bb794265-d446-5d1b-61d6-b849d90b4e34.png)

1-30 割り込みコントローラの設定を行うために、AXI Interrupt Controllerをダブルクリックします。ここでは、CPU と接続するための設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/93c3ab31-25f9-82f1-a3d1-5ebc9e62956d.png)


1-31 出力タイプを設定します。Intterrupt Output Controller をsingleに設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/bc1e3b3c-0f39-0d60-61a1-e369938bd736.png)

1-32 張り込みコントローラーをCPU に接続します。自動配線が使用できます。左上にある Run Connection Automation をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/6bbd3e59-9c56-c6b3-ae40-40572c1d6221.png)

1-33 割り込みコントローラーの接続情報です。ここではデフォルトで設定いたします。OK をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d9a81729-d7d3-d501-6fa0-4048ae2ff1f4.png)

1-34 割り込み線を接続します。AXI Interrupt Contoroller のirq をマウスで、クリックしてから、鉛筆のアイコンのまま、ドラッグします。ドラッグ先は、Zynq UltraScale+ MPSocのpl_ps_irq[0:0]になります。緑のチェックマークが現れたらマウスのボタンを離します。ここはマニュアルで設定しないと接続されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/05f830dc-642a-bc98-804b-b0c5e6ccac5a.png)

接続されると次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/60307d3b-de6c-6c45-d572-050ac239440b.png)


1-35 割り込みコントローラをVitisプラットホームとして設定します。Platform Setupのタブを、選択して、プラットホームの設定ができるようにします。Interruptを選択して、割り込みコントローラの設定を行います。乗り込みの入力はたくさんありますが今回は、axi_intc_0のintrを使用します。ここだけで32本までの割り込みを受け付けることができます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/0ca0f984-0b47-de81-479f-6a9ca2e3367a.png)

1-36 インターフェースのVitisプラットホームの設定を行います。AXI Portを選択します。下記の図のようにEnabledをSZynq_ultra_ps_e_0のS_AXI_LPDをを除いてチェックします。Memportは、S_AXI_HPC0_FPD、S_AXI_HPC1_FPDをS_AXI_HPに変更します。 SP Tagは、図のようにそれぞれの名前を入力してあげてください。これはVitisで同じメモリーポートに集まって、転送速度が低下しないための工夫になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ebfa6cd5-c2d5-7369-e05a-5e8ea4e4dfd6.png)

- - - 
###### 回路のチェック
1-37 回路が正しいか、チェックを行います。Diagramのタブを選択した後、上部にあるアイコンのVaitedボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/ca315e28-8f5f-5aad-5f41-7bcaa8643404.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/67bc7a02-5056-302c-0d38-7c6f8310427b.png)


1-38 クリティカルワーニング出ますが、割り込みコントローラの接続がされてないためです。Vitisプラットフォームを作るためには必要なことなので無視して OK を押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/78758def-d73a-c966-59fe-c3dd1e602bd0.png)

- - -
###### 全体のソースコードを作成する。
1-39 Vivadoは、元々はHDL ベースです。そのためトップファイルはHDL でないといけません。ただし自動的に作成することができますので、それを利用します。Sourceタブを選択します。Design Souce中にあるSystemを右クリックしてメニューを出します。その中のCreate HDL Wrapperをクリックして、自動的に HDL ソースを作成します。自分のHDLソースがある場合、作成した HDL ソースを編集して追加することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/82b6ce6a-f961-678b-0969-318239443e20.png)

1-40 IPを変更したときに、自動的にHDLを作成するかどうかを決めます。今回はデフォルトのまま OK をクリックします。クリティカルワーニングが出ますが、ここも無視します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/9bf2ce58-2b66-3805-e88a-5ab108451dc5.png)

- - -
###### ビットストリームを作る。

1-41 IP のネットリストを作成します。Generate Block Designをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/310cb2c4-39d5-4d9d-687d-e1bbbb2a9a23.png)

1-42 ネットリストを作る時の設定です。Globalを選択してGenerateをクリックします。ネットリストが作成されます。数分時間がかかります。
クリティカルワーニングがでますが、ここも無視します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d8edf7d0-7a25-a857-010c-6972bad260b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/543cd85d-dd18-d4f6-5266-2cff4898b163.png)

1-43 ビットストリームを作成します。Genarate Bitstreamをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/8c29c2bf-1e54-3aab-bc65-0179fd07b914.png)

1-44 確認事項がいくつか出てきますが、今回はすべてデフォルトで OK にします。ビットストリーム作成時間の短縮のため、CPU の使用数や外部のCPUリソースを使うことも可能です。右上に出てくるアイコンで現在作業中かどうかが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/0d84bc58-7c54-1a45-409e-3798f4f74e0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/70c6de09-51ef-4503-dff4-fb94137a69fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/b94b797f-b20b-258f-1ae9-d084690eba01.png)

1-45 数十分後コンパイルが終了します。今回は特に見る項目がないので、View Reportsを選択して、利用します。この時点でビットストリームが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/d3c257b1-2873-f252-f8af-7a064d221fa7.png)

- - -
###### XSAファイルの作成
1-46 ソフトウェアで使うためのハードウェア情報を出力します。このファイルはPetaLinux、Vitisともに使用できる共通のファイルになります。Export Platromをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/554a0250-28fb-165a-806e-74d5310ab8ce.png)

1-47 ハードウェア情報を出力します。出力を行うコメントを確認後Nextボタンをクリックします。Platrom Typeでは、Hardware and hardware emulationをクリックします。エミュレーションは開発ツール上で実況なく動作を確認できるモードです。Next をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/a9a59153-9808-ce63-f0c1-f5d0fdd6a387.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/b35155c0-487e-5f25-df3c-6bc35d76349c.png)

1-48 Platform Stateを設定します。 Pre-synthesisを選択（デフォルトです）、Include bitstreamにチェックを入れます。Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/8d1c3600-73d5-e6e8-e0cc-1845477c4bd4.png)

1-49 プラットフォームの説明を入力します。今回は次のような設定にしました。設定が終わりましたら NEXT をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/a06cd945-c21b-a192-c7ab-71176e1910da.png)

1-50 出力ファイル名を設定します。XSA file nameをkv260_hardware_platformにしました。ここは任意で構いません。終わりました Next をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/cf3ed9cb-381f-7ce6-086e-f74d27c1e057.png)

1-51 出力情報確認します。確認が終わりましたらFinishをクリックします。少し立って、出力ファイルが作成されます。このファイルをPeta Linux やVitsプラットフォームで使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/09404468-8cf1-602e-b144-09af3e97e4f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/bd6bc324-46bd-a9c0-e81f-e7dea92ce8fe.png)

1-52 Vivadoを終了します。
- - - 
# ステップ２Vitisプラットフォームの作成
ここでは、Vitisアットホームのために Linux のシステムを作成します。KRIAは、今までのFPGAと異なり、Linux 起動後にfpga のデータをロードします。あらかじめ動作する SD カードイメージを用意して、作成したデータを用意します。この時必要なことは、後から追加できるデバイスツリーファイルになります。

###### ZYNQMP 共通イメージのダウンロード

2-1　ZYNQMPのLinux共通イメージをダウンロードします。予めダウンロードしてる方はそれを利用します。

ZYNQMP の共通イメージ (TAR/GZIP - 1.89 GB)
次のホームページから、ZYNQMPの共通イメージをダウンロードします。ダウンロード場所は WorkSpace に設定します。

https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/embedded-platforms.html

```tree
cd WorkSpace
tree -L 1
.
├── kv260_hardware_platform
└── xilinx-zynqmp-common-v2022.1_04191534.tar.gz

```
2-2 共通イメージの解凍します。作業用ディレクトリを作りまして、その中の共通イメージを解凍します。この中には SD カード起動時に必要なファイルとPetaLinux で使うライブラリやコンパイラが入っています。

```
mkdir kv260_vitis_platform
cd kv260_vitis_platform
tar xvf ../xilinx-zynqmp-common-v2022.1_04191534.tar.gz -C .
```
その結果です。
```
tree -L 2
.
└── xilinx-zynqmp-common-v2022.1
    ├── Image
    ├── README.txt
    ├── bl31.elf
    ├── boot.scr
    ├── rootfs.ext4
    ├── rootfs.manifest
    ├── rootfs.tar.gz
    ├── sdk.sh
    └── u-boot.elf
```

###### PetalinuxのSDカードイメージを作る。
2-3 PetainuxのSD カードイメージを作成します。今回はあらかじめ用意したものを利用します。次のページから一番簡単な作成方法を載せておきます。
https://qiita.com/basaro_k/items/15bf24e9c4d631e53add

なお、ここで作ったものをダウンロードできるようにしてあります。次のところから、ダウンロードすることも可能です。
https://fpga.co.jp/kria_2022.1/kria-petalinux-sdimage.zip

###### オーバーレイ用デバイスツリーを作成する。
KRIAでは、Linux起動時に、FPGAの部分を動的に変更することができます。その時ソフトウェアとしてはハードウェア情報が必要なのですが、これを補うのがデバイスツリーです。通常デバイスツリーは、Linux 起動時に読み込まれますが、KRIAは、動的に読み込むためのオーバーレイデバイスツリーというのを作成します。そのためのツールをがVitisからXSCTコマンドを通して、ご提供されました。今まではPetaLinux が必要だったのですが、なくても使用できるようになってます。

2-4 オーバーレイ用デバイスツリーは、Vitisのコマンドで実行できます。Vitisの環境を起動します。その後xsct コマンドを起動させます。xsctは、Vitisの機能をコマンドラインで実行するための環境です。その中でデバイスツリーを作るコマンドを実行します。必要なのは、Vivadoで作った XSA ファイルです。作成されるファイルはデバイスツリーのソースファイルです

```
source /tools/Xilinx/Vitis/2022.1/settings64.sh
cd kv260_vitis_platform
xsct
```
```
createdts -hw ../kv260_hardware_platform/kv260_hardware_platform.xsa -zocl -platform-name mydevice -git-branch xlnx_rel_v2022.1 -overlay -compile -out mydevice
```
 createdts のオプションの説明を載せておきます
* -platform-name: プラットフォームの名前
* -hw: Vivdoで出力したXSAファイル
* -git-branch: デバイスツリーのブランチ
* -zocl: zoclドライバーの有効化。ZYNQMPでVitisを使うために必要になります。
* -overlay: デバイスツリーをオーバーレイでサポートさせます。
* -compile: デバイスツリーをコンパイルしてバイナリーのデバイスツリーファイルを作成します。
* -out : 書き込むフォルダーを作成します。

※注意：WSL2上ではこのコマンドが動かないことが報告されています。Vits IDEを立ち上げて、メニューのXILINX→XST Consoleから実行できます。

2-5 xsctを終了させます。exitとと入力します。

```xsct
exit
```
以下に実行結果を載せておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/b8e3d1d7-5ca4-1529-6f16-e66174c3c9b2.png)

2-6 デバイスツリーオーバーレイのコンパイルを行います。ソースファイルからバイナリファイルに変換します。
その後作成されたデバイスツリーファイルを出力のためのフォルダーを作成してそこにコピーします。

```
dtc -@ -O dtb -o mydevice/mydevice/mydevice/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo mydevice/mydevice/mydevice/psu_cortexa53_0/device_tree_domain/bsp/pl.dtsi
mkdir dtg_output
cp mydevice/mydevice/mydevice/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo dtg_output
```

dtcコマンドですが、dtboが出力ファイル名 dtsiが入力ファイル名です。ディレクトリは適宜で大丈夫です。

- - -
###### Vitis プラットフォームの作成。
Vitis プラットフォームを作成します。Vitisではプラットフォームを作成してからその上でアプリケーションを作成します。そのために必要なファイルを用意します。


2-7 プラットホームを作成に必要なファイルを用意します。次のようにしてください。
```
mkdir pfm
mkdir pfm/boot
mkdir pfm/sd_dir
```
bootはLinux起動用ファイル（BOOT.BIN)を作成するためのファイルを用意します。ZYNQMPに入っていた、bl31.elf、boot.scr、u-boot.elf ファイル等がそれに相当します。
sd_dir には、FAT32側に、予め入れておきたいファイルを用意します。使いたいファイルがある場合は用意しておいてください。
今回は、両方とも空になります。

2-8 sysyrootのインストールを行います。SysrootはPetalinuxで使うライブラリーやコンパイラーが入っています。今回はライブラリーを使うために用意しています。zynqmp-common-v2022.1のディレクトリーに入り、sdk.shを実行します。ディレクトリーは-dオプションで設定できます。

```

 cd xilinx-zynqmp-common-v2022.1
./sdk.sh -d ..

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/29160806-933c-035b-ad1a-3675e3198751.png)


ディレクトリーは次の形になります。

```

tree -L 2
.
├── dtg_output
│   └── pl.dtbo
├── mydevice
│   ├── device-tree-xlnx
│   └── mydevice
├── pfm
│   ├── boot
│   └── sd_dir
├── sysroots
│   ├── cortexa72-cortexa53-xilinx-linux
│   └── x86_64-petalinux-linux
└── xilinx-zynqmp-common-v2022.1
    ├── Image
    ├── README.txt
    ├── bl31.elf
    ├── boot.scr
    ├── rootfs.ext4
    ├── rootfs.manifest
    ├── rootfs.tar.gz
    ├── sdk.sh
    └── u-boot.elf

```

###### Vitisでプラットフォームの作成。
Vitisプラットフォームはバイトのツールを使って作成することができます。ここではその使い方を紹介します。

2-9 Vitisを起動します。ここではVitisプラットフォームを作るためにVitisの起動を行います。

```
cd ~/WorkSpace/kv260_vitis_platform
vitis &
```
2-10 Vitisの作業領域を設定します。今回は、kv260_vitis_platformと同じ場所を設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c81d1971-bf9a-faa3-5329-c8ca16089d51.png)

2-11 プラットフォームを作成します。Create Platform Projectをクリックします。メニューのFile→New→ Platform Project でも起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f9435be8-78b9-9990-6059-6abd6cbac74c.png)

2-12 プラットフォームの名前を入力します。今回はkv260_customにしました。Nextをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/a61f1648-9205-d635-8b15-177240afdd29.png)

2-13 設定するプラットフォームの設定を行います。Vivadoで出力した、XSAファイルをしています。Operationg Systemには、linuxを指定します。Boot Componetsには、チェックを外して、使用します。終わりましたら、Finishをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/026d8362-02c8-c458-c009-1530957c8a75.png)

2-14 BIFファイルの作成を行います。まず、linux on psu_cortexa53をクリックします。その後、Bif FileのBrowseの右側をマウスでクリックし、メニューを出します。Genarete BIFをクリックします。これで BI ファイルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c606779e-d0b4-4157-06ed-c3f5e83ab4b1.png)

2-15 残りのフォルダーの設定を行います。設定するのはBoot Components Directory と FAT32 Partation Directoryです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/7ef2164d-0ff9-f065-22bb-d43e48ead926.png)

2-16 コンパイルを行います。左側の上部のハンマーアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f4a4c0db-fae7-b7c7-23ee-0c3c5d0d3441.png)

2-17 Vitis プラットフォームが作成されました。作成されたファイルの確認を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/31a3fbb4-6dea-ef57-e70b-6b7c84022960.png)

このファイルが、Vitisプラットフォームになります。

- - - 
# ステップ３テストアプリケーションの作成

テストアプリケーションを作成します。
Vitisの大きな特徴はVitisでハードウェアのブロックが作成できることです。今回も簡単なブロックですがハードウェアブロックを作成してそれを動作させます。

##### プラットフォームの確認
3-1 使用できるプラットフォームの確認をいたします。Vitisが動く環境のもとで、platforminfoを実行します。使えるクロック　メモリーインターフェースなどが確認できます。

```
$ platforminfo kv260_custom/export/kv260_custom/kv260_custom.xpfm 
==========================
Basic Platform Information
==========================
Platform:           kv260_custom
File:               /home/tadaaki/WorkSpace/kv260_vitis_platform/kv260_custom/export/kv260_custom/kv260_custom.xpfm
Description:        
kv260_custom
    

=====================================
Hardware Platform (Shell) Information
=====================================
Vendor:                           xilinx
Board:                            kv260_hardware_platform
Name:                             kv260_hardware_platform
Version:                          0.0
Generated Version:                2022.1
Hardware:                         1
Software Emulation:               1
Hardware Emulation:               1
Hardware Emulation Platform:      0
FPGA Family:                      zynquplus
FPGA Device:                      xck26
Board Vendor:                     xilinx.com
Board Name:                       xilinx.com:kv260_som:1.3
Board Part:                       XCK26-SFVC784-2LV-C

=================
Clock Information
=================
  Default Clock Index: 1
  Clock Index:         0
    Frequency:         99.999000
  Clock Index:         1
    Frequency:         199.998000
  Clock Index:         2
    Frequency:         399.996000

==================
Memory Information
==================
  Bus SP Tag: HP0
  Bus SP Tag: HP1
  Bus SP Tag: HP2
  Bus SP Tag: HP3
  Bus SP Tag: HPC0
  Bus SP Tag: HPC1

=============================
Software Platform Information
=============================
Number of Runtimes:            1
Default System Configuration:  kv260_custom
System Configurations:
  System Config Name:                      kv260_custom
  System Config Description:               kv260_custom
  System Config Default Processor Group:   linux_domain
  System Config Default Boot Image:        standard
  System Config Is QEMU Supported:         1
  System Config Processor Groups:
    Processor Group Name:      linux on psu_cortexa53
    Processor Group CPU Type:  cortex-a53
    Processor Group OS Name:   linux
  System Config Boot Images:
    Boot Image Name:           standard
    Boot Image Type:           
    Boot Image BIF:            kv260_custom/boot/linux.bif
    Boot Image Data:           kv260_custom/linux_domain/image
    Boot Image Boot Mode:      sd
    Boot Image RootFileSystem: 
    Boot Image Mount Path:     /mnt
    Boot Image Read Me:        kv260_custom/boot/generic.readme
    Boot Image QEMU Args:      kv260_custom/qemu/pmu_args.txt:kv260_custom/qemu/qemu_args.txt
    Boot Image QEMU Boot:      
    Boot Image QEMU Dev Tree:  
Supported Runtimes:
  Runtime: OpenCL

```

3-2 アプリケーションを作成します。簡単な足し算のハードウェアブロックを作成します。
まだ作業領域としてはディレクトリーを作成その後Vitis起動します

```
mkdir kv260_vitis_application
vitis &
```

##### アプリケーションの作成

3-3 VitisのWorkSpaceを設定します。今回は、kv260_vitis_applicationにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/87421b69-a6cc-f5e3-9ffb-17d43478bcb5.png)

3-4 アプリケーションを作成します。Create Application Project を選んでクリックします。メニューから File → New →　Applicationからでも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/02e8746f-a1d1-537e-6019-e05011f46458.png)

3-5 アプリケーションを作ることを、確認します。よろしければ、Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/6e8b0b9f-3fb2-2193-a691-0853fd317446.png)

3-6 作成したプラットフォームを選択します。最初の起動には出てきませんので、Addをクリックして先ほど作成した KV260のプラットホームを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/f30beca2-d87c-b63f-b726-83f407dd1cc8.png)

3-7 作成したプラットフォームはkv260_customです。選択して、Openをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/3a07eb77-7315-90f3-cfd0-00e16c1ec67c.png)

3-8 kv260_customが入力されましたので、これを選択して Nextをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/c5ffe801-b9e2-d289-7acf-dcae66e30694.png)

3-9 アプリケーションの名前を決めます。今回は vaddにしました。Next をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/267dbf62-5adc-a614-68e9-7badbdfaa506.png)

3-10 ドメインの確認とsysroot Pathの設定を行います。このディレクトリは STEP 2で作成したディレクトリになります。できましたら Next をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/5ec8406d-6a09-c819-012d-ab641e5d3411.png)

3-11 サンプルアプリケーションを設定します。今回は、Simple Vector Additionを使用します。今のところライブラリーが少ないですが、インターネットからダウンロードもできますので多数のライブラリーも使用することが可能です。
https://japan.xilinx.com/products/design-tools/vitis/vitis-libraries.html#libraries　
などを参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/cfcdc517-baf1-bfc3-d3f5-79dd10f574a7.png)

3-12 コンパイルモードをハードウェアに変更します。Active build configurationをHardwareに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/1d1dbfee-18ad-b714-eec4-9fdf6e72fde7.png)


3-13 ハードウェアカーネルをビルドします。Vadd_system_hw_link の下の Vadd_system_hw_link.prjを選択してから、上のアイコンのハンマー（ビルド）をクリックします。終了まで、数分から、数十分かかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/7f4d2036-7776-38e2-3a4a-7700aa473597.png)

3-14　ソフトウェアをビルドします。Vaddの下のVadd.prjを選択した後、アイコンのハンマーをクリックします。こちらは数秒で終わります。vadd/Hardwareにvaddという目的のファイルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299213/2dc6ffaa-9526-d83b-053b-7c9acec37ce2.png)

##### KRIAにコピーするファイルを集める

3-15 KRIAで動作させるために、次のファイルが必要となります。その内、pl.dtboはSTEP 2で作成されています。binary_container_1.binは、3-13で作成された、binary_container_1.xclbinをリネームしたものです。shell.jsonはテキストファイルで作る必要があります。

```
# On target board
ls /lib/firmware/xilinx/vadd
pl.dtbo                       #DTB overlay file
binary_container_1.bin        #Acceleration binary container for XRT configuration. Also includes system.bit and metadata that describes the kernels. 
shell.json                    #Description file
```

3-16 shell.json をテキストエディターで作成します。

```shell.json
{
  "shell_type" : "XRT_FLAT",
  "num_slots": "1"
}
```

3-17 KRIAボードにシリアルポート、イーサーネットを接続します。イーサーネットはファイルをコピーするために必要となります。KRIAに電源を入れます。イーサーネットで、パソコンと接続するため、必要に応じて、IPアドレスを設定します。

```
sudo ifconfig eth0 192.168.7.10
```

3-18 送るためのファイルを準備します。
```
mkdir scpfolder
cd scpfolder/
cp ../kv260_vitis_platform/dtg_output/pl.dtbo .
cp ../kv260_vitis_application/vadd_system_hw_link/Hardware/binary_container_1.xclbin .
mv binary_container_1.xclbin binary_container_1.bin
cp ../kv260_vitis_application/vadd/Hardware/vadd .
```
```
cat shell.json 

{
  "shell_type" : "XRT_FLAT",
  "num_slots": "1"
}
```

3-19 scpコマンドを入力して、ファイルをKRIAにコピーします。パソコン側で操作します。途中で、KRIA側のパスワードを聞いてきますので、入力してください。
```

scp pl.dtbo vadd shell.json binary_container_1.bin petalinux@192.168.7.10:/home/petalinux
```

##### KRIA側でのアプリケーション登録

3－20 KRIA側で、ハードウェアを登録します。この時に FPGA のハードウェア情報が動的にロードされます。
```
sudo mkdir /lib/firmware/xilinx/vadd
cd /home/petalinux
sudo cp pl.dtbo binary_container_1.bin shell.json　/lib/firmware/xilinx/vadd/
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp vadd
```

##### KRIA上でアプリケーションを動作させる

3-21 実行ファイルを動かします。./vadd vinary_container_1.binと入力します。実際にテストはうまくいきました。

```
xilinx-kv260-starterkit-20221:~$ chmod +x ./vadd
xilinx-kv260-starterkit-20221:~$ ./vadd binary_container_1.bin 
INFO: Reading binary_container_1.bin
Loading: 'binary_container_1.bin'
Trying to program device[0]: edge
Device[0]: program successful!
TEST PASSED
```
これで、KRIAでハードウェアの確認を行うことができました。

# KRIAでの将来性
バージョンアップとともに、ツールの操作は簡単な方向に行っています。
その部分は楽しみであるのですが、より多様性が増えますので、KRIAを一言で何っていうのが言いにくくなるだろうなと思ってます。

KRIAライフをお楽しみください。


# 参考資料

https://github.com/Xilinx/Vitis-Tutorials/blob/2022.1/Vitis_Platform_Creation/Design_Tutorials/01-Edge-KV260/README.md

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1641152513/Kria+K26+SOM