Ubuntu Weekly Recipe

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

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

LXD上にVivadoをインストール

FPGAの回路をデザインしプログラムするために,Xilinx製の統合開発環境VivadoXSDKを導入します。Vivadoは有償ソフトウェアですが,機能を制限した無償版のWebPACKがあるのでこちらを使うことにしましょう。いずれもLinux向けのバイナリも提供されています。

そこでまずはXilinxのサイトからVivadoのインストーラーをダウンロードしてください。サイトのリンクをたどって「Vivado HLx 2017.1: WebPACK および Editions - Linux 用自己解凍型ウェブ インストーラー」を選択します。Vivadoのインストーラーを使えば,XSDKもセットでインストールできます。ダウンロードにはアカウント登録が必要です。またダウンロードの際に「米国政府輸出承認」というフォームに個人情報を記録する必要があります。たとえばアメリカ合衆国の商務省産業安全保障局から輸出禁止対象になっているような個人・会社は何がしかのおとがめがあるかもしれません。

インストーラー自体は86MB程度ですが,インストール時に数GBのデータをダウンロードすることになりますのでネットワークの帯域には注意してください。

xilinxコンテナの作成

今回はこれらのプロプライエタリのバイナリをLXD上のコンテナにインストールして使うことにします。ちなみにLXD上である必要性はなく,実機に直接インストールしてもかまいません。実機に直接インストールする場合は,この節を飛ばしてください。

LXDを使う場合に気をつけなければいけないのは,XSDKがUSB-JTAG経由でFPGAをプログラムすることです。つまりLXDコンテナの中からUSBデバイスが見えなくてはなりません。そこでLXD 2.1以降で機能が充実した,usbデバイスタイプのホットプラグ機能を使うことにします※4⁠。Ubuntu 16.04 LTSの場合,普通にLXDをインストールすると2.0.x系がインストールされます。2.1以降を使いたい場合は,バックポートリポジトリを指定してください。

※4
単にコンソールデバイスとして見えるようにするだけであれば,LXD 2.0.xでもunix-charデバイスタイプとしてコンテナに追加することが可能です。ただXSDKhw_server/dev/bus/usb/以下を見て,自動的にUSB-JTAGを探す仕組みになっているため,unix-charデバイスタイプをコンテナに追加するだけではFPGAを見つけられません。
$ sudo apt -t xenial-backports install lxd

もし初めてLXDをインストールした場合は,初期設定を行っておきましょう。

$ sudo lxd init
(基本的にすべての既定の選択肢をそのまま選ぶ)

設定が終わったら,一度ログインしなおしてください。Vivadoはi386アーキテクチャのバイナリが必要になるケースがあるため,次のような内容のファイルをxenial.cfgとして作っておきます。

#cloud-config

apt:
  primary:
    - arches: [amd64, i386, default]
      uri: http://jp.archive.ubuntu.com/ubuntu
  security:
    - arches: [amd64, i386, default]
      uri: http://security.ubuntu.com/ubuntu

package_upgrade: true

packages:
  - language-pack-ja
  - fonts-takao

locale: ja_JP.UTF-8

timezone: Asia/Tokyo

runcmd:
  - [ dpkg, --add-architecture, i386 ]
  - [ apt-get, update ]

ではVivadoをインストールするためのコンテナを作ります。

$ lxc init ubuntu:16.04 xilinx
xilinx を作成中
$ lxc config set xilinx user.user-data - < xenial.cfg
$ lxc start xilinx
$ lxc exec xilinx -- sudo -iu ubuntu ssh-import-id lp:(Launchpadのアカウント)
$ lxc file push ~/ダウンロード/Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin xilinx/home/ubuntu/
$ lxc exec xilinx -- chown ubuntu: /home/ubuntu/Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin
$ lxc exec xilinx -- chmod +x /home/ubuntu/Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin
$ lxc exec xilinx -- apt install -y xterm libgtk2.0-0 unzip

