FPGA课程设计液晶显示.docx

上传人:b****9 文档编号:23383567 上传时间:2023-05-16 格式:DOCX 页数:19 大小:221.38KB
下载 相关 举报
FPGA课程设计液晶显示.docx_第1页
第1页 / 共19页
FPGA课程设计液晶显示.docx_第2页
第2页 / 共19页
FPGA课程设计液晶显示.docx_第3页
第3页 / 共19页
FPGA课程设计液晶显示.docx_第4页
第4页 / 共19页
FPGA课程设计液晶显示.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

FPGA课程设计液晶显示.docx

《FPGA课程设计液晶显示.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计液晶显示.docx(19页珍藏版)》请在冰豆网上搜索。

FPGA课程设计液晶显示.docx

FPGA课程设计液晶显示

摘要

如今,科技进步给我们的生活带来了很大的变化。

液晶显示设备越来越多,各种各样的液晶显示产品走进我们生活中。

从手机到电脑显示器,从掌上电脑到平板电视。

无处没有液晶显示技术的身影。

液晶显示器由于具有低压、微功耗、显示信息量大、体积小等特点,在移动通信终端、便携计算机、GPS卫星定位系统等领域有广泛用途,成为使用量最大的显示器件。

液晶显示控制器作为液晶驱动电路的核心部件通常由集成电路组成,通过为液晶显示系统提供时序信号和显示数据来实现液晶显示。

本设计是一种基于FPGA(现场可编程门阵列)的液晶显示控制器。

与集成电路控制器相比,FPGA更加灵活,可以针对小同的液晶显示模块更改时序信号和显示数据。

FPGA的集成度、复杂度和面积优势使得其日益成为一种颇具吸引力的高性价比ASIC替代方案。

本文选用MAX7000S系列的EPM7128SLC84-15器件,利用硬件描述语言VHDL设计了液晶显示拧制器,实现了替代专用集成电路驱动控制LCD的作用。

 

关键词:

EDA(电子设计自动化),VHDL(硬件描述语言),液晶控制器接口设计,LCD(液晶显示器)。

目录

第1章课程设计内容和要求1

1.1设计内容1

1.2设计要求1

1.3设计目的1

第2章液晶控制器设计方案2

2.1设计思路2

2.2工作原理及框图2

2.3各模块功能描述4

第3章液晶显示器接口底层电路设计6

3.1设计规划6

3.2设计说明6

3.3底层电路程序6

第4章液晶控制器接口的顶层文件设计11

4.1设计说明11

4.2顶层文件程序11

第5章液晶控制器接口设计的测试与运行13

5.1仿真结果13

5.2实验箱验证情况13

总结15

参考文献16

第1章课程设计内容和要求

1.1设计目的

设计并实现一个128×32的汉字图形液晶显示器的控制器,要求:

(1)能够显示几个液晶模块字库中的汉字和ASIC字符。

(2)能够显示一个简单的图形(选做)。

1.2设计内容

(1)学习掌握液晶显示模块的工作原理及应用。

(2)熟练掌握VHDL编程语言,编写液晶显示模块的控制逻辑。

1.3设计要求

(1)仿真所编写的程序,模拟验证所编写的模块功能。

(2)下载程序到芯片中,硬件验证所设置的功能,能够实现汉字的显示。

(3)整理设计内容,编写设计说明书。

 

第2章液晶控制器设计方案

2.1设计思路

根据指导教师布置的课题,通过参考书籍、查阅手册、图表和文献资料,网络等获取相关的知识后,了解到:

液晶显示模块硬件接口协议为请求/应答(REQ/BUSY)握手方式。

应答BUSY高电平(BUSY=1)表示OCMJ忙于内部处理,不能接收用户命令;BUSY低电平(BUSY=0)表示OCMJ空闲,等待接收用户命令。

发送命令到OCMJ可在BUSY=0后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ信号(REQ=1)通知OCMJ请求处理当前数据线上的命令或数据。

OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY=0?

),如果BUSY=0,表明模块对用户的写操作已经执行完毕。

