Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
查看: 6649|回復: 2

[問題求助] VHDL輸入判斷

  [複製鏈接]
發表於 2008-2-10 01:18:35 | 顯示全部樓層 |閱讀模式
各位大大,想請問一下,我現在要做,當我鍵盤連續輸入,結果只取最後一個鍵盤輸入的值
+ |. o' ^+ |( V; F4 v
0 O$ }' {* x" L) T) }# E; q& {這是一個自動控制鍵盤的控制器,我可以先輸入數字,然後再輸入指令,我的機器就會動那個指令n次* J3 @9 a# q! p* ]; A( Z

* K5 O- b5 D3 I) g# \; H例如,先按5再按前進,自東車就會前進5次,如果只按前進,則自動車會自動前進1次(預設值)( c. P6 c# v+ T8 N' d3 l

5 p* j8 N* C3 n) l) ^3 M- G當我遇到連續輸入字數時,我不管要輸入多少數字,永遠取最後一個的數字當動作次數6 b) a" p) A& [! Q& _# l9 o

0 ~+ }# z2 f  `! f& F現在我卡在不知道如何判別這種機制,希望有高手可以給我一點提示幫我解決,謝謝!' e7 s, W  G; D" ?8 w! H3 h

( F9 \. D& D: [, X1 k  s# S/ Blibrary IEEE;
+ X  X9 [$ k9 i* Z$ }use IEEE.STD_LOGIC_1164.ALL;
, }- O8 w; p( Z' l2 j0 j9 quse IEEE.STD_LOGIC_ARITH.ALL;
! b2 g( F( C' U. y5 m& L7 Vuse IEEE.STD_LOGIC_UNSIGNED.ALL;3 z+ o9 p' ]  N% Q' ~
ENTITY key_controller IS
% y0 G0 S7 v4 Z2 U/ c/ ]   PORT(
' s2 d3 A- Z; o' d0 |      clk     : IN     std_logic;9 n' D% ?  C3 P; u# S9 W
      col     : OUT    std_logic_vector ( 3 DOWNTO 0 );/ I% L$ B1 X: s' U5 J
      key_out : OUT    std_logic;8 E8 ]; y3 n3 R
      row     : IN     std_logic_vector ( 3 DOWNTO 0 );
1 H7 Q6 @# M& X6 l5 A      digit   : OUT    std_logic_vector ( 5 DOWNTO 0 )
+ U# G2 e$ W- a! F( Z4 n   );- i5 s8 U# o0 e3 e( ]
END key_controller ;, P7 }! K- F" U, W" |
architecture behavioral of key_controller is
- u( J1 Q. h8 B% Wsignal clkm        : std_logic;: }' n  z" c9 e
signal key_pressed : std_logic;
3 f% M6 X' p7 i+ Q* `  a; [signal key_valid   : std_logic := '0';% ~/ ^; N5 O: j$ ^1 K) l
signal dbnq        : std_logic_vector(  6 downto 0 ) := ( others => '0' );  --debounce
0 H9 ~2 E* R2 S( k3 J% D' osignal scan_cnt    : std_logic_vector(  3 downto 0 ) := ( others => '0' );
; E4 C. S# g) ~/ C3 C: f' _signal cmd_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );
, d) _5 [) D. Qsignal num_buf     : std_logic_vector(  2 downto 0 ) := ( others => '0' );& H. |$ X. f) `3 ^6 [/ T6 W! X
begin% q- H4 v1 G4 P1 P& `3 ]- ?
count : process( clk )! n' F2 I' `0 T9 m. G
  begin- T6 l7 S6 V9 o9 s; W# }# ^
    if rising_edge( clk ) then
0 j9 u7 w7 t1 P% ~0 x1 ?       count_t <= count_t + 1;1 X1 a7 B) ^$ S9 S( y, H
    end if;' y, ?8 A+ m/ y3 J+ ]4 S/ Y( N
    clkm <= count_t( 15 ); --scaning clock generaterd! ?# p+ A  \' N" _
  end process;  ; X! g) R1 A+ P# ~* c; S
-----------------------------------------------
- L; N' d& T3 E4 ?keyboard: process( clkm, scan_cnt, key_pressed )
( [, v6 ~+ [2 d$ S  l: Ibegin
- Z  i4 l/ \" k--scan_cnt is a 4 bit up scan counter  ' u5 I+ N8 k2 [/ o
case scan_cnt( 3 downto 2 ) is --keypad column scaning, decoder functional 8 y# h* ^3 i2 l3 u
when "00"   => col <= "0111";
' o+ A& E) ^' V$ |2 M& n  when "01"   => col <= "1011";
- Z; D3 M3 h3 v* D. K7 |, X  when "10"   => col <= "1101";
" _5 Q+ E* k( G! D3 w  when "11"   => col <= "1110";$ X7 n7 ?1 i& e" s, b, ?
  when others => col <= "1111";  % x$ s9 G* ?$ S4 s4 `1 b
  end case;
