Ultra96V2のPLでLEDチカを行う(VitisのHello worldから起動編)

# はじめに
[Ultra96V2](https://www.avnet.com/wps/portal/japan/products/product-highlights/ultra96/) で PL から LED を光らせるいわゆるLチカ記事です。

# 前提
まず別記事の[Ultra96V2用にPLでLEDチカを行うbitstreamを作る](https://qiita.com/Ryuz/items/50b504ee00c3f163b6cd)にてLチカを行うbitstreamができるところまで準備ができていることが前提の記事となります。

# 環境
今回はこんな環境で行っています。

- Vivado 2019.2
- Vitis 2019.2
- Windows10マシン

# Vivadoからハードウェア情報をエクスポート

まず、[先の記事](https://qiita.com/Ryuz/items/50b504ee00c3f163b6cd)の Vivado プロジェクトから、「File」->「Export」->「Export Hardware」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/b9c9968f-03c6-3482-84ca-00f4a293abba.png)

次に、ダイアログが出てきますので include bitstream にチェックを付けて、ultra96v2_led という名前で OK を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/83b87535-3e8c-551c-eb6c-aa7d3aa531e3.png)

指定した出力先に ultra96v2_led.xsa というファイルが出来ていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/f9579d12-6748-d14f-c305-0900f16adce5.png)

ultra96v2_led.xsa には、Vivadoで設定したPS部分の設定や、合成したbitstreamなど様々な情報が含まれています。

# Vitis でプロジェクトを作る

まず Vitis を起動すると、ワークスペースの場所を聞いてきますので適当な場所を指定して Launch を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/d778598b-8c8b-47da-395e-859dc22ecdd9.png)


起動したら Create Application Project を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/2385ee54-bf25-5c38-50a7-25d7e5bd5165.png)

Project name を入力して Nextを押します。今回は ultra96v2_led としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/57b68a29-d641-5f97-c223-f2c9043c11b5.png)

Platform 選択画面になるので Create a new platform from hardware(XSA) タブを選びます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/a51748bc-3373-2cfa-5500-3ef1be56f132.png)


＋ボタンを押して新規にXSAファイルを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/f17e5d4d-8767-a90a-4dab-dac958930e8e.png)


ファイル選択ダイアログが出るので先ほど Vivado で export した ultra96v2_led.xsa を選びます。

新しく ultra96v2_led[custom] というプラットフォームが出てくるので、選択して Next を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/5b90617f-2f33-7c62-a324-348db24825f4.png)


Domain選択が出てきますが、今回は Cortex-A53 に standalone で問題ないのでそのまま Next を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/e846cb00-cf63-4cf7-5265-9e72055bd545.png)


Template の選択が出てくるので Hello World を選び、Finishを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/f34c287e-9aea-8471-346a-ccdcae1707f3.png)


ultra96v2_led というプロジェクトが出来上がるので、右クリックして「Build Project」を選んでビルドします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/647f7f0d-f1ce-0a73-ad01-a5e77f9768e2.png)


しばらく待つとビルドが完了します。

# SDカードからの起動する場合

## 起動イメージ作成
SDカードから起動するイメージを作るには「Create Boot Image」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/3dedfe46-11ae-45bb-a99a-684cb6fbfee7.png)


このようなダイアログが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/ffca0635-d5a6-4ef6-e20b-b3761fd60011.png)


Boot image partition の部分がイメージの中身になります。

- xsaの情報に基づく初期化と初期ブートを行うFSBL(first stage bootloder)
- Vivadoで生成したLEDチカするbitstream
- "Hello world"をシリアルに出力するプログラム

が含まれます。
「Create Image」ボタンを押すと BOOT.BIN というイメージが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/0b88a7f1-4b92-6751-592f-9a95c887ed6e.png)


BOOT.BINをフォーマット済みの micro SDカードにコピーしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/d9b81623-1b84-885a-eeee-fc2d0cfff5a9.png)

今回は BOOT.BIN １つだけあればOKです。

## ボード起動

microSDカードをUltra96V2本体に取り付けて、起動ボタンを押してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/c540b8c4-09d6-ced3-0553-35330799f6dc.png)


LEDの点滅が確認できれば成功です。

# JTAGから起動する場合
JTAGボードを持っている場合は、JTAGからも起動可能です。

## ブートモードの変更
JTAGから起動する場合は、DIP-SWを ON-ON の設定として JTAGモードにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/089d95e5-3091-125c-4f8c-ab37206bb427.png)

JTAGモードにして電源を繋いだ後に、起動ボタンを押して起動してください。

図のように 「Run As」 から 「Lanch on Hardware」を選べば、bitstream がダウンロードされ、FSBLの実行が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/d24cc8cc-d290-36ba-4e80-50af0ceb1981.png)


無事起動するとmain関数の初めまで実行され、ブレークポイントで止まるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/753558e1-ffc7-ea00-2b8c-dca0481f3ca7.png)

この段階ですでにボードではLEDが点滅を始めているはずです。

ちなみにLinuxなどを用いずにスタンドアロンでPSのソフトウェアを開発する場合は、この延長で行うことが可能で、ここからソフトウェアをステップ実行してデバッグしたりすることも可能です。

# UARTに "Hello World" を表示するには(おまけ)

ちなみにこの時BSDの設定で stdout を uart1 に変更すると JTAG ボードの UART(PCにはCOMで認識される)に Hello World を表示することもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/b26f52cd-d502-e5b4-5ae3-ea817c521034.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/cafc001c-7020-d259-d5a1-cd8e724ef09f.png)

Vitis のシリアルコンソールに繋いでもいいし、別途 TeraTerm などから接続してもかまいません。

# PSのLEDも点滅させる(さらにおまけ)

Hello World のついでにさらに GPIO を制御するコードを足すとPS のLEDも点滅させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285930/91a36aa5-3150-0f80-ed11-58060dcbd926.png)

# おしらせ
2020/10/30 にて Qrunch がサービス終了したので移転してきた記事となります。
一時退避場所：https://github.com/ryuz/qrunch_blog