"); //-->
/***********************************************************************************
-------------------------------------------文件信息---------------------------------
** 文件名称:VGA_Driver
** 硬件平台:EP1C5T144
** 软件平台:Quartus 9.1
** 创 建 者:樊文杰
** 创建日期:2012-02-20
** 功能描述:VGA显示驱动
** 版权声明:
**--------------------------------------修改文件的相关信息--------------------------
** 修改人: 樊文杰
** 修改日期:2012-02-22
** 版本号: V1.0
** 修改内容:模块化
**
***********************************************************************************/
module VGA_Driver
(
input clk, //时钟,25MHZ
input rst_n, //复位,低有效
output reg h_sync, //VGA管脚,行同步信号
output reg v_sync, //VGA管脚,场同步信号
output [2:0] VGA_R, //VGA信号线RED
output [2:0] VGA_G, //VGA信号线GREEN
output [1:0] VGA_B //VGA信号线BLUE
/);
// 640 * 480 分辨率的同步信号参数
parameter H_DISP = 11'd640; //行显示分辨率
parameter H_FRONT = 11'd16; //同步信号前肩
parameter H_SYNC = 11'd96; //行同步信号
parameter H_BACK = 11'd48; //同步信号后肩
parameter H_TOTAL = 11'd800; //行帧长
parameter V_DISP = 10'd480; //列显示分辨率
parameter V_FRONT = 10'd10; //列同步信号前肩
parameter V_SYNC = 10'd2; //列同步信号
parameter V_BACK = 10'd33; //列信号后肩
parameter V_TOTAL = 10'd525; //列帧长
//***********************************************************/
// 模块名称:VGA行同步信号产生模块
// 模块功能:产生VGA显示所需的行同步信号
//***********************************************************/
reg [9:0] x_cnt; //行坐标计数器
// 行扫描计数
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
x_cnt <= 10'd0;
else if( x_cnt == (H_TOTAL - 1) ) //扫描完一行从新计数
x_cnt <= 10'd0;
else
x_cnt <= x_cnt + 1'b1;
end
//根据行扫描计数值产生行同步信号
always @(posedge clk or negedge rst_n)
if(!rst_n)
h_sync <= 1'b1;
else if(x_cnt == 10'd0)
h_sync <= 1'b0;
else if(x_cnt == H_SYNC) //行同步信号
h_sync <= 1'b1;
//***********************************************************/
// 模块名称:VGA场同步信号产生模块
// 模块功能:产生VGA显示所需的场同步信号
//***********************************************************/
reg [9:0] y_cnt; //列坐标计数器
// 列扫描计数
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
y_cnt <= 10'd0;
else if(y_cnt == (V_TOTAL - 1)) //扫描完一帧
y_cnt <= 10'd0;
else if(x_cnt == (H_TOTAL - 1)) //扫描完一行则扫描下一行
y_cnt <= y_cnt + 1'b1; //列计数是根据行计数而变的
end
//根据列扫描计数值产生场地同步信号
always @(posedge clk or negedge rst_n)
if(!rst_n)
v_sync <= 1'b1;
else if(y_cnt == 10'd0)
v_sync <= 1'b0;
else if(y_cnt == V_SYNC) //列同步信号
v_sync <= 1'b1;
reg [7:0] rgb_data; //VGA色彩寄存器
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
rgb_data <= 8'd0;
else if( x_cnt > (H_FRONT + H_SYNC) && x_cnt < (H_FRONT + H_SYNC + 80))
rgb_data <= 8'd0; // 000 000 00 黑色
else if(x_cnt > (H_FRONT + H_SYNC+80) && x_cnt < (H_FRONT + H_SYNC + 160))
rgb_data <= 8'd3; // 000 000 11 蓝色
else if(x_cnt > (H_FRONT + H_SYNC+160) && x_cnt < (H_FRONT + H_SYNC + 240))
rgb_data <= 8'd28; // 000 111 00 绿色
else if( x_cnt > (H_FRONT + H_SYNC + 240) && x_cnt < (H_FRONT + H_SYNC + 320))
rgb_data <= 8'd31; // 000 111 00 青色
else if(x_cnt > (H_FRONT + H_SYNC + 320) && x_cnt < (H_FRONT + H_SYNC + 400))
rgb_data <= 8'd224; // 111 000 00 红色
else if(x_cnt > (H_FRONT + H_SYNC + 400) && x_cnt < (H_FRONT + H_SYNC + 480))
rgb_data <= 8'd227; // 111 000 11 紫色
else if( x_cnt > (H_FRONT + H_SYNC + 480) && x_cnt < (H_FRONT + H_SYNC + 560))
rgb_data <= 8'd252; // 111 111 00 黄色
else if(x_cnt > (H_FRONT + H_SYNC + 560) && x_cnt < (H_FRONT + H_SYNC + 640))
rgb_data <= 8'd255; // 111 111 11 白色
end
//r,g,b控制液晶屏颜色显示
assign VGA_R = rgb_data[7:5];
assign VGA_G = rgb_data[4:2];
assign VGA_B = rgb_data[1:0];
endmodule
在开发板上验证正确,代码关键是行同步与场同步信号的产生
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。