UbuntuのコンテナのSSHサーバーは公開鍵認証のみ可能な設定で起動しているため,ssh-import-idコマンドで鍵を登録しています。LaunchpadにSSH公開鍵を登録済みであれば「lp:(Launchpadのアカウント⁠⁠」でインターネットから公開鍵をダウンロードしますし,⁠gh:(GitHubのアカウント⁠⁠」を実行すればGitHubから取得します。

最後にインストールしているパッケージは,VivadoやXSDKを動かすために必要なパッケージです。もちろんこれらの設定はxenial.cfgに書いてもかまいません。

あとはlxc listで表示されるxilinxコンテナのアドレスに対して,X転送を有効化した上でSSHログインしましょう。

$ ssh -X ubuntu@(xilinxコンテナのアドレス)

これ以降は,コンテナの上でコマンドを実行するものとします※5⁠。

※5
UnityのDashなどから検索したい場合は,第416回「デスクトップファイルの作成」を参考にしてください。

Vivadoインストーラーの起動

Vivadoインストーラーは「シェルスクリプト+アーカイブバイナリデータ」タイプのただのスクリプトファイルです。スクリプトを実行するとアーカイブバイナリを展開し,その中のJavaプログラムを起動します。--helpオプションを付けて実行すると,使い方が表示されます。

$ ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --help
Makeself version 2.1.5
 1) Getting help or info about ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin :
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --help   Print this message
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --info   Print embedded info : title, default target directory, embedded script ...
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --lsm    Print embedded lsm entry (or no LSM)
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --list   Print the list of files in the archive
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --check  Checks integrity of the archive

 2) Running ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin :
  ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin [options] [--] [additional arguments to embedded script]
  with following options (in that order)
  --confirm             Ask before running embedded script
  --noexec              Do not run embedded script
  --keep                Do not erase target directory after running
                        the embedded script
  --nox11               Do not spawn an xterm
  --nochown             Do not give the extracted files to the current user
  --target NewDirectory Extract in NewDirectory
  --tar arg1 [arg2 ...] Access the contents of the archive through the tar command
  --                    Following arguments will be passed to the embedded script

$ ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --info
Identification: Xilinx Installer
Target directory: removeLin64
Uncompressed size: 16 KB
Compression: gzip
Date of packaging: Fri Apr 14 21:56:37 MDT 2017
Built with Makeself version 2.1.5 on linux
Build command was: /proj/rdi-xco/scratch/builds/2017.1/nightly/RUNNING_BUILD/prep/rdi/installer/ict/bin/../../tools/makeself.sh \
    "--follow" \
    "/proj/xbuilds/2017.1_0415_1/images/ict_data/Xilinx_Vivado_SDK_2017.1_0415_1/removeLin64" \
    "/proj/xbuilds/2017.1_0415_1/images//Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin" \
    "Xilinx Installer" \
    "./xsetup"
Script run after extraction:
     ./xsetup
removeLin64 will be removed after extraction

$ ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin --check
Verifying archive integrity... MD5 checksums are OK. All good.

インストール先を/opt/Xilinxにするために,あらかじめ一般ユーザーが書き込めるように作っておきます※6⁠。その後,インストーラーを起動してください。

※6
LXD上でインストーラーを管理者権限で実行した場合,アーカイブ展開時においてファイルのUID/GIDを変更する際にエラー終了してしまうようです。一般ユーザーでインストーラーを実行できるように,今回のような対応を行っています。
$ sudo mkdir -p /opt/Xilinx
$ sudo chown -R ubuntu: /opt/Xilinx
$ ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin

しばらく待つと,インストーラーのウィンドウが立ち上がります。以降,スクリーンショットを元にステップバイステップで説明します。

図3 ダウンロード時に登録したアカウント情報を入力

画像

図4 License Agreementsに同意する

画像

図5 Vivado HL WebPACKを選択

画像

図6 ⁠Software Development Kit (SDK)」もチェックする

画像

図7 インストール先の選択

画像

一通り入力が終わったら,ダウンロードとインストールを開始します。しばらく時間がかかるので放置しておきましょう。

インストールが完了したら環境変数設定ファイルを読み込み,vivadoコマンドで起動します。

$ source /opt/Xilinx/Vivado/2017.1/settings64.sh
$ vivado

