Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] VHDL輸入判斷

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-2-10 01:18:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值% c2 ~" Q7 X" S

( d  ?8 H. F/ A5 R8 S( w6 C! Q這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
( v; g- G' \! l7 P- W; J% Z- B1 h; [' T' ^" k# T0 r- ?4 Z# l
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值): @6 \  u# ]) [8 l+ E# k
- x* m, R) N) [
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
. i# M. d: e9 h/ p! ]7 z6 Z4 Y: K$ B4 f. G' w! P
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!" _3 W4 t1 A% ?* r" L+ j* ~  {! |/ B
+ D1 V7 F! Y5 U: O
library IEEE;5 @7 Q& ^+ K  R) Z2 a
use IEEE.STD_LOGIC_1164.ALL;
% Y8 c4 |- c3 C& wuse IEEE.STD_LOGIC_ARITH.ALL;3 N0 R1 `! G! R0 V
use IEEE.STD_LOGIC_UNSIGNED.ALL;
8 E5 h6 _* z+ b' n. cENTITY key_controller IS* b3 l+ C$ ]9 u9 B
   PORT( 9 V$ r# i5 D6 Z' r) c& D. N% w
      clk     : IN     std_logic;  Z5 `! n( i3 Z# g/ L3 E
      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );
$ q6 o, Q5 S" j! c9 F8 |& d. d      key_out : OUT    std_logic;0 N6 T/ t4 {/ o! Z1 {
      row     : IN     std_logic_vector ( 3 DOWNTO 0 );
3 V& R/ E0 b3 j) }+ c. m4 T      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )& q+ Y  L& l/ n' S4 f7 n
   );, C: n' t0 u8 r6 E
END key_controller ;3 ?& p. H0 M+ y
architecture behavioral of key_controller is
' O' ?' N' Z; @( csignal clkm        : std_logic;
+ k$ r; s. x/ Z% f- D, Nsignal key_pressed : std_logic;/ Z& K" Q% \" D' A
signal key_valid   : std_logic := '0';
5 v! ^3 Q' ~9 M% E2 V* z# M$ i& Vsignal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
. F+ d; R- d& x7 B8 ~. `: Usignal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
0 Y3 L( `% ~  \# osignal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
0 m& R1 G+ J. c$ jsignal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
" b! B& ?( }! E3 Ebegin
) v6 N* |+ X% Ncount : process( clk )( l$ w' z+ O! t, j$ A5 V
  begin* y; ?4 k" C+ q# I( a
    if rising_edge( clk ) then
, g* |7 n& x2 \6 M9 R6 S       count_t <= count_t + 1;( D% @2 Z" N: V* V
    end if;) U# e% ^# C+ y; }4 {  ]
    clkm <= count_t( 15 ); --scaning clock generaterd
  ^5 N6 H* q/ k9 M  N- u/ n9 _  end process;  6 g/ Y' F9 ^" W% b  i: E3 ^+ I
-----------------------------------------------
7 {  v# f" e7 u/ k% |, akeyboard: process( clkm, scan_cnt, key_pressed )- x* c9 |2 E) H6 n3 N, G
begin
' W/ G+ M2 h1 V2 }, j--scan_cnt is a 4 bit up scan counter  * c' u+ o! a/ a0 v6 i; n7 Q9 |
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional + B1 }& R# f5 T" W- I3 d
when "00"   => col <= "0111";
3 j! z% G6 \8 j( N5 U9 ~' W  when "01"   => col <= "1011";8 _: {" ?) F2 M0 j, h6 f
  when "10"   => col <= "1101";5 x8 x9 w7 l* @+ G5 R) S% \. ^) N
  when "11"   => col <= "1110";2 |: Q0 t/ y: [  H- t8 ]
  when others => col <= "1111";  
