2013-03-18 76 views
0

我對VHDL和XILINX ISE非常陌生。我使用Xilinx ISE的版本13.2。使用VHDL和Xilinx的按鈕開關設計計數器

我想設計具有以下輸入一個非常簡單的計數器:

  • 方向
  • 計數

計數輸入將被分配到一個按鈕,我想計數器計數當按下按鈕時根據方向輸入上下。在這之前我已經寫了一個樣本VHDL。它有一個時鐘輸入,它根據時鐘輸入進行計數。現在我希望它在按下按鈕而不是同步計數時進行計數。

這是我的VHDL代碼(請告訴我,如果我的代碼有一個邏輯或任何其他瑕疵):

entity counter is 
    Port (COUNT_EN : in STD_LOGIC; 
      DIRECTION : in STD_LOGIC; 
      COUNT_OUT : out STD_LOGIC_VECTOR (3 downto 0)); 
end counter; 

architecture Behavioral of counter is 

signal count_int : std_logic_vector(3 downto 0) := "0000"; 
begin 
process 
begin 
    if COUNT_EN='1' then 
     if DIRECTION='1' then 
      count_int <= count_int + 1; 
     else 
      count_int <= count_int - 1; 
     end if; 
    end if; 
end process; 
COUNT_OUT <= count_int; 
end Behavioral; 

我使用的Spartan XC3S500E和我放在相應的投入。下面是我的.UCF文件:

#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18 
NET "COUNT_EN" LOC = K17; 
NET "COUNT_OUT[0]" LOC = F12; 
NET "COUNT_OUT[1]" LOC = E12; 
NET "COUNT_OUT[2]" LOC = E11; 
NET "COUNT_OUT[3]" LOC = F11; 
NET "DIRECTION" LOC = L13; 
#Created by Constraints Editor (xc3s500e-fg320-5) - 2013/03/18 
NET "COUNT_EN" CLOCK_DEDICATED_ROUTE = FALSE; 

我需要改變的最後一行,因爲我得到的錯誤:

This will not allow the use of the fast path between the IO and the Clock... 

有此錯誤走了以後,我編程的設備。但輸出(LED)發瘋了。他們有時會靜止幾秒鐘,有時只是快速閃現。我無法弄清楚我的錯誤在哪裏。我會很感激任何幫助,一些初學者教程非常感謝(我發現的鏈接指向我xilinx的文檔,他們似乎對初學者來說非常複雜)。

回答

1

從你的描述我知道你是不是尋找Asynchronous Counter

你需要的是計數器,從按鈕​​開關觸發計數。下面RTL應該工作:

enter image description here

如果HDL任何困難的編碼讓我知道。

+0

我知道這個帖子是舊的,但這裏是一個重要的錯誤,在較低的圖片!所顯示的去抖動邏輯僅僅是一個邊緣檢測。真正的去抖動邏輯需要定時器和FSM來過濾輸入信號中的毛刺(稱爲去抖動)。 – Paebbels 2014-08-25 12:28:35

1

你沒有時鐘。一旦COUNT_EN方向條件得到滿足,count_int變量將會盡可能快地增加......事實上,當單個位改變的時間可能會使整個事情完全不穩定和不正確。

您應該始終使用一個時鐘...只是爲了讓FPGA獲得正確的時序。

在這種情況下,將時鐘放回...然後添加新信號COUNT_EN_LAST。保存舊的COUNT_EN每個都通過鍾控程序。僅當COUNT_EN ='1'COUNT_EN_LAST ='0'時才遞增。

事實上,你會發現你需要「去抖」輸入。物理按鈕/開關「反彈」,每按一次按鈕就會給您多個關閉事件。爲此,你會簡單地使COUNT_EN_LAST一個矢量(比方說5長),新值每次移位到它(「COUNT_EN_LAST < = COUNT_EN_LAST(3 DOWNTO 0)& COUNT_EN;」),並且僅當增量COUNT_EN_LAST =「01111」,或者在它們全部爲1之前。您需要的矢量長度將根據您的時鐘速度以及開關在穩定到新狀態之前可以反彈多長時間而發生變化。

+0

看來,我認爲「簡單」的結果比前一個簡單的時鐘示例更復雜:)當我嘗試在電路板上說出什麼時,我會讓你知道。感謝您的時間:) – Varaquilex 2013-03-18 19:54:57