使用组合逻辑电路驱动VGA显示器
使用组合逻辑电路驱动VGA显示器
1. 概述
本文讲述一种不使用缓冲存储器驱动VGA显示的简单方法.其中,VGA分辨率采用DE10-Lite建议使用的640X480.像素的时钟25MHz,刷新率59.5帧/秒.
在DE10-Lite实验板上,VGA接口使用4位数值表示色彩.全0表示不亮,全1表示亮度最高,红,黄,蓝的明度在4’b0000-4’b1111之间,表示不同亮度的色彩.
信号col和row表示VGA控制器驱动的像素地址.

2. VGA接口信号
VGA接口相对简单.信号v_sync(垂直同步)变低,表示一帧图像完成,并为下一帧图像做准备.这一点在下图可以看到.

同样,信号h_sync变低表示一行数据传输完成,并为下一行数据做准备,这个在上图放大后可以看到h_sync变低了数百次.

下图显示了一些波形的细节,在266行,信号v_sync和h_sync都是高的时侯,col和row计数的变化,这里没有显示红黄蓝的数值.

3. 开始编写VGA代码
代码设计参考vga.combinational2.zip,其中包含各个模块和PLL例化.
4. 模块说明
VGA工程的主要模块说明如下:
l pll.v,pll.qip,pll.ppf
为得到一个正确的时钟信号,用PLL例化,由50MHz生成25Mhz的时钟信号。
pll.qip给Quartus提供一些信息,器件,相关的Verilog文件,ppf文件。pll.v是PLL例化文件。pll.ppf提供各种输入/出引脚数据。
l vga_controller.v
这个模块生成VGA接收端需要的行和列同步信号。通常,并不需要h_sync,v_sync和disp_ena信号。像素显示总是从左到右,从上往下,起点是左上角那个(0,0)的像素点。为了方便定位像素点,VGA_controller输出两个信号:行和列坐标。row-纵坐标,col-横坐标。注意disp_ena为0时,这些信号无效。
l comb_ckt_generator.v
这是一个组合逻辑模块,用来决定实验板上10个SW开关对应位置的像素点的RGB的色彩值。
l top.v
这是本设计的顶层模块,例化vga_controller和产生寄存器的时序,色彩输出信号。
这里面注意RGB为4‘b0000和4’b1111时的色彩。
5.使用代码去驱动显示
上面提供的代码很简单。给定行,列坐标(row:0-479;col:0-649)。像comb_ckt_generator.v里显示的那样,要创建合适的逻辑给像素点赋值RGB。
通常,会使用缓存来现存储要显示的图像,再显示。这里因为MAX10 FPGA没有现成的足够数量的缓存,所以我们用前述方法替代。
6.时钟信号vga_clk
在这个设计里,所有触发器的同步时钟信号应该是25MHz,而不是50MHz。VGA接口的像素时钟也是25MHz。
7.关于帧更新的时间问题
在完成一帧画面传输至准备传输下一帧画面之间,要及时更新传输的数据。比如,快速移动的对象,不会一部分显示在这一块,一部分显示在另一块。
处理这个问题,最好的方法是使用同步信号,比如垂直同步信号(VGA_VS)。如同DE10-Lite用户手册所述,VGA接口信号包含特殊的时间间隔。前面提供的代码里已经解决了这个问题。
8.保持VGA输出同步
虽然comb_ckt_generator.v没有时钟输入,如果块的复杂性需要,当然可以添加时钟输入和时钟内部逻辑。在行列,同步信号间可以添加流水线控制。
9. 补充说明
VGA驱动电路的难点还是在于VGA时序控制模块,这里的代码采用了一个比较巧妙的设计,以行扫描为例来阐述.我们知道一行完整的数据传输需要行同步的时间+后沿+像素显示的时间+前沿,其中行同步时用来表明一行显示完,准备显示下一行,而前沿,后沿则是消隐的需要.代码里,为了使计数器的值从0开始就与像素的坐标匹配,所以行扫描的周期从像素显示开始计数,一行的计数顺序是像素显示+前沿_行同步+后沿.这样,通过限定最大值,就能确定坐标的范围,并且是从左上角那个点开始显示.
原设计是用3个SW开关来控制显示屏显示三种色彩或混合色.有了坐标和像素点的对应关系的理解后,可以稍稍把下图中85-87行的代码修改成col的区域,使屏幕显示不同的色块.

修改后可以实现类似

