Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 8406|回復: 2

[問題求助] VHDL輸入判斷

  [複製鏈接]
發表於 2008-2-10 01:18:35 | 顯示全部樓層 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
: 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;
發表於 2008-2-10 11:39:05 | 顯示全部樓層
說說看我的想法
* u/ E9 Z8 h! Q1 v# I- i
0 V8 M2 f3 o4 U設定一個 前進次數 的變數
  W4 k. k% J3 ]8 m* ndefault給1
! p& r0 n+ H3 _0 c' u' U6 h- u, J
: x6 X& n" R' ]! V5 D* I接著去抓你鍵盤的Input
& |7 ^  W9 O/ a$ |2 `7 Q* t% [& G只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉
7 F% g# a  A5 @+ b1 p5 F
' x) l+ h4 m; E/ B直到你 按下 前進   啟動了  前進 這個副程式
( L( P$ s2 I) x/ Q, q: p9 D) G這個副程式就會去抓  你目前  前進次數 的值
/ y( P  J6 G, E  J, V3 \開始做遞減的運算. a) ^6 n; W$ A
9 W+ E* e: ~8 ?( t( a8 F
每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)/ s8 X* F5 r6 F4 V% }+ S. D
直到那個前進的次數到達時
  R+ a8 e0 U* o" E, f前進的 副程式就會停止動作

評分

參與人數 1Chipcoin +3 收起 理由
masonchung + 3 言之有物!

查看全部評分

 樓主| 發表於 2008-2-10 14:41:54 | 顯示全部樓層
真是非常感謝你的意見4 i, x9 M3 h. S# z+ p
) v. q- }! E7 s1 B) W: Z
希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-3-29 08:01 AM , Processed in 0.111006 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表