Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 9108|回復: 2
打印 上一主題 下一主題

[問題求助] VHDL輸入判斷

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-2-10 01:18:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
1 I2 _* E: L7 x; t; G; @- v( f, l, Q- L, U0 e
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
/ i9 f' Z4 x# e0 v0 a' c* j% l5 S( q0 r8 Z4 j  |' h
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)( m+ j, }- W; c

- j* y2 C7 m8 P: G當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數6 |" ]8 G* T$ n( w$ B. t
! b2 l% Q6 v/ q
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!: W' m# F& i6 _6 B) }, f
% A. X4 n* k# e% ~! N  b' v
library IEEE;& |' X3 V. j; s$ h) {; Y
use IEEE.STD_LOGIC_1164.ALL;
% y2 p* v* D& H1 O8 Yuse IEEE.STD_LOGIC_ARITH.ALL;
/ Y1 n. P1 f8 ], v1 Z2 e" X: ouse IEEE.STD_LOGIC_UNSIGNED.ALL;+ z. a5 W+ W, u, q# c1 F
ENTITY key_controller IS& d; n: l/ u% `8 n
   PORT( : V+ `% Y6 b( U+ I/ y
      clk     : IN     std_logic;
( L, T8 L4 t. O      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );
6 ?8 Z5 o' W" [) y  B      key_out : OUT    std_logic;
  p5 G) c1 M6 Q2 K      row     : IN     std_logic_vector ( 3 DOWNTO 0 );" H4 G9 m) D5 }
      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )! X6 U6 P' I: C
   );
