FPGA-LCD基础驱动_fpga lcd cnt-程序员宅基地

技术标签: # FPGA学习篇  

      LCD的接口时序波形如图所示。VSYNC是场同步信号,低电平有效,从时序图可以看出,VSYNC是每一场(即也可以理解为每送一幅完整图像)的同步信号;与此类似,HSYNC是行同步信号,也是在每一行数据传输的开始产生几个时钟周期的低脉冲。这两个信号用于同步当前的数据信号,根据固定的脉冲约定,我们在某些时钟上升沿前将图像数据送到数据总线上供LCD内部锁存。

2.jpg

LCD驱动时序波形

这是LCD时序图中对应的时间参数。

表8.11 LCD驱动时序参数表

信号

列项

标记

最小值

标准值

最大值

单位

Dclk

频率

Tosc

 

156

 

ns

最大时间

Tch

 

78

 

ns

 

最小时间

Tcl

 

78

 

ns

 

Data

建立时间

Tsu

12

   

ns

保持时间

Thd

12

   

ns

 

Hsync

周期

TH

 

408

 

Tosc

脉冲宽度

THS

5

30

 

Tosc

 

后沿

THB

 

38

 

Tosc

 

显示周期

TEP

 

320

 

Tosc

 

同步周期

THE

36

68

88

Tosc

 

前沿

THF

 

20

 

Tosc

 

Vsync

周期

TV

 

262

 

TH

脉冲宽度

TVS

1

3

5

TH

 

后沿

TVB

 

15

 

TH

 

显示周期

TVD

 

240

 

TH

 

前沿

TVF

2

4

 

TH

 

 

相同的方式驱动的程序写法类似:

顶层文件:

module top(ext_clk_25m,ext_rst_n,lcd_light_en,lcd_clk,lcd_hsy,lcd_vsy,lcd_r,lcd_g,lcd_b
    );
	input ext_clk_25m;
	input ext_rst_n;
	output lcd_light_en;
	output lcd_clk;
	output lcd_hsy;
	output lcd_vsy;
	output [4:0] lcd_r;
	output [5:0] lcd_g;
	output [4:0] lcd_b;

	lcd_controller uut_lcd_controller(
	.clk(ext_clk_25m),
	.rst_n(ext_rst_n),
	.lcd_light_en(lcd_light_en),
	.lcd_clk(lcd_clk),
	.lcd_hsy(lcd_hsy),
	.lcd_vsy(lcd_vsy),
	.lcd_r(lcd_r),
	.lcd_g(lcd_g),
	.lcd_b(lcd_b)
    );
endmodule

lcd_controller.v

