当前位置:首页 >> 工学 >>

状态机及其VHDL设计


第7章

状态机及其 VHDL 设计

内容提要: 内容提要:有限状态机(Finite State Machine,简称 FSM)是一类很重要的时序电路, 是许多数字系统的核心部件,也是实时系统设计中的一种数学模型,是一种重要的、易于建 立的、应用比较广泛的、以描述控制特性为主的建模方法,它可以应用于从系统分析到设计 的所有阶段。有限状态机的优点在于简单易用,状态间的关系清晰直观。建立有限状态机主 要有两种方法: “状态转移图”和“状态转移表” 。标准状态机通常可分为 Moore 和 Mealy 两种类型。本章主要介绍了基于 VHDL 的常见有限状态机的类型、结构、功能及表达方法, 重点是如何有效地设计与实现。 学习要求:了解状态机的基本结构、功能和分类,掌握有限状态机的一般设计思路与方 学习要求: 法、状态机编码方案的恰当选取、Moore 和 Mealy 状态机的本质区别及设计实现。 关 键 词:状态机(State Machine),Moore,Mealy,VHDL 设计(VHDL Design) 7.1 状态机的基本结构和功能 7.2 一般状态机的 VHDL 设计 7.2.1 状态机的一般组成 7.2.2 状态机的编码方案 7.3 摩尔状态机的 VHDL 设计 7.4 米立状态机的 VHDL 设计

7.1 状态机的基本结构和功能
状态机的基本结构如图 7.1 所示。除了输人信号、输出信号外,状态机还包含一组寄存 器记忆状态机的内部状态。状态机寄存器的下一个状态及输出,不仅同输入信号有关,而且 还与寄存器的当前状态有关, 状态机可以认为是组合逻辑和寄存器逻辑的特殊组合。 它包括 两个主要部分: 即组合逻辑部分和寄存器。 组合逻辑部分又可分为状态译码器和输出译码器, 状态译码器确定状态机的下一个状态, 即确定状态机的激励方程, 输出译码器确定状态机的 输出,即确定状态机的输出方程。寄存器用于存储状态机的内部状态。

输入

状态 状态 译码器 状态 寄存器

输出

图 7.1 状态机的基本结构 状态机的基本操作有两种: 1.状态机的内部状态转换。 状态机经历一系列状态,下一状态由状态译码器根据当前状态和输入条件决定。 2.产生输出信号序列。 输出信号由输出译码器根据当前状态和输入条件确定。 用输入信号决定下一状态也称为“转移” 。除了转移之外,复杂的状态机还具有重复和 历程功能。 从一个状态转移到另一状态称为控制定序, 而决定下一状态所需的逻辑称为转移 函数。 在产生输出的过程中, 根据是否使用输入信号可以确定状态机的类型。 两种典型的状态

机是米立(Mealy) 状态机和摩尔 (Moore)状态机。 摩尔状态机的输出只是当前状态的函数, 而米立状态机的输出一般是当前状态和输入信号的函数。 对于这两类状态机, 控制定序都取 决于当前状态和输入信号。 大多数实用的状态机都是同步的时序电路, 由时钟信号触发进行 状态的转换。 时钟信号同所有的边沿触发的状态寄存器和输出寄存器相连, 使状态的改变发 生在时钟的上升或下降沿。 在数字系统中.那些输出取决于过去的输入和当前的输入的部分都可以作为有限状态 机。有限状态机的全部“历史”都反映在当前状态上。当给 FSM 一个新的输入时,它就会产 生一个输出。输出由当前状态和输入共同决定,同时 FSM 也会转移到下一个新状态,也是随 着 FSM 的当前状态和输入而定。FSM 中,其内部状态存放在寄存器中,下一状态的值由状态 译码器中的一个组合逻辑——转移函数产生, 状态机的输出由另一个组合逻辑——输出函数 产生。 建立有限状态机主要有两种方法:状态转移图(状态图)和状态转移表(状态表) 。它 们是等价的,相互之间可以转换。 状态转移图 如图 7.2 所示, 图中每个椭圆表示状态机的一个状态, 而箭头表示状态之 间的一个转换,引起转换的输入信号及当前输出表示在转换箭头上。 摩尔状态机和米立状态机的表示方法不同,摩尔状态机的状态译码输出写在状态圈内, 米立状态机的状态译码输出写在箭头旁,如图 7.3 所示。 状态 A 输入/出 输入/出 状态 C 输入/出 状态 B 输入/出 状态 E 输入/出 状态 D 输入/出 图 7.3 摩尔和米立状态机

