FPGA

Xillybusを使ってLチカやってみた

自作PLをLinux上から操作するのにデバドラ書くのが大変...とこぼしていたら同僚がXillybus使ってみたらとアドバイスをくれたので,Xillybus使ってLチカをやってみました.Xillybusを使うと,/dev以下に定義されているread/writeポートを使ってLinux上から自作PLにアクセスできるため,AXI busの設定,Device Treeの変更,デバドラ等,面倒な(というかやり方がまだわかってない)作業をしなくてすむとのこと.そして幸いなことに学術目的の利用は無料.

Zedboardだと,
Xillinuxという既にXillybus組み込み済みのLinux Distributionがあるので,それを利用する.インストールはGetting Startの資料を読んでその通りにやるだけだが,Vivado 2014.2で試したら,XillybusのIPにロックがかかっているらしく,合成がうまくいかなかったので,指示通りVivado 2014.1で合成した.

やったことは3つ.
  • PSからのメッセージに従いLEDをチカらせるled_if.vをプロジェクトに追加する
  • xillydemo.vでloopbackになっている8bit幅のFIFOを2つに分け,間にled_ifを接続する.もちろん合成も.改変後のxillydemo.vはこれ
  • Xillybusを使ってLチカさせるCプログラム(led_fifo8.c)を作成する

CプログラムはZedboard上にある8個のLEDを右から順に点灯させるようにし,
さらにLEDに設定した値をフィードバックしてコンソールに表示させるようにした.
以下にled_fifo8.cを記す.

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>

int main(int argc, char *argv[]) {

int fdr, fdw, i;
unsigned char t;
unsigned char p, q;

fdr = open("/dev/xillybus_read_8", O_RDONLY);
fdw = open("/dev/xillybus_write_8", O_WRONLY);

if ((fdr < 0) || (fdw < 0)) {
perror("Failed to open Xillybus device file(s)");
exit(-1);
}

for (i = 0; i < 8; i++)
{
t = 1 << i;
write(fdw, &t, sizeof(t)+1);
read(fdr, &p, sizeof(p));
read(fdr, &q, sizeof(q));
printf("Send: 0x%02x Retn: 0x%02x 0x%02x\n", t, p, q);
sleep(1);
}

close(fdr);
close(fdw);

return 0;
}

次にコンパイルだが,'-static'オプションなしだと実行できなかったので,以下の様に静的リンクで行った.
$ arm-xilinx-linux-gnueabi-gcc led_fifo8.c -o test -static


以下がZedboard上で動いているXillinuxでの実行結果である.
root@localhost:~# ./test 
Send: 0x01 Retn: 0x00 0x01
Send: 0x02 Retn: 0x04 0x02
Send: 0x04 Retn: 0x04 0x04
Send: 0x08 Retn: 0x04 0x08
Send: 0x10 Retn: 0x04 0x10
Send: 0x20 Retn: 0x04 0x20
Send: 0x40 Retn: 0x04 0x40
Send: 0x80 Retn: 0x04 0x80

ご覧の通り,フィードバック時にx00と0x04が混入されてしまっている(読み出しの変数を2個にしているのはそのため).
私がxillydemo.vに加えたFIFOを操作するインタフェースの記述がおかしいのか,
はたまたLinuxでは0x04(ASCIIのEOT)がテキストの最後に付加されてしまうからか,
理由はまだわかっていないので,有識者にコメントを頂けたらと思っています.
Comments

Embedded Linux® Hands-on Tutorial for the ZYBO をやってみた

ZedboardZyboで,Linuxから自作IPを使う方法がわからず悩んでいたところ,digilentのチュートリアルがよさそうとのアドバイスをFPGAの部屋のmarseeさんからいただいのでやってみました.ドラフト版が’Embedded Linux Tutorial - Zybo’というタイトルでここにありますが,このポストではオフィシャルドキュメント(July 17, 2014版)の方に沿って進めていきます.

内容はZybo上にLinuxをインストールし,デバイスドライバ経由でボード上のLEDを点灯させるというもの.
なおチュートリアルはMac上のVMwareにインストールしたUbuntu 14.04 64bitで,Vivado 2014.2を動かして行いました.

以下では躓いた点や気になった所を紹介します.各インデックスはドキュメントのセクションに対応しています.

1.2 2-3

チュートリアルで用いるzybo_base_system.zipはVivado 2013.4用のプロジェクトのため,開くとプロジェクトをアップグレードするかと聞かれるので,Automatic Upgrade... を選択する.すると今度はIPをアップグレードするかと聞かれるので,Report IP StatusでIP Statusを確認し,IPを全てアップグレードする.

1.2 5

Figure 11の画面からNextボタンで進むと,3択画面になるので,Create a new AXI4 peripheral を選択する.

1.2 16

Address Editor上でmyLed_0はUnmapped slavesのままなので,myLed_0を選択してAuto Assign Addressを実行する.実行後はFigure 62のようになる.Bitstreamの生成を始めるとCritical warningがどうのこうのと言われるがOKにしてすすめる.

