CrazyBingo

我坦白我交代我忏悔——史上最稳定的DIY VGA 模块

0
阅读(2400)

我坦白

我代价

我忏悔

发现有时候,写了比较实用而且完美的程序,老是自己藏起来,感觉太。。。。

还是发放吧,毕竟我也从网络上吸取了那么多有用的知识,取之于民,用之与民

希望对大家有所帮助

VGA驱动真的很简的。先来个简要的说明吧:

最好的网站:http://tinyvga.com/vga-timing

思路:  行显示--行消隐前肩--行消隐--行消隐后肩

     场显示--场消隐前肩--场消隐--场消隐后肩

接口:  改每个时期的Pxiel,以及输入时钟就可以随便在各种分辨率下调用,完全没问题,测试了n遍了

VGA_Data: 此处16位是因为我后级电路时通过模拟转换为VGA电平的,可以根据需要修改位数

X_pos,Y_pos: 实时像素坐标反馈,便于其他模块的控制

程序如下:

/******************************************************************** * Module Name : VGA_Driver * Author : Crazy Bingo * Device : EP2C8Q208C8N * Version : Quartus II 9.1 * Date : 2010/11/20 * Description : Dispaly programs for the LCD *********************************************************************/ /******************************************************************** * Revision Author : * Date : * Description : *********************************************************************/ module VGA_Driver ( input VGA_CLK, // VGA像素时钟 input RST_n, // 异步复位信号 input [15:0] VGA_Data, output [15:0] VGA_RGB, // 接收要显示的色彩 output reg VGA_HS, // VGA管脚 行同步 output reg VGA_VS, // VGA管脚 场同步 output [10:0] X_pos, // 像素横坐标位置 output [9:0] Y_pos // 像素纵坐标位置 ); //定义VGA_1024_768_65M_60HZ显示协议标准 parameter H_DISP = 11'd1024; // 显示时序 parameter H_FRONT = 11'd24; // 显示前沿 parameter H_SYNC = 11'd136; // 同步脉冲 parameter H_BACK = 11'd160; // 显示后沿 parameter H_TOTAL = 11'd1344; // 时序帧长 parameter V_DISP = 10'd768; // 显示时序 parameter V_FRONT = 10'd3; // 显示前沿 parameter V_SYNC = 10'd6; // 同步脉冲 parameter V_BACK = 10'd29; // 显示后沿 parameter V_TOTAL = 10'd806; // 时序帧长 // 行同步信号发生器 reg [10:0] hcnt; always @ (posedge VGA_CLK or negedge RST_n) begin if (!RST_n) begin hcnt <= 0; VGA_HS <= 1; end else begin if (hcnt < H_TOTAL-1) hcnt <= hcnt+1'b1; else hcnt <= 0; //////////////////////////////////////////////////// if( (hcnt >= H_DISP+H_FRONT) && (hcnt < H_DISP+H_FRONT+H_SYNC) ) VGA_HS <= 0; //同步要求为负脉冲(H_DISP*V_DISP) else VGA_HS <= 1; end end // 场同步信号发生器 reg [9:0] vcnt; always @ (negedge VGA_HS or negedge RST_n) //因为HS由1变为0,是下降沿 begin if (!RST_n) begin vcnt <= 0; VGA_VS <= 1; end else begin if (vcnt < V_TOTAL-1) vcnt <= vcnt+1'b1; else vcnt <= 0; //////////////////////////////////////////////////// if( (vcnt >= V_DISP+V_FRONT) && (vcnt < V_DISP+V_FRONT+V_SYNC) ) VGA_VS <= 0; //同步要求为负脉冲(H_DISP*V_DISP) else VGA_VS <= 1; end end /*定义H_DISP*V_DISP行列坐标*/ assign X_pos = (hcnt < H_DISP) ? hcnt[9:0] : 10'd0; assign Y_pos = (vcnt < V_DISP) ? vcnt[9:0] : 10'd0; assign VGA_RGB = ((hcnt < H_DISP) && (vcnt < V_DISP)) ? VGA_Data : 16'd0; endmodule

别问为什么,请多思考,中国的FPGA事业可能需要你。。。

Baidu
map