我用过时钟触发出发的方式,下面是我实现这个功能的程序,大家看看有什么问题吗?<br>
<br>
SIGNAL flag: STD_LOGIC:='0'; ---一个标志位<br>
SIGNAL key,flag1,flag2:STD_LOGIC;<br>
SIGNAL counter: STD_LOGIC_VECTOR(3 DOWNTO 0):="0000";<br>
key<=counter(0) AND counter(1) AND counter(2) AND counter(3);<br>
<br>
------------------------------------------按键消抖------------------------------------------------------<br>
--原理就是当有按键按下时,key_pre会变成低电平,这时把flag2变成高电平 --<br>
--flag2的变化会引发最后一个进程,flag2变成高电平,并且counter不为 --<br>
--“1111”时flag1变为高电平,内部计数器开始计数,从“0000”到“1111” --<br>
-- 当计数到“1111”时,key输出高电平 --<br>
PROCESS(GCLK)<br>
BEGIN<br>
IF (GCLK'event and GCLK='1') THEN<br>
IF flag1='0' THEN<br>
counter<="0000";<br>
ELSE<br>
counter<=counter+1;<br>
END IF;<br>
END IF;<br>
END PROCESS;<br>
PROCESS(GCLK)<br>
BEGIN<br>
IF (GCLK'event and GCLK='1') THEN<br>
IF key_pre='0' THEN --低电平则有按键按下<br>
IF flag2='0' THEN --按键处理<br>
flag2<='1';<br>
END IF;<br>
ELSIF flag1='0' THEN<br>
flag2<='0';<br>
END IF;<br>
END IF;<br>
END PROCESS;<br>
PROCESS(flag2,counter)<br>
BEGIN <br>
IF flag2='1' THEN<br>
IF counter="1111" THEN --计数到,去抖动<br>
flag1<='0';<br>
ELSE<br>
flag1<='1'; --否则,继续计数<br>
END IF;<br>
END IF;<br>
END PROCESS;<br>
--------------------------------------------------------------------------------------------------------------------<br>
<br>
PROCESS(GCLK,key)<br>
begin<br>
IF (GCLK'event and GCLK='1') THEN <br>
IF key='1' THEN --按键被按下<br>
IF flag='0' THEN <br>
flag<='1';<br>
ELSE <br>
flag<='0';<br>
END IF;<br>
IF flag='1' THEN<br>
LED<='0'; --标志为为 1 时,LED灯亮<br>
ELSE<br>
LED<='1'; --标志为为 0 时,LED灯灭<br>
END IF;<br>
END IF; <br>
END IF;<br>
END PROCESS;<br>
<br>
[ 本帖最后由 FerrariTim 于 2007-1-25 10:35 编辑 ] |