我在预期看一个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正在进行的一个问题。很好的软件,对模拟器很惭愧。 –