PYNQ で遊ぶ : 1. LED を点滅させる

# これは何か
PYNQ-Z1 を使って遊んでみます。

まずは、以下ができるようになる事を目指します。

- vivado を使って動く bit ファイルを作れるようになる
    - IP Integrator を使って IP の配置や配線をする
- jupyter を使ってコンフィグレーションし、python から操作できるようになる


##### 関連記事：

- 基礎編
    - [PYNQ で遊ぶ : 1. LED を点滅させる](https://qiita.com/nishimuraatsushi/items/3e5f161eca4b2a0f06c8)
    - [PYNQ で遊ぶ : 2. Verilog HDL を使ってみる](https://qiita.com/nishimuraatsushi/items/e05b7185de463c0b006a)
- BRAM 編
    - [PYNQ で遊ぶ : 3. BRAM を使う (1) : CPU (python) で読み書きしてみる](https://qiita.com/nishimuraatsushi/items/4d31d397c0704ab09fdb)
    - [PYNQ で遊ぶ : 4. BRAM を使う (2) : FPGA (自作 IP) で書き込み、CPU (python) から読んでみる](https://qiita.com/nishimuraatsushi/items/ffb001501e91434629ae)
    - [PYNQ で遊ぶ : 5. BRAM を使う (3) : ROM モードで実装し、GPIO 経由で CPU (python) から読んでみる](https://qiita.com/nishimuraatsushi/items/09f1e43d49a956c07f36)
- 随時更新中...


# する事
- LED を点滅させる
    - AXI GPIO を利用し、CPU から LED を操作する

# 1-1. まずはじめに
### PYNQ とは
- [PYNQ](http://www.pynq.io/) は Zynq を python/jupyter から試験できる環境をとても簡単に提供する、Xilinx のオープンソースプロジェクトです。
    - 提供されるブートイメージを SD カードに書き込んで、起動するだけで、Linux と jupyter が立ち上がるのですぐに取り組めます
- Zynq は、1 チップの上に FPGA と CPU が同居した SoC (System on a Chip) です。FPGA で処理したデータを CPU で直接読み取れるので、ソフトウェアとの同居が容易です。

### PYNQ-Z1 とは
- PYNQ の実装のうちの一つです
    - Digilent が作っている評価ボードです
- 例えば、下記のサイトから購入できます (2.5 万円くらいのようです)
    - [秋月電子通商 : ＰＹＮＱ－Ｚ１　Ｚｙｎｑ－７０２０評価ボード](http://akizukidenshi.com/catalog/g/gM-13812/)
    - [Rs Components : Digilent 開発キット Pynq-z1](https://jp.rs-online.com/web/p/development-kits/1840474/)
    - [DigiKey : PYNQ-Z1: PYTHON DEV BOARD	
](https://www.digikey.jp/product-detail/ja/digilent-inc/6003-410-017/1286-1223-ND/9839382)

### 役に立ちそうなリンク集
- PYNQ 公式情報
    - http://www.pynq.io/
        - PYNQ の公式ページです。様々な情報がまとめられています
    - https://pynq.readthedocs.io/en/latest/getting_started.html
        - 公式ドキュメントです (必読)
        - 評価ボードのセットアップ方法から、pynq 技術の詳細 (Overlays の概要や、python pynq モジュールの詳細) が網羅されています
    - チュートリアル : https://github.com/Xilinx/PYNQ_Workshop
- PYNQ-Z1 公式情報
    - https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/start
        - PYNQ-Z1 の公式ページです。関連する情報がまとめられています
        - ボード上の配線図や、vivado に登録して使うボード情報、制約ファイルのテンプレートが置いてあります
    - https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/reference-manual
        - PYNQ-Z1 のマニュアルです
        - 評価ボード上の各端子の説明が書かれています
- PYNQ その他
    - PYNQ を使って Python で手軽に FPGA を活用 (1) - (5)
        - https://www.acri.c.titech.ac.jp/wordpress/archives/25
        - https://www.acri.c.titech.ac.jp/wordpress/archives/29
        - https://www.acri.c.titech.ac.jp/wordpress/archives/31
        - https://www.acri.c.titech.ac.jp/wordpress/archives/33
        - https://www.acri.c.titech.ac.jp/wordpress/archives/36
- PYNNQ-Z1 で使われている Zynq XC7Z020-1CLG400C に関する情報
    - DS190 : https://japan.xilinx.com/support/documentation/data_sheets/j_ds190-Zynq-7000-Overview.pdf
        - Zynq-7000 シリーズのデータシート。性能の詳細がまとめられている。
    - UG865 : https://japan.xilinx.com/support/documentation/user_guides/j_ug865-Zynq-7000-Pkg-Pinout.pdf
        - Zynq-7000 シリーズの、ピン配置など
- その他、Xilinx の公式ドキュメント
    - Xilinx から、たくさんのドキュメントが出ているので、いろいろ探してみて、どこに何があるのか把握できるようになっておくといいでしょう
    - vivado 関連
        - https://japan.xilinx.com/support/documentation-navigation/self-paced-tutorials/vivado-design-suite.html
    - Artix7 (Zynq XC7Z020 の FPGA 部分) の資料
        - https://japan.xilinx.com/products/silicon-devices/fpga/artix-7.html#documentation
- FPGA を勉強するとき
    - https://www.acri.c.titech.ac.jp/wordpress/
        - アダプティブコンピューティング研究推進体 (ACRi) が公開している FPGA に関係する記事です。量・質ともにすごいです。
    - https://ja.wikipedia.org/wiki/FPGA
        - まずは wikipedia でしょ
    - FPGAの原理と構成
        - https://shop.ohmsha.co.jp/shopdetail/000000004588/
    - FPGAプログラミング大全 Xilinx編
        - https://www.shuwasystem.co.jp/book/9784798047539.html


# 1-2. 開発の準備
開発に取り掛かる前に、環境の準備をします。

### pynq のセットアップ
- [公式ドキュメント : PYNQ-Z1 Setup Guide] (https://pynq.readthedocs.io/en/latest/getting_started/pynq_z1_setup.html#prerequisites-for-the-pynq-z1)を参考に、セットアップします。
    - [PYNQ を使って Python で手軽に FPGA を活用 (2)](https://www.acri.c.titech.ac.jp/wordpress/archives/29) にも手順が書いてあります
- 手順は次の通りです：
    1. image を[公式サイト](https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/start) (PYNQ Boot Image) からダウンロード
    2. image を SD カードに書き込む
        - mac なら、balenaEtcher などのソフトを使うと簡単で安心です
    3. [公式ドキュメント](https://pynq.readthedocs.io/en/latest/getting_started/pynq_z1_setup.html#board-setup) の通りに、ボード上のジャンパを設定
    4. SD カードを挿入して起動
        - IP : 192.168.2.99
        - サブネットマスク : 255.255.255.0
        - として起動する
    5. 手元の PC のネットワーク設定を PYNQ-Z1 と同じ設定にする
        - 例えば、IP: 192.168.2.10, サブネットマスク: 255.255.255.0
    6. PC と PYNQ-Z1 を繋ぐ
        - 直接 LAN ケーブルで繋ぐ場合は、クロスケーブルにする必要があるかもしれません
        - PC -- スイッチングハブ -- PYNQ と繋ぐ場合はどの LAN ケーブルでもいけるはず
    7. PYNQ を起動する
        - 起動完了すると、LED が派手に光ります。1 分ほどかかります。
        - CPU は速くないので、起動完了まで待ってから作業に取り掛かる方が無難な印象です。
    8. PC から web ブラウザで http://192.168.2.99:9090 へアクセスを試み、jupyter のページが表示されれば成功です
    9. jupyter の [New] -> [Terminal] を選択するか、ssh でログインし (その場合、 user : xilinx, password: xilinx)、IP アドレス設定を変更しておくと、いいでしょう
        - sudo vi /etc/network/interfaces.d/eth0
            - IP アドレスを適当に変える
    10. その後、手元の環境のネットワークに接続できます
        - Internet へアクセス可能になったら、まず最初に、update しておくといいと思います
            - sudo apt update
            - sudo apt upgrade -y
            - 結構時間がかかります。upgrade 中は待ちましょう。裏で upgrade が走っていたら競合してエラーが出ます。その場合は、待ちましょう。

### vivado の準備
- [公式ページ](https://japan.xilinx.com/support/download.html) から、適当な Vivado のバージョンを選び、ダウンロードして、インストールします。
    - この記事では、Vivado Design Suite - HLx Edition 2019.1 Full Product Installation を Linux 自己解凍型ウェブインストーラでインストールしました
    - 新しいバージョン Vivado Design Suite - HLx Edition - 2020.1 などでも大丈夫だと思います

- vivado での bit ファイル生成 (倫理合成・配置配線・ファイル生成) は、結構 CPU を食うので、用意できるなら、良い CPU を搭載した PC を開発マシンにできるといいでしょう。
    - マルチプロセスには対応しているようですが、いつも、1 プロセスだけ処理が終わるまでに時間かかっているので、クロックが速い CPU の方が有利かもしれません

### PYNQ-Z1 関連ファイルの準備
以下のファイルをダウンロードして準備しておきます。

- ボードファイル
    - https://pynq.readthedocs.io/en/latest/overlay_design_methodology/board_settings.html#vivado-board-files
    - より、[Download the Pynq-Z1 board files] をクリックしてダウンロードします
    - 解凍し、pynq-z1 フォルダを得ます
    - pynq-z1 フォルダを /tools/Xilinx/Vivado/2019.1/data/boards/board_files/ に設置します (Linux の場合)
        - 例えば、cp -r pynq-z1 /tools/Xilinx/Vivado/2019.1/data/boards/board_files/

- XDC 制約ファイル
    - https://reference.digilentinc.com/reference/programmable-logic/pynq-z1/start
    - より、[Master XDC] の Download をクリックしてダウンロードします
    - 解凍して、PYNQ-Z1_C.xdc ファイルを得ます
    - vivado から毎回参照して使うので、わかりやすい場所に置いておきます


# 1-3. プロジェクトの作成

例えば、デスクトップのアイコンをクリックします。

<img width="150" alt="スクリーンショット 2020-08-04 10.55.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/6e3101d6-8c4e-6c02-8d31-a005b7a151b2.png">

Vivado が起動します。

「Create Project」 をクリックして、プロジェクトを新規作成しましょう。

<img width="350" alt="スクリーンショット 2020-08-04 11.00.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/805d7a27-70a6-b253-23c8-31511fd4957c.png">

プロジェクトの名前と場所を指定します。asobu ディレクトリの asobu01 プロジェクトとしました。

<img width="350" alt="スクリーンショット 2020-08-04 11.04.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a3099395-525d-81fe-2df3-dc953019f95e.png">

RTL (Register Transfer Level) プロジェクトを選択します。

 <img width="350" alt="スクリーンショット 2020-08-04 11.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a4466a49-2308-127b-5ad3-4ee883f7813e.png">

- ボードを選択します
    - [pynq-z1-関連ファイルの準備](#pynq-z1-関連ファイルの準備) でボードファイルを登録していない場合、先に登録してください
- Boards をクリックし、検索窓に pynq と入力すると絞り込まれます
- PYNQ-Z1 をクリックし、Next をクリックします

<img width="350" alt="スクリーンショット 2020-08-04 11.17.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/3a305e0a-f46c-4202-0475-39534f436ef8.png">

これで、プロジェクトの初期設定が完了です。

<img width="350" alt="スクリーンショット 2020-08-04 11.18.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/f04eb42c-40b5-f652-1266-79dedc0e8ce9.png">

このような画面になるはずです。

<img width="500" alt="スクリーンショット 2020-08-04 11.28.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/fc1cf077-a3c8-6b03-8c60-a3a734071ebb.png">



# 1-4. IP Integrator で IP を配置する

では、ここから、IP Integrator を使って、開発していきます。

大まかな手順は下記です：

- ZYNQ (CPU) の IP を配置する
- AXI GPIO の IP を配置する
- AXI GPIO の output に LED を接続する
- AXI GPIO -- ZYNQ の間を接続する (自動)

## 1-4-1. ZYNQ の IP を配置する

- IP INTEGRATOR の Create Block Design をクリックします
- ウィンドウが出てきます
- 名前はなんでもいいですが、とりあえずそのままにしておきましょう
- OK をクリックします

<img width="500" alt="スクリーンショット 2020-08-04 11.26.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/3ecd42af-97b9-2299-4bbd-663cee0a6986.png">

モードが、PROJECT MANAGER から BLOCK DESIGN に切り替わります。

<img width="500" alt="スクリーンショット 2020-08-04 11.30.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/c478001e-c200-68df-1a2f-752f2ab178f0.png">

- Diagram 内の、ADD IP をクリックし、
- zynq で検索して、
- ZYNQ7 Processing System をダブルクリックします。

<img width="500" alt="スクリーンショット 2020-08-04 11.31.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/f469648b-6551-6649-44b0-facea10dacdf.png">

IP が配置されました

<img width="350" alt="スクリーンショット 2020-08-04 11.34.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a7390355-fcc9-73d7-e395-f64dfce88d9b.png">

## 1-4-2. AXI GPIO の IP を配置する

同じ要領で、AXI GPIO を配置します。

<img width="350" alt="スクリーンショット 2020-08-04 11.35.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a07c973c-4c2b-a5da-fa67-bf969ed5264c.png">

IP が追加されました。

<img width="350" alt="スクリーンショット 2020-08-04 11.37.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a9c85468-0e5b-b9eb-2a4e-a70017eb4fa2.png">


## 1-4-3. AXI GPIO の出力に LED を接続する

GPIO を LED に接続しましょう。
まず、LED ポートを作ります。

<img width="350" alt="スクリーンショット 2020-08-04 11.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/bc05d938-2953-cabb-82e3-03e1dfaca389.png">

名前を LED にして、Direction は Output, Type は Data にしておきます。

<img width="300" alt="スクリーンショット 2020-08-04 11.40.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/d66f7803-8e57-578f-88ae-2279bbfdd04f.png">

LED ポートが追加されました。

<img width="350" alt="スクリーンショット 2020-08-04 11.41.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/088831be-3e7b-c763-1e63-f6868c6835ed.png">

GPIO の出力を 32 ch から 1 ch に変更します。

<img width="350" alt="スクリーンショット 2020-08-04 11.44.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/452baa27-d9e0-47c4-b40c-31a0097be93d.png">

- GPIO IP の設定ウィンドウが出てきます
- IP Configuration タブをクリックし、
- All Outputs を ON 
- GPIO Width を 1 に変更し、
- OK します

<img width="350" alt="スクリーンショット 2020-08-04 11.46.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/c03e1964-4f4b-b837-627f-75bbdf6f01f0.png">

GPIO が出力のみ、1 ch になりました。

<img width="350" alt="スクリーンショット 2020-08-04 11.48.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/27f7eb7e-9612-b9ab-2128-366fd2eed906.png">

GPIO の gpio_io_o[0:0] の出力部分にマウスカーソルを持っていき、鉛筆マークになったら、ドラッグして、LED と繋ぎます。

<img width="350" alt="スクリーンショット 2020-08-04 11.49.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/f6e6eff3-cbb5-169b-0dfc-62c76acc8b2a.png">

## 1-4-4. ZYNQ と AXI GPIO を接続する

- Diagram 上部の、Run Connection Automation をクリックします
- そのまま、OK をクリック

<img width="350" alt="スクリーンショット 2020-08-04 11.52.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/000d304a-1e50-5ee6-b999-5b352deeb46d.png">

自動配線されます。
Regenerate Layout をクリックして、見た目を整理します。
ZYNQ と GPIO が AXI Interconnect を介して配線されました。

<img width="350" alt="スクリーンショット 2020-08-04 11.54.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/810336da-8a0a-7edd-1349-bcfc361ed9ea.png">

Run Block Automation も実行しておきます。

<img width="350" alt="スクリーンショット 2020-08-04 11.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/f37394eb-a1ea-b2d5-87e9-a7548a962283.png">

デザインが完成しました。

<img width="500" alt="スクリーンショット 2020-08-04 11.57.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/53ef97c0-24b0-a331-ae17-347265f186fd.png">

Validate Design を実行して、エラーがない事を確認しておきます。

<img width="350" alt="スクリーンショット 2020-08-04 11.58.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/a86f7b09-88af-b3fe-73f3-5e61c8387934.png">


# 1-5. HDL Wrapper を生成する

作ったデザインを HDL Wrapper にします。

Sources から、デザインの上で右クリックし、Create HDL Wrapper をクリックします。

<img width="500" alt="スクリーンショット 2020-08-04 12.00.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/1a8e4d49-c853-7a59-66dd-dd8b2ac7d2d6.png">

デフォルトで OK します

<img width="250" alt="スクリーンショット 2020-08-04 12.01.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/fa84bb73-109d-c582-46e7-93d12d668434.png">

wrapper が作られました

<img width="250" alt="スクリーンショット 2020-08-04 12.02.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/c0f3db48-aa4d-ad0a-390b-c6f783d382cf.png">


#1-6. 制約ファイルを設定する

デザインで定義した port を、実際の FPGA のピンと対応付けする制約を設定します。

Sources の Constraints で右クリックし、Add Sources をクリックします。

<img width="250" alt="スクリーンショット 2020-08-04 12.04.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/f1962e63-5c55-b74c-b70f-3f74280d4a0e.png">

次へ

<img width="350" alt="スクリーンショット 2020-08-04 12.05.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/138fe04d-e9f3-9f99-ea78-d312dac5c188.png">

テンプレートファイルを追加したいので、Add Files を選択

<img width="350" alt="スクリーンショット 2020-08-04 12.06.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/9de3f7d2-418f-fdb6-67a0-3981fe3b80f3.png">

[pynq-z1-関連ファイルの準備](#pynq-z1-関連ファイルの準備) でダウンロードしておいた、PYNQ-Z1_C.xdc ファイルを選択して、OK

<img width="350" alt="スクリーンショット 2020-08-04 12.07.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/74d5658f-ece4-f318-e415-dbb249f9f772.png">

xdc ファイルが追加されているので、ダブルクリックして開きます。

<img width="250" alt="スクリーンショット 2020-08-04 12.11.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/d51ed3f0-452b-1bea-9822-54b34c3760ee.png">

PYNQ-Z1 に実装されている、全ての端子の記述例が記載されています。
デフォルトでは、全てコメントアウトされているので、適宜、コメントアウトを外して設定していきます。

<img width="350" alt="スクリーンショット 2020-08-04 12.11.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/d3a1511b-90aa-c51a-7848-c2ca3e5b8b2e.png">

今回は、LED ポートを LED に接続したいので、27 行目のコメントアウトを解除して、get_ports の指定を LED に変更しました。

<img width="300" alt="スクリーンショット 2020-08-04 12.14.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/ee30f8d7-0b23-63f4-bd8d-41fb8f6ca630.png">


#1-7. 生成する

設定が全て完了したので、bit ファイルを生成しましょう。

Flow Navigator の PROGRAM AND DEBUG から、Generate Bitstream をクリックします。

倫理合成・配置配線・ファイル生成が実行されます。少し時間がかかります。

<img width="500" alt="スクリーンショット 2020-08-04 12.15.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/e2548613-581a-ec78-2fb1-2fcfb4e1ee1b.png">

問題なければ、正常に終わったと告げるウィンドウが出てきます。
失敗した場合は、エラーが出るので確認します。

<img width="250" alt="スクリーンショット 2020-08-04 12.18.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/0d2e90c7-4315-f279-59d2-5d1d9fb280dc.png">

Open Implemented Design をクリックすると、実装を確認できます。

<img width="650" alt="スクリーンショット 2020-08-04 12.19.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/601ae1a3-0e8e-8290-6463-7a8572e3fac8.png">


#1-8. PYNQ で実行する

PYNQ から生成した bit ファイルを実行するために、次の手順を踏みます：

- .bit ファイルと .hwh ファイルを pynq にアップロード
- pynq の python 上で pynq モジュールを import してプログラミングする

### 1-8-1. ファイルのアップロード
FPGA にコンフィグレーションする .bit ファイルと、python の pynq.overlays モジュールから参照させるために使う .hwh ファイルの 2 つをアップロードする必要があります。

ここでは、この 2 つのファイルを、pynq のモジュールの所定の場所にコピーする事で、どこからでも参照できるようにします。

以下、手順です。

- pynq に xilinx ユーザーでログインします
    - ssh の場合は、ssh xilinx@(設定したIPアドレス: 以下、仮に 192.168.2.99 とします)
    - jupyter から terminal を立ち上げる場合、root ユーザーとなるので、以下のコマンドを実施後に、chown で所有者を変更しておくと良いです
- /home/xilinx/pynq/overlays 以下に、プロジェクトのフォルダを作ります
    - mkdir /home/xilinx/pynq/overlays/asobu01
- 次に、Vivado で作業していた PC に移ります
- まず、~/vivado/asobu/asobu01/asobu01.runs/impl_1 の中にある、design_1_wrapper.bit を、pynq の /home/xilinx/pynq/overlays/asobu01/asobu01.bit としてコピーします。
    - 例えば、scp ~/vivado/asobu/asobu01/asobu01.runs/impl_1/design_1_wrapper.bit xilinx@192.168.2.99:pynq/overlays/asobu01/asobu01.bit
- 続いて、~/vivado/asobu/asobu01/asobu01.srcs/sources_1/bd/design_1/hw_handoff の中にある design_1.hwh ファイルを、pynq の /home/xilinx/pynq/overlays/asobu01/asobu01.hwh コピーします
    - 例えば、scp ~/vivado/asobu/asobu01/asobu01.srcs/sources_1/bd/design_1/hw_handoff/design_1.hwh xilinx@192.168.2.99:pynq/overlays/asobu01/asobu01.hwh


### 1-8-2. jupyter で実行

jupyter にログインし (http://192.168.2.99:9090 へアクセスします。パスワードを聞かれたら、xilinx と入れます) 、適当なノートブックファイルを生成します。

<img width="800" alt="スクリーンショット 2020-08-04 13.48.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/eed85864-1aeb-89e8-06d1-29679844f871.png">

その後、ファイル名をクリックして、ノートブックを開きます。
そして編集します。コードを入力後、Shift+Enter で実行できます。

<img width="783" alt="スクリーンショット 2020-08-04 13.51.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/971f2870-00c5-3909-0096-3126e17bdd7c.png">


```python
import pynq    # pynq モジュールをインポート

fpga = pynq.Overlay('asobu01.bit')  # asobu01.bit をコンフィグレーションし、
                                    # python から扱えるように初期化します

gpio = pynq.MMIO(fpga.ip_dict['axi_gpio_0']['phys_addr'], length=0x1000)
                                    # GPIO へのアクセスを得ます

gpio.write(offset=0, data=0)       # データを書きます。
gpio.write(offset=0, data=1)       # data=0 で消灯、data=1 で点灯するはずです
```

<img width="1316" alt="スクリーンショット 2020-08-04 14.01.06のコピー.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107797/66f2d163-6aa4-d13e-d24b-96f76cb64578.jpeg">