Chisel学习7 有限状态机

有限状态机(FSM)是数字设计中的基本构建块。FSM可以被描述为一组状态和状态之间的条件(保护)状态转换。FSM具有初始状态,其在复位时被设置。FSM也称为同步时序电路。

FSM的实现由三部分组成:(1)保持当前状态的寄存器,(2)计算取决于当前状态和输入的下一状态的组合逻辑,以及(3)计算FSM的输出的组合逻辑。

原则上,包含用于存储状态的寄存器或其他存储器元件的每个数字电路可以被描述为单个FSM。但是,这可能并不实际,例如,尝试将您的笔记本电脑描述为单个FSM。在下一章中,我们将描述如何通过将较小的FSM组合成通信FSM来构建更大的系统。

基本有限状态机

图8.1显示了FSM的原理图。寄存器包含当前状态。下一状态逻辑根据当前状态和输入(in)计算下一状态值(nextState)。在下一个时钟周期,state变为nextState。输出逻辑计算输出(out)。由于输出仅取决于当前状态,因此该状态机被称为摩尔机。
在这里插入图片描述
在这里插入图片描述
状态图直观地描述了这种FSM的行为。在状态图中,各个状态被描绘为用状态名称标记的圆圈。状态转换用状态之间的箭头示出。采用此转换时的防护(或条件)将绘制为箭头的标签。

图8.2显示了一个简单的FSM示例的状态图。FSM有三种状态:绿色、橙色和红色,指示警报级别。FSM在绿色电平启动。当不良事件发生时,警报级别切换为橙色。在第二个不良事件时,报警级别切换为红色。在这种情况下,我们想敲响警钟;振铃是该FSM的唯一输出。我们将输出添加到红色状态。报警器可通过清除信号复位。

虽然状态图可能在视觉上令人愉悦并且FSM的功能可以被快速地掌握,但是状态表可能更快地被写下。表8.1显示了报警FSM的状态表。我们列出当前状态、输入值、结果下一个状态和当前状态的输出值。原则上,我们需要为所有可能的状态指定所有可能的输入。这个表有3×4 = 12行。我们简化了表,指出明确的输入是一个不关心当一个坏的事件发生。这意味着坏事件优先于清除事件。输出列有一些重复。如果我们有一个更大的FSM和/或更多的输出,我们可以将表分成两个,一个用于下一个状态逻辑,一个用于输出逻辑。
在这里插入图片描述
最后,在我们的警告级别FSM的所有设计之后,我们将在Chisel中对其进行编码。清单8.1显示了报警FSM的Chisel代码。注意,我们使用Chisel类型Bool作为FSM的输入和输出。要使用Enum和开关控制指令,我们需要导入chisel3.util。

  // The three states
  val green :: orange :: red :: Nil = Enum(3)

各个状态值被描述为一个列表,其中各个元素与::运算符; Nil表示列表的结尾。将枚举实例分配给状态列表。

使用Mealy状态机进行快速输出

在Moore FSM上,输出仅取决于当前状态。这意味着输入的改变可以被视为下一个时钟周期中最早的输出的改变。如果我们想观察到一个即时的变化,我们需要一个从输入到输出的组合路径…让我们考虑一个最小的例子,边缘检测电路。

图8.3显示了上升沿检测器的原理图。当当前输入为1且上一个时钟周期中的输入为0时,输出在一个时钟周期内变为1。状态寄存器只是一个D触发器,其中下一个状态只是输入。我们也可以将其视为一个时钟周期的延迟元件。输出逻辑将当前输入与当前状态进行比较。
在这里插入图片描述
当输出也取决于输入时,即,在FSM的输入和输出之间存在组合路径,这被称为Mealy状态机。

在这里插入图片描述

图8.4所示为Mealy型有限状态机的原理图。与Moore FSM类似,寄存器包含当前状态,下一状态逻辑根据当前状态和输入(in)计算下一状态值(nextState)。在下一个时钟周期,state变为nextState。输出逻辑根据当前状态和FSM的输入计算输出(out)。

图8.5显示了边缘检测器的Mealy FSM的状态图。由于状态寄存器仅由单个D触发器组成,因此只有两种状态是可能的,在该示例中我们将其命名为零和一。由于Mealy FSM的输出不仅依赖于状态,而且依赖于输入,因此我们不能将输出描述为状态循环的一部分。相反,状态之间的转换用输入值(条件)和输出(斜杠之后)标记。还请注意,我们绘制自转换,例如,在状态零中,当输入为0时,FSM保持在状态零,并且输出为0。上升沿FSM仅在从状态0转换到状态1时产生1输出。在状态1中,表示输入现在为1,输出为0。我们只希望输入的每个上升沿都有一个(周期)普尔斯。

  switch (stateReg) {
    is(zero) {
      when(io.din) {
        stateReg := one
        io.risingEdge := true.B
      }
    }
    is(one) {
      when(!io.din) {
        stateReg := zero
      }
    }
  }

上述代码显示了使用Mealy机进行上升沿检测的Chisel代码。与前面的示例一样,我们使用Chisel类型Bool作为单位输入和输出。输出逻辑现在是下一状态逻辑的一部分;在从0到1的转变时,输出被设置为真。否则,对输出的默认赋值(false.B)将被计入。

Moore Vs Mealy

为了显示Moore和Mealy FSM之间的差异,我们用Moore FSM重新进行边缘检测。
在这里插入图片描述
上图显示了Moore FSM的上升沿检测状态图。首先要注意的是,与Mealy版本中的两个状态相比,Moore FSM需要三个状态。需要状态puls来产生周期脉冲。FSM保持在仅脉冲一个时钟周期的状态,然后返回到起始状态零或一状态,等待输入再次变为0。我们在状态转换箭头上显示输入条件,并在表示状态的圆圈内显示FSM输出。

Moore版本的上升沿检测电路。它使用的D触发器数量是Mealy或直接编码版本的两倍。因此,所得到的下一状态逻辑也大于Mealy或直接编码的版本

Mealy FSM是更好的FSM,因为它们需要更少的状态,并且比Moore FSM反应更快。然而,Mealy机中的组合路径可能会在更大的设计中引起麻烦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值