当前位置:文档之家› LCD1602显示控制器设计

LCD1602显示控制器设计

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.................................................................................................................................... . 设计总结51 引言通过对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 isPort ( clk : in std_logic;lcd_clk:out std_logic);end fenpin;architecture bhv of fenpin isbeginprocess(clk)--分频进程,CLK输入,CLK_Out输出,50MHz输入,125Hz输出,8msconstant m:integer:=500000;variable cout:integer range 0 to 50000000:=0;beginif 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 isport(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(1) and col(0);p2: process(clk)beginif clk'event and clk='1' thenif key = '1' thencnt <= cnt + 1;end if;end process;P3: process(col, cnt,reset)beginif reset='0' thenrow<=I1;elsif cnt <=row <= I0;case col iswhen 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 <= thenrow <= H1;case col iswhen 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 <= thenrow <= A1;case col iswhen 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 <= thenrow <= 1;case col iswhen 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 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 2;variable store:std_logic_vector(7 downto 0);variable d1,d2,d3:std_logic:='1';beginif reset='0'thendout<=I11111;elsif clk'event and clk='1'thencase cnt iswhen 0=>store:=din;cnt:=cnt+1;when 1=>if din=store thencnt:=cnt+1;elsestore:=din;cnt:=0;end if;when 2=>if din=store thendout<=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' thenend if;elsestore:=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 isport( 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 istape statesis(set_function,set_cursor,set_display,clear_display,set_ddram1,write_d ata1);signal state:states;beginprocess(lcd_clk,state) --状态机控制显示beginif lcd_clk'event and lcd_clk='1' thencase 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 系统调试及下载程序编写完,仿真成功后,引脚设置对应好,在实验箱上连接好线,最后可以进行下载了,然后就可以在实验箱上观察实验结果了。

相关主题