+ [& L. p( `2 V: d5 Z% w   ---------------------------------------------1 M5 J% G# ~* @, B$ D& f
  case scan_cnt( 1 downto 0 ) is --keypad row scaning, mux functional( e, b& j8 b4 a) n" j
when "00"   => key_pressed <= row(0);' a- m! n" _3 q) d) \+ x
when "01"   => key_pressed <= row(1);# O' H  J+ Y6 z
  when "10"   => key_pressed <= row(2);3 e: ]/ s9 |$ X1 c$ a. G# ^+ H
when "11"   => key_pressed <= row(3);( z: p* d! Z0 |/ ]$ }
  when others => null;
. m; ~4 V( p& E( W2 u  end case;7 o* e" R% Z  W& t) D( q  s4 C  W
----------------------------------------------------------------
  L* g6 g. p* I" J1 q) x( x; Y4 ^  if  rising_edge( clkm )  then
& N/ U1 X( e; U! l. Y8 |    if key_pressed = '1' then --no key_pressed in, continue to scan
: }+ F! m2 F" t" U/ Y1 C      scan_cnt <= scan_cnt + 1;. j9 ]/ _# ^% q2 a" j
    dbnq <= "1111111";  t$ p7 A7 M* D( A& U; _
    elsif key_pressed = '0' then --key_pressed in7 `1 n6 q6 O5 i- `: ^5 J$ V) w
          dbnq <= dbnq - 1;$ o3 B9 C* H0 D6 d% [( a) s& `
    end if;+ G+ H3 \; |% z2 H+ M- ~6 ~; s
----- debounce            
4 U( N0 ?& Q" A    if dbnq = "1001111" then --key_pressed debounce$ g; G. f2 b3 w& W* T
       key_valid <= '1';         
, e, F5 h, t, y4 f* k    else key_valid <= '0';
1 X" _0 y! ~- E5 [/ Q' D0 v    end if;                  
9 o2 e8 m* ^6 f4 B2 }- Z8 d9 F( r  Y   end if;, e  f: J& _3 }
--   scan_out <= scan_cnt;3 n9 p8 ^0 Y5 W# y
  end process;
) h2 C7 R- n/ ~0 O% z---------------------------------------------------------------------------
+ \1 g" k$ e8 E( h# j: Okeycode : process( clk, scan_cnt, key_valid )
, f, G& W1 G/ e  begin
. g6 w* ]! @; X' a5 i3 q; S------------- asynchronous expression) l& B) K/ O) n; a: {' N% B
    if key_valid'event and key_valid = '1' then
8 i3 K9 V. j) c4 M6 A3 G    if scan_cnt( 3 ) = '1' then9 `0 k, x" X6 q2 @' @: i
       cmd_flag <= '1';7 ^/ R+ c) a; M5 f+ E$ K' r4 O
       cmd_buf <= scan( 2 downto 0 ); --command store into ram
( y  K% r! {- F5 G' Y+ L    elsif scan_cnt( 3 ) = '0' then/ l: K3 ~3 t7 t8 p0 H0 J) N6 D
          num_flag <= '1';     
# H- o) W8 m; @; ?8 o0 C          num_buf <= scan( 2 downto 0 ); --numeric store into ram2 y4 n: k6 M& T
    else num_buf <= "000", --numeric store into ram   
( V) _" h9 x! X: K           cmd_buf <= "000"; --numeric store into ram; ~8 H' Q. I+ l. f4 _& o
           num_fleg <= '0';
5 M* W, T1 j$ N5 b7 ^           cmd_fleg <= '0';
' t  \2 y' W: w  V' ]      end if;
5 K) E! n! Q5 H4 o* E       digit <= cmd_buf & num_buf; -- out of key controller
% O: |; P$ L# e) ?2 ~    end if;& w5 V/ `; Q7 C6 H" e$ u% Z
  end process; ( x" ~. s( |# i4 t3 o5 G
-------------------  
4 H5 I+ L1 u$ U1 u9 S! V# Z0 g# Y  key_out <= key_valid;* w, K( q% V7 q! z# d
  digit <= seg4bit;
# I9 \: a, U. z8 q! E6 @end behavioral;
發表於 2008-2-10 11:39:05 | 顯示全部樓層
說說看我的想法
3 n4 v, t4 c& ]# ^4 Q
9 K% ?+ |* D* W3 ?9 }1 y設定一個 前進次數 的變數
% ^1 L; g6 f) @! Hdefault給1
; O/ n! d) ^' h; C% J8 H' \$ D- |" S) f) C0 m( w5 T0 ~3 ^& K3 g
接著去抓你鍵盤的Input4 c( Q7 B% R( T) m2 u+ s' G) q
只要有數字出現,  就把 前進次數 的 value 用現在的input  取代掉
% O! G; n7 F3 ^2 F; ^( O7 ~7 m' @7 X% y% `+ r! D8 n
直到你 按下 前進   啟動了  前進 這個副程式/ k3 |9 c2 P, }! o. x
這個副程式就會去抓  你目前  前進次數 的值
( p3 p5 m! f* {4 N, j& v開始做遞減的運算
2 d4 B4 x3 Z- ^! k* N4 C
* `8 f  [, Q9 p每前進一次  這個變數就會減1  (或是先減一再前進完全看你設定迴圈停止的條件是什麼?)& a. T# F, {. H* Q3 g7 l8 e
直到那個前進的次數到達時" Y2 y) n4 D  ^0 R" s" \
前進的 副程式就會停止動作

評分

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

查看全部評分

 樓主| 發表於 2008-2-10 14:41:54 | 顯示全部樓層
真是非常感謝你的意見8 o; e  r- W9 X$ H# H4 a1 f# ~

/ H. F- i$ E. D4 X: X) C! a. @希望以後也還請多多的指教!
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |才庫事業群

GMT+8, 2021-10-22 10:36 AM , Processed in 0.098005 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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