key2.vhd

来自「ProtelDXp 实现计算器功能」· VHDL 代码 · 共 142 行

VHD
142
字号
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);                     -- 输出键盘扫描信号         
     outcode    :OUT std_logic_vector(3 downto 0) );               -- 输出各键码值
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"=>outcode<="0111";
                               when"1011"=>outcode<="0100";
                               when"1101"=>outcode<="0001";
                               when"1110"=>outcode<="0000";
                               when others=>outcode<="0000"; 
                           end case;
               when"1011"=>case keyout(4 to 7) is 
                               when"0111"=>outcode<="1000";
                               when"1011"=>outcode<="0101";
                               when"1101"=>outcode<="0010";
                               when"1110"=>outcode<="1111";
                               when others=>outcode<="0000"; 
                           end case;
               when"1101"=>case keyout(4 to 7) is 
                               when"0111"=>outcode<="1001";
                               when"1011"=>outcode<="0110";
                               when"1101"=>outcode<="0011";
                               when"1110"=>outcode<="1110";
                               when others=>outcode<="0000"; 
                           end case;
               when"1110"=>case keyout(4 to 7) is 
                               when"0111"=>outcode<="1010";
                               when"1011"=>outcode<="1011";
                               when"1101"=>outcode<="1100";
                               when"1110"=>outcode<="1101";
                               when others=>outcode<="0000"; 
                           end case;
               when others =>outcode<="0000";
             end case;
          END PROCESS out_led;
          end art;






























 

⌨️ 快捷键说明

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