Verilog编写VGA控制器
文章目录
- VGA电路原理
- VGA扫描方式
- VGA时序图
- VGA各时序参数规定
- VGA驱动模块设计
- 波形分析
关于VGA(视频图形阵列)驱动的博文数不胜数,虽然自己也一直在用该模块,但从未独立编写过这部分的代码,每次都是匆匆看一眼,今天整理一下~
VGA电路原理
VGA电路原理图如下,主要包括行场同步信号以及RGB数据的输出,无其他外部芯片,因此我们只需关注其显示原理和时序即可。
VGA扫描方式
1、显示器扫描包括逐行扫描和隔行扫描,其中隔行扫描是每隔一行扫一线,扫完一帧后返回来扫描剩余的线,隔行扫描的显示器闪烁快,容易引起视觉疲劳,因此一般采用逐行扫描的方式。
2、如下图所示,VGA采用逐行扫描的方式,从屏幕左上角一点开始,从左向右逐点扫描,每一行扫描完成后,回到下一行的起始位置继续扫描,从一行的结束位置到下一行的开始位置(虚线处),这个期间为行消隐期(简单理解,这个时间没不进行扫描),每一行开始和结束位置用行同步信号进行同步;当扫描完所有的行形成一帧,用场同步信号进行场同步,同样的,一帧完成后,扫描从一帧图像的右下角位置到下一帧左上角位置,紧接着再次扫描,此期间为场消隐期。
VGA时序图
如下图,VGA时序主要包括两部分:行时序H 和 场时序V。
其中行同步时序主要包括:行同步脉冲(a) 、显示后沿段(b) 、显示数据有效段©和显示前沿段(d)这四个参数。同步脉冲、显示前后沿都在行消隐期间,当消隐有效时,RGB信号无效,从而屏幕上不显示数据。
场同步时序同理:
场同步脉冲(a) 、显示后沿段(b) 、显示数据有效段©和显示前沿段(d)。同步脉冲、显示前后沿都在场消隐期间,当消隐有效时,RGB信号无效,从而屏幕上不显示数据。
注意:
1、由于行场同步都是负极性,因此同步脉冲要求为负脉冲。
2、行时序是以”像素”为单位的, 场时序是以”行”为单位的。
3、四个时序参数有特定规范。
VGA各时序参数规定
常用640*480@60hz帧,时钟频率为25Mhz,因此本文以此为例进行VGA显示驱动设计。
a:同步时间,描述同步信号中较短的电平的时间。
b:后沿+左边框
c:有效数据
d:右边框+前沿
e:总像素
给出一个例子:
分析:
行同步时序:一行对应像素总个数:800个像素,其中一行的显示有效数据为640个像素,每一行都有行同步信号,为96个低电平。
场同步时序:屏幕对应行的总数:525行,其中480行为显示有效数据,每行之间都有场同步信号,为2个低电平。
VGA驱动模块设计
1、确定端口
2、verilog代码编写
注意:简单进行数据测试,直接给输出vga_data = 16’hffff
//******VGA时序控制器*****//
// 640*480@60
// 参数:同步、显示后沿、有效数据、显示前沿、总
// hs :96 、 48 、 640 、16 、 800
// vs :2 、 33 、 480 、10 、 525
// 有效数据输出16‘hffff,否则16‘b0;
//***********//module vga_ctrl(input vga_clk,input rst_n,output de, //数据有效信号output hs, //行同步信号output vs, //场同步信号output vga_blank,//消隐信号output [15:0] vga_data);
reg [9:0] h_cnt; //列计数器
reg [9:0] v_cnt; //行计数器wire [9:0] pix_y; //列坐标
wire [9:0] pix_x; //行坐标//VGA时序参数定义parameter HS = 96,H_back_proch = 48,H_data = 640,H_front_proch = 16,H_total = 800,VS = 2,V_back_proch = 33,V_data = 480,V_front_proch = 10,V_total = 525;//列计数器always @ (posedge vga_clk or negedge rst_n)if(!rst_n)h_cnt <= 1'b0;else if (h_cnt == (H_total - 1'b1) ) //一行所有像素扫描完成h_cnt <= 1'b0;elseh_cnt <= h_cnt + 1'b1 ;//行计数器always @ (posedge vga_clk or negedge rst_n)if(!rst_n)v_cnt <= 1'b0;else if (v_cnt == (V_total - 1'b1) ) //一行所有像素扫描完成v_cnt <= 1'b0;else if ( h_cnt == (H_total - 1'b1))v_cnt <= v_cnt + 1'b1 ;elsev_cnt <= v_cnt ;// 产生行场同步信号
assign hs = (h_cnt <= ( HS - 1'b1 )) ? 1'b0 : 1'b1;
assign vs = (v_cnt <= ( VS - 1'b1 )) ? 1'b0 : 1'b1;
//消隐信号
assign vga_blank = hs & vs;
//产生数据有效信号
assign de = ((h_cnt >= ( HS + H_back_proch )) && (h_cnt <= ( HS + H_back_proch + H_data )) && (v_cnt >= ( VS + V_back_proch )) && (v_cnt <= ( VS + V_back_proch + V_data )) )? 1'b1 : 1'b0;//有效显示区域的行列坐标
assign pix_x = (de == 1'b1 ) ? (v_cnt - (VS + V_back_proch -1'b1)) : 1'b0;
assign pix_y = (de == 1'b1 ) ? (h_cnt - (HS + H_back_proch -1'b1)) : 1'b0;//有效数据输出
assign vga_data = (de == 1'b1 ) ? 16'hffff : 16'b0;endmodule
tb测试:
`timescale 1ns/1ns
`define clk_period 20module vga_ctrl_tb;reg vga_clk = 0;reg rst_n ;wire de; //数据有效信号wire hs; //行同步信号wire vs; //场同步信号wire vga_blank;//消隐信号wire [15:0] vga_data;vga_ctrl u1 (.vga_clk(vga_clk),.rst_n(rst_n),.de(de), //数据有效信号.hs(hs), //行同步信号.vs(vs), //场同步信号.vga_blank(vga_blank),//消隐信号.vga_data(vga_data));always#(`clk_period/2) vga_clk = ~vga_clk;initial begin rst_n=1'b0;#(`clk_period*20) rst_n=1'b1;#(`clk_period*500000)$stop;
endendmodule
波形分析
如下是行场同步以及数据有效显示信号:
可以看到第一行有效数据是从第35行,该行的是144个像素位置的,符合我们的vga时序参数。
可以看到如下是一幅图像在显示屏上的有效数据的开始结束位置,开始位置:h_cnt = 144,v_cnt = 35;
结束位置:h_cnt = 785,v_cnt = 515;
补充:关于行场同步信号极性问题
如下可看到有两种行场同步信号,它们高低电平的情况刚好相反,也就是极性不同,有正极性和负极性,信号中高电平时间长,低电平时间短就是负极性,反之就是正极性,上图为负极性,下图为正极性。
二者代码的区别:
上图:
assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b0 : 1'b1 ;
下图:
assign hsync = (cnt_h <= H_SYNC - 1'd1) ? 1'b1 : 1'b0 ;
虽然正负极性不同,但最终引脚配置的时候一样
Verilog编写VGA控制器相关推荐
- Verilog 编写规范
在学习Python时,作者有一句话对我影响很大.作者希望我们在学习编写程序的时候注意一些业内约定的规范.在内行人眼中,你的编写格式,就已经暴露了你的程度.学习verilog也是一样的道理,一段好的ve ...
- 使用jpa控制器层如何编写_用错误的方式编写Kubernetes控制器仍然有用
使用jpa控制器层如何编写 当您尝试将想法,方法或代码塞入意外的情况时,您会得到令人惊讶且有趣的结果. 系统管理员Chris McEniry在第17届年度南加州Linux Expo( SCaLE 17 ...
- (107)FPGA面试题-Verilog编写200ns异步/同步低有效复位激励
1.1 FPGA面试题-Verilog编写200ns异步/同步低有效复位激励 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog编写200ns ...
- (106)FPGA面试题-Verilog编写50MHz时钟激励
1.1 FPGA面试题-Verilog编写50MHz时钟激励 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog编写50MHz时钟激励: 5) ...
- 一、verilog编写三分频电路
1.目标:使用verilog编写三分频电路,要求占空比大小为50%. 2.方法:分别使用上升沿和下降沿计数cnt_p以及cnt_n,并且计数从0到N-1(N为分频的次数,此时为3):分别对clk_p以 ...
- 建立强大的verilog编写环境
可能标题有点大,各位看官仔细看吧... 第一部分各个开发编写环境介绍: 转自:https://zhuanlan.zhihu.com/p/33443736 各个编辑器的肤浅体验(for Verilog) ...
- VDHL VGA控制器设计实现显示器屏幕保护模块
基本功能: 1.通过FPGA板的VGA接口在显示器上分别显示不同颜色的横向.竖直条纹图案,横向条纹和竖直条纹的切换通过FPGA板上的按键实现. 2.通过VGA控制器,在屏幕上显示640*480的单色背 ...
- 基于MIPS的五级流水线微处理器(CPU)设计、modelsim仿真通过、verilog编写
基于MIPS的五级流水线微处理器(CPU)设计 摘要 本设计为一个五级流水线CPU,此CPU结构为MIPS结构.流水线CPU与单周期和多周期CPU相比较,提高了指令的执行速度,改善了CPU的整体吞吐率 ...
- python sublime 提示补全_【原创】Sublime+Verilator建立强大的verilog编写环境
前言(没必要看) --子曰:工欲善其事,必先利其器. 写个水文不容易,转载请注明,谢谢了... 在写这篇水文之前,我一直在用UE(UtralEdite)编写Verilog代码,使用习惯了之后,感觉很方 ...
- Sublime插件安装与提高Verilog编写效率插件推荐
前言 相对于Vivado与Quartus自带的编辑器,使用Sublime可以提高Verilog的编写效率.Sublime是可以自己编写插件并使用的,合理的运用插件可以提高开发Verilog生产力. 一 ...
最新文章
- mysql编码不对_MySQL编码不一致导致乱码问题总结
- 基于redis的cas集群配置(转)
- java 视频 缩略图_Java截取视频文件缩略图
- Makefile: -I(大写i)、-L、-l
- css3高级和低级样式属性先后顺序
- jQuery 引用地址{包括jquery和google提供的地址}, 节省你不必要的流量
- 前端提示框定位在鼠标的右下_前端基础高频面试题(更新中)
- 【C++入门】从C到C++
- 通过刷bios的方式在win8.1平板上启动windows phone模拟器
- 从零开始学Java——基础篇
- 清华conda源下不了torch_使用清华镜像源安装Pytorch
- 《SQL进阶教程》学习
- c语言 r语言 java,R语言rJava包安装载入及JAVA环境配置
- 拦截召唤神龙云文件,运行本地文件(侵删)
- opencv(三)对图像进行简单算术运算(加减乘除)
- 华为手机怎么语音服务器,原来华为手机实现文字转语音这么简单!今天才知道,真是绝了...
- Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
- Linux 内核模块查看命令
- 王小波经典语录/名句
- html js获取天气预报,原生JS实现天气预报