Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] VHDL輸入判斷

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-2-10 01:18:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
, \6 |7 M5 G' @3 L7 ^
+ O, H6 [, K1 i$ }; h這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次. o9 q/ q) M2 v

0 g, \; [' K: q7 V8 T' ~8 |# c例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)  o' Z% b& `7 H: r7 l6 d" U
, ~8 E0 \. I' j1 @' j- e. J
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數
0 U/ l- B) D* N" d4 X
* t+ L, S2 b5 ~9 w現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!0 i, o# s$ h3 d" i! O0 M

7 C* j9 m$ G2 {8 p1 ?library IEEE;: x: r; k1 X, s% B6 \% t, ]! `
use IEEE.STD_LOGIC_1164.ALL;
  t% F: w& L. z8 Buse IEEE.STD_LOGIC_ARITH.ALL;/ p6 A% M) G( d# C
use IEEE.STD_LOGIC_UNSIGNED.ALL;
. u( H: W' G( n1 y* a2 P- v& LENTITY key_controller IS
' d. X# i/ b( L+ Z   PORT(
- P( {( A! ]  l% E5 i6 |$ r      clk     : IN     std_logic;( B& y5 u( V2 U; H) I& d) S# P
      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );, X; x1 m% ^; E
      key_out : OUT    std_logic;
4 O1 p$ h8 Y9 }1 o  @9 Y      row     : IN     std_logic_vector ( 3 DOWNTO 0 );$ R5 Q1 C7 o( a
      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )
0 u& Y8 u5 j5 K   );
8 B: U6 @$ O# x$ r2 pEND key_controller ;3 p" E+ ]4 i. W2 T1 x7 F8 k3 ^; _
architecture behavioral of key_controller is
9 p2 s- p' |: K( |signal clkm        : std_logic;
+ U  E1 F8 N6 a2 hsignal key_pressed : std_logic;
( l" b9 b4 z+ h9 G7 B1 asignal key_valid   : std_logic := '0';% j/ D2 H/ G. o) Z
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce2 O9 B1 p  s$ d* c
signal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
4 `3 q, o3 q- O7 b1 W! D. R( G( G! `& Asignal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );' o  N, i& H3 b
signal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );+ K* o" \% x; ?' d, i0 b) M2 g
begin6 q" g) v- t$ W# H: D
count : process( clk )) a! e6 Z# h7 ^. q- z
  begin! \3 e( _8 p/ b9 T( a
    if rising_edge( clk ) then( q9 I6 M1 X# c) S, @/ c
       count_t <= count_t + 1;
' L5 a/ r0 E- x6 J    end if;+ Y" P* _3 r9 W' x; j
    clkm <= count_t( 15 ); --scaning clock generaterd1 @$ F. L' Y2 B: }3 `. s. A3 `0 K8 b
  end process;  
0 ~& M9 P; B* N-----------------------------------------------
+ Y% F; }+ q. d  e- l" ]' s% M2 Hkeyboard: process( clkm, scan_cnt, key_pressed )
  V% r) H" p5 O1 {& Qbegin; U) N5 m& v6 r9 q
--scan_cnt is a 4 bit up scan counter  ; K" m3 [; s; t8 {6 }7 I
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
  p/ P3 G3 @# {( J2 b when "00"   => col <= "0111";1 p3 U' i3 e1 }' N# |
  when "01"   => col <= "1011";: x4 g* e5 C6 c) G
  when "10"   => col <= "1101";7 d( J6 x  U: |1 T, h
  when "11"   => col <= "1110";$ n  W  }: f& e0 S
  when others => col <= "1111";  
8 r; z4 z: B0 J: q8 F: T1 k' g% |  end case;) B7 p4 ?4 [& f! E3 D* n6 s0 C* s
   ---------------------------------------------
8 L3 P/ r3 ?  X( `1 g1 G; R( {: C* E4 I  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional4 C; w$ n" j9 q5 J# A+ C8 B9 \& D
when "00"   => key_pressed <= row(0);
) F& Z) y4 F4 C5 z when "01"   => key_pressed <= row(1);6 z; Z" c4 W; e  w  f( J! S( U
  when "10"   => key_pressed <= row(2);
. \) f) W  L3 y) n$ z when "11"   => key_pressed <= row(3);
6 x9 I% l; f2 R* C4 C# ~  when others => null;' Q/ s0 g8 B# K, o' y
  end case;