2.2 2

Figure 34 の1行目のmakeのオプションは zynq_ZYBO_config ではなく,zynq_zybo_config (全て小文字)とする
※2014-08-30 marseeさんのご指摘により追記
$ make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config

3.2 1

Vivado 2014.2にはExport Hardware for SDKのコマンドが無いので,Export Hardwareをしてから,Launch SDKをする.出力先はデフォルトの

3.2 5

Target HardwareのHardware Platformがドキュメントと異なり,system_wrapper_hw_platform_0となっているが,気にしないで進む.

3.2 10

1つめはpartition typeをbootloaderにして <人それぞれ>/zybo_base_system/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/FSBL/Debug/FSBL.elf を追加し,次にsystem.bitではなく(見つからないので),<人それぞれ>/zybo_base_system/source/vivado/hw/zybo_bsd/zybo_bsd.sdk/system_wrapper_hw_platform_0/system_wrapper.bit を追加する.最後はドキュメントの通りに先ほど作成した u-boot.elf を追加する.Create Image を押すと上書きするか聞かれるのでOKにする.

4.2 1

Master-Next Branchを使うように書いてあるが,ドキュメントのgitコマンドだと落ちてこないので(zynq-zybo.dtsが無くて困る)‘git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git’でちゃんとMaster-Next Branchをチェックアウトする.
※2014-08-14現在,gitすると以下の様な感じ.
$ git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git
Cloning into 'Linux-Digilent-Dev'...
remote: Counting objects: 3586185, done.
remote: Compressing objects: 100% (549210/549210), done.
remote: Total 3586185 (delta 3007205), reused 3586185 (delta 3007205)
Receiving objects: 100% (3586185/3586185), 864.91 MiB | 2.66 MiB/s, done.
Resolving deltas: 100% (3007205/3007205), done.
Checking connectivity... done.
Checking out files: 100% (46147/46147), done.

4.2 4

U-Bootのコンパイルに使うmkimageをUbuntuはデフォルトで持ってないので,前もってsudo apt-get install u-boot-tools でmkimageをインストールする.(もしくは,Fig. 50のPathの追加を行ってもよい)

5.2 1

私の環境では,dtsファイルは arch/arm/boot/dts/zynq-zybo.dts(zyboが小文字).ファイルの中身もFigure 51と微妙に異なっていたので,編集せずそのまま利用した.そして ramdisk だが,ramdisk8M.image.gz が見当たらないので(ZYBO Linux Reference Design にイメージがあるって書いてあるけど,そのデザインが見当たりません),Zedboardのデザインにあったものを流用する.
実行したらFigure 52と同じバイトサイズになった.
$ mkimage -A arm -T ramdisk -c gzip -d ./ramdisk8M.image.gz uramdisk.image.gz
Image Name:
Created: Sat Aug 16 00:34:45 2014
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size: 3694108 Bytes = 3607.53 kB = 3.52 MB
Load Address: 00000000
Entry Point: 00000000

5.2 3

Figure 54はパスがめちゃくちゃに書いてある気がするけど,言われたとおり4つのファイルを適当なマイクロSDカードにコピー
$ cp devicetree.dtb <micro SDのマウント先>
$ cp Linux-Digilent-Dev/uramdisk.image.gz <micro SDのマウント先>
$ cp Linux-Digilent-Dev/arch/arm/boot/uImage <micro SDのマウント先>
$ cp zybo_base_system/sd_image/BOOT.bin <micro SDのマウント先>

5.2 4

私の環境では/dev/ttyUSB1がUARTのポートだったので,gtktermのポートをそれに併せて先のマイクロSDカードを挿したZyboを起動すると,無事にコンソール画面が出た(^^)/

6.2 3-4

オリジナルの myled.c はここからダウンロードできる.ただし,このままだとエラーが出てコンパイルできないので,先頭のinclude文に以下の8行目を追加.参考:編集後の myled.c

#include <linux/seq_file.h> /* Needed for Sequence File Operations */
#include <linux/platform_device.h> /* Needed for Platform Driver Functions */
#include <linux/slab.h> /* Needed for kmalloc and kfree */

6.2 5

Figure 64に従い zynq-zybo.dts を編集する.参考:編集後の zynq-zybo.dts
7.2 基本的にドキュメント通り.参考までにソースとMakefileを置いておく.
led_blink.c Makefile


疑問や今後の課題
  • ramdisk8M.image.gz でルートファイルシステムをRAM上に実現してるっぽいけど,SD card上にファイルシステムを構築するにはどうすればいいのか?
  • ZyboのPSを変更しない限りは,PLにいろいろ自作IPを追加しようとも,今回のFSBLを使い続けられるのか?
  • XillinuxとかではフルのUbuntuが動いてるけど,dtsファイルやカーネルのconfigファイルをどうしているんだろう...
  • Digilent Linuxのネットワーク設定を行い,NFSサーバのマウント,クライアントマシンでのSSH接続ができるかの確認.
Comments