我在預期看一個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;
你確定你正在刺激你的實體嗎?行爲真的取決於你提供的輸入。如果您使用Modelsim進行模擬,您應該能夠輕鬆地看到問題所在以及實際行爲偏離預期問題的地方。該實體不能被卡在'開始'狀態,因爲在該狀態下,'Mag'總是0(你可以在第一個'IF'之前用一個'Mag'='0'你說'Mag'偶爾會改變。 – simon
我正在使用Quartus模擬人生,它似乎像八月份薩斯喀徹溫省的馬車一般。現在我一直在看它,不管我設置了什麼,我似乎都有一個不會改變的輸入。開始認爲軟件應該是責任。 –
原來模擬器是怪罪。一旦我將它編入芯片後,代碼一切正常。似乎是Quartus正在進行的一個問題。很好的軟件,對模擬器很慚愧。 –