References:
- EEC180 Tutorial: Displaying to a VGA monitor using a combinational circuit
https://www.ece.ucdavis.edu/~bbaas/180/tutorials/vga/
Written by YongfengXie
2022/05/27 Written
使用组合逻辑电路驱动VGA显示器的更多相关文章
- 使用FPGA开发板驱动VGA显示器
1. 本次使用的是cyclone4开发板,先看下原理图,因为右边的RGB应该是模拟信号量,但是本次例程只接了3根线,那就是说颜色只有8种. 2. 代码,输出信号有R,G,B三色,就是上图右边的,行同步 ...
- 实验三 组合逻辑电路的VHDL设计
一.实验目的 熟悉QuartusⅡ的VHDL文本设计过程,学习简单组合逻辑电路的设计.仿真和测试方法. 二.实验内容 1. 基本命题 完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测 ...
- Verilog-FPGA硬件电路设计之一——if语句优先级(always块中的阻塞赋值生成的组合逻辑电路是按照顺利执行的)
出处:http://bbs.ednchina.com/BLOG_ARTICLE_3013262.HTM 综合软件:Quartus II 一.有优先级的if语句 if..else if.. else i ...
- FPGA学习笔记(五)—— 组合逻辑电路功能的描述
设计方法: 分析真值表规律 两种描述方式: 方式1:用assign描述,用阻塞赋值= 方式2:用always@(*)描述,用非阻塞赋值<= 选择功能的三种描述方式: ...
- 用verilog来描述组合逻辑电路
1,什么是组合逻辑电路? 逻辑电路在任何时刻产生的稳定的输出信号仅仅取决于该时刻的输入信号,而与过去的输入信号无关,即与输入信号作用前的状态无关,这样的电路称为组合逻辑电路. 上图给出了一个典型的数字 ...
- 【VHDL】组合逻辑电路和时序逻辑电路的区别
简单的说,组合电路,没有时钟:时序电路,有时钟. ↓ 也就是说,组合逻辑电路没有记忆功能,而时序电路具有记忆功能. ↓ 在VHDL语言中,不完整条件语句对他们二者的影响分别是什么?组合逻辑中可能生成锁 ...
- 数字电路基础知识——组合逻辑电路(数据选择器MUX、多路复用器)
转自:https://blog.csdn.net/vivid117/article/details/100747939 数字电路基础知识--组合逻辑电路(数据选择器MUX.也即多路复用器)本次介绍数据 ...
- FPGA驱动VGA显示静态图片
一 .前言 本文设计思想采用明德扬至简设计法.VGA是最常见的视频显示接口,时序也较为简单.本文从利用显示屏通过VGA方式显示测试图案及静态图片着手带大家接触图像显示应用,算是为后续VGA显示摄像头采 ...
- 硕盟SM-H2V1 HDMI转VGA 笔记本台式主机HDMI转VGA显示器转接头
硕盟SM-G2V1 HDMI转VGA高清转换器一款采用优质芯片的HDMI转VGA转换器,快速传输众享1080P的高清画质显示,而且HDMI转VGA高清转换器,采用24k镀金工艺,耐磨.耐腐蚀性强,这 ...
- Ubuntu14.04安装AMD显卡驱动双屏显示器完全解决方案
网上有很多方法,但是针对AMD显卡的方案不多,所以笔者今天想写一篇关于AMD显卡的教程. 首先,进入这个网址下载一些东东:http://support.amd.com/zh-cn/download/d ...
随机推荐
- 一个基于.NET Core构建的简单、跨平台、模块化的商城系统
前言 今天大姚给大家分享一个基于.NET Core构建的简单.跨平台.模块化.完全开源免费(MIT License)的商城系统:Module Shop. 商城后台管理端功能 商品:分类.品牌.单位.选 ...
- IDEA 突然无法打开 解决办法
如果实在没有方法了可以试一试 删除所有的配置文件,默认位置C:\Users\${你的用户名}\${.IntelliJIdea+版本} 注意:删除配置后之前所有的设置都会失效,谨慎操作.
- mysql mysqldump 命令导出
1.导出指定表的数据 mysqldump -t database -u user -p --table_name1 table_name2 table_name3 >C:\db_script. ...
- Spring框架之IoC( Inversion of Control )基础知识入门
1.IoC创建对象的方式 使用无参构造创建对象 假如要使用有参构造创建: 下标赋值constructor-arg <!--有参--> <bean id="User" ...
- 5 CSS伪类选择器
5 伪类选择器 anchor伪类:专用于控制链接的显示效果 More Actions:link a:link 选择所有未被访问的链接. :visited a:visited 选择所有已被访问的链接. ...
- JDK10的新特性:本地变量类型var
目录 简介 为什么我们需要var var使用在什么地方 var不能用在什么地方 其他var的特点 总结 简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java语言 ...
- MySQL 主从 AUTO_INCREMENT 不一致问题分析
作者:vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象,一旦触发了主从切换, ...
- C 多维数组、特殊字符和字符串函数详解
C 多维数组 数组,也称为单维数组.这些非常棒,是您在 C 语言编程中会经常使用的东西.然而,如果您想要将数据存储为表格形式,例如带有行和列的表格,则需要熟悉多维数组. 二维数组 二维数组也称为矩阵, ...
- 【Kotlin】类和对象
1 前言 Kotlin 是面向对象编程语言,与 Java 语言类似,都有类.对象.属性.构造函数.成员函数,都有封装.继承.多态三大特性,不同点如下. Java 有静态(static)代码块,Ko ...
- pyqt5报错:qt.qpa.plugin: Could not find the Qt platform plugin "windows" in "" This ap
环境: win10 Python 3.7.5 vs code 解决方法: 新建环境变量,然后重启 vs code 就可以了 QT_QPA_PLATFORM_PLUGIN_PATH C:\Users\ ...