; L" N/ d: c- ^8 y5 n  `; B% Z; I  end case;  S% s6 D# h% b0 E0 Q" E
   ---------------------------------------------, r( r0 [, W% j% p
  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
2 _8 n1 G1 S0 n% C- |% U when "00"   => key_pressed <= row(0);$ t. j' U' J& F9 b7 D
when "01"   => key_pressed <= row(1);
7 r2 A/ J/ |, t8 b% B  when "10"   => key_pressed <= row(2);
7 f5 g" x8 H/ V. R when "11"   => key_pressed <= row(3);/ a/ q9 E( }' Y, M" e0 o) k0 v
  when others => null;
( D, @- V" m9 K( O  end case;
5 G: C( [9 [+ b' A" h0 y, b----------------------------------------------------------------
. O5 l  r+ t# a7 G" Z0 R  if  rising_edge( clkm )  then
5 ^6 {, K8 \+ w" R! ^$ I: _& @  A4 ^' d    if key_pressed = '1' then --no key_pressed in, continue to scan
! c3 ^5 m9 v: _8 d5 C      scan_cnt <= scan_cnt + 1;7 w0 z: U% m$ L# n
    dbnq <= "1111111";
- ~; Y3 q$ _1 S5 m0 P0 O; ?3 D    elsif key_pressed = '0' then --key_pressed in  K% o& |. g' @7 p) l& m8 V5 b! S
          dbnq <= dbnq - 1;0 t  M/ M3 N# a2 W9 [
    end if;0 ?. F. s* K+ ]1 i% A
----- debounce            
- P* b  J; e# B    if dbnq = "1001111" then --key_pressed debounce1 c/ r1 _: P8 z# @
       key_valid <= '1';         
5 ]) L, Q1 b9 s0 n7 p5 [    else key_valid <= '0';
" D. V1 O- P+ z9 R  K9 M  G* z    end if;                   & h6 E; l* ?" |, b4 K. \
   end if;4 `: e7 r; @) i" _0 E3 W/ z+ P
--   scan_out <= scan_cnt;
  R/ s5 j/ n& R  end process;! a; C: w8 D6 ]: b
---------------------------------------------------------------------------
2 `& C! c8 `: H3 T$ @keycode : process( clk, scan_cnt, key_valid )
, O+ y4 o2 {- o3 m! c  begin
. }. a3 F9 h% p1 L------------- asynchronous expression
$ y  \. L2 [+ {/ |/ B/ f    if key_valid'event and key_valid = '1' then
* J1 c0 }+ N% F& ?% [- T. C2 I    if scan_cnt( 3 ) = '1' then. w4 _$ b2 q& e7 Q( ]
       cmd_flag <= '1';
; j0 B. w) e: X, r9 q       cmd_buf <= scan( 2 downto 0 ); --command store into ram" W# ]) f( f* }7 w
    elsif scan_cnt( 3 ) = '0' then) e0 G! V  v: C% T; z$ s! `9 z
          num_flag <= '1';     2 Y1 \9 D" l9 ?* Q" C
          num_buf <= scan( 2 downto 0 ); --numeric store into ram# V  {7 z9 I5 H  a# ^  d9 [
    else num_buf <= "000", --numeric store into ram   
# Y8 U2 i# U& `) B4 v           cmd_buf <= "000"; --numeric store into ram2 D$ ?& Y' y  @# D+ x2 R# E
           num_fleg <= '0';' d8 z5 r6 I9 g; T$ s* m! ^
           cmd_fleg <= '0';; i4 B$ T5 K0 B/ R8 P* u
      end if;# D! L" ~: P% I) S
       digit <= cmd_buf & num_buf; -- out of key controller" b6 L" ^% c) q8 ~) B  v/ K
    end if;
8 \: E; f% {1 U3 t  end process; 8 _) Y/ d; G0 E2 A! u' j
-------------------  
9 g: S  ^, m6 X  key_out <= key_valid;
6 v* }3 j. _( I$ o. T: E5 _  digit <= seg4bit;3 H$ r  c- t0 e+ a
end behavioral;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂8 踩 分享分享
2#
發表於 2008-2-10 11:39:05 | 只看該作者
說說看我的想法
5 J- w: K$ s8 K1 f% s4 K) v
& w2 ], b. o  A! p( L設定一個 前進次數 的變數
6 c. L! A5 b* d  ^% }default給1
0 \1 l+ S2 T: i: P* p3 V! q
3 B- p/ q, ^# t7 U- {5 s+ ~接著去抓你鍵盤的Input( W$ ~$ j8 T; O' m
只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉, `# V2 `" Z, r$ j/ m) T! A. R

. ~  B4 U  D. _* ~" S8 g) U直到你 按下 前進   啟動了  前進 這個副程式
) v" A1 j1 ?% H* E2 t3 h這個副程式就會去抓  你目前  前進次數 的值
& C( I* j3 p* c3 o7 e5 e* i  G開始做遞減的運算7 f- J) C4 N) G9 H

( z' |8 C: U9 G7 d; D/ o' O每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)
) W. G/ ?+ I# D4 I- U/ i直到那個前進的次數到達時
% ~- n4 e* G, p' ]9 S& j前進的 副程式就會停止動作

評分

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

查看全部評分

3#
 樓主| 發表於 2008-2-10 14:41:54 | 只看該作者
真是非常感謝你的意見
- `. c( j5 B9 C3 y2 o2 b" p% K
! w( i8 v6 ^2 f希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-4 05:27 PM , Processed in 0.123016 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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