Vivado 2018.2 ハンズオン with ZYBO (Zynq)

# この記事について
今年(2018年)リリースされたVivado 2018.2を使う流れをざーっと紹介していきます。
基本的には[ZYBO (Zynq) 初心者ガイド ](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b) の内容と同じになります(こちらの記事は2017.4が対象)。今回の2018.2でもほとんど同じ操作でできたので詳細は省いています。

ツールをインストールしてハードウェアを作ってLチカするソフトを作るところまで、一気にやってしまいます。
詳細は書かないので、流れを感じていただければと思います。

## 環境
- 開発用PC: Windows 10 64-bit 
	- Vivado 2018.2 WebPACKライセンス
	- Xilinx SDK 2018.2
	- SDx IDE 2018.2
- ターゲットボード: ZYBO (Z7-20) 

# Vivado 2018.2 のインストールと設定
Windows PCに開発環境をインストールします。
詳細は[ZYBO (Zynq) 初心者ガイド (1) 開発環境の準備](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b) をご確認ください。

## ダウンロード
Vivado, Xilinx SDK(XSDK), SDxをインストールします。
ポイントとして、「Vivado」のインストーラを使うとVivadoとXSDKが、「SDSoC」のインストーラを使うとVivadoとXSDKとSDSoCがインストールできます。SDSoCのライセンスを持っている人は、どうせならSDSoC用のインストーラを使ってSDSoCも入れておいた方がいいと思います。

![01.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/9eecce6e-7652-dba5-e745-1cda9c8921ef.jpeg)

https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/sdx-development-environments.html

## インストール
下記のような設定でインストールします。UltraScaleを使っている方はそちらのチェックもお忘れなく。
(追記: たとえ使用するデバイスがZYBOだけでも、Devices for Custom Platformsの所には全てのデバイスにチェックを付けてインストールしておいた方がいいです。でないとVivado HLSでバグを引く可能性があります。)
![02.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/a32d9fb0-4e6e-f305-a9d6-7edbb4279849.jpeg)



## ライセンスの設定
インストールが完了すると下記のようなLicense Managerの画面が出ます。Connect Nowをクリックして、ライセンスファイルを取得します。(ZYBOだとWebPackライセンス + SDSoCが使えます)
![03.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/331d9bc1-456c-305c-1b70-4277c15473ff.jpeg)



Xilinxのページが開かれるので、ZYBOの方は、ZYBO購入時に付属されているバウチャーの番号を入力してRedeem Nowをクリック。
Vivado Design Suite: HL WebPack 2015 and Earlier LicenseとOEM SDSoC-Zynq Development Voucherを選び、Generate Node-Locked Licenseをクリックして、Xilinx.licを入手します。（メールで送られてきます。またはこのページからダウンロードできます）
![04.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/c668173d-4edf-b2c5-f3e7-1311a1c81c26.jpeg)


License Managerに戻って、先ほどダウンロードしたライセンスファイルをコピーします。
![05.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/91b4f430-137e-996b-e9e1-dbf60bd50622.jpeg)


