|
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
1 I2 _* E: L7 x; t; G; @- v( f, l, Q- L, U0 e
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
/ i9 f' Z4 x# e0 v0 a' c* j% l5 S( q0 r8 Z4 j |' h
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)( m+ j, }- W; c
- j* y2 C7 m8 P: G當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數6 |" ]8 G* T$ n( w$ B. t
! b2 l% Q6 v/ q
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!: W' m# F& i6 _6 B) }, f
% A. X4 n* k# e% ~! N b' v
library IEEE;& |' X3 V. j; s$ h) {; Y
use IEEE.STD_LOGIC_1164.ALL;
% y2 p* v* D& H1 O8 Yuse IEEE.STD_LOGIC_ARITH.ALL;
/ Y1 n. P1 f8 ], v1 Z2 e" X: ouse IEEE.STD_LOGIC_UNSIGNED.ALL;+ z. a5 W+ W, u, q# c1 F
ENTITY key_controller IS& d; n: l/ u% `8 n
PORT( : V+ `% Y6 b( U+ I/ y
clk : IN std_logic;
( L, T8 L4 t. O col : OUT std_logic_vector ( 3 DOWNTO 0 );
6 ?8 Z5 o' W" [) y B key_out : OUT std_logic;
p5 G) c1 M6 Q2 K row : IN std_logic_vector ( 3 DOWNTO 0 );" H4 G9 m) D5 }
digit : OUT std_logic_vector ( 5 DOWNTO 0 )! X6 U6 P' I: C
);
& t8 G) [, i5 OEND key_controller ;
# U& O3 F) A2 c6 B6 Barchitecture behavioral of key_controller is
1 U" Q; i( [9 V0 x3 P; Usignal clkm : std_logic;% c n% E, W6 t" ]' }0 @- o7 k! Q
signal key_pressed : std_logic; S3 L: K1 _. R2 O1 e9 P( m
signal key_valid : std_logic := '0';, O" `" s4 C3 B* m1 z
signal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce
* Z" Y- Y/ j; J9 _7 [signal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
% e- g, {" l, y1 C" R7 n0 E$ hsignal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
% Z, f R) R. S: b8 E* jsignal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
+ [' r& q0 f: p, h `8 g ]begin. {4 c$ y9 |0 K2 b' y* v, E
count : process( clk )
: n7 v/ z, ?/ R5 ?& ?( ?1 e begin
0 U# L% W s b) |) y if rising_edge( clk ) then
; e" O! r5 g/ I count_t <= count_t + 1;
1 c& z' x8 ~6 g4 T end if;
2 i0 K+ R o" C x1 K clkm <= count_t( 15 ); --scaning clock generaterd$ m, V1 u. K. ~( y6 X- A& {8 E
end process; 7 Z, v* a% b7 O/ A# Q
-----------------------------------------------# i8 C- b5 T" R2 j- i
keyboard: process( clkm, scan_cnt, key_pressed )/ Q+ g6 l* m) R9 a5 R6 h
begin
( p- x1 x6 W) ^* N! S; Q--scan_cnt is a 4 bit up scan counter
( w. e. M3 Y2 y: M: _! c case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
P* ~ j8 O# T3 j1 O' _8 Q# O when "00" => col <= "0111";
5 x# o! r$ y) g- j$ t when "01" => col <= "1011";2 j& B' B: p! h) b
when "10" => col <= "1101";5 A$ n# x( n0 `9 s
when "11" => col <= "1110";( p! P8 J K3 s6 J7 t0 N5 m
when others => col <= "1111";
Z" `7 D5 f- p0 p0 ?1 Z. p, `% l: D end case;
+ j1 [6 M- W: _4 N ---------------------------------------------
' u( o' ~6 o: \5 d case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional& N* c( @/ ?# W2 b R
when "00" => key_pressed <= row(0);" T$ W% s: d+ E5 p) O+ M O' F
when "01" => key_pressed <= row(1);
( j+ D! t3 S: X1 M3 _6 l when "10" => key_pressed <= row(2);; }! J6 t1 _0 p9 G: ]5 ?- n
when "11" => key_pressed <= row(3);/ m2 @; @* s! ^8 p
when others => null;( S1 X' T: W5 q# F+ r4 Q
end case;: R6 D) C Y' U' t
----------------------------------------------------------------7 y2 ^% A- S* a2 B$ o S
if rising_edge( clkm ) then
. T) a* i8 i9 | if key_pressed = '1' then --no key_pressed in, continue to scan
0 ?9 c9 X- v5 b scan_cnt <= scan_cnt + 1; h8 N3 o% A0 r% P# w' ]) Q" m
dbnq <= "1111111";2 F9 c5 w1 H }, c
elsif key_pressed = '0' then --key_pressed in
( s8 R ~8 [- ^- R4 C dbnq <= dbnq - 1;# \. T0 }1 {: l2 l( j3 O/ U8 S
end if;" {& O; K. ?9 V* x5 F6 v2 a7 T
----- debounce
. H n0 H( o& |9 m2 \ if dbnq = "1001111" then --key_pressed debounce
. l0 g9 l2 s7 w( f2 v key_valid <= '1'; ! _! {) I! d. L; z7 x
else key_valid <= '0';: s8 x$ j: E" s, V* ]; C, ]
end if; 3 `3 b# n6 H U1 Y7 v) n% n3 l
end if;, N3 b; c' r% a3 m4 w R0 r2 A
-- scan_out <= scan_cnt;
0 p$ @2 b$ V8 a" T% @+ N5 R end process;
. |8 L- D+ M* X" w$ t" b( Z# b---------------------------------------------------------------------------7 Z! F5 ~8 ?* p0 ?
keycode : process( clk, scan_cnt, key_valid )# c5 J3 Y8 A3 Y3 m
begin: b- r4 u3 P, J$ I! k
------------- asynchronous expression
) S. w1 q5 a7 |; O7 B4 F' U if key_valid'event and key_valid = '1' then5 B3 x4 R1 u% W& A
if scan_cnt( 3 ) = '1' then' J5 K3 e6 Q# F: d# k
cmd_flag <= '1';" g( w* U3 [& v6 m2 y- o) e
cmd_buf <= scan( 2 downto 0 ); --command store into ram
: f0 ]5 O" d) _ elsif scan_cnt( 3 ) = '0' then O! E& h, d+ Q1 }
num_flag <= '1';
4 D9 N" y9 p8 r3 ] num_buf <= scan( 2 downto 0 ); --numeric store into ram
2 A- M! S" \5 e5 O& C; Y else num_buf <= "000", --numeric store into ram
$ H5 B5 K2 y E) B/ \ cmd_buf <= "000"; --numeric store into ram
6 l/ c9 |1 g' H S0 r& k8 v5 F1 @ num_fleg <= '0';' E1 w1 _9 D+ \" B9 M& V) e4 i
cmd_fleg <= '0';- x ]7 R/ v# G6 P" a6 K
end if;: i$ g; g( y6 B! c7 B
digit <= cmd_buf & num_buf; -- out of key controller1 q( ?+ {8 _ T9 E6 r+ v
end if;
$ \- s1 @9 n/ w! P5 S( K end process;
5 W! Y& M* P+ X" W6 w) T------------------- 9 n- p {- N2 C
key_out <= key_valid;( R% @, j% L! e! Q6 u
digit <= seg4bit;
' j' y9 a( V4 \2 uend behavioral; |
|