FPGA活用回路&サンプル記述集(3) ―― ビデオ信号処理回路

大中 庸生

module VideoTimingGenerator
(
    CLK,
 RESET,
 
 HOLTotal,
 VARTotal,
 HOLValid,
 VARValid,
 
 HOLFront,
 VARFront,
 HOLSync,
 VARSync,
 
 VARSyncStart,
 VARSyncEnd,
 
 HBlank,
 VBlank,
 
 HSync,
 VSync,
 
 H_Address_out,
 V_Address_out,
 

);

parameter HWidth = 11;
parameter VWidth = 11;


input   RESET; //リセット入力
input   CLK; //ピクセルクロック入力

input [HWidth -1: 0] HOLTotal; 
                       //水平走査周期
input [VWidth -1: 0] VARTotal; 
                    //水平有効表示期間
input [HWidth -1: 0] HOLValid; 
                    //垂直走査周期
input [VWidth -1: 0] VARValid; 
                    //垂直有効表示期間

input [HWidth -1: 0] HOLFront; 
               //水平フロントポーチ期間
input [VWidth -1: 0] VARFront; 
                    //水平同期信号期間
input [HWidth -1: 0] HOLSync; 
               //垂直フロントポーチ期間
input [VWidth -1: 0] VARSync; 
                    //垂直同期信号期間

input [HWidth -1: 0] VARSyncStart; 
             //垂直同期スタート位置指定
input [HWidth -1: 0] VARSyncEnd; 
               //垂直同期エンド位置指定

output     HBlank; 
            //水平帰線消去期間タイミング
output     VBlank; 
            //垂直帰線消去期間タイミング

output     HSync; //水平同期信号
output     VSync; //垂直同期信号

output [HWidth -1: 0] H_Address_out;
output [VWidth -1: 0] V_Address_out;


 reg [HWidth -1: 0] HOLTotalCounter; 
//水平カウンタです.
 reg [VWidth -1: 0] VARTotalCounter; 
//垂直カウンタです.
 reg [HWidth -1: 0] HOLValidCounter; 
//水平有効表示期間カウンタです.
 reg [VWidth -1: 0] VARValidCounter; 
//垂直有効表示期間カウンタです.
 reg [HWidth -1: 0] HOLFrontCounter; 
//水平フロントポーチカウンタです.
 reg [VWidth -1: 0] VARFrontCounter; 
//垂直フロントポーチカウンタです.
 reg [HWidth -1: 0] HOLSyncCounter; 
//水平同期信号期間カウンタです.
 reg [VWidth -1: 0] VARSyncCounter; 
//垂直同期信号期間カウンタです.
 reg     HBlank;
 reg     VBlank;
 reg     HSync;
 reg     VSync;
 reg     VsStart; 
       //垂直同期信号スタートフラグです.
 reg     VsEnd; 
         //垂直同期信号エンドフラグです.
 

 //タイミングジェネレータです.
 always @ (posedge CLK) begin
  if(~ RESET) //リセット信号Lowで,すべ
//てのカウンタ,信号をクリアします.
   begin
    HOLTotalCounter <= 0;
    VARTotalCounter <= 0;
    HOLValidCounter <= 0;
    VARValidCounter <= 0;
    HOLFrontCounter <= 0;
    VARFrontCounter <= 0;
    HOLSyncCounter  <= 0;
    VARSyncCounter  <= 0;
    HBlank <= 0;
    VBlank <= 0;
    HSync <= 0;
    VSync <= 0;
    VsStart <= 0;
    VsEnd <= 0;
    
   end
   
  else
   begin
    if( HOLTotalCounter == 
(HOLTotal-1) ) 
     begin 
         //水平走査周期満了時の処理です.
         //水平タイミング系のカウンタ,信
//号をクリアします.
      HOLTotalCounter <= 0;
      HOLValidCounter <= 0;
      HOLFrontCounter <= 0;
      HOLSyncCounter <= 0;
      HSync <= 0;
      
      HBlank <= 0;
      
      //水平走査周期満了時に垂直系の更新
                        //を行います.
      if(VARTotalCounter == 
(VARTotal-1) )
       begin 
        //垂直走査周期満了時の処理です.
        //垂直タイミング系のカウンタ,信号
