Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] VHDL輸入判斷

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-2-10 01:18:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
# ~: f+ w, G% J& g% K
9 X6 D8 v2 R0 T! f這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
  {, P  ~2 l6 A) `- G& S* ~3 q" x- i7 |# w( N
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)
. K' Y* ^. [) U, ^9 z, |' e5 {% u5 X5 S/ h0 a
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
1 D& \4 Q* l. {; K2 ^) U6 \) l  ]  v5 Y' ^
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!
; B, D' s& A& }: k7 V
4 ]3 @0 x+ r" M6 `% B$ ]library IEEE;
$ x  D/ m4 E9 Q. g. Q. q1 w1 iuse IEEE.STD_LOGIC_1164.ALL;
3 _' ?9 w$ @5 k+ Q0 A- Cuse IEEE.STD_LOGIC_ARITH.ALL;
2 @$ b9 m0 }, k% quse IEEE.STD_LOGIC_UNSIGNED.ALL;
8 y7 ^* \  l" }ENTITY key_controller IS3 y0 I" d/ }# e
   PORT(
, _+ K0 P  y' I8 S& v4 T7 Z      clk     : IN     std_logic;
" ?9 g% z6 M0 ^      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );, Z, c6 w7 X+ G4 w, L
      key_out : OUT    std_logic;
& B5 P' E; U4 N! d, R5 S7 Z      row     : IN     std_logic_vector ( 3 DOWNTO 0 );/ P; d( e/ h9 J& L+ B- v; S
      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )/ _. t* W5 w: S0 c" e4 n
   );
