FC2カウンター FPGAの部屋 2015年02月

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

FPGAの部屋のブログが400万アクセスを達成しました

FPGAの部屋のブログが400万アクセスを達成しました。皆さん、見て頂いてありがとうございました。

記念に月別アクセス数の記録の残っている2006年5月から2015年1月までの月別アクセス数の変遷をグラフにしてみました。
FPGAsRoom_access_2008_2015_1_150228.png

2006年から2009年までは順調にアクセス数が増加しています。その後は横ばいで、大きく変動していところもありますが、2015年はアクセス数が伸びている気がします。やはりFPGAが注目を集めているのでしょうか?
  1. 2015年02月28日 05:08 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

”Caffeで手軽に画像分類”の”Caffeを特徴抽出器として使った分類”をやってみた1

”Caffeで手軽に画像分類”の”リファレンスモデルでの分類”をやってみた”の続き。

Caffeで手軽に画像分類”の”Caffeを特徴抽出器として使った分類”をやってみることにした。

imagenet_deploy.prototxt を imagenet_feature.prototxt としてコピーするのだが、caffe/examples/imagenet ディレクトリに imagenet_deploy.prototxt が見つからない。

検索したら、ここにあった
caffe_examples_12_150226.png

gedit imagenet_deploy.prototxt で gedit を立ち上げてコピペをした。
caffe_examples_13_150226.png

これで、imagenet_deploy.prototxt ができたので、下のコマンドで imagenet_feature.prototxt にコピーした。
cp examples/imagenet/imagenet_deploy.prototxt examples/imagenet/imagenet_feature.prototxt

gedit で、imagenet_feature.prototxt を編集した。変更箇所をピンクのアンダーラインで示す。
gedit examples/imagenet/imagenet_feature.prototxt
caffe_examples_15_150226.png

gedit で、feature.py を作成した。
gedit feature.py
caffe_examples_16_150226.png

caffe_examples_17_150226.png

特徴抽出を実行するPythonスクリプトを実行するとエラーになった。
python feature.py 101_ObjectCategories/airplanes/image_0001.jpg
caffe_examples_18_150226.png

エラー内容は以下の通り。

Traceback (most recent call last):
  File "feature.py", line 3, in <module>
    import sys, os, os.path, numpy, caffe
ImportError: No module named caffe


caffe_examples_18_150226.png

エラー内容を検索すると、”[Ubuntu | Python wrapper]: cannot "import caffe" #720”がヒットした。
[Ubuntu | Python wrapper]: cannot "import caffe" #720””に従って、.bashrc を編集した。
gedit ~/.bashrc
.bashrc ファイルに export PYTHONPATH=/home/ono/Deep_Learning/caffe/python を追加した。
caffe_examples_19_150226.png
source ~/.bashrc を実行して、設定内容を反映させた。

また、エラーが出た。今度は、set_phase_test の属性が無いというエラーだった。

AttributeError: 'Classifier' object has no attribute 'set_phase_test'


caffe_examples_20_150226.png

エラーを検索すると、”AttributeError: 'Classifier' object has no attribute 'set_phase_test'”が見つかった。
それによると、 net.set_phase_test() を caffe.set_phase_test() にすれば良いらしい?
もう一度、python feature.py 101_ObjectCategories/airplanes/image_0001.jpg を実行すると、set_mode_cpu() でもエラーが出たので、caffe.set_mode_cpu() に変更した。
結局、12行目と13行目を下のように変更した。

caffe.set_phase_test()
caffe.set_mode_cpu()


caffe_examples_21_150226.png

これで、特徴抽出を実行するPythonスクリプトを実行するとうまく行った。
値が見えないので、もう一度、特徴抽出を実行するPythonスクリプトをパイプして less に入れた。
python feature.py 101_ObjectCategories/airplanes/image_0001.jpg | less
caffe_examples_22_150226.png

見きれないので、特徴抽出を実行するPythonスクリプトの出力を temp.txt に出力した。
python feature.py 101_ObjectCategories/airplanes/image_0001.jpg > temp.txt
caffe_examples_23_150226.png

数値はすべて1行に書かれている。これを、libsvmフォーマットにする必要がある。
  1. 2015年02月26日 17:31 |
  2. Deep Learning
  3. | トラックバック:0
  4. | コメント:0

ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル2

ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル”の続き。

前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPのAXI4 Lite Slave ポートにアクセスしたが、バスエラーになってしまった。今回はその原因を探った。

原因は分かった。”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)”で Creater Zynq Boot Image ダイアログが開いた時の画面を見ると、V_ZYBO_CAMDfL_wrapper_hw_platform_0\V_ZYBO_CAMfL_wrapper.bit が入っている。
Vivado_HLS_lap_filter_49_150213.png

Vivado HLS で作ったラプラシアンフィルタIPを追加した時の Vivado からSDK にハードウェアをエクスポートした時に、V_ZYBO_CAMDfL_wrapper_hw_platform_1 ができてしまったので、V_ZYBO_CAMDfL_wrapper_hw_platform_0 は古いハードウェア・プラットフォームになった。
Vivado_HLS_lap_filter_47_150213.png

よって、以前のビットストリームをBOOT.bin として同梱してしまったようだ。

もう一度、V_ZYBO_CAMDfL_wrapper_hw_platform_1\V_ZYBO_CAMfL_wrapper.bit を入れてBOOT.bin を作り直すことにする。

まずは、V_ZYBO_CAMDfL_wrapper_hw_platform_0 から FSBLが作られていると思うので、FSBL と FSBL_bsp を一旦消去した。

FSBL と FSBL_bsp を Hardware Platform をV_ZYBO_CAMDfL_wrapper_hw_platform_1 として作りなおした。
Vivado_HLS_lap_filter_65_150224.png

次に、BOOT.bin を作りなおした。
Vivado_HLS_lap_filter_64_150224.png

新しいBOOT.bin をMicroSDカードの第1パーティション ZYBO_BOOT のBOOT.bin と入れ替えた。
MicroSDカードをZYBO に挿入して電源ONした。

SSHで linaro ユーザーとしてログインした。

Apps ディレクトリに入って ./cam_disp_uio を実行してカメラ画像を表示した。

lap_fil_hls_1shot ディレクトリに入って、./lap_fil_hls_1shot を実行して、Vivado HLS 2014.4 で生成したラプラシアンフィルタIPを起動した。

起動後、激しく画面が乱れた。
lap_fil_hls_test_5_150225.jpg

約28秒間画面が乱れた後にラプラシアンフィルタ処理された画像が表示された。
lap_fil_hls_test_6_150225.jpg

経過時間は 27.6 秒だった。長すぎる。なにかおかしい?(追記参照)(制御ソフトの lap_fil_hls_1shot.c は”ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル”記事を参照下さい)
lap_fil_hls_test_7_150225.png

./lap_fil_hls_1shot を実行して、Vivado HLS 2014.4 で生成したラプラシアンフィルタIPを起動して、画面が乱れいている時は、コンソールでは、5 を表示した所で止まっている。
lap_fil_hls_test_8_150225.png

これは、

while(!XLap_filter_axim_IsDone(lap_fil_lsalvep)) ;

で止まっていることになる。
つまり、done ビットが 1 になるまで待っているルーチンなので、ラプラシアンフィルタ処理の終了までに28秒近くかかったことになる。

次は、独自の処理ソフトウェアで、どうなるかをみてみよう。
2015/02/27 追記:Vivado HLS 2014.4 の生成した C で書かれたドライバーを読んでみたが、至極妥当なコードだった。これで動作しなければ、自作ドライバー・ソフトウェアも動作しない。

(追記) Vivado HLS で合成したラプラシアンフィルタの処理時間が27秒かかるバグの原因は、古いバグありラプラシアンフィルタのCソースコードを使用したためでした。正しいラプラシアンフィルタのCソースコードについては、”Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション3(原因が分かった)”をご覧ください。

とりあえず、バグ無しのラプラシアンフィルタ処理を実行した経過については、”ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル4(うまく行った)”をご覧ください。
  1. 2015年02月24日 05:51 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル

Linaro Ubuntu14.04LTSが動作してるZYBOへWindowsのSDKからリモートデバックする”の続き。

前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPの制御ソフトウェアを作製し、Windows 7 上のSDKから、Ubuntu 14.04 LTS の動作しているZYBO にSSH接続によるリモート・デバックを試みたが、うまく行かなかった。
いろいろとアプリケーションをインストールもしてみた。

gdb
gdbserver
nfs-kernel-server
iptables

sudo iptables -L で iptables の設定を出そうとしたが、エラーだったので、この辺りがおかしいのかもしれない。
lap_fil_hls_test_1_150223.png

”/lib/modules/3.14.0-xilinx-13567-g906a2c9-dirty/modules.builtin.bin”を開こうとしてエラーになっているので、やはり、Digilent のLinux カーネルのビルドの時に
make modules
の一部が必要なのかもしれない?これで生成されたすべてを追加するとLinuxの起動がおかしくなってしまう。
ip_tables モジュールが見つからないと言われているし。

SDKのリモート・デバックに使うTCP番号が許可されていないのかな?と今のところ思っている。

ちなみに、/lib/modules/3.14.0-xilinx-13567-g906a2c9-dirty ディレクトリに行っても、modules.builtin.bin は無かった。
lap_fil_hls_test_2_150223.png

さて、SDKでのリモート・デバックがとりあえず、できないので、ZYBO のLinux 上で制御ソフトをコンパイルして動作させることにした。

Makefile は書いたことが無いので、”Makefile の書き方 (C 言語)”を参考にして、本当に簡単なMakefile を作ってみた。
Makefile を下に示す。

# Makefile

.PHONY: all
all: lap_fil_hls_1shot

lap_fil_hls_1shot: lap_fil_hls_1shot.o xlap_filter_axim_linux.o xlap_filter_axim.o
    gcc -Wall -o lap_fil_hls_1shot lap_fil_hls_1shot.o xlap_filter_axim_linux.o xlap_filter_axim.o

lap_fil_hls_1shot.o: lap_fil_hls_1shot.c
    gcc -c lap_fil_hls_1shot.c

lap_fil_hls_1shot.o: xlap_filter_axim.h

xlap_filter_axim_linux.o: xlap_filter_axim_linux.c
    gcc -c xlap_filter_axim_linux.c

xlap_filter_axim_linux.o: xlap_filter_axim.h

xlap_filter_axim.o: xlap_filter_axim.c
    gcc -c xlap_filter_axim.c

xlap_filter_axim.o: xlap_filter_axim.h

.PHONY: clean
clean: 
    rm -f lap_fil_hls_1shot lap_fil_hls_1shot.o xlap_filter_axim_linux.o xlap_filter_axim.o


このMakefile を使って、コンパイルを行った。なお、Apps/lap_fil_hls_1shot ディレクトリで作業を行っている。
lap_fil_hls_test_3_150223.png

上のApps ディレクトリで、./cam_disp_uio コマンドでカメラ表示ハードウェアを起動してから、
./lap_fil_hls_1shot コマンドでVivado HLS 2014.4 で作製したラプラシアンフィルタIPを起動したが、Bus error で落ちてしまう。
そこで、printf() を入れるてデバックをすることにした。
lap_fil_hls_1shot.c を下に示す。。

