FPGA活用回路&サンプル記述集(3) ―― ビデオ信号処理回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年3月25日
module average_usage(
CLK25M, // input grobal
ARESET, // input grobal
VBlank, // output
HBlank, // output
D00IN, // output for check
D01IN,
D02IN,
D10IN,
D11IN,
D12IN,
D20IN,
D21IN,
D22IN,
Din, // input
Dout // output
);
input ARESET; // async reset(LowActive)
input CLK25M; // pixel clock(25MHz)
output VBlank;
output HBlank;
output D00IN; // for check output ←※2
output D01IN;
output D02IN;
output D10IN;
output D11IN;
output D12IN;
output D20IN;
output D21IN;
output D22IN;
input [7:0] Din;←※3
output [7:0] Dout;
/////////////////////////////////////////
//
// VideoTimingGenerator
//
/////////////////////////////////////////
wire [9:0] H_Address_out;
wire [9:0] V_Address_out;
VideoTimingGenerator SorterVideoTimingGenerator
(
.CLK(CLK25M), // input grobal
.RESET(ARESET), // input grobal
// VGA640x480 60Hz() ←※4
.HOLTotal(800), // input fixed
.VARTotal(525), // input fixed
.HOLValid(640), // input fixed
.VARValid(480), // input fixed
.VBlank(VBlank), // output for LineBuffer_4lines
.HBlank(HBlank), // output for LineBuffer_4lines
.H_Address_out(H_Address_out), // output for
LineBuffer_4lines
.V_Address_out(V_Address_out) // output for
LineBuffer_4lines
);
/////////////////////////////////////////
//
// LineBuffer_4lines
//
/////////////////////////////////////////
wire [7:0] RD0;
wire [7:0] RD1;
wire [7:0] RD2;
LineBuffer_4lines SorterLineBuffer_4lines
(
.RESET(ARESET), // input grobal
.WA({V_Address_out,H_Address_out}), // input ←※5
.WEN(~VBlank&~HBlank), // input
.WCK(CLK25M), // input
.WD(Din), // input
.RA({V_Address_out,H_Address_out}), // input
.REN(~VBlank&~HBlank), // input ←※6
.RCK(CLK25M), // input
.RD0(RD0), // output
.RD1(RD1), // output ←※7
.RD2(RD2) // output
);
/////////////////////////////////////////
//
// Read Data from "LineBuffer_4lines"
//
/////////////////////////////////////////
reg [7:0] D00IN;
reg [7:0] D01IN;
reg [7:0] D02IN;
reg [7:0] D10IN;
reg [7:0] D11IN;
reg [7:0] D12IN;
reg [7:0] D20IN;
reg [7:0] D21IN;
reg [7:0] D22IN;
// read data from line-buffer ←※8
always @( posedge CLK25M ) begin
// Upper Line
D02IN <= RD0;
D01IN <= D02IN;
D00IN <= D01IN;
// Middle Line
D12IN <= RD1;
D11IN <= D12IN;
D10IN <= D11IN;
// Under Line
D22IN <= RD2;
D21IN <= D22IN;
D20IN <= D21IN;
end
/////////////////////////////////////////
//
// "AverageFilter"
//
/////////////////////////////////////////
average AverageFilter ←※9
(
.CLK(CLK25M),
.RESET(ARESET),
.D00IN(D00IN),
.D01IN(D01IN),
.D02IN(D02IN),
.D10IN(D10IN),
.D11IN(D11IN),
.D12IN(D12IN),
.D20IN(D20IN),
.D21IN(D21IN),
.D22IN(D22IN),
.Dout(Dout)
);
endmodule
リスト3-2 平均値フィルタ処理を行うためのVerilog HDL記述(average_usage.v)
注2;3×3フィルタに入力される9個のデータをシミュレーション時に確認するために出力にアサイン
注3;分かりやすい記述のために,データ・バスの幅は8ビット(モノクロ)にした.データ・バス幅の変更は,このソースおよびLineBufferでカスタマイズ可能
注4;ビデオ信号の解像度は標準的なVGA(640×480)に設定した
注5;LineBuffer書き込みに必要な情報は書き込みアドレス:VとHのアドレス.書き込みイネーブル信号:VとHのブランク信号.書き込みクロック:ピクセル・クロック.書き込みデータ:入力データ
注6;LineBuffer読み出しに必要な情報は,読み出しアドレス:VとHのアドレス.読み出しイネーブル信号:VとHのブランク信号.読み出しクロック:ピクセル・クロック
注7;LineBufferから読み出されるデータ.3×3フィルタで必要な読み出しライン数は三つ(縦方向に3ライン分必要).このため読み出されるレジスタは三つある
注8;LineBufferから読み出されたデータを3×3フィルタの入力データに合わせるため,シフト・レジスタを用いて展開している.ラインごとに3ビットのシフト・レジスタを構成している
注9;ここでは平均値フィルタを呼び出している.フィルタの出力が平均値になるためそのまま出力している.メディアン・フィルタの呼び出し方もこれと同じ