FC2カウンター FPGAの部屋 ZedBoard用画像出力IPの作製2(シミュレーション)
FC2ブログ

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

FPGAの部屋

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

ZedBoard用画像出力IPの作製2(シミュレーション)

ZedBoard用画像出力IPの作製1(仕様の検討)”で仕様の検討が終了したので、テストベンチを作製してシミュレーションを行った。シミュレーションの際には、custom_vtc.v も入れてテストベンチを作製した。

シミュレーション結果を下に示す。まずは 17msec シミュレーションした全体の波形を示す。これは主に垂直同期関連の波形を観察するためだ。
video_out_zed_1_130611.png

次に垂直同期を確認するためのシミュレーション波形を下に示す。
video_out_zed_2_130611.png

最後にピクセルデータを確認するためのシミュレーション波形を下に示す。
video_out_zed_3_130611.png

下に、video_out_zed.v を示す。(2013/07/07:バグ修正)

// XPS のIP、v_axi4s_vid_out のVideo出力を受けてVGAポートとHDMI出力に出力する
// video_out_zed.v
// 2013/06/09
//

`default_nettype none

module video_out_zed # (
    parameter  VIDEO_DATA_WIDTH = 24
) (
    input    wire    pixclk,            // pixel clock
    input    wire    aresetn,        // AXI reset
    input    wire    video_de,    // data enable
    input    wire    video_hsync,
    input    wire    video_vsync,
    input    wire    video_vblank,
    input    wire    video_hblank,
    input    wire    [VIDEO_DATA_WIDTH-1:0]    video_data,
    
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_red,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_green,
    (* IOB = "FORCE" *) output    reg     [3:0]    vga_blue,
    (* IOB = "FORCE" *) output    reg        vga_hsync,
    (* IOB = "FORCE" *) output    reg        vga_vsync,
    
    (* IOB = "FORCE" *) output    wire    hdmi_clk,
    (* IOB = "FORCE" *) output    wire    hdmi_vsync,
    (* IOB = "FORCE" *) output    wire    hdmi_hsync,
    (* IOB = "FORCE" *) output    wire    hdmi_data_e,
    (* IOB = "FORCE" *) output    wire    [15:0]    hdmi_data
);

    reg        reset_1b, reset;
    reg        [7:0]    red, green, blue;
    reg        hsyncx, vsyncx;
    
    // synchronization of reset_1b
    always @(posedge pixclk) begin
        reset_1b <= ~aresetn;
        reset <= reset_1b;
    end
    
    // input FF
    always @(posedge pixclk) begin
        if (reset) begin
            red <=        8'd0;
            green <=    8'd0;
            blue <=        8'd0;
            hsyncx <=    1'b1;
            vsyncx <=    1'b1;
        end else begin
            red <=        video_data[23:16];
            green <=    video_data[15:8];
            blue <=        video_data[7:0];
            hsyncx <=    ~video_hsync;
            vsyncx <=    ~video_vsync;
        end
    end
    
    // Output VGA Port
    always @(posedge pixclk) begin
        if (reset) begin
            vga_hsync <=    1'b1;
            vga_vsync <=    1'b1;
        end else  begin
            vga_hsync <=    hsyncx;
            vga_vsync <=    vsyncx;
        end
    end
    always @(posedge pixclk) begin
        if (reset) begin
            vga_red <=        4'd0;
            vga_green <=    4'd0;
            vga_blue <=        4'd0;
        end else begin
            if (video_de) begin
                vga_red <=        red[7:4];
                vga_green <=    green[7:4];
                vga_blue <=        blue[7:4];
            end else begin
                vga_red <=        4'd0;
                vga_green <=    4'd0;
                vga_blue <=        4'd0;
            end
        end
    end
            
    conv_hdmi_out conv_hdmi_out_inst (
        .clk_disp(pixclk),
        .reset_disp(~aresetn),
        .red(red),
        .green(green),
        .blue(blue),
        .hsyncx(hsyncx),
        .vsyncx(vsyncx),
        .display_enable(video_de),
        .hdmi_clk(hdmi_clk),
        .hdmi_vsync(hdmi_vsync),
        .hdmi_hsync(hdmi_hsync),
        .hdmi_data_e(hdmi_data_e),
        .hdmi_data(hdmi_data)
    );
    
endmodule

`default_nettype wire


