LoginSignup
13
10

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-04

これは何か

PYNQ-Z1 を使って遊んでみます。

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

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

する事

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

1-1. まずはじめに

PYNQ とは

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

PYNQ-Z1 とは

役に立ちそうなリンク集

1-2. 開発の準備

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

pynq のセットアップ

  • 公式ドキュメント : PYNQ-Z1 Setup Guideを参考に、セットアップします。
  • 手順は次の通りです:
    1. image を公式サイト (PYNQ Boot Image) からダウンロード
    2. image を SD カードに書き込む
      • mac なら、balenaEtcher などのソフトを使うと簡単で安心です
    3. 公式ドキュメント の通りに、ボード上のジャンパを設定
    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 の準備

  • 公式ページ から、適当な 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 関連ファイルの準備

以下のファイルをダウンロードして準備しておきます。

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

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

スクリーンショット 2020-08-04 10.55.10.png

Vivado が起動します。

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

スクリーンショット 2020-08-04 11.00.54.png

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

スクリーンショット 2020-08-04 11.04.53.png

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

スクリーンショット 2020-08-04 11.07.55.png

  • ボードを選択します
  • Boards をクリックし、検索窓に pynq と入力すると絞り込まれます
  • PYNQ-Z1 をクリックし、Next をクリックします

スクリーンショット 2020-08-04 11.17.30.png

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

スクリーンショット 2020-08-04 11.18.52.png

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

スクリーンショット 2020-08-04 11.28.26.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 をクリックします

スクリーンショット 2020-08-04 11.26.50.png

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

スクリーンショット 2020-08-04 11.30.32.png

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

スクリーンショット 2020-08-04 11.31.38.png

IP が配置されました

スクリーンショット 2020-08-04 11.34.48.png

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

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

スクリーンショット 2020-08-04 11.35.47.png

IP が追加されました。

スクリーンショット 2020-08-04 11.37.03.png

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

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

スクリーンショット 2020-08-04 11.39.10.png

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

スクリーンショット 2020-08-04 11.40.33.png

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

スクリーンショット 2020-08-04 11.41.55.png

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

スクリーンショット 2020-08-04 11.44.38.png

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

スクリーンショット 2020-08-04 11.46.09.png

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

スクリーンショット 2020-08-04 11.48.05.png

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

スクリーンショット 2020-08-04 11.49.48.png

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

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

スクリーンショット 2020-08-04 11.52.41.png

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

スクリーンショット 2020-08-04 11.54.33.png

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

スクリーンショット 2020-08-04 11.56.42.png

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

スクリーンショット 2020-08-04 11.57.35.png

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

スクリーンショット 2020-08-04 11.58.43.png

1-5. HDL Wrapper を生成する

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

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

スクリーンショット 2020-08-04 12.00.05.png

デフォルトで OK します

スクリーンショット 2020-08-04 12.01.44.png

wrapper が作られました

スクリーンショット 2020-08-04 12.02.13.png

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

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

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

スクリーンショット 2020-08-04 12.04.28.png

次へ

スクリーンショット 2020-08-04 12.05.53.png

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

スクリーンショット 2020-08-04 12.06.39.png

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

スクリーンショット 2020-08-04 12.07.13.png

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

スクリーンショット 2020-08-04 12.11.11.png

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

スクリーンショット 2020-08-04 12.11.47.png

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

スクリーンショット 2020-08-04 12.14.06.png

1-7. 生成する

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

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

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

スクリーンショット 2020-08-04 12.15.54.png

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

スクリーンショット 2020-08-04 12.18.42.png

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

スクリーンショット 2020-08-04 12.19.48.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 と入れます) 、適当なノートブックファイルを生成します。

スクリーンショット 2020-08-04 13.48.26.png

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

スクリーンショット 2020-08-04 13.51.52.png

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 で点灯するはずです

スクリーンショット 2020-08-04 14.01.06のコピー.jpg

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10