微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > VGA系列之一:VGA显示网络图片

VGA系列之一:VGA显示网络图片

时间:10-02 整理:3721RD 点击:

一休哥是在读研究生的时候开始正式接触FPGA的,之所以这么说呢,是因为之前本科参加电赛的时候也学过一点FPGA的知识,可惜学习周期太短导致那次电赛惨败。可能世上就是有这么巧的事,刚上研究生的第一天,老板就给了我一块FPGA板,让我自己玩去,从此就踏上了这条不归路。

好了,闲话不多说,接下来我们来讲讲如何用FPGA实现VGA显示网络图片。这里我们先提出几个问题,通过解决这几个问题,从而实现工程效果。

1、  如何用FPGA实现VGA显示

2、  网络图片和VGA显示有何区别

3、  VGA如何显示图片

1 如何用FPGA实现VGA显示

首先,我们需要清楚一个概念,VGA是一个外设模块,VGA模块有两个接口,一个接口用于连接FPGA,另一个用于连接VGA线,VGA线的另一头我们常常会与显示器相连。连接VGA线的接口一般都是一个标准VGA接口的母口。而与FPGA相连的接口有很多种,在这里,我介绍其中的一种。



上图就是VGA模块的硬件电路,可以看到,在图片的左边就是与FPGA相连的接口信号,一共有29个信号,我们可以大致分成三类,

  • 恒定不变的信号(VGA_BLANK,VGA_SYN)
  • 时序控制信号(VGA_CLK,VGA_HS,VGA_VS)
  • 数据信号(VGA_R0-7,VGA_G0-7,VGA_B0-7)

在使用VGA显示时我们需要将VGA_BLANK默认置1,VGA_SYNC默认置0。VGA_CLK是VGA显示的主时钟,它的频率决定了VGA显示的分辨率。VGA_HS是VGA的水平同步信号,它决定了VGA显示的宽度。VGA_VS是VGA的垂直同步信号,它决定了VGA显示的高度。数据信号中R、G、B三种颜色的小大都是8位,所以这个VGA模块显示的颜色深度为24位,也就是说VGA显示的是24位真彩色,显示的质量非常高。

刚才提到过VGA显示的分辨率、宽度和高度。我们需要知道,VGA也是一个视频传输标准,所以VGA的分辨率也就是视频的分辨率。我们通过查看视频格式手册可以知道VGA的分辨率有哪些。在这里,我选择了一个最常见的分辨率640*480p@60Hz,这里的640、480表示水平和垂直方向的像素点个数,也就表示VGA输出了一个60Hz的640*480的视频信号。


选择了VGA的分辨率之后,我们就可以开始着手编写程序了吗?其实不然,我们还不知道VGA显示的时序,这点我们也可以查看视频格式手册。


在上图中,我们可以看到VGA_HS(HSYNC)信号是一个周期信号,在一个周期内,VGA_HS的低电平时间为96个VGA_CLK信号周期,高电平时间为704个VGA_CLK信号周期。VGA的数据信号在VGA_HS高电平的第49个VGA_CLK信号周期开始有效,一直持续到VGA_HS高电平的第688个VGA_CLK信号周期。

VGA_VS(VSYNC)信号也是一个周期信号,在一个周期内,VGA_VS的低电平时间为2个VGA_HS信号周期,高电平时间为523个VGA_HS信号周期。VGA的数据信号在VGA_VS高电平的第34个VGA_HS信号周期开始有效,一直持续到高电平的第513个VGA_HS信号周期。为了更直观的表达这一时序,我们用下面这个图表示。

/* 时序逻辑,用来给hsync_cnt寄存器赋值 */

always @ (posedge CLK_VGA or negedge RST_N)

begin

    if(!RST_N)                                 

        hsync_cnt = `BMP1_X - 8'h3) && (vga_x = `BMP1_Y) && (vga_y = `BMP1_X) && (vga_x = `BMP1_Y) && (vga_y `HSYNC_B && hsync_cnt `VSYNC_P && vsync_cnt `HSYNC_B + 16'd128 && hsync_cnt `VSYNC_P && vsync_cnt `HSYNC_B + 16'd256 && hsync_cnt `VSYNC_P && vsync_cnt `HSYNC_B + 16'd384 && hsync_cnt `VSYNC_P && vsync_cnt `HSYNC_B + 16'd512 && hsync_cnt `VSYNC_P && vsync_cnt < `VSYNC_Q)

        VGA_DATA_N = 24'h0000FF;

    else

        VGA_DATA_N = 24'd0;

end


大家可能会比较疑惑,为什么用来控制产生Rom表的地址信号bmp_add会比控制VGA显示图片的信号bmp_en提前三个时钟。那是因为我们在读取Rom表数据时存在延时,经过我们signaltap采集后发现,原本作为地址70的输出数据FF比地址70慢两个时钟,即bmp_rom_data的输出会比bmp_rom_add延迟两个时钟,而VGA_DATA又比bmp_rom_data延迟1个时钟,因此bmp_add信号需要比bmp_en提前三个时钟。


         最后,奉上一张效果图。


本文所涉及的相关资料链接 :http://pan.baidu.com/s/1dFb4J65 密码:zp2r





大家好,这里是一休哥FPGAer的公众号,免费分享FPGA心得,小技巧,算法,实际项目开发经验,所做一切都是为了更好的了解FPGA!


谢谢分享,顶一个!

很有趣,谢谢分享

谢谢分享,顶一个!

GOOD

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top