EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第1页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第2页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第3页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第4页
EDA课程设计-基于VHDL的键盘扫描及显示电路.doc_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于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_lie”为“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.循环输出行信号,检测列信号输入,将行列信号相并。2.译键值。 去抖动。在译没一个键值后,为了防止抖动,加了一个计算环节,一旦检测到列信号后,译码,紧跟着进入计数环节,此时键抖动不会进入其他环节,这样可以防止抖动。 数码管译码、循环显示。电路的具体功能罗列如下: 1) 采用44矩阵键盘作为操作数和操作符的输入设备。 2) 采用2位8段数码管作为输出显示设备,显示按下的数字及简单的功能。 3) 由于所有键盘在按下或者弹起的时候均有按键抖动,所以应该采用去抖电路,当检测到有按键按下去的时候,应该延时20ms后,再进行检测,如果仍有键盘按键被按下去的话,则进行键盘读值。 矩阵键盘模块key_4_4的rtl电路图如下 所示。 当clk_1k上升沿到来时状态转为state0,然后判断列与非后的值,看是否有按键按下,如果有输入数据,则自动启动20ms的计数器,当计满数后,产生一个指示信号,此信号为1bit,高电平有效。当读到此指示信号后,便再次将row信号锁存至寄存器,便得到键盘的一个返回值。如果row没有变化,则state转换为state2,对第二行进行按键扫描。依此类推,扫描第三行与第四行。 因为普通的按键都是接触式的,当按键闭合或释放时,上下接触面都会产生一个很短暂的抖动,如图2.2所示,这个抖动时间一般都会持续5-10ms,虽然这个抖动时间很短,但对于fpga工作在50m的高频率上的器件来说,还是可以捕捉的到的。为了使cpu对于一次按键操作只处理一次,在软件中必须加入去除抖动处理。 图2.2 按键闭合时产生的抖动 由图中可以看出,最简单的去抖方法就是每隔一段时间读一次键盘,时间间隔大于10ms即可。如果连续两次检测都有按键被按下,则可以肯定有按键被按下,而且也进入闭合稳定期。 三、数码管显示译码模块设计 数码管显示译码电路主要用来对实际的二进制数据装换为8段数码管的实际显示控制码,采用两个2位的8段共阴极数码管,数码管的显示方式有两种:静态显示和动态显示。具体如下: 静态显示方式:所谓静态显示就是指无论是多少位数码管,同时处于显示状态。静态显示的优点是:数码管显示无闪烁,亮度高,软件控制比较容易;缺点是:需要的硬件电路较多(每一个数码管都需要一个锁存器),将造成很大的不便,同时由于所有数码管都处于被点亮状态,所以需要的电流很大,当数码管的数量增多时,对电源的要求也就随之增高。所以,在大部分的硬件电路设计中,很少采用静态显示方式。 动态显示方式:所谓动态显示,是指无论在任何时刻只有一个数码管处于显示状态,每个数码管轮流显示。动态显示的优点是:硬件电路简单(数码管越多,这个优势越明显),由于每个时刻只有一个数码管被点亮,所以所有数码管消耗的电流较小;缺点是:数码管亮度不如静态显示时的亮度高,例如有8个数码管,以1秒为单位,每个数码管点亮的时间只有1/8秒,所以亮度较低;如果刷新率较低,会出现闪烁现象;如果数码管直接与单片机连接,软件控制上会比较麻烦等。 显示译码方式如下: 1) 时钟上升沿到来时分别对位选和段选进行译码。 2) 将输入的2bite位选数据译码成4比特数据控制数码管的2位,由于是共阴极数码管要选定相应的数码管则使该位位低电平,其它位为高电平即可,如:0000译码为0111_1111,对应于实验板上的左边第一位数码管。 3) 将输入的4bite段选数据译码为8比特数据控制8个led的亮灭,最高位接a,最低位接小数点位dp。若要显示0则对应的译码为 8b1111_1100。 四、仿真没有键按下时行循环输出“”“”“”“”当随机按下时行保持所按下的状态不变 五、结论 这次eda课程设计历时十天,学到很多很多的东西。同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次设计,进一步加深了对eda的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,都会很高兴。在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误。排除困难后,程序编译就通过了。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示,后来,经过屡次的调试之后,才发现在写代码之前对信号的相位考虑不足。 通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。 总的来说,这次设计还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤指导下,终于迎刃而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的老师和所有同学再次表示忠心的感谢! 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 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的时钟信号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_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 ( not 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 =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; else 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= data_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; state:=3;else counter:=counter+1; stat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论