fpga驱动rgb液晶屏_[转载]基于FPGA的VGA驱动显示
一、概述
要实现整个视频图像采集系统,我们分成了六大步骤:
二、VGA接口、时序及驱动电路
1、VGA接口
VGA:Video Graphics
Array视频图像阵列,VGA的主要作用是通过将计算机显卡处理的视频图像实时传输到显示器上进行显示。VGA接口采用十五针的D型接口,分为三排,每排五个,接口分为公头和母头,编号顺序为公头从左到右,母头从右到左。
VGA接口信号定义:
编号
名称
描述
1
RED
红基色信号输入
2
GREEN
绿基色信号输入
3
BLUE
蓝基色信号输入
4
ID bit
地址码(或ID2)
5
Self_Test
自测试信号(可自定义)
6
RGND
红基色信号接地
7
GGND
绿基色信号接地
8
BGND
蓝基色信号接地
9
RESERVED
保留(可自定义)
10
SGND
数字信号地
11
ID0
显示器标志位0
12
ID1
显示器标志位1
13
HSYNC
行同步信号
14
VSYNC
场同步信号
15
ID3
显示器标志位3
在发展初期,显示屏为CRT,彩色信号的输入为模拟信号传输,模拟电压门限为0~0.714V。其中0V代表无色,0.714V代表满色。为了满足VGA接口的模拟传输要求,显卡必须通过DAC转换。
随后生产的LCD显示器为数字显示设备,但为了实现接口的一致性,在显示器内部设计了ADC电路,以集成VGA接口。这样的缺点是经过两次数模转换造成图像的细节损失。
之后产生了DVI(Digital Visual Interface)接口来支持数字信号的传输。以及HDMI接口标准实现高清传输。
2、VGA时序分析
(1)
关闭显示:同步扫描枪坐标。
(2)
打开显示:扫描坐标从显示器的左上角开始,逐个像素向右扫描。(第一个水平向右的箭头)
(3)
关闭显示:扫描到第一行最右边,关闭显示,同时扫描坐标移到第二行首(虚线)。
(4)
打开显示从第二行左上角开始,逐个向右扫描。
(5)
当扫描到显示器右下角时,扫描抢从先转移到显示器左上角。
(1)(5)称为场同步,(3)称为行同步,其他过程正常显示。
一个完整行的扫描周期由a、b、c、d四个部分组成,a(行同步)代表进行行扫描地址的复位,b(行消隐后肩)代表扫描地址转移后的稳定等待期,c(行显示时期)代表行显示期,此时数据正常输出,d(行消隐前肩)代表扫描地址转移的准备。场扫描与行扫描时序是类似的,但场扫描周期是以行扫描周期为单位的。比如以640*480@60Hz为例,640*480为屏幕每行有640个像素点,每列有480个像素点,60Hz为每秒屏幕刷新60次。根据行场刷新频率表:
分辨率
时钟
(MHz)
行时序
场时序
a
b
c
d
e
a
b
c
d
e
640*480@60Hz
25.175
96
48
640
16
800
2
33
480
10
525
800*600@60Hz
50
120
64
800
56
1040
6
23
600
37
666
1024*768@60Hz
65
136
160
1024
24
1344
6
29
768
3
806
1280*1024@60Hz
108
112
248
1280
48
1688
3
38
1024
1
1066
1600*1200@60Hz
162
192
304
1600
64
2160
3
46
1200
1
1250
1920*1200@60Hz
193.16
208
336
1920
128
2592
3
38
1200
1
1242
行时序一共有800个像素周期,场时序一共有525个行周期,那么:
行频率:525*60=31500Hz=31.5KHz
点频率:525*60*800=25.2MHz
3、RGB三原色模型
饱和度均为100%的RGB三原色能组合成8种颜色,每个颜色通道也可以细分为256级别(RGB888),不同级别的颜色可以综合出256*256*256种颜色,在VGA中0~0.714V分别对应0~255级深度,这样,每个像素需要24位的数据来表示。为了节约带宽,可以使用RGB565来表示一个像素,16位刚好更适用于16位宽的存储器。
4、VGA硬件驱动电路设计
FPGA的IO输出为3.3V或0V代表高低电平,而VGA要求0~0.714V模拟信号,故需要设计数模转换功能。HSYNC和VSYNC为3.3V数字信号,直接可以和FPGA相连。主要有两种电平转换方式:
(1)R-2R电阻模拟
(2)DAC芯片ADV7123,其原理图和引脚功能如下:
Pin
No
Name
Function
1-10
G9-G0
RGB十位输入,不需要的可以接地
14-23
B9-B0
39-48
R9-R0
11
BLANK
当输入为低电平时,输入的RGB被忽略
12
SYNC
同步补偿信号
13,29,30
Vaa
模拟电压输入
24
CLOCK
输入时钟,大小通常为点频率
25,26
GND
接地
27,31,33
IOB,IOG,IOR
差分RGB输出信号,不使用的话接地
28,32,34
IOB,IOG,IOR
RGB输出信号
35
COMP
补偿,接0.1uF电容到Vaa
36
Vref
参考电压,接0.1uF电容到Vaa
37
Rset
连接下拉不同阻值下拉电阻来满足一定的输出电流
38
PSAVE
电源节能控制,接高电平开启
三、VGA驱动的FPGA实现
lcd_driver模块的编写:
端口名
位宽
输入/输出
说明
clk
1
input
全局时钟信号(50MHz)
rst_n
1
input
全局复位信号,低电平有效
lcd_data
24
Input
图像数据输入信号
lcd_dclk
1
output
ADC7123像素时钟输入
lcd_blank
1
output
ADV7123显示空白输入
lcd_sync
1
output
ADV7123显示同步引脚(可始终低)
lcd_hs
1
output
VGA行同步信号
lcd_vs
1
output
VGA场同步信号
lcd_en
1
output
ADV7123
lcd_rgb
24
output
ADV7123数字端输入信号
lcd_request
1
output
图像数据请求信号(提前一个时钟)
lcd_xpos
11
output
图像列地址信号(提前一个时钟)
lcd_ypos
11
output
图像行地址输出信号
(1)
设定640*480@60Hz分辨率的宏定义参数
//640*480@60Hz VGA
Timing
//这里定义为10位宽,因为记数到800,转换成16进制为320,即1100100000
`define H_FRONT 10'd16
`define H_SYNC 10'd96
`define H_BACK 10'd48
`define H_DISP 10'640
`define H_TOTAL 10'd800
`define V_FRONT 10'd10
`define V_SYNC 10'd2
`define V_BACK 10'd33
`define V_DISP 10'd480
`define V_TOTAL 10'd525
(2)行、场扫描记数单位:所有的信号包括使能信号、用户接口都以此参考生成的。
//h_sync counter
reg [9:0] h_cnt;
always@(posedge clk or
negedge rst_n)
begin
if(!rst_n)
h_cnt <=10'd0;
else
begin
if(h_cnt ==`H_TOTAL-1'b1)
h_cnt <=10'd0;
else
h_cnt <=h_cnt +1'b1;
end
end
assign lcd_hs=(h_cnt <=`H_SYNC-1'b1)?1'b0:1'b1;//生成行同步信号
//v_sync counter
reg [9:0] v_cnt;
always@(posedge clk or
negedge rst_n)
begin
if(!rst_n)
v_cnt <=10'b0;
else if(h_cnt==`H_TOTAL-1)
begin
if(v_cnt ==`V_TOTAL-1'b1)
v_cnt <=10'b0;
else
v_cnt <=v_cnt+1'b1;
end
else
v_cnt <=v_cnt;
end
assign lcd_vs=(v_cnt <=`V_SYNC-1'b1)?1'b0;1'b1;//生成场同步信号
(3)ADV7123控制信号
//ADV7123
assign lcd_dclk=clk;
assign lcd_blank=lcd_hs&lcd_vs;
assign lcd_sync=1'b0;
lcd_blank作为显示空白信号,低电平有效,此时RGB输入都将被忽略。设定为场同步之外的时刻。lcd_sync不需要,直接接地。
(4)数据的使能信号
//data out
assign lcd_en=(h_cnt>=`H_SYNC+`H_BACK&&
h_cnt
(v_cnt>=`V_SYNC+`V_BACK&&
v_cnt
assign lcd_rgb=lcd_en?lcd_data:24'h000_000;
只有在行、场显示有效时间,数据才能有效的输出,当lcd_en有效时,接收外部输入的RGB数据作为VGA驱动模块的输出,同时作为ADV7123的数据输入。
(5)用户控制信号接口
//user interface
localparam H_AHEAD=1;
assign lcd_request=(h_cnt>=`H_SYNC+`H_BACK-H_AHEAD&&
h_cnt
(v_cnt>=`V_SYNC+`V_BACK&&
v_cnt
assign lcd_xpos=lcd_request?(h_cnt-(`H_SYNC+`H_BACK-H_AHEAD)):10'd0;
assign lcd_ypos=lcd_request?(v_cnt-(`V_SYNC+`V_BACK)):10'd0;
这里要深刻理解一下,lcd_request相当于提前了一个是时钟的lcd_en,在v_cnt中不能减去H_AHEAD,因为如果这样,lcd_request在场有效的前一个时钟内也会有高电平的出现,而这是不允许的。
以lcd_request信号为使能是为了保证lcd_xpos和lcd_ypos信号的正确时序,这样lcd_xpos最早只能在行显示期的前一时刻出现,同时也保证lcd_ypos是在场有效期内出现。lcd_xpos相对于h_cnt的对应坐标永远都提前了一个单位,这样通过非阻塞赋值,数据会在下一个时刻输出,刚好对应相应的lcd_en,也就是在相应的行显示期内。
这里同样lcd_ypos没有减去H_AHEAD,仔细想一想,记住场都是以行周期为单位的。
lcd_display模块的编写:
建立lcd_display模块,作为lcd_driver的图像输入源,通过对lcd_xpos和lcd_ypos坐标的判断,来实现固定区域图像的输入。
端口名
位宽
输入输出
说明
clk
1
input
全局时钟信号(50MHz)
rst_n
1
input
全局复位信号
lcd_xpos
10
input
图像列地址(提前一个时钟)
lcd_ypos
10
input
图像行地址
lcd_data
24
output
图像输出信号
(1)
宏定义8种颜色
//define the
color
`define
RED 24'hFF0000
`define
GREEN 24'h00FF00
`define
BLUE 24'h0000FF
`define WHITE
24'hFFFFFF
`define BLACK
24'h000000
`define
YELLOW 24'hFFFF00
`define
CYAN 24'hFF00FF
`define ROYAL
24'h00FFFF
(2)
根据输入的行、列地址,输出8色彩条
always@(posedge clk or
negedge rst_n)
begin
if(!rst_n)
lcd_data <=24'h0;
else
if(lcd_xpos>=0&&lcd_xpos
lcd_data <=`RED;
else
if(lcd_xpos>(`H_DISP/8)*1&&lcd_xpos
lcd_data <=`GREEN;
else
if(lcd_xpos>(`H_DISP/8)*2&&lcd_xpos
lcd_data <=`BLUE;
else
if(lcd_xpos>(`H_DISP/8)*3&&lcd_xpos
lcd_data <=`WHITE;
else
if(lcd_xpos>(`H_DISP/8)*4&&lcd_xpos
lcd_data <=`BLACK;
else
if(lcd_xpos>(`H_DISP/8)*5&&lcd_xpos
lcd_data <=`YELLOW;
else
if(lcd_xpos>(`H_DISP/8)*6&&lcd_xpos
lcd_data <=`CYAN;
else
lcd_data <=`ROYAL;
end
最后设计顶层文件,得到的仿真结果如下:
fpga驱动rgb液晶屏_[转载]基于FPGA的VGA驱动显示相关推荐
- fpga驱动rgb液晶屏_以ARM+FPGA结构驱动高分辨率液晶显示设计与效果测试
摘 要: 结合ARM操作灵活和FPGA实时处理的优点,提出采用ARM+FPGA结构驱动高分辨率RGB888液晶显示屏.ARM接口丰富.操作灵活可以满足客户操作方便的需求:FPGA模块采用FPGA+DD ...
- fpga驱动rgb液晶屏_正点原子开拓者FPGA开发板资料连载第五十四章基于的数字识别实验...
1)实验平台:正点原子开拓者FPGA 开发板 2)摘自<开拓者FPGA开发指南>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载地址:http://www.o ...
- fpga驱动rgb液晶屏_用FPGA设计LCD 转 VGA 其实vga和lcd驱动 非常类似
这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃 ...
- MCU驱动和RGB驱动的液晶屏的区别
概况来讲,RGB驱动需要的硬件条件高,比如用STM32F429的LTDC+DMA2D模块,外加SDRAM作为显存.而MCU接口,STM32F407系列的控制器就整合了这个模块,包含6800和8080两 ...
- ESP32驱动LCD液晶屏选型、262K什么意思?SPI写LCD的GRAM时序、MCU液晶屏驱动IC的寄存器功能
最近转战ESP32,ESP32-D0WDQ6 型号的GPIO只有那么20个左右,且还有几个GPIO只能做输入,非常捉襟见肘.所以如果要驱动LCD液晶屏,绝大多数都会选择SPI接口的MCU屏. 为了编写 ...
- 单通道驱动LVDS驱动1080P液晶屏
上周末把单通道LVDS驱动1080P液晶屏调通了.通过FPGA接收单8的LVDS输入,内部一个倍频,数据组合格式如下:
- STM32F103软件模拟SPI接口驱动ILI9486液晶屏
STM32F103软件模拟SPI接口驱动ILI9486液晶屏 ILI9486的工作模式 ILI9486的SPI总线方式简介 ILI9486的3线SPI总线底层驱动配置步骤 ILI9486的工作模式 I ...
- arduino下载库出错_arduino的I2C通讯 3:驱动1602液晶屏
上个推送,我们学习了I2C功能的基础知识.而且知道了使用很多器件都需要安装库.本次,我们一起来做一个实例,用arduino驱动1602液晶屏 1602代表屏幕有16列,2行.传统的驱动方式占用了大量的 ...
- 通过 I2C 驱动 LCD1602 液晶屏(51单片机)
通过 I2C 驱动 LCD1602 液晶屏(51单片机) 硬件实物 原理图 3.程序 #include <reg51.h> #include <intrins.h>#defin ...
- stm32 arduino 驱动jlx液晶屏
stm32 arduino 驱动jlx液晶屏 1.说明 单片机这次用的是STM32F103C8T6,烧成arduino用,库还是我们的老朋友u8g2.液晶屏型号是JLX 240160G-676,SPI ...
最新文章
- 文档相似度之doc2vec、文档聚类
- 牛客小白月赛25 补题+题解[A-J]
- linux和windows双系统引导,windows和linux双系统引导问题
- 拿什么留住你,我的程序员
- kali linux 安装 Mysql Can‘t read from messagefile 报错解决方案
- 禄露禄露碌脛脥炉脛锚,学者批时下宫廷戏“就是一堆文化垃圾”
- dz seo插件_河北seo优化网络推广报价单
- JAVA_WEB--jsp语法
- java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份
- oracle中的(+)
- 两个企业级产品设计思路:流程效率指标功能生命周期长度
- java 自动生成mybatis文件_如何自动生成Mybatis的Mapper文件详解
- PHP学习总结(10)——PHP入门篇之自定义网站根目录
- 题解报告:hdu 1754 I Hate It(线段树)
- 判断目录下的文件是否为图片
- 报童问题模型matlab,报童模型matlab
- Nodejs 下载安装步骤(Windows环境)
- APK大小查看、定义、反编译、如何安装解压
- WPS国际版2019 中文
- 机房管理制度(试行)
热门文章
- 大屯公司办公系统服务器地址,OA系统地址
- 微信小程序打卡签到页面(有效果图)
- 小工具--浏览器主页被挟持,svchost.exe占用网速,treeSizeFree,桌面日历,WIN自带哈希校验
- 逆水寒服务器什么时候能维护好,逆水寒11月22日更新维护公告 逆水寒更新到什么时候...
- 如何设置Google浏览器支持跨域
- Position Based Dynamics【译】
- FusionAccess模板制作并发放
- 工作站 服务器 监控系统,电网工作站智能安全监控系统的设计与实现
- Word 公式编辑器: 公式居中,编号居右,带章节号自动更新,且可以交叉引用
- 听说你也想修改IP归属地?