图 7.2 状态转移图 状态 A 00 状态 A I/01 状态 B

状态 B 01

如果能够写出 FSM 的状态转移图,就可以使用 VHDL 的状态机语句对它进行描述。 状态转移表 形式如表 7.1 所示。 表中的行列出了全部可能的输入信号组合和内部状态 以及相应的次状态和输出,因此状态表规定了状态机的转换函数和输出函数。然而,状态表 不适合具有大量输入的系统,因为随着输入的增加其状态数和系统的复杂性会显著增加。 表 7.1 状态转移表 现态 输入 次态 输出 S0-Sn I0-Im S0-Sn Q0-QP 状态转移图、 状态转移表这两种有限状态机的建立方法是等价的, 都描述了同一硬件结 构,它们可以相互转换,但各有优缺点,分别适合于不同场合。

7.2 一般状态机的 VHDL 设计
7.2.1 状态机的一般组成
用 VHDL 设计有限状态机方法有多种, 但最一般和最常用的状态机设计通常包括说明部 分,主控时序部分,主控组合部分和辅助进程部分。 1) 说明部分 说明部分中使用 TYPE 语句定义新的数据类型,此数据类型为枚举型,其元素通常都用 状态机的状态名来定义。状态变量定义为信号,便于信息传递,并将状态变量的数据类型定 义为含有既定状态元素的新定义的数据类型。说明部分一般放在结构体的 ARCHITECTURE 和 BEGIN 之间。 2) 主控时序进程 是指负责状态机运转和在时钟驱动正负现状态机转换的进程。 状态机随外部时钟信号以 同步方式工作,当时钟的有效跳变到来时,时序进程将代表次态的信号 next_state 中的内 容送入现态信号 current_state 中,而 next_state 中的内容完全由其他进程根据实际情况 而定,此进程中往往也包括一些清零或置位的控制信号。 3) 主控组合进程 根据外部输入的控制信号 (包括来自外部的和状态机内容的非主控进程的信号) (和) 或 当前状态值确定下一状态 next_state 的取值内容,以及对外或对内部其他进程输出控制信 号的内容。 4) 辅助进程 用于配合状态机工作的组合、时序进程或配合状态机工作的其他时序进程。 在一般状态机的设计过程中,为了能获得可综合的,高效的 VHDL 状态机描述,建议使 用枚举类数据类型来定义状态机的状态, 并使用多进程方式来描述状态机的内部逻辑。 例如 可使用两个进程来描述, —个进程描述时序逻辑, 包括状态寄存器的工作和寄存器状态的输 出,另一个进程描述组合逻辑,包括进程间状态值的传递逻辑以及状态转换值的输出。必要 时还可以引入第三个进程完成其它的逻辑功能。 下例描述的状态机由两个主控进程构成,其中进程 REG 为主控时序进程,COM 为主控组 合进程。 [例 7.1] LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY s_machine IS PORT (clk, reset: IN STD_LOGIC; State_inputs: IN STD_LOGIC_VECTOR(0 TO 1); comb_outputs: OUT STD_LOGIC_VECTOR(0 TO 1)); END ENTITY s_machine; ARCHITECTURE behv OF s_machine IS TYPE states IS (st0,st1,st2,st3);--定义 states 为枚举型数据类型 SIGNAL current_state, next_state : states; BEGIN REG: PROCESS (reset, clk) --时序逻辑进程 BEGIN IF reset='1' THEN --异步复位 Current_state<=st0; ELSIF clk='1' AND clk'EVENT THEN

