- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
键盘设计思路
总体设计 系统结构的总体设计 图3-2 键盘接口电路结构图 由行列式键盘原理就可以知道,要正确的完成键盘输入工作必须有按键扫描电路产生keydrv3~keydrv0信号。同时还必须有按键译码电路从keydrv3~keydrv0信号和keyin3~keyin0信号中译码出按键的值。此外,一般还需要一个按键发生信号用于和其他模块接口,通知其他模块键盘上有按键动作发生,并可以从键盘上读取按键的键值。由于各个模块需要的时钟频率是不一样的,因此时钟产生模块就是用于产生各个模块需要的时钟信号。因此得到接盘接口电路的结构如上图所示。[6][7] 4.1 键盘扫描电路 键盘扫描电路是用于产生keydrv3~keydrv0信号,其变化的顺序依次是1110-----1101-----1011-----0111-----……周而复始地扫描。其停留在某个状态的时间大约为10ms。更短的停留时间是没有必要的,因为人按键的时间大约为10ms,不可能有更快的按键动作发生;另外,更短的停留时间还容易采集到抖动信号,会干扰判断。而太长的停留时间则会使某些较快的按键东走丢失。 键盘扫描电路的外部接口电路如图4-1所示,其中clk_scan是周期为10ms的扫描时钟,keydrv为输出到键盘的扫描信号,宽度为4位。 图4-1 键盘扫描电路的外部接口电路图 其VHDL描述如下: LIBRARY ieee; USE ieee.std_logic_1164.all; -- Entity Declaration ENTITY key_scan IS -- {{ALTERA_IO_BEGIN}} DO NOT REMOVE THIS LINE! PORT ( clk_scan : IN STD_LOGIC; --扫描时钟,周期10ms keydrv : OUT STD_LOGIC_VECTOR(3 DOWNTO 0) --输出扫描信号 以上程序采用一个状态机来实现扫描电路。该状态机是一个one-hot状态机,并且输出值就是状态机的状态,没有通过一个逻辑电路来做输出译码。这样的好处是得到的输出信号比较“干净”,没有毛刺。 其仿真波形如图4-2所示。 图4-2 键盘扫描电路仿真图 从图4-2中很容易发现present_state的值的变化是随着扫描信号key_scan的上升沿的到来而变化的,也就是key_scan每来一个脉冲,相应的present_state的值就变化一次。很容易发现keydrv的值的变化顺序为1110---1101---1011---0111,也就是每个key_scan来一个脉冲时,保证keydrv相邻的值只有一个变化,这样为了防止产生不必要的毛刺。present_state值和keydrv值是相同的,只不过一个用的二进制,一个用的是十进制,所以它的变化为14—13—11—7。 4.2 键盘译码电路和按键标志位产生电路 键盘译码电路是从keydrv3~ keydrv0和keyin3~keyin0信号中译码出按键的键值的电路,它的真值表就是以前行扫描信号、列扫描与按键位置的关系图。按键标志位产生电路是产生按键标志位信号keypressed的电路。由于这两个电路关系紧密,因此放入同一个模块中实现。其外部接口图如图4-3所示。其中clk为 局信号,它是由FPGA芯片的外部晶振给出的。clk在系统中的频率是最高,其他时钟都是它的分频产生。keydrv为键盘扫描信号,keyin为键盘输入信号,keyvalue为键值(代表按键所在的位置),keypressed表示有一个按键被按下,每发生一次按键动作,keypressed就输出一个宽度为全局时钟周期的正脉冲。该信号用于与其他模块握手,负责通知其他模块键盘是否有按键发生。其他模块在keypressed有效时,可以读取键值。 图4-3 键盘译码电路的外部接口 其VHDL实现如下: LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY keydecoder IS PORT( clk : IN STD_LOGIC; --全局时钟 clk_scan : IN STD_LOGIC; --扫描时钟 keyin : IN STD_LOGIC_VECTOR(8 DOWNTO 0); --键盘输入 keydrv : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --扫描信号 keyvalue : OUT STD_LOGIC_VECTOR(8 DOWNTO 0);--键值 keypressed : OUT STD
文档评论(0)