FC2カウンター FPGAの部屋 ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)

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

FPGAの部屋

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

ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)

ZYBO用にVGAポート出力のみのキャラクタ・ディスプレイ・コントローラ IPを作っている。これは、出来たらGithubで公開しようと思っている。
以前のZYBOのキャラクタ・ディスプレイ・コントローラ IPは、”AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)”で完成したが、SVGA解像度のみで、VGAポートとHDMIポートに出力することができた。但し、HDMIは出力周波数が高いために、XGA解像度以上だとBUFGが対応せずに動作が不安定だった。そこで、HDMIポートを削除して、XPSプロジェクトのAdd IPダイアログで、VGA, SVGA, XGA, SXGA, HD解像度を切り替えられるように変更した。そこで、使用したのが、VHDLでは、constantを他のconstant値から変更できる方法で、Verilogでは、parameterを他のparameterから変更できる方法だ。下にそのブログ記事を示す。

ある constant の値で、他の constant の値を切り替える1(VHDL編)
ある constant の値で、他の constant の値を切り替える2(VHDL編)
ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)
ある constant の値で、他の constant の値を切り替える4(VHDL編3)
ある constant の値で、他の constant の値を切り替える5(VHDL編4、XPSプロジェクト、完成)


これらを応用して、VHDLではpackage、Verilogではインクルード・ファイルを作製した。そして、それに合わせて、HDLも変更した。

ISE14.7でプロジェクトを作製して、ISimでシミュレーションを行った。
テストベンチで解像度をHDにした時のキャラクタ・ディスプレイ・コントローラIPのフレームバッファの容量と設定値を下に示す。
ZYBO_CDC_AXI_slave_18_140317.png

RESOLUTION = 4 で HD解像度であることがわかる。
水平のピクセル数は1920、垂直のライン数は1080だった。FB_MEM_SIZEは32kByteだった。1920/8 x 1080/8 = 32,400word なので、それを上回る2のn乗になっている。

次に、テストベンチで解像度をVGAに変更した時のフレームバッファの容量と設定値を下に示す。
ZYBO_CDC_AXI_slave_19_140317.png

RESOLUTION = 0 で VGA解像度であることがわかる。
水平のピクセル数は640、垂直のライン数は480だった。FB_MEM_SIZEは8kByteだった。640/8 x 480/8 = 4,800word なので、それを上回る2のn乗になっている。

まずは、VHDLの video_timing_pkg.vhd を下に示す。

package video_timing_pkg is
    subtype RESLUTION_TYPE is integer range 0 to 4;
    type VIDEO_RECORD is record
        H_ACTIVE_VIDEO  : integer range 640 to 1920;
        H_FRONT_PORCH   : integer;
        H_SYNC_PULSE    : integer;
        H_BACK_PORCH    : integer;
        V_ACTIVE_VIDEO  : integer range 480 to 1080;
        V_FRONT_PORCH   : integer;
        V_SYNC_PULSE    : integer;
        V_BACK_PORCH    : integer;
    end record VIDEO_RECORD;
    type VIDEO_RECORD_A is array (RESLUTION_TYPE) of VIDEO_RECORD;
    constant CONST_VIDEO_R : VIDEO_RECORD_A := (
        0 => (  H_ACTIVE_VIDEO  =>  640,
                H_FRONT_PORCH   =>  16,
                H_SYNC_PULSE    =>  96,
                H_BACK_PORCH    =>  48,
                V_ACTIVE_VIDEO  =>  480,
                V_FRONT_PORCH   =>  11,
                V_SYNC_PULSE    =>  2,
                V_BACK_PORCH    =>  31
            ), -- VGA, 25MHz
        1 => (  H_ACTIVE_VIDEO  =>  800,
                H_FRONT_PORCH   =>  40,
                H_SYNC_PULSE    =>  128,
                H_BACK_PORCH    =>  88,
                V_ACTIVE_VIDEO  =>  600,
                V_FRONT_PORCH   =>  1,
                V_SYNC_PULSE    =>  4,
                V_BACK_PORCH    =>  23
            ), -- SVGA, 40MHz
        2 => (  H_ACTIVE_VIDEO  =>  1024,
                H_FRONT_PORCH   =>  24,
                H_SYNC_PULSE    =>  136,
                H_BACK_PORCH    =>  160,
                V_ACTIVE_VIDEO  =>  768,
                V_FRONT_PORCH   =>  2,
                V_SYNC_PULSE    =>  6,
                V_BACK_PORCH    =>  29
            ), -- XGA, 65MHz
        3 => (  H_ACTIVE_VIDEO  =>  1280,
                H_FRONT_PORCH   =>  48,
                H_SYNC_PULSE    =>  112,
                H_BACK_PORCH    =>  248,
                V_ACTIVE_VIDEO  =>  1024,
                V_FRONT_PORCH   =>  1,
                V_SYNC_PULSE    =>  3,
                V_BACK_PORCH    =>  38
            ), -- SXGA, 108MHz
        4 => (  H_ACTIVE_VIDEO  =>  1920,
                H_FRONT_PORCH   =>  88,
                H_SYNC_PULSE    =>  44,
                H_BACK_PORCH    =>  148,
                V_ACTIVE_VIDEO  =>  1080,
                V_FRONT_PORCH   =>  4,
                V_SYNC_PULSE    =>  5,
                V_BACK_PORCH    =>  36
            )  -- HD, 148.5MHz
    );