無事に以下の画面が表示されたらインストール完了です。実際に使う前に一度Vivadoを終了して,他のファイルをインストール手順に移ります。

図8 Vivadoの画面

画像

ボードファイルのインストール

ボードファイルは各開発ボードの各種インターフェースを定義したファイルです。VivadoにはXilinx製の開発ボードのボードファイルが最初から入っていますが,Zyboについては別途DigilentのGitHubサイトからダウンロードしてインストールする必要があります。といってもzipアーカイブを展開するだけなので,手順は至極シンプルです。

$ wget https://github.com/Digilent/vivado-boards/archive/master.zip
$ unzip master.zip
$ cp -a vivado-boards-master/new/board_files/* /opt/Xilinx/Vivado/2017.1/data/boards/board_files/

これによりVivado上でZyboの各種インターフェースを簡単に利用できるようになります。

「ケーブルドライバー」のインストールとコンテナの設定

一般的にFPGAの書き込みには,FPGAのベンダーが用意している「書き込みケーブル」を利用します。最近はFPGA側のインターフェースがJTAGで,PC側がUSBであることが多いため「USBケーブルドライバー」をPCにインストールする必要があります※7⁠。

※7
一般的には,不揮発性のFPGAであればFPGAに書き込み用のピンがありますし,揮発性でもコンフィギュレーション用のRAMをつないでデータをそこに乗せれば,ソフトウェア側からプログラムすることも可能です。Zyboの場合は一例としてFSBL(First Stage Boot Loader)がブロックRAMにデータを書き込んだ上でFPGAを起動します。

Zyboの場合は普通のUSBケーブルをそのまま使えるため,実は専用のUSBケーブルドライバーは不要です。ただしVivadoには最初からケーブルドライバーのインストールスクリプト※8が用意されています。これは何をするものかと言うと,実質的にはDigilent製のシリアルコンソールデバイスが接続された場合に,デバイスファイルのパーミッションを「666」にする(誰でも読み書き可能にする)だけです。要するにVivadoやXSDKからJTAG経由でFPGAのデータなどを書き込むことを考慮して,VivadoやXSDKを起動したユーザーの権限でそのデバイスに書き込めるようにしているわけです。

※8
/opt/Xilinx/Vivado/2017.1/data/xicom/cable_drivers/lin64/install_script/install_drivers/install_drivers

そこでインストールスクリプトを実行する代わりにホスト側において/etc/udev/rules.d/55-zybo.rulesというファイル名で,次の内容の設定ファイルを用意します。ホスト側としているのは,LXDコンテナの内部のsystemd-udevdの権限が制限されているためです。

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{manufacturer}=="Digilent", MODE:="666"

なお,上記はZyboの場合のみを考慮しています。他のXilinxのケーブルを使う場合は,インストールスクリプトを参考に適宜設定してください。ちなみにVivadoに同梱されているファイルのudevルールは若干古いようで,Ubuntu 16.04 LTSだと多少調整が必要かもしれません。

設定ファイルを作成したら,ホスト上で次のコマンドで設定を再読み込みします。

$ sudo udevadm control --reload

さらにZyboの電源を入れて,UARTデバイスが認識された状態にした上で,それをxilinxコンテナの中から見えるように設定を行います。

$ lsusb
Bus 001 Device 005: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC
$ lxc config device add xilinx zybo usb vendorid=0403 productid=6010 mode=0666

これでUARTデバイスを認識したら自動的に,xilinxコンテナの中からも見えるようになりました。FPGAのオンオフにあわせて/dev/bus/usb以下の内容が変化するはずです。

もし/dev/ttyUSB0などもコンテナの中から見えるようにしたい場合は,ホスト上で次のコマンドを実行してください。

$ lxc config device add xilinx ttyUSB0 unix-char path=/dev/ttyUSB0
$ lxc config device set xilinx ttyUSB0 mode 666
$ lxc config device add xilinx ttyUSB1 unix-char path=/dev/ttyUSB1
$ lxc config device set xilinx ttyUSB1 mode 666

ttyUSB0などは認識順に移動します。必要であればudevルールのほうで固定の名前をつけましょう。

著者プロフィール

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

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