Chip123 科技應用創新平台
標題:
VHDL輸入判斷
[打印本頁]
作者:
w10789173
時間:
2008-2-10 01:18 AM
標題:
VHDL輸入判斷
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
4 b. f- Q: f# F8 u% ], a* R! R
. { j' r' O& `1 c; N% {+ O- C4 w! `
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
; x- Q/ w; ]4 y; d5 o" _! J# r
! {6 k; p2 `: g$ o/ T$ w
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)
( A* H* s" @. K1 V* r0 n0 i, O
8 r2 [9 D9 L% a- C* O" G
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
9 [# J- _: @1 \( p
6 U% P9 F4 d! a, D4 C
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!
$ N. t6 l! [- j; r* \! T# r7 D d
" S/ z5 T* H; h0 V+ {7 M
library IEEE;
E, A' k' x3 ]
use IEEE.STD_LOGIC_1164.ALL;
2 W) Z, D) S2 a6 t; G
use IEEE.STD_LOGIC_ARITH.ALL;
9 O7 F- D) k4 z# Z
use IEEE.STD_LOGIC_UNSIGNED.ALL;
' X4 U- C% C- d
ENTITY key_controller IS
4 e; q0 D; n: L4 S+ F1 g+ L
PORT(
& s, i- o2 q3 K# p/ m! t
clk : IN std_logic;
* O, w( N: ]0 I4 g; Q
col : OUT std_logic_vector ( 3 DOWNTO 0 );
7 t9 Z7 p1 d8 g# Z
key_out : OUT std_logic;
- K! o; j1 l. ~
row : IN std_logic_vector ( 3 DOWNTO 0 );
3 b5 ?* F" o5 R6 R3 a0 Y; n
digit : OUT std_logic_vector ( 5 DOWNTO 0 )
" p9 w1 z. L' \4 R/ _& s
);
! M0 a" C0 z& e7 [; Y/ ]0 t
END key_controller ;
: R1 Q/ q+ i; ]) G% T( \: G+ a
architecture behavioral of key_controller is
% K+ ]+ _" _# U
signal clkm : std_logic;
' A$ ~3 o* ]( M, [
signal key_pressed : std_logic;
8 h4 \+ Z- g# x! i! M/ I) G: n
signal key_valid : std_logic := '0';
6 W& U/ {* h# s3 B9 L
signal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce
' {0 m5 k8 J+ {2 v; K% W1 _! y
signal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
) l' ^4 ^" U2 x- ^
signal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
% f" }; |- f4 D7 W; g; ^
signal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
, b6 _' _+ v2 Q8 T
begin
8 T" O7 \. M$ ?, k9 `' T( |6 ~
count : process( clk )
+ L7 t, G( J( E$ c- B }% B
begin
% ~( N) F! g: {
if rising_edge( clk ) then
P* p0 X0 E. E0 R% x" e+ C
count_t <= count_t + 1;
' t; q7 e5 g+ e/ A' x' l# w0 ?
end if;
t9 E2 n+ r5 n2 G7 J( r
clkm <= count_t( 15 ); --scaning clock generaterd
3 U* Y4 X7 S, P
end process;
2 @7 i* b. n. x. r
-----------------------------------------------
7 Q1 y- l' f- S- f! j8 a$ D2 {/ \# B0 Q1 @+ w
keyboard: process( clkm, scan_cnt, key_pressed )
. ~; G0 l* n9 k5 ~; o
begin
; w) f- I/ g# E# k/ ]8 F
--scan_cnt is a 4 bit up scan counter
6 ?2 m b# K3 q7 h. Q* }- y& v
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
+ y' b7 T6 H( h2 A3 p8 y8 u" J9 ?
when "00" => col <= "0111";
+ b" i4 D; }+ s- d
when "01" => col <= "1011";
& M; q+ f4 E/ i
when "10" => col <= "1101";
" m/ K4 l6 X1 g: ?* ~9 H
when "11" => col <= "1110";
H( d3 u0 L8 V
when others => col <= "1111";
" w% d& [ [; x7 e# D
end case;
" p* R+ X/ Q+ m: G8 d
---------------------------------------------
) _$ J! [# c1 s3 ?0 ] ~
case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
2 p! j2 G( \0 l* F4 r: K% g0 U
when "00" => key_pressed <= row(0);
& b1 J$ V: o- e u" J) v3 F
when "01" => key_pressed <= row(1);
' d1 t8 U; W# S3 W; N, r
when "10" => key_pressed <= row(2);
$ U+ @7 [& H( i' u; u/ l
when "11" => key_pressed <= row(3);
9 g. q. {6 N0 g8 [! Q6 N
when others => null;
% d% f: G2 w, v2 m# h! t
end case;
* G7 }8 Y! ~- o: s1 ? u7 F
----------------------------------------------------------------
' E2 n6 q; V) [, u
if rising_edge( clkm ) then
2 c- ]* a |3 l5 i1 V6 D9 J! y, n
if key_pressed = '1' then --no key_pressed in, continue to scan
$ \1 t! f: q+ l1 I# e; e. f9 j
scan_cnt <= scan_cnt + 1;
. {3 I* I1 M5 h
dbnq <= "1111111";
# v, D. k$ R2 f5 r
elsif key_pressed = '0' then --key_pressed in
5 j7 |7 e9 _8 \* k- ?
dbnq <= dbnq - 1;
3 E' q* @$ f2 B0 h, @% T$ i8 e. _, J
end if;
/ C( B3 m7 z& D5 i$ A
----- debounce
8 w$ n. I/ ^- s4 M5 e: u
if dbnq = "1001111" then --key_pressed debounce
; K+ G" {7 E3 v4 u" b3 Z0 h6 I
key_valid <= '1';
9 T5 I- }- b* p! \
else key_valid <= '0';
! n" o7 X) g1 t& ` f1 A
end if;
! r0 p$ x8 N+ X6 M- B
end if;
7 s0 M) a3 D r a ~9 h) N& o l0 x
-- scan_out <= scan_cnt;
* M) d/ T: A: R1 [' u
end process;
; ]. Y. f1 T0 H. p3 U% n6 t
---------------------------------------------------------------------------
" X$ {+ @) i& q
keycode : process( clk, scan_cnt, key_valid )
- g" v1 w. R9 Y6 q
begin
9 r& s7 j' ]8 z) d q& [
------------- asynchronous expression
( G3 f' i9 [/ ?, L; Y4 o7 t* w [" f
if key_valid'event and key_valid = '1' then
8 }- z' u- P; Z( b: X9 ]; ^$ r
if scan_cnt( 3 ) = '1' then
8 y' }; R3 o, P1 S0 l
cmd_flag <= '1';
; O* `- Y- C2 I& ~5 B/ C; y
cmd_buf <= scan( 2 downto 0 ); --command store into ram
% C! D2 q3 S4 f' B
elsif scan_cnt( 3 ) = '0' then
0 M$ m8 v2 p, [! ?
num_flag <= '1';
, D, u, q0 G" Z
num_buf <= scan( 2 downto 0 ); --numeric store into ram
/ j- R3 k( [- h+ ?* n, y
else num_buf <= "000", --numeric store into ram
/ I' L# ~$ E1 F/ c* j' e
cmd_buf <= "000"; --numeric store into ram
w. R4 L. H6 R. m0 E
num_fleg <= '0';
/ m1 D+ \4 s1 N) x9 B
cmd_fleg <= '0';
, T4 e. ?/ m1 U1 z* C
end if;
v) D- ^9 r& }. @2 [
digit <= cmd_buf & num_buf; -- out of key controller
" g7 F8 v. Z1 t; Z
end if;
. p6 M! E; V" H A3 _1 V' f
end process;
& E, a, |2 H1 L- L
-------------------
% A& x1 [4 |( J" H: X* N' `6 @
key_out <= key_valid;
- U1 Q3 B# A; G3 v
digit <= seg4bit;
; J2 E2 N0 c8 Q8 F& f" H
end behavioral;
作者:
yhchang
時間:
2008-2-10 11:39 AM
說說看我的想法
8 ]6 g) E! r1 ?" S$ N. r: Q
! G# N7 J& V8 T4 h' T
設定一個 前進次數 的變數
' `5 Q: o0 @. Q! x; g+ p% Z. t* c
default給1
9 ~0 v5 J/ b2 E# ^# j
; }' U. G2 o# F s
接著去抓你鍵盤的Input
, I/ d2 n6 E3 r' @% d/ U
只要有數字出現, 就把 前進次數 的 value 用現在的input 取代掉
& Q H5 N4 U; @
% h0 z$ e* [2 Y
直到你 按下 前進 啟動了 前進 這個副程式
! f3 Z! b, X/ V3 M
這個副程式就會去抓 你目前 前進次數 的值
9 r' l# o; p! \+ L: b# a8 }
開始做遞減的運算
4 `0 G, M* n% f& i: T
z+ _' }& |; k+ \9 G+ B
每前進一次 這個變數就會減1 (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)
$ x: n! B+ d$ g/ b4 b
直到那個前進的次數到達時
4 {- x8 M8 w1 O! U
前進的 副程式就會停止動作
作者:
w10789173
時間:
2008-2-10 02:41 PM
真是非常感謝你的意見
- c$ r% z* C6 l- P: A+ n* R: c
( m6 i7 g0 b9 `& j; t6 O6 P
希望以後也還請多多的指教!
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2