可以再送下一个数据。

2.2工作原理及框图

2.2.1液晶LCD显示器的工作原理:

液晶显示器是一种采用了液晶控制透光技术来实现色彩的显示器。

从液晶显示器的结构来看,采用的LCD显示屏都是由不同部分组成的分层结构。

LCD由两块玻璃板构成,厚约1mm,其间由包含有液晶材料的5um均匀间隔隔开。

因为液晶材料本身并不发光,所以在显示屏两边都设有作为光源的灯管,而在液晶显示屏背面有一块背光板(或称匀光板)和反光膜,背光板是由荧光物质组成的可以发射光线,其作用主要是提供均匀的背景光源。

背光板发出的光线在穿过第一层偏振过滤层之后进入包含成千上万液晶液滴的液晶层。

液晶层中的液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。

在玻璃板与液晶材料之间是透明的电极,电极分为行和列,在行与列的交叉点上,通过改变电压而改变液晶的旋光状态,液晶材料的作用类似于一个个小的光阀。

液晶材料周边是控制电路部分。

当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层在屏幕上显示出来。

2.2.2设计原理图如下:

图2-1液晶控制器接口设计原理图

显示国标汉字:

命令格式:

F0XXYYQQWW。

该命令为5字节命令(最大执行时间为1.2毫秒,Ts2=1.2mS),其中:

XX:

为以汉字为单位的屏幕行坐标值,取值范围00到07、02到09、00到09;

YY:

为以汉字为单位的屏幕列坐标值,取值范围00到01、00到03、00到04;

QQWW:

坐标位置上要显示的GB2312汉字区位码。

2.2.3设计框图:

图2-2液晶控制器设计框图

2.3各模块功能描述

液晶显示模块共有四个单元电路组成,分别是:

时序发生器、地地址发生器、存储器、控制器。

引脚功能图和内部结构框图分别如图3-3和图3-4所示。

图2-3液晶控制器引脚功能图

图2-4液晶控制器内部结构框图

其中,时钟发生器共有三组时钟输出,分别送给:

地址发生器,使其产生存储器读地址;存储器,作为输出数据的同步时钟;控制器,作为控制器的工作时钟及输出信号同步时钟。

地址发生器在时钟信号与BUSY信号的共同作用下,产生存储器所需的地址信息。

当BUSY信号有效时(BUSY=‘1’),停止输出地址信号;当液晶模块处于空闲状态(BUSY=‘0’)时,输出地址信号。

控制器用来产生液晶模块所需的STOBE和存储器输出使能信号。

当BUSY信号有效时(BUSY=‘1’),关闭存储器的输出;当液晶模块处于空闲状态(BUSY=‘0’)时,分别送出STOBE=‘1’和存储器输出使能信号,等待BUSY变为‘1’。

当BUSY=‘1’时,使STOBE=‘0’,数据传送结束。

存储器主要用来存储液晶模块的命令,在同步时钟的作用下,数据同步输出。

该存储器可为ROM型,也可以为RAM型。

当为ROM型是,其显示模式及显示数据不可变,即只能显示固定的信息;为RAM型时,其显示模块及数据可根据需要任意配置,即可显示出更为灵活及复杂的信息,如实时的波形显示器等。

第3章液晶显示器接口底层电路设计

3.1设计规划

该液晶控制器可显示模块字库中的汉字和ASSIC字符,又具有清零功能。

因此。

此程序共有两大大模块,汉字显示模块,清零模块。

1.汉字显示模块是根据查表对照的方法显示出设计者想要表达的文字。

液晶屏上显示的汉字是16*16的像素。

2.ASIC字符显示相对汉字来说比较简单。

只需要16*8个像素。

3.清零功能是强制清除一切记录的功能。

3.2设计说明

液晶屏幕上是如何显示一些汉字或者是图画,这是我们应该思考的一个问题。

在数字电路中,所有数据都是由0、1保存的,同样LCD也是利用这种方法。

