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

大中 庸生

`timescale 1ns / 1ps

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;ここでは平均値フィルタを呼び出している.フィルタの出力が平均値になるためそのまま出力している.メディアン・フィルタの呼び出し方もこれと同じ

Column メディアン・フィルタ

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! 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日