current_state<=next_state; --当检测到时钟上升沿时转换至下一状态 END IF; END PROCESS; --由信号 current_state 将当前状态值带出此进程,进入进程 COM COM: PROCESS(current_state, state_Inputs) --组合逻辑进程 BEGIN CASE current_state IS -- 确定当前状态的状态值 WHEN st0 =>comb_outputs <= "00"; --初始状态译码输出"00" IF state_inputs="00" THEN --根据外部的状态控制输入"00" next_state<=st0; --在下一时钟后,进程 REG 的状态将维持为 st0 ELSE next_state<=st1; --否则,在下一时钟后,进程 REG 的状态将为 st1 END IF; WHEN st1=> comb_outputs<="01"; --对应状态 st1 的译码输出"01" IF state_inputs="00" THEN --根据外部的状态控制输人"00" next_state<=st1; --在下一时钟后,进程 REG 的状态将维持为 st1 ELSE next_state<=st2; -- 否则,在下一时钟后,进程 REG 的状态将为 st2 END IF; WHEN st2=> comb_outputs<="10"; --以下依次类推 IF state_inputs="11" THEN next_state<=st2; ELSE next_state<=st3; END IF; WHEN st3=>comb_outputs<="11"; IF state_inputs="11" THEN next_state<=st3; ELSE next_state<=st0; END IF; END CASE; END PROCESS; END ARCHITECTURE behv; 图 7.4 为上述状态机的工作时序图。reset 为异步复位信号,低电平有效,而 clk 为上 升沿有效。如在第 3 个脉冲上升沿到来时 current_state=“st0” ,state_inputs=“01” , 输出 comb_outputs= “01” 第 4 个脉冲上升沿到来时 current_state= 。 “st1” state_inputs , =“00” ,输出 comb_outputs=“01” 。综合后的 RTL 图如图 7.5 所示。

图 7.4 例 7.1 状态机的工作时序图

图 7.5 例 7.1 状态机的 RTL 图 一般来说,程序的不同进程间是并行运行的,但由于敏感信号设置的不同和电路的延 迟,在时序上进程间的动作是有先后的。如对上例中的状态转换行为来说,有进程 REG 和 COM,它们的敏感信号表分别为(reset,clk)和(current_state,state_inputs) ,在 clk 上升沿到来时,进程 REG 将首先运行,完成状态转换的赋值操作。如果外部控制信号 state_inputs 不变,只有当来自进程 REG 的信号 current_state 改变时,进程 COM 才开始 动作,并将根据 current_state 和 state_inputs 的值来决定下一有效时钟沿到来后,进程 REG 的状态转换方向。 这个状态机的两位组合逻辑输出 comb_outputs 是对当前状态的译码。 我们可以通过这个输出值来了解状态机内部的运行情况,同时还可以利用外部控制信号 state_inputs 任意改变状态机的状态变化模式。 注意:在上例中,有两个信号起到了互反馈的作用,完成了两个进程间的信息传递的 功能, 这两个信号分别是 current_state 〔进程 REG->进程 COM)和 next_state(进程 COM-> 进程 REG)。 在 VHDL 中可以有两种方式来创建反馈机制:即使用信号的方式和使用变量的方式。通 常倾向于使用信号的方式(如例 7.1) 。一般而言,在进程中使用变量传递数据,然后使用 信号将数据带出进程。在设计过程中,如果希望输出的信号具有寄存器锁存功能,则需要为 此输出写第 3 个进程, 并把 clk 和 reset 信号放入敏感信号表中。 但必须注意避免由于寄存 器的引入而创建了不必要的异步反馈路径。根据 VHDL 综合器的规则,对于所有可能的输入 条件,如果进程中的输出信号没有被明确的赋值时,此信号将自动被指定,即在未列出的条 件下保持原值,这就意味着引入了寄存器。因此,我们在程序的综合过程中,应密切注意 VHDL 综合器给出的警告信息,并根据警告信息对程序作必要的修改。 一般来说,利用状态机进行设计有如下几个步骤: (1) 分析设计要求,列出状态机的全部可能状态,并对每一个状态进行编码。 (2) 根据状态转移关系和输出函数画出状态转移图。 (3) 由状态转移图,用 VHDL 语句对状态机描述。

