📄 keyboard.vhd
字号:
Library IEEE;
Use IEEE.Std_Logic_1164.All;
Use IEEE.Std_Logic_Unsigned.All;
Entity Keyboard Is
Port
(clk:In Std_Logic;
--Clock:in std_logic; --扫描时钟频率不宜过高,一般在1KHz以下
KIN:In Std_logic_Vector(3 downto 0); --读入行码
ScanSignal:Out Std_Logic_Vector(3 downto 0);--输出列码(扫描信号)
Num:Out Integer Range 0 To 15; --输出键值,15表示无键按下
enter,ci:out std_logic
);
End;
Architecture Scan Of Keyboard Is
Signal Clock_1:Std_Logic_Vector(14 downto 0);
Signal Clock:Std_Logic;
Signal ScanS:Std_Logic_Vector(7 downto 0);
Signal SCN:Std_Logic_Vector(3 downto 0);
Signal Counter:Integer Range 0 To 3;--用以计数产生扫描信号
Signal CounterB:Integer Range 0 To 3;--用以计算
Begin
process(clk,Clock_1)
Begin
If rising_edge(clk)then
if Clock_1="100111000100000" then
Clock_1<="000000000000000";
else
Clock_1<=Clock_1+1;
end if;
end if;
Clock<=Clock_1(14);
end process;
Process(Clock)
Begin
If rising_edge(Clock) then
If Counter=3 then
Counter<=0;
Else
Counter<=Counter+1;
End If;
Case Counter Is --产生扫描信号
When 0=>SCN<="1110";
When 1=>SCN<="1101";
When 2=>SCN<="1011";
When 3=>SCN<="0111";
End Case;
End If;
End Process;
Process(Clock)
Begin
If falling_edge(Clock) then ---上升沿产生扫描信号,下降沿读入行码
If KIN="1111" then ---如果连接检测到4次“0000”,表示无键按下
If CounterB=3 then
Num<=15; ---15为无效值,用以指示无键按下
CounterB<=0;
ci<='0';
enter<='1';
Else
CounterB<=CounterB+1;
End If;
Else
CounterB<=0;
--wei<=wei+1;
Case ScanS Is
When "11101110"=>Num<=0;enter<='1';ci<='1';
When "11101101"=>Num<=1;enter<='1';ci<='1';
When "11101011"=>Num<=2;enter<='1';ci<='1';
When "11100111"=>Num<=3;enter<='1';ci<='1';
When "11011110"=>Num<=4;enter<='1';ci<='1';
When "11011101"=>Num<=5;enter<='1';ci<='1';
When "11011011"=>Num<=6;enter<='1';ci<='1';
When "11010111"=>Num<=7;enter<='1';ci<='1';
When "10111110"=>Num<=8;enter<='1';ci<='1';
When "10111101"=>Num<=9;enter<='1';ci<='1';
When "10111011"=>Num<=10;enter<='0';ci<='0';
When "10110111"=>Num<=11;enter<='0';ci<='0';
When "01111110"=>Num<=12;enter<='0';ci<='0';
When "01111101"=>Num<=13;enter<='0';ci<='0';
When "01111011"=>Num<=14;enter<='0';ci<='0';
When Others=>Null;enter<='1';--ci<='0';
End Case;
End If;
End If;
End Process;
ScanS<=SCN&KIN;
ScanSignal<=SCN;
End scan;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -