|
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
, \6 |7 M5 G' @3 L7 ^
+ O, H6 [, K1 i$ }; h這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次. o9 q/ q) M2 v
0 g, \; [' K: q7 V8 T' ~8 |# c例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值) o' Z% b& `7 H: r7 l6 d" U
, ~8 E0 \. I' j1 @' j- e. J
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
0 U/ l- B) D* N" d4 X
* t+ L, S2 b5 ~9 w現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!0 i, o# s$ h3 d" i! O0 M
7 C* j9 m$ G2 {8 p1 ?library IEEE;: x: r; k1 X, s% B6 \% t, ]! `
use IEEE.STD_LOGIC_1164.ALL;
t% F: w& L. z8 Buse IEEE.STD_LOGIC_ARITH.ALL;/ p6 A% M) G( d# C
use IEEE.STD_LOGIC_UNSIGNED.ALL;
. u( H: W' G( n1 y* a2 P- v& LENTITY key_controller IS
' d. X# i/ b( L+ Z PORT(
- P( {( A! ] l% E5 i6 |$ r clk : IN std_logic;( B& y5 u( V2 U; H) I& d) S# P
col : OUT std_logic_vector ( 3 DOWNTO 0 );, X; x1 m% ^; E
key_out : OUT std_logic;
4 O1 p$ h8 Y9 }1 o @9 Y row : IN std_logic_vector ( 3 DOWNTO 0 );$ R5 Q1 C7 o( a
digit : OUT std_logic_vector ( 5 DOWNTO 0 )
0 u& Y8 u5 j5 K );
8 B: U6 @$ O# x$ r2 pEND key_controller ;3 p" E+ ]4 i. W2 T1 x7 F8 k3 ^; _
architecture behavioral of key_controller is
9 p2 s- p' |: K( |signal clkm : std_logic;
+ U E1 F8 N6 a2 hsignal key_pressed : std_logic;
( l" b9 b4 z+ h9 G7 B1 asignal key_valid : std_logic := '0';% j/ D2 H/ G. o) Z
signal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce2 O9 B1 p s$ d* c
signal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
4 `3 q, o3 q- O7 b1 W! D. R( G( G! `& Asignal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );' o N, i& H3 b
signal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );+ K* o" \% x; ?' d, i0 b) M2 g
begin6 q" g) v- t$ W# H: D
count : process( clk )) a! e6 Z# h7 ^. q- z
begin! \3 e( _8 p/ b9 T( a
if rising_edge( clk ) then( q9 I6 M1 X# c) S, @/ c
count_t <= count_t + 1;
' L5 a/ r0 E- x6 J end if;+ Y" P* _3 r9 W' x; j
clkm <= count_t( 15 ); --scaning clock generaterd1 @$ F. L' Y2 B: }3 `. s. A3 `0 K8 b
end process;
0 ~& M9 P; B* N-----------------------------------------------
+ Y% F; }+ q. d e- l" ]' s% M2 Hkeyboard: process( clkm, scan_cnt, key_pressed )
V% r) H" p5 O1 {& Qbegin; U) N5 m& v6 r9 q
--scan_cnt is a 4 bit up scan counter ; K" m3 [; s; t8 {6 }7 I
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
p/ P3 G3 @# {( J2 b when "00" => col <= "0111";1 p3 U' i3 e1 }' N# |
when "01" => col <= "1011";: x4 g* e5 C6 c) G
when "10" => col <= "1101";7 d( J6 x U: |1 T, h
when "11" => col <= "1110";$ n W }: f& e0 S
when others => col <= "1111";
8 r; z4 z: B0 J: q8 F: T1 k' g% | end case;) B7 p4 ?4 [& f! E3 D* n6 s0 C* s
---------------------------------------------
8 L3 P/ r3 ? X( `1 g1 G; R( {: C* E4 I case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional4 C; w$ n" j9 q5 J# A+ C8 B9 \& D
when "00" => key_pressed <= row(0);
) F& Z) y4 F4 C5 z when "01" => key_pressed <= row(1);6 z; Z" c4 W; e w f( J! S( U
when "10" => key_pressed <= row(2);
. \) f) W L3 y) n$ z when "11" => key_pressed <= row(3);
6 x9 I% l; f2 R* C4 C# ~ when others => null;' Q/ s0 g8 B# K, o' y
end case;
9 t( ^& S$ T; b----------------------------------------------------------------* P0 H4 W% l$ d' }
if rising_edge( clkm ) then
" H, \, e' m. B N if key_pressed = '1' then --no key_pressed in, continue to scan8 {* X o; L" R
scan_cnt <= scan_cnt + 1;
, R N, |9 @6 M( e7 K% ] dbnq <= "1111111";
: Z- H& L# t ? elsif key_pressed = '0' then --key_pressed in
3 d& Z% r; X6 u4 x8 q5 J dbnq <= dbnq - 1;, }/ |" h6 R; @7 P, w
end if;! K8 l$ O9 {1 h' E, L
----- debounce j M* M* Q/ j j. x9 Q
if dbnq = "1001111" then --key_pressed debounce& L' h; h3 F' d6 e, h
key_valid <= '1';
7 E- X) Z( a) \2 O else key_valid <= '0';8 r8 m# b3 U% M: v3 e; Q+ W8 p8 m, m
end if; ! J) E) J" m( v
end if;
4 L* V; C( N6 E- ?-- scan_out <= scan_cnt;( k) w+ n0 F) ?$ ^* D: v' Y
end process;" W5 K( Q g; \) U
---------------------------------------------------------------------------: g7 z# `$ r: Q5 M4 P6 G. G% o
keycode : process( clk, scan_cnt, key_valid )
( D$ z6 e' p+ w, J begin
, W$ G! r. p' F" B------------- asynchronous expression
, n$ c7 b' T2 [& V9 f9 r if key_valid'event and key_valid = '1' then
9 D m0 M; X+ c5 l& E9 B6 s if scan_cnt( 3 ) = '1' then
! X3 g0 T4 o2 H9 `- B cmd_flag <= '1';
7 B" u& [4 n* a, y. ^, N. I cmd_buf <= scan( 2 downto 0 ); --command store into ram
3 H; ?& u& R/ D elsif scan_cnt( 3 ) = '0' then9 r% ~1 O+ Q$ z! h" E. W! ~
num_flag <= '1'; ) P# k) d0 h r- H2 R
num_buf <= scan( 2 downto 0 ); --numeric store into ram/ a% q$ y2 Z8 g; [( }
else num_buf <= "000", --numeric store into ram + x1 K0 N8 d- `8 q% Q) \
cmd_buf <= "000"; --numeric store into ram
5 W7 A* `# `1 b7 E" \- T num_fleg <= '0';
e# F( g$ d2 s7 `" T cmd_fleg <= '0';" \! B& k: c8 Y0 l% x9 o, a
end if;
4 h2 n. z9 n% C digit <= cmd_buf & num_buf; -- out of key controller
/ h" a! f% y4 [8 n d& Y end if;5 q/ X8 q, h* |7 h# q
end process;
$ T5 ?* W4 ~9 c. U------------------- & f% I% }, r$ n$ r) w5 ~& I* h0 Q% d
key_out <= key_valid;! D! U3 a! O& [1 Q; L# ^- Q# Z
digit <= seg4bit;1 v' G% U% x& `! W
end behavioral; |
|