7.2.2 状态机的编码方案
在状态机的编码方案中,有两种重要的编码方法:二进制编码和一位热码(One—Hot) 编码。

在二进制编码的状态机中,状态位(B)与状态(S)的数目之间的关系为 B=log2 ,如两位 状态位就有 00,01,10,11 四个不同状态,它们在不同的控制信号下可以进行状态转换, 但如果各触发器又没有准确地同时改变其输出值, 那么在状态 01 变到 10 时则会出现暂时的 11 或 00 状态输出,这类险象可能使整个系统造成不可预测的结果。这时,采用格雷码二进 制编码是特别有益,在该编码方案中,每次仅一个状态位的值发生变化。 一位热码编码就是用 n 个触发器来实现 n 个状态的编码方式, 状态机中的每一个状态都 由其中一个触发器的状态来表示。 4 个状态的状态机需 4 个触发器, 如 同一时间仅一个状态 位处于逻辑 1 电平,四个状态分别为:0001、0010、0100、1000。 在实际应用中, 根据状态机的复杂程度、 所使用的器件系列和从非法状态退出所需的条 件来选择最适合的编码方案,使之能确保高效的性能和资源的利用。 对复杂的状态机, 二进制编码需用的触发器的数目比一位热码编码的少。 100 个状态 如 的状态机按二进制编码仅用 7 个触发器就可以实现,而一位热码编码则要求 100 个触发器。 另一方面,虽然一位热码编码要求用较多的触发器,但逻辑上通常相对简单些。在二进制编 码的状态机中, 控制从一个状态转换到另一个状态的逻辑与所有 7 个状态位以及状态机的输 入均有关。这类逻辑通常要求到状态位输入的函数是多输入变量的。然而,在一热恋位编码 的状态机中,到状态位的输入常常是其它状态位的简单函数。 站在器件结构的角度,不同结构支持其确定的编码类型。MAX+plus II 编译程序对所采 用的器件系列自动地选择最合适的编码方法(除非在设计文件中规定了具体的编码方案) 。 例如,FLEX 7000 器件系列是寄存器增强型(Register-intensive) ,以这类器件为对象的 状态机最好选用一位热码编码方案来实现。 由于一位热码编码的状态机降低了送到每一个状 态位的逻辑电路的复杂程度,因而可提高用 FLEX 7000 器件实现的状态机的性能。MAX 5000 和 MAX 7000 器件系列最适合二进制状态机编码方案。这两类器件都能够利用共享和并联的 扩展乘积项有效地实现复杂的逻辑函数。因此,在这两类器件小,可以容纳复杂的组合逻辑 函数而不会浪费资源或损失性能。 另外,在选择编码方案时,必须考虑状态机可能进入的潜在的非法状态的数目。如果违 反了状态位触发器的建立或保持时间, 又没有定义所有可能出现的状态, 则你的设计会终止 在非法状态上。MAX+plus II 设计进入方法允许你定义非法状态和规定你的状态机如何从非 法状态中退出。例如,用二进制编码实现一个 14 个状态的状态机需 4 个状态位。这将有 16 个可能的状态, 故该状态机仅有两个可能的状态是非法状态。 然而一位热码编码的状态机通 常有更多的潜在的非法状态。14 个状态的一位热码编码的状态机需要 14 个状态。一位热码 n 编码的状态机的非法状态数目由方程式(2 -n)确定,其中 n 为状态机的状态个数。因此, 一位热码编码的 14 位状态共有 16370 个可能的非法状态。然而,只要设计中不违反状态位 触发器的建立和保持时间,状态机将不会进入非法状态。

S