在点阵LCD上显示的只有两种颜色,因此可用0和1来表示这两种颜色,假设空格是16*16个0组成的,在现实16*16的字体时,将其中某些点置为1便可在视觉上形成汉字,这些二进制数成为代码。

与汉字不同的是一个字符只需要16*8的像素便可。

3.3底层电路程序

3.3.1清零模块

清零模块的功能:

实现将地址清零的功能。

当clr为‘0’时,将初始地址置为"00000000"。

当clr为‘1’时,出现上升沿时,如果addr1为"00111100",则将addr置为"00000001";不出现上升沿时,则将addr加1,以实现地址的循环。

如此实现清零模块的功能。

清零模块的代码(VHDL)如下:

LIBRARYieee;

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

USEieee.std_logic_arith.all;

USEwork.rom.all;

ENTITYlcd1is

PORT(clr,clk,BUSY:

INstd_logic;

STOBE:

OUTstd_logic;

dout:

OUTstd_logic_vector(7DOWNTO0));--实体端口的设计

ENDlcd1;

ARCHITECTUREdoitOFlcd1IS

signalcounter,addr1:

std_logic_vector(7downto0);--结构体的信号设计

signaladdr:

std_logic_vector(7DOWNTO0);

BEGIN

P1:

process(clr,busy)

begin

if(clr='0')then

addr1<="00000000";--给地址清零