9 t( ^& S$ T; b----------------------------------------------------------------* P0 H4 W% l$ d' }
  if  rising_edge( clkm )  then
" H, \, e' m. B  N    if key_pressed = '1' then --no key_pressed in, continue to scan8 {* X  o; L" R
      scan_cnt <= scan_cnt + 1;
, R  N, |9 @6 M( e7 K% ]    dbnq <= "1111111";
: Z- H& L# t  ?    elsif key_pressed = '0' then --key_pressed in
3 d& Z% r; X6 u4 x8 q5 J          dbnq <= dbnq - 1;, }/ |" h6 R; @7 P, w
    end if;! K8 l$ O9 {1 h' E, L
----- debounce               j  M* M* Q/ j  j. x9 Q
    if dbnq = "1001111" then --key_pressed debounce& L' h; h3 F' d6 e, h
       key_valid <= '1';         
7 E- X) Z( a) \2 O    else key_valid <= '0';8 r8 m# b3 U% M: v3 e; Q+ W8 p8 m, m
    end if;                   ! J) E) J" m( v
   end if;
4 L* V; C( N6 E- ?--   scan_out <= scan_cnt;( k) w+ n0 F) ?$ ^* D: v' Y
  end process;" W5 K( Q  g; \) U
---------------------------------------------------------------------------: g7 z# `$ r: Q5 M4 P6 G. G% o
keycode : process( clk, scan_cnt, key_valid )
( D$ z6 e' p+ w, J  begin
, W$ G! r. p' F" B------------- asynchronous expression
, n$ c7 b' T2 [& V9 f9 r    if key_valid'event and key_valid = '1' then
9 D  m0 M; X+ c5 l& E9 B6 s    if scan_cnt( 3 ) = '1' then
! X3 g0 T4 o2 H9 `- B       cmd_flag <= '1';
7 B" u& [4 n* a, y. ^, N. I       cmd_buf <= scan( 2 downto 0 ); --command store into ram
3 H; ?& u& R/ D    elsif scan_cnt( 3 ) = '0' then9 r% ~1 O+ Q$ z! h" E. W! ~
          num_flag <= '1';     ) P# k) d0 h  r- H2 R
          num_buf <= scan( 2 downto 0 ); --numeric store into ram/ a% q$ y2 Z8 g; [( }
    else num_buf <= "000", --numeric store into ram    + x1 K0 N8 d- `8 q% Q) \
           cmd_buf <= "000"; --numeric store into ram
5 W7 A* `# `1 b7 E" \- T           num_fleg <= '0';
  e# F( g$ d2 s7 `" T           cmd_fleg <= '0';" \! B& k: c8 Y0 l% x9 o, a
      end if;
4 h2 n. z9 n% C       digit <= cmd_buf & num_buf; -- out of key controller
/ h" a! f% y4 [8 n  d& Y    end if;5 q/ X8 q, h* |7 h# q
  end process;
$ T5 ?* W4 ~9 c. U-------------------  & f% I% }, r$ n$ r) w5 ~& I* h0 Q% d
  key_out <= key_valid;! D! U3 a! O& [1 Q; L# ^- Q# Z
  digit <= seg4bit;1 v' G% U% x& `! W
end behavioral;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂8 踩 分享分享
2#
發表於 2008-2-10 11:39:05 | 只看該作者
說說看我的想法
+ k7 r$ P1 x& @* r- O, u
/ ~& m5 w. e& m5 Q/ S' N" u設定一個 前進次數 的變數; ~: D0 B0 w: B* O% n$ X& [; b: r2 x
default給12 e6 b2 d: x( j3 w6 |

# i% a) i0 B4 D8 i+ u接著去抓你鍵盤的Input% |, F. {, f) D2 b
只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉
# a) d9 b# M8 R) Q* w" s( k; Z1 g) Z! ]$ j
直到你 按下 前進   啟動了  前進 這個副程式6 l9 ~& |* z1 z
這個副程式就會去抓  你目前  前進次數 的值
& C0 }2 [$ V* M: C7 K開始做遞減的運算5 _$ |6 N- ?9 j2 Z/ N

" p$ Z0 l+ ~( n: w) r+ H6 Q% W1 {: E每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)' e9 F0 K! Y: O7 L7 F9 P& _
直到那個前進的次數到達時
; f7 u" Z: k" d2 a% O3 W前進的 副程式就會停止動作

評分

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

查看全部評分

3#
 樓主| 發表於 2008-2-10 14:41:54 | 只看該作者
真是非常感謝你的意見
- |/ P6 C: U0 @& U# u! c' U
7 R7 v4 B. Y# Y2 X希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-4 12:22 PM , Processed in 0.102006 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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