## ZYBO用ボードファイルのコピー
DigilentのGithub(https://github.com/Digilent/vivado-boards/archive/master.zip )からボードファイルを取得して、C:\Xilinx\Vivado\2018.2\data\boards\board_files にコピーします。
![06.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/783baac2-f81a-8b65-7c87-ea0f4f9d3017.jpeg)

# ハードウェアを作る
動作確認用に、いつも通りLチカをするプロジェクトを作ります。GPIOにはPSのGPIOとPLのGPIOの両方を使ってみます。
詳細は下記記事をご参照ください。

- [ZYBO (Zynq) 初心者ガイド (2) Hello Worldプロジェクト](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)
- [ZYBO (Zynq) 初心者ガイド (3) PSのGPIOでLチカ](https://qiita.com/take-iwiw/items/39d2ed00fa88a1204fce)
- [ZYBO (Zynq) 初心者ガイド (4) PLのAXI GPIOでPSからLチカ](https://qiita.com/take-iwiw/items/a3b935a4e4dbd41593e1)

## プロジェクトを作る
Board PartにZybo Z7-20を設定して、プロジェクトを作ります(project_1とします)。以下のような、PSとAXI_GPIOを配置したブロックデザインを作ります(design_1とします)。AXI_GPIOはLEDに接続します。
![07.jpg](https://qiita-image-store.s3.amazonaws.com/0/214268/72592cad-ce38-aa7d-45c2-e9c6a7e562c5.jpeg)


## ハードウェアを生成する
作成したブロックデザインをGenerate Output Products、Create HDL Wrapperします。その後、Generate Bitstreamし、Export Hardwareしてhdfファイルを生成します。(操作詳細は上記記事をご確認ください)

最後に、Launch SDKをして、ソフトウェアの開発環境(Xilinx SDK)を立ち上げます。

# ソフトウェアを作る
PSとPLのGPIOを制御してLチカするソフトを書きます。

## プロジェクトを作る
新しいApplication Projectを作ります。OS Platformはstandaloneにします。Target Hardwareは自動で選択されているdesign_1_wrapper_hw_platform_0にします。Templateとして、Hello Worldを選びます。

自動生成されるhelloworld.cを、下記のように書き換えて実行するとLチカが動きます。

```c:helloworld.c
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "xgpiops.h"
#include "xgpio.h"
int main()
{
    init_platform();

    print("Hello World\n\r");

    /*** Set up for PS GPIO ***/
    XGpioPs instXGpioPs;
    XGpioPs_Config *configXGpioPs;
    configXGpioPs = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    XGpioPs_CfgInitialize(&instXGpioPs, configXGpioPs,configXGpioPs->BaseAddr);
    /* Set MIO7 as output */
    XGpioPs_SetDirectionPin(&instXGpioPs, 7, 1);
    XGpioPs_SetOutputEnablePin(&instXGpioPs, 7, 1);

    /*** Set up for AXI GPIO ***/
    XGpio instXGpio;
    XGpio_Initialize(&instXGpio, XPAR_AXI_GPIO_0_DEVICE_ID);
    /* Set all of 4 pins(LEDs) as output */
    XGpio_SetDataDirection(&instXGpio, 1, 0);

    while(1) {
        XGpioPs_WritePin(&instXGpioPs, 7, 1);	/* Set MIO7 as High */
        XGpio_DiscreteWrite(&instXGpio, 1, 0x0F);	/* Set all of 4 pins(LEDs) as High */
        sleep(1);
        XGpioPs_WritePin(&instXGpioPs, 7, 0);	/* Set MIO7 as Low */
        XGpio_DiscreteWrite(&instXGpio, 1, 0x00);	/* Set all of 4 pins(LEDs) as Low */
        sleep(1);
    }

    cleanup_platform();
    return 0;
}
```


# おわりに
今のところ、2017.4と2018.2では操作に大きな違いはなさそう。


# おまけ
## PetaLinuxをWSL Ubuntuにインストールしようとしたけど実行時にエラー
PetaLinuxをWindows Subsystem for LinuxのUbuntuにインストールできないか試してみました。ちなみに、[フォーラム](https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2016-4-on-Windows-10-WSL-Ubuntu-16-04lts/td-p/820244)ではXilinxの人に非サポートだと冷たく言われています。

今回、インストールは成功したけど、プロジェクト作成時にエラーが発生しました。

```sh:必要なパッケージのインストール
sudo apt-get install tofrodos gawk xvfb git libncurses5-dev tftpd zlib1g-dev libssl-dev flex bison chrpath socat autoconf libtool texinfo gcc-multilib libsdl1.2-dev libglib2.0-dev screen pax

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt install  zlib1g:i386

sudo apt install diffstat xterm unzip

sudo apt-get install rsync 
sudo apt-get install locales
sudo dpkg-reconfigure locales 
sudo locale-gen en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
sudo apt-get install libgtk2.0-0
sudo apt-get install gcc-multilib
```

```sh:シェルをbashにしておく
chsh -s /bin/bash
# ここでいったんubuntuを再起動
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh
```

```sh:PetaLinuxのインストール
sudo mkdir -p /opt/pkg/petalinux
sudo chown your-user-name /opt/pkg/
sudo chgrp your-user-name /opt/pkg/
sudo chgrp your-user-name /opt/pkg/petalinux/
sudo chown your-user-name /opt/pkg/petalinux/
bash ./petalinux-v2018.2-final-installer.run  /opt/pkg/petalinux/
```

ここまでで、PetaLinuxのインストール自体は出来ました。
後は、環境設定をしてプロジェクトを作ろうとしてみます。
先ほど作成したハードウェア(design_1_wrapper.hdf)はホームディレクトリにコピーしておきます。

```sh
cd ~/
source /opt/pkg/petalinux/settings.sh
petalinux-create --type project --template zynq --name Sample01
cd Sample01/
petalinux-config --get-hw-description=../
```

すると以下のようなエラーが発生。

```sh
tak@DESKTOP-1BHE6SR:~/work/peta/aaa$ petalinux-config --get-hw-description=../
INFO: Getting hardware description...
INFO: Rename design_1_wrapper.hdf to system.hdf
[INFO] generating Kconfig for project
ERROR: Failed to generate /mnt/c/asd/dev/wsl_ubuntu/work/peta/aaa/build/misc/config/Kconfig.syshw
ERROR: Failed to Kconfig project
ERROR: Failed to generate System hardware Kconfig file.
```

ホームディレクトリが/mntだけだダメなのかな?とか思い色々やってみたのですが解決せず。

## PetaLinux 2017.4→2018.2への移行
しょうがないので、VirtualBox上のUbuntu 16.04にインストールすることにしました。
注意点として、今回新たにgcc-multilibが必要でした。(僕の環境だけかもしれませんが)


```sh:古いPetaLinuxを削除
rm -rf /opt/pkg/petalinux/
```

```sh:PetaLinux2018.2をインストール
sudo apt-get install gcc-multilib
sudo mkdir -p /opt/pkg/petalinux
sudo chown your-user-name /opt/pkg/
sudo chgrp your-user-name /opt/pkg/
sudo chgrp your-user-name /opt/pkg/petalinux/
sudo chown your-user-name /opt/pkg/petalinux/
bash ./petalinux-v2018.2-final-installer.run  /opt/pkg/petalinux/
```

## メモ: Vivado HLSで新規プロジェクトを作成できない
2018.2に限ったことではないのですが、Vivado HLSでCreate New Projectするとき、Project Configurationの後、Add/Remove FilesでNextボタンをクリックしても画面が変わらないという問題(バグ?)があります。本当だったらSolution Configuration画面に切り替わるはずなのに、Nextボタンを押してもなにも変わりません。

Vivadoをインストールするときに、Devices for Custom Platformsの所で、全てのデバイス(SoCs、7 Series、UltraScale、UltraScale+にチェックを付けると何故か治りました。

既にインストール済みの場合には、スタートメニュー -> Xilinx Design Tools -> Add Design Tools or Devices 2018.2 から追加できます。