elsif(busy'eventandbusy='1')then

if(addr1="00111100")then

addr1<="00000001";--如果出现busy出现上升沿实现地址的赋值

else

addr1<=addr1+1;--实现地址的循环

endif;

endif;

endprocessP1;

P2:

process(clr,busy)

begin

if(clr='0')then

addr<="00000000";--地址清零

elsif(busy'eventandbusy='0')then

addr<=addr1;--当busy出现下降沿时地址的赋值

endif;

endprocessP2;

由以上程序可发现:

如果clr为‘1’,初始地址被赋值为"000000001",如果busy为1,则准备下一条地址。

如果busy为0,则把地址数据传送给存储器,来进行数据的存储。

如果clr为‘0’时,地址置"00000000"清零,则实现了清零的功能。

3.3.2汉字显示模块

汉字显示模块的原理是:

将汉字内码gb2312码存入只读存储器rom中,用下面程序对汉字内码进行调用,则可以将所对应的汉字显示出来。

例如汉字“东”的汉字内码为2211,用显示模块二进制将2211表示出来,则可以将汉字“东”显示出来。

如此,则可以显示出所需要的汉字。

此液晶显示器每行显示六个字,一共两行。

另外,由于只读存储器的大小为256*8,所以,当所需要的汉字的内码设置完后,应当用"00000000"对rom进行填充,使其达到256*8的大小,以实现循环,避免产生乱码。

汉字显示模块的代码(VHDL)如下:

LIBRARYieee;

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

USEieee.std_logic_arith.all;

USEwork.rom.all;--调用存储器中的内容

ENTITYlcd1is

PORT(clr,clk,BUSY:

INstd_logic;

STOBE:

OUTstd_logic;

dout:

OUTstd_logic_vector(7DOWNTO0));--实体端口的设计

ENDlcd1;

ARCHITECTUREdoitOFlcd1IS--结构体信号的设计

signalcounter,addr1:

std_logic_vector(7downto0);

signaladdr:

std_logic_vector(7DOWNTO0);

BEGIN

P1:

process(clr,busy)

begin

if(clr='0')then--清零功能的实现

addr1<="00000000";

elsif(busy'eventandbusy='1')then--busy出现上升沿地址的赋值

if(addr1="00111100")then

addr1<="00000001";

else

addr1<=addr1+1;

endif;

endif;

endprocessP1;

P2:

process(clr,busy)

begin

if(clr='0')then

addr<="00000000";--清零功能的实现

elsif(busy'eventandbusy='0')then--busy出现下降沿地址的赋值

addr<=addr1;

endif;

endprocessP2;

P3:

process(busy,clk)

begin

if(busy='1')then

counter<="00000000";--清零

elsif(clk'eventandclk='1')then--clock出现上升沿时进行加法计数

counter<=counter+1;

endif;

endprocessP3;

dout<=rom(CONV_INTEGER(addr));

stobe<='1’whencounter>="00000011"else'0';

ENDdoit;

LIBRARYieee;

USEieee.std_logic_1164.ALL;

PACKAGEromIS

CONSTANTrom_width:

NATURAL:

=8;--natural表示大于零的整数

CONSTANTrom_length:

NATURAL:

=256;

SUBTYPErom_wordISSTD_LOGIC_VECTOR(rom_width-1DOWNTO0);

TYPErom_tableISARRAY(0Torom_length-1)ofrom_word;

CONSTANTrom:

rom_table:

=rom_table'(

"11110000","00000001","00000000","00010110","00001011",--2211“东”用来显示汉字的内码

"11110000","00000010","00000000","00010001","00010001",--1717“北”

"11110000","00000011","00000000","00101010","00001111",--4215“石”

"11110000","00000100","00000000","00110011","00101101",--5145“油”

"11110000","00000101","00000000","00010100","01010011",--2083“大”

"11110000","00000110","00000000","00110001","00000111",--4907“学”

……

--所需要显示的汉字内码输入完整后,为了避免出现乱码,必须用"00000000"将256*8的只读存储器rom将存储器填满,以实现地址的循环,且不出现乱码。

"00000000","00000000","00000000","00000000",

……--如此填充,为保证rom总共的大小为256*8

ENDrom;

为节省空间,大小为256*8的内码只显示主要内容,用"00000000"填充的其它部分,不再作一一显示,用省略号表示。

只需保证该只读存储器rom的真正大小为256*8即可。

另外,根据汉字gb2312码更改只读存储器rom中的内容可以相应地更改显示汉字的字数和内容;利用点阵列,则可以显示字符;用英文码,则可以显示英文……

其它显示命令格式如下(不做一一列举):

(1)显示8X8ASCII字符

命令格式:

F1XXYYAS

该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中

XX:

为以ASCII码为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13

YY:

为以ASCII码为单位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F

AS:

坐标位置上要显示的ASCII字符码

(2)显示位点阵

命令格式:

F2XXYY

该命令为3字节命令(最大执行时间为0.1毫秒,Ts2=0.1mS),其中

XX:

为以1*1点阵为单位的屏幕行坐标值,取值范围00到7F、20到9F、00到9F

YY:

为以1*1点阵为单位的屏幕列坐标值,取值范围00到40、00到40、00到40

第4章液晶控制器接口的顶层文件设计

4.1设计说明

所谓建立顶层文件就是将已经设计好的各个功能组件组合调用,连成一个整体,使整个系统按照设计要求在实际中工作起来。

而此程序中的顶层文件即是将清零模块和汉字内码显示模块结合起来,使其实现清零和显示汉字的两大功能。

具体操作:

将汉字显示的内码存入到大小为256*8的只读存储器rom中,然后再在清零模块的程序中对该只读存储器rom进行调用。

在一个工程中用两个.vhd文件分别存入顶层文件程序和只读存储器rom的程序即可。

如此,便将清零模块和汉字显示模块连成了一个整体。

在液晶显示器中便可实现清零和显示汉字的两个功能。

4.2顶层文件程序

代码如下:

LIBRARYieee;

USEieee.std_logic_1164.ALL;

USEieee.std_logic_unsigned.ALL;

USEieee.std_logic_arith.all;

USEwork.rom.all;

ENTITYlcd1is--实体端口的设计

PORT(clr,clk,BUSY:

INstd_logic;

STOBE:

OUTstd_logic;

dout:

OUTstd_logic_vector(7DOWNTO0));

ENDlcd1;

ARCHITECTUREdoitOFlcd1IS--结构体信号的设计

signalcounter,addr1:

std_logic_vector(7downto0);

signaladdr:

std_logic_vector(7DOWNTO0);

BEGIN

P1:

process(clr,busy)

begin

if(clr='0')then--清零功能的实现

addr1<="00000000";

elsif(busy'eventandbusy='1')then--busy出现上升沿地址的赋值

if(addr1="00111100")then

addr1<="00000001";

else

addr1<=addr1+1;

endif;

endif;

endprocessP1;

P2:

process(clr,busy)

begin

if(clr='0')then--强制清零功能的实现

addr<="00000000";

elsif(busy'eventandbusy='0')then--busy出现下降沿地址的赋值

addr<=addr1;

endif;

endprocessP2;

P3:

process(busy,clk)

begin

if(busy='1')then--清零功能的实现

counter<="00000000";

elsif(clk'eventandclk='1')then--clock出现上升沿时开始计数

counter<=counter+1;

endif;

endprocessP3;

dout<=rom(CONV_INTEGER(addr));

stobe<='1'whencounter>="00000011"else'0';

ENDdoit;

最后创建一个工程,在里面新建两个.vhd文件,一个用于存储顶层文件程序,一个用于输入只读存储器rom中的内容。

在顶层文件程序中调用只读存储器rom中的内容,便可实现液晶显示的清零功能和显示汉字的功能。

第5章液晶控制器接口设计的测试与运行

5.1液晶控制器设计仿真结果

下图5-1是将上述程序在QuartusⅡ中进行仿真后实现的波形图:

图5-1:

液晶控制器设计仿真结果

5.2实验箱验证情况

实验连线:

将CLK接时钟模块输出,使其频率为1.25MHZ~2.5MHZ,BUSY接液晶模块的BUSY输入端,REQ接液晶模块的REQ输出端,dout[7..0]分别接液晶模块的DB[7..0]输入端。

在MAX7000S系列的EPM7128SLC84-15实验箱中验证情况如下图5-2:

图5-2液晶控制器接口设计实验箱验证结果

结论

液晶显示器绿色环保,它的能源消耗相对于传统的CRT来说,简直是太小了(17''功率大概在200W以内);对于近来逐渐引起国人重视的噪音污染也与它无缘,因为它的自身的工作特点决定了它不会产生噪音。

随着仪器、仪表、电子设备等智能化程度的提高,液晶显示模块的使用也越来越广泛。

在于液晶的接口中,关键是满足液晶的时序要求;在软件的编程中,关键是要进行正确的初始化、操作以及显示内容的代码。

两个星期的课程设计主要经历了以下几个过程:

广泛查阅资料、文献综述、总体思路的确定、方案的具体化及论证、方案的确定、软件的调试、系统的调试,还包括论文总结。

我认为整个过程是一个联系非常紧密的过程,前一过程的结果为后一过程奠定了基础。

在整个过程中,我不仅对液晶控制系统的每一个细节有了比较深入的掌握,而且对关于系统扩展的相关知识有了感性的认识,不仅掌握了大量的专业知识,更学会了系统模块设计的基本思想。

最后要感谢老师和研究生学长对我们课程设计的指导与帮助!

参考文献

[1]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计[M].西安:

西安

科技大学出版社,2005.

[2]赵志海.液晶显示器及其应用[M].北京:

电子工业出版社.2007.

[3]李朝青.单片机原理及接口技术[M].北京:

北京航空航天大学出版社,2003.

[4]李勇.CPLD/FPGA应用开发技术与工程实践[M].北京:

人民邮电出版社,2004.

[5]李维缇,郭强.液晶显示器件应用技术[M].北京:

北京邮电学院出版社,2003.

[6]罗苑棠.CPLD/FPGA常用模块与综合系统设计[M].北京:

电子工业出版社,2007.

[7]姜雪松,张海风.可编程逻辑器件和EDA设计技术[M].北京:

机械工业出版社,2006.

[8]马建国,孟宪元.电子设计自动化技术基础[M].北京:

清华大学出版社,2008.

[9]永胜.液晶显示接口设计与仿真[M].机械工业出版社,2005.

[10]姜维.实用电子系统设计基础[M].北京:

电子工业出版社,2008.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1