from : 好友博客:http://www.edabc.net/blog/?uid-20-action-viewspace-itemid-591

一、VGA时序

下面的图是本人画了一个晚上的结果,个人认为能够比较详细的阐述VGA的信号时序

Verilog的VGA显示控制
VGA的时序根据不同的显示分辨率和刷新频率会有变化,具体各种类型的时序信息可以参考下面的网站
这里非常详细的说明的每一种显示模式的VGA时序信息
http://www.epanorama.net/documents/pc/vga_timing.html

二、VGA电平

VSYNC,HSYNC为标准TTL电平,0V~3.3V
RGB的电平在0V~0.7V之间(0V为黑色,0.7V为全色)

三、程序顶层框图

Verilog的VGA显示控制

VGA产生行同步(HSYNC),场同步信号(VSYNC),并产生每个像素的地址输入单口ROM(显存)中,ROM输出该点需要显示的颜色值

四、单口ROM(显存)设计

程序的显示模式为800*600,72Hz刷新频率,像素频率为50MHz
每个像素需要显示的颜色存储在单口RAM中,每种颜色用8个字节表示
则如果要显示800*600分辨率,则需要800*600字节(480KB)的单口ROM
由于FPGA内部没有这么大的RAM,因此我把屏幕上100*100个像素组成的矩形作为一个逻辑像素(即显示同一种颜色)
这样只要8*6字节(48字节),用FPGA自带的RAM是很容易实现的

ROM中颜色存储地址表:

Verilog的VGA显示控制

将全屏划分成8*6的方格,每个方格的颜色存储在ROM中,VGA控制器不断产生行坐标(ROM水平地址)和场坐标(ROM垂直地址)
最后组合成ROM实际地址输入ROM中,ROM输出该地址的颜色值,显示在LCD中

五、程序设计


