FC2カウンター FPGAの部屋 ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル
FC2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/3084-7a1eba64
この記事にトラックバックする(FC2ブログユーザー)