开发平台:vivado 2020.1
芯片:xc7k410tffv900-2
文章目录
一、引言
VGA (Video Graphics Array)视频图形阵列是BM 于1987 年提出的一个使用模拟信号的电脑显示标准。VGA接口即电脑采用 VGA 标准输出数据的专用接口。VGA 接口共有15 针,分成3 排,每排5个孔,早期在显卡上应用最为广泛的接口类型。它传输红、绿、蓝模拟信号以及同步信号(水平和垂直信号)。如图所示:
每个管脚具体的作用如下:
- 红基色 red
- 绿基色 green
- 蓝基色 blue
- 地址码 ID Bit
- 自测试( 各家定义不同 )
- 红接地
- 绿接地
- 蓝接地
- 保留 ( 各家定义不同 )
- 数字接地
- 地址码
- 地址码
- 行同步
- 场同步
- 地址码
二、显示原理以及时序
VGA 显示关键的是三个颜色,即红基色、绿基色和蓝基色,就是我们物理课上常说的三原色。
VGA 的显示效果取决于RGB 三个分量的位数(即:色深),最高24位(即RGB各8位),16位(即R5位,G6位,B6位),12位(即RGB各4位) 。色深越高能显示的颜色就越多,显示图片越鲜艳,现在主流的手机和电脑显示器都是8bit色深和10bit色深。
RGB信号在使用时的位宽有三种常见格式,具体跟显示器的设置有关:
1.RGB332,即R: G: B = 3: 3: 2
2. RGB565,即R: G: B = 5: 6: 5
3. RGB888,即R: G: B = 8: 8: 8
(ps:本次显示器支持的是RGB888)
所以想要正确的显示图像,只需要在显示器每个像素点上给出正确的RGB数值,就能达到想要的显示效果。
显示器能显示的原理是根据电子束扫描的方式:逐行扫描是扫描从屏幕左上角第一点开始,从左至右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行帧同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。
那么我要显示一个19201080的画面,那只需要扫描19201080次吗? 因为根据显示器扫描原理可知道,电子束每扫描一行或者一帧后,都需要时间进行消隐(我个人的理解就是电子束需要时间重置位置),所以实际上的扫描次数大于1920*1080次,时序图如下:
- sync是同步信号长度,hsync为行同步信号,vsync就为场同步信号
- backporch是后沿消隐长度
- active video 就是实际的显示画面长度
- front porch 是前沿消隐长度
其中,vsync是由hsync组成:
所以一幅图像在显示器真实的情况是这样:
不同分辨率的不同参数不同,大致分辨率表如下:
显示模式 | 时钟/Mhz | 行同步hsync | 行后沿 | 行有效 | 行前沿 | 行总共 | 场同步vsync | 场后沿 | 场有效 | 场前沿 | 场总共 |
---|---|---|---|---|---|---|---|---|---|---|---|
640×480@60Hz | 25.2 | 96 | 48 | 640 | 16 | 800 | 2 | 33 | 480 | 10 | 525 |
800×600@60Hz | 40 | 128 | 88 | 800 | 40 | 1056 | 4 | 23 | 600 | 1 | 628 |
1024×768@60Hz | 65 | 136 | 160 | 1024 | 24 | 1344 | 6 | 29 | 768 | 3 | 806 |
1280×720@60Hz | 74.25 | 40 | 220 | 1280 | 110 | 1650 | 5 | 20 | 720 | 5 | 750 |
1280×1024@60Hz | 108 | 112 | 248 | 1280 | 48 | 1688 | 3 | 38 | 1024 | 1 | 1066 |
1920×1080@60Hz | 148.5 | 44 | 148 | 1920 | 88 | 2200 | 5 | 36 | 1080 | 4 | 1125 |
3840×2160@60Hz | 594 | 88 | 296 | 3840 | 196 | 4400 | 10 | 72 | 2160 | 8 | 2250 |
时钟怎么算的呢?比如1920×1080@60hz的时钟=2200×1125×60=148.5M,其他的同理。
三、FPGA实现
本次显示RGB888,1920×1080@60Hz的纯色绿画面,所以外部输入时钟为148.5M。
//显示纯绿色图片
module vga_ctrl
(
input clk , //输入148.5M时钟
output reg vs , //输出vsync信号
output reg hs , //输出hsynv信号
output reg [23:0] data //输出RGB数据,共24位
);
parameter hcnt_max=2200; //行扫描计数器等于行同步+行前沿+行有效+场后沿
parameter vcnt_max=1125; //列扫描计数器等于场同步+场前沿+场有效+场后沿
parameter H_SYNC_TIME =<