Getting started with TE0720 - ミニサイズZynqボードTE0720を試す - PSでHello World

TE0720という、ドイツのTrenz Electronicsなる会社が作っているZynqボードを入手したので使ってみます。
5x4cmサイズでZ7020が動くというなかなかイケてるっぽいデバイスです。
http://www.trenz-electronic.de/products/fpga-boards/trenz-electronic/te0720-zynq.html
![TE0702](http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/TE0720-GigaZee/pictures/TE0720-01-45-angle.jpg)

ちゃんとXilinxのパートナーらしいです。
日本の代理店はこちら：http://www.trenz.jp/
このサイトにPLだけでLチカさせるチュートリアル( http://www.trenz.jp/tutorial/led0/ )があるので、
ここではPSを使ってHello Worldしてみたいと思います。

# 環境・ハードウェア
- xubuntu 14.04
- Vivado 2015.2
- TE0720-02-1CF
- TE0703-04 (Carrier Card)

# Board Part File のインストール
最初にTE0720のハードウェア情報が記されたファイルをVivadoに読み込ませます。
https://wiki.trenz-electronic.de/display/PD/Installation
のとおりです。

まず、
http://www.trenz-electronic.de/de/download/d0/Trenz_Electronic/d1/TE0720-GigaZee/d2/board_part_files.html
から
TE0720-BoardFiles-2014.4_V02.zipをダウンロードし、
（直リンク： http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/TE0720-GigaZee/board_part_files/TE0720-BoardFiles-2014.4_V02.zip ）
適当な場所に解凍します。

次にVivadoにこのフィアルの場所を登録します。

1. tclコマンドで解凍場所をVivadoに登録する方法
2. Vivadoのインストールディレクトリ下に直接解凍する方法

の2つがあります。

## tclコマンドで解凍場所をVivadoに登録する方法
これのやり方がさらに2つあります。

1. Vivado起動後にtclコマンドで入力する方法
2. 初期化スクリプト`init.tcl`に書いておく方法

結局どちらも同じことですが…

### Vivado起動後にtclコマンドで入力する方法
vivado起動後、tclコンソールに
`set_param board.repoPaths {/path/to/TE0720-BoardFiles-2014.4-V02/}`
(`/path/to`の部分は解凍した場所に合わせて変えてください）
と入力します。
![te0720_board_setting.png](https://qiita-image-store.s3.amazonaws.com/0/65141/c5499069-5940-02d5-f7f3-1223313ae79d.png)


（Vivadoのバージョンが古いと
`set_param project.boardPartRepoPaths /path/to/TE0720-BoardFiles-2014.4-V02/`
となるらしいです。）


これで、Create New Projectの設定画面では、BoardsにTE0720が現れます。
![te0720_board_select.png](https://qiita-image-store.s3.amazonaws.com/0/65141/572f337a-1e0b-9024-2600-6742eee459da.png)

### 初期化スクリプト`init.tcl`に書いておく方法
Vivadoのインストールディレクトリ以下の`scripts`ディレクトリに`init.tcl`を作成し、上記コマンドを書いておきます。
私の環境では、
`/opt/Xilinx/Vivado/2015.2/scripts/init.tcl`
になりました。

## Vivadoのインストールディレクトリ下に直接解凍する方法
例えば
`/opt/Xilinx/Vivado/2015.2/`
にVivadoがインストールされているとき、
`/opt/Xilinx/Vivado/2015.2/data/boards/`以下にファイルを解凍してしまいます。

つまり、最終的に、
`/opt/Xilinx/Vivado/2015.2/data/boards/board_parts/zynq/TE0720-1CF`
`/opt/Xilinx/Vivado/2015.2/data/boards/board_parts/zynq/TE0720-1CR`
`/opt/Xilinx/Vivado/2015.2/data/boards/board_parts/zynq/TE0720-1QF`
`/opt/Xilinx/Vivado/2015.2/data/boards/board_parts/zynq/TE0720-2EF`
`/opt/Xilinx/Vivado/2015.2/data/boards/board_parts/zynq/TE0720-2IF`
ができます。
これで完了です。

しかし、この方法はXilinx非推奨らしく、ユーザーの責任で行うようにとのことらしいです。


# Hello World

## プロジェクト作成
Create New Projectで新規プロジェクトを作ります。
上の設定のとおり、TE0720がdefault boardに追加されているはずなので、自分のボードに合わせて選択します。
![te0720_board_select.png](https://qiita-image-store.s3.amazonaws.com/0/65141/572f337a-1e0b-9024-2600-6742eee459da.png)

## ハードウェアデザイン
Create Block Design -> Add IP -> ZYNQ7 Processing SystemでPSを追加します。

次に、tclコンソールで

```tcl
source path/to/TE0720-BoardFiles-2014.4_V02/board_parts/zynq/TE0720-1CF/0.2/ps7.tcl
apply_ps7_board_setting processing_system7_0
```
を実行します。`path/to/TE0720-BoardFiles-2014.4_V02`の部分はBoard Part Fileをインストールした場所に合わせて変えてください。
`ps7.tcl`を実行することで`apply_ps7_board_setting`関数が定義され、それを`processing_system7_0`に対して使う…って感じなんでしょうか。
ちなみに`processing_system7_0`はPSのインスタンス名（？）です。

これでPSが設定されました。
（Zedboardとかだと、設定画面を開いてPresetsから選べばよかったのですが、TE0720はこのようになっています。
なんとかPresetsに追加できないものだろうか…）

次はRun Block Automationを実行します。Apply Board Presetのチェックを外すよう注意します。

最後にFCLK_CLK0をM_AXI_GP0_ACLKにつないでハードウェアデザイン完成です。
こんな感じになります：
![te0720_hello_world_design.png](https://qiita-image-store.s3.amazonaws.com/0/65141/66cb80f6-85fd-00ab-282e-9a7f3f0e47b9.png)


Validate Designでエラーがないことを確認し、Generate Output Products, Create HDL Wrapperと普通に進めます。

Generate Bitstreamして、SDKにエクスポートまでやってしまいます。

## SDK
普通にHello Worldプロジェクトを作って実行します。
この時、TE0703 (Carrier card)のトグルスイッチはすべてONにしておきます。
本来これはSDブートを示すのらしいですが、JTAGを使ったbitstream書き込みからHello world実行まで普通に動きます。