锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

基于FPGA的VGA字符显示

时间:2023-04-09 05:37:00 hfc0820棒型电感hfc0520棒型电感

一、VGA的简单介绍

VGA是什么
1.VGA(Video Graphics Array),视频图形阵列是一种视频传输标准,具有分辨率高、显示速度快、色彩丰富等优点,不支持音频传输。
2.VGA显示原理
VGA数据引脚1、2、3(RED、GREEN、BLUE)输入的不是简单的0、1数字信号,而是模拟电压(0V-0.714V)。当引脚有不同的电压时,VGA
显示器显示不同的颜色。

在这里插入图片描述
VGAD型接口采用不对称分布连接方式,共15针,分三排,每排5个孔。

在15个管脚中,3个更重要RGB彩色分量信号和2个扫描同步信号HSYNC和VSYNC。

●像素组成: VGA显示器上的每个像素点都可以有多种颜色R、G、B如果每个像素点用三位二进制数表示(R、G、B一个信号),总共可以显示2×2×2=8种颜色用8位二进制数表示每个像素点(R、G、B如果信号分别为3、3、2,则共可显示8×8×4=256种颜色。

1.2 VGA如何实现显示
??要知道VGA显示器是不认识数字信号的,它只认识模拟信号。所谓它只认识模拟信号,即 数据引脚1、2、3(RED、GREEN、BLUE)输入的不是简单的0、1数字信号,而是模拟电压(0V-0.714V)。当1、2、3引脚有不同的电压时,VGA显示器显示不同的颜色。


但是FPGA要想产生模拟信号就需要借助DA,利用DA产生模拟信号,输出到VGA的RED、GREEN、BLUE基色数据线。还有电阻网络分流模拟。DA实现的。

●VGA如何实现各种颜色?
在VGA接口的1、2、3引脚分别接收以下电压:

①帧时序
帧时序的四个部分是:同步脉冲(Sync o)、显示后沿(Back porch p)、显示时序段(Display interval q)和显示前沿(Front porchr)。同步脉冲(Sync o)、显示后沿(Back porch p)和显示前沿(Front porch r)是消隐区,RGB信号无效,屏幕不显示数据。显示时序段(Display interval q)是有效数据区。.

②行时序

从上面可以看出同步脉冲(Sync a)、显示后沿(Back porch b)和显示前沿(Front porch d)是消隐区,RGB信号无效,屏幕不显示数据。显示时间段(Display interval c)是有效数据区。
③VGA的时序解析

分辨率不同,时序也不同。例如,800*600@60Hz的VGA时序:
?
3. FPGA驱动VGA显示彩条
电路图:

重点是代码:

//行时序宏定义 `define HSYNC_A 16'd128 `define HSYNC_B 16'd216 `define HSYNC_C 16'd1016 `define HSYNC_D 16'd1056  //列时序宏定义 `define VSYNC_O 16'd4 `define VSYNC_P 16'd27 `define VSYNC_Q 16'd627 `define VSYNC_R 16'd628  //颜色定义 `define RED   8'hE0  //1110_0000(参考上述电路图) `define GREEN  8'h1C  //0001_1100(参考上述电路图) `define BLUE  8'h03  //0000_0011(见上述电路图) `define YELLOW  8'hFC `define BLACK  8'h00 module VGA (  //输入  input       CLK_50M,  input      RST_N,  //输出  output  reg     VSYNC,   //垂直同步端口  output  reg     HSYNC,   ///水平同步端口  output  reg[7:0]    VGA_DATA   ///数据端口  );  reg[15:0] hsync_cnt;  //水平扫描计数器 reg[15:0] vsync_cnt;  //垂直扫描计数器  reg vga_data_valid;   //RGB数据信号的有效区可以使信号有效    ///水平扫描(扫描1056点) always@(posedge CLK_40M or negedge RST_N) begin  if(!RST_N)   hsync_cnt <= 16'd0;  else if(hsync_cnt == `HSYNC_D)   hsync_cnt <= 16'd0;  else   hsync_cnt <= hsync_cnt   16'd1; end   ///垂直扫描(扫描628点) always@(posedge CLK_40M or negedge RST_N) begin  if(!RST_N)   vsync_cnt <= 16'd0;  else if((vsync_cnt == `VSYNC_R) && (hsync_cnt == `HSYNC_D))   vsync_cnt <= 16'd0;  else if(hsync_cnt == `HSYNC_D)   vsync_cnt <= vsync_cnt   16'd1;  else    vsync_cnt <= vsync_cnt; end  //行时序 always@(posedge CLK_40M or negedge RST_N) begin  if(!RST_N)   HSYNC <= 1'b0;  else if(hsync_cnt < `HSYNC_A) //a域为0   HSYNC <= 1'b0;  else   HSYNC <= 1'b1;    //其他域1 end  //列时序 always@(posedge CLK_40M or negedge RST_N) begin  if(!RST_N)   VSYNC <= 1'b0;  else if(vsync_cnt < `VSYNC_O) //o域为0   VSYNC <= 1'b0;  else   VSYNC <= 1'b1;    //其他域1 end  //提取显示有效区(q域 c域) always@(posedge CLK_40M or negedge RST_N) begin  if(!RST_N)   vga_data_valid <= 1'b0;  else if((hsync_cnt > `HSYNC_B && hsync_cnt < `HSYNC_C) && (vsync_cnt >  `VSYNC_P && vsync_cnt < `VSYNC_Q)) ///数据有效区   vga_data_valid <= 1'b1;  else   vga_data_valid <= 1'b0; end   //在数据有效区,发送数据VGA_RED、VGA_GREEN、VGA_BLUE数据引脚 always@(*) begin  if(vga_data_valid)  begin   if(vsync_cnt >`VSYNC_P)//显示区   begin    if((hsync_cnt > `HSYNC_B) && (hsync_cnt < `HSYNC_B 10'd300))     VGA_DATA <= `RED;   //红色  1110_0000    else if((hsync_cnt > `HSYNC_B 10'd300) && (hsync_cnt < `HSYNC_B 10'd400))     VGA_DATA <= `BLUE;  //蓝色  0000_0111    else if((hsync_cnt > `HSYNC_B 10'd400) && (hsync_cnt < `HSYNC_B 10'd500))     VGA_DATA <= `YELLOW;  //黄色  1111_1100    else if((hsync_cnt > `HSYNC_B 10'd500) && (hsync_cnt < `HSYNC_B 10'd800))     VGA_DATA <= `GREEN;  //绿色  0001_1100    else     VGA_DATA <= `BLACK;  //黑色  0000_0000   end   else    VGA_DATA <= `BLACK;   //黑色  end  else   VGA_DATA <= `BLACK;    //黑色 end  //PLL_IP获取40M时钟 wire CLK_40M;  PLL PLL_inst (  .inclk0 ( CLK_50M ),  .c0 ( CLK_40M )  );   

二.vga显示彩条

1.配置引脚
具体引脚信息,请查看板手册

2.编译烧录
3.显示效果

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章