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

📄 keys_test.vhd

📁 4*8矩阵键盘的驱动程序。QuartusII5.0编译通过!
💻 VHD
字号:
--*********************************************
--
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL ;
USE IEEE.STD_LOGIC_UNSIGNED.ALL ;
--
--*********************************************
--
ENTITY keys_test IS
	PORT (  
		CLK_4M ,clr  : IN   STD_LOGIC ;                     --system original clock 4M
     	SELOUT : OUT  STD_LOGIC_VECTOR (2 downto 0) ; --scan sequence
		KEY   : IN   STD_LOGIC_VECTOR (3 downto 0) ; --KEY IN button code
		BCD_CODE :  OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ;
		SEGOUT		: OUT  STD_LOGIC_VECTOR(6 DOWNTO 0) -- SEG7 Display O/P
		);
END keys_test ;
--
--*********************************************
ARCHITECTURE a OF keys_test IS
	component debouncing
		port(  key   : IN STD_LOGIC ;
			   clk,clr    : IN STD_LOGIC ;	
			   dly_out  : OUT STD_LOGIC ) ;
	end component ;

	SIGNAL CLK,CLK1 : STD_LOGIC ;	
	SIGNAL SELTMP:STD_LOGIC_VECTOR(2 DOWNTO 0);
	SIGNAL KEY_CODE:STD_LOGIC_VECTOR(7 DOWNTO 0);
	SIGNAL CLK_KEYBOARD:STD_LOGIC_VECTOR(1 DOWNTO 0);
	SIGNAL C:STD_LOGIC_VECTOR(3 DOWNTO 0);
	SIGNAL 	DB,  key_in  	: STD_LOGIC_VECTOR( 3 DOWNTO 0);-- DBber TO Display 	
	SIGNAL  SEG		: STD_LOGIC_VECTOR( 6 DOWNTO 0);-- SEG7 Display Signal
BEGIN
--*******************************************
-- CONNECTION 
	SEGOUT(6 DOWNTO 0) <= SEG;	-- Seven Segment Display	
	SELOUT<=SELTMP;
	BCD_CODE<=KEY_CODE;
	key_in<=not key;
--
--*********************************************
-- scan signal generator 
counter : block
	Signal  Q   : STD_LOGIC_VECTOR(22 DOWNTO 0);           	
 	Signal 	S   : STD_LOGIC_VECTOR(1 DOWNTO 0) ;  --keyboard scan about 15Hz ***
BEGIN
	PROCESS (Clk_4M,clr)				       
	Begin
	if clr='0' then
		q<=(others=>'0');
	ELSIF CLK_4M'Event AND CLK_4M = '1' then
		Q <= Q+1;
	END IF;
	END PROCESS;
			CLK <= Q(0) ;  --CLK = CLK_DEBOUNCE
			CLK1<=Q(2);
			SELTMP <= Q(6 DOWNTO 4);
--			CLK <= Q(14) ;  --CLK = CLK_DEBOUNCE
--			SELTMP <= Q(18 downto 16) ;
end block counter ;
--
--*********************************************
--
--debounuing ckt
debounuing : block
begin
	U1: debouncing PORT MAP (
					KEY => key_in(0) ,
					DLY_OUT => C(0) ,
					clr=>clr,
					clk => CLK
					);
	U2: debouncing PORT MAP (
					KEY => key_in(1) ,
					dly_out => C(1)  ,
					clr=>clr,
					clk => CLK
					 );
	U3: debouncing PORT MAP (
					key => key_in(2) ,
					dly_out => C(2)  ,
					clr=>clr,
	     			clk => CLK 
					);
	U4: debouncing PORT MAP (
					key => key_in(3) ,
					dly_out => C(3)  ,
					clr=>clr,
	     			clk => CLK 
					);

END block debounuing  ;
--
--******************************************************
--key_decoder
key_decoder : block 
	signal Z : std_logic_VECTOR(6 downto 0) ;   --KEY POSITION
	SIGNAL ZOUT:STD_LOGIC_VECTOR(4 DOWNTO 0) ;
