1、整理利用按键开关控制液晶显示器进行十六进制数字显示说明书中北大学课 程 设 计 说 明 书学生姓名:张又木学 号:0906044112学 院:电子与计算机科学技术学院专 业:电子科学与技术题 目:利用按键开关控制液晶显示器进行十六进制数字显示指导教师: 焦新泉 职称: 讲师 2012 年 6 月 20 日1、课程设计目的22、课程设计内容和要求2 2.1、设计内容22.2、设计要求23、设计方案及实现情况23.1、设计思路23.2、工作原理及框图23.3、各模块功能描述43.4、仿真结果153.5、实验箱验证情况174、课程设计总结185、参考文献181、课程设计目的1.学习操作数字电路设计实
2、验开发系统,掌握液晶显示模块的工作原理及应用。2.掌握组合逻辑电路、时序逻辑电路的设计方法。3.学习掌握可编程器件设计的全过程2、课程设计内容和要求2.1、设计内容1学习掌握按键开关控制模块、液晶显示模块的工作原理及应用;2. 熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;3. 仿真所编写的程序,模拟验证所编写的模块功能;4. 下载程序到芯片中,硬件验证所设置的功能,能够实现十六进制数字的显示;5. 整理设计内容,编写设计说明书。2.2、设计要求1本课程设计说明书。2VHDL源程序及内部原理图。3该设计可以在实验箱上正常工作并演示。3、设计方案和实现情况3.1、设计思路对于这个题目
3、,首先对试验箱上的时钟频率进行降频,因为试验箱上的时钟频率很高,而液晶系统并不需要很高的时钟频率,并且低频时钟更加有利于消抖功能的实现,其次对所使用的按键进行消抖处理,然后将消抖处理后的按键信号直接送入按键计数模块进行计数,再将按键计数模块的计数结果送往译码显示模块,严格按照液晶OCMJ的显示时序将要显示的数据的行坐标,列坐标和数据对应的在BUSY信号不为高的情况下,通过数据线送出,然后在REQ信号线上送出一个高脉冲,将数据显示在液晶OCMJ上。3.2、工作原理及框图总体工作原理:在经过分频的时钟信号的驱动下,利用按键计数模块对进行了消抖处理后的按键信号进行计数,然后将计数数据送给译码液晶显示
4、模块,进而驱动液晶屏幕进行数据的显示。系统总体原理图如图1所示。图1 系统总体原理图液晶显示器工作原理: OCMJ中文模块系列液晶显示器内含 GB 2312 16*16点阵国标一级简体汉字和 ASCII8*8(半高)及8*16(全高)点阵英文字库,用户输入区位码或 ASCII 码即可实现文本显示。OCMJ中文模块系列液晶显示器可以实现汉字、ASCII 码、点阵图形和变化曲线的同屏显示,并可通过字节点阵图形方式造字。由于显示的是十六进制数字,故只须掌握接口协议和其中一条用户命令。接口协议为请求/应答(REQ/BUSY)握手方式。应答BUSY 高电平(BUSY =1) 表示 OCMJ 忙于内部处理
5、,不能接收用户命令;BUSY 低电平(BUSY =0)表示 OCMJ 空闲,等待接收用户命令。发送命令到 OCMJ可在BUSY =0 后的任意时刻开始,先把用户命令的当前字节放到数据线上,接着发高电平REQ 信号(REQ =1)通知OCMJ请求处理当前数据线上的命令或数据。OCMJ模块在收到外部的REQ高电平信号后立即读取数据线上的命令或数据,同时将应答线BUSY变为高电平,表明模块已收到数据并正在忙于对此数据的内部处理,此时,用户对模块的写操作已经完成,用户可以撤消数据线上的信号并可作模块显示以外的其他工作,也可不断地查询应答线BUSY是否为低(BUSY =0?),如果BUSY =0,表明模
6、块对用户的写操作已经执行完毕。可以再送下一个数据。液晶显示器显示8X8ASCII字符命令:格式:F1 XX YY AS该命令为4字节命令(最大执行时间为0.8毫秒,Ts2=0.8mS),其中XX:为以ASCII码 为单位的屏幕行坐标值,取值范围00到0F、04到13、00到13;YY:为以ASCII码为单 位的屏幕列坐标值,取值范围00到1F、00到3F、00到4F;AS:坐标位置上要显示的ASCII 字符码。OCMJ液晶控制时序图如图2所示:3.3、各模块功能描述说明书要求:图2 OCMJ液晶控制时序图3.3、各模块功能描述总原理图如图3所示:图3 总原理图模块一:分频模块图4 分频模块符号
7、利用VHDL语言生成的分频符号如图4所示,clk和rst分别是输入的时钟信号引脚和复位引脚,clkout是分频后的时钟输出引脚。本模块使用13位计数常量分频,可以将试验箱上1.25MHZ的时钟频率降到150HZ左右,这足以驱动液晶工作。代码如下:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity fenpin is port( clk,rst:in std_logic; clkout:out std_logic );end fe
8、npin;architecture fenpin_behave of fenpin is signal inclk : std_logic_vector(12 downto 0); signal inner : std_logic;begin process(clk,rst) begin if rst = 0 then inclk = 0000000000000; inner = 0; elsif clkevent and clk = 1 then -每来一个上升沿,inclk加一 if inclk = 1111111111111 then inner = not inner; -当inclk
9、加满的时候,inner取反 inclk = inclk + 1; else inclk = inclk + 1; end if; end if; end process; clkout = inner;end fenpin_behave;模块二:消抖模块图5 消抖模块符号利用VHDL语言生成的按键消抖模块符号如图5所示,clk和rst分别是时钟信号引脚和复位引脚,din是按键的输入信号,直接连接在试验箱的按键上,dout是经过消抖处理后的输出引脚。本模块采用状态机实现,共八个状态,当din信号为低的时候,状态机才会向下传递状态,否则重新回到状态0,也就是说当有按键按下的时候,需要低电平信号持续
10、八个时钟周期,才能算是一个信号输入。由于本系统的时钟频率是150HZ,经过计算,每次按键必须持续大约50ms才算有效,如果din信号持续为低电平,那么输出端每隔约50ms,输出一个低脉冲。代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity key_xd isport( clk,rst,din :in std_logic; dout :out std_logic);end entity;architecture rtl of key_xd is type xd_state is
11、(s0,s1,s2,s3,s4,s5,s6,s7); signal pre_s,next_s:xd_state;beginpcs0:process(rst,clk)begin if rst = 0 then pre_s = s0; elsif clkevent and clk = 1 then -每次时钟来临,把next_s给pre_s pre_s dout = 1; -dout置高,确保到不为低电平 if din = 1 then next_s = s0; -如果din=1,那么返回起始状态 else next_s -状态s1到s6同上 dout = 1; if din = 1 then n
12、ext_s = s0; else next_s dout = 1; if din = 1 then next_s = s0; else next_s dout = 1; if din = 1 then next_s = s0; else next_s dout = 1; if din = 1 then next_s = s0; else next_s dout = 1; if din = 1 then next_s = s0; else next_s dout = 1; if din = 1 then next_s = s0; else next_s dout = 0; if din = 1
13、then -若din=1,回到起始状态 next_s = s0; Else -若din=0,回到s1状态,进入循环 next_s = s1; end if; end case;end process pcs1;end rtl;模块三:计数模块图6 计数模块符号利用VHDL语言生成的计数模块符号如图6所示,key和rst分别是按键输入引脚和复位引脚,dout是计数结果输出引脚。本模块采用基本的计数原理,即每当key来一个上升沿,做为缓冲的内部四位二进制信号inclk自增一,最后将inclk给到dout。代码如下:library ieee; use ieee.std_logic_1164.all;
14、use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity cnt is port( key,rst :in std_logic; dout :out std_logic_vector(3 downto 0) );end cnt;architecture cnt_behave of cnt is signal inclk: std_logic_vector(3 downto 0);begin process(key,rst) begin if rst = 0 then inclk = 0000; elsif keyev
15、ent and key=0 then -每次来一个下降沿,inclk加一 inclk = inclk + 1; end if; end process; dout = inclk;end cnt_behave;模块四:译码及显示模块图7 译码及显示模块符号利用VHDL语言生成的译码及显示模块符号如图7所示,clk和rst分别是时钟输入引脚和复位引脚,busy是来自液晶的握手信号,din是需要显示的十六进制数据,req是向液晶发出的握手信号,dout是向液晶发出要显示的数据的信息的引脚。本模块采用状态机来实现,严格按照液晶的时序图经过判断busy信号不为高的情况下向液晶依次输出ASCII码命令字
16、,行坐标,列坐标以及经过译码得到的ASCII码,然后再从req输出一个高脉冲。从而驱动液晶屏幕工作。代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity disply is -实体说明 port( clk,busy,rst:in std_logic; din:in std_logic_vector(3 downto 0); req:out std_logic; dout:out std_logic_vector(7 dow
17、nto 0) );end disply;architecture disply_arch of disply is type ztstate is (st0,st1,st2,st3,st4,st5,st6,st7,st8,st9,st10,st11,st12,st13,st14); signal state: ztstate;Begin -结构体说明process(rst,clk) begin if rst=0 then -复位信号 req = 0; state = st0; dout dout = 11110100; -清屏命令字 req=0; state -req输出一个高脉冲 req=
18、1; state req= 0; state if busy = 0 then dout = 11110001; -写ASCII命令字 req=0; state=st4; else state req= 1; state req= 0; state -写列坐标 if busy=1 then state=st6; else dout = 00001111; req=0; state req=1; state req= 0; state -写行坐标 if busy=1 then state=st9; else dout = 00000001; req=0; state req=1; state r
19、eq= 0; state if busy=1 then state dout dout dout dout dout dout dout dout dout dout dout dout dout dout dout dout dout = 00000000; end case; req=0; state req=1; state req= 0; state state=st0; end case; end if; end process;end disply_arch;3.4、仿真结果1.分频器仿真如图8所示:(4)跟踪评价的结论。(2)防护支出法图8 分频器功能仿真波形图(1)报送审批综合
20、性规划草案和专项规划中的指导性规划草案时,将环境影响篇章或者说明一并报送。2.消抖模块仿真如图9所示:图9 消抖模块功能仿真波形图(1)规划环境影响评价的分析、预测和评估内容。说明:通过仿真可以看出,当按键时间适当的时候,dout端出现了一个低脉冲,而当按键时间过短的时候,此时din输入的低脉冲被当作毛刺,而持续按键的时候,dout会出现连续规律的低脉冲。这种消抖方式比较符合实际需要。3.4.(二)建设项目环境影响评价的工作等级计数模块仿真如图10所示:(二)环境保护法律法规体系一、环境影响评价的发展与管理体系、相关法律法规体系和技术导则的应用图10 计数模块功能仿真波形图5.6.(2)防护支
21、出法译码及显示模块仿真如图11所示:图11 译码及显示模块功能仿真波形图说明:通过仿真波形图可以看出,如果假设busy一直为低,那么当din输入0010即2的时候,输出端依次输出F1(ASCII码命令字)、0F(行坐标)、01(列坐标)、和32(2的ASCII码),同时在每次输出的时候还在req给出一个高脉冲。因此,此程序是可行的。7.8.根据工程、系统生命周期和评价的目的,安全评价分为三类:安全预评价、安全验收评价、安全现状评价。总体仿真如图12所示:(1)生产力变动法图12 总体仿真波形图3.5、实验箱验证情况试验箱验证情况如图13所示: 图13 试验箱验证图4、课程设计总结通过本次课程设
22、计,我熟练的掌握了使用QuartusII软件进行可编程逻辑器件的开发流程,我巩固了对VHDL语法和基本语句的掌握,并且真正学会了分析任务,发现问题,分析问题,解决问题的能力。此外,我还意识到和同学相互交流的重要性,只有通过不断的和别人的交流,才能逐渐的发现别人的某些想法的先进性,为己所用。然而,通过这次课程设计我也发现的不少问题,对于自身而言,在调试程序的过程中在遇到难以解决的问题时,总是缺乏耐心,容易急躁;对于基础的东西,总是不屑于去学,最后也总是在这方面栽跟头;另外一点要提出的是实验室里的试验箱大部分液晶不可用,而且缺少说明书,这导致大家在课设过程中遇到很大的问题。5、参考文献(1)侯伯亨,顾新.VHDL硬件描述语言与数字逻辑
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1