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

📄 elec_lock.vhd

📁 vhdl代码写的一个密码锁程序
💻 VHD
字号:
--*********************************************  
LIBRARY IEEE;  
USE IEEE.STD_LOGIC_1164.ALL;  
USE IEEE.STD_LOGIC_ARITH.ALL ;  
USE IEEE.STD_LOGIC_UNSIGNED.ALL ;  
LIBRARY altera;  
USE altera.maxplus2.ALL;  
--*********************************************  
ENTITY elec_lock IS  
   PORT (    
        CLK_4M   : IN   STD_LOGIC ;                     --系统时钟4M  
        RST   : IN   STD_LOGIC ;                     --0  
        CLK_SCAN : OUT  STD_LOGIC_VECTOR (3 downto 0) ; --键盘扫描  
        KEY_IN   : IN   STD_LOGIC_VECTOR (2 downto 0) ; --键盘检测  
 --       FLAG_NUMB : OUT STD_LOGIC ;                     --数字键指示
 --       FLAG_FUNC : OUT STD_LOGIC ;                     --功能键指示
        ENLOCK : BUFFER  STD_LOGIC                         --1:锁定, 0:解除锁定  
       -- NUMB_CNT : OUT STD_LOGIC_VECTOR (2 DOWNTO 0)  
        );  
END elec_lock ;  
--*********************************************  
ARCHITECTURE a OF elec_lock IS  
    component debouncing  
        port(  d_in   : IN STD_LOGIC ;  
               clk    : IN STD_LOGIC ;    
               d_out  : OUT STD_LOGIC ) ;  
    end component ;  
    SIGNAL CLK : STD_LOGIC ;   
    SIGNAL CLK_KEYBOARD : STD_LOGIC_VECTOR(1 downto 0) ; 
    SIGNAL CLK_DEBOUNCE : STD_LOGIC ;    
    SIGNAL C          : STD_LOGIC_VECTOR(2 downto 0) ;   --消抖输出       
    SIGNAL FN         : STD_LOGIC ;                      --数字键指示
    SIGNAL F         : STD_LOGIC_VECTOR(3 downto 0) ;    --数字键指示
    SIGNAL N         : STD_LOGIC_VECTOR(3 downto 0) ;    --数字键指示
    SIGNAL FF         : STD_LOGIC ;                      --功能键指示
    SIGNAL SEL        : STD_LOGIC_VECTOR (3 downto 0) ;  --键盘扫描信号  
    SIGNAL ACC : STD_LOGIC_VECTOR (15 DOWNTO 0) ;        --临时输入的密码
    SIGNAL REG : STD_LOGIC_VECTOR (15 DOWNTO 0) ;        --所存密码
 --   SIGNAL RR2 : STD_LOGIC ;                             --密码清除信号  
 --   SIGNAL NC : STD_LOGIC_VECTOR (2 DOWNTO 0) ;  
BEGIN  
--*******************************************  
-- CONNECTION   
 --   FLAG_NUMB <= FN  ;  
 --   FLAG_FUNC <= FF  ;  
    CLK_DEBOUNCE <= CLK ;  
--    NUMB_CNT<= NC ;  
--*********************************************  
-- scan signal generator   
counter : block  
    Signal  Q   : STD_LOGIC_VECTOR(22 DOWNTO 0);              
    SIGNAL  SEL : STD_LOGIC_VECTOR (3 downto 0);    
BEGIN  
  
    PROCESS (Clk_4M)                           
    Begin  
        IF CLK_4M'Event AND CLK_4M = '1' then  
             Q <= Q+1;  
        END IF;  
    END PROCESS;  
             CLK <= Q(0) ;  --CLK = CLK_DEBOUNCE  
             CLK_KEYBOARD <= Q(4 DOWNTO 3) ;     -- ***00-01-10-11  
-- To generate keyboard scan sequence  1110->1101->1011->0111                      
             CLK_SCAN <=      "1110" WHEN CLK_KEYBOARD=0 ELSE  
                     "1101" WHEN CLK_KEYBOARD=1 ELSE  
                     "1011" WHEN CLK_KEYBOARD=2 ELSE  
                     "0111" ;   