// lap_fil_hls_1shot.c
// by marsee
// 2015/02/19

#include "xlap_filter_axim.h"

#define CMA_START_ADDRESS           0x17800000
#define VIDEO_BUFFER_START_ADDRESS  0x18000000  // Limit 0x18800000, 800*600*4 = 2MBytes * 2
#define LAPLACIAN_FILTER_ADDRESS    0x18200000  // 800*600*4 = 0x1d4c00

int main() {
    unsigned int fb_addr, next_frame_addr;
    struct timeval start_time, temp1, temp2, end_time;
    XLap_filter_axim lap_fil_lsalve, frame_buf, bitmap_dispc;
    XLap_filter_axim *lap_fil_lsalvep, *frame_bufp, *bitmap_dispcp;
    u32 a;
 
    gettimeofday(&start_time, NULL);

    lap_fil_lsalvep = &lap_fil_lsalve;
    frame_bufp = &frame_buf;
    bitmap_dispcp = &bitmap_dispc;

    printf("0"); fflush(stdout);

    // Initialization of bitmap display controller
     if (XLap_filter_axim_Initialize(bitmap_dispcp, "bitmap_display_cntrler_axim") != XST_SUCCESS){
        fprintf(stderr, "bitmap_display_cntrler_axim open error\n");
        exit(-1);
    }
   
       a = *(volatile u32 *)(bitmap_dispcp->Bus_axi4ls_BaseAddress);
       printf("%d\n", a);
    printf("1"); fflush(stdout);

    // Initialization of frame_buffer
    if (XLap_filter_axim_Initialize(frame_bufp, "frame_buffer_bmdc") != XST_SUCCESS){
        fprintf(stderr, "frame_buffer_bmdc open error\n");
        exit(-1);
    }
    fb_addr = (unsigned int)frame_bufp->Bus_axi4ls_BaseAddress + (unsigned int)(VIDEO_BUFFER_START_ADDRESS-CMA_START_ADDRESS);

    // frame buffer for laplacian filter result
    next_frame_addr = (unsigned int)frame_bufp->Bus_axi4ls_BaseAddress + (unsigned int)(LAPLACIAN_FILTER_ADDRESS-CMA_START_ADDRESS);

    printf("2"); fflush(stdout);

    // Initialization of lap_filter_axim
    if (XLap_filter_axim_Initialize(lap_fil_lsalvep, "lap_filter_axim_hls") != XST_SUCCESS){
        fprintf(stderr, "lap_filter_axim_hls open error\n");
        exit(-1);
    }

    printf("3"); fflush(stdout);
    
    
       a = *(volatile u32 *)(lap_fil_lsalvep->Bus_axi4ls_BaseAddress);
       printf("%d\n", a); fflush(stdout);
    
    XLap_filter_axim_Set_cam_addr(lap_fil_lsalvep, (u32)VIDEO_BUFFER_START_ADDRESS);

    printf("3"); fflush(stdout);

    XLap_filter_axim_Set_lap_addr(lap_fil_lsalvep, (u32)LAPLACIAN_FILTER_ADDRESS);

    printf("4"); fflush(stdout);

    XLap_filter_axim_Start(lap_fil_lsalvep);

    printf("5"); fflush(stdout);

    while(!XLap_filter_axim_IsDone(lap_fil_lsalvep)) ;
    
    printf("6"); fflush(stdout);

    // Displayed the laplacian filter image
    *(volatile unsigned int *)bitmap_dispcp->Bus_axi4ls_BaseAddress = (unsigned int)LAPLACIAN_FILTER_ADDRESS;

    if (XLap_filter_axim_Release(lap_fil_lsalvep) != XST_SUCCESS){
        fprintf(stderr, "lap_filter_axim_hls release error\n");
        exit(-1);
    }
    
    if (XLap_filter_axim_Release(frame_bufp) != XST_SUCCESS){
        fprintf(stderr, "frame_buffer_bmdc release error\n");
        exit(-1);
    }

    if (XLap_filter_axim_Release(bitmap_dispcp) != XST_SUCCESS){
        fprintf(stderr, "bitmap_display_cntrler_axim release error\n");
        exit(-1);
    }

    // Displayed the procee past time
    gettimeofday(&end_time, NULL);
    if (end_time.tv_usec < start_time.tv_usec) {
        printf("total time = %ld.%06ld sec\n", end_time.tv_sec - start_time.tv_sec - 11000000 + end_time.tv_usec - start_time.tv_usec);
    }
    else {
        printf("total time = %ld.%06ld sec\n", end_time.tv_sec - start_time.tv_sec, end_time.tv_usec - start_time.tv_usec);
    }

    return(0);
}


上の printf() デバックが入っている状態で実行すると、
0 を表示してから、ビットマップ・ディスプレイ・コントローラーの先頭番地をRead した値の”402653184”を読んで、1 2 3 を表示してから、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPのAXI4 Lite Slave アドレスをRead した所で Bus error になっている。
lap_fil_hls_test_4_150223.png

これは、ラプラシアンフィルタIPがビットストリームに入っていないか?それともラプラシアンフィルタIPがおかしいのか?という原因が考えられる。そう言えば、安心しきって、シミュレーションも行っていない。
最初にVivado がビットストリームが生成されているか?を調べて、入っていたらシミュレーションをしてみようと思う。
  1. 2015年02月23日 05:33 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0

食器洗い洗浄機を買い替えました

十数年間、サンヨーの食器洗い洗浄機 DW-S2100 を使ってきましたが、最近、頻繁にE3 やU3 エラーが出るようになったので、食器洗い洗浄機を買い替えました。
買ったのは、Panasonic の NP-TM7 です。もう、据置型の食器洗い洗浄機はPanasonic しか作っていないし、高さの制限の関係で、NP-TM7 が1択でした。
前の食器洗い洗浄機に比べて大きいです。幅とってますね。量は新しい食器洗い洗浄機の方が入る気がしますが、上下の棚なので、ナベとかは上に入れないと水流が上まで行かなそうです。長く大事に使おうと思います。
NP-TM7_1_150222.jpg

NP-TM7_2_150222.jpg
  1. 2015年02月21日 21:55 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ちたけそばを食べました

栃木県で食べらている「ちたけそば」がとっても美味しいということで食べたかったんですが、なかなか食べる機会が無くて食べられないでいました。
ちたけそばはチチタケが入ったそばで栃木県で食べられているそうです。
@felis_silv さんにアマゾンの日光将軍 ちたけつゆ 350ml×2本を教えてもらって注文しました。
昨日、そのちたけつゆで蕎麦を食べてみました。とっても美味しいつゆで、つゆも全部飲んじゃったんですが、どれがチチタケの味か?というとよく分かりません。とにかく言えることは味が良いということです。
後で、ぜひ本物のちたけそばを食べてみたいです。
  1. 2015年02月21日 21:45 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Linaro Ubuntu14.04LTSが動作してるZYBOへWindowsのSDKからリモートデバックする

Vivado 2014.4のCドライバーファイル1”、”Vivado 2014.4のCドライバーファイル2”でVivado HLS 2014.4 で生成されたラプラシアンフィルタIPのドライバを勉強した。
それを元に、制御用のCソフトウェアを作製できた。これは、Linaro Ubuntu14.04LTSの動作しているZYBO上でコンパイルしてもよいのだが、今回はパソコンのSDKからSSHでリモートデバックしてみようと思う。これは確か、前にやってみた時にデバック時にエラーが出たのだが、今回もう一度確かめてみようと思う。

Vivado 2014.4の使用するプロジェクトは、V_ZYBO_CAMDfL144/V_ZYBO_CAMDfL143 だ。詳しくは、”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)”を参照下さい。

・これが、V_ZYBO_CAMDfL144/V_ZYBO_CAMDfL143 プロジェクトだ。
ZYBO_SDK_Remote_Debung_1_150221.png

・File メニューからExport -> Export Hardware... を選択した。

・Export Hardware ダイアログが出た。Inclued bitstream にチェックが入っていることを確認して、OKボタンをクリックする。
ZYBO_SDK_Remote_Debung_2_150221.png

・Module Already Exported ダイアログが出る。Yesボタンをクリックした。

・File メニューから Export SDK を選択した。

・Launch SDK ダイアログが出た。OKボタンをクリックした。
ZYBO_SDK_Remote_Debung_3_150221.png

・SDKが立ち上がった。現在のSDKの画面の様子を下に示す。

・File メニューから New -> Application Project を選択した。(Application Project を生成する)

・New Project ダイアログで、Project Name に lap_fil_hls_1shot と入力し、Target Software の OS Platform のプルダウンメニューから linux を選択した。Next -> をクリックした。
ZYBO_SDK_Remote_Debung_5_150221.png

・Linux Empty Application を選択して、Finish ボタンをクリックした。
ZYBO_SDK_Remote_Debung_6_150221.png

・lap_fil_hls_1shot プロジェクトが作成された。
ZYBO_SDK_Remote_Debung_7_150221.png

・作製した lap_fil_hls_1shot.c と Vivado HLS 2014.4 の hls_lap_filter_axim\drivers\lap_filter_axim_v1_0\src のxlap_filter_axim.c, xlap_filter_axim.h, xlap_filter_axim_hw.h, xlap_filter_axim_linux.c を lap_fil_hls_1shot -> src フォルダにコピーした。

・自動的にビルドが始まって、終了した。ワーニングはあるがビルド成功。
ZYBO_SDK_Remote_Debung_8_150221.png

・lap_fil_hls_1shot プロジェクトを右クリックして、右クリックメニューからDebug as -> Debug Configurations を選択した。
ZYBO_SDK_Remote_Debung_9_150221.png

・Debug Configurationウイザードで、Remote ARM Linux Application を右クリックして右クリックメニューからNew を選択した。
ZYBO_SDK_Remote_Debung_10_150221.png

・Debug Configurationダイアログで、Connection のNew ボタンをクリックした。
ZYBO_SDK_Remote_Debung_11_150221.png

・New Connection ウイザードが開く。SSH Only をクリックした。Next -> ボタンをクリックした。
ZYBO_SDK_Remote_Debung_12_150221.png

・Host Name にZYBO の ifconfig で表示したDHCP の IPを入力した。(192.168.3.4)
・Description には、lap_fil_hls_1shot と入力した。
・Finishボタンをクリックした。
ZYBO_SDK_Remote_Debung_13_150221.png

・ Remote Absolute File Path for C/C++ Application のBrows... ボタンをクリックした。
ZYBO_SDK_Remote_Debung_14_150221.png

・ダイアログで、My Home を展開する。
ZYBO_SDK_Remote_Debung_15_150221.png

・User ID に linaro 、password に linaro を入れて、Save password をチェックした。
ZYBO_SDK_Remote_Debung_16_150221.png

・OKボタンをクリックした。Warning ダイアログが出た。Yesボタンをクリックした。
ZYBO_SDK_Remote_Debung_17_150221.png

・ /home/linaro ディレクトリが My Home として見えるようになった。
ZYBO_SDK_Remote_Debung_18_150221.png

・Apps ディレクトリの下にフォルダを作る。右クリックメニューからNew -> File をクリックした。
ZYBO_SDK_Remote_Debung_19_150221.png

