かずの不定期便ブログ

備忘録代わりに書きます

FPGA買いました

目次

FPGAを買いました

 PYNQ-Z1 というボードを購入しました。
 これはCortex-A9x2とFPGAが統合されたZynq-7020というSoCが実装されています。
兄弟というか、似たようなボードにはZYBOとかARTY Z7があります。ARTY-Z7とPYNQ-Z1のボード仕様はほぼ同じに見えます。価格も同じ。ARTYの方はSDSoCのライセンスが付属(ライセンスfeeが2000円程度と破格)したものもあるけど、この辺の事情が理解できたのはPYNQをある程度勉強した後でした。
 PYNQはpythonFPGAが操作できるというのが売りなんですが、OSイメージはARTY-Z7でもそのまま使えるらしいです。
 PYNQを選んだ理由は、ボードのアクリルカバーがあったからです(秋月電子で売ってます)。pythonが得意というわけでもないです。いや、知らないです。

ブート(動作確認)

PYNQのサイトにセットアップ方法が書いてあります。

  • 8GB以上のmicroSDカードを用意
  • PYNQ公式サイト http://www.pynq.io/ からPYNQ-Z1 imageをダウンロード。(xilinxのアカウント作成の必要あり。1.6GB弱のZIPファイルで、これを解凍すると4GB前後のイメージファイル(拡張子.img)が得られる。V2.5でした)
  • 本ファイルをSDカードに書き込みます。ラズパイのOSイメージ書き込みと同じ要領です。
  • あとは公式ページの順番通りに作業を行えば動作するはずです。(マイクロUSBで電源の供給が出来ますが、ケーブルが長いと電力不足の為かブートが出来ないケースがありました。12VのACアダプタを準備して JP5 / Power ジャンパーをREG側にしてACアダプタから電源を供給させる事がおススメです)

 ピカピカーと青2個と緑4個のLEDが点滅を数回繰り返した後に、緑のLEDのみが全灯すると思います。
 LEDピカピカはPL部(FPGA)の制御ロジックで動作しており、Linux側とは何の関係もありません。CA9と埋め込み周辺ロジックの部分をPS部と呼んでいます。
 PCと繋がったマイクロUSB経由でZYNQとシリアル接続されていますのでteratermなどの端末ソフトでシリアル接続すれば、Linuxの起動ログなどが見えます。
xilinx@pynq:~$
の状態で
$ sudo reboot
すれば、Linuxのshutdownログに続いて起動ログが流れます(初期パスワードはxilinxです)。プロンプトが出たのち、かなり遅れてLEDがピカピカするので、LEDとLinuxは非同期で動いているんだという事がなんとなく分かるかと思います。

次に
$ sudo shutdown -h now
してみましょう。
teratermでは

[  OK  ] Unmounted /run/user/1000.
[  OK  ] Stopped target Swap.
         Deactivating swap /var/swap...
[  OK  ] Stopped target Local File Systems (Pre).
[  OK  ] Stopped Create Static Device Nodes in /dev.
[  OK  ] Deactivated swap /var/swap.
[  OK  ] Reached target Unmount All Filesystems.
[  OK  ] Stopped Remount Root and Kernel File Systems.
[  OK  ] Reached target Shutdown.
[  OK  ] Reached target Final Step.
         Starting Power-Off...
reboot: System halted

と表示されLinuxは停止しているにも関わらず、LEDは点灯したままです。
ここで、ラズパイとは違う事が分かるかと思います。
そうです。LEDはCA9から制御されてないです。
#もしかしたらgpioレジスタがCA9がリセットされても、初期化されない仕様という可能性もありますが。。。

f:id:spend-carefree:20200415192453j:plain
ボード写真

network接続

 ピンクのSRSTと印刷されたボタンを押すか、電源をOFF→ONしてLinuxが立ち上がったら、PYNQへネットワーク接続する事を試みることにします。
 公式ページには、http://192.168.2.99 へ接続という記載がありますが、これはPCと直接LANケーブルでつなげた場合です。PYNQを家庭内LAN(Hub)へ繋げた場合には、ルータからプライベートアドレスが割り付けられ、更に(windows10では)名前まで付けてくれるので、単に「http://pynq」 でアクセスできます。
 アクセス時にパスワードを聞かれます。デフォルトのパスワードは xilinx です。ログイン出来るとpython界隈では有名らしいjupyterの画面が拝めます。ここからpythonコードを打ち込むと一行一行インタラクティブに実行できます。グラフを描いたり、絵を表示させたりとwebブラウザなので結果をすぐに確認が出来ます。jupyterの良いところは実行したことをすべて保存させることが出来ます。次回は"再生"することで再現が出来るので、スクリプトを書くよりも面倒がないです。jupyterを触れるのはpynqが初めてです。
 sambaサーバーが動作していますので、windowsからネットワークドライブの割り当てで\\pynq\xilinxを指定すれば、マウントも出来ます。初期状態はユーザー名:xilinx、パスワード:xilinxです。

端末接続

USB端子は電源供給とシリアル接続を兼用しています。LANケーブルでLANにもつながっていますので、シリアル接続以外にネットワーク接続も可能です。sshでpynqというホスト名で接続すれば繋がります。
↓上がネットワーク接続。下側がシリアル接続です。

f:id:spend-carefree:20200414211215p:plain
teraterm ログイン

その他の設定

タイムゾーンの修正

タイムゾーンUTC になっていたので、JST に変更した。

$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

チュートリアルやってみる

 このボード(というかZYNQ)はARMが付いているし、SDRAMも十分載っててLinuxも走るという事で、FPGAに回路を書き込んで動かす方法は以下の様な選択肢があります。

  1. Linux上でpythonコードで回路を呼び出して実行する。ARMが回路を動かすことになる。(PYNQで想定されている方法)
  2. Linux上でCコードで回路を呼び出して実行する。ARMが回路を動かす。
  3. Linuxではない、ベアメタルな環境でCコードで回路を呼び出して実行する。ARMが回路を動かす。
  4. リセット解除されて自力で動き出す

更に3,4については、Xilinxのデバッガ上からJTAG経由でコードを流しこんで実行できます。
 選択肢が多すぎて、どこから初めていいか分かりません。まずはjupyterのExampleから始めた方がよさそうです。
 ホームDirにある「jupyter_notebooks」dirのオリジナルをコピーして保全します。
$ cp -rp jupyter_notebooks jupyter_notebooks.org
 http://pynqへアクセスしてjupyterのホームを表示します。my_WorkshopをクリックしてSession_1から順に学習します。pmodをボードにつけての学習がありますが、pmodは購入していないので飛ばして、ボードのみで出来ることをやります。
 pythonを知っていないと大変です。webで検索しながら行うより文法書を読んである程度学習をしてから行った方が良いと感じましたが、画像処理ライブラリPillow(PIL)や配列NumPyなど利用している為、文法書の範囲外も多く出てくるので、なかなか難しいです。
 結局、きちんと理解できず、応用が出来なかったので、pythonを使う事は諦めました。

 次回は回路作成編です。回路を作成するためにはxilinxの開発環境をPCへインストールすることが必要です。