Dies Aliquanti

スポンサーサイト

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

ビデオラインセレクタ(笑)を作る~設計編その2

 昨日の方針に従って、アルゴリズムの検証をするために、Verilog-HDLでさくっと回路を書いてみることにします。
 最終的にはPICでインプリメントするつもりですが、回路をシミュレーションで検証するにはこのほうが簡単なので・・・RTLは最後に載せます。

 最初のalwaysブロックは、HSYNCによるカウンタの制御です。
 // manage line count
のコメント以下のifブロックは、1フィールドあたりのHSYNCの数をreg [10:0] count で数えています。数えた結果は、totalというregに入ります。

 この結果を // decoder for maxval , initialval, D1,D2 ...
以下のalwaysブロックでデコードしています。D_oは、D1~D4を表示します。その他の変数は、「本当のline」数を数えているカウンタの制御に用いられます。

 すこし戻り、 // manage real line number in 'line'
以下のifブロックでは、「本当のline」数-1をreg [10:0]line に数えています。

 最後のassign文はlineと目標とするラインの比較、同期パルスの作成をしています。信号gateNにはダイナミックハザードが乗ってしまいますが、HSYNCの立ち上がり周辺に限られるので問題にはなりません。
 論理合成可能な記述にしましたので、XilinxのISEにかけて見ましたが、特に問題はないようです。

---
[本日の御託]
 相変わらず庭の芝の雑草がひどいです。昨日も朝から雑草抜きをしていたら、お隣のご主人が、ペンチ型の雑草抜きを教えてくれました。周りの芝も一緒に抜いてしまうのがなんだが、確かに手でやるより楽です。早速ホームセンターで買い求めてみたが、調子にのってやっていたら、親指にマメができてしまいました。ううむ、なかなかうまくいかんものよのう・・・

//
// line selecter
//  (c) 2008 B.O.
//
module lineSel(
    input hs_i ,    // H Sync  -- from LMH1981
    input vs_i ,    // V Sync  -- from LMH1981
    input oe_i ,     // Odd (oe=1), Even (oe=0) -- from LMH1981

    input [10:0] linesel_i,    // line to select
    input linesel_oe_i,     // Odd/Even field select Odd(=1)
    input linesel_both_i,   // =0, Odd or Evn/ =1 Both
    input por_i,     // power on reset

    output reg [5:1] D_o,     // indicater D1,D2,,D5
    output sel_o     // Selecter out
);
    reg [10:0] count , total, line , maxval, maxval_half, maxval_half2,
     initialval, initialval2;
    reg prev_vsync ;

    always@( posedge hs_i or posedge por_i ) begin
 if( por_i ==1'b1 ) begin
     count <= 11'b0 ;
     line <= 11'd20 ;
     total <= 11'b0 ;
     prev_vsync <= 1'b0 ;
 end // if
 else begin
     prev_vsync <= vs_i ;

     // manage line count
     if( (prev_vsync == 1'b1) && ( vs_i == 1'b0 )) begin
  total <= count ;
  count <= 11'b0 ;
     end // if
     else begin
  count <= count + 11'b1 ;
     end

     // manage real line number in 'line'
     //  in case of VSYNC, aligning counter
     if(  (( linesel_both_i == 1'b1 ) 
   &&  (prev_vsync == 1'b1) && ( vs_i == 1'b0 ))
      ||(( linesel_both_i == 1'b0 ) 
   &&  (prev_vsync == 1'b1) && ( vs_i == 1'b0 )
   && ( linesel_oe_i == oe_i ) ) ) begin
  if ( oe_i == 1'b1 ) begin // odd
      line <= initialval ;
  end // if
  else begin
      line <= initialval2 ;
  end // else
     end // if
     //  overflow control
     else if((linesel_both_i == 1'b1) //  in case of interlace, both fileds
      && (   ((oe_i == 1'b1 ) && ( line == maxval_half))
          || ((oe_i == 1'b0 ) && ( line == maxval_half2)) ) ) begin
  line <= 11'b1 ;    // interlace both fiels overflow, line count
     end // elseif
     else if( line == maxval )  begin  // in case of Odd or Even
  line <= 11'b1 ;   
     end // else if
     else begin
  line <= line + 11'd1 ;
     end // else

 end // else
    end // always
 
    // decoder for maxval , initialval, D1,D2 ...
    always@( total ) begin
 case ( total[10:5] )
     'b00_1000 : begin
  D_o <= 5'b0_0001 ; // D1 480i
  maxval  <= 525 ;
  maxval_half <= 525 / 2 + 1 ;
  maxval_half2 <= 525 / 2 ;
  initialval <= 11'd6 ;
  initialval2 <= 11'd5 ;
     end
     'b01_0000 : begin
  D_o <= 5'b0_0010 ; // D2 480p
  maxval <= 525 ;
  maxval_half <= 525 ;
  maxval_half2 <= 525 ;
  initialval <= 11'd9 ;
  initialval2<= 11'd9 ;
     end
     'b01_0111 : begin
  D_o <= 5'b0_0100 ; // D3 720p
  maxval <= 750 ;
  maxval_half <= 750 ;
  maxval_half2 <= 750 ;
  initialval <= 11'd3 ;
  initialval2 <= 11'd3 ;
     end
     'b01_0001 : begin
  D_o <= 5'b0_1000 ; // D4 1080i
  maxval <= 1125 ;
  maxval_half <= 1125 /2 + 1 ;
  maxval_half2 <= 1125 /2 ;
  initialval <= 11'd3 ;
  initialval2 <= 11'd2 ;
     end
     'b10_0011 : begin
  D_o <= 5'b1_0000 ; // D5 1080p
  maxval <= 1125 ;
  maxval_half <= 1125 ;
  maxval_half2 <= 1125 ;
  initialval <= 11'd3 ;
  initialval2 <= 11'd3 ;
     end
     default  : begin
  D_o <= 5'b0_0000 ; // out of range
  maxval <= 0 ;
  maxval_half <= 11'd0 ;
  initialval <= 11'd0 ;
  initialval2 <= 11'd0 ;
     end
 endcase
    end // always

    assign gateN = ~( line ==  linesel_i ) ;
    assign sel_o  = ~( ~gateN & ~ hs_i ) ;
   
endmodule // lineSel
// [EOF] lineSel.v



コメント

コメントの投稿


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

トラックバック

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

FC2Ad

まとめ

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