状态图

何谓状态图

1. 状态图的概念
状态图由状态、转换、事件、活动和动作5部分组成:
  (1)状态指的是对象在其生命周期中的一种状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。一个状态的生命周期是一个有限的时间阶段。
  状态由一个带圆角的矩形表示,状态的描述应该包括:名称、入口和出口动作、内部转换和嵌套状态。
这里写图片描述
  初始状态:每个状态图都应该有一个初始状态,它代表状态图的起始位置。
一个状态图只能有一个初始状态,用一个实心的圆表示。
  终止状态:终止状态是一个状态图的终点,一个状态图可以拥有一个或者多个终止状态。对象可以保持在终止状态,但是终止状态不可能有任何形式的触发转换,它的目的就是为了激发封装状态上的完成转换。
  判定:实际就是工作流在此处按监护条件的取值发生分支,在UML中判定用空心菱形表示。

  (2)转换指的是两个不同状态之间的一种关系,表明对象将在第一个状态中执行一定的动作,并且在满足某个特定条件下由某个事件触发进入第二个状态。
  转换用带箭头的直线表示,一端连接源状态,箭头指向目标状态。转换还可以标注与此转换相关的选项,如事件、监护条件和动作等,如果转换上没有标注触发转换的事件,则表示此转换自动进行。
这里写图片描述

   (3)事件指的是发生在时间和空间上的对状态机来讲有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态,如信号、对象额度创建和销毁等。
   (4)活动指的是状态机中进行的非原子操作。
   (5)动作指的是状态机中可以执行的那些原子操作,所谓原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一直执行下去,最终导致状态的变更或者返回一个值。
2. 为什么要使用状态图
状态图的作用主要体现在以下几个方面:
   (1)状态图清晰的描述了状态之间的转换顺序,通过状态的转换顺序也就可以清晰的看出事件的执行顺序。如果没有状态图我们就不可避免的要使用大量的文字来描述外部事件的合法顺序。
   (2)清晰的事件顺序有利于程序员在开发程序时避免出现事件错序的情况。
   (3)状态图清晰的描述了状态转换时所必须的触发事件、监护条件和动作等影响转换的因素,有利于程序员避免程序中非法事件的进入。
   (4)状态图通过判定可以更好的描述工作流因为不同的条件发生的分支。

构成状态图的元素

1. 状态
  状态名:在实际使用中,状态名通常是直观、易懂、能充分表达语义的名词短语,其中每个单词的首字母要大写。
  内部活动:状态可以包含描述为表达式的内部活动。当状态进入时,活动在进入动作完成后就开始。如果活动结束,状态就完成,然后一个从这个状态出发的转换被触发。
  内部转换:状态可能包含一系列的内部转换,内部转换因为只有源状态而没有目标状态,所以内部转换的结果并不改变状态本身。如果对象的事件在对象正处在拥有转换的状态时发生,那内部转换上的动作也被执行。
  入口和出口动作:状态可能具有入口和出口动作。这些动作的目的是封装这个状态,这样就可以不必知道状态的内部状态而在外部使用它。入口动作和出口动作原则上依附于进入和出去的转换,但是将它们声明为特殊的动作可以使状态的定义不依赖状态的转换,因此起到封装的作用。
  历史状态:组成状态可能包含历史状态(History state)。
2. 转换
  转换用于表示一个状态机的两个状态之间的一种关系,即一个在某初始状态的对象通过执行指定的动作并符合一定的条件下进入第二种状态。
  在这个状态的变化中,转换被称作激发。在激发之前的状态叫做源状态,在激发之后的状态叫做目标状态。简单转换只有一个源状态和一个目标状态。复杂转换有不止一个源状态和(或)有不止一个目标状态。
  外部转换
  外部转换是一种改变状态的转换,也是最普通最常见的一种转换。在UML中,它用从源状态到目标状态的带箭头的线段表示,其他属性以文字串附加在箭头旁。