次に、テストベンチ、video_out_zed_tb.v を下に示す。

`default_nettype none
`timescale 100ps / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   03:40:14 06/11/2013
// Design Name:   video_out_zed
// Module Name:   D:/HDL/FndtnISEWork/Zynq-7000/ZedBoard/test/video_out_zed/video_out_zed_tb.v
// Project Name:  video_out_zed
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: video_out_zed
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module video_out_zed_tb;

    // Inputs
    wire pclk;
    wire aresetn;
    wire video_de;
    wire video_hsync;
    wire video_vsync;
    wire video_vblank;
    wire video_hblank;
    wire [23:0] video_data;

    // Outputs
    wire [3:0] vga_red;
    wire [3:0] vga_green;
    wire [3:0] vga_blue;
    wire vga_hsync;
    wire vga_vsync;
    wire hdmi_clk;
    wire hdmi_vsync;
    wire hdmi_hsync;
    wire hdmi_data_e;
    wire [15:0] hdmi_data;

    // R, G, B 毎に違った生成多項式のM系列を用意した
    function [7:0] mseqf8_R (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[3] ^ din[2] ^ din[1];
            mseqf8_R = {din[6:0], xor_result};
        end
    endfunction
    
    function [7:0] mseqf8_G (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[4] ^ din[2] ^ din[0];
            mseqf8_G = {din[6:0], xor_result};
        end
    endfunction

    function [7:0] mseqf8_B (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[5] ^ din[2] ^ din[1];
            mseqf8_B = {din[6:0], xor_result};
        end
    endfunction

    reg        [7:0]    mseq8r = 8'd1;
    reg        [7:0]    mseq8g = 8'd1;
    reg        [7:0]    mseq8b = 8'd1;
    
    // Instantiate the Unit Under Test (UUT)
    video_out_zed video_out_zed_i (
        .pclk(pclk), 
        .aresetn(aresetn), 
        .video_de(video_de), 
        .video_hsync(video_hsync), 
        .video_vsync(video_vsync), 
        .video_vblank(video_vblank), 
        .video_hblank(video_hblank), 
        .video_data(video_data), 
        .vga_red(vga_red), 
        .vga_green(vga_green), 
        .vga_blue(vga_blue), 
        .vga_hsync(vga_hsync), 
        .vga_vsync(vga_vsync), 
        .hdmi_clk(hdmi_clk), 
        .hdmi_vsync(hdmi_vsync), 
        .hdmi_hsync(hdmi_hsync), 
        .hdmi_data_e(hdmi_data_e), 
        .hdmi_data(hdmi_data)
    );

    // Instantiate the Unit Under Test (UUT)
    custom_vtc custom_vtc_i (
        .vclk(pclk), 
        .aresetn(aresetn), 
        .vtc_ce(1'b1), 
        .vtc_act_vid(video_de), 
        .vtc_vsync(video_vsync), 
        .vtc_hsync(video_hsync), 
        .vtc_vblank(video_vblank), 
        .vtc_hblank(video_hblank)
    );

    // Red のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8r <= mseqf8_R(mseq8r);
    end
    
    // Green のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8g <= mseqf8_G(mseq8g);
    end
    
    // Blue のM系列符号生成
    always @(posedge pclk) begin
        // if (mt9d111_cs==ACTIVE_DATA_TIME)
            mseq8b <= mseqf8_B(mseq8b);
    end
    
    assign video_data = {mseq8r, mseq8g, mseq8b};
    
    // pclk generate
    clk_gen #(
        .CLK_PERIOD(250),    // 25.0nsec, 40MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) pclk_from_pll_i (
        .clk_out(pclk)
    );
    
    // aresetn generate
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESETi (
        .reset_out(aresetn)
    );

endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


後の conv_hdmi_out.v のVerilog HDLコードは、”ZedBoardでHDMI出力14(YCbCr4:2:2 変換)”を参照のこと。
conv_rgb2ycbcr.v は、”RGB―YCbCr変換の検討2(Verilog HDLで実装)”を参照のこと。
  1. 2013年06月11日 04:49 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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