//をクリアします.
        VARTotalCounter <= 0;
        VARValidCounter <= 0;
        VARFrontCounter <= 0;
        VARSyncCounter <= 0;
        VBlank <= 0;
        VSync <= 0;
        VsStart <= 0;
        VsEnd <= 0;
        
       end
       
      else if(VARValidCounter ==  
(VARValid-1) )
       begin //垂直期間内における,垂直有
//効表示期間満了時,及びその後の処理です.
    //垂直カウンタのカウントは継続します.
        VARTotalCounter <= VARTotal
Counter + 1;
        VBlank <= 1; 
           //垂直帰線消去期間に入ります.
        
        //垂直同期信号発生指示フラグの生
//成です.後の状況から判定していきます.
        if ( VARSyncCounter == 
(VARSync) )
         begin 
         //垂直同期期間満了後,垂直同期エ
//ンドフラグをセットします.
          VsStart <= 0;
          VsEnd <= 1;
          
         end
         
        else if( VARFrontCounter == 
(VARFront) )
         begin //垂直フロントポーチ期間//満了後,垂直同期スタートフラグをセットし,
//垂直同期カウンタをカウントします.
          VARSyncCounter <= VARSync
Counter + 1;
          VsStart <= 1;
          VsEnd <= 0;
          
         end
         
        else
         begin //垂直フロントポーチ期間//満了までは,垂直フロントポーチカウンタを
                    //カウントします.
          VARFrontCounter <= VAR
FrontCounter + 1;
          
         end
         
        
       end
       
      else 
       begin 
        //垂直有効期間における処理です.
        //垂直カウンタ,垂直有効表示期間カ
//ウンタをカウントします.
        VARTotalCounter <= VAR
TotalCounter + 1;
        VARValidCounter <= VARValidCounter + 1;
        
       end
       
      
     end
     
    
    else if( HOLValidCounter == 
(HOLValid-1) )
     begin //水平期間内における,水平有効//表示期間満了時,及びその後の処理です.
    //水平カウンタのカウントは継続します.
      HOLTotalCounter <= HOLTotal
Counter + 1;
      HBlank <= 1; //水平帰線消去期間に//入ります.
      
      //水平同期信号の生成です.後の状況
                //から判定していきます.
      if ( HOLSyncCounter == 
(HOLSync) )
       begin //水平同期期間満了後,水平同
//期信号をクリアします.
        HSync <= 0;
        
       end
       
      else if( HOLFrontCounter == (HOLFront) )
       begin //水平フロントポーチ期間満//了後,水平同期信号をセットし,水平同期カウ
//ンタをカウントします.
        HOLSyncCounter <= HOLSync
Counter + 1;
        HSync <= 1;
        
       end
       
      else
       begin //水平フロントポーチ期間満
 //了までは,水平フロントポーチカウンタをカ
                      //ウントします.
        HOLFrontCounter <= HOLFront
Counter + 1;
        HSync <= 0;
        
       end
       
      
     end
     
    
    else
   begin //水平有効期間における処理です.
      //水平カウンタ,水平有効表示期間カウ
//ンタをカウントします.
      HOLTotalCounter <= HOLTotal
Counter + 1;
      HOLValidCounter <= HOLValid
Counter + 1;
      
     end
     
    
    //垂直同期信号位置調整部です
    if( VsStart ) 
    //垂直同期信号スタート位置を決めます.
     begin
      if( HOLTotalCounter == VAR
SyncStart )
       VSync <= 1;
       
     end
     
    if( VsEnd ) 
      //垂直同期信号エンド位置を決めます.
     begin
      if( HOLTotalCounter == VAR
SyncEnd )
       VSync <= 0;
       
     end
     
    
   end
  
 end
 
 //水平ピクセルアドレス出力として,水平有効
 //表示期間カウンタ値を出力します.
 assign H_Address_out = HOLValid
Counter;
 
 //垂直ラインアドレス出力として,垂直有効表
//示期間カウンタ値を出力します.
 assign V_Address_out = VARValid
Counter;
 

endmodule
リスト1-1 汎用的なタイミング・ジェネレータのVerilog HDL記述

おおなか・つねお
ディーエスオー(株)
<筆者プロフィール>
大中 庸生.当社Webページにて,本記事のサポートや改良記事を掲載します.画像処理ハードウェアについてのご相談承ります.お気軽にお問い合わせ下さい.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日