1、LCD1602显示控制器设计DOC EDA技术 课 程 设 计 题 目 LCD1602显示控制器设计 系 (部) 班 级 姓 名 学 号 指导教师 2014 年06 月 30 日至 07 月 06 日 共 1 周2014年07月02日课程设计成绩评定表出勤情况出勤天数 缺勤天数成绩评定出勤情况及设计过程表现(20分)课设答辩(20分)设计成果(60分)硬件调试设计说明书总成绩(100分)提问(答辩)问题情况综合评定 指导教师签名: 年 月 日目 录目 录 31 引言 42 VHDL/ QuartusII简介 53 系统设计 63.1 整体功能 63.2 各模块功能设计 63.2.1 功能 63
2、.2.2 模块引脚 63.2.3 程序 73.2.4 仿真图 124 系统调试及下载 135 设计总结 141 引言通过对LCD1602LCD12864显示模块控制时序和指令集的对比分析,利用Verilog HDL描述语言完成了多功能LCD显示控制模块的IP核设计,所设计的LCD显示控制器具有很好的可移植性,只需通过端口的使能参数配置便可以驱动LCD1602LCD12864模块实现字符或图形的实时显示,并且该多功能LCD控制器的可行性也在Cyclone系列的EP2C5T144C8 FPGA芯片上得到了很好的验证。基于FPGA设计 LCD显示控制器 ,关键在于采用硬件描述语言设计有限状态机(FS
3、M)来控制LCD模块的跳转,文献中就是使用FSM实现了对LCD模块的显示控制,但是它们都是针对一种类型LCD模块的某种显示模式,不具有多模式的显示控制能力。因此,多功能LCD显示控制器的有限状态机就需要设置更多的条件转换,来实现多种控制模式。系统上电后,首先完成持续大约0.1 s(根据时钟频率配置)的自动复位,然后才根据模块的端口参数选择不同显示模式所对应的初始化命令,在状态机中设置有初始化命令、起始行地址和屏显示数据3条转换路径来适应LCD屏的工作状态,同时也在关键转换路径上设置有可以配置的延时循环,这样既能方便LCD模块的工作调试,又能使LCD模块一直工作在写屏模式(RW=0)。对于LCD
4、屏的显示数据存储可以完全采用FPGA内嵌的ROM/RAM单元实现,如果使用双口RAM(存储器读写独立)就能实现LCD模块的动态实时显示。2 VHDL/ QuartusII简介VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特
5、点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。Quartus II 是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的
6、完整PLD设计流程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Al
7、tera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。3 系统设计3.1 整体功能使用VHDL语言通过FPGA实现对LCD1602字符型液晶显示器的控制。在LCD1602字符型液晶显示器上面显示个人信息,包括姓名和学号。在LCD1602字符型液晶显示器上面显示动态字符,通过按键输入相应的数字和字符。3.2 各模块功能设计3.2.1 功能1、分频模块 应用时钟分频,满足其工作需求。2、键盘模块 输入字母和数字用来实现动态字符,进行动态显示。3、消抖模块 消除抖动,使显示平稳进行。4、LCD模块 实现静态显示,显示个人信息。3.2.2
8、 模块引脚1、分频模块引脚如图所示2、键盘模块引脚如图所示3、消抖模块引脚如图所示4、LCD模块引脚如图所示3.2.3 程序1、分频模块程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity fenpin is Port ( clk : in std_logic; lcd_clk:out std_logic);end fenpin;architecture bhv of fenpin isbeginprocess(clk)-分频进程,CLK输入,CLK_Out输出,50MHz输入,125Hz输出,8ms constant m:integer:=500
9、000; variable cout:integer range 0 to 50000000:=0; begin if clkevent and clk=0 then cout:=cout+1; if coutm/2 then lcd_clk=1; elsif coutm then lcd_clk=0; else cout:=0; end if;end if;end process;end bhv;2、键盘模块程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity jianpan isp
10、ort(clk:in std_logic; reset:in std_logic; col:in std_logic_vector(3 downto 0); row:out std_logic_vector(3 downto 0); key_code:out std_logic_vector(7 downto 0);end jianpan;architecture bhv of jianpan issignal cnt: std_logic_vector(1 downto 0);signal key: std_logic;beginkey = col(3) and col(2) and col
11、(1) and col(0);p2: process(clk) begin if clkevent and clk=1 then if key = 1 then cnt = cnt + 1; end if; end if; end process; P3: process(col, cnt,reset) begin if reset=0 then row=1111; elsif cnt = 00 then row key_code key_code key_code key_code key_code = 11111111; end case; elsif cnt = 01 then row
12、key_code key_code key_code key_code key_code = 11111111; end case; elsif cnt = 10 then row key_code key_code key_code key_code key_code = 11111111; end case; elsif cnt = 11 then row key_code key_code key_code key_code key_code = 11111111; end case; end if; end process;end architecture; 3、消抖模块程序libra
13、ry ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;entity xiaodou isport(clk:in std_logic; reset:in std_logic; din:in std_logic_vector(7 downto 0); dout:out std_logic_vector(7 downto 0);end xiaodou;architecture bhv of xiaodou isbeginprocess(clk,reset,din)variable cnt:integer range 0 to
14、 2;variable store:std_logic_vector(7 downto 0);variable d1,d2,d3:std_logic:=1;begin if reset=0then doutstore:=din; cnt:=cnt+1; when 1= if din=store then cnt:=cnt+1; else store:=din; cnt:=0; end if; when 2= if din=store then dout data=00111000;-/*设置8位格式,2行,5*7*/ rs=0; state data=00001100; -/*整体显示,关光标
15、,不闪烁*/ rs=0; state data=00000001; rs=0; state data=00000110; -/*显示移动格式,看最后两位,10表示光标右移 rs=0; state data=10000000; rs=0; state rs=1;data=dout; end case; end if; end process;end bhv;3.2.4 仿真图4 系统调试及下载程序编写完,仿真成功后,引脚设置对应好,在实验箱上连接好线,最后可以进行下载了,然后就可以在实验箱上观察实验结果了。5 设计总结这次EDA课程设计历时一周,学到很多很多的东西,不仅可以巩固以前所学过的知识,
16、而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,可以说是错误百出,系统不停报错,特别是各元件之间的连接,以及信号的定义,总是有错误,在细心的检查和请教同学后,终于找出了错误和警告,排除困难后,程序编译就通过了,心里终于舒了一口气。其次,在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上
17、也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学到东西,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。总的来说,这次设计的报时和时间调整还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学
18、的知识有了实用的价值,达到了理论与实际相结合的目的。本次课程设计是我们俩人一起努力完成的,通过合作,我们的合作意识得到加强。合作能力得到提高。上大学后,很多同学都没有过深入的交流,在设计的过程中,我们用了分工与合作的方式,每个人负责一定的部分,同时在一定的阶段共同讨论,以解决分工中个人不能解决的问题,在交流中大家积极发言,和提出意见,同时我们还向别的同学请教。在此过程中,每个人都想自己的方案得到实现,积极向同学说明自己的想法。能过比较选出最好的方案。在这过程也提高了我们的表现能力。在学习的过程中,不是每一个问题都能自己解决,向老师请教或向同学讨论是一个很好的方法,不是有句话叫做思而不学者殆。做事要学思结合。通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。在设计过程中,总是遇到这样或那样的问题。有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。自然而然,我的耐心便在其中建立起来了。为以后的工作积累了经验,增强了信心,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1