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 VHDL基于FPGA的数字时钟设计+电路图(4):http://www.youerw.com/zidonghua/lunwen_1332.html