module vga
#(
	parameter A = 96	, // 行同步信号时间
	parameter B = 48	, // 行消隐后肩时间
	parameter C = 640	, // 行数据有效时间
	parameter D = 16	, // 行消隐前肩时间
	parameter E = 800	, // 行扫描总时间
	parameter F = 2		, // 列同步信号时间
	parameter G = 33	, // 列消隐后肩时间
	parameter H = 480	, // 列数据有效时间
	parameter I = 10	, // 列消隐前肩时间
	parameter K = 525	  // 列扫描总时间
)
(
	input	wire		clk,
	
	// VGA时序输出
	output	reg			hsyn,
	output	reg			vsyn,
	
	// VGA时序伴随坐标
	output	reg			axis_en,
	output	reg [10:0]	axis_x,
	output	reg [10:0]	axis_y
);

reg [12:0] hsyn_cnt;
reg [12:0] vsyn_cnt;

// 行扫描计数器
always@(posedge clk)
begin
	if(hsyn_cnt == E-1)
        hsyn_cnt <= 0;
    else
        hsyn_cnt <= hsyn_cnt + 1;
end

// 列扫描计数器
always@(posedge clk)
begin
	if(hsyn_cnt == E-1)
	begin
        if(vsyn_cnt == K-1)
            vsyn_cnt <= 0;
        else
            vsyn_cnt <= vsyn_cnt + 1;
	end
end

// 行控制
always@(posedge clk)
begin
    if(hsyn_cnt < A)
        hsyn <= 0;
    else
        hsyn <= 1;
end

// 场控制
always@(posedge clk)
begin
    if(vsyn_cnt < F)
        vsyn <= 0;
    else
        vsyn <= 1;
end

// 时序伴随坐标使能.
always@(posedge clk)
begin
    if(vsyn_cnt >= F + G && vsyn_cnt < F + G + H)
    begin
        if(hsyn_cnt >= A + B && hsyn_cnt < A + B + C)
            axis_en <= 1;
        else
            axis_en <= 0;
    end
    else
        axis_en <= 0;
end

//数据x坐标
always@(posedge clk)
begin
    if(vsyn_cnt >= F + G && vsyn_cnt < F + G + H)
    begin
        if(hsyn_cnt >= A + B && hsyn_cnt < A + B + C)
            axis_x <= hsyn_cnt - (A + B);
        else
            axis_x <= 0;
    end
    else
        axis_x <= 0;
end

//数据y坐标
always@(posedge clk)
begin
    if(vsyn_cnt >= F + G && vsyn_cnt < F + G + H)
        axis_y <= vsyn_cnt - (F + G);
    else
        axis_y <= 0;
end

endmodule