module lcd_controller(clk,rst_n,lcd_light_en,lcd_clk,lcd_hsy,lcd_vsy,lcd_r,lcd_g,lcd_b
    );
	input clk;
	input rst_n;
	output lcd_light_en;
	output lcd_clk;
	output reg lcd_hsy;
	output reg lcd_vsy;
	output [4:0] lcd_r;
	output [5:0] lcd_g;
	output [4:0] lcd_b;
	
	parameter HSY_TH=9'D408-1'D1;//周期
	parameter HSY_THS=9'D30     ;//脉冲宽度
	parameter HSY_THB=9'D38     ;//后沿
	parameter HSY_TEP=9'D320    ;//显示周期
	parameter HSY_THE=9'D68     ;//同步周期
	parameter HSY_THF=9'D20     ;//前沿
	parameter VSY_TV=9'D262-1'D1;//周期
	parameter VSY_TVS=9'D3      ;//脉冲宽度
	parameter VSY_TVB=9'D15     ;//后沿
	parameter VSY_TVD=9'D240    ;//显示周期
	parameter VSY_TVF=9'D4      ;//前沿
	//lcd背光常开
	assign lcd_light_en=1'b1;
	
	//配置驱动时钟6.25mHz
	reg [1:0] lcd_cnt;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			lcd_cnt<=1'b0;
		end
		else begin
			lcd_cnt<=lcd_cnt+1'b1;
		end
	end
	assign lcd_clk=lcd_cnt[1];
	wire dchange ={lcd_cnt==2'd2};
	//X和Y轴计数器
	reg[8:0] xcnt;
	reg[8:0] ycnt;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			xcnt<=1'b0;
		end
		else if(dchange==1'b1)begin
			if(xcnt==HSY_TH)begin
				xcnt<=1'b0;
			end
			else begin
				xcnt<=xcnt+1'b1;
			end
		end
		else;
	end
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			ycnt<=1'b0;
		end
		else if(dchange&&xcnt==HSY_TH)begin
			if(ycnt==VSY_TV)begin
				ycnt<=1'b0;
			end
			else begin
				ycnt<=ycnt+1'b1;
			end
		end
		else begin
			ycnt<=ycnt;
		end
	end
	
	//lcd显示的有效区域
	reg valid;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			valid<=1'b0;
		end
		else if(ycnt>=(VSY_TVS+VSY_TVB)&&ycnt<(VSY_TVS+VSY_TVB+VSY_TVD)&&
		xcnt>=(HSY_THS+HSY_THB)&&xcnt<(HSY_TEP+HSY_THB+HSY_THE))begin
			valid<=1'b1;
		end
		else begin
			valid<=1'b0;
		end
	end
	
	//LCD驱动行场同步信号产生逻辑
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			lcd_hsy<=1'b1;
		end
		else if(xcnt==1'b0)begin
			lcd_hsy<=1'b0;
		end
		else if(xcnt>=HSY_THS)begin
			lcd_hsy<=1'b1;
		end
		else begin
			lcd_hsy<=lcd_hsy;
		end
	end
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			lcd_vsy<=1'b1;
		end
		else if(ycnt==1'b0)begin
			lcd_vsy<=1'b0;
		end
		else if(ycnt>=VSY_TVS)begin
			lcd_vsy<=1'b1;
		end
		else begin
			lcd_vsy<=lcd_vsy;
		end
	end
	
	//产生显示条纹
	reg [3:0]tmp_cnt;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			tmp_cnt<=1'b0;
		end
		else if(valid==1'b0)begin
			tmp_cnt<=1'b0;
		end
		else if(valid&&dchange)begin
			if(tmp_cnt<4'd9)begin
				tmp_cnt<=tmp_cnt+1'b1;
			end
			else begin
				tmp_cnt<=1'b0;
			end
		end
	end
	reg [15:0]lcd_db_rgb;
	always@(posedge clk or negedge rst_n)begin
		if(rst_n==1'b0)begin
			lcd_db_rgb<=16'd0;
		end
		else if(valid)begin
			if((tmp_cnt==4'd9)&&dchange)begin
				lcd_db_rgb[15:11]<=lcd_db_rgb[15:11]+1'b1;
			end
			else;
		end
		else begin
			lcd_db_rgb<=1'b0;
		end
	end
	assign lcd_r =valid ? lcd_db_rgb[15:11]:5'd0;
	assign lcd_g =valid ? lcd_db_rgb[10:5]:6'd0;
	assign lcd_b =valid ? lcd_db_rgb[4:0]:5'd0;
	
endmodule

下板子效果图: 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41445387/article/details/86499860

智能推荐

Cybrics ctf_ecdsa ctf-程序员宅基地

文章浏览阅读517次。1.Signer阅读源码,同时nc一下我们会发现,该题是ECDSA签名。选项1是使用ECDSA对一个当前时间戳+salt进行签名,输出(R,S,HASH),。选项2是让我i们输入使用ECDSA对一个当前时间戳+get_flag进行签名的结果,输入正确获得flag。我们发现在签名过程中除了明文以外所用的参数都没有发生更改,所以我们可以使用k共享的方式对改签名进行攻击。其原理如下已知ECDSA的签名过程是,所以当我们有两组同参数的签名明文hash1,hash2和签名值(r,s1),(r,s2),那么,。_ecdsa ctf

mysql load character_mysql load data Invalid utf8mb4 character string: ”-程序员宅基地

文章浏览阅读3.2k次。使用mysql的 load data 导入数据到 数据库中:LOAD DATA LOCAL INFILE '/tmp/2982/20200424/user.csv'INTO TABLE t_user CHARACTER SET utf8mb4 FIELDS TERMINATED BY ','LINES TERMINATED BY '\r\n'IGNORE 1 LINES(userName, use..._invalid utf8mb4 character string:

Java中的Map解析:探索键值对的奇妙世界_map键值对-程序员宅基地

文章浏览阅读543次。本文将深入解析Java中的Map接口及其常见实现类,详细介绍基本概念、常用方法、不同实现类的特点以及适用场景,帮助读者全面了解和灵活应用Map在Java编程中的威力。通过了解Map的基本概念、常用方法和不同实现类的特点,读者可以更加全面地理解和应用Map在Java编程中的重要性。因为TreeMap是有序的,所以在需要按照键的顺序访问的场景下非常有用。在Java中,有多个常见的Map实现类,每个实现类都有自己的特点和适用场景。根据具体的需求和场景,可以选择合适的Map实现类和相应的操作方法。_map键值对

编程实现下列功能:假设以两个元素依值非递减有序排列的顺序表A和B 分别表示两个集合(同一表中的元素值各不相同),求一个新的集合C=A-B,且表C中的元素也是依值递增有序排列。_建立两个按数据元素值非递减有序排列的线性表a和b,均以顺序表作为存储结构-程序员宅基地

文章浏览阅读3.1k次。编程实现下列功能:假设以两个元素依值非递减有序排列的顺序表A和B 分别表示两个集合(同一表中的元素值各不相同),求一个新的集合C=A-B,且表C中的元素也是依值递增有序排列。# include <stdio.h># include <stdlib.h># define initsize 20//初始分配量# define LISTINCREMENT 5//分配增量..._建立两个按数据元素值非递减有序排列的线性表a和b,均以顺序表作为存储结构

java readutf()方法,java socket writeUTF()和readUTF()-程序员宅基地

文章浏览阅读207次。I've been reading some Java socket code snippet and fonund out a fact that in socket communication, to send messages in sequence, you don't have to seperate them by hand, the writer/reader stream do t..._java socket writeutf

ssh远程登录_ssh登录命令-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏7次。l 指定登录名称;基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs。服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc。3)客户端得到服务端的信息后,通过算法生成密钥,结合自己的公钥生成密钥对,然后将密钥对发送给服务端。5)最后,客户端拥有自己的公钥和私钥以及服务端的公钥,服务端拥有自己的公钥和私钥以及客户端的公钥。_ssh登录命令

随便推点

微信小程序|智慧物流小程序的设计与实现-程序员宅基地

文章浏览阅读1.8k次,点赞48次,收藏46次。语言环境:Java: jdk1.8数据库:Mysql: mysql5.7应用服务器:Tomcat: tomcat8.5.31开发工具:IDEA或eclipse技术:springboot+微信小程序+mysql+html+java互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。

浅谈Web安全-SQL注入_web安全测试 sql注入-程序员宅基地

文章浏览阅读7.4k次,点赞2次,收藏8次。简单的说,所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。例如:如果用户在用户名文本框中输入 ' or '1' = '1' or '1' = '1,则验证的SQL语句变成: select * from student where username='' or '1' = '1' or '1' = '1' and password='';_web安全测试 sql注入

国产化服务器内网安装onlyoffice_内网部署onlyoffice社区版-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏30次。国产化服务器安装onlyoffice_内网部署onlyoffice社区版

基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第三篇)故障保护及问题诊断_ekf故障安全-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏134次。基于Ardupilot/PX4固件,APM/PIXhawk硬件的VTOL垂直起降固定翼软硬件参数调试(第三篇)故障保护及问题诊断PIX无法安装驱动双击下载的px4_driver_installer_v10_win.exe驱动安装文件,Pixhawk驱动下载(点击即可下载):http://www.inf.ethz.ch/personal/lomeier/downloads/px4_driver..._ekf故障安全

python opencv 实现图片,视频 转 字符/字符画/字符视频_python opencv字模转换-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏19次。基于python 3.8图片转字符 升级版,顺便加了个 GUI地址:待定界面及使用图片转换时,界面会卡顿,表现为按钮按下去不会回弹,正常现象转换完成的图片视频在软件根目录视频转换请勿使用高分辨率,速度太慢,当然输入分辨率越高,转换后的分辨率也高参考 : i5-7200u 实测 500x300 mp4, 每秒只能处理 1.5 帧效果(这里只能上图,视频就不做展示,效果参考图片)- 原图-图片转 txt图片转 txt文本- 图片转指定字符-jpg彩色同一个字符,通过颜色的变换展_python opencv字模转换

零基础入门微信小程序开发-程序员宅基地

文章浏览阅读10w+次,点赞763次,收藏5.8k次。本课程是一个系列入门教程,目标是从 0 开始带领读者上手实战,课程以微信小程序的核心概念作为主线,介绍配置文件、页面样式文件、JavaScript 的基本知识并以指南针为例对基本知识进行扩展,另外加上开发工具的安装、小程序发布等内容,共 9 篇文章。_零基础学习微信小程序

推荐文章

热门文章

相关标签