# 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 ```