您的位置:首页 > 其它

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

2010-11-29 12:15 260 查看
我坦白

我代价

我忏悔

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

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

希望对大家有所帮助

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事业可能需要你。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: