FC2カウンター FPGAの部屋 Vitis_Libraries/vision/L3/examples/colordetect/をやってみた2
FC2ブログ

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

FPGAの部屋

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

Vitis_Libraries/vision/L3/examples/colordetect/をやってみた2

Vitis_Libraries/vision/L3/examples/colordetect/をやってみた1”の続き。

Vitis_Libraries/vision/L3/examples/colordetect/をやってみるということで、xclbin をビルドして、sd_card ディレクトリを作成させた。今回は、Vivado HLS プロジェクトと Vivado プロジェクトを見ていこう。

最初に Vivado HLS 2019.2 のプロジェクトから見ていこう。
Vivado HLS のプロジェクトは Vitis_Libraries/vision/L3/examples/colordetect/build/_x_ultra96v2_min2_hw/color_detect/color_detect/color_detect に入っている。
Vitis_Vision_58_200331.png

C コードの合成レポートを示す。
Vitis_Vision_57_200330.png

Latency の max が 8330244 クロックだった。これは 4k 画像を処理したときだと思うので、3840 ピクセル x 2160 行 = 8294400 ピクセルの処理を行ったときなので、約 1.00 クロック / ピクセルとなり、優秀な結果だと思う。

Latency の Detail -> Instance を見ると、Latency の max は 4k 画像の総ピクセル数くらいの値になっているが、総合したクロック数が同じような値なのは、各関数がDATAFLOW 指示子により並列に実行されているからだ。

次に Vivado 2019.2 のプロジェクトを見ていこう。
Vivado プロジェクトは Vitis_Libraries/vision/L3/examples/colordetect/build/_x_ultra96v2_min2_hw/link/vivado/vpl/prj ディレクトリにある。
Vitis_Vision_59_200331.png

ブロックデザインを示す。
Vitis_Vision_52_200330.png

m_axi_gmem0 から m_axi_gmem4 までの 5 つの AXI4 インターフェースの Master ポートがあるが、これは、xf_colordetect_accel.cpp で 5 つの AXI4 Master インターフェースが定義されているからだ。
xf_colordetect_accel.cpp の関数定義と入出力ポートの指示子の部分を引用する。

void color_detect(ap_uint<PTR_IN_WIDTH>* img_in,
                  unsigned char* low_thresh,
                  unsigned char* high_thresh,
                  unsigned char* process_shape,
                  ap_uint<PTR_OUT_WIDTH>* img_out,
                  int rows,
                  int cols) {
// clang-format off
    #pragma HLS INTERFACE m_axi      port=img_in        offset=slave  bundle=gmem0
   
    #pragma HLS INTERFACE m_axi      port=low_thresh    offset=slave  bundle=gmem1
    #pragma HLS INTERFACE s_axilite  port=low_thresh          bundle=control
    #pragma HLS INTERFACE m_axi      port=high_thresh   offset=slave  bundle=gmem2
    #pragma HLS INTERFACE s_axilite  port=high_thresh          bundle=control
 #pragma HLS INTERFACE s_axilite  port=rows          bundle=control
 #pragma HLS INTERFACE s_axilite  port=cols          bundle=control
    #pragma HLS INTERFACE m_axi      port=process_shape offset=slave  bundle=gmem3
    #pragma HLS INTERFACE s_axilite  port=process_shape         bundle=control
    #pragma HLS INTERFACE m_axi      port=img_out       offset=slave  bundle=gmem4
  
    #pragma HLS INTERFACE s_axilite  port=return              bundle=control


low_thresh, high_thresh, process_shape の 3 つのポートは AXI4 Master と AXI4 Lite Slave の双方に指定されている。こんなことができるのか。。。

前にやった Vitis_Libraries/vision/L2/examples/resize/xf_resize_accel.cpp の関数定義と入出力ポートの指示子の部分を引用する。

void resize_accel(ap_uint<INPUT_PTR_WIDTH>* img_inp,
                  ap_uint<OUTPUT_PTR_WIDTH>* img_out,
                  int rows_in,
                  int cols_in,
                  int rows_out,
                  int cols_out) {
// clang-format off
    #pragma HLS INTERFACE m_axi     port=img_inp  offset=slave bundle=gmem1
    #pragma HLS INTERFACE m_axi     port=img_out  offset=slave bundle=gmem2
    #pragma HLS INTERFACE s_axilite port=rows_in              bundle=control
    #pragma HLS INTERFACE s_axilite port=cols_in              bundle=control
    #pragma HLS INTERFACE s_axilite port=rows_out              bundle=control
    #pragma HLS INTERFACE s_axilite port=cols_out              bundle=control
    #pragma HLS INTERFACE s_axilite port=return                bundle=control


Vivado HLS の color_detect の impl/ip/drivers/src/xcolor_detect_color_detect.h を見ると、通常の m_axi 指示子の slave オプション付きと同じようだ。つまり、s_axilite 指示子は要らないんじゃないだろうか?

// control
// 0x00 : Control signals
//        bit 0  - ap_start (Read/Write/COH)
//        bit 1  - ap_done (Read/COR)
//        bit 2  - ap_idle (Read)
//        bit 3  - ap_ready (Read)
//        bit 7  - auto_restart (Read/Write)
//        others - reserved
// 0x04 : Global Interrupt Enable Register
//        bit 0  - Global Interrupt Enable (Read/Write)
//        others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
//        bit 0  - Channel 0 (ap_done)
//        bit 1  - Channel 1 (ap_ready)
//        others - reserved
// 0x10 : Data signal of img_in_V
//        bit 31~0 - img_in_V[31:0] (Read/Write)
// 0x14 : Data signal of img_in_V
//        bit 31~0 - img_in_V[63:32] (Read/Write)
// 0x18 : reserved
// 0x1c : Data signal of low_thresh
//        bit 31~0 - low_thresh[31:0] (Read/Write)
// 0x20 : Data signal of low_thresh
//        bit 31~0 - low_thresh[63:32] (Read/Write)
// 0x24 : reserved
// 0x28 : Data signal of high_thresh
//        bit 31~0 - high_thresh[31:0] (Read/Write)
// 0x2c : Data signal of high_thresh
//        bit 31~0 - high_thresh[63:32] (Read/Write)
// 0x30 : reserved
// 0x34 : Data signal of process_shape
//        bit 31~0 - process_shape[31:0] (Read/Write)
// 0x38 : Data signal of process_shape
//        bit 31~0 - process_shape[63:32] (Read/Write)
// 0x3c : reserved
// 0x40 : Data signal of img_out_V
//        bit 31~0 - img_out_V[31:0] (Read/Write)
// 0x44 : Data signal of img_out_V
//        bit 31~0 - img_out_V[63:32] (Read/Write)
// 0x48 : reserved
// 0x4c : Data signal of rows
//        bit 31~0 - rows[31:0] (Read/Write)
// 0x50 : reserved
// 0x54 : Data signal of cols
//        bit 31~0 - cols[31:0] (Read/Write)
// 0x58 : reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)


という訳で、color detect の Vivado プロジェクトの Address Editor を示す。
Vitis_Vision_53_200330.png

Vivado のインプリメンテーション結果を示す。
Vitis_Vision_54_200330.png
Vitis_Vision_55_200330.png

リソース使用量のテーブルも示す。
Vitis_Vision_56_200330.png
  1. 2020年03月31日 05:02 |
  2. Vitis_Vision
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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