学习笔记——状态机

一、定义

状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一种数学模型
将电路的全部工作方式,分成几个场景,这些场景的工作方式明显不同,然后将这些场景通过数学模型表示出来

二、分类

1、摩尔Moore状态机

输出只和状态有关而与输入无关
状态表
在这里插入图片描述

2、米莉Mealy状态机

输出不仅和状态有关而且和输入有关系
状态表
在这里插入图片描述

三、简单举例

人有三个状态健康, 感冒,康复中。
触发的条件有淋雨(t1),吃药(t2),打针(t3),休息(t4)。
所以状态机就是
健康-> (t4) ->健康;
健康-> (t1) ->感冒;
感冒-> (t2) ->康复中;
感冒-> (t3) ->健康;
康复中- (t45->健康,等等。
就是这样状态在不同的条件下跳转到自己或不同状态的图。简单的讲就是状态转换图,如果学过模电的话,对于状态转换图应该比较熟悉。状态转换图如下所示:
在这里插入图片描述
上图所示代表,我们现有四个状态,在S0状态下我收到00那么我就跳转到S1状态,如果在S1状态下我收到10那么我们就跳转到S2。如果在S2状态如果收到10就跳转到S0,如果收到00那么就跳转到S3。

四、结构

1、状态寄存器

记忆当前状态机所处的状态——就是我当前是什么状态我就写什么状态,00就表示S1状态,01就表示S2状态。

2、产生下一状态的组合逻辑

根据输入信号和当前状态决定下一状态

3、输出逻辑

当前状态和输入信号决定当前状态的输出

五、标准

1.状态机要安全。
要求我们的状态机要 完备不能进入死循环,特别是不能进入非预知的状态。
2.状态机的设计要满足面积和速度的要求。
要求设计简洁、高效的状态机。
3.状态机的设计要清晰易懂,易维护。

六、四大概念

1、 State 状态

一个状态机至少要包含两个状态。例如自动门,有 open 和 closed 两个状态。

2、 Event 事件

事件就是执行某个操作的触发条件或者口令。对于自动门,“按下开门按钮”就是一个事件。

3、 Action 动作

事件发生以后要执行动作。例如事件是“按开门按钮”,动作是“开门”。编程的时候,一个 Action 一般就对应一个函数。

4、 Transition 变换

也就是从一个状态变化为另一个状态。例如“开门过程”就是一个变换。

七、三段式状态机

三段式状态机一般包含以下三段:当前状态、下一状态和输出。

  • 一个always模块采用同步时序的方式描述状态转移
//第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄
存器
always @ (posedge clk or negedge rst_ n)begin
   if(!rst_ n)begin
      current state <= IDLE:
end
else begin
   current state <= next state; //注意,使用的是非阻塞赋值
  end
end

  • 第二个always采用组合逻辑的方式判断状态转移条件,描述状态转移规律。
//第二个进程,组合逻辑always模块,描述状态转移条件判断
always @ (*)begin //电平触发
   case(current_ state)begin
     S1:begin
       if...begin
         next_ state= S2; //阻 塞赋值
       else begin
         next_ state= S1;
       end
    end
    S2:begin
      if...begin
      ......
      default : begin //状态机要完 备
         next state= IDLE;
      end
     endcase
end
  • 其它always模块使用同步时序电路来设计每一个状态的输出。
//第三个进程,同步时序always模块,格式化描述寄存器输出
always @ (posedge clk or negedge rst_ n) begin
   If(!rst_ n)begin
   ...//初始化
   end
   else if(current_ state==S1)begin
        out1<= 1'b1; //注意 是非阻塞逻辑
   end
   else begin
       out1 <='"b0;
   end
end

注意事项

1.三段always模块中,第一个和第三个always模块是同步时序always,用非阻塞赋值(“<=”);第二个always模块是组合逻辑always模块,用阻塞赋值(“=”)。关于阻塞赋值的含义可查阅资料https://www.cnblogs.com/clover-toeic/p/3755360.html
2.第二部分为组合逻辑always模块,对于always的敏感列表必须采用always@ (*)的方式。
3.第二部分,组合逻辑always模块,里面判断条件一定要包含所有情况!可以用else保证包含完全。
4.需要注意:第二部分case中的条件应该为当前态( current state)。
5.三段式并不是一定要写为3个always块,如果输出更多,就不止3段了。

参考链接

https://www.bilibili.com/video/BV1Mt411i7C8?from=search&seid=3358500003755694759

https://blog.csdn.net/wordwarwordwar/article/details/78509445

https://zhuanlan.zhihu.com/p/47434856

https://baike.so.com/doc/1495045-1580947.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于 jQuery 的事件,我可以和你分享一些学习笔记。 1. 绑定事件 在 jQuery 中,我们可以通过以下方式来绑定事件: ``` $(selector).event(function(){ // 事件处理程序 }) ``` 其中,`selector` 表示要绑定事件的元素,`event` 表示要绑定的事件类型,比如 `click`、`mouseover` 等等。事件处理程序则是在事件触发时要执行的代码块。 2. 多个事件绑定 我们可以通过 `on()` 方法来同时绑定多个事件: ``` $(selector).on({ event1: function(){ // 事件处理程序1 }, event2: function(){ // 事件处理程序2 } }) ``` 这样,当 `event1` 或 `event2` 中任意一个事件触发时,对应的处理程序都会被执行。 3. 解除事件 如果需要解除某个元素的事件处理程序,可以使用 `off()` 方法: ``` $(selector).off(event); ``` 其中,`event` 表示要解除的事件类型。如果不指定事件类型,则会解除该元素上所有的事件处理程序。 4. 事件委托 在 jQuery 中,我们可以使用事件委托来提高性能。事件委托是指将事件绑定到父元素上,而不是绑定到子元素上,然后通过事件冒泡来判断是哪个子元素触发了该事件。这样,当子元素数量较多时,只需要绑定一次事件,就可以监听到所有子元素的事件。 ``` $(selector).on(event, childSelector, function(){ // 事件处理程序 }) ``` 其中,`selector` 表示父元素,`event` 表示要绑定的事件类型,`childSelector` 表示要委托的子元素的选择器,事件处理程序则是在子元素触发事件时要执行的代码块。 以上是 jQuery 中事件的一些基本操作,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的fuyao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值