bitGateLab Digital · 学习
中文(简体)
打开模拟器

学习 › 第 11 讲

摩尔(Moore)型与米利(Mealy)型状态机:完整设计

阅读约 7 分钟 · bitGateLab 团队

有限状态机(FSM)是一种时序电路,它能“记住”一个过程进行到了哪一步。红绿灯、密码锁、电梯控制器和串行通信接收器都是状态机。本文将介绍两种经典模型,即 Moore 型(摩尔型)和 Mealy 型(米利型),并通过一个 101 序列检测器,带你走完从文字描述到触发器方程的完整设计过程。

状态机的组成部分

所有同步 FSM 都由三个模块组成:

两种模型的区别在于最后一个模块:

Mealy 型状态机通常需要的状态更少,并且在输入到来的同一个周期内就做出响应,但只要输入变化,它的输出随时可能改变。Moore 型状态机要晚一个周期响应,它的输出只在紧接时钟沿之后才变化,因而更“干净”。

问题:101 序列检测器

串行输入 X 与时钟同步到来,每个周期一位。每当最近收到的三位是 1、0、1 时,输出 Z 应为 1。允许重叠:在序列 10101 中有两次检测,因为第一个序列末尾的 1 同时也是下一个序列的开头。

第一步是确定状态机需要记住什么。每个状态代表“序列已经匹配到哪里”:

状态图和状态表(Moore 型)

对每个状态和 X 的每个取值,问自己:加上这个新来的位之后,与 101 的开头相匹配的最长后缀是什么?这个后缀决定了次态。

S0/0 S1/0 S2/0 S3/1 1 0 1 0 1 0 0 1
允许重叠的 Moore 型 101 检测器。箭头上的数字是 X 的取值;输出写在每个状态里面。
现态X = 0X = 1Z
S0S0S10
S1S2S10
S2S0S30
S3S2S11

请注意两个经常出错的转移。在 S1 时又来一个 1:序列以 11 结尾,最后这个 1 仍然可以作为开头,所以状态机留在 S1。在 S3 时来一个 0:序列以 1010 结尾,它的后缀 10 与 101 的开头相匹配,所以转到 S2 而不是 S0。正是这一点使重叠检测成为可能。

状态分配与方程

4 个状态用 2 个 D 触发器(Q1 Q0)就够了。最直接的分配方式是二进制编码:S0 = 00,S1 = 01,S2 = 10,S3 = 11。使用 D 触发器时激励表非常简单,因为 D = Q+。

Q1Q0XQ1+ = D1Q0+ = D0
00000
00101
01010
01101
10000
10111
11010
11101

化简:

  • D0 恰好在 X = 1 的各行为 1,所以 D0 = X。这很合理:在这种分配下,Q0 = 1 表示“上一位是 1”。
  • D1 = Σm(2, 5, 6),变量顺序为 Q1 Q0 X。最小项 2(010)和 6(110)相邻,合并为 Q0·X。最小项 5(101)没有取值为 1 的相邻项,只能单独保留:Q1·Q0·X。D1 = Q0·X + Q1·Q0·X。
  • Moore 型的输出只取决于状态:Z = Q1·Q0。

最终电路包括 2 个 D 触发器、一个用于 Z 的 2 输入 AND 门,以及用于 D1 的一个 2 输入 AND 门、一个 3 输入 AND 门和一个 2 输入 OR 门(外加 Q0 和 X 的反相器)。

用测试序列验证

输入 X = 1 0 1 0 1 1 0 1,从 S0 出发。每个时钟沿之后的状态:

时钟沿12345678
X10101101
状态S1S2S3S2S3S1S2S3
Z00101001

共有三次检测:在第 1 到 3 位、第 3 到 5 位(重叠)和第 6 到 8 位。用方程验证第 4 个时钟沿:状态 S3 = 11,X = 0,D1 = 1·1 + 1·0·0 = 1,D0 = 0,次态为 10 = S2。一致。

Mealy 型版本

在 Mealy 型中,输出标在转移上,所以状态 S3 就多余了:检测发生在“处于 S2 时来了 1”的那一刻。用三个状态 A(无)、B(上一位是 1)和 C(最近几位是 1、0):

状态X = 0X = 1
AA / 0B / 0
BC / 0B / 0
CA / 0B / 1

仍然需要 2 个触发器,但输出 Z = 1 出现在最后一个 1 到来的同一个周期,比 Moore 型版本早一个周期。

常见错误

在模拟器中试一试

有了方程之后,搭出检测器只需几分钟,而时序图可以让你检查每一次转移。

  1. 放置两个接同一时钟的 D 触发器;把它们的输出命名为 Q1 和 Q0。
  2. 把输入 X 直接接到 D0。
  3. 用两个反相器、两个 AND 门和一个 OR 门搭出 D1 = Q0·X + Q1·Q0·X,并接到 D1。
  4. 把 Q1 和 Q0 接到一个 AND 门,再接到一个指示灯作为 Z。
  5. 按照序列 1 0 1 0 1 1 0 1,在每个时钟沿之前改变 X,并在时序图上观察 Z 在第 3、5、8 个时钟沿之后点亮。

练习

  1. 允许重叠时,状态机在序列 1010101 中检测到几次 101?
    答案

    三次:在第 1 到 3 位、第 3 到 5 位和第 5 到 7 位。

  2. 重新写出不允许重叠的 101 检测器的 Moore 型状态表(检测到一次后从头开始)。
    答案

    只有 S3 这一行改变:X = 0 时转到 S0,X = 1 时转到 S1。其余各行不变。

  3. 采用 Mealy 型版本的状态分配 A = 00,B = 01,C = 10,求 Z。
    答案

    只有在状态 C 且 X = 1 时 Z = 1:Z = Q1·Q0·X。如果代码 11 永不出现,可以把它标为 X,于是 Z = Q1·X。

  4. 一个有 9 个状态的状态机至少需要几个触发器?
    答案

    4 个,因为 23 = 8 不够,而 24 = 16 足够。

要复习构成状态寄存器的触发器,请参阅锁存器与触发器。