|
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值% c2 ~" Q7 X" S
( d ?8 H. F/ A5 R8 S( w6 C! Q這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
( v; g- G' \! l7 P- W; J% Z- B1 h; [' T' ^" k# T0 r- ?4 Z# l
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值): @6 \ u# ]) [8 l+ E# k
- x* m, R) N) [
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
. i# M. d: e9 h/ p! ]7 z6 Z4 Y: K$ B4 f. G' w! P
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!" _3 W4 t1 A% ?* r" L+ j* ~ {! |/ B
+ D1 V7 F! Y5 U: O
library IEEE;5 @7 Q& ^+ K R) Z2 a
use IEEE.STD_LOGIC_1164.ALL;
% Y8 c4 |- c3 C& wuse IEEE.STD_LOGIC_ARITH.ALL;3 N0 R1 `! G! R0 V
use IEEE.STD_LOGIC_UNSIGNED.ALL;
8 E5 h6 _* z+ b' n. cENTITY key_controller IS* b3 l+ C$ ]9 u9 B
PORT( 9 V$ r# i5 D6 Z' r) c& D. N% w
clk : IN std_logic; Z5 `! n( i3 Z# g/ L3 E
col : OUT std_logic_vector ( 3 DOWNTO 0 );
$ q6 o, Q5 S" j! c9 F8 |& d. d key_out : OUT std_logic;0 N6 T/ t4 {/ o! Z1 {
row : IN std_logic_vector ( 3 DOWNTO 0 );
3 V& R/ E0 b3 j) }+ c. m4 T digit : OUT std_logic_vector ( 5 DOWNTO 0 )& q+ Y L& l/ n' S4 f7 n
);, C: n' t0 u8 r6 E
END key_controller ;3 ?& p. H0 M+ y
architecture behavioral of key_controller is
' O' ?' N' Z; @( csignal clkm : std_logic;
+ k$ r; s. x/ Z% f- D, Nsignal key_pressed : std_logic;/ Z& K" Q% \" D' A
signal key_valid : std_logic := '0';
5 v! ^3 Q' ~9 M% E2 V* z# M$ i& Vsignal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce
. F+ d; R- d& x7 B8 ~. `: Usignal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
0 Y3 L( `% ~ \# osignal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
0 m& R1 G+ J. c$ jsignal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
" b! B& ?( }! E3 Ebegin
) v6 N* |+ X% Ncount : process( clk )( l$ w' z+ O! t, j$ A5 V
begin* y; ?4 k" C+ q# I( a
if rising_edge( clk ) then
, g* |7 n& x2 \6 M9 R6 S count_t <= count_t + 1;( D% @2 Z" N: V* V
end if;) U# e% ^# C+ y; }4 { ]
clkm <= count_t( 15 ); --scaning clock generaterd
^5 N6 H* q/ k9 M N- u/ n9 _ end process; 6 g/ Y' F9 ^" W% b i: E3 ^+ I
-----------------------------------------------
7 { v# f" e7 u/ k% |, akeyboard: process( clkm, scan_cnt, key_pressed )- x* c9 |2 E) H6 n3 N, G
begin
' W/ G+ M2 h1 V2 }, j--scan_cnt is a 4 bit up scan counter * c' u+ o! a/ a0 v6 i; n7 Q9 |
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional + B1 }& R# f5 T" W- I3 d
when "00" => col <= "0111";
3 j! z% G6 \8 j( N5 U9 ~' W when "01" => col <= "1011";8 _: {" ?) F2 M0 j, h6 f
when "10" => col <= "1101";5 x8 x9 w7 l* @+ G5 R) S% \. ^) N
when "11" => col <= "1110";2 |: Q0 t/ y: [ H- t8 ]
when others => col <= "1111";
; L" N/ d: c- ^8 y5 n `; B% Z; I end case; S% s6 D# h% b0 E0 Q" E
---------------------------------------------, r( r0 [, W% j% p
case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
2 _8 n1 G1 S0 n% C- |% U when "00" => key_pressed <= row(0);$ t. j' U' J& F9 b7 D
when "01" => key_pressed <= row(1);
7 r2 A/ J/ |, t8 b% B when "10" => key_pressed <= row(2);
7 f5 g" x8 H/ V. R when "11" => key_pressed <= row(3);/ a/ q9 E( }' Y, M" e0 o) k0 v
when others => null;
( D, @- V" m9 K( O end case;
5 G: C( [9 [+ b' A" h0 y, b----------------------------------------------------------------
. O5 l r+ t# a7 G" Z0 R if rising_edge( clkm ) then
5 ^6 {, K8 \+ w" R! ^$ I: _& @ A4 ^' d if key_pressed = '1' then --no key_pressed in, continue to scan
! c3 ^5 m9 v: _8 d5 C scan_cnt <= scan_cnt + 1;7 w0 z: U% m$ L# n
dbnq <= "1111111";
- ~; Y3 q$ _1 S5 m0 P0 O; ?3 D elsif key_pressed = '0' then --key_pressed in K% o& |. g' @7 p) l& m8 V5 b! S
dbnq <= dbnq - 1;0 t M/ M3 N# a2 W9 [
end if;0 ?. F. s* K+ ]1 i% A
----- debounce
- P* b J; e# B if dbnq = "1001111" then --key_pressed debounce1 c/ r1 _: P8 z# @
key_valid <= '1';
5 ]) L, Q1 b9 s0 n7 p5 [ else key_valid <= '0';
" D. V1 O- P+ z9 R K9 M G* z end if; & h6 E; l* ?" |, b4 K. \
end if;4 `: e7 r; @) i" _0 E3 W/ z+ P
-- scan_out <= scan_cnt;
R/ s5 j/ n& R end process;! a; C: w8 D6 ]: b
---------------------------------------------------------------------------
2 `& C! c8 `: H3 T$ @keycode : process( clk, scan_cnt, key_valid )
, O+ y4 o2 {- o3 m! c begin
. }. a3 F9 h% p1 L------------- asynchronous expression
$ y \. L2 [+ {/ |/ B/ f if key_valid'event and key_valid = '1' then
* J1 c0 }+ N% F& ?% [- T. C2 I if scan_cnt( 3 ) = '1' then. w4 _$ b2 q& e7 Q( ]
cmd_flag <= '1';
; j0 B. w) e: X, r9 q cmd_buf <= scan( 2 downto 0 ); --command store into ram" W# ]) f( f* }7 w
elsif scan_cnt( 3 ) = '0' then) e0 G! V v: C% T; z$ s! `9 z
num_flag <= '1'; 2 Y1 \9 D" l9 ?* Q" C
num_buf <= scan( 2 downto 0 ); --numeric store into ram# V {7 z9 I5 H a# ^ d9 [
else num_buf <= "000", --numeric store into ram
# Y8 U2 i# U& `) B4 v cmd_buf <= "000"; --numeric store into ram2 D$ ?& Y' y @# D+ x2 R# E
num_fleg <= '0';' d8 z5 r6 I9 g; T$ s* m! ^
cmd_fleg <= '0';; i4 B$ T5 K0 B/ R8 P* u
end if;# D! L" ~: P% I) S
digit <= cmd_buf & num_buf; -- out of key controller" b6 L" ^% c) q8 ~) B v/ K
end if;
8 \: E; f% {1 U3 t end process; 8 _) Y/ d; G0 E2 A! u' j
-------------------
9 g: S ^, m6 X key_out <= key_valid;
6 v* }3 j. _( I$ o. T: E5 _ digit <= seg4bit;3 H$ r c- t0 e+ a
end behavioral; |
|