EDA课程设计-基于VHDL的键盘扫描及显示电路.doc

上传人:爱问知识人 文档编号:5014482 上传时间:2020-01-28 格式:DOC 页数:14 大小:157.50KB
返回 下载 相关 举报
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第1页
第1页 / 共14页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第2页
第2页 / 共14页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第3页
第3页 / 共14页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第4页
第4页 / 共14页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《EDA课程设计-基于VHDL的键盘扫描及显示电路.doc》由会员分享,可在线阅读,更多相关《EDA课程设计-基于VHDL的键盘扫描及显示电路.doc(14页珍藏版)》请在三一文库上搜索。

1、基于VHDL的键盘扫描及显示电路一、工作原理:可编程器件的KEY_HANG3.0行信号输出端不停循环输出“1110”“1101”“1011”“0111”。当没有键按下时可编程器件的KEY_LIE3.0列信号输入端检测到的是“1111”。当有按键按下时,如按下1,此时KEY_HANG3.0行信号输出为“0111”,即KEY_HANG3.0的3管脚为“0”,可由电路看出,此时输入端KEY_LIE3.0检测到的将是“0111”。KEY_LIE3.0的3管脚为0,可以在编写程序时,将输出信号KEY_HANG3.0与输入信号KEY_LIE3.0同时判断,比如可以认为当数据“KEY_HANG&KEY_LI

2、E”为“01110111”时,可译码成数据1,。同理可得其他按键的编码。根据不同数据的编码译成不同的数据。名称 IO属性 描述 备注 clk in 输入时钟,和频率 KEY_HANG3.0矩阵键盘的扫描输入端口 KEY_LIE3:0 矩阵键盘的扫描输出端口 START out 数据输出标志 DISP DATA6.0out 数码管译码显示译码输出 bit DASP SEL1.0数码管扫描输出 CLK_1KCLK_1K START KEY_HANG3.0CLE_40K DATA_P7.0 DISP DATA6.0KEY_LIE DASP SEL1.0 CLK_40K二、设计思路:1.循环输出行信号

3、,检测列信号输入,将行列信号相并。2.译键值。 去抖动。在译没一个键值后,为了防止抖动,加了一个计算环节,一旦检测到列信号后,译码,紧跟着进入计数环节,此时键抖动不会进入其他环节,这样可以防止抖动。 数码管译码、循环显示。电路的具体功能罗列如下: 1) 采用44矩阵键盘作为操作数和操作符的输入设备。 2) 采用2位8段数码管作为输出显示设备,显示按下的数字及简单的功能。 3) 由于所有键盘在按下或者弹起的时候均有按键抖动,所以应该采用去抖电路,当检测到有按键按下去的时候,应该延时20ms后,再进行检测,如果仍有键盘按键被按下去的话,则进行键盘读值。 矩阵键盘模块key_4_4的RTL电路图如下

4、 所示。 当CLK_1K上升沿到来时状态转为state0,然后判断列与非后的值,看是否有按键按下,如果有输入数据,则自动启动20ms的计数器,当计满数后,产生一个指示信号,此信号为1bit,高电平有效。当读到此指示信号后,便再次将row信号锁存至寄存器,便得到键盘的一个返回值。如果row没有变化,则state转换为state2,对第二行进行按键扫描。依此类推,扫描第三行与第四行。 因为普通的按键都是接触式的,当按键闭合或释放时,上下接触面都会产生一个很短暂的抖动,如图2.2所示,这个抖动时间一般都会持续5-10ms,虽然这个抖动时间很短,但对于FPGA工作在50M的高频率上的器件来说,还是可以

5、捕捉的到的。为了使CPU对于一次按键操作只处理一次,在软件中必须加入去除抖动处理。 图2.2 按键闭合时产生的抖动 由图中可以看出,最简单的去抖方法就是每隔一段时间读一次键盘,时间间隔大于10ms即可。如果连续两次检测都有按键被按下,则可以肯定有按键被按下,而且也进入闭合稳定期。 三、数码管显示译码模块设计 数码管显示译码电路主要用来对实际的二进制数据装换为8段数码管的实际显示控制码,采用两个2位的8段共阴极数码管,数码管的显示方式有两种:静态显示和动态显示。具体如下: 静态显示方式:所谓静态显示就是指无论是多少位数码管,同时处于显示状态。静态显示的优点是:数码管显示无闪烁,亮度高,软件控制比

6、较容易;缺点是:需要的硬件电路较多(每一个数码管都需要一个锁存器),将造成很大的不便,同时由于所有数码管都处于被点亮状态,所以需要的电流很大,当数码管的数量增多时,对电源的要求也就随之增高。所以,在大部分的硬件电路设计中,很少采用静态显示方式。 动态显示方式:所谓动态显示,是指无论在任何时刻只有一个数码管处于显示状态,每个数码管轮流显示。动态显示的优点是:硬件电路简单(数码管越多,这个优势越明显),由于每个时刻只有一个数码管被点亮,所以所有数码管消耗的电流较小;缺点是:数码管亮度不如静态显示时的亮度高,例如有8个数码管,以1秒为单位,每个数码管点亮的时间只有1/8秒,所以亮度较低;如果刷新率较

7、低,会出现闪烁现象;如果数码管直接与单片机连接,软件控制上会比较麻烦等。 显示译码方式如下: 1) 时钟上升沿到来时分别对位选和段选进行译码。 2) 将输入的2bite位选数据译码成4比特数据控制数码管的2位,由于是共阴极数码管要选定相应的数码管则使该位位低电平,其它位为高电平即可,如:0000译码为0111_1111,对应于实验板上的左边第一位数码管。 3) 将输入的4bite段选数据译码为8比特数据控制8个LED的亮灭,最高位接A,最低位接小数点位DP。若要显示0则对应的译码为 8b1111_1100。 四、仿真没有键按下时行循环输出“”“”“”“”当随机按下时行保持所按下的状态不变 五、

