みなさん、
スマートフォンの普及によって、
今回はそんな
Digilent製FPGA開発ボード「Zybo」
Digilent製FPGA開発ボード
- CPU:650MHz デュアルコア Cortex-A9
- ロジックスライス:4400個
(1個あたり6入力LUTと8個のフリップフロップのロジックセルが4つ) - ブロックRAM:240KB
- メモリ:DDR3 512MiB
- ストレージ:128Mb QSPI Flash ROM、
microSDカードコントローラー - Ethernet:1Gbit/
100Mbit/ 10Mbit - オーディオ:ヘッドフォン出力、
マイクロフォン・ ライン入力ジャック - インターフェース:HDMI
(sink/ source)、 VGA、 USB 2. 0 (OTG)、 UART、 JTAG - その他:スイッチ4個、
ボタン6個、 LED5個
廉価版のFPGAがベースになっているためロジックスライス数は4400個と少なめです。
Zyboには、
- PCとZyboをつなぐためのUSBケーブル
(Zybo側がmicroUSB端子) - HDMI・
VGAケーブル (ディスプレイを使う場合のみ) - microSDカード
(microSDカードから起動する場合) - 5V 2.
5Aの内径2. 1mm・ center-positiveなプラグのついたACアダプター (USBから給電しない場合)
USBケーブル以外は
ちなみにZybo自体は比較的古い製品です。Arty Z7やPYNQ-Z1などおなじZynq-7000ベースの新しいボードも出ていますので、
電源投入のテスト
さっそく電源をいれてみましょう。QSPI Flash ROM
まずは電源ソースを設定するJ15ピンを、

次にJP5ピンを使ってブートデバイスを変更します。シルク印刷にあわせて真ん中の2ピンをショートさせれば、

「PROG UART」
そのままPCからシリアルコンソールに接続してみましょう。PCにUSBケーブルを接続し、ftdi_
」
$ lsusb -t /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 5000M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M |__ Port 3: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 6: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 6: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M |__ Port 8: Dev 7, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M |__ Port 8: Dev 7, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M |__ Port 9: Dev 4, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M
UART//dev/
」/dev/
」udevadm
コマンドでプロパティを見れば、
$ udevadm info --name=/dev/ttyUSB0 | grep Digilent S: serial/by-id/usb-Digilent_Digilent_Adept_USB_Device_210279A42C65-if00-port0 E: DEVLINKS=/dev/serial/by-path/pci-0000:00:14.0-usb-0:8:1.0-port0 /dev/serial/by-id/usb-Digilent_Digilent_Adept_USB_Device_210279A42C65-if00-port0 E: ID_MODEL=Digilent_Adept_USB_Device E: ID_MODEL_ENC=Digilent\x20Adept\x20USB\x20Device E: ID_SERIAL=Digilent_Digilent_Adept_USB_Device_210279A42C65 E: ID_VENDOR=Digilent E: ID_VENDOR_ENC=Digilent
screen
コマンドをインストールしていれば、
$ sudo screen /dev/ttyUSB1 115200 zynq> uname -a Linux (none) 3.10.0-xilinx-14974-gb286654-dirty #12 SMP PREEMPT Tue Nov 5 21:58:53 PST 2013 armv7l GNU/Linux zynq> cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 0 (v7l) BogoMIPS : 1299.25 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x3 CPU part : 0xc09 CPU revision : 0 processor : 1 model name : ARMv7 Processor rev 0 (v7l) BogoMIPS : 1299.25 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x3 CPU part : 0xc09 CPU revision : 0 Hardware : Xilinx Zynq Platform Revision : 0000 Serial : 0000000000000000
この状態でボード上の
U-Boot 2013.04-dirty (Nov 14 2013 - 11:56:14) Memory: ECC disabled DRAM: 512 MiB WARNING: Caches not enabled MMC: zynq_sdhci: 0 SF: Detected S25FL129P_64K with page size 64 KiB, total 16 MiB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial Net: Gem.e000b000 Hit any key to stop autoboot: 0 Copying Linux from QSPI flash to RAM... SF: Detected S25FL129P_64K with page size 64 KiB, total 16 MiB ## Booting kernel from Legacy Image at 03000000 ... Image Name: Linux-3.10.0-xilinx-14974-gb2866 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 3126272 Bytes = 3 MiB Load Address: 00008000 Entry Point: 00008000 Verifying Checksum ... OK ## Loading init Ramdisk from Legacy Image at 02000000 ... Image Name: Image Type: ARM Linux RAMDisk Image (gzip compressed) Data Size: 3692769 Bytes = 3.5 MiB Load Address: 00000000 Entry Point: 00000000 Verifying Checksum ... OK ## Flattened Device Tree blob at 02a00000 Booting using the fdt blob at 0x02a00000 Loading Kernel Image ... OK OK Loading Ramdisk to 1f7cf000, end 1fb548e1 ... OK Loading Device Tree to 1f7c9000, end 1f7ce1e9 ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. Booting Linux on physical CPU 0x0 Linux version 3.10.0-xilinx-14974-gb286654-dirty (Sham@TheFootball) (gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-50) ) #12 SMP PREEMPT Tue Nov 5 21:58:53 PST 2013 CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache Machine: Xilinx Zynq Platform, model: Xilinx Zynq Platform (中略) EXT2-fs (ram0): warning: mounting unchecked fs, running e2fsck is recommended VFS: Mounted root (ext2 filesystem) on device 1:0. devtmpfs: mounted Freeing unused kernel memory: 172K (c0552000 - c057d000) Starting rcS... ++ Mounting filesystem ++ Setting up mdev ++ Configure static IP 192.168.1.10 ++ Starting telnet daemon ++ Starting http daemon ++ Starting ftp daemon ++ Starting dropbear (ssh) daemon ++ Exporting LEDs & SWs rcS Complete zynq>
上記ログにもあるようにルートファイルシステムps
コマンドを実行すると、
525 root 0:00 telnetd -l /bin/sh 531 root 0:00 httpd -h /var/www 532 root 0:00 tcpsvd 0:21 ftpd ftpd -w / 538 root 0:00 dropbear
個々のパーツやその機能については、
LXD上にVivadoをインストール
FPGAの回路をデザインしプログラムするために、
そこでまずはXilinxのサイトからVivadoのインストーラーをダウンロードしてください。サイトのリンクをたどって
インストーラー自体は86MB程度ですが、
xilinxコンテナの作成
今回はこれらのプロプライエタリのバイナリをLXD上のコンテナにインストールして使うことにします。ちなみにLXD上である必要性はなく、
LXDを使う場合に気をつけなければいけないのは、
$ sudo apt -t xenial-backports install lxd
もし初めてLXDをインストールした場合は、
$ sudo lxd init (基本的にすべての既定の選択肢をそのまま選ぶ)
設定が終わったら、xenial.
」
#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公開鍵を登録済みであれば
最後にインストールしているパッケージは、xenial.
に書いてもかまいません。
あとはlxc list
」
$ ssh -X ubuntu@(xilinxコンテナのアドレス)
これ以降は、
Vivadoインストーラーの起動
Vivadoインストーラーは--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/
」
$ sudo mkdir -p /opt/Xilinx $ sudo chown -R ubuntu: /opt/Xilinx $ ./Xilinx_Vivado_SDK_2017.1_0415_1_Lin64.bin
しばらく待つと、





