从 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
决策树。
- 您进程的敏感度列表不完整。
- 不要使用异步重置。
我有一个工作正常的特定 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
决策树。 - 您进程的敏感度列表不完整。
- 不要使用异步重置。