从 FSM 中的特定统计数据开始

start from a specific stat in the FSM

我有一个工作正常的特定 FSM。但我想从 FSM 中的特定状态开始,我想知道我是否可以使用在电路中只发生一次的事件来做到这一点,但我不能这样做,因为我想到的所有事件都将电路保持在相同状态

library ieee;
use ieee.std_logic_1164.all;
use work.all;

entity ELEVAR is
port(
clk, rst: in std_logic;
NF,status : in std_logic_vector(2 downto 0);
output: out std_logic_vector(2 downto 0));
end ELEVAR;

architecture struct of ELEVAR is
type state is(S,S0,S1,S2,S3,S4,S5,S6,S7,S8,HI);
signal current_state, next_state:state; 
signal output22 : std_logic_vector(2 downto 0);

begin 
    process(clk, rst)
    begin
            if(rst='1')then
                current_state<=S0;

            elsif(rising_edge(clk))then


            else
                    null;
            end if;

    end process;




    process(current_state)

    begin

            case current_state is

                when S8=>next_state<=S7;
                            output<="111";

 output22<="111";
    if (NF=output22) then
    next_state<=HI;
    output<="111";
    end if;

                when S7=>next_state<=S6;
                            output<="110";

 output22<="110";
    if (NF=output22) then
    next_state<=HI;
    output<="110";
    end if;
                when S6=>next_state<=S5;
                            output<="101";

 output22<="101";
    if (NF=output22) then
    next_state<=HI;
    output<="101";

    end if;
                when S5=>next_state<=S4;
                            output<="100";

 output22<="100";
    if (NF=output22) then
    next_state<=HI;
                output<="100";
    end if;
                when S4=>next_state<=S3;
                            output<="011";

 output22<="011";
    if (NF=output22) then
    next_state<=HI;
    output<="011";
    end if;
                when S3=>next_state<=S2;
                            output<="010";

 output22<="010";
    if (NF=output22) then
    next_state<=HI;
        output<="010";
    end if;
                when S2=>next_state<=S1;
                            output<="001";

 output22<="001";
    if (NF=output22) then
    next_state<=HI;
            output<="001";
    end if;
                when S1=>next_state<=S0;
                            output<="000";

 output22<="000";
    if (NF=output22) then
    next_state<=HI;
        output<="000";
    end if;

                 when others => next_state<=HI;
                            null;


            end case;
    end process;

  end struct;

--这段代码选择了我想从哪个状态开始但我不知道 --- 我应该把它放在我的代码中的什么地方。

   current_state<=next_state;
                elsif status = "000" then 
                current_state<=S0;
                elsif 
                status = "001" then 
                current_state<=S1;
                elsif 
                status = "010" then 
                current_state<=S2;
                elsif 
                status = "011" then 
                current_state<=S3;
                elsif 
                status = "100" then 
                current_state<=S4;
                elsif 
                status = "101" then 
                current_state<=S5;
               elsif 
                status = "110" then 
                current_state<=S6;
                elsif 
                status = "111" then 
                current_state<=S7;

如果未提供初始值,信号将默认使用该信号子类型范围的最左边的值进行初始化。在您的例子中,类型是 State,最左边的值是 S。因此你的初始状态是 S.

您可以在声明信号时为其分配一个初始值:

signal current_state : State := S4;
signal next_state    : State;

现在,初始值为S4,起始状态也为S4

请注意,FSM 可以有不同的启动和重置状态。 (并不是说它总是很聪明。)这取决于底层技术(FPGA、Xilinx、Altera、ASIC 等),如果重置状态可以不同于初始状态。


其他提示:

  • 不要枚举像 S1、S2 这样的标识符!
    使用正确的州名。
  • 如果您需要检查 status 多个不同的值,请使用 case 语句,但不要使用 if/elsif 决策树。
  • 您进程的敏感度列表不完整。
  • 不要使用异步重置。