ZYNQ に GPIO 回路を接続し Linux 上で割込みを受け付けてみる(前編)
最近、ZYNQ 搭載の評価ボードである ZYBO を購入し、遊んでいる。
http://www.digilentinc.com/Products/Detail.cfm?Prod=ZYBO
FPGA の評価ボードに初めて触れるため色々と試行錯誤があるが、ZYNQと、その開発ツールである Vivado に関する情報がWEB 上に多いので、独学でなんとかなっている。
まだ HDL をガリガリ書くまでに至っていないが、手始めとして、外部GPIOに接続されたプッシュボタンを ZYNQ で割り込みとして拾えるようにし、Linux カーネルから認識できたので、その手順を残す。 また、プッシュボタンの他に LED もつながっているため、ついでに使えるようにしてみた。
環境
Host: Ubuntu 14.04 64bit
Vivado: WebPack 2015.2
準備
予め、Digilentinc サイトから回路データの作成に必要となるファイルをダウンロードしておく。
http://digilentinc.com/Data/Products/ZYBO/ZYBO_Master_xdc.zip
http://digilentinc.com/Data/Products/ZYBO/ZYBO_def.zip
プロジェクトの新規作成
Vivado を立ち上げて、プロジェクトの新規作成を開始する。
RTL プロジェクトを選択。
次の"Add Sources" と "Add Existing IP" ウィザードではは何も追加せずそのまま Next で進み、その後の "Add Constraint" では、下記のように予めダウンロードしていた ZYBO_Master.xdc を指定する。また、下部の"Copy ..." にチェックを入れて、プロジェクトに xdc ファイルを取り込むようにする(後で編集するため)。
Part の選択で ZYBO に乗っている Zynq を指定する。下記の設定でフィルタした一覧から、"xc7z010..." を選択。(現バージョンでは、Select: Boards で ZYBO が出てこない)
これでプロジェクト新規作成ウィザードが終了し、Vivado のメインウィンドウに移る。
回路の作成
さっそく回路の作成を行うため、"Create Block Design" を実行する(実行後、Design 名の入力を求められるので、zybo とか適当に設定する)。
まず、ZYNQ を追加する。Diagram ウィンドウで "Add IP" を実行。
追加できる IP 一覧が表示されるため、Search ボックスに zynq と入力して、"ZYNQ7 Processing System" を選択する。
さらに、ZYNQ と同じ要領で、外部 GPIO である "AXI GPIO" という IP を、プッシュボタンとLED用に2つ追加する("gpio" で検索すれば出てくる)。
これで手動による IP の追加が終わったので、"Diagram" ウィンドウ上部に表示されている "Run Block Automation"と"Run Connection Autmation" を実行する。
Run Block Autmation は手動で追加した IP を扱うために必要な他の IP を自動で追加してくれる(リセット回路など)。今回は何も変更せずそのまま OK ボタンで完了。
Run Connectoin Automation は追加した IP の配線を自動で行ってくれる。 今回は以下のように "All Automation" にチェックを入れて OK ボタンを押す。
この時点の回路図は以下のようになる。Diagram ウィンドウ左下の"Regenerate Layout"(リピートマークのようなボタン)を実行すると、レイアウトを整理してくれる。
IP のカスタマイズ (割り込みの設定)
引き続き、各 IP のカスタマイズを行っていく。まず、ZYNQ。Diagram ウィンドウ上の ZYNQ をダブルクリックして以下のウィンドウを開く。 上部の"Import XPS Setting" を押し、予め Digilentinc のサイトから ダウンロードしておいた、ZYBO_def.xml を設定する。これによって、ZYBO 向けの基本的な設定がインポートされる。
そして、今回の実験用のカスタマイズである外部 GPIO 割り込みの設定を行う。 左部の"Interrupts"から割り込み設定を開き、"PL-PS Interrupts" の "IRQ_F2P[15:0]" にチェックを入れる。
ZYNQ に対する設定は以上で終了。
次に、外部 GPIO のカスタマイズ。まず、プッシュボタン用の設定を行う。 Diagramウィンドウから、2つある外部 GPIO のどちらかをダブルクリックして以下の設定を行う。
デフォルト設定から、
- "All Inputs" をチェック
- "GPIO Width" を 4 に設定
- "Enable Interrupts" をチェック
上記を行い、OK で完了。もう一方のLED用のGPIOのカスタマイズは、
- "All Outputs" をチェック
- "GPIO Width" を 4 に設定
とする。
そして、ZYNQ とプッシュボタン用GPIOの割り込み信号を結線する。Diagram ウィンドウにて、プッシュボタン用GPIO上の"ip2intc_irpt" と、ZYNQ上の "IRQ_F2P" の Drag&Drop で接続する。(接続可能な端子をマウスオーバーするとマウスポインタが鉛筆マークになる)
最後に GPIO 端子の設定を行う。まず、端子の名称を変更。 Diagram ウィンドウ上で GPIO 端子(デフォルトでは gpio_rtl ...)をダブルクリックすると "External Interface Property" というウィンドウが現れるため、そこの Name から変更する。 今回は、
- プッシュボタン: btn_4bits
- LED: led_4bits
とした。端子名称変更は必須ではないが、わかりやすさのために行った。 次いで、Block Design の Souces タブから、"Constraints"-> "constrs_1" -> "ZYBO_Master.xdc" をダブルクリックで開く。ファイルの内容は全てコメントになっており、必要な設定のみコメントを外して設定を有効にする。 今回はプッシュボタンとLEDなので、29行目付近から61行目付近の set_property から始まる行を有効にする。 ("##Buttons" と "##LEDs" というコメントがある範囲)
また、get_ports に、入出力の端子名を指定する。 今回であれば、
- プッシュボタン: btn_4bits_tri_i
- LED: led_4bits_tri_o
となる。 xxx_tri_i は入力用の端子名、xxx_tri_o は出力用の端子名(Block Design の Design タブで確認可能)
これで回路の作成は終わったので、HDL を生成する。
そしていよいよ、FPGA にロードするための回路データ(bit ファイル)を生成する。Vivado メインウィンドウ左下の "Generate Bitstream" を押すだけ。
生成完了までに数分かかる("Window" -> "Design Runs" ウィンドウで進捗状況がわかる)。
Bitstream の生成が完了すると、次の工程を促されるが、今回は必要ないため、Cancel で終了。
仕上げに、"File" -> "Export" -> "Export Hardware" を実行して、H/W 情報を SDK 用にエクスポート(後編で使用)。
"Include bitstream" にチェックを入れてOKで完了。
後編へ
長かったけど、これで ZYNQ からプッシュボタンとLEDを扱うための回路データを生成できた。後編では、ソフトウェアを準備し、動作確認を行ってみる。