新闻  |   论坛  |   博客  |   在线研讨会
FPGA学习笔记——VGA显示器彩条显示(源码分析)
fwjie | 2012-02-22 14:16:45    阅读:8111   发布文章

/***********************************************************************************
-------------------------------------------文件信息---------------------------------
** 文件名称: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

在开发板上验证正确,代码关键是行同步与场同步信号的产生

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客