module vga_ctrl( input wire clk_25 , input wire vga_rst_n , input wire [15: 0] rgb_data , output wire hsync , output wire vsync , output wire [9: 0] pixel_x , output wire [9: 0] pixel_y , output wire [15: 0] vga_data ); //行 parameter H_SYNC = 10'd96 , H_BACK = 10'd40 , H_LEFT = 10'd8 , H_AREA = 10'd640 , H_RIGHT = 10'd8 , H_FRONT = 10'd8 , H_TOTAL = 10'd800 ; //列 parameter V_SYNC = 10'd2 , V_BACK = 10'd25 , V_TOP = 10'd8 , V_AREA = 10'd480, V_BUTTON = 10'd8 , V_FRONT = 10'd2 , V_TOTAL = 10'd525; //像素计数 reg [9: 0] cnt_pixel; wire add_cnt_pixel; wire end_cnt_pixel; //行计数 reg [9: 0] cnt_row; wire add_cnt_row; wire end_cnt_row; wire area_vld; wire vld_req ; always @(posedge clk_25 or negedge vga_rst_n) begin if(!vga_rst_n)begin cnt_pixel <= 10'd0; end else if(add_cnt_pixel)begin if(end_cnt_pixel)begin cnt_pixel <= 10'd0; end else begin cnt_pixel <= cnt_pixel + 1'd1; end end else begin cnt_pixel <= cnt_pixel; end end assign add_cnt_pixel = 1'b1; assign end_cnt_pixel = add_cnt_pixel && cnt_pixel == (H_TOTAL - 1'd1); always @(posedge clk_25 or negedge vga_rst_n)begin if(!vga_rst_n)begin cnt_row <= 10'd0; end else if(add_cnt_row)begin if(end_cnt_row)begin cnt_row <= 10'd0; end else begin cnt_row <= cnt_row + 1'd1; end end else begin cnt_row <= cnt_row; end end assign add_cnt_row = end_cnt_pixel; assign end_cnt_row = add_cnt_row && cnt_row == V_TOTAL - 1'd1; assign hsync = (cnt_pixel <= H_SYNC - 1'd1) ? 1'b1: 1'b0; assign vsync = (cnt_row <= V_SYNC - 1'd1) ? 1'b1: 1'b0; assign area_vld = (cnt_pixel >= (H_SYNC + H_BACK + H_LEFT)) && (cnt_pixel < (H_SYNC + H_BACK + H_LEFT + H_AREA)) && (cnt_row >= (V_SYNC + V_BACK + V_TOP)) && (cnt_row < (V_SYNC + V_BACK + V_TOP + V_AREA)); assign vld_req = (cnt_pixel >= (H_SYNC + H_BACK + H_LEFT - 1'd1)) && (cnt_pixel < (H_SYNC + H_BACK + H_LEFT + H_AREA - 1'd1)) && (cnt_row >= (V_SYNC + V_BACK + V_TOP)) && (cnt_row < (V_SYNC + V_BACK + V_TOP + V_AREA)); //超前一个时钟周期,目的是为了时序对齐 assign pixel_x = (vld_req == 1'b1) ? (cnt_pixel - (H_SYNC + H_BACK + H_LEFT - 1'b1)): 10'h3ff; assign pixel_y = (vld_req == 1'b1) ? (cnt_row - (V_SYNC + V_BACK + V_TOP)): 10'h3ff; assign vga_data = (area_vld == 1'b1) ? rgb_data: 16'h0000; endmodule