end block counter ;  
--*********************************************  
--debounuing ckt  
debounuing : block  
begin  
    U1: debouncing PORT MAP (  
                     d_in => key_in(0) ,  
                     d_out => C(0) ,  
                     clk => CLK  
                     );  
    U2: debouncing PORT MAP (  
                     d_in => key_in(1) ,  
                     d_out => C(1)  ,  
                     clk => CLK  
                      );  
    U3: debouncing PORT MAP (  
                     d_in => key_in(2) ,  
                     d_out => C(2)  ,  
                     clk => CLK   
                     );  
END block debounuing  ;  
--******************************************************  
--key_decoder  
key_decoder : block   
    signal Z : std_logic_VECTOR(4 downto 0) ;   --KEY POSITION  `
  --  SIGNAL R1, R0 : STD_LOGIC ;  
  
begin  
    PROCESS(clk)  
    begin  
        Z <= CLK_KEYBOARD & C ;  
         IF CLK'EVENT  AND CLK = '1'  THEN  
             case Z is  
                     when "11101" => N <= "0000" ;--0  
                     when "00011" => N <= "0001" ;--1  
                     when "00101" => N <= "0010" ;--2  
                     when "00110" => N <= "0011" ;--3  
                     when "01011" => N <= "0100" ;--4  
                     when "01101" => N <= "0101" ;--5  
                     when "01110" => N <= "0110" ;--6  
                     when "10011" => N <= "0111" ;--7  
                     when "10101" => N <= "1000" ;--8  
                     when "10110" => N <= "1001" ;--9  
                     when others   => N <= "1111" ;  
             end case ;  
        END IF ;  
--****************************  
        IF CLK'EVENT  AND CLK = '1'  THEN  
             case  Z is  
                     when "11011" => F <= "0100" ;--*_LOCK  
                     when "11110" => F <= "0001" ;--#_UNLOCK  
                     when others  => F <= "1000" ;  
             end case ;        
        END IF ;  
    end process ;  
    FN <=  NOT ( N(3) AND N(2) AND N(1) AND N(0) ) ;  
    FF <=  F(2) OR F(0);--( NOT F(3) AND F(2) AND NOT F(1) AND NOT F(0)) OR (NOT F(3) AND NOT F(2)  
--AND NOT F(1) AND F(0) ) ;  
       








--To generate clear signal for ACC   
--PROCESS (CLK)  
--BEGIN  
--IF CLK'EVENT  AND CLK = '1'  THEN  
--R1 <= R0 ; R0 <= FF ;   
--END IF ;  
--RR2 <= R1 AND NOT R0 ;  
--END PROCESS ;  
end block key_decoder ;  
--*****************************************************  
--KEYIN /// BACK /// ALL CLEAR  
KEYIN_PROCESS :BLOCK  
  --  SIGNAL RST: STD_LOGIC ;    
BEGIN   
    PROCESS(CLK,FN,RST)  
    BEGIN  
--        IF RST = '1' THEN   
--             ACC <= "0000000000000000" ;  --CLEAR INPUT  
 --       ELSE   
             IF  FN'EVENT AND FN = '1'  THEN   
                     ACC <= ACC(11 DOWNTO 0) & N ;  
                ELSE                            
             END IF ;  
--        END IF ;  
    END PROCESS ;  
END BLOCK KEYIN_PROCESS ;  
--*********************************************  
LOCK_PROCESS : BLOCK  
BEGIN  
    PROCESS(CLK,F)  
    BEGIN  
        IF (CLK'EVENT AND CLK = '1') THEN  
                     IF F(2) = '1' AND ENLOCK='0' THEN  --LOCK   
                         REG <= ACC ;   
                         ENLOCK <= '1';  
                     ELSIF F(0) = '1' THEN
						IF REG = ACC THEN    --CHECK PIN CODE  
                             ENLOCK<= '0';
                         END IF ;  
                     END IF ;  
        END IF ;  
    END PROCESS ;  
END BLOCK LOCK_PROCESS ;  
END a;  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -