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