Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ビデオラインセレクタ(笑)を作る~検討編その3

DigiKeyで買うものが決まらないのだが、とりあえず後段の回路の設計のために、LMH1981のビヘイビアモデルをVerilogでサクッっと書いてみました。
H-SYNCとV-SYNCの関係がイマイチデータブックからは読み取りがたいのですが、まあこのへんは現物を見てからということで。。。
簡単なテストベンチを用意して、Veritakを使って動かしてみるが、まあ所望する動作をしているようです。
 最後にソースを張っておきます。もちろん「なんちゃってモデル」なので、ビデオ信号を入力できるわけではなく、単に出力をするだけ。それもCSYNCは「はしょって」あります(どうせ使い道ないでしょ?)。

---
[本日の御託]
 ん~、これ欲しい。hauppauge HD PVR Model1212ハードウェアでのH264エンコードは「地雷」かも知れないが、$249は魅力だ・・・

(インデントがめちゃめちゃ)

//
// NS LMH1981 simplified bahavior model  (C)2008 B.O.
//  public tasks
//    task p1080 -- perform 1 frame with 1080p
//    task p720  -- perform 1 frame with 720p
//    task p480  -- perform 1 frame with 480p
//    task i1080 -- perform 1 frame with 1080i
//    task i480  -- perform 1 frame with 480i

`timescale 1ns/1ns
module LMH1981(
    output reg hsout_o ,    // H sync
    output reg vsout_o ,    // V sync
    output reg oeout_o ,    // Odd (oe=0), Even (oe=1)
    output vfout_o        // VF DATA  
) ;

    reg [10:0] line, maxline ;
    reg interlace ;
    time t_hinterval, t_hsout ;
    real vsync_delay ; // unit is H preiod

    integer frame ;
    wire frame2, startofframe ; // debug purpose
    reg [10:0] Data ;    // for vfout
    assign vfout_o = Data[10] ;

    // debug purpose
    assign frame2 = (frame == 2) ? 1'b1 : 1'b0 ;
    assign startofframe = (line == 1 ) ? 1'b1 : 1'b0 ;


    // internal tasks
    task HSync ;
    begin
    for( line = 1 ; line <= maxline ; line = line + 1 ) begin
        fork
        begin
            hsout_o <= 1'b0 ;
            #(t_hsout) hsout_o <= 1'b1 ;
        end
        # t_hinterval ;
        join
    end
    end
    endtask //HSync ;

    task VSync ;
    integer maxframe ;
    begin
    vsout_o <= 1'b1 ;

    if( interlace ) begin
        maxframe = 2 ;
        oeout_o <= 1'b0 ;
    end // if
    else begin
        maxframe = 1 ;
        oeout_o <= 1'b1 ;
    end // if

    for( frame = 1 ; frame <= maxframe ; frame = frame + 1 ) begin
        fork
        begin
            # (vsync_delay * t_hinterval )
                vsout_o <= 1'b0 ;
            if( interlace ) begin
                oeout_o <= ~oeout_o ;
            end // if
            # (3 * t_hinterval )
            vsout_o <= 1'b1 ;
        end
        #( maxline/2.0 *  t_hinterval) ;
        join
    end // for
    end
    endtask // VSync

    task VFData ;
    integer frame, maxframe ;
    begin
    Data = 10'd0 ;
    if( interlace ) begin
        maxframe = 2 ;
    end // if
    else begin
        maxframe = 1 ;
    end // else
    for( frame = 1 ; frame <= maxframe ; frame = frame + 1 ) begin
        @(negedge vsout_o ) ;
        repeat(3)
        @(negedge hsout_o ) ;

        if ( interlace ) begin
        if( frame == 1 ) begin
            Data <= maxline /2 - 2 ;
        end // if
        else begin
            Data <= maxline /2 - 3 ;
        end // else
        end // if
        else begin
        Data <= maxline - 3 ;
        end // else
        repeat( 11 ) begin
        @(negedge hsout_o )
            Data <= Data << 1 ;
        end // repeat
    end // for
    end    
    endtask // VFData ;

    task Do1Frame ;
    begin
    fork
        HSync ;
        VSync ;
        VFData ;
    join
    end
    endtask // Do1Frame ;


    //
    //  Public task to control the model
    //
    task p1080 ;
    begin
    maxline = 1125 ;
    t_hinterval = 1_000_000_000 / maxline / 29.97 ;
    t_hsout = 475 ;
    interlace  = 1'b0 ; // false
    vsync_delay = 1   ; //  1 H
    
    Do1Frame ;
    end
    endtask // p1080 ;

    task p720 ;
    begin
    maxline = 750 ;
    t_hinterval = 1_000_000_000 / maxline / 29.97 ;
    t_hsout = 525 ;
    interlace  = 1'b0 ; // false
    vsync_delay = 1   ; //  1 H
    
    Do1Frame ;
    end
    endtask // p720 ;

    task p480 ;
    begin
    maxline = 525 ;
    t_hinterval = 1_000_000_000 / maxline / 29.97 ;
    t_hsout = 2300 ;
    interlace  = 1'b0 ; // false
    vsync_delay = 7   ; // 7 H
    
    Do1Frame ;
    end
    endtask // p480 ;

    task i1080 ;
    begin
    maxline = 1125 ;
    t_hinterval = 1_000_000_000 / maxline / 29.97 ;
    t_hsout = 475 ;
    interlace  = 1'b1 ; // true
    vsync_delay = 0.5 ; // 0.5 H
    
    Do1Frame ;
    end
    endtask // i1080 ;
    
    task i480 ;
    begin
    maxline = 525 ;
    t_hinterval = 1_000_000_000 / maxline / 29.97 ;
    t_hsout = 2500 ;
    interlace  = 1'b1 ; // true
    vsync_delay = 3.5  ; //  3.5 H
    
    Do1Frame ;
    end
    endtask // i480 ;

endmodule // LMH1981




コメント

コメントの投稿


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

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/500-d638378e
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。