・New file name: に lap_fil_hls_1shot と入力して、ファイルを作成した。
ZYBO_SDK_Remote_Debung_19_150221.png

・Apps フォルダの下に lap_fil_hls_1shot.elf が作成された。OKボタンをクリックした。
ZYBO_SDK_Remote_Debung_21_150221.png

・TeraTerm で確認するとルートの下にApps ディレクトリの下に lap_fil_hls_1shot.elf が作成されているのが見えた。
ZYBO_SDK_Remote_Debung_22_150221.png

・Debug Configuration に戻って、Apply ボタンをクリックした。
ZYBO_SDK_Remote_Debung_23_150221.png

・Debug ボタンをクリックして、Debug を開始した。
ZYBO_SDK_Remote_Debung_24_150221.png

・パースペクティブをデバックにスイッチするダイアログが出た。応答なしになっている。
ZYBO_SDK_Remote_Debung_25_150221.png

・パースペクティブをデバックにスイッチするダイアログのYesボタンをクリックしないうちに、Error Launching Program ダイアログが出た。OKボタンをクリックした。
ZYBO_SDK_Remote_Debung_26_150221.png

・パースペクティブをデバックにスイッチするダイアログのYesボタンをクリックした。

・SDKがデバックモードに変更されたが、デバックができない。
ZYBO_SDK_Remote_Debung_27_150221.png

・SDK Log のエラー内容を下に示す。

07:38:07 ERROR    : Unexpected error while launching program.
org.eclipse.core.runtime.CoreException: Target selection failed.
    at org.eclipse.cdt.debug.mi.core.AbstractGDBCDIDebugger.newCoreException(AbstractGDBCDIDebugger.java:215)
    at org.eclipse.cdt.debug.mi.core.GDBServerCDIDebugger2.startGDBServerSession(GDBServerCDIDebugger2.java:111)
    at org.eclipse.cdt.debug.mi.core.GDBServerCDIDebugger2.doStartSession(GDBServerCDIDebugger2.java:47)
    at org.eclipse.cdt.debug.mi.core.AbstractGDBCDIDebugger.createSession(AbstractGDBCDIDebugger.java:86)
    at com.xilinx.sdk.launch.remote.internal.RemoteLaunchDelegate.createCDISession(RemoteLaunchDelegate.java:354)
    at com.xilinx.sdk.launch.remote.internal.RemoteLaunchDelegate.debug(RemoteLaunchDelegate.java:223)
    at com.xilinx.sdk.launch.remote.internal.RemoteLaunchDelegate.launch(RemoteLaunchDelegate.java:161)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:858)
    at org.eclipse.debug.internal.core.LaunchConfiguration.launch(LaunchConfiguration.java:707)

  1. 2015年02月21日 08:44 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Vivado and ZYBO Linux勉強会用のソースファイル

Vivado and ZYBO Linux勉強会の必要なソースファイルを貼っておきます。

