FPGA活用回路&サンプル記述集(3) ―― ビデオ信号処理回路
tag: 半導体 電子回路 ディジタル・デザイン
技術解説 2009年3月25日
module NTSC( cSync, hCount, vCount, sc, oe, clk, nReset ) ;
input clk ;
input nReset ;
output cSync ;
output [8:0] hCount ;
output [9:0] vCount ;
output sc ;
output oe ;
reg [1:0] div1 ;
reg sc ;
reg [8:0] div2 ;
reg [9:0] div3 ;
reg oe ;
reg cSync ;
assign hCount = div2 ;
assign vCount =div3 ;
always @( posedge clk or negedge nReset ) begin
if( !nReset ) begin
div1 <= 0 ;←リセット時の各レジスタの初期化
div2 <= 0 ;
div3 <= 0 ;
cSync <= 0 ;
oe <= 0 ;
end
else begin
div1 <= div1 + 1 ;
sc <= div1[1] ; ←(1) クロックを4分周してサブキャリアを生成
div2 <= (div2 == 454 )? 0: div2 + 1 ; ←※15
if( div2 == 454 )begin
div3 <= (div3 == 524 )? 0 : div3 + 1 ; ←※16
end
oe <=( div1 == 1 && div2 == 0 && div3 ==0 )? ~oe : oe ;
case (div3[9:1])
0,1,2,6,7,8: ←(4) 等価パルスの生成
cSync <= div2 > 16 ;
3,4,5: ←垂直同期パルスの生成
cSync <= div2 > 422 ;
default ←水平同期パルスの生成
cSync <= div2 > 32 | ( div3[0]^oe ) ;
endcase
end
end
endmodule
input clk ;
input nReset ;
output cSync ;
output [8:0] hCount ;
output [9:0] vCount ;
output sc ;
output oe ;
reg [1:0] div1 ;
reg sc ;
reg [8:0] div2 ;
reg [9:0] div3 ;
reg oe ;
reg cSync ;
assign hCount = div2 ;
assign vCount =div3 ;
always @( posedge clk or negedge nReset ) begin
if( !nReset ) begin
div1 <= 0 ;←リセット時の各レジスタの初期化
div2 <= 0 ;
div3 <= 0 ;
cSync <= 0 ;
oe <= 0 ;
end
else begin
div1 <= div1 + 1 ;
sc <= div1[1] ; ←(1) クロックを4分周してサブキャリアを生成
div2 <= (div2 == 454 )? 0: div2 + 1 ; ←※15
if( div2 == 454 )begin
div3 <= (div3 == 524 )? 0 : div3 + 1 ; ←※16
end
oe <=( div1 == 1 && div2 == 0 && div3 ==0 )? ~oe : oe ;
case (div3[9:1])
0,1,2,6,7,8: ←(4) 等価パルスの生成
cSync <= div2 > 16 ;
3,4,5: ←垂直同期パルスの生成
cSync <= div2 > 422 ;
default ←水平同期パルスの生成
cSync <= div2 > 32 | ( div3[0]^oe ) ;
endcase
end
end
endmodule
リスト5-1 水平,垂直,等価パルスを生成するVerilog HDL記述
注15;(2) クロックを455分周して水平同期周期数の2倍を生成
注16;(3) 水平同期周期数の2倍を525分周して垂直同期周期数生成