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

📄 key2.vhd

📁 VHDL语言设计;功能描述:键盘扫描
💻 VHD
字号:
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;

ENTITY key2 IS
PORT(inclk    :IN std_logic;                                     -- 输入时钟信号                         
     inkey    :IN std_logic_vector(0 to 3);                      -- 输入按键信号          
     outkey   :OUT std_logic_vector(0 to 3);                     -- 输出键盘扫描信号         
     outled   :OUT std_logic_vector(7 downto 0) );               -- LED显示
END key2;

ARCHITECTURE art OF key2 IS
  
  COMPONENT tinglmove                           
       PORT(a,clk:IN std_logic;
           b:OUT std_logic);
  END COMPONENT;

    SIGNAL keyclk     :std_logic_vector(16 downto 0);
    SIGNAL chuclk     :std_logic_vector(2 downto 0);
    SIGNAL keyclkout,chuclkout  :std_logic ;                         --键盘去抖脉冲,串行扫描产生脉冲
    SIGNAL chuout  :std_logic_vector(0 to 3);                        --扫描信号
    SIGNAL inkeymap  :std_logic_vector(0 to 3);                      --按键去抖后的信号
    SIGNAL keyout :std_logic_vector(0 to 7);
  BEGIN
   roll:FOR i IN 0 TO 3 GENERATE                                     -- 生成四个去抖单元电路
  movskipX:tinglmove PORT MAP(inkey(i),keyclkout,inkeymap(i));
   END GENERATE;
  clk_key:PROCESS(inclk)
        BEGIN
        if(inclk'event and inclk='1')then
             if keyclk=54999 then 
                 keyclk<="00000000000000000";
                 keyclkout<=not keyclkout;
             else
                 keyclk<=keyclk+1;
             end if;
         end if;
       END PROCESS clk_key;
  clk_chu:PROCESS(keyclkout)
          BEGIN
             IF (keyclkout'EVENT AND keyclkout='1')THEN
                 IF chuclk=4 THEN
                    chuclk<="000";chuclkout<=not chuclkout;
                 ELSE
                    chuclk<=chuclk+1;
                 END IF;
             END IF;
          END PROCESS clk_chu;
  clk_chu_out:PROCESS(chuclkout)
          BEGIN
              IF (chuclkout'EVENT AND chuclkout='1')THEN
                   IF chuout="1110"THEN
                       IF inkeymap/="1111"THEN
                           keyout<=chuout&inkeymap;
                        END IF;
                           chuout<="1101";
                  ELSIF chuout="1101"THEN
                        IF inkeymap/="1111"THEN
                           keyout<=chuout&inkeymap;
                        END IF;
                       chuout<="1011";
                  ELSIF chuout="1011"THEN
                       IF inkeymap/="1111"THEN
                           keyout<=chuout&inkeymap;
                        END IF;
                       chuout<="0111";
                   ELSIF chuout="0111"THEN
                       IF inkeymap/="1111"THEN
                           keyout<=chuout&inkeymap;
                        END IF;
                       chuout<="1110";
                   ELSE 
                       chuout<="1110";
                END IF;
             END IF;
        END PROCESS clk_chu_out;
      outkey<=chuout;
    out_led:PROCESS(keyout)
          BEGIN 
            case keyout(0 to 3) is 
               when"0111"=>case keyout(4 to 7) is 
                               when"0111"=>outled<=x"7e";
                               when"1011"=>outled<=x"33";
                               when"1101"=>outled<=x"7f";
                               when"1110"=>outled<=x"4e";
                               when others=>outled<=x"00"; 
                           end case;
               when"1011"=>case keyout(4 to 7) is 
                               when"0111"=>outled<=x"30";
                               when"1011"=>outled<=x"5b";
                               when"1101"=>outled<=x"7b";
                               when"1110"=>outled<=x"3d";
                               when others=>outled<=x"00"; 
                           end case;
               when"1101"=>case keyout(4 to 7) is 
                               when"0111"=>outled<=x"6d";
                               when"1011"=>outled<=x"5f";
                               when"1101"=>outled<=x"77";
                               when"1110"=>outled<=x"4f";
                               when others=>outled<=x"00"; 
                           end case;
               when"1110"=>case keyout(4 to 7) is 
                               when"0111"=>outled<=x"79";
                               when"1011"=>outled<=x"70";
                               when"1101"=>outled<=x"1f";
                               when"1110"=>outled<=x"47";
                               when others=>outled<=x"00"; 
                           end case;
               when others =>outled<=x"00";
             end case;
          END PROCESS out_led;
          end art;






























 

⌨️ 快捷键说明

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