这里写图片描述
  内部转换
  内部转换只有源状态,没有目标状态,不会激发入口和出口动作,因此内部转换激发的结果不改变本来的状态。如果一个内部转换带有动作,它也要被执行。内部转换常用于对不改变状态的插入动作建立模型。要注意的是内部转换的激发可能会掩盖使用相同事件的外部转换。
  内部转换的表示法与入口动作和出口动作的表示法很相似。他们的区别主要在于入口和出口动作使用了保留字“entry”和“exit”,其它部分两者的表示法相同。
  完成转换
  完成转换没有明确标明触发器事件的转换是由状态中活动的完成引起的。完成转换也可以带一个监护条件,这个监护条件在状态中的活动完成时被赋值,而不是活动完成后被赋值。
  监护条件
  转换可能具有一个监护条件,监护条件是一个布尔表达式,它是触发转换必须满足的条件。当一个触发器事件被触发时,监护条件被赋值。如果表达式的值为真,转换可以激发;如果表达式的值为假,转换不能激发;如果没有转换适合激发,事件会被忽略,这种情况并非错误。如果转换没有监护条件,监护条件就被认为是真,而且一旦触发器事件发生,转换就激活。
  从一个状态引出的多个转换可以有同样的触发器事件。若此事件发生,所有监护条件都被测试,测试的结果如果有超过一个的值为真,也只有一个转换会激发。如果没有给定优先权,则选择哪个转换来激发是不确定的。
  触发器事件
  触发器事件就是能够引起状态转换的事件。如果此事件有参数,这些参数可以被转换所用,也可以被监护条件和动作的表达式所用。触发器事件可以是信号、调用和时间段等。
  对应与触发器事件,没有明确的触发器事件的转换称作结束转换(或无触发器转换),是在结束时被状态中的任一内部活动隐式触发的。
  动作
  动作(action)通常是一个简短的计算处理过程或一组可执行语句。动作也可以是一个动作序列,即一系列简单的动作。动作可以给另一个对象发送消息、调用一个操作、设置返回值、创建和销毁对象。
  动作是原子性的,所以动作是不可中断的,动作和动作序列的执行不会被同时发生的其他动作影响或终止。动作的执行时间非常短,所以动作的执行过程不能再插入其他事件。如果在动作的执行期间接收到事件,那么这些事件都会被保存,直到动作结束,这时事件一般已经得到值。
3. 判定
  判定用来表示一个事件依据不同的监护条件有不同的影响。在实际建模的过程中,如果遇到需要使用判定的情况,通常用监护条件来覆盖每种可能,使得一个事件的发生能保证触发一个转换。
  判定在活动图和状态图中都有很重要的作用。转换路径因为判定而分为多个分支,可以将一个分支的输出部分与另外一个分支的输入部分连接而组成一棵树,树的每个路径代表一个不同的转换。树为建模提供了很大的方便。
  在活动图中,判定可以覆盖所有的可能,保证一些转换被激发。否则,活动图就会因为输出转换不再重新激发而被冻结。
4. 同步
  同步条是为了说明并发工作流的分支与汇合。状态图和活动图中都可能用到同步。在UML中,同步用一条线段来表示。
这里写图片描述
5. 事件
  在状态机中,一个事件的出现可以触发状态的改变。它发生在时间和空间上的一点,没有持续时间。如接受到从一个对象到另一个对象的调用或信号、某些值的改变或一个时间段的终结。
  事件可以分成明确或隐含的几种,主要包括:信号事件、调用事件、改变事件和时间事件等。

状态图的组成

1. 顺序组成状态
  如果一个组成状态的多个子状态之间是互斥的,不能同时存在的,这种组成状态称为顺序组成状态。
  一个顺序组成状态最多可以有一个初始状态和一个终态,同时也最多可以由一个浅(shallow)历史状态和一个深(deep)历史状态。
这里写图片描述
2. 并发组成状态
  在一个组成状态中,可能有两个或者多个并发的子状态机,我们称这样的组成状态为并发组成状态。每个并发子状态还可以进一步分解为顺序组成状态。
  一个并发组成状态可能没有初始状态,终态,或者历史状态。但是嵌套在它们里的任何顺序组成状态可包含这些伪状态。
这里写图片描述

使用Rose创建状态图

1. 创建状态图
  在Rational Rose中,可以为每个类创建一个或者多个状态图类的转换和状态都可以在状态图中体现。首先,展开“Logic View”菜单项,然后在“Logic View”图标上单击鼠标右键,在弹出的菜单中选择“New”下的“Statechart Diagram”选项建立新的状态图。
这里写图片描述

2. 创建初始和终止状态
  初始状态和终止状态是状态图中的两个特殊状态。初始状态代表着状态图的起点,终止状态代表着状态图的终点。对象不可能保持在初始状态,但是可以保持在终止状态。
  初始状态在状态图中用实心圆表示,终止状态在状态图中用含有实心圆的空心圆表示。鼠标左键点击状态图工具栏中的“”图标,然后在绘制区域要绘制的地方单击鼠标左键就可以创建初始状态。终止状态的创建方法和初始状态相同。
3. 创建状态间的转换
  转换是两个状态之间的一种关系,代表了一种状态到另一种状态的过度,在UML中转换用一条带箭头的直线表示。
  要增加转换,首先用鼠标左键单击状态工具栏中的图标,然后再用鼠标左键单击转换的源状态,接着向目标状态拖动一条直线。
4. 创建监护条件
  监护条件是一个布尔表达式,它控制转换是否能够发生。
  要添加监护条件,先双击转换的图标,选择出现的对话框中的“Detail”选项卡的“Guard Condition”选项,然后填入监护条件。可以参考添加动作的方法添加监护条件。
这里写图片描述

创建项目中的状态图

1. 确定状态图的实体
  要创建状态图,首先要标识出哪些实体需要使用状态图进一步建模。虽然我们可以为每一个类、操作、包或用例创建状态图,但是这样做势必浪费很多的精力。一般来说,不需要给所有的类都创建状态图,只有具有重要动态行为的类才需要。
  从另一个角度看,状态图应该用于复杂的实体,而不必用于具有复杂行为的实体。使用活动图可能会更加适合那些有复杂行为的实体。具有清晰、有序的状态实体最适合使用状态图进一步建模。
  对于学生选课来说,需要建模的实体就是学生账号。

2. 确定状态图中实体的状态
对于一个学生账号来说,它的状态主要包括:
  初始状态
  终止状态
  可选课状态
  不可选课状态
  账号被删除状态
这里写图片描述
3. 创建相关事件完成状态图
  当确定了需要建模的实体,并找出了实体的初始状态和终止状态以及其他相关状态后,就可以着手创建状态图。
  首先,我们要找出相关的事件和转换。对于学生账号来说,当有新的同学入学时,将会给新同学创建一个新的账号,下面新同学可以用这个账号去选课。一般来说,每个人的选课数目是有限的,比如说选择6门课程后将不能再选课。如果已选了6门课程还要再选课,就必须删除已选的课程。直到这位同学毕业,将其账号删除,则进入终止状态。
这里写图片描述

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用:根据设计要求,该电路至少应有四个状态,分别用S1、S2、S3、S4表示。若假设电路的初始状态用S0表示,则可用五个状态来描述该电路。可以画出图(a)所示的原始状态图。 引用:用两个always块对该例的状态机进行描述,其代码如下: module Detector2 ( Sin, CP, nCR, Out) ; input Sin, CP, nCR; //定义输入变量 output Out ; //定义输出变量 reg Out; reg [1:0] Current_state, Next_state; parameter [1:0] S0=2'b00, S1=2'b01, S2 = 2'b10, S3 = 2'b11; //状态转换,时序逻辑 always @(posedge CP or negedge nCR ) begin if (~nCR) Current_state <= S0; //异步清零 else Current_state <= Next_state; //在CP上升沿触发器状态翻转 end //下一状态产生和输出信号,组合逻辑 always @( Current_state or Sin) begin Next_state =2’bxx; Out=1’b 0; case(Current_state ) S0: begin Out =1’b0; Next_state = (Sin==1)? S0 : S1; end S1: begin Out =1’b0; Next_state = (Sin==1)? S2 : S1; end S2: begin Out =1’b0; Next_state = (Sin==1)? S0 : S3; end S3: if (Sin==1) begin Out =1’b1; Next_state = S2; end else begin Out =1’b0; Next_state = S1; end endcase end endmodule 根据以上引用内容,可以通过Verilog代码中的always块和parameter语句来描述状态图。在代码中,定义了输入变量Sin、CP、nCR和输出变量Out,并使用reg和wire关键字进行声明。通过always块,可以实现时序逻辑和状态转换。根据输入信号和当前状态,使用case语句定义了每个状态的输出逻辑和下一状态。根据代码的描述,可以绘制出对应的状态图。由于状态图较为复杂,无法在文本中展示,请参考相关代码和引用、中的状态描述。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于Verilog HDL的状态机描述方法](https://blog.csdn.net/m0_52316372/article/details/128964393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值