begin
		Z<=(not C) & SELTMP;
		KEY_CODE <= "000" & ZOUT;
	PROCESS(clk1,clr)
	begin
	IF clr='0' then
		zout<=(others=>'0');
	ELSIF CLK1 'EVENT  AND CLK1 = '1'  THEN
			case Z is
				WHEN "1110000" => ZOUT <= "00000";--0
				WHEN "1110001" => ZOUT <= "00001";--1
				WHEN "1110010" => ZOUT <= "00010";--2
				WHEN "1110011" => ZOUT <= "00011";--3
				WHEN "1110100" => ZOUT <= "10000";--MEM
				WHEN "1110101" => ZOUT <= "10001";--ESC
				WHEN "1110110" => ZOUT <= "00100";--4
				WHEN "1110111" => ZOUT <= "00101";--5
				WHEN "1101000" => ZOUT <= "00110";--6
				WHEN "1101001" => ZOUT <= "00111";--7
				WHEN "1101010" => ZOUT <= "10010";--REG
				WHEN "1101011" => ZOUT <= "10011";--EXEC
				WHEN "1101100" => ZOUT <= "01000";--8
				WHEN "1101101" => ZOUT <= "01001";--9
				WHEN "1101110" => ZOUT <= "01010";--A
				WHEN "1101111" => ZOUT <= "01011";--B
				WHEN "1011000" => ZOUT <= "10100";--LAST
				WHEN "1011001" => ZOUT <= "10101";--STEP
				WHEN "1011010" => ZOUT <= "01100";--C
				WHEN "1011011" => ZOUT <= "01101";--D
				WHEN "1011100" => ZOUT <= "01110";--E
				WHEN "1011101" => ZOUT <= "01111";--F
				WHEN "1011110" => ZOUT <= "10110";--NEXT
				WHEN "1011111" => ZOUT <= "10111";--ENTER
				WHEN "0111000" => ZOUT <= "11000";--CTRL
				WHEN "0111001" => ZOUT <= "11010";--NOP1
				WHEN "0111010" => ZOUT <= "11011";--NOP2
				WHEN "0111011" => ZOUT <= "11100";--NOP3
				WHEN "0111100" => ZOUT <= "11101";--NOP4
				WHEN "0111101" => ZOUT <= "11001";--SHIFT
				WHEN "0111110" => ZOUT <= "11110";--NC
				WHEN "0111111" => ZOUT <= "11110";--NC
				WHEN OTHERS => ZOUT <= "11111";
			end case ;
		END IF ;
	END PROCESS;
END BLOCK key_decoder;
--*********************************************
MULTIPLEXER : BLOCK
BEGIN
	DB <= KEY_CODE(3 DOWNTO 0) WHEN SELTMP = 0 ELSE  	
	      KEY_CODE(7 DOWNTO 4) WHEN SELTMP = 1 ELSE
		  "1111" ;
End Block MULTIPLEXER ;
--**********************************************
SEVEN_SEGMENT : Block	-- Binary Code -> Segment 7 Code
Begin
		    --ABCDEFG
	  SEG <= "1111110" when DB= "0000" else
	   		 "0110000" when DB= "0001" else
	   		 "1101101" when DB= "0010" else
	    	 "1111001" when DB= "0011" else
	    	 "0110011" when DB= "0100" else
	    	 "1011011" when DB= "0101" else
	    	 "1011111" when DB= "0110" else
	    	 "1110000" when DB= "0111" else
	    	 "1111111" when DB= "1000" else
	    	 "1111011" when DB= "1001" else
	    	 "1110111" when DB= "1010" else
	    	 "0011111" when DB= "1011" else
	    	 "1001110" when DB= "1100" else
	    	 "0111101" when DB= "1101" else
	    	 "1001111" when DB= "1110" else
	    	 "0000000" when DB= "1111" ELSE--1000111
			 "0000000";
End Block SEVEN_SEGMENT;											
END a;
--*********************************************

⌨️ 快捷键说明

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