2012-06-05 163 views
2

我在預期看一個rotory開關和反饋對我來說這是在什麼位置VHDL寫一些代碼。VHDL狀態機

當它被打開,將在從轉子盤的greycode閱讀並將狀態切換到相應的灰碼狀態。

狀態改變的行爲告訴我轉子旋轉的方式,以便在電路後面的計數器模塊上指示上升或下降狀態。

如果狀態改變,它應該在Mag上觸發一個脈衝,並在up_dwn上觸發一個1或0的脈衝。

當我模擬它時它不起作用。我在Mag上發生了一次偶然事件,但沒有up_dwn更改。

我懷疑它卡在START狀態。

任何關心看和告訴我我做錯了什麼?

[編者按:使用的Quartus II版本9]

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY EncoderV2 IS 
PORT(
    CH_AB   : IN STD_LOGIC_VECTOR (1 downto 0); 
    clk    : IN STD_LOGIC; 
    nReset   : IN STD_LOGIC; 
    up_dwn, Mag  : OUT STD_LOGIC); 

    END EncoderV2; 

ARCHITECTURE a OF EncoderV2 IS -- 
TYPE STATE_TYPE IS (START, s00, s01, s11, s10); 
SIGNAL state: STATE_TYPE; 

BEGIN 
PROCESS (clk, nReset) 
BEGIN 
    IF nReset = '0' THEN      -- asynch Reset to zero 
     state <= START; 
    ELSIF clk'EVENT AND clk = '1' THEN   -- triggers on PGT 
     CASE state IS 
      WHEN START => 
        IF CH_AB ="00" THEN 
           state <= s00; 
           Mag <='0'; 
        ELSIF CH_AB="01" THEN 
           state <= s01; 
           Mag <='0'; 
        ELSIF CH_AB= "11" THEN 
           state <= s11; 
           Mag <='0'; 
        ELSIF CH_AB= "10" THEN 
           state <= s10; 
           Mag <='0'; 
        ELSE state <= START; 
        END IF; 

      WHEN s00 =>     -- S10 <- S00 -> S01 
        IF CH_AB= "00" THEN 
           state <= s00; 
           Mag <='0'; 
        ELSIF CH_AB= "10" THEN 
           state <= s10; 
           up_dwn <= '0'; 
           Mag <='1'; 
        ELSIF CH_AB= "01" THEN 
           state <= s01; 
           up_dwn <='1'; 
           Mag <='1'; 
        ELSE state <= START; 
        END IF; 

      WHEN s01 =>     -- S00 <- S01 -> S11 
        IF CH_AB= "01" THEN 
           state <= s01; 
           Mag <='0'; 
        ELSIF CH_AB= "00" THEN 
           state <= s00; 
           up_dwn <= '0'; 
           Mag <='1'; 
        ELSIF CH_AB= "11" THEN 
           state <= s11; 
           up_dwn <='1'; 
           Mag <='1'; 
        ELSE state <= START; 
        END IF; 

      WHEN s11 =>     -- S01 <- S11 ->S10 
        IF CH_AB= "11" THEN 
           state <= s11; 
           Mag <='0'; 
        ELSIF CH_AB= "01" THEN 
           state <= s01; 
           up_dwn <= '0'; 
           Mag <='1'; 
        ELSIF CH_AB= "10" THEN 
           state <= s10; 
           up_dwn <='1'; 
           Mag <='1'; 
        ELSE state <= START; 
        END IF; 

      WHEN s10 =>     -- S11 <- S10 -> S00 
        IF CH_AB= "10" THEN 
           state <= s10; 
           Mag <='0'; 
        ELSIF CH_AB= "11" THEN 
           state <= s11; 
           up_dwn <= '0'; 
           Mag <='1'; 
        ELSIF CH_AB= "00" THEN 
           state <= s00; 
           up_dwn <='1'; 
           Mag <='1'; 
        ELSE state <= START; 
        END IF; 





      END CASE; 
     END IF; 
    END PROCESS; 
END a; 
+0

你確定你正在刺激你的實體嗎?行爲真的取決於你提供的輸入。如果您使用Modelsim進行模擬,您應該能夠輕鬆地看到問題所在以及實際行爲偏離預期問題的地方。該實體不能被卡在'開始'狀態,因爲在該狀態下,'Mag'總是0(你可以在第一個'IF'之前用一個'Mag'='0'你說'Mag'偶爾會改變。 – simon

+0

我正在使用Quartus模擬人生,它似乎像八月份薩斯喀徹溫省的馬車一般。現在我一直在看它,不管我設置了什麼,我似乎都有一個不會改變的輸入。開始認爲軟件應該是責任。 –

+0

原來模擬器是怪罪。一旦我將它編入芯片後,代碼一切正常。似乎是Quartus正在進行的一個問題。很好的軟件,對模擬器很慚愧。 –

回答

0

爲我工作得很好...模擬採用ModelSim

我用50,100和200 MHz的simuleted它。 我唯一想知道的是你使用「IF .. nReset ='0'THEN」..你確定嗎? 在我看到它之前花費我20分鐘,並在我的刺激文件中更改它。

+0

猜測我將不得不下載ModelSim。奇怪的是,它與該模擬器一起工作,但在Quartus上具有錯誤的性能。我想是同一家公司。 nReset ='0'是正確的。我們所有異步重置的低電平信號是課堂上的規則。 –