// Onboard clock 50Mhz `timescale 1ns / 1ps module VGA640x480(clk, reset, red, green, blue, vsync,hsync); input clk,reset; output vsync,hsync; output reg [4:0] red; output reg [5:0] green; output reg [4:0] blue; //-------------------------------------------------------------------- // VGA 640x480 Horizontal Values: 50Mhz divided by 25.175Mhz = ~1.986 //-------------------------------------------------------------------- parameter HTOTAL=1589; // 800 x 1.986 parameter HZSYNC=191; // 96 x 1.986 parameter HBACK_PORCH=95; // 48 x 1.986 parameter HACTIVE=1271; // 640 x 1.986 parameter HFRONT_PORCH=32; // 16 x 1.986 reg [10:0] H_SCAN; reg HPOLARITY; //----------------------------- // VGA 640x480 Vertical Values //----------------------------- parameter VTOTAL=525; // 525 parameter VTSYNC=2; // 2 parameter VBACK_PORCH=33; // 33 parameter VACTIVE=480; // 480 parameter VFRONT_PORCH=10; // 10 reg [10:0] V_SCAN; reg VPOLARITY; //----------------------------- // Horizontal Timings //----------------------------- always@(posedge clk) begin //Horizontal Sync if(H_SCAN < HZSYNC) HPOLARITY <= 0; else HPOLARITY <= 1; //End of line if(H_SCAN == HTOTAL) H_SCAN <= 0; else H_SCAN <= H_SCAN + 1'b1; end assign hsync = HPOLARITY; //----------------------------- // Vertical Timings //----------------------------- always@(posedge clk) begin //Vertical Sync if(V_SCAN < VTSYNC) VPOLARITY <= 0; else VPOLARITY <= 1; //Bottom of screen if(H_SCAN == HZSYNC + HBACK_PORCH + HACTIVE) if(V_SCAN == VTOTAL) V_SCAN <= 0; else V_SCAN <= V_SCAN + 1; end assign vsync = VPOLARITY; //----------------------------- // Drawing Routine //----------------------------- always@(posedge clk) begin if(V_SCAN >= VTSYNC+VBACK_PORCH) if (V_SCAN < VTOTAL - VFRONT_PORCH) if(H_SCAN >= HZSYNC + HBACK_PORCH) if(H_SCAN < HTOTAL - HFRONT_PORCH) begin red <= 5'b11111; green <= 6'b111111; blue <= 5'b00000; end else begin red <= 0; green <= 0; blue <= 0; end end endmodule