USE ieee.std_logic_1164.all;
ENTITY colv IS
PORT(clk : IN STD_LOGIC;
inkey : IN STD_LOGIC;
okey : OUT STD_LOGIC);
END colv;
ARCHITECTURE colv_architecture OF colv IS                 
BEGIN
k1: process(clk,inkey)
variable count:integer range 0 to 30:=0;
begin
if inkey='1' then
count:=0;
okey<='1';
elsif rising_edge(clk) then
if count=30 then
okey<='0'; count:=30;
else count:=count+1;
okey<='1';
end if;  end if;
end process k1;
 END colv_architecture;
这段程序是实现按键去抖动,原理是当有按键按下的时候,输入端inkey会变成低电平,此时如果count不为30时,内部计数器清零并开始计数,从0累计到30,当计数到30时,okey输出底电平,同时给计数器赋值为30。由于计数脉冲信号为2ms,故从有按键按下到确定有输入信号产生大概需要60ms[9]。而按键产生抖动时间大约为2ms到10ms,所以只要计数完成,抖动就已经过去,不再会发生重键现象了,这样就实现去抖动。该模块的仿真波形如图7所示。
 
图7 按键消抖模块波形仿真
2.按键控制模块
    按键控制模块的框图如图8所示。
                
                (a) 小时低位控制模块                   (b) 小时低位控制模块
图8 按键控制模块
图8(a)是控制分的高位,低位以及小时的高位的电路模块,图8(b)是控制小时的低位的电路模块。inkey是经过去抖模块后输出的有键按下的信号,这个信号引发按键控制模块内部信号的变化。oaddr[30]作为输出信号,用于控制时间的调整[10]。当小时高位为1时,其地位变化范围为0到9,当为2时变化范围为0到3。图8(b)中的flag是用来判断小时高位是1还是2的信号,若为1,则flag信号为低电平;若为2,则flag信号为高电平。
(1) 分低位按键控制子程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY addram IS
PORT  (inkey : IN STD_LOGIC;
oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
END addram;
ARCHITECTURE addram_architecture OF addram IS
signal count:std_logic_vector(3 downto 0);
BEGIN  
oaddr<=count;
k1: process(inkey)
begin
if  rising_edge(inkey) then
count<=count+1;
if count=9 then
count<="0000";
end if;
end if;
end process k1;
END addram_architecture;
每当按键一次,即每当inkey的上升沿到来时,count加一,当count值等于9的时候,作为分的低位,将0赋值于count开始下一轮计数,在此过程中,随时将十进制数count的值的BCD码作为oaddr输出的信号。同样对于分的高位,仅将程序中的count=9改成count=5即可;对于小时的高位,仅将程序中的count=9改成count=2即可。
该模块的仿真波形如图9所示。
 图9 分低位按键控制模块波形仿真
(2) 小时低位按键控制程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
ENTITY addram3 IS
PORT   (inkey : IN STD_LOGIC;
flag : IN STD_LOGIC;
oaddr : OUT STD_LOGIC_VECTOR(3 downto 0));
END addram3;
ARCHITECTURE addram3_architecture OF addram3 IS
signal count:std_logic_vector(3 downto 0);
BEGIN
oaddr<=count;
k1:process(inkey,flag)
begin
if  rising_edge(inkey) then
上一篇:AT89C55单片机的数字音乐盒设计+仿真图+电路原理图+源码
下一篇:51单片机的角度测量系统设计+仿真图+源码

基于Kinect手势识别的遥操...

基于51单片机自动门智能控制系统设计

基于TI-DSP平台的电力电子测控平台设计

基于传感器网络的分布式集员滤波问题的研究

基于飞思卡尔芯片LED色彩控制器的设计

基于磁共振技术的家用无...

基于simulink的三相桥式全控...

浅谈新形势下妇产科护理...

谷度酒庄消费者回访调查问卷表

浅谈传统人文精神茬大學...

辩护律师的作证义务和保...

拉力采集上位机软件开发任务书

国内外无刷直流电动机研究现状

《醉青春》导演作品阐述

高校网球场馆运营管理初探【1805字】

多元化刑事简易程序构建探讨【9365字】

中国古代秘书擅权的发展和恶变