stateflow基础知识之(时序逻辑)

       stateflow状态转移和动作过程中,可以使用两种类型的时序逻辑:基于事件和绝对时间。基于事件的时序逻辑可跟踪重复发生的事件,绝对时间时序逻辑则基于 Stateflow 图的仿真时间定义时间段。要对这些重复事件或仿真时间进行操作,可以使用称为时序逻辑操作符的内置函数。

         tateflow可实现时序逻辑,通过时间控制stateflow图的执行,包括基于事件的时序逻辑和绝对时间的时序逻辑。

操作符

语法

说明

after

after(n, E)

E 是 after 操作符的基础事件;n 可以是:

·  正整数

·   计算结果为正整数值的表达式

如果基础事件 E 自关联状态激活后至少已发生 n 次,则返回 true。否则,操作符返回 false。

在不包含输入事件的 Stateflow 图中,如果图自关联状态激活后已唤醒 n 次或更多次,after(n, tick) 或 after(n, wakeup) 会返回 true。

每次关联状态重新激活时,请将 E 的计数器重置为 0。

before

before(n, E)

E 是 before 操作符的基础事件;n 可以是:

·  正整数。

·  计算结果为正整数值的表达式。

如果基础事件 E 自关联状态激活后发生次数少于 n 次,则返回 true。否则,操作符返回 false。

在不包含输入事件的 Stateflow 图中,如果 Stateflow 图自关联状态激活后唤醒次数少于 n 次,则 before(n, tick) 或 before(n, wakeup) 会返回 true。

每次关联状态重新激活时,请将 E 的计数器重置为 0。

at

at(n, E)

E 是 at 操作符的基础事件;n 可以是:

· 正整数。

·  计算结果为正整数值的表达式。

仅当基础事件 E 自关联状态激活后发生第 n 次时,才返回 true。否则,操作符返回 false。

在不包含输入事件的 Stateflow 图中,如果 Stateflow 图自关联状态激活后已唤醒第 n 次,at(n, tick) 或 at(n, wakeup) 将返回 true。

每次关联状态重新激活时,请将 E 的计数器重置为 0。

every

every(n, E)

E 是 every 操作符的基础事件;n 可以是:

·  正整数。

·  计算结果为正整数值的表达式。

当基础事件 E 自关联状态激活后每发生 n次时,返回 true。否则,操作符返回 false。

在不包含输入事件的 Stateflow 图中,当图自关联状态激活后唤醒 n 的整数倍次数时,every(n, tick) 或 every(n, wakeup) 会返回 true。

每次关联状态重新激活时,请将 E 的计数器重置为 0。因此,此操作符只适用于状态操作,而不适用于转移。

temporalCount

temporalCount(E)

E 是 temporalCount 操作符的基础事件。

自关联状态激活后,基础事件 E 每发生一次,值递增 1,并返回正整数。否则,操作符返回 0 值。

每次关联状态重新激活时,请将 E 的计数器重置为 0。

以下示例说明了基于事件的时序逻辑在状态动作和转移中的使用。

操作符

用法

示例

说明

after

状态动作

(on after)

on after(5, CLK): status('on');

每次 CLK 循环期间会出现一条状态消息,从状态激活后开始 5 个时钟周期。

after

转移

ROTATE[after(10, CLK)]

仅在广播 ROTATE 事件但不早于状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。

before

状态动作

(on before)

on before(MAX, CLK): temp++;

temp 变量在每次 CLK 循环时递增一次,直到状态达到 MAX 限制。

before

转移

ROTATE[before(10, CLK)]

只在广播 ROTATE 事件但不晚于状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。

at

状态动作

(on at)

on at(10, CLK): status('on');

状态消息会在状态激活后的正好 10 个 CLK 循环时出现。

at

转移

ROTATE[at(10, CLK)]

仅在广播 ROTATE 事件且正好在状态激活后的 10 个 CLK 循环时,才会发生转出关联状态的转移。

every

状态动作

(on every)

on every(5, CLK): status('on');

状态激活后,每 5 个 CLK 循环会出现一条状态消息。

temporalCount

状态动作

(during)

du: y = mm[temporalCount(tick)];

此动作会对状态激活后的时钟时间进行计数并返回整数值。然后,该动作会为变量 y 赋予 mm 数组的值,该数组的索引是 temporalCount 操作符返回的值。

 

stateflow中每个状态有两种形式:OR和AND,设置方式为:点击需要设置状态模式的状态,右键选择该状态内部的子状态的运行方式。如果为OR,则需要选择内部子状态执行的顺序,如果为AND则表示状态激活时,内部的子状态将同时被激活,处于并行模式。并行状态一般与stateflow的广播相关,具体可以参考广播的内容。




  • 6
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值