2011-10-20 33 views
1

我正在設計一個shift鍵檢測器。我寫了一個測試工作臺。測試表明我的實現不正確。VHDL - 在我的密鑰檢測中未定義的行爲

這裏是ModelSim中的模擬。

enter image description here

紅線指示未定義。這種行爲只發生兩次。

讓我困惑的是:爲什麼這兩個值之間有這麼大的差距?如果你看看測試臺,第三和第四程序使用第一和第二的格式。

試驗檯是在這裏: http://pastebin.com/BJVFFgGr

探測器代碼是在這裏: http://pastebin.com/di42FLqT

正如你所看到的。我的設計中有兩個狀態。 PS2接收器將在按下(或釋放)按鍵時過濾並生成乾淨的8位製作代碼。中斷代碼只是F0,後面跟着剛剛發佈的密鑰的代碼。我的狀態機使用兩個額外的位來跟蹤哪個鍵被按下。

我經歷了調試,並且當我們輸入第三個測試值時,SHIFT = U而不是前一個值中的1。

-- release left shift 
hex <= "11110000"; 
wait for 5 ns; 
clk <= NOT clk; 
wait for 50 ns; 
clk <= NOT clk; 
wait for 50 ns; 

hex <= "00010010";  <----- when I am here shift is already U 
wait for 5 ns; 
clk <= NOT clk; 
wait for 50 ns; 
clk <= NOT clk; 
wait for 50 ns; 

if (shift /= '0')then 
    error <= '1'; 
end if; 

left_pressed和right_pressed是信號,而不是變量。所以他們應該在任何情況下都有價值。如果其中一個改變,與換檔信號的連接將自動更新。

有人可以幫我嗎?謝謝。

謝謝。

回答

3

我希望你得到了 'U' 輸出,因爲

shift <= left_pressed or right_pressed; 

和right_pressed是不確定的,所以當left_pressed通過right_pressed節目變成 '0' 的 'U'。

記住

1 or x == 1 
0 or x == x 

其中x可以是 '0', '1', 'U', 'X', 'Z', ' - ', 'H', 'L'

有你的代碼中脫穎而出,以我

  1. 在left_pressed的時刻,right_pressed是鎖存器,因爲它們會攜帶自己的價值,從一個週期到在某些情況下接下來的一些問題,但他們不在鍾控過程中。如果你希望它們是簡單的信號,那麼你需要在過程開始時給它們默認值。如果你想讓它們成爲寄存器,它們需要處於一個鐘控過程中。

    next_state也是如此。它應該有一個默認值。

    next_state <= current_state; 
    
  2. current_state需要在異步進程的敏感列表中。

  3. 使用一個單獨的進程來生成您在您的測試臺時鐘。目前它與刺激你的時鐘週期的刺激混合在一起。這也使得難以閱讀。

    process p_clkgen 
    begin 
        repeat begin 
         clk <= NOT clk; 
         wait for 50 ns; 
        end; 
    end process; 
    

    然後其他進程只處理輸入轉換時。 (我不記得,如果重複是VHDL一個有效的關鍵詞,但你的想法)

  4. 我懷疑你對你的狀態思維混淆。也許狀態應該是左或右shift鍵被按下,以及接通或斷開對他們每個人的是狀態之間的轉換。我認爲這種混淆是left_pressed和right_pressed目前鎖存的原因之一。

+0

謝謝!我在哪裏插入next_state <= current_state?我做了其他的事情,但我認爲有人在搞我。謝謝 – CppLearner

+0

開始更新next_state的過程。這是一個默認情況,所以如果其他任務都沒有命中,那麼你仍然定義了下一個狀態應該是什麼。 –

2

您的組合過程驅動器left_pressedright_pressed。但是,您不會在每個可能的流程執行中分配一個值。在硬件中,這會創建一個鎖存器。在模擬中,您將留下初始值('U')。

無論是在你的進程的開始指定一個默認值這些信號,或爲他們創造寄存器。

+0

謝謝。我正在嘗試修復它。 – CppLearner

相關問題