2012-06-05 120 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'是正确的。我们所有异步重置的低电平信号是课堂上的规则。 –