FPGA活用回路&サンプル記述集(3) ―― ビデオ信号処理回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年3月25日
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記述
(
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
おおなか・つねお
ディーエスオー(株)
<筆者プロフィール>
大中 庸生.当社Webページにて,本記事のサポートや改良記事を掲載します.画像処理ハードウェアについてのご相談承ります.お気軽にお問い合わせ下さい.