📄 keydecoder_deb.vhd
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY keydecoder_deb IS
PORT(
keyin : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --键盘输入
keydrv : IN STD_LOGIC_VECTOR(3 DOWNTO 0); --扫描输出
clk : IN STD_LOGIC; --全局时钟
clk_scan : IN STD_LOGIC; --扫描时钟
keyvalue : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --键值
keypressed : OUT STD_LOGIC; --有键被按下标志
functionkey : OUT STD_LOGIC --功能键标志
);
END keydecoder_deb;
ARCHITECTURE rtl OF keydecoder_deb IS
--TEMP <= keyin & keydrv;
SIGNAL temp : STD_LOGIC_VECTOR(7 DOWNTO 0);
--用于产生KEYPRESSED
SIGNAL temp_pressed : STD_LOGIC;
--六个寄存器
SIGNAL q1,q2,q3,q4,q5,q6 : STD_LOGIC;
--为同步化的keypressed
SIGNAL keypressed_asy : STD_LOGIC;
BEGIN
temp <= keydrv & keyin;
--译码进程
PROCESS(temp)
BEGIN
CASE temp IS
WHEN "11101110" => keyvalue<=CONV_STD_LOGIC_VECTOR(1,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11101101" => keyvalue<=CONV_STD_LOGIC_VECTOR(2,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11101011" => keyvalue<=CONV_STD_LOGIC_VECTOR(3,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11100111" => keyvalue<=CONV_STD_LOGIC_VECTOR(4,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11011110" => keyvalue<=CONV_STD_LOGIC_VECTOR(5,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11011101" => keyvalue<=CONV_STD_LOGIC_VECTOR(6,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11011011" => keyvalue<=CONV_STD_LOGIC_VECTOR(7,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "11010111" => keyvalue<=CONV_STD_LOGIC_VECTOR(8,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "10111110" => keyvalue<=CONV_STD_LOGIC_VECTOR(9,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "10111101" => keyvalue<=CONV_STD_LOGIC_VECTOR(0,4);
temp_pressed <= '1';
functionkey <= '0';
WHEN "10111011" => keyvalue<=CONV_STD_LOGIC_VECTOR(10,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN "10110111" => keyvalue<=CONV_STD_LOGIC_VECTOR(11,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN "01111110" => keyvalue<=CONV_STD_LOGIC_VECTOR(12,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN "01111101" => keyvalue<=CONV_STD_LOGIC_VECTOR(13,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN "01111011" => keyvalue<=CONV_STD_LOGIC_VECTOR(14,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN "01110111" => keyvalue<=CONV_STD_LOGIC_VECTOR(15,4);
temp_pressed <= '1';
functionkey <= '1';
WHEN OTHERS => --默认temp_pressed和keyvalue保持原来状态,相当于锁存器
temp_pressed <= '0';
END CASE;
END PROCESS;
--按键标志产生电路
PROCESS(clk_scan)
BEGIN
IF(clk_scan'event and clk_scan='1') THEN
q1 <= temp_pressed;
q2 <= q1;
q3 <= q2;
q4 <= q3;
END IF;
keypressed_asy <= q1 OR q2 OR q3 OR q4;
END PROCESS;
--同步化keypressed_asy
PROCESS(clk)
BEGIN
IF(clk'event and clk='1') THEN
q5 <= keypressed_asy;
q6 <= q5;
END IF;
keypressed <= q5 AND NOT(q6);
END PROCESS;
END rtl;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -