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

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

FPGAの部屋

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

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

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

頭を悩ませてきたVivado HLS 2014.4 で高位合成したラプラシアンフィルタ IP の処理に27秒も掛かるバグは、”Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション3(原因が分かった)”でバグをフィックスすることができた。古いバグありコードを使ってしまって、本当に申し訳なかった。

ラプラシアンフィルタIP のバグもフィックスできたので、もう一度、”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)”のラプラシアンフィルタ IP をバグ無しのものにすげ替えて、ラプラシアンフィルタのIPを更新し、もう一度、論理合成、インプリメント、ビットストリームの生成を行った。

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)”の手順で BOOT.bin を生成した。devicetree.dtb は変更していないので、そのままとした。

ZYBO用のSDカードにBOOT.bin を書き込んで、ZYBOに入れて電源をONした。

Ubuntu 14.04 LTS が立ち上がり、SSHでログインした。

linaro ユーザーでログインしているので、Apps/lap_fil_hls_1shot ディレクトリにログインして、./cam_disp_uio コマンドを実行して、カメラの画像を表示した。
lap_fil_hls_15_4_23_150321.jpg

./lap_fil_hls_1shot コマンドを実行して、ラプラシアンフィルタ処理を行った。
lap_fil_hls_15_4_24_150321.jpg

後に示す、lap_fil_hls_1shot.c の No.4 と No.2 の gettimeofday() コマンド間の経過時間は、約 95.4 ms だった。(ソフトウェアの開始から終了まで)

lap_fil_hls_1shot.c の No.2 と No.3 の gettimeofday() コマンド間の経過時間は、約 80.0 ms だった。(ラプラシアンフィルタの処理のみ)
lap_fil_hls_14_4_29_150321.png 

Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション3(原因が分かった)”での予測値は、 79.2 ms だったので大体正しいようだ。

最後に、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); // No.1

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

// 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);

// 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);

// 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);
}

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);

XLap_filter_axim_Set_lap_addr(lap_fil_lsalvep, (u32)LAPLACIAN_FILTER_ADDRESS);

gettimeofday(&start_time, NULL); // No.2

XLap_filter_axim_Start(lap_fil_lsalvep);

while(!XLap_filter_axim_IsDone(lap_fil_lsalvep)) ;

gettimeofday(&end_time, NULL); // No.3

// 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); // No.4

if (end_time.tv_usec < start_time.tv_usec) {
printf("total time = %ld.%6.6ld sec\n", end_time.tv_sec - start_time.tv_sec - 1, 1000000 + end_time.tv_usec - start_time.tv_usec);
}
else {
printf("total time = %ld.%6.6ld sec\n", end_time.tv_sec - start_time.tv_sec, end_time.tv_usec - start_time.tv_usec);
}

return(0);
}
  1. 2015年03月21日 06:12 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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