UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(Sample FPGA Design編)

## はじめに

UltraZed-EG スターターキットに Debian GNU/Linux (v2017.3版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/a4ebcffdd26ab3e8124d)
 * [Boot Loader](https://qiita.com/ikwzm/items/9d2a76f9665759df58e7)
   - __Sample FPGA Design(この記事)__
   - [FSBL   (First Stage Boot Loader)](https://qiita.com/ikwzm/items/6c345b0ef7fc397d37bf)
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/9835f591a78e83d6b92b)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/6d03b7e5b47721df3ae9)
   - [U-Boot](https://qiita.com/ikwzm/items/27e6ab1517d724b7f2eb)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/45520c8722edbfcd3575)
 * [Linux Kernel](https://qiita.com/ikwzm/items/367f49e9b02102e907d8)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/a0e88798ed29b30fa003)

この記事では、ZynqMP の Boot Loader で使うための Sample FPGA Design の構築について説明をします。

## Sample FPGA Design を構築する目的

Vivado SDK では FSBL(First Stage Boot Loader) および PMUFW(Platform Manager Unit Firmware) をビルドするのにハードウェア情報が必要になります。ただしハードウェア情報のうち ZynqMP の PS(Processing System)の設定のみが必要なだけで、実は PL(Programmable Logic) の情報は必要ありません。ということは、PL 側のデザインは何でも良くて、ちゃんと PS 側の設定がされているハードウェア情報でありさえすれば良いのです。

U-Boot のビルドでもハードウェア情報に含まれるファイルが必要です。ただし、U-Boot でハードウェア情報に含まれるファイルが必要になるのは u-boot.spl をビルドする場合です。今回は u-boot.spl は使いませんので、一度作っておいたファイルを使いまわしても問題ありません。

## Sample FPGA Design の構成

PS 側の情報が出来れば事足りるので、ここでは以下のような単純な FPGA デザインを作ります。

![Fig.1 ZynqMP Sample Design](https://qiita-image-store.s3.amazonaws.com/0/24981/1270d3cc-8228-891b-46f2-84e5a715f4c1.png "Fig.1 ZynqMP Sample Design")

Fig.1 ZynqMP Sample Design

## 必要な環境

 * Vivado 2017.2
 * Vivado SDK 2017.2

## Sample FPGA Design の構築

次の URL から git clone でリポジトリをダウンロードして v2017.3.0 をチェックアウトします。

 * [https://github.com/ikwzm/ZynqMP-FPGA-Linux](https://github.com/ikwzm/ZynqMP-FPGA-Linux)

```console
shell$ git clone git://github.com/ikwzm/ZynqMP-FPGA-Linux
shell$ cd ZynqMP-FPGA-Linux
shell$ git checkout v2017.3.0
```

ここでは Vivado の XST(Xilinx Software Command Line Tool) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。

 * target/UltraZed-EG-IOCC/build/
   - fpga/
     + create_project.tcl
     + design_1_bd.tcl
     + implementation.tcl
     + export_hardware.tcl

### Project を作る

create_projet.tcl を Vivado で実行してプロジェクトを作ります。

```shell
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% vivado -mode batch -source create_project.tcl
```

なお、この FPGA デザインは次の記事で説明している SD1 の WP(Write Protection) の設定も済ませてあります。

 * [「UltraZed で SD Card が書き込み不可になってしまう問題」 @Qiita](https://qiita.com/ikwzm/items/179af88949ae1b5d1460)

### ビットストリームの生成

implementation.tcl を Vivado で実行して、デザインの論理合成、配置配線、ビットストリームの生成を行います。

```shell
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% vivado -mode batch -source implementation.tcl
```

### ハードウェア情報の生成

export_hardware.tcl を Vivado で実行してハードウェア情報を生成します。

```shell
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% vivado -mode batch -source export_hardware.tcl
```

このスクリプトを実行することにより、target/UltraZed-EG-IOCC/build/fpga/project.sdk/design_1_wrapper.hdf が生成されます。

## 参考

 * [「VivadoをGUIを使わずに実行するためのTclスクリプト達」@Qiita](https://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
 * [「Vivado でプロジェクトを作る Tcl スクリプト」@Qiita](http://qiita.com/ikwzm/items/666dcf3b90c36d16a0ed)
 * [「Vivadoで論理合成と配置配線を実行するTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/36e5911c155c8303b705)
 * [「Vivadoでハードウェア情報をエクスポートするTclスクリプト」@Qiita](http://qiita.com/ikwzm/items/057d67d4a9e0828663cf)