⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elock.vhd

📁 电子密码锁
💻 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 + -