Chip123 科技應用創新平台

標題: VHDL輸入判斷 [打印本頁]

作者: w10789173    時間: 2008-2-10 01:18 AM
標題: VHDL輸入判斷
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值9 K, [6 m7 j- s. `# m
/ ^7 q% a( G& \; [' `/ Z
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次' y& F6 \; T% f+ T

2 C! m. v) w: ]0 n* T' e5 ]例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)
% d' S; _/ ~% m1 i2 `4 C+ }: P) Y: m5 g% ?9 K# w1 H
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數. w9 Y5 Z9 k9 ]$ z0 C- p2 W/ |
3 |/ O; t( _$ C6 J1 w9 q2 Y
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!% W/ J2 j0 V: Q) ^6 U
' B- q$ {% H) y9 |2 N. o+ _. L
library IEEE;
: b% T% W$ D0 Q! {  muse IEEE.STD_LOGIC_1164.ALL;# _) O) A1 E& {8 r: Q
use IEEE.STD_LOGIC_ARITH.ALL;
4 x+ O7 w4 y* m( u& s' e, F/ o5 }use IEEE.STD_LOGIC_UNSIGNED.ALL;0 D. R3 ?. [! |
ENTITY key_controller IS' g! x# {' p4 A. S$ S
   PORT( 1 \7 ~0 I" |4 k! Q3 L
      clk     : IN     std_logic;: R- V, q3 P! _" A( B4 e, I
      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );
$ f# ~- C8 x/ W: [3 K1 P      key_out : OUT    std_logic;  O3 Q" z* f+ |: `
      row     : IN     std_logic_vector ( 3 DOWNTO 0 );$ e% j8 t- y* S0 y! ]: r
      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )
# c/ R! _. ?8 @7 ~* t: a   );
; ^; v% ?* K! ?END key_controller ;; w8 Q, Y+ ^0 k/ Z% _* Y
architecture behavioral of key_controller is
  c8 e7 A: C  f% _4 isignal clkm        : std_logic;
8 B6 p* s: ~/ O* ?signal key_pressed : std_logic;& ?) ?& s5 ]- ]( h) f( N
signal key_valid   : std_logic := '0';! d$ r- ~) H" V
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
6 ~7 t3 f' m8 |* O1 `) U) Isignal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
4 }) `  V* n# N& C- ]signal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );1 M9 T$ O6 S! F' Q1 n0 f
signal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
2 i) S2 b* p" g# f* ]# K- pbegin
7 l: w8 n2 u  q& }count : process( clk )
$ n7 ?; e# z$ q$ O; E  begin
+ ?9 j! x/ J* y+ s    if rising_edge( clk ) then
3 M* h) ?) O' N  {& R       count_t <= count_t + 1;: @6 k) l/ P/ Z+ G# ^+ j
    end if;: z4 j0 J# }7 F# z7 B2 g/ C
    clkm <= count_t( 15 ); --scaning clock generaterd
/ e) F4 j- o  G6 E1 A$ e' _  end process;  
7 t  G& a2 g4 \2 k$ l- ]* y-----------------------------------------------
0 d8 G, b' R% [2 I' e# C9 [% v! Okeyboard: process( clkm, scan_cnt, key_pressed )
9 N2 n! T9 s4 g# _begin+ M" z, o# Z: x- O& }- m& [1 M
--scan_cnt is a 4 bit up scan counter  / C7 w, ?% X  x5 b5 v4 e7 r5 H
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional ' Z5 V4 P5 \5 ?: D, @8 k$ l
when "00"   => col <= "0111";
7 ]& H' \! v8 \- D  when "01"   => col <= "1011";
8 g( h2 T/ e# l  when "10"   => col <= "1101";
' l( p$ z( j& c  when "11"   => col <= "1110";
! T& e2 A, p/ V8 t9 w5 S* y0 ?  when others => col <= "1111";  
4 d' x( g, N5 L: E9 v  end case;
1 ?/ Z8 `/ K1 K% S5 z0 f   ---------------------------------------------& k9 o% B& t0 I0 I
  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
& P' }5 Z& k/ E. _$ g9 f% u when "00"   => key_pressed <= row(0);
- {5 O  F- a, T- y when "01"   => key_pressed <= row(1);1 t+ \0 ?& A" M4 f$ ^; y
  when "10"   => key_pressed <= row(2);& W$ a) n+ B) y
