|
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
: R- N6 h; b; S: a% x+ {% t. M) C7 C% D. v+ Z
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次" ~2 [7 h0 Y* [% ?/ A8 j* \
7 D% G* t% f: t9 Q/ i
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)$ y F+ H' L6 P" R; `0 l
; m$ z; t7 ~* x, I
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
2 f6 [: p1 W# t s: x- R" l) l: G; ^3 U
. @3 y9 a7 x1 J3 L6 E現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!
" M) O$ g6 ~! C8 v& h
' f ~$ Y. v& F G6 G# h8 ]6 rlibrary IEEE;
. U4 B( K! s( ]; |use IEEE.STD_LOGIC_1164.ALL;, P; w4 G9 p- o9 `: g
use IEEE.STD_LOGIC_ARITH.ALL;
' Q2 s, D7 I+ U, h2 `* @/ @use IEEE.STD_LOGIC_UNSIGNED.ALL;$ g! z& w. C0 Z! `1 r f9 e# K
ENTITY key_controller IS" J7 \, Y+ [1 w! m' c
PORT(
- K: e& `! |- `* o- Q) k; J+ `, s clk : IN std_logic;9 n5 M5 x( B8 @' P, a0 q) p9 r
col : OUT std_logic_vector ( 3 DOWNTO 0 );
! K& k& }( g& o key_out : OUT std_logic;% L- B9 ?: n1 \2 I. b2 W
row : IN std_logic_vector ( 3 DOWNTO 0 );! ^4 G S0 N7 i
digit : OUT std_logic_vector ( 5 DOWNTO 0 )* f; L/ h1 g9 C" b
);
/ \7 `$ |" Z4 e; UEND key_controller ;9 O' O# ]" O! T2 n3 X$ v2 z0 N
architecture behavioral of key_controller is
- Y' O; p+ w/ x4 j6 D7 asignal clkm : std_logic;6 g$ G' X2 I0 F o) Z; z) D
signal key_pressed : std_logic;
" }* ^7 {0 Z& A# A; V& L9 j& D" @- \signal key_valid : std_logic := '0';" t# n; ~4 r9 x* E5 }. F
signal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce
9 B7 V$ J+ P H: xsignal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
6 b! ` Y, X" [1 r) H! @signal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
. b L/ w; r& Z! R. psignal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
' X7 K7 n, W& G1 {begin
, j! w- h. v. i1 H, p) V n# Gcount : process( clk )
( C) `- A1 p W6 x begin! }3 e4 B- T) H; e* N
if rising_edge( clk ) then c+ u5 b7 R* a' E2 @1 S) {* b
count_t <= count_t + 1;8 k: ?3 s/ X7 z' A, b; |2 U8 h
end if;
; E1 }2 P, x8 ~6 f% a, q( E clkm <= count_t( 15 ); --scaning clock generaterd6 |: Y3 Z- l2 ~! {- I
end process;
+ q9 d; @! L9 }( z0 Y----------------------------------------------- |2 u, O/ \3 I$ D
keyboard: process( clkm, scan_cnt, key_pressed )
/ P- G1 ^8 L& a1 \! Z9 @0 nbegin8 u7 r4 x( R, T! ?
--scan_cnt is a 4 bit up scan counter 0 {" y$ }% D9 I' B! O+ ~# E9 ~
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional 4 e+ ~$ B# s" @+ s) j+ v# B- h
when "00" => col <= "0111";1 q$ J* O. J! M( j2 l! x/ L
when "01" => col <= "1011";% P. U$ _2 L9 H: M2 [
when "10" => col <= "1101";5 O% u3 c& l8 C
when "11" => col <= "1110";
8 ]& g% c' j) _3 ~ when others => col <= "1111"; # S# ^/ x# L' Y/ I
end case;) _2 d4 i8 H, f: b2 p6 K
---------------------------------------------
) N) O; w1 L( K$ h+ A9 @( d case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional0 F; s/ z! d% s+ w
when "00" => key_pressed <= row(0);6 U; e9 h5 r4 H* H1 g. z. }
when "01" => key_pressed <= row(1);
! \2 u/ ]3 A1 T+ C3 C when "10" => key_pressed <= row(2);2 Z1 x2 v8 G4 [$ |7 X8 B
when "11" => key_pressed <= row(3);, {, v5 g. V; }4 e3 d1 E& d* C
when others => null;
3 P; X; T8 g9 l5 M; I# H7 d7 q end case;; h/ U" @) r: ?+ w: i* a
----------------------------------------------------------------
& a' K! q; ?( ^0 E; ~8 @6 k if rising_edge( clkm ) then 6 O) j6 c+ z6 o' z5 d
if key_pressed = '1' then --no key_pressed in, continue to scan
) T& Z$ a, j6 B* {2 V h scan_cnt <= scan_cnt + 1;+ W3 J, w# V( ~1 t4 n% Z+ z8 l/ Y4 {
dbnq <= "1111111";
/ z: {" s! t. K$ A9 p. l: G elsif key_pressed = '0' then --key_pressed in: F4 t) e& B4 ]- L7 ^) m: a2 K. P
dbnq <= dbnq - 1; w; q( m$ s" ^: d2 \! ~
end if;
2 Z8 F' N) f: c3 s- t----- debounce ! Z. S& V7 u3 _) n; b4 ?% }6 v, L* I @9 {
if dbnq = "1001111" then --key_pressed debounce5 c: N. q) G0 r4 J- V9 ^- j; D4 r
key_valid <= '1';
, z4 @: F5 E- ~: J! o2 U0 S else key_valid <= '0';3 n& g G+ ]7 }2 @
end if; & a8 _/ q6 t# D
end if;. q! p& x/ Q" x7 d" A3 \: S
-- scan_out <= scan_cnt;
" C$ g5 d# v1 g6 G2 d3 v end process;) s5 f" `+ h [' w( Q7 H( |% ?: e
---------------------------------------------------------------------------
! x/ K+ \) ~7 Vkeycode : process( clk, scan_cnt, key_valid )
6 U. s5 ^$ {& W$ c begin
9 g! v# q k+ e2 s8 @! m------------- asynchronous expression7 R9 W$ d( K, T1 b. I
if key_valid'event and key_valid = '1' then
; s% \6 E' q- x2 s/ ?2 E' m% D( q if scan_cnt( 3 ) = '1' then; g* E) k0 h# K: q1 `5 `* A
cmd_flag <= '1';6 B& H0 w1 U4 S& E+ T
cmd_buf <= scan( 2 downto 0 ); --command store into ram
. j9 \8 ^2 M& d. N& }& b& t/ }7 _ elsif scan_cnt( 3 ) = '0' then5 q {' j/ y* A$ J* o( p5 m4 f
num_flag <= '1'; & }1 t9 M: _, W! [6 v2 A
num_buf <= scan( 2 downto 0 ); --numeric store into ram1 a' X8 k/ u# U% ?
else num_buf <= "000", --numeric store into ram
( e+ w W* S2 P0 L- K! M5 R. e5 j' g cmd_buf <= "000"; --numeric store into ram: F: y4 Y. Q; b6 ?
num_fleg <= '0';
$ ~# ? m/ f; p- r, \, T4 a F cmd_fleg <= '0';
- U6 N- \3 M1 H, J end if;( t, a; c) i- p
digit <= cmd_buf & num_buf; -- out of key controller
$ J* R+ d9 b+ k( G end if;
- u& I' c5 Q8 T) k# ] end process; 2 h1 w% [, f! N# d: q5 |) G$ J
-------------------
) T0 m! S- w5 I# G key_out <= key_valid;5 f8 Y. z2 x5 J9 b' d5 q
digit <= seg4bit;0 T1 P9 @, D K* V1 s
end behavioral; |
|