みなさんこんにちは。このコースでは、Python で FPGA を手軽に利用できる PYNQ とその活用方法を紹介していきます。ゴールは、Jupyter Notebook の環境を使って Python から手軽に FPGA を利用できるようになることです。前回は、「そもそも FPGA ってなに?」というタイトルで FPGA の紹介をしました。第2回の今回は、本題の PYNQ を紹介します。
PYNQ って何? – Python による FPGA 操作
PYNQ は、PythonでFPGAを利用するためのフレームワークです。典型的には、SoC タイプの FPGA のプロセッサ側で Linux が走り、その上で実行される Jupyter Notebook を使って Web ブラウザから Python でプログラマブルロジック上のハードウェアを制御できます。
たとえば、Web ブラウザ経由で、
- FPGA に接続された I/O (ボタンやLED、センサ、モーターなど) を操作する
- Python プログラムの一部を FPGA で高速化する
といった操作を簡単に実現できます。また、Web ブラウザから Python プログラムを実行して、利用したいアプリケーションに応じたハードウェアをプログラマブルロジックにロードすることもできます。
PYNQ は普通の Ubuntu+α
PYNQ は Jupyter Notebook 経由で FPGA を操作するインターフェースを備えていますが、実体は普通の Ubuntu です。ログインして bash でコマンドライン操作ができて、gcc そのほか Linux で馴染みある開発環境や、apt によるパッケージ管理ができます。
PYNQ はどんな環境で使えるの?
PYNQ を手軽に使ってみるためには、あらかじめビルドされたイメージが公開されている環境を利用するのがもっとも手軽です。PYNQ の Web サイトのボードのページから、
- PYNQ Z-1
- PYNQ Z-2
- ZCU104
- ZCU111
- Ultra96 v1、Ultra96 v2
を対象にして準備されたイメージファイルをダウンロードして利用できます。また、SoC タイプの FPGA ではありませんが、サーバ用 FPGA ボードの Alveo を PYNQ で利用するガイドも公開されています。
最初に登場した公式のボードの名前が PYNQ だったからか、 PYNQ (というプラットフォーム) が、PYNQ Z-1 でしか動かないと誤解している人がいます。そんなことはなく、自分で持っている FPGA ボード向けに PYNQ 環境を構築することもできます。たとえば、ZYBO Z7-20 で PYNQ を使うでは ZYBO Z7-20 向けにビルドした事例を紹介しています。
PYNQ が向いている利用シーン
FPGA のロジックにすべてのシステムを実装するアプリケーションに PYNQ は不要です。また、SoC タイプの FPGA を使う場合にもスタンドアロンで動作させるアプリケーションであれば PYNQ を利用する必要はあまりありません。
しかし、何かしらユーザからロジックの制御をする場合に PYNQ は大変便利です。特に、インタラクティブにハードウェアロジックを制御するアプリケーションを SoC タイプの FPGA で利用する場合に、PYNQ の便利さは極立ちます。
インタラクティブにハードウェアを操作するシステムを開発する一般的な手法では、ハードウェアロジックとユーザインターフェース、そしてハードウェアとソフトウェアをつなぎこむ部分をすべて自前で用意する必要があります。一方で、PYNQ を利用する場合は、ハードウェアロジックこそ用意する必要がありますが、リソース管理やユーザインターフェースに PYNQ で用意されているコンポーネントや Jupyter Notebook を利用することができます。しかもユーザがインタラクティブに操作するだけでなくプログラムによる自動化システムのセットアップも簡単です。
Jupyter Notebook 上の実行結果をそのまま保存しておけば、制御の記録としてもそのまま利用できます。そのため、たとえば、FPGA の上に構築したアクセラレータのパラメタを少しずつ変更しながら評価したい場合や、物理実験システムに FPGA を導入したいという場合にはうってつけのフレームワークです。
PYNQ を使ってみよう
実際に PYNQ を使ってみましょう。このブログでは PYNQ Z-1 をターゲットにします。
イメージをダウンロード
PYNQ の開発ボード向のダウンロードページから PYNQ-Z1 v2.5 PYNQ image を ダウンロードします。リンクをクリックすると Xilinx のログインページに移動します。ログインして、ダウンロードします。
SD カードにイメージファイルを書き込む
ダウンロードした圧縮されたイメージファイル pynq_z1_v2.5.zip を解凍すると、SD カードイメージの pynq_z1_v2.5.img を手にいれることができます。イメージファイルのサイズは 5.5GB ほどです。開発用のコンピュータの OS が macOS や Linux の人は dd などを使って pynq_z1_v2.5.img を マイクロ SD カードに書き込みましょう。Windows の人は、たとえば、Rufus などを使ってマイクロ SD カードに書き込んでください。
なお、間違っても、OSやデータが入っているディスクを上書きしてしまわないように十分に気をつけてください。(筆者は責任を取れませんので)
SD カードをボードにセットして電源を入れる
pynq_z1_v2.5.img を書き込んだマイクロ SD カードを PYNQ Z-1 にセット、USB ケーブルで開発用のコンピュータと接続して電源を入れて起動します。もし起動しない場合はには JP4 のジャンパが SD カードからの起動にセットされているか確認してください。PYNQ が起動するとボード上の LED LD0〜LD5 が数回(LD4 と LD5 は青色に)点滅し、最終的には LD0 〜 LD3 が点灯します。また、イーサネットでパソコンと接続しておきましょう。
オプション : シリアルターミナルでアクセス
TeraTerm や screen などを使ってシリアルポートを開くと、Linux が起動して xilinx ユーザとして自動ログインしたターミナルにアクセスできます。通信速度は115200です。起動時間は結構短いので、何も表示されないな?と思ったら、エンターキーを押してみてください。プロンプトが表示されると思います。
Web ブラウザでアクセスする
PYNQ のネットワークインターフェースは 192.168.2.99 にセットされています。そのため PYNQ と接続したパソコンのネットワークポートの IP アドレスを 192.168.2.1 にセットします。 (本格的に運用する際には IP アドレスを変更するとよいですが、まずは動作確認ということで、このまますすめます。)
ブラウザを開いて 192.168.2.99 にアクセスするとログイン画面が開きます。パスワードに xilinx と入力すると、Jupyter Notebook のメイン画面が開きます。
たとえば、base → board とディレクトリを辿って、board_btns_leds.ipynb を開いてみます。
board_btns_leds.ipynb を実行すると、ボード上のボタンが押される度に LED の点灯方法を変更するサンプルプログラムの様子を楽しむことができます。プログラムの詳細は次回に説明します。
ブラウザから Linux のターミナルにアクセスする
Jupyter Notebook では Python プログラムを実行するだけではなく、 New → Terminal とクリックすることで、 Linux のターミナルにアクセスできます。ターミナルでは、普通に Linux のコマンドを実行できます。uname で OS の名前を確認したり、ps で実行しているプロセスを確認したりできるほか、gcc や apt なども使えるようになっています。
終了するときには、halt -p を実行してから電源を切りましょう。
まとめ
今回は PYNQ を使った FPGA の利用方法のさわりを紹介しました。PYNQ を使うことで面倒なユーザインターフェースの実装を省いて手軽に FPGA を操作するフロントエンドをセットアップすることができます。
次回は、いよいよ実際に PYNQ を使って FPGA を使ってどんなことができるか、いくつかの事例を紹介します。お楽しみに。
また、手元の PYNQ Z-1 で試そうとしたけどうまくいかなかった、というようなことがあれば FPGA 質問箱で質問を受けつけてます。お気軽にどうぞ。
わさらぼ みよしたけふみ