7.3 摩尔状态机的 VHDL 设计
摩尔有限状态机输出只与当前状态有关, 与输入信号的当前值无关, 是严格的现态函数。 在时钟脉冲的有效边沿作用后的有限个门延后, 输出达到稳定值。 即使在时钟周期内输入信 号发生变化, 输出也会保持稳定不变。 从时序上看, Moore 状态机属于同步输出状态机。 Moore 有限状态机最重要的特点就是将输入与输出信号隔离开来。例 7.2 就是一个典型的 Moore 型状态机实例。 状态机的状态图如图 7.6 所示。 S1
0001

1

S2
0010

0 S4
1000

0 1 S3
0100

图 7.6 Moore 状态机的状态图

[例 7.2] LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY moore IS PORT ( clk, datain, reset : IN std_logic; dataout : OUT std_logic_vector (3 DOWNTO 0)); END ENTITY moore; ARCHITECTURE arc OF moore IS TYPE state_type IS (s1, s2, s3, s4); SIGNAL state: state_type; BEGIN state_process: PROCESS (clk, reset) --时序逻辑进程 BEGIN IF reset='1' THEN --异步复位 state<=s1; ELSIF clk'event and clk='1' THEN --当检测到时钟上升沿时执行 CASE 语句 CASE state IS WHEN S1=>IF datain='1' THEN state<=s2; END IF; WHEN s2=>IF datain='0' THEN state<=s3; END IF; WHEN s3=>IF datain='1' THEN state <=s4; END IF; WHEN s4=>IF datain='0' THEN state <=s1; END IF; END CASE; END IF; END PROCESS; --由信号 state 将当前状态值带出此进程,进入进程 output_p output_p : PROCESS (state) --组合逻辑进程 BEGIN CASE state IS -- 确定当前状态值 WHEN s1=>dataout<="0001"; --对应状态 s1 的数据输出为"0001" WHEN s2=>dataout<="0010"; WHEN s3=>dataout<="0100"; WHEN s4=>dataout<="1000"; END CASE; END PROCESS; END ARCHITECTUR arc; 上例的 VHDL 描述中包含了两个进程:state_process 和 output_p,分别为时序逻辑进 程和组合逻辑进程。图 7.7 是例 7.2 的工作时序图,由图可见,状态机在异步复位信号后 state=s1,在第 500ns 有效上升时钟沿到来时,state=s1,datain=1,从而 state 由 s1 转

换为 s2,输出 dataout=0010,即使在 500ns 后的一个时钟周期内输入信号发生变化,输出 也会维持稳定不变。综合后的结果见图 7.8 所示。

图 7.7 Moore 的工作时序图

图 7.8 Moore 的 RTL 图

7.4 米立状态机的 VHDL 设计
Mealy 状态机的输出是现态和所有输入的函数,随输入变化而随时发生变化。从时序上 看,Mealy 状态机属于异步输出状态机,它不依赖于时钟,但 Mealy 状态机和 Moore 状态机 的设计基本上相同。例 7.2 就是一个典型的 Mealy 型状态机实例。 状态机的状态图如图 7.9 所示。 0/0000 0/1000 1/0001 S4 1/0100 1/0001 1/0001

S1

S2

0/0010 S3 0/0001

图 7.9 Moore 状态机的状态图 例[7.3] LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.std_logic_unsigned.ALL; ENTITY mealy IS PORT ( clk, datain, reset : IN std_logic; dataout : OUT std_logic_vector (3 DOWNTO 0)); END ENTITY mealy; ARCHITECTURE arc OF mealy IS TYPE state_type IS (s1, s2, s3, s4); SIGNAL state : state_type; BEGIN state_process : PROCESS (clk, reset) BEGIN IF reset='1' THEN --异步复位

--时序逻辑进程

