/使用VHDL在UML状态图中输入
我正在用VHDL实现一个UML状态图,使用/使用VHDL在UML状态图中输入,uml,vhdl,statechart,Uml,Vhdl,Statechart,我正在用VHDL实现一个UML状态图,使用case语句执行/和退出状态活动很容易实现。但是,是否有人知道如何有效地实施条目状态活动 我想添加一个只执行一次的标志,或者在namestate之前添加一个名为name\u entry的额外状态。但是我不喜欢这些选项…如果我理解得很好,你只想用VHDL描述一个FSM? 为此,您首先需要在类型中声明所有可能的状态 TYPE my_state_type IS (s0, s1, s2); 然后,您必须创建一个以my\u state\u type为类型的信号
case
语句<代码>执行/和退出状态活动很容易实现。但是,是否有人知道如何有效地实施条目
状态活动
我想添加一个只执行一次的标志,或者在
name
state之前添加一个名为name\u entry
的额外状态。但是我不喜欢这些选项…如果我理解得很好,你只想用VHDL描述一个FSM?
为此,您首先需要在类型中声明所有可能的状态
TYPE my_state_type IS (s0, s1, s2);
然后,您必须创建一个以my\u state\u type
为类型的信号
SIGNAL my_state : my_state_type := s0; -- for initialisation
然后,在您的过程中,您确实需要为每个州设置一个案例
fsm : PROCESS (clk, rst)
BEGIN
IF (rst = '1') THEN
my_state <= s0 ; -- reset value
ELSIF (rising_edge(clk)) THEN
CASE my_state IS
WHEN s0 => output <= '1'; -- do
IF (input = '1') THEN -- condition to enter s1
my_state <= s1;
ELSE -- condition to stay in s0
my_state <= s0;
END IF;
WHEN s1 => my_state <= s2; -- stay in s1 for only one clk cycle
WHEN s2 => my_state <= s0; -- stay in s2 for only one clk cycle
WHEN OTHERS => my_state <= s0;
END CASE;
END IF;
END PROCESS;
fsm:过程(时钟、rst)
开始
如果(rst='1'),则
我的状态输出如果我理解得很好,你只想用VHDL描述FSM?
为此,您首先需要在类型中声明所有可能的状态
TYPE my_state_type IS (s0, s1, s2);
然后,您必须创建一个以my\u state\u type
为类型的信号
SIGNAL my_state : my_state_type := s0; -- for initialisation
然后,在您的过程中,您确实需要为每个州设置一个案例
fsm : PROCESS (clk, rst)
BEGIN
IF (rst = '1') THEN
my_state <= s0 ; -- reset value
ELSIF (rising_edge(clk)) THEN
CASE my_state IS
WHEN s0 => output <= '1'; -- do
IF (input = '1') THEN -- condition to enter s1
my_state <= s1;
ELSE -- condition to stay in s0
my_state <= s0;
END IF;
WHEN s1 => my_state <= s2; -- stay in s1 for only one clk cycle
WHEN s2 => my_state <= s0; -- stay in s2 for only one clk cycle
WHEN OTHERS => my_state <= s0;
END CASE;
END IF;
END PROCESS;
fsm:过程(时钟、rst)
开始
如果(rst='1'),则
我很难从你说的话中看出你想做什么。由于UML只是一个状态机的表示,它不会给出任何关于您试图开发什么的提示(从功能上讲)。@a.Kieffer当状态发生转换时,/Entry只执行一次(类似于动作)/Do很容易实现,因为状态机在一个进程中,代码一直执行到转换发生,在那里您可以实现/exit。但是,我仍然不知道如何实现一些要执行一次的代码。。。从你说的话中很难看出你想做什么。由于UML只是一个状态机的表示,它不会给出任何关于您试图开发什么的提示(从功能上讲)。@a.Kieffer当状态发生转换时,/Entry只执行一次(类似于动作)/Do很容易实现,因为状态机在一个进程中,代码一直执行到转换发生,在那里您可以实现/exit。但是,我仍然不知道如何实现一些要执行一次的代码。。。如果您的状态变量是枚举类型,那么您不需要使用when others
子句。事实上,我已经习惯于指定others
case以防万一了OK!您只需将何时在UML状态图中编写do/与输出关联即可。您的/entry操作可以与条件IF(input='1')关联,然后。通过在条件中只执行一次操作,您将进入新状态s1
。您可能可以编写IF(input='1')然后编写my_state如果您想创建一个全局\u/entry\u操作,您可能可以尝试条件IF(my_state=s0和my_state\u prev/=s0)然后
在另一个计时进程中,my_state_prev在每个循环后获取my_state值。如果状态变量是枚举类型,则不需要使用when others
子句。事实上,但我已经习惯于在case中指定others
大小写OK!您只需将何时在UML状态图中编写do/与输出关联即可。您的/entry操作可以与条件IF(input='1')关联,然后。通过在条件中只执行一次操作,您将进入新状态s1
。如果你想创建一个全局的输入动作,你可能可以写IF(input='1')然后写my_state如果你想创建一个全局的输入动作,你可能可以尝试条件IF(my_state=s0和my_state_prev/=s0),然后在另一个时钟进程中写,其中my_state_prev在每个周期后取my_state值