Chip123 科技應用創新平台
標題:
VHDL輸入判斷
[打印本頁]
作者:
w10789173
時間:
2008-2-10 01:18 AM
標題:
VHDL輸入判斷
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
9 K, [6 m7 j- s. `# m
/ ^7 q% a( G& \; [' `/ Z
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
' y& F6 \; T% f+ T
2 C! m. v) w: ]0 n* T' e5 ]
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)
% d' S; _/ ~% m1 i2 `4 C+ }: P) Y
: m5 g% ?9 K# w1 H
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
. w9 Y5 Z9 k9 ]$ z0 C- p2 W/ |
3 |/ O; t( _$ C6 J1 w9 q2 Y
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!
% W/ J2 j0 V: Q) ^6 U
' B- q$ {% H) y9 |2 N. o+ _. L
library IEEE;
: b% T% W$ D0 Q! { m
use IEEE.STD_LOGIC_1164.ALL;
# _) O) A1 E& {8 r: Q
use IEEE.STD_LOGIC_ARITH.ALL;
4 x+ O7 w4 y* m( u& s' e, F/ o5 }
use IEEE.STD_LOGIC_UNSIGNED.ALL;
0 D. R3 ?. [! |
ENTITY key_controller IS
' g! x# {' p4 A. S$ S
PORT(
1 \7 ~0 I" |4 k! Q3 L
clk : IN std_logic;
: R- V, q3 P! _" A( B4 e, I
col : OUT std_logic_vector ( 3 DOWNTO 0 );
$ f# ~- C8 x/ W: [3 K1 P
key_out : OUT std_logic;
O3 Q" z* f+ |: `
row : IN std_logic_vector ( 3 DOWNTO 0 );
$ e% j8 t- y* S0 y! ]: r
digit : OUT std_logic_vector ( 5 DOWNTO 0 )
# c/ R! _. ?8 @7 ~* t: a
);
; ^; v% ?* K! ?
END key_controller ;
; w8 Q, Y+ ^0 k/ Z% _* Y
architecture behavioral of key_controller is
c8 e7 A: C f% _4 i
signal clkm : std_logic;
8 B6 p* s: ~/ O* ?
signal key_pressed : std_logic;
& ?) ?& s5 ]- ]( h) f( N
signal key_valid : std_logic := '0';
! d$ r- ~) H" V
signal dbnq : std_logic_vector( 6 downto 0 ) := ( others => '0' ); --debounce
6 ~7 t3 f' m8 |* O1 `) U) I
signal scan_cnt : std_logic_vector( 3 downto 0 ) := ( others => '0' );
4 }) ` V* n# N& C- ]
signal cmd_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
1 M9 T$ O6 S! F' Q1 n0 f
signal num_buf : std_logic_vector( 2 downto 0 ) := ( others => '0' );
2 i) S2 b* p" g# f* ]# K- p
begin
7 l: w8 n2 u q& }
count : process( clk )
$ n7 ?; e# z$ q$ O; E
begin
+ ?9 j! x/ J* y+ s
if rising_edge( clk ) then
3 M* h) ?) O' N {& R
count_t <= count_t + 1;
: @6 k) l/ P/ Z+ G# ^+ j
end if;
: z4 j0 J# }7 F# z7 B2 g/ C
clkm <= count_t( 15 ); --scaning clock generaterd
/ e) F4 j- o G6 E1 A$ e' _
end process;
7 t G& a2 g4 \2 k$ l- ]* y
-----------------------------------------------
0 d8 G, b' R% [2 I' e# C9 [% v! O
keyboard: process( clkm, scan_cnt, key_pressed )
9 N2 n! T9 s4 g# _
begin
+ M" z, o# Z: x- O& }- m& [1 M
--scan_cnt is a 4 bit up scan counter
/ C7 w, ?% X x5 b5 v4 e7 r5 H
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
' Z5 V4 P5 \5 ?: D, @8 k$ l
when "00" => col <= "0111";
7 ]& H' \! v8 \- D
when "01" => col <= "1011";
8 g( h2 T/ e# l
when "10" => col <= "1101";
' l( p$ z( j& c
when "11" => col <= "1110";
! T& e2 A, p/ V8 t9 w5 S* y0 ?
when others => col <= "1111";
4 d' x( g, N5 L: E9 v
end case;
1 ?/ Z8 `/ K1 K% S5 z0 f
---------------------------------------------
& k9 o% B& t0 I0 I
case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
& P' }5 Z& k/ E. _$ g9 f% u
when "00" => key_pressed <= row(0);
- {5 O F- a, T- y
when "01" => key_pressed <= row(1);
1 t+ \0 ?& A" M4 f$ ^; y
when "10" => key_pressed <= row(2);
& W$ a) n+ B) y
when "11" => key_pressed <= row(3);
, \! K! s0 B* K) d
when others => null;
0 u: K- ]( i+ i! y4 {/ R& [
end case;
9 Z6 c" N1 N+ X
----------------------------------------------------------------
& w* G) _7 B4 R3 _. Y" ~
if rising_edge( clkm ) then
+ f \9 |1 u- L
if key_pressed = '1' then --no key_pressed in, continue to scan
" J- ^& s2 O1 |$ C% x4 z
scan_cnt <= scan_cnt + 1;
* ]+ |/ v2 e/ ^$ M1 l
dbnq <= "1111111";
; T$ w! t# f/ I2 Y4 W3 { U
elsif key_pressed = '0' then --key_pressed in
) m9 R) d3 v0 t, e
dbnq <= dbnq - 1;
+ L% q7 T# y: f9 }' f
end if;
; n2 H) |' s# w* e& h
----- debounce
% a! f3 j6 i% h
if dbnq = "1001111" then --key_pressed debounce
6 q7 K9 B1 v# e
key_valid <= '1';
! U- X r6 X3 T
else key_valid <= '0';
- r% m7 h) x' q5 F$ F' p/ x
end if;
; R3 a3 K% L1 _" U% h
end if;
: V/ G) f* p4 E; Y6 ?
-- scan_out <= scan_cnt;
3 ^/ k; L2 z$ ~# H
end process;
. ^% y5 Z1 q7 q2 i: D
---------------------------------------------------------------------------
* ^+ t% k7 K0 G% a: T
keycode : process( clk, scan_cnt, key_valid )
# _. s5 y$ _9 y7 H
begin
* l2 i6 }$ ^0 r3 l# {, R
------------- asynchronous expression
6 r- m9 j& e) \% r9 O. b
if key_valid'event and key_valid = '1' then
, B2 K. E: f7 k) L0 l
if scan_cnt( 3 ) = '1' then
+ m, C. H1 W* ~. v6 P
cmd_flag <= '1';
. }% G- a u% L
cmd_buf <= scan( 2 downto 0 ); --command store into ram
" W% ~. d& @ J ]3 ~
elsif scan_cnt( 3 ) = '0' then
( t3 `$ D+ D- l$ q" r+ f* x
num_flag <= '1';
" m+ e8 x5 M+ t( {7 o5 S2 U2 u2 z
num_buf <= scan( 2 downto 0 ); --numeric store into ram
% F% r! o8 u9 h4 |8 V4 J# T
else num_buf <= "000", --numeric store into ram
- q7 Q0 D) N3 S
cmd_buf <= "000"; --numeric store into ram
. H+ N7 F0 a9 x
num_fleg <= '0';
8 U' e9 h+ E$ Q- S0 L$ T: `9 U$ U, t
cmd_fleg <= '0';
3 H1 p7 A ^$ N; v$ G4 o) v! W
end if;
5 m" x5 v1 |! K. m: M* S V
digit <= cmd_buf & num_buf; -- out of key controller
0 b- r5 s6 W$ f6 v2 x: A3 J; q' Z7 b
end if;
& K# K- s0 Z4 `0 q4 }3 A' z4 h
end process;
+ e* N, `( V. q2 F4 @2 H0 J3 m7 U
-------------------
9 b' @6 ?3 f9 B! \3 t
key_out <= key_valid;
7 V! n% I9 F' R- e" B6 x. _
digit <= seg4bit;
% t" z& d* b. b$ \# R9 T1 P
end behavioral;
作者:
yhchang
時間:
2008-2-10 11:39 AM
說說看我的想法
/ j3 Q6 Y* R- N- @1 G. {: ^( {
6 l' X) C* T6 J5 `2 i2 B, ?* O8 l
設定一個 前進次數 的變數
/ }; l% \$ y1 s; q4 d" G
default給1
# i; b8 P: L0 S8 W3 t3 u
7 A8 D# R6 o$ \$ T1 N
接著去抓你鍵盤的Input
5 t% Z) L0 u! Q
只要有數字出現, 就把 前進次數 的 value 用現在的input 取代掉
3 K9 X8 T. q, g) K, `" q5 w" g
9 A# v5 n" u: K+ J
直到你 按下 前進 啟動了 前進 這個副程式
+ K5 B5 k0 g; y0 R! C6 S5 _3 o8 _/ T
這個副程式就會去抓 你目前 前進次數 的值
" H7 }. d7 ~; X5 i3 q/ T
開始做遞減的運算
, L% ^# l# k% x4 z5 O
5 k n) g: I5 u# S
每前進一次 這個變數就會減1 (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)
6 F9 {. f4 F9 A" r# A; J
直到那個前進的次數到達時
$ X: R3 `: C% Y) N2 k
前進的 副程式就會停止動作
作者:
w10789173
時間:
2008-2-10 02:41 PM
真是非常感謝你的意見
" g( i+ W; @( ^) l3 @- u* }+ Z
$ S8 n- ~' s+ P: L& ^! n6 \
希望以後也還請多多的指教!
歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/)
Powered by Discuz! X3.2