まずは、LED4ip_v1_0_S_AXI_user_logic追加分.v です。


    reg     [3:0]     LED_Display_Counter;
    reg     [31:0]  LED_Interval_Counter;
    reg     slv_reg_wren_1d;

    // slv_reg_wren_1d generate
    always @(posedge S_AXI_ACLK) begin
        if (~S_AXI_ARESETN)
          slv_reg_wren_1d <= 1'b0;
        else
          slv_reg_wren_1d <= slv_reg_wren;
    end

    //// Conteres
    // LED_Display_Counter
    always @(posedge S_AXI_ACLK) begin : proc_LED_Display_Counter
       if(~S_AXI_ARESETN) begin
            LED_Display_Counter <= 4'd0;
       end else begin
              if (slv_reg_wren_1d && axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB]==2'h1) // Counter Load
                  LED_Display_Counter <= slv_reg0[3:0]; // Error, slv_reg1[3:0]
               else if (slv_reg0[0]) begin // Enable
                if (LED_Interval_Counter == 32'd0)
                    LED_Display_Counter <= LED_Display_Counter + 4'd1;
            end
       end
    end
    assign LED4bit = LED_Display_Counter;

    // LED_Interval_Counter
    always @(posedge S_AXI_ACLK) begin : proc_LED_Interval_Counter
       if(~S_AXI_ARESETN) begin
            LED_Interval_Counter <= 32'd0;
       end else begin
            if (slv_reg0[0]) begin // Enable
                if (LED_Interval_Counter == 32'd0)
                    LED_Interval_Counter <= slv_reg3;
                else
                    LED_Interval_Counter <= LED_Interval_Counter - 32'd1;
            end else
                LED_Interval_Counter <= slv_reg3;
       end
    end


led4_axi_lite_slave.c です。

/*
 * led4_axi_lite_slave.c
 *
 *  Created on: 2013/12/16
 *      Author: Masaaki
 */

#include <stdio.h>
#include "xil_types.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_exception.h"
#include "xscugic.h"

#define XPAR_LED4IP_0_S_AXI_BASEADDR 0x43C00000

extern char inbyte(void);

int main() {
    int inbyte_in;
    int val;

    while(1){
        print("********************** LED4 TEST Start ***********************\n\r");
        print("TeraTerm: Please Set Local Echo Mode.\n\r");
        print("Press '1' to show all registers\n\r");
        print("Press '2' to set LED4 Enable or Disable(Toggle, Command Register)\n\r");
        print("Press '3' to set LED Counter Load Register (4bits, Please input hexadecimal)\n\r");
        print("Press '4' to set LED Interval Register (32bits, Please input decimal)\n\r");
        print("Press '5' to exit\n\r");
        print("Selection : ");
        inbyte_in = inbyte();
        print(" \r\n");
        print(" \r\n");

        switch(inbyte_in) {
            case '1' : // Show all registers
                val = (int)Xil_In32((u32)XPAR_LED4IP_0_S_AXI_BASEADDR);
                printf("Command Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(XPAR_LED4IP_0_S_AXI_BASEADDR+4));
                printf("LED Counter Load Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(XPAR_LED4IP_0_S_AXI_BASEADDR+8));
                printf("LED Monitor Register is %x\r\n", val);
                val = (int)Xil_In32((u32)(XPAR_LED4IP_0_S_AXI_BASEADDR+0xc));
                printf("LED Interval Register is %d (decimal)\r\n", val);
                break;
            case '2' : // Set LED4 Enable or Disable(Toggle, Command Register)
                val = (int)Xil_In32((u32)XPAR_LED4IP_0_S_AXI_BASEADDR);
                if (val & 1) {
                    Xil_Out32((u32)XPAR_LED4IP_0_S_AXI_BASEADDR, (u32)0);
                    print("LED4 count is Disable\n\r");
                } else {
                    Xil_Out32((u32)XPAR_LED4IP_0_S_AXI_BASEADDR, (u32)1);
                    print("LED4 count is Enable\n\r");
                }
                break;
            case '3' : // Set LED Counter Load Register (4bits, Please input hexadecimal)
                print("Please input LED Counter Load Register value (hexadecimal)");
                scanf("%x", &val);
                Xil_Out32((u32)(XPAR_LED4IP_0_S_AXI_BASEADDR+4), (u32)val);
                print(" \r\n");
                break;
            case '4' : // Set LED Interval Register (32bits, Please input hexadecimal)
                print("Please input LED Interval Load Register value (decimal) ");
                scanf("%d", &val);
                Xil_Out32((u32)(XPAR_LED4IP_0_S_AXI_BASEADDR+0xc), (u32)val);
                print(" \r\n");
                break;
            case '5' : // exit
                print("exit\r\n");
                return 0;
        }
        print(" \r\n");
    }

}


led4_axi_lslave_linux.c です。

/*
 * led4_axi_lslave_linux.c
 *
 *  Created on: 2014/12/30
 *      Author: Masaaki
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>

char inbyte(void){
    char in_data;
    int ret_val;
    
    in_data = getc(stdin);
    if (in_data == '\n')
        in_data = getc(stdin);
    return(in_data);
};

int main() {
    int inbyte_in;
    int val;
    int fd;
    volatile unsigned int *led4_base;

    // LED4 (UIO0)
    fd = open("/dev/uio0", O_RDWR); // LED4
    if (fd < 1){
        fprintf(stderr, "/dev/uio0 open error\n");
        exit(-1);
    }
    led4_base = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (!led4_base){
        fprintf(stderr, "LED4 mmap error\n");
        exit(-1);
    }
    
    while(1){
        printf("********************** LED4 TEST Start ***********************\n");
        printf("TeraTerm: Please Set Local Echo Mode.\n");
        printf("Press '1' to show all registers\n");
        printf("Press '2' to set LED4 Enable or Disable(Toggle, Command Register)\n");
        printf("Press '3' to set LED Counter Load Register (4bits, Please input hexadecimal)\n");
        printf("Press '4' to set LED Interval Register (32bits, Please input decimal)\n");
        printf("Press '5' to exit\n");
        printf("Selection : ");
        inbyte_in = inbyte();
        printf(" \n");
        printf(" \n");

        switch(inbyte_in) {
            case '1' : // Show all registers
                val = led4_base[0];
                printf("Command Register is %x\n", val);
                val = led4_base[1];
                printf("LED Counter Load Register is %x\n", val);
                val = led4_base[2];
                printf("LED Monitor Register is %x\n", val);
                val = led4_base[3];
                printf("LED Interval Register is %d (decimal)\n", val);
                break;
            case '2' : // Set LED4 Enable or Disable(Toggle, Command Register)
                val = led4_base[0];
                if (val & 1) {
                    led4_base[0] = 0;
                    printf("LED4 count is Disable\n");
                } else {
                    led4_base[0] = 1;
                    printf("LED4 count is Enable\n");
                }
                break;
            case '3' : // Set LED Counter Load Register (4bits, Please input hexadecimal)
                printf("Please input LED Counter Load Register value (hexadecimal)");
                scanf("%x", &val);
                led4_base[1] = val;
                printf(" \n");
                break;
            case '4' : // Set LED Interval Register (32bits, Please input hexadecimal)
                printf("Please input LED Interval Load Register value (decimal) ");
                scanf("%d", &val);
                led4_base[3] = val;
                printf(" \n");
                break;
            case '5' : // exit
                printf("exit\n");
                return 0;
        }
        printf(" \n");
    }
    munmap((void *)led4_base, 0x1000);
}


opencv_pre_install.sh はこの辺りを参照下さい。
  1. 2015年02月18日 06:27 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

Vivado and ZYBO Linux勉強会を開催

2015年(平成27年)2月16日(月)と2月17日(火)で、Vivado and ZYBO Linux勉強会を開催しました。

2015/12/09:追記 ”Vivado and ZYBO Linux勉強会用のソースファイル”にCソースコードなどが貼ってありますので、ご利用下さい。

月曜日のハードウェア編が6人、火曜日のソフトウェア編が3人でした。ちょっと人数的には寂しかったですが、熱心にやって頂きました。
2日目の勉強会はUIOドライバを使ってLEDでカウンタを作るところまでだったので、半日くらいで十分そうでした。ネットがつながっていれば、OpenCVのサンプルのコンパイルまでだと1日あっても終わらないかもしれません?コンパイルに時間が掛かるので。。。
ノートパソコンを持ってきてもらって、VirutalBoxをインストールして、その上にUbuntu14.04LTSをインストールして、その上にLinux版のVivado 2014.4 WebPACK をインストールすることが必須なので、ハードルが高いです。
例えば、どこかで集まって勉強会をやろうと思っても、たぶんこのハードルの高さから無理だと思います。

去年の勉強会は演習にXilinxのZedBoaredのチュートリアルを使っていたので公開できなかったのですが、今回のVivado and ZYBO Linux勉強会の演習は完全にオリジナルです。公開できると思います。

そこで、事前準備のマニュアルはあえて出さず(自力で出来る人が対象ということです)に、VirutalBoxをインストールして、その上にUbuntu14.04LTSをインストールして、その上にLinux版のVivado 2014.4 WebPACK をインストールし、軽量ディスクトップ環境のLXDEをインストール出来る人を対象にVivado and ZYBO Linux勉強会資料をslideshareで公開しようと思います。Linux版のVivado 2014.4のインストールはARMのツールチェーンを簡単に入れられるので必須です。ARMのツールチェーンが無いと、ARMプロセッサ用のU-bootやLinuxカーネルをコンパイルすることができません。
:VirtualBoxの設定ですが、クリップボードの共有とドラッグアンドドロップは双方向にしてあります。CPU数は2、メモリは2GB程度、HDDは50GB程度与えています。なお、Oracle_VM_VirtualBox_Extension_Packをインストールして、USB2.0 (EHCI)コントローラーを有効化しています)

このチュートリアルをやれば、以下のことができます。
但し、ZYBOボードで演習を行いますので、演習を行うにはZYBOボードが必要です。

LED4 AXI LITE SLAVEプロジェクト
Vivado のLEDカウンタのAXI Lite Slave カスタムIPをウィザードで作って、ベアメタルアプリケーションで動作

ZYBO Linuxハンズオン資料
ZYBO 用 u-boot のビルド
SDK で Boot.bin を作製
ZYBO 用 Linux カーネルのビルド
デバイス・ツリーのコンパイル
Micro SD カードのフォーマット
Ubuntu の ROOT File System のコピー
FAT32 パーティションへ必要なファイルをコピー
ZYBO に SD カードを挿して Linux をブート
ユーザーでログイン
LED をカウントアップするソフトウェアを実行(UIO の実習)

勉強会場ではLANがつながっていないので、ここまでだが、ここからはZYBOをLANに接続して行う。

NTP のインストール
SSH のインストール
Xming で X ウインドウを Windows で操作
OpenCV インストール
OpenCV サンプル・プログラムのコンパイル+顔認識アプリの実行
ZYBO 用の Linaro Ubuntu のバージョンを 12.11 から 14.04 LTS にアップグレード(おまけ)
ARMhf の Root File System を入れる(おまけ)

slideshare のVivado and ZYBO Linux勉強資料2 で公開しました。なお、ダウンロードはできなくなっています。どのくらいの方に見ていただいたのか?知りたいのとバグが直ぐに直せるからです。

この資料を作るにあたっては、たくさんのWebサイトを参照させて頂きました。また、たくさんの方にアドバイスを頂きました。本当にありがとうございました。問題がありましたらお知らせ下さい。
資料を作るにあたっては3週間程かかりました。まだ、どうしてこれをやるの?というところが書けてません。私もよくわからないところがありますので、知っている方はコメント欄などでお知らせ下さい。またご意見やバグ情報などをコメントとして教えて頂けると嬉しいです。

最後に、教育機関の方でこの勉強会資料を使って勉強会を開催したいという方に、WordやPowerPointの文章やコードのソースをほしいという方は個別対応でお送りしますので、FPGAの部屋のメールアドレスまでお知らせ下さい。

この勉強会資料はFPGAの部屋のブログに書いたことをまとめたものです。演習以外はブログを見ても同じことができますが、ブログでは試行錯誤しているし、他の話題も混ざっているので、書いた私以外は追うのが難しいと思います。それを、見やすく誰がやっても?できるように書き改めたのが、この勉強会資料です。資料を作るにあたっては、もう一度やり直して確認しているので、現時点では確実にできると思います。

Vivado and ZYBO Linux勉強会用のソースファイルを”Vivado and ZYBO Linux勉強会用のソースファイル”に貼っておきました。

2015/02/21 追記: slideshare で Vivado and ZYBO Linux勉強資料3 を公開しました。こちらは、PowerPoint がスライドにしてあるので、Vivado and ZYBO Linux勉強資料2 よりも見やすいと思います。

最後に slideshare だとコピペが出来ないと思うので、おまけとして長いコマンドをここに貼っておきます。

長いコマンドのコピー・アンド・ペースト用ファイル

1. ZYBO用u-bootのビルド
git clone -b master-next https://github.com/DigilentInc/u-boot-Digilent-Dev.git
make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zybo_config
make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
cp u-boot u-boot.elf

2. SDKでBoot.bin を作製

3. ZYBO用Linuxカーネルのビルド
git clone -b master-next https://github.com/DigilentInc/Linux-Digilent-Dev.git
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
PATH=$PATH:../u-boot-Digilent-Dev/tools/
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

4. デバイス・ツリーのコンパイル
cp arch/arm/boot/dts/zynq-zybo.dts
gedit zynq-zybo.dts

bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 uio_pdrv_genirq.of_id=generic-uio";
operating-points = <650000 1000000>;
led4_axi_lite_slave@43c00000 {
compatible = "generic-uio";
reg = < 0x43c00000 0x10000 >;
};
scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts

5. Micro SDカードのフォーマット(必要な人のみ)

6. Micro SDカードにパーティションを作る
sudo fdisk /dev/sdb
sudo mkfs.msdos -n ZYBO_BOOT /dev/sdb1
sudo mkfs.ext4 -L ROOT_FS /dev/sdb2

7. UbuntuのROOT File SystemをMicro SDカードへコピー
wget https://releases.linaro.org/archive/12.11/ubuntu/precise-images/ubuntu-desktop/linaro-precise-ubuntu-desktop-20121124-560.tar.gz
sudo tar --strip-components=3 -C /media/ono/ROOT_FS -xzpf linaro-precise-ubuntu-desktop-20121124-560.tar.gz binary/boot/filesystem.dir

8. FAT32パーティションへ必要なファイルをコピー
 uEnv.txt の入力
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

9. ZYBOにSDカードを入れてLinuxをブート

10. ユーザーでログイン

11. LEDをカウントアップするソフトウェアを実行(UIOの実習)
vi led4_axi_lslave_linux.c
cc -o led4_axi_lslave_linux led4_axi_lslave_linux.c
./led4_axi_lsalve_linux
ls -l /dev/uio*
sudo chmod 666 /dev/uio0
./led4_axi_lsalve_linux

12. NTPのインストール
apt-get update
apt-get update
apt-get install ntp
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
sudo vi /etc/ntp.conf

server -4 ntp.nict.jp minpoll 4 maxpoll 10

/etc/init.d/ntp restart

13. SSHのインストール
apt-get install ssh
vi /etc/ssh/sshd_config
/etc/init.d/ssh restart

14. XmingでXウインドウをWindowsで操作

15. OpenCVインストール
sudo apt-get install cmake
wget ftp://ftp.jp.netbsd.org/pub/pkgsrc/distfiles/opencv-2.4.6.1.tar.gz
tar xvzf opencv-2.4.6.1.tar.gz
cd opencv-2.4.6.1
mkdir build
cd build
cmake ..
make
sudo make install
sudo ldconfig

16. OpenCVサンプル・プログラムのコンパイル+顔認識アプリの実行
cd ../samples/c
./build_all.sh
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml" --scale=1.3 lena.jpg
  1. 2015年02月18日 04:25 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:8

Vivado 2014.4のCドライバーファイル2

Vivado 2014.4のCドライバーファイル1”の続き。

前回は、Vivado HLS 2014.4 で生成されたドライバーを使う方法について検討し、初期化ルーチン XLap_filter_axim_Initialize() の動作について考察した。今回は、初期化の後の関数の使用方法について検討する。

xlap_filter_axim_hw.h のコメントを見ると、大体の設定方法については予測がつく。下に、 xlap_filter_axim_hw.h のコメント部分を引用する。

// ==============================================================
// File generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2014.4
// Copyright (C) 2014 Xilinx Inc. All rights reserved.
// 
// ==============================================================

// BUS_AXI4LS
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of ap_return
//        bit 31~0 - ap_return[31:0] (Read)
// 0x18 : Data signal of cam_addr
//        bit 31~0 - cam_addr[31:0] (Read/Write)
// 0x1c : reserved
// 0x20 : Data signal of lap_addr
//        bit 31~0 - lap_addr[31:0] (Read/Write)
// 0x24 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


割り込み処理を使わずに、ラプラシアンフィルタの変換終了はポーリングでやる仕様のため、割り込み処理の設定は必要無い。
ラプラシアンフィルタで画像を変換するために、最初にやらなければいけないことは、

0x18 : Data signal of cam_addr と 0x20 : Data signal of lap_addr に、それぞれカメラのフレームバッファのアドレスとラプラシアンフィルタ変換後の画像のフレームバッファのアドレスをWrite することだ。

0x00 : Control signals には、bit 0 - ap_start (Read/Write/COH) に 1 を書けばラプラシアンフィルタの変換がスタートするはずだ。COH = Clear on Handshake なので、1 を書いても内部の処理で 0 に戻る。

ラプラシアンフィルタの変換が終了したら、0x00 : Control signals の bit 1 - ap_done (Read/COR) が 1 になる。COR = Clear on Read なので、ap_done は Read すると 0 に戻る。

通常は、返り値を読むために、0x10 : Data signal of ap_return を Read する。今回のラプラシアンフィルタでは、1 しか返さないので、Read する必要は無さそうだ。

以上の処理を、”Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする7(ソース公開)”では、自作したドライバー・ルーチンで処理を行っていたが、今回は、Vivado HLSで生成されたドライバーでラプラシアンフィルタの変換を行うための方法を探っていく。

Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日”(以下、高位合成ユーザーズガイドと呼ぶ)の 152 ページに”AXI4-Lite スレーブ インターフェイス をプログラムするのに最初に推奨される フ ロー”があって、レジスタ値を読み込むのに、 XExample_Set_a、XExample_Set_b、 XExample_Set_c_i を使用すると書いてある。a, b, c_i はアドレスをそれぞれ割り振られたポートなので、そのポートに書き込む関数があるらしい。

私のラプラシアンフィルタIPで言うと、xlap_filter_axim.c に XLap_filter_axim_Set_cam_addr() XLap_filter_axim_Set_lap_addr() があるので、これを使って、カメラのフレームバッファのアドレスとラプラシアンフィルタ変換後の画像のフレームバッファのアドレスをWrite する事ができる。
ちなみに、XLap_filter_axim_Get_cam_addr() XLap_filter_axim_Get_lap_addr() もセットであった。

次に XLap_filter_axim_Start() を使って、ラプラシアンフィルタの変換をスタートさせる。

ラプラシアンフィルタの変換が終了したかどうかは、XLap_filter_axim_IsDone() があるので、これを呼べば変換が終了したかどうかが分かるだろう。

高位合成ユーザーズガイドに書いてあるもう1つのフローのブロックの継続実行について検討してみた。これは、1度ラプラシアンフィルタの変換が終了しても、ソフトウェアの指示無しで、直ぐに次の変換を始めるという処理になる。

xlap_filter_axim.c の XLap_filter_axim_Set_cam_addr() XLap_filter_axim_Set_lap_addr() を使って、カメラのフレームバッファのアドレスとラプラシアンフィルタ変換後の画像のフレームバッファのアドレスをWrite する。

XLap_filter_axim_EnableAutoRestart() を使って、AutoRestart をイネーブルする。

ラプラシアンフィルタの変換が必要なくなったら、XLap_filter_axim_DisableAutoRestart() を使用して AutoRestart をディスエーブルする。
  1. 2015年02月16日 05:15 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado 2014.4のCドライバーファイル1

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)”で BOOT.bin や devicetree.dtb を生成した。

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)”で、BOOT.bin と devicetree.dtb を MicroSDカードの第1パーティション ZYBO_BOOT に入れて、ZYBOに挿入して電源をONすると、Ubuntu 14.04 LTS が無事に起動した。更に、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPのAXI4 Lite Slave バスが uio3 として認識されているのが分かった。

次は、Ubuntu14.04LTS 上で動く、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPを制御するソフトウェアを作製して、IPを動作させるフェーズに突入することになる。
ZedBoardでVivado HLS で高位合成したラプラシアンフィルタのIPを動作させるソフトウェアを作製済みである。(”Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする7(ソース公開)”参照)
これを UIO 用に修正してもよいのだが、Vivado HLS は、C のドライバーファイルを生成してくれるので、これを使わない手は無い。ということで、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日”(以下、高位合成ユーザーズガイドと呼ぶことにする)を読んで勉強することにした。

高位合成ユーザーズガイドの第1章高位合成、C ドライバーファイル、148ページに、C ドライバーファイルに着いて書かれている。
今回のラプラシアンフィルタのIPの名前は、lap_filter_axim だった。これを抑えておいて。
C:\Users\Masaaki\Documents\Vivado_HLS\lap_filter_axim_2014_4\solution1\impl\ip\drivers\lap_filter_axim_v1_0 フォルダを見ると、data フォルダと src フォルダがある。
Vivado_HLS_lap_filter_61_150215.png

data フォルダに入ると、

lap_filter_axim.mdd
lap_filter_axim.tcl

ファイルがあった。
Vivado_HLS_lap_filter_62_150215.png
.mdd ファイルはドライバー定義ファイルで、.tcl ファイルはソフトウェアをSDKに統合するためにSDKで使用するファイルだそうだ。(高位合成マニュアル参照)

src フォルダには、

Makefile
xlap_filter_axim.c
xlap_filter_axim.h
xlap_filter_axim_hw.h
xlap_filter_axim_linux.c
xlap_filter_axim_sinit.c

ファイルがあった。
Vivado_HLS_lap_filter_63_150215.png
xlap_filter_axim.c は、Linux スタンドアロン両方のStandard API イ ンプ リ メ ンテーシ ョ ン。
xlap_filter_axim.h は、Linux スタンドアロン両方のAPI 定義。
xlap_filter_axim_hw.h は、すべての内部レジスタのアドレスのオフセットを定義。コメントのみ”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2”に貼った。アドレスのオフセットのみが書いてある。
xlap_filter_axim_linux.c は、Linux用の初期化 API イ ンプ リ メ ンテーシ ョ ン。
xlap_filter_axim_sinit.c は、スタンドアロンの初期化 API イ ンプ リ メ ンテーシ ョ ン。
だそうだ。(高位合成ユーザーズガイド参照)

高位合成ユーザーズガイドの149ページの”表 1‐22 : C  ドライバーの API 関数”に使用できる API関数が書いてある。
まずは、使うのは初期化関数じゃないだろうか、その関数名はラプラシアンフィルタIPでは、int XLap_filter_axim_Initialize() である。
この関数は宣言がスタンドアロン (xlap_filter_axim_sinit.c) とLinux用 (xlap_filter_axim_linux.c) では違っている。
スタンドアロン (xlap_filter_axim_sinit.c) では、int XLap_filter_axim_Initialize(XLap_filter_axim *InstancePtr, u16 DeviceId) {
Linux用 (xlap_filter_axim_linux.c) では、int XLap_filter_axim_Initialize(XLap_filter_axim *InstancePtr, const char* InstanceName) {
となる。

詳細な解説は、高位合成マニュアルの”AXI4‐Lite スレーブの C  ドラ イバーのリフ ァ レンス” 417ページからの420ページの XDut_Initialize にある。
それによると、

InstancePtr : デバイス インスタンスへのポインター
DeviceId : xparameters.h で定義されたデバイス ID
InstanceName : uio デバイスの名前

だそうだ。

Linux用の XLap_filter_axim_Initialize() では、InstanceName に uio デバイスの名前を入れるそうなので、この場合は、”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)”の最後から2番めで、cat name した時の、lap_filter_axim_hls を入れるのだと思う。

Linux用の XLap_filter_axim_Initialize() の動作を書いておく。
・/sys/class/uio/から uio を順番に読んできて、名前を引数で渡された名前と比べる。
・名前が合っていたら、uio の名前や、バージョン、アドレス、サイズを InfoPtr(XLap_filter_axim_uio_info構造体)に入れる。
・該当する uio を mmap() でアロケートして、アドレスを XLap_filter_axim 構造体の Bus_axi4ls_BaseAddress メンバに代入する。
・XLap_filter_axim 構造体の IsReady メンバをアクティブにする(XIL_COMPONENT_IS_READYを代入する)。

使用している各構造体の記述を xlap_filter_axim_linux.c, xlap_filter_axim.h から引用する。

typedef struct {
    u32 addr;
    u32 size;
} XLap_filter_axim_uio_map;

typedef struct {
    int  uio_fd;
    int  uio_num;
    char name[ MAX_UIO_NAME_SIZE ];
    char version[ MAX_UIO_NAME_SIZE ];
    XLap_filter_axim_uio_map maps[ MAX_UIO_MAPS ];
} XLap_filter_axim_uio_info;

typedef struct {
    u32 Bus_axi4ls_BaseAddress;
    u32 IsReady;
} XLap_filter_axim;

  1. 2015年02月15日 05:32 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

映画『ANNIE/アニー』を見てきました

今日は映画『ANNIE/アニー』を奥さんと下の娘と見てきました。
私はお供でしたが、なかなか良かったです。ミュージカルで、ハッピーエンドの月並みな話ですが、見ていて楽しかったです。
  1. 2015年02月14日 20:50 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)”の続き。

前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPが入ったBOOT.bin とそのUIOの項目を追加したで devicetree.dtb を作製した。今回は、その BOOT.bin と devicetree.dtb を MicroSDカードの第1パーティション ZYBO_BOOT に入れて、ZYBOに挿入して電源をONし、起動するかどうか?を確かめてみた。

・ MicroSDカードの第1パーティション ZYBO_BOOT に、前回生成したBOOT.bin と devicetree.dtb をコピーした。
Vivado_HLS_lap_filter_55_150214.png

・ZYBO にMicroSDカードを挿入して、電源ONした。

・シリアルコンソールにブートメッセージが表示された。

・ifconfig コマンドを実行して、DHCPで割り振られたIPアドレスを確認した。
Vivado_HLS_lap_filter_60_150214.png

・SSHで確認したIPアドレスにログインした。

cd /sys/devices/amba.0/
ls
コマンドを実行した。物理アドレスとモジュールが見えた。今回追加したVivado HLS 2014.4 で作製したラプラシアンフィルタIPは、43c20000.lap_filter_axim_hls だ。
Vivado_HLS_lap_filter_56_150214.png

cd 43c20000.lap_filter_axim_hls/
ls
コマンドを実行して、43c20000.lap_filter_axim_hls ディレクトリに入って内容を見た。
Vivado_HLS_lap_filter_57_150214.png

cd uio
ls
cd uio3
ls
コマンドを実行して、uio/uio3 ディレクトリに入った。
Vivado_HLS_lap_filter_58_150214.png

cat name version uevent コマンドを実行した。
Vivado_HLS_lap_filter_59_150214.png

lap_filter_axim_hls
devicetree
MAJOR=247
MINOR=3
DEVNAME=uio3


cd /dev
ls uio* コマンドを実行して、/dev ディレクトリに入って、uio ファイルを見た。
Vivado_HLS_lap_filter_60_150214.png

4つ uio があった。問題ないようだ。
前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPは uio3 だ。
  1. 2015年02月14日 06:08 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)”の続き。

Vivado HLSで作製したラプラシアンフィルタIPを V_ZYBO_CAMDfLブロックデザイン上にインスタンスして論理合成、インプリメントを行った。今回は、SDKを立ちあげてBOOT.binを作製する。

・Vivado 2014.4 のFile メニューからExprot -> Export Hardware... を選択する。

・Export Hardware ダイアログが表示される。Include bitstream にチェックを入れてOKボタンをクリックする。

・File メニューからLaunch SDK を選択し、SDKを立ち上げる。

・SDKが立ち上がった。すでにFSBL のプロジェクトが作ってある。
Vivado_HLS_lap_filter_47_150213.png

・Project Exploer 上でFSBL を右クリックし、右クリックメニューからCreate Boot Image を選択した。
Vivado_HLS_lap_filter_48_150213.png

・Creater Zynq Boot Image ダイアログが開いた。Create Image ボタンをクリックした。
Vivado_HLS_lap_filter_49_150213.png

・BOOT.bin が再生成された。
Vivado_HLS_lap_filter_50_150213.png

・BOOT.bin を作製することができたので、SDKを閉じた。

次に、Vivado HLSで生成したラプラシアンフィルタIPのAXI4 Slave Lite のアドレスをUIOにマップする。

・VirtualBox 上にインストールしたUbuntu 14.04 LTSに移動して、/home/masaaki/ZYBO/Digilent_Linux_Tutrial ディレクトリに移動した。ここには以前、ZYBO用のLinuxカーネルをビルドしたディレクトリだ。

Vivado HLS で作製したラプラシアンフィルタIP の設定をするために、ラプラシアンフィルタIPのAXI4 Slave Lite のアドレスをUIOにマップするには、device tree を修正する必要がある。ラプラシアンフィルタIPのアドレスを device tree に追加する。

CMOSカメラをZYBO のUbuntuで操作した時の記事を示す。”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する7(devicetree.dtb)

・drivers_hls_lap_fil ディレクトリを作った。
Vivado_HLS_lap_filter_51_150213.png

・CMOSカメラを接続した時の zynq-zybo.dts を drivers3 ディレクトリから drivers_hls_lap_fil ディレクトリへコピーした。
Vivado_HLS_lap_filter_52_150213.png

・zynq-zybo.dts をダブルクリックして、編集を開始した。

・Address Editor の内容を再度確認すると、lap_filter_axim_0 は 0x43C2_0000 にマップされている。
Vivado_HLS_lap_filter_36_150208.png

・lap_filter_axim_0 を lap_filter_axim_hls としてUIO を使用するように追加した。(2015/02/21 修正: lap_filter_axim_hls を5番目にした。 uio4 、以前のソフトウェアを動作させるためにlap_filter_axim_hls を最後に追加した)
Vivado_HLS_lap_filter_53_150213.png

        bitmap_display_cntrler_axim@43c00000 {
            compatible = "generic-uio";
            reg = < 0x43c00000 0x10000 >;
        };
        mt9d111_inf_axim@0x43c10000 {
            compatible = "generic-uio";
            reg = < 0x43c10000 0x10000 >;
        };
        mt9d111_axi_iic@0x41600000 {
            compatible = "generic-uio";
            reg = < 0x41600000 0x10000>;
        };
        frame_buffer_bmdc@0x17800000 {
            compatible = "generic-uio";
            reg = < 0x17800000 0x1000000>;
        };
        lap_filter_axim_hls@0x43c20000 {
            compatible = "generic-uio";
            reg = < 0x43c20000 0x10000>;
        };


・zynq-zybo.dts をセーブして閉じた。

・LX Terminal で drivers_hls_lap_fil ディレクトリに入った。

../Linux-Digilent-Dev/scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb zynq-zybo.dts コマンドで、zynq-zybo.dts を dtc でコンパイルして、devicetree.dtb を生成した。
Vivado_HLS_lap_filter_54_150213.png
  1. 2015年02月13日 05:20 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

”Caffeで手軽に画像分類”の”リファレンスモデルでの分類”をやってみた

Caffe | Deep Learning Frameworkをインストール2”の続き。

前回、”Caffeで手軽に画像分類”の”リファレンスモデルでの分類”が動作したので、101_ObjectCategories/airplanesの画像を分類してみました。

大体 airliner は大体あってました。image_0800.jpgの分類結果です。
Caffe_14_150212.jpg
#1 | n02690373 airliner | 97.8%
#2 | n04266014 space shuttle | 0.8%
#3 | n04008634 projectile, missile | 0.4%

一般的な?飛行機はあまりよく分類できていない気がします。image_0002.jpg
Caffe_15_150212.jpg
#1 | n04372370 switch, electric switch, electrical switch | 27.9%
#2 | n02692877 airship, dirigible | 17.6%
#3 | n03109150 corkscrew, bottle screw | 10.8%

  1. 2015年02月12日 20:35 |
  2. Deep Learning
  3. | トラックバック:0
  4. | コメント:0

Zynq勉強会 7番目の資料”7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”を公開2

以前、”Zynq勉強会 7番目の資料”7 AXI4 バス説明、AXI4バスを使用したカスタムIPの作成方法”を公開”で、Zynq勉強会のAXIバス資料を公開したが、一旦、削除した。今回もう一度、AXIバス資料を公開することにした。

Slideshare の”7 axi4 バス説明、axi4バスを使用したカスタムipの作成方法2”で公開した。

誤りやご意見などがありましたら、コメント欄でお知らせ下さい。よろしくお願いします。
  1. 2015年02月12日 19:37 |
  2. AXI4バスの演習資料
  3. | トラックバック:0
  4. | コメント:0

ハンターマウンテンスキー場に行ってきました

1月3日にハンターマウンテンスキー場に行こうとして渋滞で行き着かなかったので、今日はそのリベンジということで、奥さんと息子と3人で、ハンターマウンテンスキー場に行ってきました。

すでにハンターマウンテンスキー場の前売りリフト券を購入してあるので、どうして行く必要がありました。前の日まではとっても寒く、スキーに行く気力が減退していましたが、スキーに行くとなると燃えちゃいます。腰の具合もあってどうか?と思ったのですが、あまりハードに滑らないようにして、スキーに行くことにしました。

大体、午前5時30分頃出て、午前8時17分に着きました。今日は渋滞は全くなしです。とても快調でした。道に雪も殆ど無く、ノーマルでも大丈夫だったと思います。
さて早速スキーをはじめました。スキー場は晴れていますが、朝早くは寒いです。最初は第1クワッドリフトに乗って行きます。
腰を痛めてから最初のスキーはどうかな?と思ったのですが、大丈夫そう?少し腰に違和感がある感じがしますが、嫌な感じはありません。良かった~。スキーできそう。

次はいつのもハンタークワッドリフトへ。天気も悪くないし、久しぶりにスキー場の雪をみて、また景色がとっても良く最高の気分でした。
hunter_ski_2_150212.jpg

hunter_ski_1_150212.jpg

これは、ハンタークワッドを降りて、右へ行った所の5 フォーティセカンド・ストリート・ゲレンデを見たところです。

ハンタークワッドには3回乗りました。この写真は、9 ニューマチィソン・ゲレンデです。少し急ですが、それほどでもないです。下に黒っぽいウエア着ているのが息子です。
hunter_ski_3_150212.jpg

少し急な斜面では快調にかっとびましたが、腰に問題は無いようです。良かった。因みに私の板は、99cmのファンスキーですが、スピードが出ても問題無いです。最も長い板の人のスピードとは比べ物にならないとは思いますが。。。
直滑降は遅いです。スピードが出にくいのとスピードが出ると安定しません。

次に、ゴンドラリフトに乗って頂上に行ってきました。
hunter_ski_4_150212.jpg

今度もFDRコースをかっ飛んで来ましたよ。とっても気持ちよかったです。しかし、朝がたはとっても良かった雪質がいつものアイスバーンに戻ってきていました。ズレが大きくなって来たし、足も疲れたのでこのへんで食事休憩にしました。11時ころかな?

食事はいつのものゲレ食です。カルビ丼を頼んだんですが、やはりレトルトっぽいですね。あまり美味しくは無いです。
十分堪能したし、腰に爆弾も抱えているので、これで帰ることにしました。12時過ぎ頃スキー場を出発しました。
帰り道も道に雪はなく、道は水で濡れていましたが、快調に帰れました。3時30分頃、家に着きました。まだ時間が早いので、ドロドロになった車を洗ってきましたよ。

もう歳なので、このくらいの滑りで調度良い感じです。足がダメになってから滑っても辛いだけですから。。。
  1. 2015年02月11日 21:30 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする3(IP Catalog にVivado HLSのIPを追加)”の続き。

前回は、Vivado HLSで作製したラプラシアンフィルタIPを IP Catalog に追加した。今回は、、Vivado HLSで作製したラプラシアンフィルタIPを V_ZYBO_CAMDfLブロックデザイン上にインスタンスして論理合成、インプリメントを行う。

・axi_mem_intercon をダウブルクリックして、AXI Interconnect のNumber of Slave Interfaces を 2 から 4 に変更した。(もしかしたら、この手順は要らないのかもしれない?自動配線を行うと自動的にこのポートを増やしてくれるのかも知れない?)
Vivado_HLS_lap_filter_30_150208.png

・axi_mem_intercon に S02_AXI と S03_AXI ポートが増えた。
Vivado_HLS_lap_filter_31_150208.png

・ブロックデザインのなにもない所で右クリックして、右クリックメニューから Add IP ... を選択した。

・出てきたダイアログのテキストエリアに lap と入力すると lap_filter_axim_hls が出てきた。これをダブルクリックした。
Vivado_HLS_lap_filter_32_150208.png

・lap_filter_axim_0 が追加された。
Vivado_HLS_lap_filter_33_150208.png

・Run Connection Automation をクリックした。

・Run Connection Automation が出て、すべての項目にチェックを入れた。OKボタンをクリックした。
Vivado_HLS_lap_filter_34_150208.png

・lap_filter_axim_0 が自動的に配線された。
Vivado_HLS_lap_filter_35_150208.png

・Address Editor の内容を示す。
Vivado_HLS_lap_filter_36_150208.png

・論理合成、インプリメント、ビットストリームの生成を行った。タイミング制約を満たせなかったようだ。

・幾つかクリティカル・ワーニングが出ているが、制約ファイルの制約が有効じゃないというワーニングが出ている。
Vivado_HLS_lap_filter_40_150209.png

・制約ファイルを見てみると、以下の2つの行だった。どうやらネットが無くなってしまったようなので、削除した。
Vivado_HLS_lap_filter_41_150209.png

・Implemented Design を展開して、Edit Timing Constraints をクリックした。

・Timing 制約エディタと Timing Summary が開いた。

・Timing Summary を見ると、pclk_buf と clk_fpga_0 の間でタイミング制約違反が出ている。このパスは非同期FIFO でつないであるので、タイミング制約は大体必要無い。

・pclk_buf と clk_fpga_0 間のパスをFalse Path に設定するために Timing 制約エディタの + アイコンをクリックした。
Vivado_HLS_lap_filter_42_150209.png

・Set False Path ダイアログで、From を pclk_buf、To を clk_fpaa_0 に設定して、OKボタンをクリックした。
Vivado_HLS_lap_filter_43_150209.png

・もう1つ、From が clk_fpga_0、To が pck_buf の False Path も設定した。
Vivado_HLS_lap_filter_44_150209.png

・制約ファイルのV_ZYBO_CAMfL.xdc に以下のような制約が追加された。
Vivado_HLS_lap_filter_45_150209.png

・False Path を設定できたので、もう一度、論理合成、インプリメント、ビットストリームの生成を行った。今度は成功した。
Vivado_HLS_lap_filter_46_150209.png
  1. 2015年02月10日 05:14 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする3(IP Catalog にVivado HLSのIPを追加)

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2”で、以前からやっているラプラシアンフィルタを Vivado HLS 2014.4 でIP化できた。途中、AXI4バスを生成するディレクティブが変更になっていて戸惑ったが、IP化することができたので、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する11(Linuxで確認)”でできたZYBOでカメラ画像を表示するVivado プロジェクトを Vivado 2014.4 にアップデートして、今回作製したVivado HLS 2014.4 のラプラシアンフィルタIPを追加することにした。

最初に、、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する11(Linuxで確認)”のブロジェクトを Vivado 2014.4 にアップデートする。

・最初に、V_ZYBO_CAMDfL143 プロジェクトを Vivado 2014.4 で立ちあげて、IPのアップグレードを行った。

・IPのアップグレードはXilinx のIP だけなので、自分で作製したカスタムIPは自動的にアップグレードしてもらえない。

・カスタムIPのアップグレードの手順を示す。
・カメラ・インターフェースIPの mt9d111_inf_axi_master_0 をアップグレードする。

・ブロック・デザインで、mt9d111_inf_axi_master_0 を右クリックして、右クリックメニューから Edit in IP Packager を選択した。
Vivado_HLS_lap_filter_19_150208.png

・Edit in IP Packager の確認ダイアログが出るので、OKボタンをクリックする。
Vivado_HLS_lap_filter_20_150208.png

・mt9d111_inf_axi_master_v1_0_project ブロジェクトが立ち上がった。

・最初に使用しているFIFO のバージョンが古いので、アップグレードを行った。pixel_fifo を右クリックして、右クリックメニューからUpgrade IP... を選択した。
Vivado_HLS_lap_filter_37_150208.png

・Generate Output Products ダイアログが表示された。Generate ボタンをクリックした。
Vivado_HLS_lap_filter_38_150208.png

・pixel_fifo は無事にアップグレードされた。
Vivado_HLS_lap_filter_39_150208.png

・次に、mt9d111_inf_axi_master_v1_0_project のIPをアップグレードする。

・右側のウインドウの Package IP タブで、Review and Package をクリックして、Re-Package IP ボタンをクリックした。
Vivado_HLS_lap_filter_21_150208.png

・mt9d111_inf_axi_master_v1_0_project が終了して、V_ZYBO_CAMDfL143 プロジェクトに戻った。
・IP Status の Rerun をクリックした。
Vivado_HLS_lap_filter_22_150208.png

・すべてのIP がアップグレードされた。
Vivado_HLS_lap_filter_23_150208.png

・次に、Vivado HLS 2014.4 で生成したラプラシアンフィルタIP をV_ZYBO_CAMDfL143 プロジェクトフォルダ内の hls_lap_filter_axim フォルダにコピーした。
Vivado_HLS_lap_filter_24_150208.png

・Flow Navigator の IP Catalog をクリックした。
・右のウインドウにIP Catalog が出るので、どこでも良いから右クリックして、右クリックメニューから IP Setting... を選択した。
Vivado_HLS_lap_filter_25_150208.png

・Project Settings ダイアログが立ち上がった。右のペインからIP を選択した。
・IP Repositories の + アイコンをクリックして、Vivado HLS 2014.4 で生成したラプラシアンフィルタIP を追加する。
Vivado_HLS_lap_filter_26_150208.png

・IP Repositories ダイアログで、先ほどIPをコピーした hls_lap_filter_axim を選択した。(でも、どうやら、V_ZYBO_CAMDfL143 を選択すると下位のフォルダをすべて探索して見つかったIPを登録してくれるようだ)
Vivado_HLS_lap_filter_27_150208.png

・Project Settings ダイアログに lap_filter_axim_hls が追加された。
Vivado_HLS_lap_filter_28_150208.png

・IP Catalog を見ると lap_filter_axim_hls が追加されているのが見えた。
Vivado_HLS_lap_filter_29_150208.png
  1. 2015年02月09日 05:19 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

FPGAの部屋まとめサイトの更新(2015年2月8日)

FPGAの部屋のまとめサイトを更新しました。

Edison Synthesijer Deep Learning を追加して、その他のカテゴリを更新しました。
  1. 2015年02月08日 04:56 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

Vivado HLS 2014.4 で生成した IP の example

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2”で生成したラプラシアン・フィルタIPの example があったので、やってみた。

ラプラシアン・フィルタの Vivado HLS の ip フォルダを見た。下に ip フォルダの内容を示す。
Vivado_HLS_lap_filter_9_150206.png

ip フォルダの中に example フォルダがあった。example があるのだろうか?
example ファルダに入ってみると、ipi_example.bat と ipi_example.tcl の2つのファイルがあった。
Vivado_HLS_lap_filter_10_150206.png

コマンド プロンプトを起動して、ipi_example.bat を起動した。
Vivado_HLS_lap_filter_11_150206.png

ipi_example.tcl を読んで、いろいろとやっているようだったが、終了した。
Vivado_HLS_lap_filter_12_150206.png

ip フォルダを見ると、project フォルダなどが生成されていた。
Vivado_HLS_lap_filter_13_150206.png

project フォルダに入ると、project.xpr という Vivado のプロジェクト・ファイルがあったので、project.xpr をダブルクリックで起動した。
Vivado_HLS_lap_filter_14_150206.png

Vivado 2014.4 が立ち上がった。ブロックデザインの hls_bd_0 が入っていた。
Vivado_HLS_lap_filter_15_150206.png

hls_bd_0 をダブルクリック開いた。ブロックデザインができていた。
Vivado_HLS_lap_filter_16_150206.png

hls_bd_0 を拡大した。
Vivado_HLS_lap_filter_17_150206.png

ZYNQが入ったサンプル・デザインが生成されていたが、ラプラシアン・フィルタIPは、2つの AXI Master ポートを持つので、2つの AXI Interconnect が生成された。1方は、ZYNQ の S_AXI_HP0 に接続されたが、もう1方の AXI Interconnect は浮いてしまっている。

次にZYNQをダブルクリックして、Re-customize IP ダイアログを立ちあげて、Import XPS Settings をクリックして、ZYBOボードの設定ファイルの ZYBO_zynq_def.xml をインポートした。すると、ZYNQのポートが追加されて、ZYBOの設定にすることができた。
Vivado_HLS_lap_filter_18_150206.png

これで、Cから高位合成された IP を使った example を手軽に試せることが分かった。但し、AXI Master ポートが2つあったりしてイレギュラーな場合は自分でブロックデザインを修正する必要がある。
  1. 2015年02月06日 04:50 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

ZYBOのARMhfのUbuntu 14.04 LTS にOpenCV 2.4.10をインストール

ZYBOのDigilent Linux KernelにARMhfのRoot File Systemsを入れる3(Ubuntu Trusty 14.04 LTS)”の続き。

ZYBOのARMhfのUbuntu 14.04 LTS にも、OpenCV 2.4.10をインストールした。

opencv_pre_install.sh を作って、それを実行した。その内容を示す。

sudo apt-get -yV install build-essential
sudo apt-get -yV install libboost1.46-all-dev
#
cd /tmp; sudo apt-get source opencv
sudo apt-get -yV build-dep opencv
#
sudo apt-get -yV install libqt4-dev
sudo apt-get -yV install libgtk2.0-dev
sudo apt-get -yV install pkg-config
#
sudo apt-get -yV install opencl-headers
#
sudo apt-get -yV install libjpeg-dev
sudo apt-get -yV install libopenjpeg-dev
sudo apt-get -yV install jasper
sudo apt-get -yV install libjasper-dev libjasper-runtime
sudo apt-get -yV install libpng12-dev
sudo apt-get -yV install libpng++-dev libpng3
sudo apt-get -yV install libpnglite-dev libpngwriter0-dev libpngwriter0c2
sudo apt-get -yV install libtiff-dev libtiff-tools pngtools
sudo apt-get -yV install zlib1g-dev zlib1g-dbg
sudo apt-get -yV install v4l2ucp
#
sudo apt-get -yV install python
sudo apt-get -yV install autoconf
sudo apt-get -yV install libtbb2 libtbb-dev
sudo apt-get -yV install libeigen2-dev
sudo apt-get -yV install cmake
sudo apt-get -yV install openexr
sudo apt-get -yV install gstreamer-plugins-*
sudo apt-get -yV install freeglut3-dev
sudo apt-get -yV install libglui-dev
sudo apt-get -yV install libavc1394-dev libdc1394-22-dev libdc1394-utils
#
sudo apt-get -yV install libxine-dev
sudo apt-get -yV install libxvidcore-dev
sudo apt-get -yV install libva-dev
sudo apt-get -yV install libssl-dev
sudo apt-get -yV install libv4l-dev
sudo apt-get -yV install libvo-aacenc-dev
sudo apt-get -yV install libvo-amrwbenc-dev
sudo apt-get -yV install libvorbis-dev
sudo apt-get -yV install libvpx-dev


・まず、opencv-2.4.10.zip を、SourceForge からダウンロードした。
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip

・OpenCV ディレクトリを作製して、その下に、opencv-2.4.10.zip を移動した。
mkdir OpenCV
mv opencv-2.4.10.zip OpenCV
cd OpenCV


・opencv-2.4.10.zip を解凍した。
unzip opencv-2.4.10.zip

・opencv-2.4.10 ディレクトリができた。

・opencv-2.4.10 ディレクトリに行って、build ディレクトリを作製した。
mkdir build

・build ディレクトリに行った。
cd build

・そこで、OpenCV をインストールするためのコマンドを発行した。
cmake ..
make

ZYBO_ARMhf_31_150204.png

sudo make install
sudo ldconfig

これで、 Ubuntu 14.04 LTS に、OpenCV-2.4.10 をインストールすることができた。ビルドは成功した。

いつものように、samples/c のOpenCV のサンプルプログラムもすべてビルドできた。
./build_all.sh

レナ像の顔検出と目の検出も問題なくできた。
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml" --scale=1.3 lena.jpg
ZYBO_ARMhf_32_150204.png

OpenCVのCやC++のソフトウェアを実行するために、コンパイル・スクリプトを作製した。
詳しくは、”OpenCV のコンパイル・スクリプト”を参照下さい。

これで、OpenCVについても、Linaro Ubuntu 14.04 LTS と同じ環境が揃った。


おまけとしてレナ像の scale の値による detection time の変化と、顔認識、目認識の様子についてもデータを取ってみた。(画像のサイズは 512x512 ピクセル)

scale = 1.0, detection time = 2037.15 ms (顔も目も認識されている)
ZYBO_ARMhf_34_150204.png

scale = 1.3, detection time = 1206.48 ms (顔も目も認識されている)

scale = 2.0, detection time = 449.268 ms (顔も目も認識されている)
ZYBO_ARMhf_33_150204.png

scale = 3.0, detection time = 206.46 ms (顔のみ認識されている)
ZYBO_ARMhf_35_150204.png

scale = 4.0, detection time = 119.46 ms (顔のみ認識されている)
ZYBO_ARMhf_36_150204.png

scale = 5.0, detection time = 76.6311 ms (顔のみ認識されている)
ZYBO_ARMhf_37_150204.png

scale = 6.0, detection time = 53.7746 ms (顔のみ認識されている)
ZYBO_ARMhf_38_150204.png

scale = 7.0, detection time = 39.568 ms (顔も目も認識されない)
ZYBO_ARMhf_39_150204.png

scale = 8.0, detection time =32.1023 ms (顔も目も認識されない)
ZYBO_ARMhf_40_150204.png

ZynqのCortex-A9 プロセッサによる OpenCV 2.4.10での顔認識と目認識のscaleによるdetection timeの値の表を下に示す。
ZYBO_ARMhf_41_150204.png

scale = 2.0 は scale = 1.0 よりも大体、2.0の2乗分の 1 にスケールダウンしているようだ。


もう1つおまけで、cmake 時のパラメータの表示を示す。
-- General configuration for OpenCV 2.4.10 =====================================
--   Version control:               unknown
--
--   Platform:
--     Host:                        Linux 3.14.0-xilinx-13567-g906a2c9-dirty armv7l
--     CMake:                       2.8.12.2
--     CMake generator:             Unix Makefiles
--     CMake build tool:            /usr/bin/make
--     Configuration:               Release
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /usr/bin/c++  (ver 4.8.2)
--     C++ flags (Release):         -fsigned-char -W -Wall -Werror=return-type -

--     Linker flags (Release):
--     Linker flags (Debug):
--     Precompiled headers:         YES
--
--   OpenCV modules:
--     To be built:                 core flann imgproc highgui features2d calib3d ml video legacy objdetect photo gpu ocl nonfree contrib stitching superres ts videostab
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 androidcamera dynamicuda java python viz
--
--   GUI:
--     QT:                          NO
--     GTK+ 2.x:                    YES (ver 2.24.23)
--     GThread :                    YES (ver 2.40.2)
--     GtkGlExt:                    NO
--     OpenGL support:              NO
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8)
--     JPEG:                        /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver )
--     PNG:                         /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.2.50)
--     TIFF:                        /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 - 4.0.3)
--     JPEG 2000:                   /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1)
--     OpenEXR:                     build (ver 1.7.1)
--
--   Video I/O:
--     DC1394 1.x:                  NO
--     DC1394 2.x:                  YES (ver 2.2.1)
--     FFMPEG:                      NO
--       codec:                     NO
--       format:                    NO
--       util:                      NO
--       swscale:                   NO
--       gentoo-style:              NO
--     GStreamer:
--       base:                      YES (ver 1.2.4)
--       video:                     YES (ver 1.2.4)
--       app:                       YES (ver 1.2.4)
--       riff:                      YES (ver 1.2.4)
--       pbutils:                   YES (ver 1.2.4)
--     OpenNI:                      NO
--     OpenNI PrimeSensor Modules:  NO
--     PvAPI:                       NO
--     GigEVisionSDK:               NO
--     UniCap:                      NO
--     UniCap ucil:                 NO
--     V4L/V4L2:                    Using libv4l1 (ver 1.0.1) / libv4l2 (ver 1.0.1)
--     XIMEA:                       NO
--     Xine:                        NO
--
--   Other third-party libraries:
--     Use IPP:                     NO
--     Use Eigen:                   YES (ver 2.0.17)
--     Use TBB:                     NO
--     Use OpenMP:                  NO
--     Use GCD                      NO
--     Use Concurrency              NO
--     Use C=:                      NO
--     Use Cuda:                    NO
--     Use OpenCL:                  YES
--
--   OpenCL:
--     Version:                     dynamic
--     Include path:                /home/ubuntu/OpenCV/opencv-2.4.10/3rdparty/include/opencl/1.2
--     Use AMD FFT:                 NO
--     Use AMD BLAS:                NO
--
--   Python:
--     Interpreter:                 /usr/bin/python2 (ver 2.7.6)
--
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java tests:                  NO
--
--   Documentation:
--     Build Documentation:         NO
--     Sphinx:                      NO
--     PdfLaTeX compiler:           NO
--
--   Tests and samples:
--     Tests:                       YES
--     Performance tests:           YES
--     C/C++ Examples:              NO
--
--   Install path:                  /usr/local
--
--   cvconfig.h is in:              /home/ubuntu/OpenCV/opencv-2.4.10/build
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ubuntu/OpenCV/opencv-2.4.10/build
  1. 2015年02月05日 04:30 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

Caffe | Deep Learning Frameworkをインストール2

Caffe | Deep Learning Frameworkをインストール1”の続き。

前回、Deep Learning の Caffe をインストールしようとしたが、runtest でエラーが出てしまった。
今回は、異なるパソコンに Caffe をインストールしてみた。

インストール手順は前回と同じなので、省略する。手順は、”Caffe | Deep Learning Frameworkをインストール1”参照のこと。

make runtest の結果は PASSED だった。
caffe_examples_1_150130.png

次は、”Caffeで手軽に画像分類”に従って、サンプルを実行してみた。

caffe/examples/imagenetディレクトリで get_caffe_reference_imagenet_model.sh を実行した。
caffe_examples_2_150130.png

data/ilsvrc12ディレクトリで get_ilsvrc_aux.sh を実行した。

caffe のディレクトリに戻り、物体認識のデータセットの一つであるCaltech101をダウンロードした。
wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
caffe_examples_4_150130.png

tar xf 101_ObjectCategories.tar.gz で解凍した。
caffe_examples_5_150130.png
101_ObjectCategories ディレクトリができた。

Caffe付属のPythonスクリプトを使って、Caltech101の次の画像を分類する。
cd python; python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy; cd ..
を実行した。

ImportError: No module named _caffe となってしまった。
caffe_examples_6_150202.png

検索した所、”python can't import _caffe module #263”がヒットした。それによると
make pycaffe
を実行すれば良いようだ。
make pycaffe を実行した。
caffe_examples_7_150202.png

次に、
cd python; python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy; cd ..
を実行したところ、RuntimeError: Could not open file ../modules/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel だった。
また、検索を行って、”caffe/models/bvlc_reference_caffenet”にあることが分かった。そこから、bvlc_reference_caffenet.caffemodel をダウンロードし、caffe/models ディレクトリに保存した。
caffe_examples_9_150202.png

再々度、
cd python; python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy; cd ..
を実行したところ、今度は、パスした。

次に、”Caffeで手軽に画像分類”に従って、show_result.py を作製した。

python show_result.py data/ilsvrc12/synset_words.txt result.npy
コマンドで実行したら、分類結果が表示された。成功。。。
caffe_examples_10_150202.png

imag_0001.jpg の画像を下に示す。まさに戦闘機だ。
caffe_examples_12_150202.jpg

因みに、飛行機の画像データの 101_objectCategories/airplanes ディレクトリはこんな感じです。
caffe_examples_11_150202.jpg
  1. 2015年02月03日 05:01 |
  2. Deep Learning
  3. | トラックバック:0
  4. | コメント:0

ZYBOのARMhfのDebian Wheezy 7.5にOpenCV 2.4.10をインストール

ZYBOのDigilent Linux KernelにARMhfのRoot File Systemsを入れる2( Debian Wheezy 7.5)”で、ZYBOのDigilent Linux KernelにARMhfの Debian Wheezy 7.5 の Root File Systemsを入れて動作した。
今回は、それに、OpenCV 2.4.10 を入れてみた。

opencv_pre_install.sh を作って、それを実行した。その内容を示す。

sudo apt-get -yV install build-essential
sudo apt-get -yV install libboost1.46-all-dev
#
cd /tmp; sudo apt-get source opencv
sudo apt-get -yV build-dep opencv
#
sudo apt-get -yV install libqt4-dev
sudo apt-get -yV install libgtk2.0-dev
sudo apt-get -yV install pkg-config
#
sudo apt-get -yV install opencl-headers
#
sudo apt-get -yV install libjpeg-dev
sudo apt-get -yV install libopenjpeg-dev
sudo apt-get -yV install jasper
sudo apt-get -yV install libjasper-dev libjasper-runtime
sudo apt-get -yV install libpng12-dev
sudo apt-get -yV install libpng++-dev libpng3
sudo apt-get -yV install libpnglite-dev libpngwriter0-dev libpngwriter0c2
sudo apt-get -yV install libtiff-dev libtiff-tools pngtools
sudo apt-get -yV install zlib1g-dev zlib1g-dbg
sudo apt-get -yV install v4l2ucp
#
sudo apt-get -yV install python
sudo apt-get -yV install autoconf
sudo apt-get -yV install libtbb2 libtbb-dev
sudo apt-get -yV install libeigen2-dev
sudo apt-get -yV install cmake
sudo apt-get -yV install openexr
sudo apt-get -yV install gstreamer-plugins-*
sudo apt-get -yV install freeglut3-dev
sudo apt-get -yV install libglui-dev
sudo apt-get -yV install libavc1394-dev libdc1394-22-dev libdc1394-utils
# ビデオ関係
sudo apt-get -yV install libxine-dev
sudo apt-get -yV install libxvidcore-dev
sudo apt-get -yV install libva-dev
sudo apt-get -yV install libssl-dev
sudo apt-get -yV install libv4l-dev
sudo apt-get -yV install libvo-aacenc-dev
sudo apt-get -yV install libvo-amrwbenc-dev
sudo apt-get -yV install libvorbis-dev
sudo apt-get -yV install libvpx-dev


・まず、opencv-2.4.10.zip を、SourceForge からダウンロードした。
wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip

・OpenCV ディレクトリを作製して、その下に、opencv-2.4.10.zip を移動した。
mkdir OpenCV
mv opencv-2.4.10.zip OpenCV
cd OpenCV


・opencv-2.4.10.zip を解凍した。
unzip opencv-2.4.10.zip

・opencv-2.4.10 ディレクトリができた。

・opencv-2.4.10 ディレクトリに行って、build ディレクトリを作製した。
mkdir build

・build ディレクトリに行った。
cd build

・そこで、OpenCV をインストールするためのコマンドを発行した。
cmake ..
make
sudo make install
sudo ldconfig

これで、 Debian Wheezy 7.5 に、OpenCV-2.4.10 をインストールすることができた。ビルドは成功した。

いつものように、samples/c のOpenCV のサンプルプログラムもすべてビルドできた。
./build_all.sh

レナ像の顔検出と目の検出も問題なくできた。
./facedetect --cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml" --nested-cascade="/usr/local/share/OpenCV/haarcascades/haarcascade_eye.xml" --scale=1.3 lena.jpg

OpenCVのCやC++のソフトウェアを実行するために、コンパイル・スクリプトを作製した。
詳しくは、”OpenCV のコンパイル・スクリプト”を参照下さい。

これで、OpenCVについても、Linaro Ubuntu 14.04 LTS と同じ環境が揃った。
  1. 2015年02月02日 05:15 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

FPGAエクストリーム・コンピューティング 第6回でLTしてきました

FPGAエクストリーム・コンピューティング 第6回に行ってきました。

今日は本当は守谷ハーフマラソンの5kmにエントリーしていたので、5km走ってからFPGAエクストリーム・コンピューティング 第6回に行こうと思っていたのですが、腰の具合が悪く残念ながら棄権しました。
それで、FPGAエクストリーム・コンピューティング 第6回には楽に行けるようになりました。
発表内容はいろいろと面白そうなものばかりでした。今回は、ドワンゴでやったので、ニコ生で放送するため、最初にはキューがでるという本当に放送のような感じでした。そのため、タイムスケジュールが厳しく、質問が1つくらいしか出来ないのが残念でした。質問時間が設けられていたほうが良いかもしれません?
現在、公開されているスライドです。
「FPGAで作るOpenFlow Switch」at FPGAエクストリーム・コンピューティング 第6回」
「OpenCLでFPGAプログラミング」

LTでは、ドワンゴの方もハードウェア・エンジニアの採用について話されていて、もうすでに採用された方もいるそうです。これからも採用するそうですよ。
私も「UbuntuをインストールしたZYBOボードにカメラを付けてOpenCVで顔認証」という題でLTさせて頂きました。
最初にZynqの説明をして、FPGA部の説明、ソフトウェアの説明をして、デモでZYBOに付けたカメラで顔検出をして表示しました。顔検出のソフトウェアはOpenCVのサンプル・アプリケーションのfacedetect そのものなんですけど。。。

運営の佐藤さん、会場を貸して頂いたドワンゴさん、ありがとうございました。

懇親会に参加させて頂いて、すごい熱気の中、楽しく過ごさせて頂きました。若い方の熱気がすごかったです。。。

最後に、ドワンゴさんでもらってきたインターフェース誌に載っていたハードウェア・エンジニア募集広告のステッカーを貼っておきます。
DWANGO_150202.jpg

(2014/02/03:追記)
FPGAエクストリーム・コンピューティング 第6回で発表した「UbuntuをインストールしたZYBOボードにカメラを付けてOpenCVで顔認証」を「UbuntuをインストールしたZYBOボードにカメラを付けてOpenCVで顔認識」のとして、改題して公開させて頂きました。

値段も削除させて頂きました。Webで調査をお願いします。できればZYBOはアクセサリーキットとセットでご購入下さい。

なお、Vivado の無料で使えるWeb PACKでは、Vivado Logic Analyzerを使えません。デバックにはアクセサリーキットに付いているVivadoのライセンスがあるとVivado Logic Analyzerを使えるので便利ですよ。。。
  1. 2015年02月01日 23:06 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0