8、结论 这次EDA课程设计历时十天,学到很多很多的东西。同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,都会很高兴。在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误。排除困难后,程序编译就通过了。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示,后来,经过屡次的调试之后,才发现在写代码之前对信号的相位考虑不足。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的

9、理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 总的来说,这次设计还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤指导下,终于迎刃而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的老

10、师和所有同学再次表示忠心的感谢! 6、 程序LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY HH ISPORT( CLK_1K : IN STD_LOGIC; -时钟输入 CLK_40K : IN STD_LOGIC;-时钟输入K HZ KEY_LIE : IN STD_LOGIC_VECTOR(3 DOWNTO 0);- 列输入 START :OUT STD_LOGIC; -二-十进制数据输出标志 KEY_HANG :OUT

11、 STD_LOGIC_VECTOR(3 DOWNTO 0); -行输出 DATA_P : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-二-十进制数输出 DISP_DATA : OUT STD_LOGIC_VECTOR(6 DOWNTO 0);-数码管显示译码输出 DISP_SEL : OUT STD_LOGIC_VECTOR(1 downto 0);-数码管显示扫描输出 END ;ARCHITECTURE RTL OF HH ISSIGNAL INT : STD_LOGIC; -列与非 信号SIGNAL CLK_SEL : STD_LOGIC;-键值控制1khz的时钟信

12、号SIGNAL START_REG:STD_LOGIC; -数据输出标志信号SIGNAL DISP_SEL_REG:STD_LOGIC_VECTOR(1 DOWNTO 0);-数码管显示扫描信号SIGNAL DATA_L,DATA_H:STD_LOGIC_VECTOR(3 DOWNTO 0);-二-十进制 低位、高位信号SIGNAL DATA_TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);-二-十进制低位高位暂存信号SIGNAL KEY_HANG_TMP:STD_LOGIC_VECTOR(3 DOWNTO 0);-行输出信号SIGNAL DISP_DATA_REG:STD_

13、LOGIC_VECTOR(3 DOWNTO 0); -二-十进制低位、高位暂存信号(数码 管用)SIGNAL KEY_CODE:STD_LOGIC_VECTOR(7 DOWNTO 0);-行列 相并信号SIGNAL DATA_P_REG:STD_LOGIC_VECTOR(7 DOWNTO 0); -二-十进制数信号BEGINKEY_CODE=KEY_HANG_TMP&KEY_LIE;-行、列相并DATA_P=DATA_P_REG;START= START_REG;KEY_HANG=KEY_HANG_TMP;DISP_SEL=DISP_SEL_REG;CLK_SEL=CLK_1K AND ( N

14、OT INT);-无键按下时有CLK-SEL时钟信号输出PROCESS (CLK_SEL,CLK_40K , INT)VARIABLE STATE : INTEGER RANGE 0 TO 3 ;BEGINIF RISING_EDGE(CLK_40K) THEN -一个40K的脉冲上升沿到来输入一次列状态以判断是否有按键按下INT KEY_HANG_TMP KEY_HANG_TMP KEY_HANG_TMP KEY_HANG_TMPDATA_TMP -再嵌套一个CASE语句 CASE KEY_CODE IS-实现把像并数据译码 十六进制的1到F WHEN 01110111 = DATA_L =

15、0001;-把1放入低四位 DATA_H DATA_L =0010; DATA_H DATA_L =0011; DATA_H DATA_L =0100; DATA_H DATA_L =0101; DATA_H DATA_L =0110; DATA_H DATA_L =0111; DATA_H DATA_L =1000; DATA_H -9键 DATA_L =1001; DATA_H -0键 DATA_L =0000; DATA_H -A键,实现步进加 一功能 IF DATA_H =1001 THEN IF DATA_L=1001 THEN DATA_H=1001; DATA_L=1001; E

16、LSE DATA_L=DATA_L + 1; END IF; ELSIF DATA_L=1001 THEN DATA_L=0000; DATA_H=DATA_H+1; ELSE DATA_L=DATA_L+1; DATA_H-B键,实现步键加十 IF DATA_H=1001 THEN DATA_H=1001; ELSE DATA_L=DATA_L; DATA_H-C键,实现步 进减一 IF DATA_L=0000 AND DATA_H=0000 THEN DATA_L=0000; DATA_H=0000;ELSIF DATA_L=0000 THEN DATA_L=1001; DATA_H= D

17、ATA_H-1;ELSE DATA_L =DATA_L-1; DATA_H-D键,实现步进 减 十 IF DATA_H=0000 THEN DATA_H=0000; ELSE DATA_L=DATA_L; DATA_H-E键,实现 送数功能 DATA_L=DATA_L; DATA_H=DATA_H; DATA_P_REG=DATA_H&DATA_L; START_REG-F键,实现清零功能 DATA_L=0000; DATA_H-不可缺少 STATE:=2; END CASE;WHEN 2 =-状态2实现去抖动功能 IF COUNTER=31 THEN -计数延时去抖 COUNTER:=0;

18、STATE:=3;ELSE COUNTER:=COUNTER+1; STATE:=2; END IF;WHEN 3 =- 清除数据输出标志 START_REG DISP_SEL_REG=10;- 输入10到数码管显示扫描信号 DISP_DATA_REG DISP_SEL_REG=01; DISP_DATA_REG DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA DISP_DATA=0000000;END CASE;END IF;END PROCESS;END;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1