Chip123 科技應用創新平台

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

作者: w10789173    時間: 2008-2-10 01:18 AM
標題: VHDL輸入判斷
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
4 b. f- Q: f# F8 u% ], a* R! R
. {  j' r' O& `1 c; N% {+ O- C4 w! `這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
; x- Q/ w; ]4 y; d5 o" _! J# r
! {6 k; p2 `: g$ o/ T$ w例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)( A* H* s" @. K1 V* r0 n0 i, O
8 r2 [9 D9 L% a- C* O" G
當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數9 [# J- _: @1 \( p
6 U% P9 F4 d! a, D4 C
現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!
$ N. t6 l! [- j; r* \! T# r7 D  d
" S/ z5 T* H; h0 V+ {7 Mlibrary IEEE;  E, A' k' x3 ]
use IEEE.STD_LOGIC_1164.ALL;2 W) Z, D) S2 a6 t; G
use IEEE.STD_LOGIC_ARITH.ALL;9 O7 F- D) k4 z# Z
use IEEE.STD_LOGIC_UNSIGNED.ALL;
' X4 U- C% C- dENTITY key_controller IS
4 e; q0 D; n: L4 S+ F1 g+ L   PORT( & s, i- o2 q3 K# p/ m! t
      clk     : IN     std_logic;
* O, w( N: ]0 I4 g; Q      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );7 t9 Z7 p1 d8 g# Z
      key_out : OUT    std_logic;- K! o; j1 l. ~
      row     : IN     std_logic_vector ( 3 DOWNTO 0 );
3 b5 ?* F" o5 R6 R3 a0 Y; n      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )
" p9 w1 z. L' \4 R/ _& s   );
! M0 a" C0 z& e7 [; Y/ ]0 tEND key_controller ;
: R1 Q/ q+ i; ]) G% T( \: G+ aarchitecture behavioral of key_controller is
% K+ ]+ _" _# Usignal clkm        : std_logic;' A$ ~3 o* ]( M, [
signal key_pressed : std_logic;8 h4 \+ Z- g# x! i! M/ I) G: n
signal key_valid   : std_logic := '0';6 W& U/ {* h# s3 B9 L
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce' {0 m5 k8 J+ {2 v; K% W1 _! y
signal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );) l' ^4 ^" U2 x- ^
signal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
% f" }; |- f4 D7 W; g; ^signal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );, b6 _' _+ v2 Q8 T
begin
8 T" O7 \. M$ ?, k9 `' T( |6 ~count : process( clk )
+ L7 t, G( J( E$ c- B  }% B  begin
% ~( N) F! g: {    if rising_edge( clk ) then
  P* p0 X0 E. E0 R% x" e+ C       count_t <= count_t + 1;' t; q7 e5 g+ e/ A' x' l# w0 ?
    end if;
  t9 E2 n+ r5 n2 G7 J( r    clkm <= count_t( 15 ); --scaning clock generaterd3 U* Y4 X7 S, P
  end process;  
2 @7 i* b. n. x. r-----------------------------------------------7 Q1 y- l' f- S- f! j8 a$ D2 {/ \# B0 Q1 @+ w
keyboard: process( clkm, scan_cnt, key_pressed ). ~; G0 l* n9 k5 ~; o
begin
; w) f- I/ g# E# k/ ]8 F--scan_cnt is a 4 bit up scan counter  6 ?2 m  b# K3 q7 h. Q* }- y& v
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional + y' b7 T6 H( h2 A3 p8 y8 u" J9 ?
when "00"   => col <= "0111";
+ b" i4 D; }+ s- d  when "01"   => col <= "1011";
& M; q+ f4 E/ i  when "10"   => col <= "1101";" m/ K4 l6 X1 g: ?* ~9 H
  when "11"   => col <= "1110";
  H( d3 u0 L8 V  when others => col <= "1111";  " w% d& [  [; x7 e# D
  end case;" p* R+ X/ Q+ m: G8 d
   ---------------------------------------------
) _$ J! [# c1 s3 ?0 ]  ~  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional2 p! j2 G( \0 l* F4 r: K% g0 U
when "00"   => key_pressed <= row(0);& b1 J$ V: o- e  u" J) v3 F
when "01"   => key_pressed <= row(1);' d1 t8 U; W# S3 W; N, r
  when "10"   => key_pressed <= row(2);
$ U+ @7 [& H( i' u; u/ l when "11"   => key_pressed <= row(3);9 g. q. {6 N0 g8 [! Q6 N
  when others => null;
% d% f: G2 w, v2 m# h! t  end case;
* G7 }8 Y! ~- o: s1 ?  u7 F----------------------------------------------------------------
' E2 n6 q; V) [, u  if  rising_edge( clkm )  then 2 c- ]* a  |3 l5 i1 V6 D9 J! y, n
    if key_pressed = '1' then --no key_pressed in, continue to scan$ \1 t! f: q+ l1 I# e; e. f9 j
      scan_cnt <= scan_cnt + 1;
. {3 I* I1 M5 h    dbnq <= "1111111";
# v, D. k$ R2 f5 r    elsif key_pressed = '0' then --key_pressed in
5 j7 |7 e9 _8 \* k- ?          dbnq <= dbnq - 1;
3 E' q* @$ f2 B0 h, @% T$ i8 e. _, J    end if;/ C( B3 m7 z& D5 i$ A
----- debounce            
8 w$ n. I/ ^- s4 M5 e: u    if dbnq = "1001111" then --key_pressed debounce
; K+ G" {7 E3 v4 u" b3 Z0 h6 I       key_valid <= '1';          9 T5 I- }- b* p! \
    else key_valid <= '0';! n" o7 X) g1 t& `  f1 A
    end if;                  
! r0 p$ x8 N+ X6 M- B   end if;7 s0 M) a3 D  r  a  ~9 h) N& o  l0 x
--   scan_out <= scan_cnt;* M) d/ T: A: R1 [' u
  end process;; ]. Y. f1 T0 H. p3 U% n6 t
---------------------------------------------------------------------------
" X$ {+ @) i& qkeycode : process( clk, scan_cnt, key_valid )- g" v1 w. R9 Y6 q
  begin
9 r& s7 j' ]8 z) d  q& [------------- asynchronous expression
( G3 f' i9 [/ ?, L; Y4 o7 t* w  [" f    if key_valid'event and key_valid = '1' then8 }- z' u- P; Z( b: X9 ]; ^$ r
    if scan_cnt( 3 ) = '1' then8 y' }; R3 o, P1 S0 l
       cmd_flag <= '1';; O* `- Y- C2 I& ~5 B/ C; y
       cmd_buf <= scan( 2 downto 0 ); --command store into ram% C! D2 q3 S4 f' B
    elsif scan_cnt( 3 ) = '0' then
0 M$ m8 v2 p, [! ?          num_flag <= '1';     , D, u, q0 G" Z
          num_buf <= scan( 2 downto 0 ); --numeric store into ram/ j- R3 k( [- h+ ?* n, y
    else num_buf <= "000", --numeric store into ram    / I' L# ~$ E1 F/ c* j' e
           cmd_buf <= "000"; --numeric store into ram  w. R4 L. H6 R. m0 E
           num_fleg <= '0';/ m1 D+ \4 s1 N) x9 B
           cmd_fleg <= '0';, T4 e. ?/ m1 U1 z* C
      end if;
  v) D- ^9 r& }. @2 [       digit <= cmd_buf & num_buf; -- out of key controller
" g7 F8 v. Z1 t; Z    end if;
. p6 M! E; V" H  A3 _1 V' f  end process;
& E, a, |2 H1 L- L-------------------  
% A& x1 [4 |( J" H: X* N' `6 @  key_out <= key_valid;- U1 Q3 B# A; G3 v
  digit <= seg4bit;
; J2 E2 N0 c8 Q8 F& f" Hend behavioral;
作者: yhchang    時間: 2008-2-10 11:39 AM
說說看我的想法
8 ]6 g) E! r1 ?" S$ N. r: Q! G# N7 J& V8 T4 h' T
設定一個 前進次數 的變數' `5 Q: o0 @. Q! x; g+ p% Z. t* c
default給19 ~0 v5 J/ b2 E# ^# j

; }' U. G2 o# F  s接著去抓你鍵盤的Input
, I/ d2 n6 E3 r' @% d/ U只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉& Q  H5 N4 U; @

% h0 z$ e* [2 Y直到你 按下 前進   啟動了  前進 這個副程式
! f3 Z! b, X/ V3 M這個副程式就會去抓  你目前  前進次數 的值9 r' l# o; p! \+ L: b# a8 }
開始做遞減的運算4 `0 G, M* n% f& i: T

  z+ _' }& |; k+ \9 G+ B每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)
$ x: n! B+ d$ g/ b4 b直到那個前進的次數到達時
4 {- x8 M8 w1 O! U前進的 副程式就會停止動作
作者: w10789173    時間: 2008-2-10 02:41 PM
真是非常感謝你的意見
- c$ r% z* C6 l- P: A+ n* R: c
( m6 i7 g0 b9 `& j; t6 O6 P希望以後也還請多多的指教!




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