一通り入力が終わったら、
インストールが完了したら環境変数設定ファイルを読み込み、vivado
コマンドで起動します。
$ source /opt/Xilinx/Vivado/2017.1/settings64.sh $ vivado
無事に以下の画面が表示されたらインストール完了です。実際に使う前に一度Vivadoを終了して、

ボードファイルのインストール
「ボードファイル」
$ 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の書き込みには、
Zyboの場合は普通のUSBケーブルをそのまま使えるため、
そこでインストールスクリプトを実行する代わりにホスト側において/etc/
」
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{manufacturer}=="Digilent", MODE:="666"
なお、
設定ファイルを作成したら、
$ sudo udevadm control --reload
さらにZyboの電源を入れて、
$ 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デバイスを認識したら自動的に、/dev/
」
もし/dev/
」
$ 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
」
FPGAサンプルプログラムを動かす
最後にVivadoを使って実際にFPGAの回路を作成し、
Zyboの場合、
一番わかりやすいのは、
- PL側に2つのAXI GPIOを用意する
- 1つのAXI GPIOはデュアルチャンネル設定とし、
4つのボタン ( btns_
)4bits と4つのスイッチ ( sws_
)4bits に接続する - 1つのAXI GPIOはシングルチャネル設定とし、
4つのLED ( leds_
)4bits に接続する - PL側にAXI Interconnectを用意する
(IPコアのデータシートPDF) - AXI InterconnectをPS側のAXIの汎用ポートの1つ
( M_
)AXI_ GP0 に接続する (PS側がマスター) - AXI InterconnectとAXI GPIOを接続する
(AXI Interconnect側がマスター)





回路をデザインしたら、
SDKへのエクスポートが完了したら、
- スイッチのGPIOの値を読む
- その値をLEDのGPIOにセットする
- ボタンのGPIOの値を読む
- 値にあわせてコンソールに押されたボタンの番号を表示する
- 上記を200ミリ秒周期で繰り返す
PS側のロジックはこれだけです。


最後にJTAG経由でZyboにデータを送ります。まずZybo上のJP5を
XSDKのXilinx Toolsメニューから

Deviceがhw_
」
最後にPS側のロジックをビルド&実行しましょう。Project Explorerのプロジェクト名getting_
」)を右クリックし
今回は押されたボタンの番号がコンソールに表示されるため、/dev/
はscreen
で接続しておきます
$ screen /dev/ttyUSB1 115200
あとはスイッチ