毕业设计课程设计基于fpga的液晶显示控制器设计.docx
- 文档编号:7315811
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:19
- 大小:275.96KB
毕业设计课程设计基于fpga的液晶显示控制器设计.docx
《毕业设计课程设计基于fpga的液晶显示控制器设计.docx》由会员分享,可在线阅读,更多相关《毕业设计课程设计基于fpga的液晶显示控制器设计.docx(19页珍藏版)》请在冰豆网上搜索。
毕业设计课程设计基于fpga的液晶显示控制器设计
电子信息工程专业专业综合课程设计
基于FPGA的液晶显示控制器设计
学院(系):
信息与通信工程
专业:
电子信息工程
目录
1设计指标及要求1
1.1任务及要求1
1.2设计原理1
2系统硬件电路设计2
2.1FPGA核心板2
2.2液晶显示部分3
2.3按键控制部分5
3系统软件设计5
4系统调试6
4.1硬件调试6
4.2软件调试7
5结论7
6参考文献7
附录一系统硬件电路图(原理图,PCB)8
附录二实物照片9
附录三系统完整程序代码9
1设计指标及要求
1.1任务及要求
采用FPGA技术实现液晶的显示功能,要求学生选好液晶芯片,画出电路板,做好硬件电路后调试程序,基本功能要求显示字符,扩展功能是显示动画。
1.2设计原理
显示控制模块是通过对FPGA芯片的编程,在此同时通过调用显示ROM文件中的字库,找到相应的二进制显示代码,再一条一条地送到显示驱动电路中,最后经过放大,送到点阵中的液晶去显示。
系统的整体框图如下图所示:
2系统硬件电路设计
2.1FPGA核心板
2.2液晶显示部分
12864各引脚的功能如下:
引脚号引脚名称引脚功能描述
1VSS电源地
2VDD电源电压
3V0LCD驱动负电压,调节LCD对比度
4RSH:
DB0-DB7为显示数据L:
DB0-DB7为指令数据
5R/WR/W=H,E=H数据被读到DB0-DB7
R/W=L,E=HDB0-DB7数据写到IR或DR
6E使能信号:
R/W=L,E信号下降沿锁存到DB0-DB7;
R/W=H,E=H,DDRAM数据读到DB0-DB7
7DB0~DB78位三态并行数据总线
8PSBPSB=H时为并行输入方式,PSB=L时为串行输入方式
9RST复位端,低电平有效
12864的信号功能表如下图所示:
12864的工作时序如下图所示:
2.3按键控制部分
按键连接电路如下图所示:
按键分别连接着FPGA芯片的I/O口,通过拨动按键使液晶显示不同的字符。
3系统软件设计
程序流程图如下图所示:
4系统调试
调试分为硬件调试和软件调试。
4.1硬件调试
1、上电之前,用万用表测试电源与地未短路。
2、上电接通电路,指示灯正常点亮。
3、但12864液晶屏背光灯点亮,却未出现正常阴影,将12864反插接入电路,液晶屏点亮,出现正常阴影,检查PCB及原理图发现12864引脚并未接错,于是参考已有12864的多种电路接法,更改板子上的12864电路,问题却仍得不到解决,最终发现是所用12864液晶屏自带电路已默认选择串行数据通信,而我们所采用的电路都是并行数据通信电路,将12864液晶屏自带电路改焊,液晶屏正常点亮。
原先设计12864电路所加的用于调节液晶屏对比度的滑动变阻器,实际使用时,发现并未起作用,故将其去掉。
4、向板子内烧录简单的显示程序,12864液晶屏正常显示出编写的内容。
至此,硬件调试完成。
4.2软件调试
1、先根据整体思路确定了软件采用状态机的方式编写。
然后查阅了12864液晶屏的使用手册以及EP4CE6E22芯片使用手册,确定了基本的操作要求,并根据要求进行了12864读数据写数据的程序编写,建成工程,完成编译,烧录进芯片,上电后,正确显示成功,完成了初步调试。
2、画出了程序框图,然后将各部细节补充出来。
3、正确的延时对于12864液晶屏的正确显示至关重要。
要想延时正确就得先解决时序的问题,我们通过借鉴以往的学习EDA时所做的实验,直接套用了一个典型分频程序,解决了该问题。
4、在程序里延时的正确使用是一大难点,因为VHDL语言仿真性极强,其独有的延时语句,多数只支持仿真状态,综合设计时并不能通过编译,无法实现,我们尝试了诸如for、loop、waituntil、waiton等语句都未能正常编译通过,最后采用if语句,计数延时才得以正确延时。
5、最终,我们经过多次删改,基本完成了预期要实现的设计目标。
5结论
本设计硬件电路的使用比较简单,所用元器件较少,电路中使用了FPGA芯片和LCD12864液晶显示器等主要芯片,实现了预计的功能。
在对芯片的管脚功能和用法有了充分的了解后,根据原先的选择好的设计要求设计硬件电路,包括FPGA控制电路、按键接口电路、显示电路。
然后通过软件编程,实现了用按键进行控制,用液晶模块进行显示,基本完成了预期要实现的目标。
6参考文献
[1]潘松,黄继业.EDA技术实用教程——VHDL版[M].第四版.北京:
科学出版社,2010.
[2]赵俊超等.集成电路设计VHDL教程[M].北京 :
北京希望电子出版社,2009.
[3]李维是,郭强.液晶显示应用技术[M].北京:
电子工业出版社,2011.
附录一系统硬件电路图(原理图,PCB)
附录二实物照片
附录三系统完整程序代码
-------------12864液晶的显示-----------
----时钟:
50MHZ
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylcd12864is
generic(
divide_500k:
integer:
=100;--100分频后:
500KHZ:
2us
cnt1_value:
integer:
=50
);
port(
clk,reset:
instd_logic;
key:
instd_logic_vector(1downto0);
rs,rw,en:
outstd_logic;
data:
outstd_logic_vector(7downto0)
);
endentity;
architecturebehavioroflcd12864is
typewordisarray(0to15)ofstd_logic_vector(7downto0);
--数组中的左起第1个数为数组中的最低位对应的数,所以设置为array(0to3),而不是array(3downto0)。
typestateis(
set_dlnf,set_cursor,set_dcb,set_shift,
set_ddram1,set_ddram2,set_ddram3,set_ddram4,
write_xuexiao,write_zhuanye,write_mc,write_fh,
over
);
constantname1:
word:
=("10100001","11101111","10110100","11110011","11000001","10101100","11000011","11110001","11010111","11100101","11010001","10100111","11010100","10111010","10100001","11101111");--大连民族大学
constantname2:
word:
=("10100001","11101111","10110101","11100111","11010111","11010011","11010000","11000101","11001111","10100010","10111001","10100100","10110011","11001100","10100001","11101111");--电子信息工程
constantname3:
word:
=("11001101","11110101","10111010","10110001","10100001","11101111","10100001","11101111","10100001","11101111","11001101","11110100","11010101","11010111","10111001","11111010");--李瑞
constantname4:
word:
=("11010111","10100011","11000000","11001111","11001010","10100110","10111101","11011010","11001000","11010101","10111111","11101100","11000000","11010110","10100011","10100001");--祝老师节日快乐
constantname5:
word:
=("11010111","10100011","11000000","11001111","11001010","10100110","11001001","11101101","11001100","11100101","10111101","10100001","10111111","10110101","10100011","10100001");--祝老师身体健康
constantname6:
word:
=("11010111","10100011","11000000","11001111","11001010","10100110","11001101","11110010","11001010","11000010","11001000","11100111","11010010","11100010","10100011","10100001");--祝老师万事如意
constantname7:
word:
=("11010111","10100011","11000000","11001111","11001010","10100110","10111010","11001111","10111100","11010010","11010000","11010010","10111000","10100011","10100011","10100001");--祝老师阖家幸福
signalpr_state:
state;
signalnewclk:
std_logic;
begin
process(clk)is
variablenum:
integerrange0todivide_500k;
begin
if(clk'eventandclk='1')then
num:
=num+1;
if(num=divide_500k)then
num:
=0;
endif;
if(num newclk<='0'; elsenewclk<='1'; endif; endif; endprocess; process(newclk,reset,pr_state,key)is variablecnt1: integerrange0to100*cnt1_value: =0; variablecnt2: integerrange0to100: =0; begin ifreset='0'then pr_state<=set_dlnf;--把状态set_dlnf赋于pr_state cnt1: =0; cnt2: =0; en<='0'; rs<='0'; rw<='0'; data<="00000001";--清屏 en<='1'; elsif(newclk'eventandnewclk='1')then casepr_stateis whenset_dlnf=> cnt1: =cnt1+1; if(cnt1 en<='0'; rs<='0';--命令 rw<='0';--写 elsif(cnt1<2*cnt1_value)then data<="00110000";--选择8位数据基本指令集: 0x30 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=set_cursor; endif; whenset_cursor=> cnt1: =cnt1+1; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="00001100";--整体显示设置: 光标OFF反光0FF: 0x0c elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=set_dcb; endif; whenset_dcb=> cnt1: =cnt1+1; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="00000001";--清除显示,并且认定地址指针为00h: 0x01 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=set_shift; endif; whenset_shift=> cnt1: =cnt1+1; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="00000110";--指定游标的移动方向及指定显示的移位: 0x06 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=set_ddram1; endif; whenset_ddram1=> cnt1: =cnt1+1; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="10000000";--从第一行的第一个字开始显示: 0x80 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=write_xuexiao; endif; whenwrite_xuexiao=> cnt1: =cnt1+1; ifcnt1<1*cnt1_valuethen en<='0'; rs<='1';------------选择数据 rw<='0'; elsifcnt1<2*cnt1_valuethen ifkey="00"thendata<=name1(cnt2);------------送数据 elsifkey="01"thendata<=name1(cnt2); elsifkey="10"thendata<=name3(cnt2); elsifkey="11"thendata<=name4(cnt2); endif; elsifcnt1<20*cnt1_valuethen en<='1';-----在上升沿时,数据才能写入液晶,所以要先送数据,再让使能端变高 elsifcnt1=20*cnt1_valuethen en<='0';-----通过液晶的时序图知: 使能端先低,送数据,使能端升高,再变低。 cnt1: =0; cnt2: =cnt2+1; if cnt2=16 then pr_state<=set_ddram2; cnt1: =0; cnt2: =0; endif; endif; whenset_ddram2=> cnt1: =cnt1+1; en<='0'; rw<='0'; rs<='0'; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="10010000";--从第二行的第一个字开始显示: 0x80 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=write_zhuanye; endif; whenwrite_zhuanye=> cnt1: =cnt1+1; ifcnt1<1*cnt1_valuethen en<='0'; rs<='1';------------选择数据 rw<='0'; elsifcnt1<2*cnt1_valuethen ifkey="00"thendata<=name2(cnt2);------------送数据 elsifkey="01"thendata<=name1(cnt2); elsifkey="10"thendata<=name3(cnt2); elsifkey="11"thendata<=name5(cnt2); endif; elsifcnt1<20*cnt1_valuethen en<='1';-----在上升沿时,数据才能写入液晶,所以要先送数据,再让使能端变高 elsifcnt1=20*cnt1_valuethen en<='0';-----通过液晶的时序图知: 使能端先低,送数据,使能端升高,再变低。 cnt1: =0; cnt2: =cnt2+1; if cnt2=16 then pr_state<=set_ddram3; cnt1: =0; cnt2: =0; endif; endif; whenset_ddram3=> cnt1: =cnt1+1; en<='0'; rw<='0'; rs<='0'; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="10001000";--从第三行的第一个字开始显示: 0x80 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=write_mc; endif; whenwrite_mc=> cnt1: =cnt1+1; ifcnt1<1*cnt1_valuethen en<='0'; rs<='1';------------选择数据 rw<='0'; elsifcnt1<2*cnt1_valuethen ifkey="00"thendata<=name3(cnt2);------------送数据 elsifkey="01"thendata<=name1(cnt2); elsifkey="10"thendata<=name3(cnt2); elsifkey="11"thendata<=name6(cnt2); endif; elsifcnt1<20*cnt1_valuethen en<='1';-----在上升沿时,数据才能写入液晶,所以要先送数据,再让使能端变高 elsifcnt1=20*cnt1_valuethen en<='0';-----通过液晶的时序图知: 使能端先低,送数据,使能端升高,再变低。 cnt1: =0; cnt2: =cnt2+1; if cnt2=16 then pr_state<=set_ddram4; cnt1: =0; cnt2: =0; endif; endif; whenset_ddram4=> cnt1: =cnt1+1; en<='0'; rw<='0'; rs<='0'; if(cnt1 en<='0'; elsif(cnt1<2*cnt1_value)then data<="10011000";--从第四行的第一个字开始显示: 0x80 elsif(cnt1<20*cnt1_value)then en<='1'; elsif(cnt1=20*cnt1_value)then en<='0'; cnt1: =0; pr_state<=write_fh; endif; whenwrite_fh=> cnt1: =cnt1+1; ifcnt1<1*cnt1_valuethen en<='0'; rs<='1';------------选择数据 rw<='0'; elsifcnt1<2*cnt1_valuethen ifkey="00"thendata<=name4(cnt2);------------送数据 elsifkey="01"thendata<=name1(cnt2); elsifkey="10"thendata<=name3(cnt2); elsifkey="11"thendata<=name7(cnt2); endif; elsifcnt1<20*cnt1_valuethen en<='1';-----在上升沿时,数据才能写入液晶,所以要先送数据,再让使能端变高 elsifcnt1=20*cnt1_valuethen en<='0';-----通过液晶的时序图知: 使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计课程设计 基于fpga的液晶显示控制器设计 毕业设计 课程设计 基于 fpga 液晶显示 控制器 设计