VGA显示器驱动设计与验证

news2025/1/17 1:47:53

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;
	else
		flag_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;
	else
		Cnt_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;
	else
		Cnt_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 
	begin
		sys_clk=1'b1;
		sys_rst_n<=1'b0;
		#20
		sys_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;
	else
		Pix_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.coloradmin.cn/o/1572378.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer位置编码详解

在处理自然语言时候&#xff0c;因Transformer是基于注意力机制&#xff0c;不像RNN有词位置顺序信息&#xff0c;故需要加入词的位置信息来显示的表明词的上下文关系。具体是将词经过位置编码(positional encoding)&#xff0c;然后与emb词向量求和&#xff0c;作为编码块(Enc…

程序·人生

诡异之极 2024.03.12 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.58&#xff0c;当日最高价4.57 2024.03.11 清新环境&#xff08;股票代码002573&#xff09;委托卖出 20000股&#xff0c;委托价4.55&#xff0c;当日最高价4.54 …

谷歌(Google)历年编程真题——数组和字符串(螺旋矩阵)

Google 希望了解你的编码技能和专业技术知识&#xff0c;包括工具、编程语言&#xff0c;以及关于数据结构和算法等主题的一般知识。讨论过程中通常会反复提到相关的话题&#xff0c;就像在工作中的讨论那样&#xff0c;从而推动彼此思考并学习不同的方法。无论你的工作经验如何…

Whisper报错:ffmpeg返回异常值1

本地使用cmd命令显示ffmpeg可以用&#xff0c;但是使用python代码调用whisper包就报错。 查看了whisper源码&#xff0c;发现其也是调用的cmd来使用ffmpeg&#xff0c;于是修改其audio.py中的audio方法中ffmpeg的具体位置完美运行。

基于单片机电阻炉模糊算法控制性系统设计

**单片机设计介绍&#xff0c;基于单片机电阻炉模糊算法控制性系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电阻炉模糊算法控制性系统的设计概要主要包括硬件设计、软件设计以及模糊控制算法的应用。以下是…

【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

文章目录 一、Spring新注解1.1、Configuration注解1.1.1、定义一个类1.1.2、使用Configuration注解修饰类1.1.3、作用 1.2、Bean注解1.2.1、定义bean1.2.2、在主配置类中注册bean1.2.3、测试容器中是否有该bean1.2.4、注册bean的同时可以指定bean名称1.2.5、补充内容1.2.5.1、案…

计算机接口(部分实验)

;实验三&#xff1a; ;*******************************; ;* 8255方式0的C口输入,A口输出 *; ;*******************************; io8255a equ 288h io8255c equ 28ah io8255 equ 28bhcode segmentassume cs:code start: mov dx, 28bH ;设8255为…

Vue3 项目实例(二)vite.config.ts的配置与axios安装

一、vite.config.ts的配置 1、对相对路径的处理&#xff08;&#xff09; import { defineConfig } from vite import vue from vitejs/plugin-vue // vite 提供node核心对象path import path from path // https://vitejs.dev/config/ export default defineConfig({plugins…

FPGA高端项目:解码索尼IMX327 MIPI相机+2路视频融合叠加,提供开发板+工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理HLS多路视频融合叠加图像缓存HDMI输出工程…

数字化赋能乡村:开启乡村发展新纪元

随着信息技术的迅猛发展和数字化浪潮的席卷&#xff0c;乡村发展正迎来前所未有的机遇与挑战。数字化赋能乡村&#xff0c;不仅是推动农业现代化、提升农村治理水平的必由之路&#xff0c;更是开启乡村发展新纪元的关键所在。本文将围绕数字化赋能乡村这一主题&#xff0c;探讨…

【React】React知识要点记录

描述UI 万物皆组件 为什么多个 JSX 标签需要被一个父元素包裹&#xff1f; 切勿将数字放在 && 左侧 React 中为什么需要 key&#xff1f; React 为何侧重于纯函数? 渲染树 模块依赖树 添加交互 React如何传递事件处理函数&#xff1f; React 如何知道返回哪个 sta…

带你了解自动驾驶中的功能安全

谈一谈自动驾驶中的功能安全 附赠自动驾驶学习资料和量产经验&#xff1a;链接 一 概述 汽车涉及到人的生命财产安全&#xff0c;谈汽车首先要谈的就是安全。目前自动驾驶的安全主要分为三大块&#xff1a;功能安全&#xff0c;网络&#xff08;信息&#xff09;安全&#xf…

阿里云8核32G云服务器租用优惠价格表,包括腾讯云和京东云

8核32G云服务器租用优惠价格表&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价&#xff0c;腾讯云和京东云是轻量应用服务器&#xff0c;阿里云是云服务器ECS&#xff1a; 阿里云8核32G服务器 阿里云8核32G服务器价格…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别&#xff1a;各目标检测算法评测 论文题目&#xff1a;Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码&#xff1a;https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验&#xff1a;…

【好书推荐-第十四期】《 互联网大厂晋升指南:从P5到P9的升级攻略》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

【Linux】Ubuntu 压缩与解压缩

首先在Windows下安装7Zip压缩软件&#xff0c;以便于可以生成 .tar 和 .bz2 的压缩格式的文件。例如新建一个test文件夹&#xff0c;操作后如下。 gzip 压缩工具&#xff1a;负责 .gz 格式的文件的压缩和解压缩&#xff0c;gzip --help 查看使用帮助&#xff1b; 压缩文件&…

【Android】图解View的工作流程原理

文章目录 入口DecorView如何加载到Window中MeasureSpec MeasureView的测量ViewGroup的测量 LayoutView的layout() Draw1、绘制背景3、绘制View内容4、绘制子View6、绘制装饰 入口 DecorView如何加载到Window中 MeasureSpec 该类是View的内部类&#xff0c;封装View的规格尺寸…

下一个电商风口会是什么呢?揭秘电商新蓝海,我来告诉你答案!

大家好&#xff0c;我是电商花花。 直播电商还能持续多久呢&#xff1f; 这个电商项目你肯定没听过&#xff0c;叫视频号小店&#xff0c;只有电商老炮才知道&#xff0c;这是2024年乃至今后3年的风口。 我做电商这么多年&#xff0c;在视频号小店刚出台就开始研究视频号&am…

IDEA删除块注释(文档注释)/**

1. 问题缘由 在使用java写LeetCode的时候&#xff0c;有些题会有一些封装好的类&#xff0c;在本地编写代码的时候&#xff0c;如果没有定义好这些类&#xff0c;就会爆红&#xff0c;看着很难受&#xff0c;此时可以把官方定义好的类拿过来&#xff0c;但是这些类是有块注释的…

电商-广告投放效果分析(KMeans聚类、数据分析-pyhton数据分析

电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09; 文章目录 电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09;项目介绍数据数据维度概况数据13个维度介绍 导入库&#xff0c;加载数据数据审查相关性分析数据处理建立模型聚类结果特征分析…