blob: 9b5cc548af1db6f7cf177ab10ef0132eb306c38c [file] [log] [blame]
module vga_sync
(
input wire clk, reset,
output wire hsync, vsync, video_on, p_tick,
output wire [9:0] pixel_x, pixel_y
);
localparam HD = 640; // horizontal display area
localparam HF = 48 ; // h. front (left) border
localparam HB = 16 ; // h. back (right) border
localparam HR = 96 ; // h. retrace
localparam VD = 480; // vertical display area
localparam VF = 10; // v. front (top) border
localparam VB = 33; // v. back (bottom) border
localparam VR = 2; // v. retrace
reg point;
wire point_next;
reg [9:0] h_count, h_count_next;
reg [9:0] v_count, v_count_next;
reg v_sync_reg, h_sync_reg;
wire v_sync_next, h_sync_next;
wire h_end, v_end, pixel_tick;
always @(posedge clk, posedge reset)
if (reset)
begin
point <= 1'b0;
v_count <= 0;
h_count <= 0;
v_sync_reg <= 1'b0;
h_sync_reg <= 1'b0;
end
else
begin
point <= point_next;
v_count <= v_count_next;
h_count <= h_count_next;
v_sync_reg <= v_sync_next;
h_sync_reg <= h_sync_next;
end
assign point_next = ~point;
assign pixel_tick = point;
assign h_end = (h_count==(HD+HF+HB+HR-1));
assign v_end = (v_count==(VD+VF+VB+VR-1));
always @*
if (pixel_tick) // 25 MHz pulse
if (h_end)
begin
h_count_next = 0;
if(v_end)
v_count_next = 0;
else
v_count_next = v_count + 1;
end
else begin
h_count_next = h_count + 1;
v_count_next = v_count;
end
else
begin
h_count_next = h_count;
v_count_next = v_count;
end
assign h_sync_next = (h_count >=(HD+HB) &&
h_count <=(HD+HB+HR-1));
assign v_sync_next = (v_count >=(VD+VB) &&
v_count <=(VD+VB+VR-1));
assign video_on = (h_count<HD) && (v_count<VD);
assign hsync = h_sync_reg;
assign vsync = v_sync_reg;
assign pixel_x = h_count;
assign pixel_y = v_count;
assign p_tick = pixel_tick;
endmodule