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

📄 keydecoder.vhd

📁 这是一些经典的vhdl example
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY keydecoder IS
PORT(
		keyin	  	: IN	STD_LOGIC_VECTOR(3 DOWNTO 0);	--键盘输入
		keydrv	  	: IN	STD_LOGIC_VECTOR(3 DOWNTO 0);   --扫描输出
		clk       	: IN	STD_LOGIC;                      --全局时钟
		keyvalue  	: OUT	STD_LOGIC_VECTOR(3 DOWNTO 0);   --键值
		keypressed 	: OUT   STD_LOGIC;                      --有键被按下标志
		functionkey : OUT   STD_LOGIC                       --功能键标志
);
END keydecoder;
ARCHITECTURE rtl OF keydecoder IS
--TEMP <= keyin & keydrv;
SIGNAL temp : STD_LOGIC_VECTOR(7 DOWNTO 0);
--用于产生KEYPRESSED
SIGNAL temp_pressed : STD_LOGIC;
SIGNAL q1,q2 : 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)
	BEGIN
		IF(clk'event and clk='1') THEN
			q1 <= temp_pressed;
			q2 <= q1;
		END IF;
		keypressed	<= q1 AND NOT(q2);
	END PROCESS;
END rtl;

⌨️ 快捷键说明

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