VerilogHDLでVGAディスプレイのコードで分からない個所がいくつかあるので教えてください。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかし
記事: 48
登録日時: 12年前

VerilogHDLでVGAディスプレイのコードで分からない個所がいくつかあるので教えてください。

#1

投稿記事 by たかし » 11年前

コード:

`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
大学の授業でVGAディスプレイについて学習しましたが、よく理解できませんでした。
上のプログラムでどういう動作をしているのかわからないところがあります。


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;

最後にこの代入がよくわかりません。
これを代入するとどうなるのですか?


かなり理解できていないため質問が多く漠然としてしまい申し訳ありません。
どうかよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: VerilogHDLでVGAディスプレイのコードで分からない個所がいくつかあるので教えてください。

#2

投稿記事 by softya(ソフト屋) » 11年前

本業はプログラマなので VerilogHDLは詳しくない&忘れてますが分かるだけ。

>①
>assign BLANK = (hcnt > (HOR_DISPLAY - 1)) | (vcnt > (VER_DISPLAY - 1));
>の意味がわかりません。

水平と垂直の同期カウンタが、それぞれ一定値を超えた時にBLANKが1になります。
つまり、同期のブランク信号の生成です。

※ 変数の名前から想像で推測しています。

②これも同様です。
VGAの信号を理解していれば、想像できると思います。
h:水平信号です。 v:垂直信号です。

あとは、とりあえず置いておくとしてVGAの信号に関して理解がされていない様に思います。
そちらはどのぐらい理解されているのでしょうか?

【補足】
④は外部の回路的な信号線だと思いますが意味が分かりませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る