📄 keyboard.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 keyboard IS
PORT (
CLK_4M : IN STD_LOGIC ; --system original clock 4M
KEY_IN : IN STD_LOGIC_VECTOR (2 downto 0) ; --KEY IN button code
CLK_SCAN : OUT STD_LOGIC_VECTOR (3 downto 0) ; --scan sequence
out_numb : OUT STD_LOGIC_VECTOR(3 downto 0) ;
out_func : OUT STD_LOGIC_VECTOR(3 downto 0) ;
flag_numb : OUT STD_LOGIC ;
flag_Func : OUT STD_LOGIC ;
clear : OUT STD_LOGIC ;
CLK_DEBOUNCE : OUT STD_LOGIC ;
CLK_DISPLAY : OUT STD_LOGIC_VECTOR(1 DOWNTO 0) -- ***
);
END keyboard ;
--
--*********************************************
ARCHITECTURE a OF keyboard 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 C_KEYBOARD : STD_LOGIC_VECTOR(1 downto 0) ;
SIGNAL C_DEBOUNCE : STD_LOGIC ;
SIGNAL C_DISPLAY : STD_LOGIC_VECTOR(1 downto 0) ;
SIGNAL C : STD_LOGIC_VECTOR(2 downto 0) ;
SIGNAL N ,F : STD_LOGIC_VECTOR(3 downto 0) ;
SIGNAL FN ,FF ,RR2 : STD_LOGIC ;
SIGNAL SEL : STD_LOGIC_VECTOR (3 downto 0) ;
BEGIN
--*******************************************
-- CONNECTION
OUT_NUMB <= N ;
OUT_FUNC <= F ;
FLAG_NUMB <= FN ;
FLAG_FUNC <= FF ;
CLK_DEBOUNCE <= C_DEBOUNCE ;
CLK_DISPLAY <= C_DISPLAY ;
C_DEBOUNCE <= CLK ;
--
--*********************************************
-- scan signal generator
counter : block
Signal Q : STD_LOGIC_VECTOR(19 DOWNTO 0);
Signal S : STD_LOGIC_VECTOR(1 DOWNTO 0) ; --keyboard scan about 15Hz ***
SIGNAL SEL : STD_LOGIC_VECTOR (3 downto 0); --1110-1101-1011-0111
BEGIN
PROCESS (Clk_4M)
Begin
IF CLK_4M'Event AND CLK_4M ='1' then
Q <= Q+1;
END IF;
-- C_KEYBOARD <= Q(19 DOWNTO 18) ; -- about 15 Hz 61/4=15
-- C_DEBOUNCE <= Q(14) ; -- about 125Hz
-- C_DISPLAY <= Q(15 DOWNTO 14) ; -- about 30 Hz 122/4=30
C_KEYBOARD <= Q(5 DOWNTO 4) ; -- ***00-01-10-11
CLK <= Q(0) ;
C_DISPLAY <= Q(5 DOWNTO 4) ;
END PROCESS;
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 ckt
debounuing : block
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
key_decoder : block
signal Z : std_logic_VECTOR(4 downto 0) ; --KEY POSITION
signal r1, r0 : std_logic ;
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) ;
--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 ;
CLEAR <= RR2 ;
END PROCESS ;
end block key_decoder ;
END a;
--=========================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -