FC2カウンター FPGAの部屋 Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 3
fc2ブログ

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

FPGAの部屋

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

Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 3

Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認する 2”の続き。

今まで積み上げてきた IP を使用して、Vitis Vision Library L1 の AXI4-Stream 入出力版 medianblur を 実機で動作を確認してみようとうことで、前回は、制約を追加することで、タイミングエラーを解消した。今回は、Vitis 2021.2 を起動して、プラットフォーム・プロジェクトとアプリケーション・プロジェクトを作成し、アプリケーション・ソフトウェアを作成する。そして、ビルドを行って、実機で動作を確認しよう。

Vivado 2021.2 から Vitis 2021.2 を起動した。
median_vvl_axis プロジェクトのディレクトリに vitis_work を作成して、そこを Vitis の workspace として指定した。
Vitis_Vision2_124_220128.png

median_filter_wrapper プラットフォーム・プロジェクトと median_filter_axis アプリケーション・プロジェクトを作成した。
Vitis_Vision2_125_220128.png

Vitis HLS 2021.2 を使用して画像ファイルを C のヘッダファイルに変換する”で作成した pict_data.h をインポートした。
median_filter_axis.c を作成した。
Vitis_Vision2_126_220129.png

median_filter_axis.c を示す。

// median_filter_axis.c
// 2022/01/29 by marsee
//

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

#include "xmedian_blur_accel_axis.h"
#include "xdma2axis2st.h"
#include "xaxis2dma2st.h"
#include "pict_data.h"

#define FRAME_BUFFER_ADDRESS 0x10000000
#define DMA_DEST_ADDRESS 0x10200000

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600

int bmp_write(unsigned int addr);
void Xil_DCacheFlush(void);

int main(){
    XMedian_blur_accel_axis xmf_axis_ap;
    XDma2axis2st xdma2axis_ap;
    XAxis2dma2st xaxis2dma_ap;
    int inbyte_in;

    XMedian_blur_accel_axis_Initialize(&xmf_axis_ap, 0);
    XDma2axis2st_Initialize(&xdma2axis_ap, 0);
    XAxis2dma2st_Initialize(&xaxis2dma_ap, 0);

    XDma2axis2st_Set_y_size(&xdma2axis_ap, (u32)VERTICAL_LINES);
    XDma2axis2st_Set_x_size(&xdma2axis_ap, (u32)HORIZONTAL_PIXELS);
    XDma2axis2st_Set_sel(&xdma2axis_ap, (u32)0);
    XDma2axis2st_Set_in_r(&xdma2axis_ap, (u32)FRAME_BUFFER_ADDRESS);

    XMedian_blur_accel_axis_Set_img_width(&xmf_axis_ap, (u32)HORIZONTAL_PIXELS);
    XMedian_blur_accel_axis_Set_img_height(&xmf_axis_ap, (u32)VERTICAL_LINES);

    XAxis2dma2st_Set_y_size(&xaxis2dma_ap, (u32)VERTICAL_LINES);
    XAxis2dma2st_Set_x_size(&xaxis2dma_ap, (u32)HORIZONTAL_PIXELS);
    XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);
    XAxis2dma2st_Set_out_r(&xaxis2dma_ap, (u32)DMA_DEST_ADDRESS);

    bmp_write(FRAME_BUFFER_ADDRESS);
    Xil_DCacheFlush();

    XAxis2dma2st_Start(&xaxis2dma_ap);
    XMedian_blur_accel_axis_Start(&xmf_axis_ap);
    XDma2axis2st_Start(&xdma2axis_ap);

    Xil_Out32(XPAR_BITMAP_DISP_CNTRLER_0_BASEADDR, DMA_DEST_ADDRESS);

    while(1){
        printf("\nPlease input <0> or <1> (<q> : exit) = ");
        fflush(stdout);
        inbyte_in = inbyte();
        printf("%c", inbyte_in);
        fflush(stdout);
        switch(inbyte_in) {
            case '0': //bmp image
                XDma2axis2st_Set_sel(&xdma2axis_ap, (u32)0);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XMedian_blur_accel_axis_Start(&xmf_axis_ap);
                XDma2axis2st_Start(&xdma2axis_ap);
                break;
            case '1': // filter
                XDma2axis2st_Set_sel(&xdma2axis_ap, (u32)1);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)1);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XMedian_blur_accel_axis_Start(&xmf_axis_ap);
                XDma2axis2st_Start(&xdma2axis_ap);
                break;
            case 'q': // exit
                return(0);
        }
    }
}

int bmp_write(unsigned int addr){
    for(int y=0; y<VERTICAL_LINES; y++){
        for(int x=0; x<HORIZONTAL_PIXELS; x++){
            Xil_Out32(addr+(y*HORIZONTAL_PIXELS+x)*sizeof(int),
                ((int)pict_file_array[y][x][2]<<16)+((int)pict_file_array[y][x][1]<<8)+(int)pict_file_array[y][x][0]);
        }
    }
    return(0);
}


ビルドを行ったところ、成功した。
median_filter_axis.elf が生成された。
Vitis_Vision2_127_220129.png

ZYBO Z7-20 の HDMI ポートをディスプレイに接続し、USB ケーブルを接続して、電源を ON した。
gtk_term をスーバーバイザー・モードで起動した。 115200 bps , 8 bit , 1 stop bit
Explorer の medain_filter_axis_system をクリックして、 Run ボタンをクリックし、FPGA をコンフィギュレーションし、アプリケーション・ソフトウェアを起動した。
gtk_term の画面に”Please input <0> or <1> (<q> : exit) = ”が表示された。
同時にディスプレイにノイズ入りの画像が表示された。
Vitis_Vision2_130_220129.jpg

キーボードで 1 を押すと、メディアン・フィルタが入ってノイズが消えた。成功だ。。。やったぜ。。。
Vitis_Vision2_131_220129.jpg

gtk_term 画面を示す。
Vitis_Vision2_129_220129.png
  1. 2022年01月29日 04:59 |
  2. Vitis_Vision
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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