FC2カウンター FPGAの部屋 AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム10(ラプラシアンフィルタ処理)

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

FPGAの部屋

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

AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム10(ラプラシアンフィルタ処理)

AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム9(カメラ画像表示は完成)”の続き。

AXI VDMAを使用してカメラ画像をディスプレイに表示することができた。今回は2つのAXI4-Stream Switch を切り替え、ラプラシアンフィルタIPの連続処理を設定して、ラプラシアンフィルタ処理後の画像をディスプレイに表示する。

サブモジュールの camera_interface を示す。
V_ZYBO_CAMD_151_45_150604.png

カメラ画像を表示する場合は、axis_switch_1 でカメラ画像のストリームをM00_AXISへスイッチして、そのままaixs_switch_0 でS00_AXIS をスイッチし、AXI VDMAへ渡しているわけだ。
ラプラシアンフィルタIPを通す時は、axis_switch_1 でカメラ画像のストリームをM01_AXISへスイッチして、lap_filter_axis_0 を通ってから、aixs_switch_0 でS01_AXIS をスイッチし、AXI VDMAへ渡す。

ラプラシアンフィルタ処理を行うためのCソースファイル、lap_fil_on.c を下に示す。

// lap_fil_on.c
// 2015/06/17 by marsee
//
// Refered to http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2014_4/ug902-vivado-high-level-synthesis.pdf
//

#include <stdio.h>
#include "xlap_filter_axis.h"
#include "xparameters.h"

int main(){
    XLap_filter_axis Xlap_fil_axis;
    XLap_filter_axis_Config *Xlap_fil_axisPtr;

    // Look Up the device configuration
    Xlap_fil_axisPtr = XLap_filter_axis_LookupConfig(0);
    if (!Xlap_fil_axisPtr){
        fprintf(stderr, "XLap_filter_axis configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XLap_filter_axis_CfgInitialize(&Xlap_fil_axis, Xlap_fil_axisPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XLap_filter_axis\n");
        return(-1);
    }

    // axis_switch_1, 1to2 ,Select M01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // laplacian filter AXIS Start
    XLap_filter_axis_Start(&Xlap_fil_axis);
    XLap_filter_axis_EnableAutoRestart(&Xlap_fil_axis);

    // axis_switch_0, 2to1, Select S01_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x1);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    return(0);
}


これを実行したところ、青い色でエッジが見えた。
V_ZYBO_CAMD_151_91_150625.jpg

元画像はこれ。
V_ZYBO_CAMD_151_92_150625.jpg

青いエッジになってしまうのは何故か?というと、AXI4-Stream 版ラプラシアンフィルタIPのCソースファイルで、ラプラシアンフィルタ処理を行ったデータを各色RGBに振り分けなかったからだ。
下のAXI4-Stream 版ラプラシアンフィルタIPのVivado HLS 2014.4 のプロジェクトの lap_filter_axis.cpp を見ると、lap.data = の部分があるがラプラシアンフィルタ処理をした値をそのまま入れているからだ。
V_ZYBO_CAMD_151_93_150624.png

次はこのAXI4-Stream 版ラプラシアンフィルタIPのバグをFIXする。

最後に、ラプラシアンフィルタ処理から、カメラ画像表示に戻るソフトウェアの cam_return.c を貼っておく。

// cam_return.c
// 2015/06/25 by marsee
//

#include <stdio.h>
#include "xlap_filter_axis.h"
#include "xparameters.h"

int main(){
    XLap_filter_axis Xlap_fil_axis;
    XLap_filter_axis_Config *Xlap_fil_axisPtr;

    // Look Up the device configuration
    Xlap_fil_axisPtr = XLap_filter_axis_LookupConfig(0);
    if (!Xlap_fil_axisPtr){
        fprintf(stderr, "XLap_filter_axis configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XLap_filter_axis_CfgInitialize(&Xlap_fil_axis, Xlap_fil_axisPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XLap_filter_axis\n");
        return(-1);
    }

    // axis_switch_1, 1to2 ,Select M00_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR+0x44), 0x80000000); // disable
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_1_BASEADDR), 0x2); // Commit registers

    // laplacian filter AXIS AutoRestart disable
    XLap_filter_axis_DisableAutoRestart(&Xlap_fil_axis);

    // axis_switch_0, 2to1, Select S00_AXIS
    // Refer to http://marsee101.blog19.fc2.com/blog-entry-3177.html
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR+0x40), 0x0);
    Xil_Out32((XPAR_CAMERA_INTERFACE_AXIS_SWITCH_0_BASEADDR), 0x2); // Commit registers

    return(0);
}

  1. 2015年06月25日 04:49 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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