& t8 G) [, i5 OEND key_controller ;
# U& O3 F) A2 c6 B6 Barchitecture behavioral of key_controller is
1 U" Q; i( [9 V0 x3 P; Usignal clkm        : std_logic;% c  n% E, W6 t" ]' }0 @- o7 k! Q
signal key_pressed : std_logic;  S3 L: K1 _. R2 O1 e9 P( m
signal key_valid   : std_logic := '0';, O" `" s4 C3 B* m1 z
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
* Z" Y- Y/ j; J9 _7 [signal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
% e- g, {" l, y1 C" R7 n0 E$ hsignal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
% Z, f  R) R. S: b8 E* jsignal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
+ [' r& q0 f: p, h  `8 g  ]begin. {4 c$ y9 |0 K2 b' y* v, E
count : process( clk )
: n7 v/ z, ?/ R5 ?& ?( ?1 e  begin
0 U# L% W  s  b) |) y    if rising_edge( clk ) then
; e" O! r5 g/ I       count_t <= count_t + 1;
1 c& z' x8 ~6 g4 T    end if;
2 i0 K+ R  o" C  x1 K    clkm <= count_t( 15 ); --scaning clock generaterd$ m, V1 u. K. ~( y6 X- A& {8 E
  end process;  7 Z, v* a% b7 O/ A# Q
-----------------------------------------------# i8 C- b5 T" R2 j- i
keyboard: process( clkm, scan_cnt, key_pressed )/ Q+ g6 l* m) R9 a5 R6 h
begin
( p- x1 x6 W) ^* N! S; Q--scan_cnt is a 4 bit up scan counter  
( w. e. M3 Y2 y: M: _! c case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
  P* ~  j8 O# T3 j1 O' _8 Q# O when "00"   => col <= "0111";
5 x# o! r$ y) g- j$ t  when "01"   => col <= "1011";2 j& B' B: p! h) b
  when "10"   => col <= "1101";5 A$ n# x( n0 `9 s
  when "11"   => col <= "1110";( p! P8 J  K3 s6 J7 t0 N5 m
  when others => col <= "1111";  
  Z" `7 D5 f- p0 p0 ?1 Z. p, `% l: D  end case;
+ j1 [6 M- W: _4 N   ---------------------------------------------
' u( o' ~6 o: \5 d  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional& N* c( @/ ?# W2 b  R
when "00"   => key_pressed <= row(0);" T$ W% s: d+ E5 p) O+ M  O' F
when "01"   => key_pressed <= row(1);
( j+ D! t3 S: X1 M3 _6 l  when "10"   => key_pressed <= row(2);; }! J6 t1 _0 p9 G: ]5 ?- n
when "11"   => key_pressed <= row(3);/ m2 @; @* s! ^8 p
  when others => null;( S1 X' T: W5 q# F+ r4 Q
  end case;: R6 D) C  Y' U' t
----------------------------------------------------------------7 y2 ^% A- S* a2 B$ o  S
  if  rising_edge( clkm )  then
. T) a* i8 i9 |    if key_pressed = '1' then --no key_pressed in, continue to scan
0 ?9 c9 X- v5 b      scan_cnt <= scan_cnt + 1;  h8 N3 o% A0 r% P# w' ]) Q" m
    dbnq <= "1111111";2 F9 c5 w1 H  }, c
    elsif key_pressed = '0' then --key_pressed in
( s8 R  ~8 [- ^- R4 C          dbnq <= dbnq - 1;# \. T0 }1 {: l2 l( j3 O/ U8 S
    end if;" {& O; K. ?9 V* x5 F6 v2 a7 T
----- debounce            
. H  n0 H( o& |9 m2 \    if dbnq = "1001111" then --key_pressed debounce
. l0 g9 l2 s7 w( f2 v       key_valid <= '1';          ! _! {) I! d. L; z7 x
    else key_valid <= '0';: s8 x$ j: E" s, V* ]; C, ]
    end if;                   3 `3 b# n6 H  U1 Y7 v) n% n3 l
   end if;, N3 b; c' r% a3 m4 w  R0 r2 A
--   scan_out <= scan_cnt;
0 p$ @2 b$ V8 a" T% @+ N5 R  end process;
. |8 L- D+ M* X" w$ t" b( Z# b---------------------------------------------------------------------------7 Z! F5 ~8 ?* p0 ?
keycode : process( clk, scan_cnt, key_valid )# c5 J3 Y8 A3 Y3 m
  begin: b- r4 u3 P, J$ I! k
------------- asynchronous expression
) S. w1 q5 a7 |; O7 B4 F' U    if key_valid'event and key_valid = '1' then5 B3 x4 R1 u% W& A
    if scan_cnt( 3 ) = '1' then' J5 K3 e6 Q# F: d# k
       cmd_flag <= '1';" g( w* U3 [& v6 m2 y- o) e
       cmd_buf <= scan( 2 downto 0 ); --command store into ram
: f0 ]5 O" d) _    elsif scan_cnt( 3 ) = '0' then  O! E& h, d+ Q1 }
          num_flag <= '1';     
4 D9 N" y9 p8 r3 ]          num_buf <= scan( 2 downto 0 ); --numeric store into ram
2 A- M! S" \5 e5 O& C; Y    else num_buf <= "000", --numeric store into ram   
$ H5 B5 K2 y  E) B/ \           cmd_buf <= "000"; --numeric store into ram
6 l/ c9 |1 g' H  S0 r& k8 v5 F1 @           num_fleg <= '0';' E1 w1 _9 D+ \" B9 M& V) e4 i
           cmd_fleg <= '0';- x  ]7 R/ v# G6 P" a6 K
      end if;: i$ g; g( y6 B! c7 B
       digit <= cmd_buf & num_buf; -- out of key controller1 q( ?+ {8 _  T9 E6 r+ v
    end if;
$ \- s1 @9 n/ w! P5 S( K  end process;
5 W! Y& M* P+ X" W6 w) T-------------------  9 n- p  {- N2 C
  key_out <= key_valid;( R% @, j% L! e! Q6 u
  digit <= seg4bit;
' j' y9 a( V4 \2 uend behavioral;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂8 踩 分享分享
2#
發表於 2008-2-10 11:39:05 | 只看該作者
說說看我的想法/ O, X5 g- c: g" n2 S

* ?) T* S( G& F設定一個 前進次數 的變數
' X# [" G3 F/ v$ G" |9 z* M8 M+ H( v3 `default給1% N( u# b8 A7 B

' }5 j! p  f0 r& a" b接著去抓你鍵盤的Input
$ A( a2 i8 E2 Z只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉1 Y5 ]* R0 ~9 d+ Y

! z# a6 j( f4 q5 i" n* C# T直到你 按下 前進   啟動了  前進 這個副程式6 C- j- T6 I/ Y% G' m! @  u
這個副程式就會去抓  你目前  前進次數 的值
& p( G( S: {+ [, p5 {) y開始做遞減的運算
4 d7 e( m  [: ~8 v4 L) t+ k) ]# w
5 i0 r8 k" i# e3 f/ _每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)
! `7 a$ B) G+ h& ^% w2 _直到那個前進的次數到達時
: j3 b. I+ Q1 y1 D$ t2 ~前進的 副程式就會停止動作

評分

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

查看全部評分

3#
 樓主| 發表於 2008-2-10 14:41:54 | 只看該作者
真是非常感謝你的意見& t' u  t: a; L' G

9 O; e5 f8 Q7 ]" f2 d希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-24 02:00 AM , Processed in 0.157009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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