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

📄 keyboard.vhd

📁 密码锁程序`第一次上传的`希望大家多多下载多多指点
💻 VHD
字号:
--KEYBOARD.VHD
LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
USE IEEE.STD_LOGIC_ARITH.ALL ; 
USE IEEE.STD_LOGIC_UNSIGNED.ALL ; 
ENTITY KEYBOARD IS
PORT (  CLK_1K: IN   STD_LOGIC ;   --系统原始时钟脉冲(1 kHz)
	    KEY_IN: IN   STD_LOGIC_VECTOR (2 DOWNTO 0);     --按键输入
   	    CLK_SCAN: OUT  STD_LOGIC_VECTOR (3 DOWNTO 0) ;  --(仿真时用)键盘扫描序列
        DATA_N: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ;      --数字输出
        DATA_F:  OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ;     --功能输出
	    FLAG_N: OUT STD_LOGIC ;   --数字输出标志
	    FLAG_F: OUT STD_LOGIC ;   --功能输出标志
	    CLK_CTR: OUT STD_LOGIC;   --控制电路工作时钟信号
   	    CLK_DEBOUNCE: OUT STD_LOGIC  --(仿真时用)去抖电路工作时钟信号
       ); 
END ENTITY KEYBOARD ; 

ARCHITECTURE ART OF KEYBOARD IS
  COMPONENT DEBOUNCING IS
	PORT(D_IN: IN STD_LOGIC ; 
		 CLK: IN STD_LOGIC ; 	
		 D_OUT: OUT STD_LOGIC ) ; 
  END COMPONENT DEBOUNCING; 
  SIGNAL CLK: STD_LOGIC ; 					   --电路工作时钟脉冲
  SIGNAL C_KEYBOARD: STD_LOGIC_VECTOR(1 DOWNTO 0); 
              --键扫信号“00-01-10-11”寄存器
  SIGNAL C_DEBOUNCE: STD_LOGIC ; 			
              --去抖时钟信号
  SIGNAL C: STD_LOGIC_VECTOR(2 DOWNTO 0) ;  	
              --键盘输入去抖后的寄存器
  SIGNAL N , F: STD_LOGIC_VECTOR(3 DOWNTO 0) ;  
 	             --数字、功能按键译码值的寄存器
  SIGNAL FN , FF: STD_LOGIC ;   		
                  --数字、功能按键标志值数字、功能按键
  SIGNAL SEL: STD_LOGIC_VECTOR (3 DOWNTO 0) ;    --扫描时序	
  BEGIN
-- 内部连接
	DATA_N <= N ; 
	DATA_F <= F ; 
	FLAG_N <= FN  ; 
	FLAG_F <= FF  ; 
	CLK_CTR <= CLK ; 
    
  --扫描信号发生器        
  COUNTER : BLOCK IS
	SIGNAL  Q: STD_LOGIC_VECTOR(5 DOWNTO 0);  
	SIGNAL  SEL: STD_LOGIC_VECTOR (3 DOWNTO 0);  
    --扫描时序:1110-1101-1011-0111 
    BEGIN
	PROCESS (CLK_1K) IS				       
	  BEGIN
	  IF CLK_1K'EVENT AND CLK_1K ='1' THEN
	     Q <= Q+1;    --时钟分频 
      END IF; 
     C_DEBOUNCE <= Q(2) ;    	--去抖时钟信号, 大约125 Hz 
     C_KEYBOARD <= Q(1 DOWNTO 0) ; 
   --产生键扫信号:00-01-10-11时钟:大约16HZ
   --C_DEBOUNCE <= Q(1) ;           --仿真时用 
   --C_KEYBOARD <= Q(5 DOWNTO 4) ; 	--仿真时用
	  CLK <= Q(0) ; 
	END PROCESS; 	
    CLK_DEBOUNCE <= C_DEBOUNCE; 			     
	SEL <= 	"1110" WHEN C_KEYBOARD=0 ELSE
			"1101" WHEN C_KEYBOARD=1 ELSE
			"1011" WHEN C_KEYBOARD=2 ELSE
			"0111" WHEN C_KEYBOARD=3 ELSE
			"1111"; 
	CLK_SCAN <= SEL ; 
  END BLOCK COUNTER ; 
  --键盘去抖
  DEBOUNUING : BLOCK IS
    BEGIN
	U1: DEBOUNCING PORT MAP (D_IN => KEY_IN(0) , D_OUT => C(0), 
                             CLK => C_DEBOUNCE); 
	U2: DEBOUNCING PORT MAP (D_IN => KEY_IN(1) , D_OUT => C(1), 
                             CLK => C_DEBOUNCE); 
	U3: DEBOUNCING PORT MAP (D_IN => KEY_IN(2) , D_OUT => C(2), 
                             CLK => C_DEBOUNCE ); 
END BLOCK DEBOUNUING  ; 
  --键盘译码
  KEY_DECODER : BLOCK 
	SIGNAL Z : STD_LOGIC_VECTOR(4 DOWNTO 0) ;    --按键位置
	BEGIN
	PROCESS(CLK)
	  BEGIN
	  Z <= C_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) ; 
  END BLOCK KEY_DECODER ; 
END ARCHITECTURE ART; 

⌨️ 快捷键说明

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