+ L, O) A( X* P4 K$ A5 D4 fEND key_controller ;* W8 k4 u6 b/ [2 _; ~
architecture behavioral of key_controller is2 n! D! s6 z- k
signal clkm        : std_logic;) W: n+ N3 g( c6 Z# w
signal key_pressed : std_logic;
# c* q# j/ R+ |  ?signal key_valid   : std_logic := '0';
7 S& j5 C: b: \1 P: \signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
  |' l& _, Q5 |: Wsignal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
5 g! s9 x6 P. nsignal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
6 Y3 g, L+ t! {3 M) Z. O; [% ?signal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
+ G" G. X0 y* ?. ]begin
" J" n' S+ q5 I2 M/ Ocount : process( clk )  s3 O: m  q" w# D  O
  begin
- A/ X8 k" t  Z! O# p3 V# m- }    if rising_edge( clk ) then
" ]- ]# p1 e# ]0 ]       count_t <= count_t + 1;/ Z5 n+ |: h! s* v) u# U
    end if;
; M1 L' _# o' k    clkm <= count_t( 15 ); --scaning clock generaterd( ?6 }% B; a, u4 H
  end process;  
" C1 ]6 ]$ k. \( I-----------------------------------------------: ~0 T- A  D' _( N- Q( \% H
keyboard: process( clkm, scan_cnt, key_pressed )
; V! r! j; S0 J( L+ ?! s: tbegin% _% m& P4 r9 m# }6 T1 e* S) ^. i" ~
--scan_cnt is a 4 bit up scan counter  
* t$ X0 H: g$ `' _4 e5 v case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
& c' l! n$ v  r9 ^6 |" v- g when "00"   => col <= "0111";
) y; C9 e5 W" z+ ]1 g4 b# W  x. M; t  when "01"   => col <= "1011";  m: k* \9 \( B
  when "10"   => col <= "1101";
1 A4 {+ d/ [% Y$ k5 w* x" {+ w4 \  when "11"   => col <= "1110";" D* {  ~9 t. F5 d! O+ F4 |
  when others => col <= "1111";  
! c# n# h* u4 D! D4 |$ a- Y  end case;0 d# n+ ?4 ?6 }# w
   ---------------------------------------------+ ~. B5 G+ p+ \9 k/ b( F; b, P
  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional8 Q" }8 u( _% q4 H5 D! I! ]/ p+ N
when "00"   => key_pressed <= row(0);
" {6 R1 v6 r0 [9 m& N when "01"   => key_pressed <= row(1);
  ~+ z) B) h6 Q$ I3 f  when "10"   => key_pressed <= row(2);8 d$ ?" z, r( V7 M  X+ J& T; M4 Z
when "11"   => key_pressed <= row(3);
  P3 y: m+ [! g9 K6 Z6 n, H! H  when others => null;4 j/ m9 ]" Z: l! h6 f
  end case;
* F8 x3 P4 w7 n+ W, B0 Q3 \8 v" B----------------------------------------------------------------
, [- _  j' i: P; @6 G) ~% N* y: d  if  rising_edge( clkm )  then 4 |# O4 {. T* [6 ~
    if key_pressed = '1' then --no key_pressed in, continue to scan
! t$ a  l# |9 |  E; @3 t      scan_cnt <= scan_cnt + 1;+ \! v% W) U$ Y  M# S- o1 K
    dbnq <= "1111111";
+ ]# g/ P0 f# ?' g8 v2 @    elsif key_pressed = '0' then --key_pressed in
2 h7 J% a5 f$ p  K          dbnq <= dbnq - 1;1 i2 o; Z# v" |
    end if;
8 z3 s& l3 d$ \+ D  Y. b4 J----- debounce             % K. V, @( f. A( a  E. f
    if dbnq = "1001111" then --key_pressed debounce( c2 l: k6 q3 P& T/ z
       key_valid <= '1';         
- I9 l2 f6 X: l/ O3 c, Q1 x' Y% Z    else key_valid <= '0';
. B' B( M! X' V9 F/ k8 n    end if;                  
8 {* R2 r. H: p9 J* Z- t5 _   end if;
+ N- |% Q+ g9 F( u$ s* i6 Q--   scan_out <= scan_cnt;
3 v0 {& M' l: j6 Z  end process;
- u+ X# K* `- J2 Q8 L---------------------------------------------------------------------------
+ ^% v; I" N% m/ P9 Ckeycode : process( clk, scan_cnt, key_valid )
2 p. ^- H& a: x7 @( c  begin2 o; q8 D9 L8 q" m( Y
------------- asynchronous expression* s- `4 E5 j+ b2 n# u* c
    if key_valid'event and key_valid = '1' then
! ]) U+ y5 V4 k    if scan_cnt( 3 ) = '1' then
8 r" ^$ m3 |8 `6 T. \4 e       cmd_flag <= '1';) h  f" I. v) }5 B+ E& P/ k
       cmd_buf <= scan( 2 downto 0 ); --command store into ram
9 I5 J3 I% t! S    elsif scan_cnt( 3 ) = '0' then
, q) L' }% j! f) ~          num_flag <= '1';     : Z9 N$ R$ r, F; }; U
          num_buf <= scan( 2 downto 0 ); --numeric store into ram) N6 R0 w& [" C9 R
    else num_buf <= "000", --numeric store into ram   
* u! [8 a( @, B$ ?7 t- V6 \4 v           cmd_buf <= "000"; --numeric store into ram
( ~8 m4 J1 Q1 F; m. y4 o           num_fleg <= '0';
. j9 r3 \7 g9 H, V           cmd_fleg <= '0';
6 L' i  D' q+ ^3 @- t      end if;" h/ D! s- @/ }1 L
       digit <= cmd_buf & num_buf; -- out of key controller
. }( i+ J  ]: S  a" x* a' N9 I: `    end if;' K4 S7 M* K5 E  }
  end process; 3 k# j( ?. K+ [, T
-------------------  1 T3 ^/ X% I& r3 N0 f7 K  }% m
  key_out <= key_valid;
: s4 D- Z/ R- @& N3 d/ y  digit <= seg4bit;- N$ C* u" P0 Y3 H6 i, o! x
end behavioral;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂8 踩 分享分享
2#
發表於 2008-2-10 11:39:05 | 只看該作者
說說看我的想法
! b. {; `. k# e) h/ u( ^% W
" V' A0 W; y3 r' x3 v5 D設定一個 前進次數 的變數
( s5 h" x9 K5 {: n9 p3 m, _default給1
/ m! [$ @' _' L5 l6 p, X+ z  g; _; y; G' }8 L, Y+ ]* \
接著去抓你鍵盤的Input
' O) X0 Q4 s( l; L9 E只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉
7 M) J/ ]) N6 q: A1 u* B
& {8 p' h7 G& w1 t直到你 按下 前進   啟動了  前進 這個副程式
& c2 T  x+ }5 u, a7 }1 ]1 g: s" n這個副程式就會去抓  你目前  前進次數 的值$ A: l4 a1 [- c) N/ k
開始做遞減的運算' h6 y* {0 p0 R& q
' B2 V+ @) w* m, l% q
每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)0 K/ z1 l* d9 k) P! K2 Y$ i& B! r
直到那個前進的次數到達時
. O/ D/ r- M+ Q( I) B7 B# W* i% N3 A7 m( @前進的 副程式就會停止動作

評分

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

查看全部評分

3#
 樓主| 發表於 2008-2-10 14:41:54 | 只看該作者
真是非常感謝你的意見0 m5 Y, X$ a! Z1 b. f% Q4 h

- v  a& n! S. h# Q1 {9 h) S- f* I希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-27 06:44 AM , Processed in 0.169009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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