end package video_timing_pkg;


(2014/03/21:追記)
HD解像度の動作周波数が148.5MHzを作れなかったので、148MHzに変更し、以下の様にパラメータを変更した。

        4 => (  H_ACTIVE_VIDEO  =>  1920,
                H_FRONT_PORCH   =>  85,
                H_SYNC_PULSE    =>  44,
                H_BACK_PORCH    =>  145,
                V_ACTIVE_VIDEO  =>  1080,
                V_FRONT_PORCH   =>  4,
                V_SYNC_PULSE    =>  5,
                V_BACK_PORCH    =>  35
            )  -- HD, 148MHz


Verilog HDL用の video_timing_param.vh を下に示す。

// video_timing_param.vh
//

parameter integer H_ACTIVE_VIDEO = (RESOLUTION==0) ? 640 :  // VGA
                    (RESOLUTION==1) ?    800 :              // SVGA
                    (RESOLUTION==2) ?    1024 :             // XGA
                    (RESOLUTION==3) ?    1280 :             // SXGA
                    (RESOLUTION==4) ?    1920 : 1920;       // HD

parameter integer H_FRONT_PORCH = (RESOLUTION==0) ? 16 :    // VGA
                    (RESOLUTION==1) ?    40 :               // SVGA
                    (RESOLUTION==2) ?    24 :               // XGA
                    (RESOLUTION==3) ?    48 :               // SXGA
                    (RESOLUTION==4) ?    88 : 88;           // HD

parameter integer H_SYNC_PULSE = (RESOLUTION==0) ? 96 :     // VGA
                    (RESOLUTION==1) ?    128 :              // SVGA
                    (RESOLUTION==2) ?    136 :              // XGA
                    (RESOLUTION==3) ?    112 :              // SXGA
                    (RESOLUTION==4) ?    44 : 44;           // HD

parameter integer H_BACK_PORCH = (RESOLUTION==0) ? 48 :     // VGA
                    (RESOLUTION==1) ?    88 :               // SVGA
                    (RESOLUTION==2) ?    160 :              // XGA
                    (RESOLUTION==3) ?    248 :              // SXGA
                    (RESOLUTION==4) ?    148 : 148;         // HD

parameter integer V_ACTIVE_VIDEO = (RESOLUTION==0) ? 480 :  // VGA
                    (RESOLUTION==1) ?    600 :              // SVGA
                    (RESOLUTION==2) ?    768 :              // XGA
                    (RESOLUTION==3) ?    1024 :             // SXGA
                    (RESOLUTION==4) ?    1080 : 1080;       // HD

parameter integer V_FRONT_PORCH = (RESOLUTION==0) ? 11 :    // VGA
                    (RESOLUTION==1) ?    1 :                // SVGA
                    (RESOLUTION==2) ?    2 :                // XGA
                    (RESOLUTION==3) ?    1 :                // SXGA
                    (RESOLUTION==4) ?    4 : 4;             // HD

parameter integer V_SYNC_PULSE = (RESOLUTION==0) ? 2 :      // VGA
                    (RESOLUTION==1) ?    4 :                // SVGA
                    (RESOLUTION==2) ?    6 :                // XGA
                    (RESOLUTION==3) ?    3 :                // SXGA
                    (RESOLUTION==4) ?    5 : 5;             // HD

