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

📄 keyboard.vhd

📁 在maxplusII上用VHDL语言编程实现的数字基带信号的同步提取
💻 VHD
字号:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY keyboard IS
   PORT(
        clk,reset: IN STD_LOGIC;
        kb0:INOUT STD_LOGIC;
        getkey:OUT STD_LOGIC;
        keydata:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
        keyvalue:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)

       );
END keyboard;

ARCHITECTURE arc OF keyboard IS

---------------------------------------------------------------
FUNCTION coder(data_in:STD_LOGIC_VECTOR(7 DOWNTO 0))
          RETURN STD_LOGIC_VECTOR IS 
VARIABLE result:STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
   CASE data_in(7 DOWNTO 0) IS
        WHEN "11111110"=>result:="000";
        WHEN "11111101"=>result:="001";
        WHEN "11111011"=>result:="010";
     	WHEN "11110111"=>result:="011";
		WHEN "11101111"=>result:="100";
		WHEN "11011111"=>result:="101";
        WHEN "10111111"=>result:="110";
		WHEN OTHERS=>result:="111";
   END CASE;	
   RETURN result;
END coder;
----------------------------------------------------------------

SIGNAL delay:STD_LOGIC;
 
BEGIN
------------------------------------------------
  
  read:PROCESS(clk,reset)
  VARIABLE second:INTEGER RANGE 0  TO 3;
  VARIABLE keycode:STD_LOGIC_VECTOR(3 DOWNTO 0);
  BEGIN
	IF (reset='0')  THEN 
        second:=0;
        delay<='0';
        getkey<='0';
	ELSIF(clk'EVENT AND clk='1') THEN
		IF(second/=0) THEN
			second:=second+1;
		END IF;
		getkey<=delay;
        IF(keydata/="11111111") THEN
           IF(second=0) THEN 
              keycode(2 DOWNTO 0):=coder(keydata);
			  keycode(3):=kb0;
			  second:=second+1;
              delay<='0';
              getkey<='0';
			ELSE
			  IF (keycode(2 DOWNTO 0)=coder(keydata)) THEN
			       IF(keycode(3)=kb0)  THEN
                      --IF(keycode<"1010") THEN
						 keyvalue<=keycode;
   						 delay<='1';
					  --END IF;
  					     second:=0;
 					END IF;
			  END IF;
            END IF;
		 END IF;
	END IF;
  END PROCESS;
  
----------------------------------------------------
  
  scan:PROCESS(clk, reset)
  BEGIN
    IF (reset='0') THEN
       kb0<='0';
    ELSIF(clk'EVENT AND clk='0') THEN
       kb0<=NOT(kb0);
    END IF;
  END PROCESS;
-----------------------------------------------------

END arc; 

⌨️ 快捷键说明

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