LCD1602显示控制器设计.docx
- 文档编号:6470318
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:11
- 大小:42.89KB
LCD1602显示控制器设计.docx
《LCD1602显示控制器设计.docx》由会员分享,可在线阅读,更多相关《LCD1602显示控制器设计.docx(11页珍藏版)》请在冰豆网上搜索。
LCD1602显示控制器设计
EDA技术课程设计
题目LCD1602显示控制器设计
系(部)
班级
姓名
学号
指导教师
2014年06月30日至07月06日共1周
2014年07月02日
课程设计成绩评定表
出勤
情况
出勤天数
缺勤天数
成
绩
评
定
出勤情况及设计过程表现(20分)
课设答辩(20分)
设计成果(60分)
硬件调试
设计说明书
总成绩(100分)
提问
(答辩)
问题
情况
综
合
评
定
指导教师签名:
年月日
1引言
通过对LCD1602/LCD12864显示模块控制时序和指令集的对比分析,利用VerilogHDL描述语言完成了多功能LCD显示控制模块的IP核设计,所设计的LCD显示控制器具有很好的可移植性,只需通过端口的使能参数配置便可以驱动LCD1602/LCD12864模块实现字符或图形的实时显示,并且该多功能LCD控制器的可行性也在CycloneⅡ系列的EP2C5T144C8FPGA芯片上得到了很好的验证。
基于FPGA设计LCD显示控制器,关键在于采用硬件描述语言设计有限状态机(FSM)来控制LCD模块的跳转,文献中就是使用FSM实现了对LCD模块的显示控制,但是它们都是针对一种类型LCD模块的某种显示模式,不具有多模式的显示控制能力。
因此,多功能LCD显示控制器的有限状态机就需要设置更多的条件转换,来实现多种控制模式。
系统上电后,首先完成持续大约0.1s(根据时钟频率配置)的自动复位,然后才根据模块的端口参数选择不同显示模式所对应的初始化命令,在状态机中设置有初始化命令、起始行地址和屏显示数据3条转换路径来适应LCD屏的工作状态,同时也在关键转换路径上设置有可以配置的延时循环,这样既能方便LCD模块的工作调试,又能使LCD模块一直工作在写屏模式(RW=0)。
对于LCD屏的显示数据存储可以完全采用FPGA内嵌的ROM/RAM单元实现,如果使用双口RAM(存储器读写独立)就能实现LCD模块的动态实时显示。
2VHDL/QuartusII简介
VHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage,诞生于1982年。
1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
3系统设计
3.1整体功能
使用VHDL语言通过FPGA实现对LCD1602字符型液晶显示器的控制。
在LCD1602字符型液晶显示器上面显示个人信息,包括姓名和学号。
在LCD1602字符型液晶显示器上面显示动态字符,通过按键输入相应的数字和字符。
3.2各模块功能设计
3.2.1功能
1、分频模块应用时钟分频,满足其工作需求。
2、键盘模块输入字母和数字用来实现动态字符,进行动态显示。
3、消抖模块消除抖动,使显示平稳进行。
4、LCD模块实现静态显示,显示个人信息。
3.2.2模块引脚
1、分频模块引脚如图所示
2、键盘模块引脚如图所示
3、消抖模块引脚如图所示
4、LCD模块引脚如图所示
3.2.3程序
1、分频模块程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
entityfenpinis
Port(clk:
instd_logic;
lcd_clk:
outstd_logic);
endfenpin;
architecturebhvoffenpinis
begin
process(clk)--分频进程,CLK输入,CLK_Out输出,50MHz输入,125Hz输出,8ms
constantm:
integer:
=500000;
variablecout:
integerrange0to50000000:
=0;
begin
ifclk'eventandclk='0'thencout:
=cout+1;
ifcout elsifcout elsecout: =0; endif; endif; endprocess; endbhv; 2、键盘模块程序 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entityjianpanis port(clk: instd_logic; reset: instd_logic; col: instd_logic_vector(3downto0); row: outstd_logic_vector(3downto0); key_code: outstd_logic_vector(7downto0)); endjianpan; architecturebhvofjianpanis signalcnt: std_logic_vector(1downto0); signalkey: std_logic; begin key<=col(3)andcol (2)andcol (1)andcol(0); p2: process(clk) begin ifclk'eventandclk='1'then ifkey='1'then cnt<=cnt+1; endif; endif; endprocess; P3: process(col,cnt,reset) begin ifreset='0'then row<="1111"; elsifcnt<="00"then row<="1110"; casecolis when"1110"=>key_code<="11101110"; when"1101"=>key_code<="11011110"; when"1011"=>key_code<="10111110"; when"0111"=>key_code<="01111110"; whenothers=>key_code<="11111111"; endcase; elsifcnt<="01"then row<="1101"; casecolis when"1110"=>key_code<="11101101"; when"1101"=>key_code<="11011101"; when"1011"=>key_code<="10111101"; when"0111"=>key_code<="01111101"; whenothers=>key_code<="11111111"; endcase; elsifcnt<="10"then row<="1011"; casecolis when"1110"=>key_code<="11101011"; when"1101"=>key_code<="11011011"; when"1011"=>key_code<="10111011"; when"0111"=>key_code<="01111011"; whenothers=>key_code<="11111111"; endcase; elsifcnt<="11"then row<="0111"; casecolis when"1110"=>key_code<="11100111"; when"1101"=>key_code<="11010111"; when"1011"=>key_code<="10110111"; when"0111"=>key_code<="01110111"; whenothers=>key_code<="11111111"; endcase; endif; endprocess; endarchitecture; 3、消抖模块程序 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_arith.all; entityxiaodouis port(clk: instd_logic; reset: instd_logic; din: instd_logic_vector(7downto0); dout: outstd_logic_vector(7downto0)); endxiaodou; architecturebhvofxiaodouis begin process(clk,reset,din) variablecnt: integerrange0to2; variablestore: std_logic_vector(7downto0); variabled1,d2,d3: std_logic: ='1'; begin ifreset='0'then dout<="11111111"; elsifclk'eventandclk='1'then casecntis when0=>store: =din; cnt: =cnt+1; when1=> ifdin=storethen cnt: =cnt+1; else store: =din; cnt: =0; endif; when2=> ifdin=storethen dout<=store; d1: =store(7)andstore(6)andstore(5)andstore(4); d2: =store(3)andstore (2)andstore (1)andstore(0); d3: =d1ord2; ifd3='0'then endif; else store: =din; cnt: =0; endif; endcase; endif; endprocess; endbhv; 4、LCD模块程序 libraryieee; useieee.std_logic_1164.all; useieee.std_logic_unsigned.all; entitylcdis port(lcd_clk: instd_logic; dout: instd_logic_vector(7downto0); rs: outstd_logic;--寄存器选择信号 rw: outstd_logic;--液晶读写信号 en: outstd_logic;--液晶时钟信号 data: outstd_logic_vector(7downto0));--液晶数据信号 endlcd; architecturebhvoflcdis tapestatesis(set_function,set_cursor,set_display,clear_display,set_ddram1,write_data1); signalstate: states; begin process(lcd_clk,state)--状态机控制显示 begin iflcd_clk'eventandlcd_clk='1'then casestateis whenset_function=>data<="00111000";--/*设置8位格式,2行,5*7*/ rs<='0'; state<=set_display; whenset_display=>data<="00001100";--/*整体显示,关光标,不闪烁*/ rs<='0'; state<=clear_display; whenclear_display=>data<="00000001"; rs<='0'; state<=set_cursor; whenset_cursor=>data<="00000110";--/*显示移动格式,看最后两位,10表示光标右移 rs<='0'; state<=set_ddram1; whenset_ddram1=>data<="10000000"; rs<='0'; state<=write_data1; whenwrite_data1=>rs<='1';data<=dout; endcase; endif; endprocess; endbhv; 3.2.4仿真图 4系统调试及下载 程序编写完,仿真成功后,引脚设置对应好,在实验箱上连接好线,最后可以进行下载了,然后就可以在实验箱上观察实验结果了。 5设计总结 这次EDA课程设计历时一周,学到很多很多的东西,不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。 通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。 特别是当每一个子模块编写调试成功时,心里特别的开心。 但是在编写顶层文件的程序时,遇到了不少问题,可以说是错误百出,系统不停报错,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查和请教同学后,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。 其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学到东西,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 总的来说,这次设计的报时和时间调整还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。 本次课程设计是我们俩人一起努力完成的,通过合作,我们的合作意识得到加强。 合作能力得到提高。 上大学后,很多同学都没有过深入的交流,在设计的过程中,我们用了分工与合作的方式,每个人负责一定的部分,同时在一定的阶段共同讨论,以解决分工中个人不能解决的问题,在交流中大家积极发言,和提出意见,同时我们还向别的同学请教。 在此过程中,每个人都想自己的方案得到实现,积极向同学说明自己的想法。 能过比较选出最好的方案。 在这过程也提高了我们的表现能力。 在学习的过程中,不是每一个问题都能自己解决,向老师请教或向同学讨论是一个很好的方法,不是有句话叫做思而不学者殆。 做事要学思结合。 通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。 既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。 在设计过程中,总是遇到这样或那样的问题。 有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。 自然而然,我的耐心便在其中建立起来了。 为以后的工作积累了经验,增强了信心,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。 最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LCD1602 显示 控制器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)