Zedboard

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