FC2カウンター FPGAの部屋 ZynqBerryZero で HDMI にラプラシアン・フィルタ画像を出力する4(Vitis 2020.2 編)
fc2ブログ

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

FPGAの部屋

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

ZynqBerryZero で HDMI にラプラシアン・フィルタ画像を出力する4(Vitis 2020.2 編)

ZynqBerryZero で HDMI にラプラシアン・フィルタ画像を出力する3(Vivado 2020.2編1)”の続き。

ZynqBerryZero 用のラプラシアン・フィルタを Vitis HLS 2020.2 で実装してみようということで、前回は、 IP を 800 ピクセル X 600 行に変更し(現在は、 64 ピクセル X 48 行)、 C コードの合成、 Export RTL を行って IP を修正してから、その IP を Vivado 2020.2 で使用して、回路を作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、Export Hardware を行って、Vitis 2020.2 を立ち上げ、プラットフォームとアプリケーション・プロジェクトを作成して、実機確認を行う。

XSA ファイルを作成する。

Vivado 2020.2 で、File メニューから Export -> Export Hardware... を選択する。

Export Hardware Platform ダイアログが立ち上げた。

Output では、Include bitstream のラジオボタンをクリックする。

後はデフォルトのまま lap_filter_axis_bd_wrapper.xsa を作成する。
ZynqBerryZero_137_201213.png

Vitis 2020.2 を起動する。

Vivado の Tools メニューから Launch Vitis IDE を選択する。

Vitis IDE Launcher が起動する。
Brows... ボタンをクリックして、ZynqBerryZero/lap_filter_axis_test ディレクトリの下に vitis_work ディレクトリを新規作成する。
Launch ボタンをクリックする。
ZynqBerryZero_138_201213.png

Vitis 2020.2 が起動した。
Create Application Project をクリックして、アプリケーション・プロジェクトを新規作成する。
ZynqBerryZero_139_201213.png

New Application Project ダイアログが表示された。
ZynqBerryZero_140_201213.png

Platform では、Create a new platform form hardware (XSA) タブをクリックする。
Hardware Specfication の Browse... ボタンをクリックして、 lap_filter_axis_bd_wrapper.xsa を指定した。
ZynqBerryZero_141_201213.png

Application Project Details では、Application project name を lap_filter_axis_test とした。
ZynqBerryZero_142_201213.png

Domain はそのままとした。
ZynqBerryZero_143_201213.png

Templates では、 Empty Application を選択する。
ZynqBerryZero_144_201213.png

プラットフォームとアプリケーション・プロジェクトが新規作成された。
ZynqBerryZero_145_201213.png

bmp_data.h と lap_filter_axis_test.c をインポートした。
ZynqBerryZero_146_201213.png

lap_filter_axis_test.c を示す。

/*
 * lap_filter_axis_test.c
 *
 *  Created on: 2020/12/13
 *      Author: marsee
 */

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

#include "xlap_filter_axis.h"
#include "xdma2axis.h"
#include "xaxis2dma2st.h"
#include "bmp_data.h"

#define FRAME_BUFFER_ADDRESS 0x8000000
#define DMA_DEST_ADDRESS 0x8200000

#define HORIZONTAL_PIXELS   800
#define VERTICAL_LINES      600

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

int main(){
    XLap_filter_axis xlf_axis_ap;
    XDma2axis xdma2axis_ap;
    XAxis2dma2st xaxis2dma_ap;
    int inbyte_in;

    XLap_filter_axis_Initialize(&xlf_axis_ap, 0);
    XDma2axis_Initialize(&xdma2axis_ap, 0);
    XAxis2dma2st_Initialize(&xaxis2dma_ap, 0);

    XDma2axis_Set_y_size(&xdma2axis_ap, (u32)VERTICAL_LINES);
    XDma2axis_Set_x_size(&xdma2axis_ap, (u32)HORIZONTAL_PIXELS);
    XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
    XDma2axis_Set_in_V(&xdma2axis_ap, (u32)FRAME_BUFFER_ADDRESS);

    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_V(&xaxis2dma_ap, (u32)DMA_DEST_ADDRESS);

    bmp_write(FRAME_BUFFER_ADDRESS);
    Xil_DCacheFlush();

    XAxis2dma2st_Start(&xaxis2dma_ap);
    XLap_filter_axis_Start(&xlf_axis_ap);
    XDma2axis_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
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)0);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)0);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_Start(&xdma2axis_ap);
                break;
            case '1': // Laplacian filter
                XDma2axis_Set_sel(&xdma2axis_ap, (u32)1);
                XAxis2dma2st_Set_sel(&xaxis2dma_ap, (u32)1);

                XAxis2dma2st_Start(&xaxis2dma_ap);
                XLap_filter_axis_Start(&xlf_axis_ap);
                XDma2axis_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)bmp_file_array[y][x][2]<<16)+((int)bmp_file_array[y][x][1]<<8)+(int)bmp_file_array[y][x][0]);
        }
    }
    return(0);
}


bmp_data.h は”Vivado HLS 2019.1 を使用してBMPファイルをC のヘッダファイルに変換する”を使用して、800 ピクセル X 600 行の画像を C のヘッダファイルに変換してある。

lap_filter_axis_test_system を右クリックし右クリックメニューから Build Project を選択する。
ビルドが始まり、 lap_filter_axis_test.elf が生成された。
ZynqBerryZero_147_201213.png

ZynqBerryZero を USB でパソコンに接続し、ミニHDMI ポートからディスプレイに接続した。

gtkterm を起動して、ZynqBerryZero の USB シリアルポートに接続し、115200 bps に設定した。

Assistant ウインドウの lap_filter_axis_test_system -> lap_filter_axis_test -> Debug を右クリックし右クリックメニューから Run -> Launch on Hardware (Single Application Debug) を選択する。
ZynqBerryZero_148_201213.png

ZynqBerryZero をコンフィギュレーションし、アプリケーション・ソフトウェアを起動した。
絵はディスプレイに表示されたのだが、真っ赤だった。
ZynqBerryZero_156_201214.jpg

gtkterm 上で 1 を入力すると、エッジの画像にはなっているようだ。
ZynqBerryZero_157_201214.jpg

白黒反転しているようでもある?

TMDS_tx_2_G 以外の _P, _N を反転してみた。
ZynqBerryZero_152_201213.png

制約ファイルを作成した。
ZynqBerryZero_153_201213.png

現在の制約ファイルを示す。
ZynqBerryZero_154_201213.png

これでやってみたのだが、同様に画像が真っ赤だった。ビットストリームが更新されていないのだろうか?
今の所、原因は分かっていない?
  1. 2020年12月15日 04:32 |
  2. ZynqBerryZero
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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