📄 elock.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY elock IS
PORT( clk,k1,k2,k3,k4,k5:IN STD_LOGIC;
k6,k7,k8,k9,k10:IN STD_LOGIC;
row:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
led:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END elock;
ARCHITECTURE Behavioral OF elock IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL count1:STD_LOGIC_VECTOR(3 DOWNTO 0);
TYPE states IS(s4,s3,s2,s1,s0); --自定义类型
SIGNAL state:states:=s0;
SIGNAL next_state:states:=s0;
SIGNAL en,carry,op,k11,k22,k33,k44,k55:STD_LOGIC;
SIGNAL k66,k77,k88,k99,k1010:STD_LOGIC;
SIGNAL row1:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
P1:PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN -- IF clk'EVENT AND clk='1' ??
count<=count+'1';
END IF;
END PROCESS P1;
P2:PROCESS(clk)
BEGIN
IF rising_edge(clk) THEN
IF count="11" THEN -- 是“” 还是'''' ??
carry<='1'; -- clk 信号经过分频后,信号carry的频率为0.5Hz
ELSE
carry<='0';
END IF;
END IF;
END PROCESS P2;
P3:PROCESS(carry,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10) --当有按键输入时,锁存该按键信号
BEGIN
IF rising_edge(carry) THEN
IF(k1='0') THEN
k11<='0';
ELSE
k11<='1';
END IF;
IF(k2='0') THEN
k22<='0';
ELSE
k22<='1';
END IF;
IF(k3='0') THEN
k33<='0';
ELSE
k33<='1';
END IF;
IF(k4='0') THEN
k44<='0';
ELSE
k44<='1';
END IF;
IF(k5='0') THEN
k55<='0';
ELSE
k55<='1';
END IF;
IF(k6='0') THEN
k66<='0';
ELSE
k66<='1';
END IF;
IF(k7='0') THEN
k77<='0';
ELSE
k77<='1';
END IF;
IF(k8='0') THEN
k88<='0';
ELSE
k88<='1';
END IF;
IF(k9='0') THEN
k99<='0';
ELSE
k99<='1';
END IF;
IF(k10='0') THEN
k1010<='0';
ELSE
k1010<='1';
END IF;
END IF;
END PROCESS P3;
P4:PROCESS(carry)
BEGIN
IF rising_edge(carry) THEN
state<=next_state; -- 改变当前状态
END IF;
END PROCESS P4;
P5:PROCESS(state,k11,k22,k33,k44,k55,k66,k77,k88,k99,k1010) --当有按键输入时,产生下一状态
BEGIN
CASE state IS
WHEN s0=> IF k33='0' AND en='1' THEN
next_state<=s1;
op<='0';
END IF;
WHEN s1=> IF k22='0' AND en='1' THEN
next_state<=s2;
op<='0';
END IF;
WHEN s2=> IF k11='0' AND en='1' THEN
next_state<=s3;
op<='0';
END IF;
WHEN s3=> IF k66='0' AND en='1' THEN
next_state<=s4;
op<='0';
END IF;
WHEN s4=> op<='1'; --四位密码输入正确后,op置1
WHEN OTHERS=> next_state<=s0;
END CASE;
IF k1010='0' THEN -- 当复位键按下时,返回到s0状态
next_state<=s0;
END IF;
END PROCESS P5;
P6:PROCESS(carry,k11,k22,k33,k44,k55,k66,k77,k88,k99,k1010) --当有按键输入时,对按键输入次数计数
BEGIN
IF rising_edge(carry) THEN
IF k1010='0' THEN
count1<="0000";
ELSIF op='1'THEN
count1<="1111"; --密码输入正确
ELSIF(en='0' AND op='1') THEN
count1<="1110"; --密码输入错误
ELSIF(en='1'AND(k11='0'OR k22='0'OR k33='0'OR k44='0'
OR k55='0'OR k66='0'OR k77='0'OR k88='0'OR k99='0'))THEN
count1<=count1+1; --按键输入次数计数
END IF;
END IF;
END PROCESS P6;
P7:PROCESS(count1) --判断按键输入次数是否超过4次,并且根据输入次数,为进程P5产生状态转移控制信号en
BEGIN
IF count1<="011"THEN
en<='1';
ELSE
en<='0';
END IF;
END PROCESS P7;
--a,b,c,d,e,f,g,dp
WITH count1 SELECT --7段译码器
led<="01100000" WHEN "0001", --1
"11011010" WHEN "0010", --2
"11110010" WHEN "0011", --3
"01100110" WHEN "0100", --4
"10110110" WHEN "0101", --5
"10111110" WHEN "0110", --6
"11100000" WHEN "0111", --7
"11111110" WHEN "1000", --8
"11110110" WHEN "1001", --9
"01101110" WHEN "1111", --显示密码输入正确字符 H
"10011110" WHEN "1110", --显示密码输入正确字符 E
"11111100" WHEN OTHERS; --0
row<="101"; --选择其中一个数码管显示
END Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -