# vga driver code
```=v
module vga_driver
(
input I_clk ,
input I_rst_n ,
output reg [7:0] O_red ,
output reg [7:0] O_green ,
output reg [7:0] O_blue ,
output O_hs ,
output O_vs ,
output reg O_clk_25M,
output reg O_blank_n,
output reg O_sync_n
);
// 分辨率为640*480时行时序各个参数定义
parameter C_H_SYNC_PULSE = 96 ,
C_H_BACK_PORCH = 48 ,
C_H_ACTIVE_TIME = 640 ,
C_H_FRONT_PORCH = 16 ,
C_H_LINE_PERIOD = 800 ;
// 分辨率为640*480时场时序各个参数定义
parameter C_V_SYNC_PULSE = 2 ,
C_V_BACK_PORCH = 33 ,
C_V_ACTIVE_TIME = 480 ,
C_V_FRONT_PORCH = 10 ,
C_V_FRAME_PERIOD = 525 ;
parameter C_COLOR_BAR_WIDTH = C_H_ACTIVE_TIME / 8 ;
reg [11:0] R_h_cnt ;
reg [11:0] R_v_cnt ;
reg R_clk_25M ;
wire W_active_flag ;
always @(posedge I_clk or negedge I_rst_n)
begin
if(!I_rst_n)
R_clk_25M <= 1'b0 ;
else
R_clk_25M <= ~R_clk_25M ;
end
//設定O_clk_25M O_blank_n O_sync_n
always@(*)begin
O_clk_25M=R_clk_25M;
O_blank_n=1'd1;
O_sync_n=1'd0;
end
//
always @(posedge R_clk_25M or negedge I_rst_n)
begin
if(!I_rst_n)
R_h_cnt <= 12'd0 ;
else if(R_h_cnt == C_H_LINE_PERIOD - 1'b1)
R_h_cnt <= 12'd0 ;
else
R_h_cnt <= R_h_cnt + 1'b1 ;
end
assign O_hs = (R_h_cnt < C_H_SYNC_PULSE) ? 1'b0 : 1'b1 ;
always @(posedge R_clk_25M or negedge I_rst_n)
begin
if(!I_rst_n)
R_v_cnt <= 12'd0 ;
else if(R_v_cnt == C_V_FRAME_PERIOD - 1'b1)
R_v_cnt <= 12'd0 ;
else if(R_h_cnt == C_H_LINE_PERIOD - 1'b1)
R_v_cnt <= R_v_cnt + 1'b1 ;
else
R_v_cnt <= R_v_cnt ;
end
assign O_vs = (R_v_cnt < C_V_SYNC_PULSE) ? 1'b0 : 1'b1 ;
//////////////////////////////////////////////////////////////////
assign W_active_flag = (R_h_cnt >= (C_H_SYNC_PULSE + C_H_BACK_PORCH )) &&
(R_h_cnt <= (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_H_ACTIVE_TIME)) &&
(R_v_cnt >= (C_V_SYNC_PULSE + C_V_BACK_PORCH )) &&
(R_v_cnt <= (C_V_SYNC_PULSE + C_V_BACK_PORCH + C_V_ACTIVE_TIME)) ;
always @(posedge R_clk_25M or negedge I_rst_n)
begin
if(!I_rst_n)
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b0000_0000 ;
end
else if(W_active_flag)
begin
if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH))
begin
O_red <= 8'b1111_1111 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b0000_0000 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*2))
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b1111_1111 ;
O_blue <= 8'b0000_0000 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*3))
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b1111_1111 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*4))
begin
O_red <= 8'b1111_1111 ;
O_green <= 8'b1111_1111 ;
O_blue <= 8'b1111_1111 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*5))
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b0000_0000 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*6))
begin
O_red <= 8'b1111_1111 ;
O_green <= 8'b1111_1111 ;
O_blue <= 8'b0000_0000 ;
end
else if(R_h_cnt < (C_H_SYNC_PULSE + C_H_BACK_PORCH + C_COLOR_BAR_WIDTH*7))
begin
O_red <= 8'b1111_1111 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b1111_1111 ;
end
else
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b1111_1111 ;
O_blue <= 8'b1111_1111 ;
end
end
else
begin
O_red <= 8'b0000_0000 ;
O_green <= 8'b0000_0000 ;
O_blue <= 8'b0000_0000 ;
end
end
endmodule
```