Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

[問題求助] VHDL輸入判斷

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2008-2-10 01:18:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值& B" Q4 W* Q. o
$ E' M: o0 T5 C( L* E
這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次
3 `3 |& E5 p8 |7 W  w& M; Q/ g1 q, e! I( d
例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)/ W8 d2 A* t; s* r

( ~- H2 i/ ?# v9 b, D4 X當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數; F  ^, w& P5 B- i: g+ M

" o' p+ N) o1 |' L) Y  I2 v, Y現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!, x5 s& P1 \) Z! j

8 Q  q6 ?8 p- F3 vlibrary IEEE;
5 H( y0 ?) n, s- }2 yuse IEEE.STD_LOGIC_1164.ALL;
' |1 k6 J5 N$ Q" L  suse IEEE.STD_LOGIC_ARITH.ALL;
+ b% l" a, v$ R0 S$ A( q: Duse IEEE.STD_LOGIC_UNSIGNED.ALL;
7 h" q6 f2 u7 ]ENTITY key_controller IS
, K; t/ T1 N. Q1 `8 x( M, B   PORT( 6 F4 H" B8 x9 ]- ^6 U! Y( g7 K! s
      clk     : IN     std_logic;
/ \+ z- o/ s, G8 ]8 z1 k8 Y, [6 N      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );9 D$ W, k4 B3 M0 T7 U
      key_out : OUT    std_logic;
  k% u! C  F  C7 p; w: J      row     : IN     std_logic_vector ( 3 DOWNTO 0 );7 H2 N6 Y5 [! K( q" ^
      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )2 `8 I3 Y: B% U8 Q8 a8 M: J% Z
   );: T" s5 ?6 d& u* h' V1 A/ _
END key_controller ;
5 F. b. f0 q6 L3 G% s# Rarchitecture behavioral of key_controller is
8 r' I/ E7 \) o3 a7 bsignal clkm        : std_logic;
( [, N5 s3 u& u3 g8 a2 vsignal key_pressed : std_logic;& N3 m% f# x. q+ t3 f" G
signal key_valid   : std_logic := '0';6 h: v. B! C6 J8 C/ K2 {, H* R
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
8 ^9 n1 b( A* T! f, Hsignal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );; b# j5 r! a5 s% V! v; T( R: W
signal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );9 P$ T: n" w( p( L
signal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );( D+ P+ A! m9 F5 F! u4 ^" M
begin6 n$ h: R- S: M; `1 t# c
count : process( clk )& \+ P$ R0 a6 j8 P
  begin0 {9 j- H9 E3 [1 {
    if rising_edge( clk ) then
& m! o" Z3 i0 ~: S: ]( X8 O# v       count_t <= count_t + 1;- t; H- x3 X  ^& F  L
    end if;
) W% g  L( W9 m/ [( Q    clkm <= count_t( 15 ); --scaning clock generaterd
- L3 ]" r! n' s1 P3 j4 N  end process;  
/ k2 d  b) `; [9 A* u9 D  @' `-----------------------------------------------
. T3 b. n: \7 w( X: _. p5 {' Pkeyboard: process( clkm, scan_cnt, key_pressed )
8 B0 U9 k1 n1 N- L( _" ?0 j4 C* [begin
3 r4 @! f  @7 @! N0 \# y! J--scan_cnt is a 4 bit up scan counter  % M/ r& I, h0 V0 U9 T: o
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional
2 d2 @4 K" o% x2 E when "00"   => col <= "0111";
2 e  Q6 t& b4 A) u6 U  when "01"   => col <= "1011";
1 G! J) C  n. [2 m% J  when "10"   => col <= "1101";
/ D* U/ _1 c/ _( Q4 _' `' n  when "11"   => col <= "1110";
) |8 j% {+ v: l4 X1 H  when others => col <= "1111";  $ P6 n$ E3 F" D
  end case;
! i$ D! w5 m- {/ E, h& K3 U0 B2 G   ---------------------------------------------3 O& O2 ^3 E# o' a, W. o/ z+ W/ H
  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional
" d. E" `# Y: F) Q8 }3 a7 v) i when "00"   => key_pressed <= row(0);
, H' F7 v5 G' t0 M7 g( d4 { when "01"   => key_pressed <= row(1);8 y& u8 L& h& g$ I* {7 L. a
  when "10"   => key_pressed <= row(2);& |) L% `6 [: h, M
when "11"   => key_pressed <= row(3);
  x& I; G* u- P# H: @$ z% m2 w. f  when others => null;! B( Q* y. }! W- U* L. r
  end case;
! l5 {; I7 a7 C5 N----------------------------------------------------------------& v, _, J! v5 C  D  K9 U
  if  rising_edge( clkm )  then
" R4 `7 o0 W9 ?0 r( z& T/ M    if key_pressed = '1' then --no key_pressed in, continue to scan+ s/ ~$ `# M* M# O0 w, L
      scan_cnt <= scan_cnt + 1;
$ I& i9 b4 |1 w5 f+ S- K% |% m    dbnq <= "1111111";  M! x4 q* O# _6 I. z
    elsif key_pressed = '0' then --key_pressed in) U# o$ s* Y( \8 {8 i2 ~9 E
          dbnq <= dbnq - 1;0 M. h( ^$ ?2 Z, L$ b* ]
    end if;# W& l6 m0 _6 C$ a  ~
----- debounce            
6 l. P' G7 ], U# Y* A) w. v9 f    if dbnq = "1001111" then --key_pressed debounce
+ K! a) g  s. h1 g- o# v       key_valid <= '1';          5 ^" @: h4 `  ~
    else key_valid <= '0';3 ]+ G# D) A$ c$ l$ V2 A' v* A& A
    end if;                  
7 H+ T1 H% E) S0 P3 K   end if;
: |) [5 H4 W0 m; |--   scan_out <= scan_cnt;& v6 g0 `9 o0 Z
  end process;, o# {$ h" s3 T: _
---------------------------------------------------------------------------9 @  e. r$ B6 h# ^+ F
keycode : process( clk, scan_cnt, key_valid )5 \; L! e; M  L1 k$ B
  begin% @4 q1 q: {: U! R% V5 `2 q
------------- asynchronous expression7 R$ z7 x" x, y# ~
    if key_valid'event and key_valid = '1' then
5 s8 d0 `# Z( m    if scan_cnt( 3 ) = '1' then* K3 o7 o, Y* R: t( o8 A/ l
       cmd_flag <= '1';4 q. b. ]$ {% x( E" O' B+ Z
       cmd_buf <= scan( 2 downto 0 ); --command store into ram
( u  ^8 b( v3 G1 @: {6 X    elsif scan_cnt( 3 ) = '0' then  T2 k* u3 p' K7 V  H
          num_flag <= '1';     
' B5 C9 }6 W( T          num_buf <= scan( 2 downto 0 ); --numeric store into ram
% s: k) s) w1 B& J* r9 J    else num_buf <= "000", --numeric store into ram   
+ |" e3 \/ A* Q. F7 a8 q           cmd_buf <= "000"; --numeric store into ram; B* j+ O) X/ y# U, U. A
           num_fleg <= '0';
3 S4 K8 s, M9 D! d; W           cmd_fleg <= '0';
3 Z2 W3 h' W! I      end if;
! l# X) t9 E$ J: R: V       digit <= cmd_buf & num_buf; -- out of key controller
( A& |% n& @: h    end if;
+ e1 T+ e( V8 X5 t  end process; ; `2 l2 E1 f$ c7 u
-------------------  
' P0 Q( n: ]& z6 _. l9 ]  key_out <= key_valid;; F0 Q8 D( A. U, |
  digit <= seg4bit;
: `8 f/ Y/ g6 c+ }* G, uend behavioral;
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂8 踩 分享分享
2#
發表於 2008-2-10 11:39:05 | 只看該作者
說說看我的想法
9 j4 e' b' z- Y: D7 _/ J; U+ U" r; I! e* R; c9 o/ G9 z) T0 P3 m
設定一個 前進次數 的變數: |3 ?3 F. ]; d) @  f$ u
default給11 _  W9 u" w3 X( B* C4 N

  ?1 A1 p& u* r* f( l' m接著去抓你鍵盤的Input
$ {5 d( o2 s0 M% ?' h只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉! N/ g# ]! K$ Y+ V0 K- J

$ D9 W, ~- x! }- \直到你 按下 前進   啟動了  前進 這個副程式4 I% u* G7 `0 g$ b$ ^! C5 q/ K  H
這個副程式就會去抓  你目前  前進次數 的值
* N1 W7 ^1 C  H* ?開始做遞減的運算6 V' b8 e6 h+ C! l# I

' {$ U1 p) H6 M7 R* g% c每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?), A: i9 |0 p# ]2 T) a6 o
直到那個前進的次數到達時
3 {& [* `, h# [前進的 副程式就會停止動作

評分

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

查看全部評分

3#
 樓主| 發表於 2008-2-10 14:41:54 | 只看該作者
真是非常感謝你的意見9 W% I/ v0 @9 \. \$ b& G

7 b6 p4 k5 b$ E0 R. e希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-28 05:33 AM , Processed in 0.111007 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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