VHDL状态机

VHDL状态机,vhdl,Vhdl,我用VHDL编写了一些代码,希望能够查看转子开关,并将其位置反馈给我 当它转动时,它将读取灰色代码,从转子刻度盘和开关状态到相应的灰色代码状态 改变状态的行为告诉我转子扭曲的方式,这样我可以在电路中的计数器模块上指示上升或下降状态 如果状态改变,则应在Mag上触发脉冲,并在up\u dwn上触发1或0 当我模拟它时,它不起作用。我偶尔会在Mag上看到一点提示,但没有up\u dwnchange 我怀疑它卡在START状态 有人愿意看看我,告诉我我做错了什么吗 [编辑:使用Quartus II第9

我用VHDL编写了一些代码,希望能够查看转子开关,并将其位置反馈给我

当它转动时,它将读取灰色代码,从转子刻度盘和开关状态到相应的灰色代码状态

改变状态的行为告诉我转子扭曲的方式,这样我可以在电路中的计数器模块上指示上升或下降状态

如果状态改变,则应在
Mag
上触发脉冲,并在
up\u dwn
上触发1或0

当我模拟它时,它不起作用。我偶尔会在
Mag
上看到一点提示,但没有
up\u dwn
change

我怀疑它卡在
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;
ieee库;
使用ieee.std_logic_1164.ALL;
实体EncoderV2是
港口(
Chu AB:标准逻辑向量(1到0);
clk:标准逻辑中;
nReset:标准逻辑中;
up_dwn,Mag:输出标准逻辑);
末端编码RV2;
EncoderV2的架构a是--
类型状态_类型为(启动、s00、s01、s11、s10);
信号状态:状态_型;
开始
过程(clk、NRET)
开始
如果nReset='0',则--asynch重置为零

状态对我来说很好。。。用Modelsim模拟

我用50、100和200兆赫来模拟它。 我唯一想知道的是你使用了“IF..nReset='0'THEN”。。你确定吗?
我花了20分钟才看到它并在我的刺激文件中更改它。

对我来说很好。。。用Modelsim模拟

我用50、100和200兆赫来模拟它。 我唯一想知道的是你使用了“IF..nReset='0'THEN”。。你确定吗?
在我看到它并在我的刺激文件中更改它之前,它花费了我大约20分钟的时间。

你确定你正确地刺激了你的实体吗?行为实际上取决于您提供的输入。如果您使用Modelsim进行模拟,您应该能够轻松地看到问题所在以及实际行为与预期行为的偏差。实体不能停留在
START
状态,因为
Mag
在该状态下始终为0(你可以替换所有的
MagI,我在模拟人生中使用Quartus,它看起来就像8月份萨斯喀彻温省的一次屠杀一样有问题。现在我一直在看它,我似乎有一个输入,不管我怎么设置它都不会改变。开始认为可能是软件造成的。结果是模拟器造成的。代码一切都很好一旦我将其编程到芯片中。Quartus似乎一直存在问题。很好的软件,对sim卡感到羞耻。羞耻。你可以尝试使用Modelsim进行模拟。有一个免费的学生版。在你的代码超过一定行数后,它将限制模拟速度,但出于你的目的,这不应该是一个问题。关于你的系统的一个建议n循环过程写入:
up\u dwn
Mag
应包含在重置条款中(除非您有特殊原因不这样做)。你确定你正确地刺激了实体吗?行为实际上取决于你提供的输入。如果你使用Modelsim进行模拟,你应该能够很容易地看到问题所在以及实际行为偏离预期行为的地方。实体不能停留在
开始
状态,因为
Mag
在该状态下始终为0(你可以替换所有的
MagI,我在模拟人生中使用Quartus,它看起来就像8月份萨斯喀彻温省的一次屠杀一样有问题。现在我一直在看它,我似乎有一个输入,不管我怎么设置它都不会改变。开始认为可能是软件造成的。结果是模拟器造成的。代码一切都很好一旦我将其编程到芯片中。Quartus似乎一直存在问题。很好的软件,对sim卡感到羞耻。羞耻。你可以尝试使用Modelsim进行模拟。有一个免费的学生版。在你的代码超过一定行数后,它将限制模拟速度,但出于你的目的,这不应该是一个问题。关于你的系统的一个建议n循环过程写入:
up\u dwn
Mag
应包含在重置条款中(除非您有特殊原因不这样做)。我想我必须下载ModelSim。奇怪的是,它与该模拟器一起工作,但与Quartus的性能有问题。我认为是同一家公司。nReset='0'是正确的。所有异步重置的低电平信号都是课堂规则。我想我必须下载ModelSim。奇怪的是,它与该模拟器一起工作,但有问题Quartus的性能。我认为是同一家公司。nReset='0'是正确的。所有异步重置的低电平信号是类中的规则。