你用的是轻触开关吧,是独立式的吧!这是按键程序,你再加分频一个快的时钟做一个有同步使能信号的计数器就行了,我用的外部时钟是250K.<br>
LIBRARY IEEE;<br>
USE IEEE.STD_LOGIC_1164.ALL;<br>
ENTITY DULI_KEY IS<br>
PORT(CLR,CLK: IN STD_LOGIC;<br>
KEYIN: IN STD_LOGIC;--按键输入<br>
KEYOUT: OUT STD_LOGIC);--按键输出<br>
END ENTITY DULI_KEY;<br>
ARCHITECTURE ART OF DULI_KEY IS<br>
TYPE ST IS(S0,S1,S2,S3,S4,S5,S6,S7);<br>
SIGNAL S: ST;<br>
SIGNAL CLK1K: STD_LOGIC;<br>
SIGNAL EN: STD_LOGIC;<br>
SIGNAL CO: STD_LOGIC;<br>
BEGIN<br>
CLKDIV_1MS

ROCESS(CLR,CLK)--分频<br>
VARIABLE CNT: INTEGER RANGE 0 TO 249;<br>
VARIABLE NEWCLK: STD_LOGIC;<br>
BEGIN<br>
IF CLR='1' THEN<br>
CNT:=0;<br>
NEWCLK:='0';<br>
ELSIF CLK'EVENT AND CLK='1' THEN<br>
IF CNT=249 THEN<br>
CNT:=0;<br>
NEWCLK:='1';<br>
ELSE<br>
CNT:=CNT+1;<br>
NEWCLK:='0';<br>
END IF;<br>
END IF;<br>
CLK1K<=NEWCLK;<br>
END PROCESS CLKDIV_1MS;<br>
DLEY_20MS

ROCESS(CLR,EN,CLK1K)--延时<br>
VARIABLE CNT: INTEGER RANGE 0 TO 19;<br>
VARIABLE C: STD_LOGIC;<br>
BEGIN<br>
IF CLR='1' THEN<br>
CNT:=0;<br>
C:='0';<br>
ELSIF EN='1' THEN<br>
CNT:=0;<br>
C:='0';<br>
ELSIF CLK1K'EVENT AND CLK1K='1' THEN<br>
IF CNT=19 THEN<br>
CNT:=0;<br>
C:='1';<br>
ELSE<br>
CNT:=CNT+1;<br>
C:='0';<br>
END IF;<br>
END IF;<br>
CO<=C;<br>
END PROCESS DLEY_20MS;<br>
KEY

ROCESS(CLR,CLK,CO)<br>
VARIABLE N: STD_LOGIC;<br>
VARIABLE KEYO: STD_LOGIC;<br>
BEGIN<br>
IF CLR='1' THEN<br>
N:='1';<br>
KEYO:='0';<br>
S<=S0;<br>
ELSIF CLK'EVENT AND CLK='1' THEN<br>
CASE S IS<br>
WHEN S0=>N:='1';KEYO:='0';<br>
IF KEYIN='1' THEN<br>
S<=S0;<br>
ELSE<br>
S<=S1;<br>
END IF;<br>
WHEN S1=>N:='0';<br>
IF CO='1' THEN<br>
S<=S2;<br>
ELSE<br>
S<=S1;<br>
END IF;<br>
WHEN S2=>N:='1';<br>
IF KEYIN='1' THEN<br>
S<=S3;<br>
ELSE<br>
S<=S0;<br>
END IF;<br>
WHEN S3=>N:='1';<br>
IF KEYIN='1' THEN<br>
KEYO:=KEYIN;<br>
S<=S4;<br>
ELSE<br>
S<=S0;<br>
END IF;<br>
WHEN S4=>N:='1';<br>
IF KEYIN='0' THEN<br>
S<=S5;<br>
ELSE<br>
S<=S4;<br>
END IF;<br>
WHEN S5=>N:='0';<br>
IF CO='1' THEN<br>
S<=S6;<br>
ELSE<br>
S<=S5;<br>
END IF;<br>
WHEN S6=>N:='1';<br>
IF KEYIN='0' THEN<br>
S<=S7;<br>
ELSE<br>
S<=S4;<br>
END IF;<br>
WHEN S7=>N:='1';<br>
IF KEYIN='0' THEN<br>
S<=S0;<br>
ELSE<br>
S<=S4;<br>
END IF; <br>
END CASE;<br>
END IF;<br>
EN<=N;<br>
KEYOUT<=KEYO;<br>
END PROCESS KEY;<br>
END ARCHITECTURE ART; |