state<=s1; ELSIF clk'event and clk='1' THEN --当检测到时钟上升沿时执行 CASE 语句 CASE state IS WHEN S1=>IF datain='1' THEN state<=s2; END IF; WHEN s2=>IF datain='0' THEN state<=s3; END IF; WHEN s3=>IF datain='1' THEN state <=s4; END IF; WHEN s4=>IF datain='0' THEN state <=s1; END IF; END CASE; END IF; END PROCESS; output_p : PROCESS (state) --组合逻辑进程 BEGIN CASE state IS -- 确定当前状态值 WHEN s1=> IF datain='1' THEN dataout<="0001"; ELSE dataout<="0000"; END IF; WHEN s2=> IF datain='0' THEN dataout<="0010"; ELSE dataout<="0001"; END IF; WHEN s3=> IF datain='1' THEN dataout<="0100"; ELSE dataout<="0001"; END IF; WHEN s4=> IF datain='0' THEN dataout<="1000"; ELSE dataout<="0001"; END IF; END CASE; END PROCESS; END ARCHITECTURE arc; 上例的 VHDL 描述中包含了两个进程:state_process 和 output_p,分别为主控时序逻 辑进程和组合逻辑进程。图 7.10 是例 7.3 的工作时序图,由图可见,状态机在异步复位信 号来到时,datain=1,输出 dataout=0001,在 clk 的有效上升沿来到前,datain 发生了变 化,由 1->0,输出 dataout 随即发生变化,由 0000->0001,反映了 Mealy 状态机属于异 步输出状态机而它不依赖于时钟的鲜明特点。综合后的结果见图 7.11 所示。 Mealy 状态机的 VHDL 结构要求至少有两个进程,或者是一个状态机进程加一个独立的 并行贩值语句。

图 7.10 Mealy 的工作时序图

图 7.11

Mealy 的 RTL 图


相关文章:
状态机VHDL讲解
状态机VHDL讲解 - VHDL 的结构非常适合编写状态机, 而且编写方式不唯一, 电路的集成也会随着编写的方式 而改变。状态机设计主要用到 case when 和 if else ...
基于VHDL的Mealy状态机设计
基于VHDL的Mealy状态机设计 - 基于 VHDL 的 Mealy 状态机设计 物理与电子信息科学系 姓名: 姓名:孙家芳 指导教师: 指导教师:胡湘娟 电子信息科学与技术专业 学号...
vhdl设计ad转换状态机
vhdl设计ad转换状态机_计算机硬件及网络_IT/计算机_专业资料 暂无评价|0人阅读|0次下载|举报文档 vhdl设计ad转换状态机_计算机硬件及网络_IT/计算机_专业资料。...
基于VHDL状态机的交通灯控制器设计
基于VHDL状态机的交通灯控制器设计 - 基于 VHDL 状态机的交通灯控制器设计 0 引言 交通灯是城市交通监管系统的重要组成部分, 对于保证机动车辆的安全运行, 维持...
状态机设计交通灯
状态机设计交通灯 - 利用有限状态机的交通灯控制系统设计与仿真 时间:2012-03-09 17:09:59 来源:电子科技 作者:冯竞楠 陕西科技大学 摘要:基于硬件电路设计软件...
10进制加减计数器状态机的VHDL设计
10进制加减计数器状态机VHDL设计 - 本次设计选用的功能状态为: A. 复位功能 B. 十进制加法计数 C. 十进制减法计数 D. 数码管闪动 E. 8个led灯闪动 F....
实验六VHDL有限状态机设计(ADC0809)
实验六VHDL有限状态机设计(ADC0809)_信息与通信_工程科技_专业资料。本科学生综合...说明部分 说明部分中有新数据类型 TYPE 的定义及其状态类型(状态名)和在此新...
基于EDA的VHDL语言设计的交通灯
基于EDA的VHDL语言设计的交通灯_计算机软件及应用_IT/计算机_专业资料。用有限状态机设计一个交通灯控制器,设计要求:A路和B路,每路都有红、黄、绿三种灯,持续时...
VHDL状态机111000
VHDL状态机111000_工学_高等教育_教育专区。图像识别算法与系统设计题目:VHDL 第一次作业给定任一二值图像,从中 串行检测序列 111000 姓名:刘振宇 学号:1502121227 ...
VHDL序列检测器设计1110010
VHDL 数字系统设计与测试作业 序列检测器设计 学院:通信工程学院 学院 学号:1101120012 学号 姓名:汤清 姓名 设计要求: 设计要求用状态机设计序列检测器(1110010) ...
更多相关标签: