`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 14:49:22 04/02/2009
// Design Name:
// Module Name: vga_timing
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module vga_timing(CLK25M, RST, VGA_R_I, VGA_G_I, VGA_B_I, H_POS, V_POS, VGA_HSYNC, VGA_VSYNC, BLANK, VGA_R_O, VGA_G_O, VGA_B_O);
parameter HOR_TIME = 800;
parameter HOR_DISPLAY = 640;
parameter HOR_FRONT_PORCH = 16;
parameter HOR_SYNC = 96;
parameter VER_TIME = 521;
parameter VER_DISPLAY = 480;
parameter VER_FRONT_PORCH = 10;
parameter VER_SYNC = 2;
input CLK25M;
input RST;
input [3:0] VGA_R_I;
input [3:0] VGA_G_I;
input [3:0] VGA_B_I;
output [9:0] H_POS;
output [9:0] V_POS;
output VGA_HSYNC;
output VGA_VSYNC;
output BLANK;
output [3:0] VGA_R_O;
output [3:0] VGA_G_O;
output [3:0] VGA_B_O;
reg [9:0] hcnt;
reg [9:0] vcnt;
reg h_sync_N;
reg v_sync_N;
reg [3:0] vga_r, vga_g, vga_b;
assign BLANK = (hcnt > (HOR_DISPLAY - 1)) | (vcnt > (VER_DISPLAY - 1));
always @(posedge CLK25M or negedge RST) begin
if (!RST) begin
hcnt <= 10'd0;
vcnt <= 10'd0;
h_sync_N <= 1'b1;
v_sync_N <= 1'b1;
vga_r <= 4'b0000;
vga_g <= 4'b0000;
vga_b <= 4'b0000;
end
else begin
hcnt <= hcnt + 10'd1;
if (hcnt == (HOR_DISPLAY + HOR_FRONT_PORCH - 1))
h_sync_N <= 1'b0;
else if (hcnt ==(HOR_DISPLAY + HOR_FRONT_PORCH + HOR_SYNC - 1))
h_sync_N <= 1'b1;
else if (hcnt == (HOR_TIME - 1)) begin
hcnt <= 0;
vcnt <= vcnt == (VER_TIME -1) ? 0 : vcnt + 1;
if (vcnt == (VER_DISPLAY + VER_FRONT_PORCH -1))
v_sync_N <= 1'b0;
else if (vcnt == (VER_DISPLAY + VER_FRONT_PORCH + VER_SYNC - 1))
v_sync_N <= 1'b1;
end
vga_r <= BLANK ? 4'b0000 : VGA_R_I;
vga_g <= BLANK ? 4'b0000 : VGA_G_I;
vga_b <= BLANK ? 4'b0000 : VGA_B_I;
end
end
assign VGA_R_O = vga_r;
assign VGA_G_O = vga_g;
assign VGA_B_O = vga_b;
assign H_POS = hcnt;
assign V_POS = vcnt;
assign VGA_HSYNC = h_sync_N;
assign VGA_VSYNC = v_sync_N;
endmodule
上のプログラムでどういう動作をしているのかわからないところがあります。
①
assign BLANK = (hcnt > (HOR_DISPLAY - 1)) | (vcnt > (VER_DISPLAY - 1));
の意味がわかりません。
BLANK という出力にhcntとvcntの値によって1か0を入れているようですが、hcntやvcntがどのような時ということですか?
②
if (!RST) begin
hcnt <= 10'd0;
vcnt <= 10'd0;
h_sync_N <= 1'b1;
v_sync_N <= 1'b1;
vga_r <= 4'b0000;
vga_g <= 4'b0000;
vga_b <= 4'b0000;
end
これはリセットされた時の記述ですよね?
その時に初期化しているhcnt,vcnt,h_sync_N,v_sync_Nとは何なのですか。
どのような役割を果たすものなのかわかりません。
③
else begin
hcnt <= hcnt + 10'd1;
if (hcnt == (HOR_DISPLAY + HOR_FRONT_PORCH - 1))
h_sync_N <= 1'b0;
else if (hcnt ==(HOR_DISPLAY + HOR_FRONT_PORCH + HOR_SYNC - 1))
h_sync_N <= 1'b1;
else if (hcnt == (HOR_TIME - 1)) begin
hcnt <= 0;
vcnt <= vcnt == (VER_TIME -1) ? 0 : vcnt + 1;
if (vcnt == (VER_DISPLAY + VER_FRONT_PORCH -1))
v_sync_N <= 1'b0;
else if (vcnt == (VER_DISPLAY + VER_FRONT_PORCH + VER_SYNC - 1))
v_sync_N <= 1'b1;
end
これらのif文の意味がわかりません。
これはhcntやvcntがどのような状態の時にそれぞれどのような処理をしているのですか?
④
assign H_POS = hcnt;
assign V_POS = vcnt;
assign VGA_HSYNC = h_sync_N;
assign VGA_VSYNC = v_sync_N;
最後にこの代入がよくわかりません。
これを代入するとどうなるのですか?
かなり理解できていないため質問が多く漠然としてしまい申し訳ありません。
どうかよろしくお願いします。