PYNQでFPGAプログラム大全(Xilinx編) - それUbuntuで→Macでも！

記事を書く度にやってることが違かったりするんですが、
今回はFPGAプログラム大全の内容をPYNQでやります。（コロナで出掛けられないし）
本書で取り扱っているボードではないですが、PYNQでもできますと書いてあります。
PYNQ向けのファイルも用意されています。（ただしサポート対象外）

本はこちら
[FPGAプログラミング大全 Xilinx編](https://www.shuwasystem.co.jp/book/9784798047539.html)

そしてうちにはWindowsがないので、Ubuntuでやります。
さらに(少し湾曲した表現で言えば)Macでもやります。

# Vivadoのインストール
本書のAppendix Ⅰに従ってVivadoをインストールします。バージョンは本に従って2016.2です。もちろんLinux版をダウンロードします。
[Vivado Design Suite - HLx Edition - 2016.2  Full Product Installation](https://japan.xilinx.com/support/download/index.html/content/xilinx/ja/downloadNav/vivado-design-tools/archive.html)

ダウンロードしたら適当な場所において、実行権限をつけて実行します。

```bash
$ chmod 755 Xilinx_Vivado_SDK_2016.2_0605_1_Lin64.bin
$ sh Xilinx_Vivado_SDK_2016.2_0605_1_Lin64.bin
# 実行権限つけたらsh要らないか・・・。
```

図Ⅰ-4のところ、Linuxには「Install Cable Drivers」がありません。
代わりにNoteが書いてあります。が、全く見ていなくてあとで困りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154693/ee8c1877-2358-ab0a-f1be-f0e568a28a36.png)


インストール先は/opt/配下にしました。（権限がないと言われたので、/opt/Xilinxを手動で作りました。）

Appendix Ⅰ-2についてですが、PYNQのボードファイルはないのと、
LinuxにはUSBシリアル変換ドライバがデフォルトでインストールされているので不要です。
（FTDIのサイトからのダウンロード、インストールは不要という意味で。）

# PNYQ用の設計データの準備
こちらのサポートサイトにPYNQ用の設計データがあるので、
ダウンロードしておきます。
[FPGAプログラミング大全 Xilinx編｜サポート｜秀和システム](https://www.shuwasystem.co.jp/support/7980html/4753.html)

ダウンロードしたzipファイルの中にある、「PYNQ-Z1利用時の補足.pdf」というファイルは、
よく目を通して起きましょう。

# XQuartzのインストール（Mac)
Ubuntuはちょっと離れた場所にあるので、MacでVivado使いたいなー。
でもMac版はないしなー、ということでXでUbuntuに繋ぎます。

必要なのはXquartzです。
[XQuartz](https://www.xquartz.org/)
最終更新は2016-10-29ですが、Catalinaでもちゃんと動きました。
インストールしたあとはログアウト→ログインをします。

XQuartz(xterm)を起動したら、

```bash
$ ssh -X hoge@hogehoge.local
```

と、Xオプションをつけてssh接続します。

```bash
$ /opt/Xilinx/Vivado/2016.2/bin/vivado &
```

と起動すれば、MacでVivadoが起動します。（実際にはMacで起動したように見えるだけ。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154693/5491ce9e-1881-8256-9bdb-24d9919608c8.png)
ここでうっとり。。。

実はXQuartzをインストールした環境であれば、
terminal.appで`ssh -X`しても大丈夫です。
X Windowが必要になったら自動的にXQuartzが起動します。
xtermは日本語対応していないので、地味に不便。

# プロジェクトの作成
ここまで準備できたら第2章を進めます。

UbuntuとPYNQを繋ぐときにJP4(boot mode)をJTAGにします。

ボードの選択（図2-4）のところではPartsを選んで、「xc7z020clg400-1」を選択する。
詳細はPYNQ-Z1利用時の補足.pdfを参照。

回路記述ファイル(blink.v)と制約ファイル(blink.xdc)はサポートサイトからダウンロードしたzipファイルに入っているものを使います。

と進んだところで、問題が発生。
【2-1-8】のOpen Target→Auto Connectを選んでも、「There is no current hw_target.」と出て何も出てきません。。。

# Cable Driverのインストール
インストール時のNoteをちゃんと読まなかったためにちゃんとZYNQをちゃんと認識できていなかったようです。

ここはTry and Errorでやったので、正しい手順ではないかもしれません。

1．　VCP Driver

まずはWindowsと同じように、FTDIのVCP Driverを見てみます。
[Virtual COM Port Drivers](https://www.ftdichip.com/Drivers/VCP.htm)
Linuxの行を見てみるとドライバーはなく[TN-101](https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_101_Customising_FTDI_VID_PID_In_Linux(FT_000081).pdf)を見ろって書いてあるので見てみます。
99-usbftdi.rulesというrulesファイルを作れと書いてあるので作ってみます。
ProductID(PID/idProduct/product)はlsusbで確認した値を入れます。

```bash
$ lsusb
Bus 001 Device 010: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC
# 上記では6010がProductID。0403はVendorID。
```

さらにPDFの下の方に
> It is not possible to access the Virtual COM port in Ubuntu until the “brltty” port is removed. This is done as
follows:
> `sudo apt-get remove brltty <CR>`

とあるので、brlttyを削除します。

2.　Cable Driverのインストール
Appendix Ⅰの「USB-JTAGドライバのトラブル」を参照して、
Cable Driverのインストールをしてみました。

Linux版では、インストーラーは、
`/opt/Xilinx/Vivado/2016.2/data/xicom/cable_drivers/lin64/install_script/install_drivers`
にあります。
そこにある`install_drivers`を実行すると、
同じフォルダにある`install_digilent.sh`と`setup_pcusb`が実行されて、
`52-xilinx-digilent-usb.rules`と`52-xilinx-pcusb.rules`が
`/etc/udev/rules.d/`にコピーされるようです。

```bash
$ cd /opt/Xilinx/Vivado/2016.2/data/xicom/cable_drivers/lin64/install_script/install_drivers
$ sudo sh install_drivers
$ udevadm control --reload-rules
# 多分これで良いんだと思うけど、よくわからなかったのでOS再起動をしました。
```

と、ここまでやったらちゃんとボードが認識されるようになりました。

# 実はボードファイルもある

実はPYNQ-Z1のボードファイルもあります。
こちらを使っても良さそうです。
[Board Settings — Python productivity for Zynq (Pynq)](https://pynq.readthedocs.io/en/v2.5.1/overlay_design_methodology/board_settings.html)

# 無事にLチカ
なんやかんやありましたが、無事macからリモートで、Ubuntuに接続されたPYNQでLチカするところまでたどり着きました。
で、ここで重要なことに気がついたんですが、リモートなのでLチカしてても見えませんね。。。

# Appendix UG973
さて、インストールのときに無視してしまったUG973についてあとから調べました。
UG973とはVivadoのUser Guideのことでした。
そしてそれを見たところ、しっかりとLinuxのCable Driverのインストールについて書いてあります。
手順は上と一緒なので割愛します。

[Vivado Design Suite ユーザー ガイド](https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2018_3/ug973-vivado-release-notes-install-license.pdf)

これを見ると`52-xilinx-ftdi-usb.rules`もあるみたいだけど、2016.2にはなかったなぁ。

# Appendix Macでも
リモートにあるとLチカ見られなくてしょんぼりしてましたが、
Ubuntuでbitファイルを作って、それをJupyter Notebookで実行してあげればよさそうです。（ちょっと面倒だけど。）
順をおっていうと、

1. Ubuntuのvivadoでbitファイルを作成
2. Ubuntuで作ったbitファイルとtclファイルをPYNQ-Z1に転送
3. PYNQのJupyter Notebookで新しいノートを作成
4. Overlayでbitファイルを読み込み
5. PYNQでLチカ！

という流れです。4では以下のようにOverlayします。

```python
from pynq import Overlay
Overlay("blink.bit")
# ノートとblink.bit(とblink.tcl)が同じフォルダにあります。
```

Lチカを止めるときはPROGボタンを押します。

これでやっとMacを使って、PYNQでFPGAプログラムの勉強ができそうです。