FC2カウンター FPGAの部屋 連続ラプラシアンフィルタ処理
FC2ブログ

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

FPGAの部屋

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

連続ラプラシアンフィルタ処理

現在、ZYBO の Ubuntu 14.04 LTS上で使用している lap_fil_hls_1shot.c は、ラプラシアンフィルタ処理を1回だけ実行して、その実行時間を計測するソフトウェアだった。
そのソフトウェアを作製するには、Vivado HLS が生成したドライバ・ルーチン (xlap_filter_axim.c) を使っている。Vivado HLS のAXI4 - Lite Slave には、連続実行するためのビットがある。そのビットをEnable するには、XLap_filter_axim_EnableAutoRestart() を実行する。また、Disalbe するには、XLap_filter_axim_DisableAutoRestart() を実行すればよい。

XLap_filter_axim_EnableAutoRestart() を実行する時には、最初に XLap_filter_axim_Start() を実行する必要がある。

これらを使用して、連続実行させるためのソフトウェア lap_fil_hls_continue.c を作製した。lap_fil_hls_continue.c では、連続実行を Enable している間は、キーボードで s キーとリターン・キーを押されるのを待っていて、押されたら、連続実行を Disable する。

lap_fil_hls_continue を実行したら、連続的にラプラシアンフィルタを実行することができた。tu1987 さんのラプラシアンフィルタの高速化Cソースコードを使用した場合なので、50 fps のはずだが、カメラが 15 fps なので、問題無いようだ。
lap_fil_hls_14_4_127_150419.png

最後に、lap_fil_hls_continue.c を貼っておく。

// lap_fil_hls_continue.c
// by marsee
// 2015/04/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;
    char line[256];
 
    //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);
    }

    //printf("%x\n", lap_fil_lsalvep->Bus_axi4ls_BaseAddress); 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);
    
    XLap_filter_axim_Set_lap_addr(lap_fil_lsalvep, (u32)LAPLACIAN_FILTER_ADDRESS);

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

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

    XLap_filter_axim_Start(lap_fil_lsalvep);
    XLap_filter_axim_EnableAutoRestart(lap_fil_lsalvep);

    do{
        printf("\nType <s>: quit ");
        gets(line);
    } while(!(line[0]=='s' || line[0]=='S')) ;
    
    XLap_filter_axim_DisableAutoRestart(lap_fil_lsalvep);
    
    gettimeofday(&end_time, NULL); // No.3
    
    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 - 11000000 + 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年04月19日 20:57 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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