FC2カウンター FPGAの部屋 DVI、HDMIの勉強4(キャラクタ・ディスプレイ・コントローラをDVI出力にする Verilog編)
FC2ブログ

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

FPGAの部屋

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

DVI、HDMIの勉強4(キャラクタ・ディスプレイ・コントローラをDVI出力にする Verilog編)

DVI、HDMIの勉強3(XAPP495のvtc_demo.v を試す2)”の続き。

前回までで、vtc_demo.v を試すのは終了した。今回は、キャラクタ・ディスプレイ・コントローラをDVI出力にしてHDMIコネクタから画像を出力する。

まずは、vtc_demo.v を参考にして、R, G, Bとhsync, vsync を入れれば、TMDS信号(DVIやHDMIの信号)を出力する dvi_disp.v を作成した。Xilinxのライセンスの関係で、残念ながらソースは公開できない。ポートマップだけ下に公開する。

// dvi_disp.v 
// DVI表示ユニット
// 

`default_nettype none

module dvi_disp #(parameter CLKIN_PERIOD = 40.0) // VGA解像度
(
    input    wire    pixclk,                // pixel clock
    input    wire    reset_in,            // active high
    input    wire    [7:0]    red_in,        // RED入力
    input    wire    [7:0]    green_in,    // GREEN入力
    input    wire    [7:0]    blue_in,    // BLUE入力
    input    wire    hsync,
    input    wire    vsync,
    input    wire    display_enable,        // 表示が有効
    output    wire    [3:0]    TMDS,
    output    wire    [3:0]    TMDSB
);


これをキャラクタ・ディスプレイ・コントローラと合わせて、トップのファイルを作った。CharDispCtrlerTest_HDMI.v を下に示す。

// CharDispCtrlerTest_HDMI.v
// CharDispCtrlerTest.vのHDMI用のラッパー、HDMIコネクタから出力する

`default_nettype none

module CharDispCtrlerTest_HDMI (
    input    wire            sysclk,
    input    wire            reset_sw,
    output    wire    [3:0]    TMDS,
    output    wire    [3:0]    TMDSB
);
    wire clk_100;
    wire pixclk;
    wire reset;
    wire locked;
    wire vga_red, vga_green, vga_blue;
    wire vga_hsync, vga_vsync;
    wire display_enable;
    
    pixclk_gen pixclk_gen_inst
    (// Clock in ports
        .CLK_IN1(sysclk),      // IN
        // Clock out ports
        .CLK_OUT1(clk_100),     // OUT
        .CLK_OUT2(pixclk),     // OUT
        // Status and control signals
        .RESET(reset_sw),// IN
        .LOCKED(locked)      // OUT
    );
    
    assign reset = !locked;
    
    CharDispCtrlerTest CharDispCtrlerTest_inst (
        .clk(pixclk),
        .reset(reset),
        .VGA_RED(vga_red),        // 1bit
        .VGA_GREEN(vga_green),    // 1bit
        .VGA_BLUE(vga_blue),    // 1bit
        .VGA_HSYNC(vga_hsync),
        .VGA_VSYNC(vga_vsync),
        .display_enable(display_enable)
    );
    
    dvi_disp #(
        .CLKIN_PERIOD(40.0))
    dvi_disp_inst (
        .pixclk(pixclk),
        .reset_in(reset),
        .red_in({8{vga_red}}),
        .green_in({8{vga_green}}),
        .blue_in({8{vga_blue}}),
        .hsync(vga_hsync),
        .vsync(vga_vsync),
        .display_enable(display_enable),
        .TMDS(TMDS),
        .TMDSB(TMDSB)
    );
endmodule    

`default_nettype wire


pixclk_gen のCLK_OUT1は入力クロックそのままの100MHz、CLK_OUT2はピクセルクロックの25MHz(VGA解像度)を出力する。

更に、テストベンチ CharDispCtrlerTest_HDMI_tb.v も下に示す。”defparam uut.CharDispCtrlerTest_inst.ENABLE_COUNT = 23'd000004;”は、キャラクタを描画するタイミングを取るためのカウンタを階層をまたいで変更している。これは、通常ではシミュレーション時にキャラクタが表示されるのがとっても遅いため、カウンタ値を変更して表示を早めるために使用している。これが出来るのがVerilogの良い所でもあり、怖い所でもある。

module CharDispCtrlerTest_HDMI_tb;

    // Inputs
    reg sysclk;
    reg reset_sw;

    // Outputs
    wire [3:0] TMDS;
    wire [3:0] TMDSB;

    // Instantiate the Unit Under Test (UUT)
    CharDispCtrlerTest_HDMI uut (
        .sysclk(sysclk), 
        .reset_sw(reset_sw), 
        .TMDS(TMDS), 
        .TMDSB(TMDSB)
    );

    parameter PERIOD = 10;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    initial    // Clock process for clk
    begin
        #OFFSET;
        forever
        begin
            sysclk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) sysclk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    // Instantiate the Unit Under Test (UUT)
    defparam uut.CharDispCtrlerTest_inst.ENABLE_COUNT = 23'd000004; // シミュレーション

    initial begin
        // Initialize Inputs
        reset_sw = 1'b1;

        // Wait 100 ns for global reset to finish
        #100;
        reset_sw = 1'b0;
        
        // Add stimulus here
        #20000000    $stop;
    end
      
endmodule


下に100usec までのシミュレーション結果を示す。
DVI_HDMI_3_120218.png

あえて論評しない。

今度は、インプリメントしてみた。その結果を下に示す。
DVI_HDMI_4_120218.png

うまくインプリメントできたので、Atlysボードにダウンロードしたら、キャラクタ・ディスプレイ・コントローラが動作した。
DVI_HDMI_5_120218.jpg

うまく行きました。
今回はVerilogだったので、Digilent社のVmodCAMのサンプルを参考にVHDLで書いてみようと思う。こっちはもう少しブログに書けるかと思う。
  1. 2012年02月18日 07:47 |
  2. DVI, HDMI
  3. | トラックバック:0
  4. | コメント:2

コメント

GJ! キャラジェネはSDフォーマット対応のものしかないので、HD化するに当たり、自前で作りました。縁取り機能がめんどくさかったですね。
あと、キャラのデザインも全部自分で作らないといけないので、若いのに頼んでます(^-^)/
  1. 2012/02/18(土) 10:48:10 |
  2. URL |
  3. 山猿 #L8qX7C.g
  4. [ 編集 ]

ありがとうございます。
XAPP495があったのでできたようなものですが、だいたい何やっているかはわかりました。
キャラクタのデザインはVisioでマスを染めて自分で1から作っています。
  1. 2012/02/18(土) 21:03:35 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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