Ubuntu Weekly Recipe

第475回 廉価なFPGA開発ボード「Zybo」をUbuntuからプログラムする

この記事を読むのに必要な時間:およそ 11 分

FPGAサンプルプログラムを動かす

最後にVivadoを使って実際にFPGAの回路を作成し,XSDKを用いてFPGAと協調して動作するプログラムを作成して,両方のデータをJTAGからボードに送信して起動してみましょう。

Zyboの場合,CPU側を「PS:Processing System」と呼び,FPGA側を「PL:Programmable Logic」と呼びます。PSとPLの間はARM社が提唱するインターコネクトAMBAのプロトコルのひとつである「AMBA AXI」で通信します。PL側が周辺機器(I/O Peripheral)とやり取りするためには,AXIインターコネクト経由で接続するか,Xilinx独自のEMIO(Extended Multiplexed I/O)を使って直接接続するかの二択になります。

一番わかりやすいのは,Digilentのチュートリアルを実施することです。このチュートリアルを通して,ボード上のプッシュボタンやスライドスイッチ,LEDの値をGPIOを経由して読み書きする回路を構築できます。GPIOの操作はAXIインターコネクトを用いて行います。PS側がマスターで,PL側がスレーブです。PL側,つまりFPGA側の回路は自分で1から設計することも可能ですが,このチュートリアルではXilinxが提供するIPコア(Intellectual Property Core)を流用しています。たとえばGPIOを操作する部分はAXI GPIO(PDF)を使っています。Vivadoを使うとVHDLなどを記述しなくても,マウスの操作だけでこれらのIPコアを接続することが可能です。

  • PL側に2つのAXI GPIOを用意する
  • 1つのAXI GPIOはデュアルチャンネル設定とし,4つのボタンbtns_4bitsと4つのスイッチsws_4bitsに接続する
  • 1つのAXI GPIOはシングルチャネル設定とし,4つのLEDleds_4bitsに接続する
  • PL側にAXI Interconnectを用意するIPコアのデータシートPDF
  • AXI InterconnectをPS側のAXIの汎用ポートの1つM_AXI_GP0に接続する(PS側がマスター)
  • AXI InterconnectとAXI GPIOを接続する(AXI Interconnect側がマスター)

図9 Block DesignでPSを配置したところ

画像

図10 Block DesignでAXI GPIOを配置したところ

画像

図11 AXI GPIOのデュアルチャンネル設定

画像

図12 AXI GPIOの個々のチャンネルに接続するデバイスの選択

画像

図13 AXI Interconnectは必要に応じて自動的に配置してくれる

画像

回路をデザインしたら,チュートリアルの手順に従って検証し,論理合成を行ってBitstreamを含むアーカイブ(sysdefファイル)を生成します。このBitstreamがFPGAにプログラムされるデータの実体です。今回はXSDKからJTAGを使ってデータを送るため,次の手順でこのZIPアーカイブをhdfファイル(拡張子が異なるだけで中身は同じ)としてSDKへエクスポートしています。なおBitstreamの生成にはそれなりに時間がかかります。完了前にSDKへのエクスポートを実行しようとすると,⁠sysdefファイルがない」と怒られます。⁠Bitstream Generation Completed」ダイアログが表示されるまでおとなしく待ちましょう。

SDKへのエクスポートが完了したら,PS側のロジックをSDKで記述します。

  • スイッチのGPIOの値を読む
  • その値をLEDのGPIOにセットする
  • ボタンのGPIOの値を読む
  • 値にあわせてコンソールに押されたボタンの番号を表示する
  • 上記を200ミリ秒周期で繰り返す

PS側のロジックはこれだけです。⁠OS Platform」「standalone」として構築するため,本来であればLinuxカーネルがやるであろうハードウェアの初期化などもすべて上記ロジックを含むシングルバイナリで行います。

図14 ⁠standalone」でプロジェクトを作成する

画像

図15 チュートリアルにあわせてhelloworld.cを書き換える

画像

最後にJTAG経由でZyboにデータを送ります。まずZybo上のJP5を「JTAG」がショートするようにジャンパピンの位置を変更しましょう。変更したら,ZyboとPCをUSBケーブルで接続した上で,電源を投入してください。PGOOD LEDが赤色で点灯し,DONE LEDは消灯したままになるはずです。

XSDKのXilinx Toolsメニューから「Program FPGA」を選ぶとBitstreamをFPGAに書き込みます。

図16 BitstreamをFPGAへ書き出す

画像

Deviceが「Auto Detect」になっている場合,hw_serverが起動し存在するUSBデバイスから適切な書き込みデバイスを検知した上でデータをプログラムします。Zyboの電源が入っていなかったり,USBケーブルがつながっていないとプログラムに失敗するので注意してください。プログラムが成功すれば,Zybo上のDONE LEDが緑色に点灯します。

最後にPS側のロジックをビルド&実行しましょう。Project Explorerのプロジェクト名(チュートリアル通りに実施しているならgetting_started_with_ZYBO⁠)を右クリックし「Run As」から「Launch on Hardware (System Debugger)」を選択すれば,ソースコードをビルドし,ELFバイナリがPS側に送られ,実行されます。

今回は押されたボタンの番号がコンソールに表示されるため,/dev/ttyUSB1screenで接続しておきます※9⁠。

※9
ファイル名は環境にあわせて変更します。xilinxコンテナにttyUSB1を追加していない場合は,ホスト上で実行しましょう。ちなみにシリアル通信のプログラムはscreen以外を使ってもかまいません。
$ screen /dev/ttyUSB1 115200

あとはスイッチ(SW0からSW3まで)やボタン(BTN0からBTN3まで)をガチャガチャと動かして,Vivadoで設計した論理回路とXSDKで書いたコードのとおりに動作することを確認すれば完成です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。