FC2カウンター FPGAの部屋 Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する3
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する3

Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する2”の続き。

前回、Vivado HLS 2014.1 を使用したラプラシアンフィルタ IPをVivado 2014.4 で論理合成、インプリメント、ビットストリームの生成を行い、SDKを起動してBOOT.binを作製した。
今回は、BOOT.binをMicro SDカードにコピーして、ZYBOに挿入して電源ONを行った。

次に、Vivado HLS 2014.1 を使用したラプラシアンフィルタ IPを制御する制御ソフトウェアを作るのだが、これは、以前作った lap_fil_hls_1shot.vld.c をほとんどコピーした(lap_fil_hls_1shot_vld.c)。

Makefile も書きなおして、ZYBOの~/Apps/lap_fil_hls_1shot_vld ディスプレイ上でコピーした。

Vivado HLS 2014.1 を使用したラプラシアンフィルタ IPの drivers\lap_filter_axim_top_v1_0\src の C ソーフファイルと C ヘッダファイル、xlap_filter_axim.c、xlap_filter_axim.h、xlap_filter_axim_hw.h、xlap_filter_axim_linux.c をZYBO の同一のフォルダにコピーした。

make コマンドでコンパイルした所、コンパイルエラー発生。原因は XLap_filter_axim 構造体のメンバの名前が書き換わっていたことだ、Vivado 2014.4 では、u32 Bus_axi4ls_BaseAddress; だったが、Vivado 2014.1 では、u32 Lites_BaseAddress; だった。

更に、cam_addr ポートが ap_hs、lap_addr ポートが lap_addr なので、アドレスをセットした後でvld をセットする関数を追加した。


XLap_filter_axim_SetCam_addr(lap_fil_lsalvep, (u32)fb_addr);
XLap_filter_axim_SetCam_addrVld(lap_fil_lsalvep);

XLap_filter_axim_SetLap_addr(lap_fil_lsalvep, (u32)next_frame_addr);
XLap_filter_axim_SetLap_addrVld(lap_fil_lsalvep);


これで make したところ、コンパイル、リンク共に通った。

./cam_disp_uio でカメラを表示してから、./lap_fil_hls_1shot_vld を起動したところ、ラプラシアンフィルタ処理のDONE待ち関数から1秒間帰ってこなかった。
Vivado_HLS_lap_filter_72_150305.png

その部分のコードを下に示す。


while(!(c =(int)XLap_filter_axim_IsDone(lap_fil_lsalvep)))
printf("%x\n", c);
printf("%x\n", c);


どうしてDONE待ちから帰ってこないかわからない?

下に、printf()デバッグコードが入ったlap_fil_hls_1shot_vld.cを示す。

// lap_fil_hls_1shot_vld.c
// by marsee
// 2015/03/03

#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;
int c;

gettimeofday(&start_time, NULL);

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

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

printf("fb_base_addr = %x\n", frame_bufp->Lites_BaseAddress);

fb_addr = (unsigned int)frame_bufp->Lites_BaseAddress + (unsigned int)(VIDEO_BUFFER_START_ADDRESS-CMA_START_ADDRESS);
printf("fb_addr = %x\n", fb_addr);


// frame buffer for laplacian filter result
next_frame_addr = (unsigned int)frame_bufp->Lites_BaseAddress + (unsigned int)(LAPLACIAN_FILTER_ADDRESS-CMA_START_ADDRESS);
printf("next_frame_addr = %x\n", next_frame_addr);

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

XLap_filter_axim_SetCam_addr(lap_fil_lsalvep, (u32)fb_addr);
XLap_filter_axim_SetCam_addrVld(lap_fil_lsalvep);
printf("%x\n", XLap_filter_axim_GetCam_addr(lap_fil_lsalvep));

XLap_filter_axim_SetLap_addr(lap_fil_lsalvep, (u32)next_frame_addr);
XLap_filter_axim_SetLap_addrVld(lap_fil_lsalvep);
printf("%x\n", XLap_filter_axim_GetLap_addr(lap_fil_lsalvep));

XLap_filter_axim_Start(lap_fil_lsalvep);

printf("Control signals = %x\n", XLap_filter_axim_ReadReg(lap_fil_lsalvep->Lites_BaseAddress, XLAP_FILTER_AXIM_LITES_ADDR_AP_CTRL));

//exit(1);

while(!(c =(int)XLap_filter_axim_IsDone(lap_fil_lsalvep)))
printf("%x\n", c);
printf("%x\n", c);

// Displayed the laplacian filter image
*(volatile unsigned int *)bitmap_dispcp->Lites_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 laplacian filter image
*(volatile unsigned int *)bitmap_dispcp->Lites_BaseAddress = (unsigned int)next_frame_addr;

// Displayed the procee past time
gettimeofday(&end_time, NULL);
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);
}

最後に、64行目の exit(1); のコメントを外した状態での結果を示す。
Vivado_HLS_lap_filter_73_150305.png
  1. 2015年03月05日 06:05 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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