?? keys_test.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 + -