Verilog的VGA显示控制Verilog的VGA显示控制代码
  1Verilog的VGA显示控制module VGA(clk,rst_n,hsync,vsync,vga_r,vga_g,vga_b);
  2Verilog的VGA显示控制
  3Verilog的VGA显示控制 
  4Verilog的VGA显示控制
  5Verilog的VGA显示控制input clk;      //50MHz
  6Verilog的VGA显示控制
  7Verilog的VGA显示控制input rst_n;   //复位信号
  8Verilog的VGA显示控制
  9Verilog的VGA显示控制output hsync; //行同步信号
 10Verilog的VGA显示控制
 11Verilog的VGA显示控制output vsync; //场同步信号
 12Verilog的VGA显示控制
 13Verilog的VGA显示控制// R、G、B信号输出
 14Verilog的VGA显示控制
 15Verilog的VGA显示控制output[1:0] vga_r;
 16Verilog的VGA显示控制
 17Verilog的VGA显示控制output[2:0] vga_g;
 18Verilog的VGA显示控制
 19Verilog的VGA显示控制output[2:0] vga_b;
 20Verilog的VGA显示控制
 21Verilog的VGA显示控制//--------------------------------------------------
 22Verilog的VGA显示控制
 23Verilog的VGA显示控制reg[10:0] x_cnt;     //行坐标(这里包括了行同步、后沿、有效数据区、前沿)
 24Verilog的VGA显示控制
 25Verilog的VGA显示控制reg[9:0] y_cnt;     //列坐标(这里包括了场同步、后沿、有效数据区、前沿)
 26Verilog的VGA显示控制
 27Verilog的VGA显示控制reg[5:0] Xcoloradd;
 28Verilog的VGA显示控制
 29Verilog的VGA显示控制reg[2:0] Ycoloradd;
 30Verilog的VGA显示控制
 31Verilog的VGA显示控制 
 32Verilog的VGA显示控制
 33Verilog的VGA显示控制parameter
 34Verilog的VGA显示控制
 35Verilog的VGA显示控制     Left = 184,
 36Verilog的VGA显示控制
 37Verilog的VGA显示控制     PixelWidth = 100,
 38Verilog的VGA显示控制
 39Verilog的VGA显示控制     Top = 29;
 40Verilog的VGA显示控制
 41Verilog的VGA显示控制     
 42Verilog的VGA显示控制
 43Verilog的VGA显示控制always @ (posedge clk or negedge rst_n)
 44Verilog的VGA显示控制
 45Verilog的VGA显示控制      if(!rst_n) x_cnt <= 10'd0;
 46Verilog的VGA显示控制
 47Verilog的VGA显示控制      else if(x_cnt == 11'd1040) x_cnt <= 10'd0;          //行计数记到1040
 48Verilog的VGA显示控制
 49Verilog的VGA显示控制      else x_cnt <= x_cnt+1'b1;
 50Verilog的VGA显示控制
 51Verilog的VGA显示控制 
 52Verilog的VGA显示控制
 53Verilog的VGA显示控制always @ (posedge clk or negedge rst_n)//产生行地址(ROM水平地址)
 54Verilog的VGA显示控制
 55Verilog的VGA显示控制      if(!rst_n) Xcoloradd <= 6'b000000;
 56Verilog的VGA显示控制
 57Verilog的VGA显示控制      else if(x_cnt >= Left && x_cnt <Left + PixelWidth) Xcoloradd <= 6'b000000;
 58Verilog的VGA显示控制
 59Verilog的VGA显示控制      else if(x_cnt >= Left + PixelWidth && x_cnt <Left + 2*PixelWidth) Xcoloradd <= 6'b000001;
 60Verilog的VGA显示控制
 61Verilog的VGA显示控制      else if(x_cnt >= Left + 2*PixelWidth && x_cnt <Left + 3*PixelWidth) Xcoloradd <= 6'b000010;
 62Verilog的VGA显示控制
 63Verilog的VGA显示控制      else if(x_cnt >= Left + 3*PixelWidth && x_cnt <Left + 4*PixelWidth) Xcoloradd <= 6'b000011;
 64Verilog的VGA显示控制
 65Verilog的VGA显示控制      else if(x_cnt >= Left + 4*PixelWidth && x_cnt <Left + 5*PixelWidth) Xcoloradd <= 6'b000100;
 66Verilog的VGA显示控制
 67Verilog的VGA显示控制      else if(x_cnt >= Left + 5*PixelWidth && x_cnt <Left + 6*PixelWidth) Xcoloradd <= 6'b000101;
 68Verilog的VGA显示控制
 69Verilog的VGA显示控制      else if(x_cnt >= Left + 6*PixelWidth && x_cnt <Left + 7*PixelWidth) Xcoloradd <= 6'b000110;
 70Verilog的VGA显示控制
 71Verilog的VGA显示控制      else if(x_cnt >= Left + 7*PixelWidth && x_cnt <Left + 8*PixelWidth) Xcoloradd <= 6'b000111;
 72Verilog的VGA显示控制
 73Verilog的VGA显示控制      else Xcoloradd <= 6'b110000;//背景颜色地址
 74Verilog的VGA显示控制
 75Verilog的VGA显示控制 
 76Verilog的VGA显示控制
 77Verilog的VGA显示控制always @ (posedge clk or negedge rst_n)
 78Verilog的VGA显示控制
 79Verilog的VGA显示控制      if(!rst_n) y_cnt <= 10'd0;
 80Verilog的VGA显示控制
 81Verilog的VGA显示控制      else if(y_cnt == 10'd666) y_cnt <= 10'd0;            //场同步记到666
 82Verilog的VGA显示控制
 83Verilog的VGA显示控制      else if(x_cnt == 11'd1040) y_cnt <= y_cnt+1'b1;//每计数完一行,场同步就加一
 84Verilog的VGA显示控制
 85Verilog的VGA显示控制     
 86Verilog的VGA显示控制
 87Verilog的VGA显示控制always @ (posedge clk or negedge rst_n)//产生列地址(ROM垂直地址)
 88Verilog的VGA显示控制
 89Verilog的VGA显示控制      if(!rst_n) Ycoloradd <= 3'b000;
 90Verilog的VGA显示控制
 91Verilog的VGA显示控制      else if(y_cnt >= Top && y_cnt < Top + PixelWidth) Ycoloradd <= 3'b000;
 92Verilog的VGA显示控制
 93Verilog的VGA显示控制      else if(y_cnt >= Top + PixelWidth && y_cnt < Top + 2*PixelWidth) Ycoloradd <= 3'b001;
 94Verilog的VGA显示控制
 95Verilog的VGA显示控制      else if(y_cnt >= Top + 2*PixelWidth && y_cnt < Top + 3*PixelWidth) Ycoloradd <= 3'b010;
 96Verilog的VGA显示控制
 97Verilog的VGA显示控制      else if(y_cnt >= Top + 3*PixelWidth && y_cnt < Top + 4*PixelWidth) Ycoloradd <= 3'b011;
 98Verilog的VGA显示控制
 99Verilog的VGA显示控制      else if(y_cnt >= Top + 4*PixelWidth && y_cnt < Top + 5*PixelWidth) Ycoloradd <= 3'b100;
100Verilog的VGA显示控制
101Verilog的VGA显示控制      else if(y_cnt >= Top + 5*PixelWidth && y_cnt < Top + 6*PixelWidth) Ycoloradd <= 3'b101;
102Verilog的VGA显示控制
103Verilog的VGA显示控制      else Ycoloradd <= 3'b110;//背景颜色地址
104Verilog的VGA显示控制
105Verilog的VGA显示控制//--------------------------------------------------
106Verilog的VGA显示控制
107Verilog的VGA显示控制// signal port ROM
108Verilog的VGA显示控制
109Verilog的VGA显示控制 
110Verilog的VGA显示控制
111Verilog的VGA显示控制wire[7:0] color;
112Verilog的VGA显示控制
113Verilog的VGA显示控制wire[5:0] coloradd;
114Verilog的VGA显示控制
115Verilog的VGA显示控制 
116Verilog的VGA显示控制
117

六、后记

在这次程序中只在ROM中存储了一些随机的数,因此显示出来是一些小方格
如果ROM做的更大,完全可以存储一幅图像,显示在LCD中
不过由于由于用ROM做为显存,每次只能显示一幅静态的图像,而且没有加入字符库,不能显示字符
在下次的文章中,我将使用双口RAM,加上Nios II处理器,这样可以方便的显示各种字符

相关文章:

  • 2021-12-09
  • 2021-12-26
  • 2022-12-23
  • 2022-12-23
  • 2021-07-19
  • 2022-01-19
  • 2022-12-23
  • 2021-05-22
猜你喜欢
  • 2022-12-23
  • 2021-08-17
  • 2021-04-27
  • 2021-12-10
  • 2022-02-01
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案