VGA显示器驱动设计与验证

1.原理

场同步信号的单位是像素点

场同步信号的单位是一行

@60的含义是每秒钟刷新60帧图像

全0表示黑色

2.1 CLK_gen.v

module CLK_gen(input wire 		sys_clk		,input wire 		sys_rst_n	,output wire 	CLK_out		,output wire 	locked		
);parameter STATE=1'b0;
reg [1:0] cnt;
reg       flag_clk;assign locked=STATE;
assign CLK_out=flag_clk;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)cnt<=2'b0;else if(cnt==2'd1)cnt<=2'b0;else cnt<=cnt+1'b1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n==1'b0)flag_clk<=1'b0;else if(cnt==2'd1)flag_clk<=1'b1;elseflag_clk<=1'b0;endmodule

2.2 Vga_ctrl.v

module Vga_ctrl(input wire 			Vga_clk		,input wire 			sys_rst_n	,input wire [15:0]	Pix_data	,output wire [9:0]    Pix_x		,output wire [9:0]    Pix_y		,	output wire [15:0]	rgb			,output wire 		    hsync		,output wire		    vsync
);parameter 	H_SYNC=10'd96   , H_BACK=10'd40   ,H_LEFT=10'd8    ,H_VALID=10'd640 ,H_RIGHT=10'd8   ,H_FRONT=10'd8   ,H_TOTAL=10'd800 ;parameter	V_SYNC=10'd2	,V_BACK=10'd25   ,V_TOP=10'd8     ,V_VALID=10'd480 ,V_BOTTOM=10'd8  ,V_FRONT=10'd2   ,V_TOTAL=10'd525;reg [9:0] Cnt_h;
reg [9:0] Cnt_v;
wire Rgb_valid;
wire pix_data_req;assign Rgb_valid=(Cnt_h>=H_SYNC+H_BACK+H_LEFT&&Cnt_h<H_SYNC+H_BACK+H_LEFT+H_VALID&&Cnt_v>=V_SYNC+V_BACK+V_TOP&&Cnt_v<V_SYNC+V_BACK+V_TOP+V_VALID)?1'b1:1'b0;//这里为什么不减1呢,画个简单的图就知道了//因为前面的时间要满足H_SYNC+H_BACK+H_LEFT,//有效信号是从他们之和加1开始计数的//比如Cnt_h=10,就是计数了11个,//而H_SYNC+H_BACK+H_LEFT=1+2+3=5//所以前面要计满5个,也就是计数到4,10-5=5刚好是大于等于5开始信号有效assign pix_data_req=(Cnt_h>=H_SYNC+H_BACK+H_LEFT-1'b1&&Cnt_h<H_SYNC+H_BACK+H_LEFT+H_VALID-1'b1&&Cnt_v>=V_SYNC+V_BACK+V_TOP&&Cnt_v<V_SYNC+V_BACK+V_TOP+V_VALID)?1'b1:1'b0;assign Pix_x=pix_data_req?Cnt_h-(H_SYNC+H_BACK+H_LEFT-1'b1):10'h3ff;
assign Pix_y=pix_data_req?Cnt_v-(V_SYNC+V_BACK+V_TOP):10'h3ff;	  
//assign Pix_x=Rgb_valid?Cnt_h-(H_SYNC+H_BACK+H_LEFT):10'd0;
//assign Pix_y=Rgb_valid?Cnt_v-(V_SYNC+V_BACK+V_TOP):10'd0;
//这里也没有减1为什么呢
//同理Cnt_h是从0开始计数的,假如Cnt_h=10
//H_SYNC+H_BACK+H_LEFT=1+2+3=5
//那么此时的行坐标就等于10-5=5,因为前面的0-4是5个周期
//如果此时在H_SYNC+H_BACK+H_LEFT的基础上减1的话
//那么10-4=6,前面就是0-5等于6个时钟周期了,时序不符合assign hsync=(Cnt_h<=H_SYNC-1'b1)?1'b1:1'b0;
assign vsync=(Cnt_v<=V_SYNC-1'b1)?1'b1:1'b0;
//为什么这里要减呢,因为Cnt_h是从0开始计数的,假如说计数到了10,就是0-11
//假如行同步信号是2个时钟周期,那么有效的就是第3个时钟周期,也就是计数到1.
//举个例子就能看出是不是需要减了assign rgb=(Rgb_valid==1'b1)?Pix_data:16'd0;always@(posedge Vga_clk or negedge sys_rst_n )if(sys_rst_n==1'b0)Cnt_h<=10'd0;else if(Cnt_h==H_TOTAL-1'b1)Cnt_h<=10'd0;elseCnt_h<=Cnt_h+1'b1;always@(posedge Vga_clk or negedge sys_rst_n )if(sys_rst_n==1'b0)Cnt_v<=10'd0;else if((Cnt_v==V_TOTAL-1'b1)&&(Cnt_h==H_TOTAL-1'b1))Cnt_v<=10'd0;else if(Cnt_h==H_TOTAL-1'b1)Cnt_v<=Cnt_v+1'b1;elseCnt_v<=Cnt_v;endmodule

2.3 tb_Vga_ctrl.v

module tb_Vga_ctrl();reg sys_clk;
reg sys_rst_n	;
reg[15:0] Pix_data	;wire [9:0] Pix_x	  ;
wire [9:0] Pix_y    ;
wire [15:0]rgb	  ;
wire hsync    ;
wire vsync    ;
wire CLK_out	;	  
wire locked	   ;
wire rst_n;initial beginsys_clk=1'b1;sys_rst_n<=1'b0;#20sys_rst_n=1'b1;end	assign rst_n=(sys_rst_n&&locked);always#10 sys_clk=~sys_clk;always@(posedge CLK_out or negedge rst_n)if(rst_n==1'b0)Pix_data<=16'h0000;else if (Pix_x>=10'd0&&Pix_x<=10'd639&&Pix_y>=10'd0&&Pix_y<=10'd479)Pix_data<=16'hffff;elsePix_data<=16'h0000;defparam CLK_gen_inst.STATE=1'b1;	Vga_ctrl Vga_ctrl_inst(.Vga_clk	(CLK_out)	,.sys_rst_n	(rst_n),.Pix_data	(Pix_data),.Pix_x		(Pix_x		),.Pix_y		(Pix_y		),	.rgb		(rgb		)	,.hsync		(hsync		),.vsync      (vsync    )
);CLK_gen CLK_gen_inst(.sys_clk	(sys_clk	)	,.sys_rst_n	(sys_rst_n	),.CLK_out	(CLK_out	)	,.locked		(locked		)
);endmodule

要显示1帧图像,1s是60帧,1帧就是0.0167s,所以等于16.7ms

时钟正确25mhz,锁定信号是拉高的,表示锁定信号在高电平时,时钟的输出有效,因为若锁定信号为0,那么复位信号就一直为0,时钟就起不了作用。

复位信号为0,数据就为0,坐标信号大于等于0且小于一定范围就为全为白色ffff。否则就全为0。

完成一帧

场同步信号也正确。

这里有错。因为有效信号多记了一个时钟周期

因此这里要修改数据有效信号

现在计数正确了

修改时钟换成分频后的信号

还是有问题,当数据有效时,数据仍为0。说明数据滞后数据有效信号一个时钟周期,所以得让数据提前一个时钟周期,解决方法是增加一个数据请求信号,比数据有效信号提前1时钟周期,然后rgb刚好滞后数据请求信号一个时钟周期。就达到了rgb和数据有效信号同步得效果。

末尾没有问题,原因是因为是时序逻辑,修改代码

行可以超前,但是场不用,场超前就是超前一行了,而行超前就是超前一个时钟周期。这里修改是要将pix_x超前一个时钟周期,然后再pi_data滞后一个周期,从而达到同步的效果

行计数器这里也要减1

请求信号确实超前有效信号一个时钟周期

末尾也正确

但是坐标还是不对

这下对了,为什么要让括号里面的信号减1呢?因为pix_data_req比数据有效信号提前了一个时钟周期,如果按照原来的不减1,那么坐标就会变小,提前数据有效信号一个时钟周期,要让坐标不变,就得让计数得值变大,所以减1。

数据和有效信号是同步的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/296321.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

非关系型数据库-----------Redis的主从复制、哨兵模式

目录 一、redis群集有三种模式 1.1主从复制、哨兵、集群的区别 1.1.1主从复制 1.1.2哨兵 1.1.3集群 二、主从复制 2.1主从复制概述 2.2主从复制的作用 ①数据冗余 ②故障恢复 ③负载均衡 ④高可用基石 2.3主从复制流程 2.4搭建redis主从复制 2.4.1环境准备 2.4…

elementui 左侧或水平导航菜单栏与main区域联动

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、elementui 实现一个固定位置的Pagination&#xff08;分页&#xff09;组件 文章目录 系列文章目录…

配置zookeeper的时候三个节点都启动了但是查询zookeeper的角色的时候显示没启动成功

场景 搭建了一个音乐平台数仓&#xff0c;一共有五个节点&#xff0c;其中三个节点配置zookeeper&#xff0c;我的操作是先把这三个节点的zookeeper全部启动&#xff0c;然后再分别查询各自zookeeper的角色。出现了一下问题&#xff1a; Error contacting service. It is proba…

【Java】:继承

目录 1.为什么需要继承 2.继承的概念 3.继承的语法 4.父类成员访问 4.1子类和父类不存在同名成员变量 1.子类和父类不存在同名成员变量 2.子类和父类成员变量同名 4.2子类中访问父类的成员方法 1.成员方法名字不同 2.成员方法名字相同 5.super关键字 6.子类构造方法 …

CTF下加载CTFtraining题库以管理员身份导入 [HCTF 2018]WarmUp,之后以参赛者身份完成解题全过程

-------------------搭建CTFd------------------------------ 给大家介绍一个本地搭建比较好用的CTF比赛平台&#xff1a;CTFD。 CTFd是一个Capture The Flag框架&#xff0c;侧重于易用性和可定制性。它提供了运行CTF所需的一切&#xff0c;并且可以使用插件和主题轻松进行自…

212 基于matlab的双稳态随机共振的算法

基于matlab的双稳态随机共振的算法&#xff0c;分析信噪比随系统参数a,b及乘性噪声和加性噪声的增益变化曲线&#xff0c;60个数据样本可供选择。程序已调通&#xff0c;可直接运行。 212 双稳态随机共振 信噪比增益变化曲线 - 小红书 (xiaohongshu.com)

基于java实现的弹幕视频网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

C++ //练习 11.3 编写你自己的单词计数程序。

C Primer&#xff08;第5版&#xff09; 练习 11.3 练习 11.3 编写你自己的单词计数程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************************************************************> …

Jenkins 使用 Description Setter

想要的效果如图: 在打包完成之后直接在构件历史的部分展示出来构建的docker镜像名,这样就不需要去找日志了。 首先安装插件 Description Setter, 如何安装就不在此赘述了。 安装完成之后&#xff0c;在构件后操作选项添加一个流程&#xff0c; 有两个字段: regular expressi…

2024年 前端JavaScript 进阶 第3天 笔记

3.1-JS进阶-内容和两种编程思想 3.2-构造函数实现封装以及存在 3.3-原型对象prototype 3.4-数组扩展案例-求最大值和数组求和 3.5-constructor属性以及应用 3.6-对象原型proto 3.7-原型继承 3.8-原型链以及instanceof运算符 3.9-综合案例-模态框构造函数写法 3.10-综合案例-0pe…

Apache ECharts-数据统计(详解、入门案例)

简介&#xff1a;Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 1、介绍 图 1.1 Apache ECharts 功能、运行环境 功能&#xff1a; ECharts&#xff…

容器安全的防护之道

随着云计算的发展&#xff0c;云原生技术已经成为企业数字化转型的得力武器&#xff0c;如何保障容器安全&#xff0c;已成为企业最关心的问题。为此&#xff0c;德迅蜂巢原生安全平台由德迅云安全自主研发&#xff0c;能够很好集成到云原生复杂多变的环境中&#xff0c;如PaaS…

Ubuntu Desktop 安装有道词典

Ubuntu Desktop 安装有道词典 1. 有道词典2. Installation2.1. 解压 deb 包到 youdao 目录2.2. 解压 deb 包中的 control 信息 (包的依赖写在该文件里面)2.3. 编辑 control 文件&#xff0c;删除依赖里面的 gstreamer0.10-plugins-ugly2.4. 创建 youdaobuild 目录&#xff0c;重…

数据结构(初阶)第一节:数据结构概论

本篇文章是对数据结构概念的纯理论介绍&#xff0c;希望系统了解数据结构概念的友友可以看看&#xff0c;对概念要求不高的友友稍做了解后移步下一节&#xff1a; 数据结构&#xff08;初阶&#xff09;第二节&#xff1a;顺序表-CSDN博客 正文 目录 正文 1.数据结构的相关概…

AWS上面部署一台jenkins

问题 客户预算有限&#xff0c;需要在aws云上面搞一台EC2手动安装jenkins发版。 步骤 创建密钥对 在EC2服务里面创建密钥对&#xff0c;具体如下图&#xff1a; 设置密钥对&#xff0c;如下图&#xff1a; 保存好这个私钥文件&#xff0c;以便后续用这个私钥文件ssh登录j…

如何处理Flutter应用在iOS平台上的兼容性问题

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我想和大家聊聊一个常见但令人头疼的问题——Flutter应用在iOS平台上的兼容性问题。在开发跨平台应用时&#xff0c;尤其是在Android和iOS两大平台上&#xff0c;兼容性问题总是难以避免。而Flutter&#xff0c;作为一个旨在解决…

力扣24. 两两交换链表中的节点

Problem: 24. 两两交换链表中的节点 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy和尾指针tial指向dummy&#xff1b;创建指针p指向head 2.当head不为空同时head -> next 不为空时&#xff1a; 2.1.创建指针nextP指向p -> next -> next; 2.2…

【Qt 学习笔记】认识QtSDK中的重要工具

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 认识QtSDK中的重要工具 文章编号&#xff1a;Qt 学习笔记 / 03 文章目…

ChatGPT全方位解析:如何培养 AI 智能对话技能?

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达的越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&#xff0c;如果想要C…

如何在Java中,使用jackson实现json缩进美化

导入的maven依赖 <!--json--> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version> </dependency>示例代码 json要是String类型 public…