parameter integer V_BACK_PORCH = (RESOLUTION==0) ? 31 :     // VGA
                    (RESOLUTION==1) ?    23 :               // SVGA
                    (RESOLUTION==2) ?    29 :               // XGA
                    (RESOLUTION==3) ?    38 :               // SXGA
                    (RESOLUTION==4) ?    36 : 36;           // HD

    parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横?桁
    parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦?行
    parameter ALL_CHAR_SIZE = H_DISPLAY_SIZE*V_DISPLAY_SIZE;

    parameter RED_DOT_POS = 15; // 15〜13ビット目がRED
    parameter GREEN_DOT_POS = 12; // 12〜10ビット目がGREEN
    parameter BLUE_DOT_POS = 9; // 9〜7ビット目がBLUE
    parameter COLOR_ATTRIB_WIDHT = 3;    // 色情報のビット幅


(2014/03/21:追記)
HD解像度の動作周波数が148.5MHzを作れなかったので、148MHzに変更し、以下の様にパラメータを変更した。

// video_timing_param.vh
//

parameter integer H_ACTIVE_VIDEO = (RESOLUTION==0) ? 640 :  // VGA    25MHz
                    (RESOLUTION==1) ?    800 :              // SVGA   40MHz
                    (RESOLUTION==2) ?    1024 :             // XGA    65MHz
                    (RESOLUTION==3) ?    1280 :             // SXGA   108MHz
                    (RESOLUTION==4) ?    1920 : 1920;       // HD     148MHz

parameter integer H_FRONT_PORCH = (RESOLUTION==0) ? 16 :    // VGA
                    (RESOLUTION==1) ?    40 :               // SVGA
                    (RESOLUTION==2) ?    24 :               // XGA
                    (RESOLUTION==3) ?    48 :               // SXGA
                    (RESOLUTION==4) ?    85 : 85;           // HD

parameter integer H_SYNC_PULSE = (RESOLUTION==0) ? 96 :     // VGA
                    (RESOLUTION==1) ?    128 :              // SVGA
                    (RESOLUTION==2) ?    136 :              // XGA
                    (RESOLUTION==3) ?    112 :              // SXGA
                    (RESOLUTION==4) ?    44 : 44;           // HD

parameter integer H_BACK_PORCH = (RESOLUTION==0) ? 48 :     // VGA
                    (RESOLUTION==1) ?    88 :               // SVGA
                    (RESOLUTION==2) ?    160 :              // XGA
                    (RESOLUTION==3) ?    248 :              // SXGA
                    (RESOLUTION==4) ?    145 : 145;         // HD

parameter integer V_ACTIVE_VIDEO = (RESOLUTION==0) ? 480 :  // VGA
                    (RESOLUTION==1) ?    600 :              // SVGA
                    (RESOLUTION==2) ?    768 :              // XGA
                    (RESOLUTION==3) ?    1024 :             // SXGA
                    (RESOLUTION==4) ?    1080 : 1080;       // HD

parameter integer V_FRONT_PORCH = (RESOLUTION==0) ? 11 :    // VGA
                    (RESOLUTION==1) ?    1 :                // SVGA
                    (RESOLUTION==2) ?    2 :                // XGA
                    (RESOLUTION==3) ?    1 :                // SXGA
                    (RESOLUTION==4) ?    4 : 4;             // HD

parameter integer V_SYNC_PULSE = (RESOLUTION==0) ? 2 :      // VGA
                    (RESOLUTION==1) ?    4 :                // SVGA
                    (RESOLUTION==2) ?    6 :                // XGA
                    (RESOLUTION==3) ?    3 :                // SXGA
                    (RESOLUTION==4) ?    5 : 5;             // HD

parameter integer V_BACK_PORCH = (RESOLUTION==0) ? 31 :     // VGA
                    (RESOLUTION==1) ?    23 :               // SVGA
                    (RESOLUTION==2) ?    29 :               // XGA
                    (RESOLUTION==3) ?    38 :               // SXGA
                    (RESOLUTION==4) ?    35 : 35;           // HD

    parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
    parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;

    parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横?桁
    parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦?行
    parameter ALL_CHAR_SIZE = H_DISPLAY_SIZE*V_DISPLAY_SIZE;

    parameter RED_DOT_POS = 15; // 15〜13ビット目がRED
    parameter GREEN_DOT_POS = 12; // 12〜10ビット目がGREEN
    parameter BLUE_DOT_POS = 9; // 9〜7ビット目がBLUE
    parameter COLOR_ATTRIB_WIDHT = 3;    // 色情報のビット幅

  1. 2014年03月17日 20:01 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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