FC2カウンター FPGAの部屋 Vivado HLS 2014.4 でディスプレイ・コントローラを作る4(PIPELINEディレクティブのrewindオプション)
FC2ブログ

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

FPGAの部屋

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

Vivado HLS 2014.4 でディスプレイ・コントローラを作る4(PIPELINEディレクティブのrewindオプション)

Vivado HLS 2014.4 でディスプレイ・コントローラを作る3(実機でテスト)”の続き

前回で終わりにするつもりだったのだが、ツィッターで、waka3_m さんにPIPELINEディレクティブのrewind オプションの事を教えて頂いたので、やってみることにした。waka3_m さんありがとうございました。

さて、PIPELINEディレクティブのrewind オプションは、”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2014.3) 2014 年 10 月 1 日”の165ページからの”パイプ ラ イ ン されたループの巻き戻しによるパフ ォーマンス改善”に書かれている。
それによると、PIPELINEディレクティブのrewind オプションを付けると、ループは継続して実行されるそうだ。

それでは、display_cont.cpp を次のように変更して、高位合成してみよう。display_cont() はもう要らなそうなので、display_cont_sub() だけにした。

// display_cont.cpp
// 2015/06/03 by marsee
//
// 画面を4分割した第1象限は赤、第2象限は緑、第3象限は青、第4象限は白を表示する
//

#include <stdio.h>
#include <string.h>
#include <ap_int.h>

// SVGA 解像度
#define H_ACTIVE_VIDEO    800
#define H_FRONT_PORCH    40
#define H_SYNC_PULSE    128
#define H_BACK_PORCH    88
#define H_SUM            (H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH)

#define V_ACTIVE_VIDEO    600
#define V_FRONT_PORCH    1
#define V_SYNC_PULSE    4
#define V_BACK_PORCH    23
#define V_SUM            (V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH)

void display_cont_sub(ap_uint<8> *red, ap_uint<8> *green, ap_uint<8> *blue, ap_uint<1> *display_enable, ap_uint<1> *hsyncx, ap_uint<1> *vsyncx){
#pragma HLS INTERFACE ap_none register port=red
#pragma HLS INTERFACE ap_none register port=green
#pragma HLS INTERFACE ap_none register port=blue
#pragma HLS INTERFACE ap_none register port=display_enable
#pragma HLS INTERFACE ap_none register port=hsyncx
#pragma HLS INTERFACE ap_none register port=vsyncx
#pragma HLS INTERFACE ap_ctrl_none port=return

    ap_uint<16> h_count, v_count;

    for (v_count=0; v_count<V_SUM; v_count++){
        for (h_count=0; h_count<H_SUM; h_count++){
#pragma HLS PIPELINE rewind
            if (h_count > (H_ACTIVE_VIDEO +H_FRONT_PORCH) && h_count < (H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE))
                *hsyncx = 0;
            else
                *hsyncx = 1;

            if (v_count > (V_ACTIVE_VIDEO + V_FRONT_PORCH) && v_count < (V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE))
                *vsyncx = 0;
            else
                *vsyncx = 1;

            if (h_count < H_ACTIVE_VIDEO && v_count < V_ACTIVE_VIDEO)
                *display_enable = 1;
            else
                *display_enable = 0;

            if (v_count < V_ACTIVE_VIDEO/2){
                if (h_count < H_ACTIVE_VIDEO/2){
                    *red=0xff; *green=0; *blue=0;
                } else if (h_count < H_ACTIVE_VIDEO){
                    *red=0; *green=0xff; *blue=0;
                } else {
                    *red=0; *green=0; *blue=0;
                }
            } else if (v_count < V_ACTIVE_VIDEO){
                if (h_count < H_ACTIVE_VIDEO/2){
                    *red=0; *green=0; *blue=0xff;
                } else if (h_count < H_ACTIVE_VIDEO){
                    *red=0xff; *green=0xff; *blue=0xff;
                } else {
                    *red=0; *green=0; *blue=0;
                }
            } else {
                *red=0; *green=0; *blue=0;
            }
        }
    }
}


高位合成結果を示す。
HLS_Disp_Cont_22_150608.png
HLS_Disp_Cont_23_150608.png

Latency が min = 663168, max = 663169 で、Interval が 663168 になった。この値は、水平ピクセル x 垂直ラインの総ピクセル数は、(800+40+128+88)*(600+1+4+23) = 663168 ピクセルと一致している。

次に、 display_cont_sim プロジェクトでシミュレーションした結果を下に示す。
HLS_Disp_Cont_24_150608.png

C++ ソースコードで、 for() の2重ループが終了して、初期化処理をして、また for() の2重ループに入るまでに時間を計測してみた。
HLS_Disp_Cont_25_150608.png

26.4 us で、初期化処理の時間が 0 になっていた。やった~。これで HDL で書いたのと同じになった。

ZドライブのHLS_disp_cont_151 プロジェクト(Vivado 2015.1)の display_cont_top IP の display_cont_sub.v を書き換えて、再IP化した。
HLS_Disp_Cont_26_150608.png

これで、論理合成、インプリメント、ビットストリームの生成を行った。
HLS_Disp_Cont_27_150608.png

ZYBOをコンフィギュレーションして、ディスプレイに表示してみたところ、左上に赤、右上に緑、左下に青、右下に白が表示された。
前回のVGA出力はメイン・ディスプレイではきちんと写ったが、サブ・ディスプレイでは、一番上のラスタの右端が少し歪んでいたのだが、今回の表示は完璧だ。良かった。。。
HLS_Disp_Cont_28_150608.jpg
  1. 2015年06月08日 04:46 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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