when "11"   => key_pressed <= row(3);
, \! K! s0 B* K) d  when others => null;
0 u: K- ]( i+ i! y4 {/ R& [  end case;9 Z6 c" N1 N+ X
----------------------------------------------------------------& w* G) _7 B4 R3 _. Y" ~
  if  rising_edge( clkm )  then + f  \9 |1 u- L
    if key_pressed = '1' then --no key_pressed in, continue to scan" J- ^& s2 O1 |$ C% x4 z
      scan_cnt <= scan_cnt + 1;* ]+ |/ v2 e/ ^$ M1 l
    dbnq <= "1111111";; T$ w! t# f/ I2 Y4 W3 {  U
    elsif key_pressed = '0' then --key_pressed in) m9 R) d3 v0 t, e
          dbnq <= dbnq - 1;+ L% q7 T# y: f9 }' f
    end if;; n2 H) |' s# w* e& h
----- debounce             % a! f3 j6 i% h
    if dbnq = "1001111" then --key_pressed debounce
6 q7 K9 B1 v# e       key_valid <= '1';          ! U- X  r6 X3 T
    else key_valid <= '0';- r% m7 h) x' q5 F$ F' p/ x
    end if;                   ; R3 a3 K% L1 _" U% h
   end if;
: V/ G) f* p4 E; Y6 ?--   scan_out <= scan_cnt;
3 ^/ k; L2 z$ ~# H  end process;
. ^% y5 Z1 q7 q2 i: D---------------------------------------------------------------------------
* ^+ t% k7 K0 G% a: Tkeycode : process( clk, scan_cnt, key_valid )# _. s5 y$ _9 y7 H
  begin
* l2 i6 }$ ^0 r3 l# {, R------------- asynchronous expression
6 r- m9 j& e) \% r9 O. b    if key_valid'event and key_valid = '1' then
, B2 K. E: f7 k) L0 l    if scan_cnt( 3 ) = '1' then
+ m, C. H1 W* ~. v6 P       cmd_flag <= '1';
. }% G- a  u% L       cmd_buf <= scan( 2 downto 0 ); --command store into ram" W% ~. d& @  J  ]3 ~
    elsif scan_cnt( 3 ) = '0' then
( t3 `$ D+ D- l$ q" r+ f* x          num_flag <= '1';     " m+ e8 x5 M+ t( {7 o5 S2 U2 u2 z
          num_buf <= scan( 2 downto 0 ); --numeric store into ram
% F% r! o8 u9 h4 |8 V4 J# T    else num_buf <= "000", --numeric store into ram   
- q7 Q0 D) N3 S           cmd_buf <= "000"; --numeric store into ram. H+ N7 F0 a9 x
           num_fleg <= '0';8 U' e9 h+ E$ Q- S0 L$ T: `9 U$ U, t
           cmd_fleg <= '0';
3 H1 p7 A  ^$ N; v$ G4 o) v! W      end if;
5 m" x5 v1 |! K. m: M* S  V       digit <= cmd_buf & num_buf; -- out of key controller0 b- r5 s6 W$ f6 v2 x: A3 J; q' Z7 b
    end if;& K# K- s0 Z4 `0 q4 }3 A' z4 h
  end process;
+ e* N, `( V. q2 F4 @2 H0 J3 m7 U-------------------  9 b' @6 ?3 f9 B! \3 t
  key_out <= key_valid;7 V! n% I9 F' R- e" B6 x. _
  digit <= seg4bit;% t" z& d* b. b$ \# R9 T1 P
end behavioral;
作者: yhchang    時間: 2008-2-10 11:39 AM
說說看我的想法
/ j3 Q6 Y* R- N- @1 G. {: ^( {6 l' X) C* T6 J5 `2 i2 B, ?* O8 l
設定一個 前進次數 的變數
/ }; l% \$ y1 s; q4 d" Gdefault給1# i; b8 P: L0 S8 W3 t3 u
7 A8 D# R6 o$ \$ T1 N
接著去抓你鍵盤的Input
5 t% Z) L0 u! Q只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉3 K9 X8 T. q, g) K, `" q5 w" g
9 A# v5 n" u: K+ J
直到你 按下 前進   啟動了  前進 這個副程式+ K5 B5 k0 g; y0 R! C6 S5 _3 o8 _/ T
這個副程式就會去抓  你目前  前進次數 的值" H7 }. d7 ~; X5 i3 q/ T
開始做遞減的運算, L% ^# l# k% x4 z5 O
5 k  n) g: I5 u# S
每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)6 F9 {. f4 F9 A" r# A; J
直到那個前進的次數到達時$ X: R3 `: C% Y) N2 k
前進的 副程式就會停止動作
作者: w10789173    時間: 2008-2-10 02:41 PM
真是非常感謝你的意見" g( i+ W; @( ^) l3 @- u* }+ Z

$ S8 n- ~' s+ P: L& ^! n6 \希望以後也還請多多的指教!




歡迎光臨 Chip123 科技應用創新平台 (http://www.chip123.com/) Powered by Discuz! X3.2