`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 02:55:12 02/12/2010 // Design Name: // Module Name: VGA // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module VGA(CLK_50M,VGA_R,VGA_B,VGA_G,VGA_HSYNC,VGA_VSYNC ); input CLK_50M; //50MHzクロック入力 output [3:0] VGA_R; //赤出力4ビット output [3:0] VGA_G; //緑出力4ビット output [3:0] VGA_B; //青出力4ビット output VGA_HSYNC; //水平同期端子 output VGA_VSYNC; //垂直同期端子 reg [3:0] vga_r_out; //赤 レジスタ reg [3:0] vga_g_out; //緑 レジスタ reg [3:0] vga_b_out; //青 レジスタ reg vga_hsync_out; //水平同期 レジスタ reg vga_vsync_out; //垂直同期 レジスタ reg [1:0] count; //25MHz作成用レジスタ reg [9:0] hcount; //水平位置カウンタ reg [9:0] vcount; //垂直位置カウンタ reg [3:0] color; //色設定 レジスタ wire CLK; //25MHzクロック assign VGA_R = vga_r_out; //赤 出力 assign VGA_G = vga_g_out; //緑 出力 assign VGA_B = vga_b_out; //青 出力 assign VGA_HSYNC = vga_hsync_out; //水平同期 出力 assign VGA_VSYNC = vga_vsync_out; //垂直同期 出力 assign CLK = count[0]; //25MHzクロック 出力 parameter H_ACTIVE = 640; //水平 表示範囲  640 parameter H_FRONT = 656; //水平 表示+フロントポーチ  640+16  parameter H_SYNC = 752; //水平 表示+フロントポーチ+同期  640+16+96 parameter H_BACK = 800; //水平 表示+フロントポーチ+同期+バックポーチ 640+16+96+48 parameter V_ACTIVE = 480; //垂直 表示範囲 480 parameter V_FRONT = 490; //垂直 表示+フロントポーチ 480+10 parameter V_SYNC = 492; //垂直 表示+フロントポーチ+同期 480+10+2 parameter V_BACK = 521; //垂直 表示+フロントポーチ+同期+バックポーチ  480+10+2+29 always @(posedge CLK_50M)begin //50MHzのクロックから count <= count + 1; //25MHzを作り出す end //CLKから25MHzを出力する always @(posedge CLK)begin //************** 全体のカウント *****************// if(hcount < H_BACK) hcount <= hcount + 1; else begin hcount <= 0; if(vcount < V_BACK) vcount <= vcount + 1; else vcount <= 0; end //***************描画範囲 ******************// if(hcount < H_ACTIVE && vcount < V_ACTIVE)begin case(hcount) 10'd0:begin vga_r_out <= 4'hf; vga_g_out <= 4'h0; vga_b_out <= 4'h0;end 10'd64:begin vga_r_out <= 4'h0; vga_g_out <= 4'hf; vga_b_out <= 4'h0;end 10'd128:begin vga_r_out <= 4'h0; vga_g_out <= 4'h0; vga_b_out <= 4'hf;end 10'd192:begin vga_r_out <= 4'hf; vga_g_out <= 4'h0; vga_b_out <= 4'h0;end 10'd256:begin vga_r_out <= 4'h0; vga_g_out <= 4'hf; vga_b_out <= 4'h0;end 10'd320:begin vga_r_out <= 4'h0; vga_g_out <= 4'h0; vga_b_out <= 4'hf;end 10'd384:begin vga_r_out <= 4'hf; vga_g_out <= 4'h0; vga_b_out <= 4'h0;end 10'd448:begin vga_r_out <= 4'h0; vga_g_out <= 4'hf; vga_b_out <= 4'h0;end 10'd512:begin vga_r_out <= 4'h0; vga_g_out <= 4'h0; vga_b_out <= 4'hf;end 10'd576:begin vga_r_out <= 4'hf; vga_g_out <= 4'h0; vga_b_out <= 4'h0;end endcase end //*************** 水平描画範囲外 ******************// case(hcount) H_ACTIVE:begin vga_hsync_out <= 1'b1; vga_r_out <= 0; vga_g_out <= 0; vga_b_out <= 0; end H_FRONT: vga_hsync_out <= 1'b0; H_SYNC: vga_hsync_out <= 1'b1; endcase //******************* 垂直描画範囲外 ***************************// case(vcount) V_ACTIVE:begin vga_vsync_out <= 1'b1; vga_r_out <= 0; vga_g_out <= 0; vga_b_out <= 0; end V_FRONT: vga_vsync_out <= 1'b0; V_SYNC: vga_vsync_out <= 1'b1; endcase end endmodule