/使用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为类型的信号

我正在用VHDL实现一个UML状态图,使用
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值