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

📄 key.vhdl

📁 8位密码锁的实现
💻 VHDL
字号:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

--  Uncomment the following lines to use the declarations that are
--  provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;

entity keyval is
port(keyin:in std_logic_vector(3 downto 0); ---键盘输入
	  keydrv:buffer std_logic_vector(3 downto 0);	  ---扫描输出
	  clkscan: in std_logic;  ---扫描时钟,0.1ms
	  value:out std_logic_vector(3 downto 0);		---键值
	  pressed:out std_logic;
	  comp:out std_logic;
	  rstcode:out std_logic;
	  clr_out :out std_logic							---有键被按下标志
	 );							  ---功能键标志
end keyval;

architecture Behavioral of keyval is
signal t: std_logic_vector(7 downto 0);
signal dd: std_logic_vector(3 downto 0);	
signal tpressed:std_logic;
 constant s0:std_logic_vector(3 downto 0):="1110";	 --定义状态机编码
 constant s1:std_logic_vector(3 downto 0):="1101";
 constant s2:std_logic_vector(3 downto 0):="1011";
 constant s3:std_logic_vector(3 downto 0):="0111";
 signal n_state:std_logic_vector(3 downto 0); ---次态
begin
t<=keydrv & keyin;
  process(clkscan)		---状态更新进程
   begin
	 if clkscan='1' and clkscan'event then
	   keydrv<=n_state;
	 end if;
	end process;
	process(keydrv) 	     ---状态译码
	 begin
	  case keydrv is
	    when s0=>n_state<=s1;
		 when s1=>n_state<=s2;
		 when s2=>n_state<=s3;
		 when s3=>n_state<=s0;
		 when others=>n_state<=s0;
		end case;
  end process;
  process(t,clkscan)		  ---译码
   begin
	if clkscan='1' and clkscan'event then
	  case t is
	   when "11101110"=>value<="0001";  tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11101101"=>value<="0010";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11101011"=>value<="0011";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11100111"=>value<="0100";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';

		when "11011110"=>value<="0101";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11011101"=>value<="0110";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11011011"=>value<="0111";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';
		when "11010111"=>value<="1000";tpressed<='1'; clr_out<='0';	rstcode<='1';comp<='1';

		when "10111110"=>value<="1001";tpressed<='1';  clr_out<='0'; rstcode<='1';comp<='1';
		when "10111101"=>value<="0000";tpressed<='1';  clr_out<='0'; rstcode<='1';comp<='1';
		when "10111011"=>value<="1010";tpressed<='1';  clr_out<='0'; rstcode<='1';comp<='1';
		when "10110111"=>value<="1011";tpressed<='1';  clr_out<='0'; rstcode<='1';comp<='1';

          when "01111110"=>value<="1100";clr_out<='0';  rstcode<='0';comp<='1';
		when "01111101"=>value<="1101";clr_out<='0';  rstcode<='1';comp<='0';
		when "01111011"=>value<="1110";clr_out<='0';	 rstcode<='1';comp<='1';
		when "01110111"=>value<="1111";clr_out<='1';	 rstcode<='1';comp<='1';
		when "11111111"=>tpressed<='0'	;  
		when others=> tpressed<='0';  ---value ,tpressed保持原态,相当于锁存器
	  end case;
	  if 	tpressed='1' then
	       if dd="0011" then
	  	    pressed<=tpressed; dd<="0000";
		  else
		     dd<=dd+1;
		  end if;
		else
		    pressed<=tpressed;
		end if;
	end if;
	end process;
end Behavioral;

⌨️ 快捷键说明

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