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 を立ち上げて、プロジェクトの新規作成を開始する。 f:id:myokota:20150812114556p:plain

RTL プロジェクトを選択。 f:id:myokota:20150812115347p:plain

次の"Add Sources" と "Add Existing IP" ウィザードではは何も追加せずそのまま Next で進み、その後の "Add Constraint" では、下記のように予めダウンロードしていた ZYBO_Master.xdc を指定する。また、下部の"Copy ..." にチェックを入れて、プロジェクトに xdc ファイルを取り込むようにする(後で編集するため)。 f:id:myokota:20150812115625p:plain

Part の選択で ZYBO に乗っている Zynq を指定する。下記の設定でフィルタした一覧から、"xc7z010..." を選択。(現バージョンでは、Select: Boards で ZYBO が出てこない) f:id:myokota:20150812115653p:plain

これでプロジェクト新規作成ウィザードが終了し、Vivado のメインウィンドウに移る。

回路の作成

さっそく回路の作成を行うため、"Create Block Design" を実行する(実行後、Design 名の入力を求められるので、zybo とか適当に設定する)。 f:id:myokota:20150812121011p:plain

まず、ZYNQ を追加する。Diagram ウィンドウで "Add IP" を実行。 f:id:myokota:20150812121246p:plain

追加できる IP 一覧が表示されるため、Search ボックスに zynq と入力して、"ZYNQ7 Processing System" を選択する。

f:id:myokota:20150812121300p:plain

さらに、ZYNQ と同じ要領で、外部 GPIO である "AXI GPIO" という IP を、プッシュボタンとLED用に2つ追加する("gpio" で検索すれば出てくる)。

これで手動による IP の追加が終わったので、"Diagram" ウィンドウ上部に表示されている "Run Block Automation"と"Run Connection Autmation" を実行する。

f:id:myokota:20150812121347p:plain

Run Block Autmation は手動で追加した IP を扱うために必要な他の IP を自動で追加してくれる(リセット回路など)。今回は何も変更せずそのまま OK ボタンで完了。

Run Connectoin Automation は追加した IP の配線を自動で行ってくれる。 今回は以下のように "All Automation" にチェックを入れて OK ボタンを押す。

f:id:myokota:20150812121417p:plain

この時点の回路図は以下のようになる。Diagram ウィンドウ左下の"Regenerate Layout"(リピートマークのようなボタン)を実行すると、レイアウトを整理してくれる。 f:id:myokota:20150812121904p:plain

IP のカスタマイズ (割り込みの設定)

引き続き、各 IP のカスタマイズを行っていく。まず、ZYNQ。Diagram ウィンドウ上の ZYNQ をダブルクリックして以下のウィンドウを開く。 f:id:myokota:20150812121523p:plain 上部の"Import XPS Setting" を押し、予め Digilentinc のサイトから ダウンロードしておいた、ZYBO_def.xml を設定する。これによって、ZYBO 向けの基本的な設定がインポートされる。

そして、今回の実験用のカスタマイズである外部 GPIO 割り込みの設定を行う。 左部の"Interrupts"から割り込み設定を開き、"PL-PS Interrupts" の "IRQ_F2P[15:0]" にチェックを入れる。 f:id:myokota:20150812121637p:plain

ZYNQ に対する設定は以上で終了。

次に、外部 GPIO のカスタマイズ。まず、プッシュボタン用の設定を行う。 Diagramウィンドウから、2つある外部 GPIO のどちらかをダブルクリックして以下の設定を行う。 f:id:myokota:20150812122044p:plain

デフォルト設定から、

  • "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 で接続する。(接続可能な端子をマウスオーバーするとマウスポインタが鉛筆マークになる)

f:id:myokota:20150812122100p:plain

最後に GPIO 端子の設定を行う。まず、端子の名称を変更。 Diagram ウィンドウ上で GPIO 端子(デフォルトでは gpio_rtl ...)をダブルクリックすると "External Interface Property" というウィンドウが現れるため、そこの Name から変更する。 f:id:myokota:20150812122119p:plain 今回は、

  • プッシュボタン: btn_4bits
  • LED: led_4bits

とした。端子名称変更は必須ではないが、わかりやすさのために行った。 次いで、Block Design の Souces タブから、"Constraints"-> "constrs_1" -> "ZYBO_Master.xdc" をダブルクリックで開く。ファイルの内容は全てコメントになっており、必要な設定のみコメントを外して設定を有効にする。 f:id:myokota:20150812123131p:plain 今回はプッシュボタンと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 を生成する。 f:id:myokota:20150812123224p:plain

そしていよいよ、FPGA にロードするための回路データ(bit ファイル)を生成する。Vivado メインウィンドウ左下の "Generate Bitstream" を押すだけ。

f:id:myokota:20150812123455p:plain

生成完了までに数分かかる("Window" -> "Design Runs" ウィンドウで進捗状況がわかる)。

Bitstream の生成が完了すると、次の工程を促されるが、今回は必要ないため、Cancel で終了。

f:id:myokota:20150812123525p:plain

仕上げに、"File" -> "Export" -> "Export Hardware" を実行して、H/W 情報を SDK 用にエクスポート(後編で使用)。

f:id:myokota:20150812123542p:plain

"Include bitstream" にチェックを入れてOKで完了。

後編へ

長かったけど、これで ZYNQ からプッシュボタンとLEDを扱うための回路データを生成できた。後編では、ソフトウェアを準備し、動作確認を行ってみる。