浅谈状态机的设计方法及应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈状态机的设计方法及应用
刘成玉 李明 陈洁
(中国兵器工业第214研究所 蚌埠 233042)
摘 要 有限状态机(Fi n ite S tate M achine ,FS M )是时序电路设计中经常采用的一种方式,尤其适用于设计数字系统的控制模块。有限状态机不是孤立的一个状态,它依赖于输入输出关系,系统需求,编程语言的条件限制以及其他诸多因素。本文主要介绍了有限状态机的原理及实际应用。
关键词 有限状态机(Fi n ite State M achine ,FS M ) 二进制编码(B inary S tate M achine) 格雷编码(Gray Code State M ach i n e) 一位热码编码(One-H ot S tate M ach i n e Encod i n g )
1 引 言
我们可以把有限状态机(F i n ite State M a ch i n e ,FSM )想象成一个能够接受输入信号的系统,系统内部包含状态寄存器,并且在可能的条件下产生输出信号。在任何特定的时刻,状态机内部所有寄存器的状态和形成这个状态的完整的条件构成了那个时刻的状态(state)。因为状态的个数是有限的,所以称之为有限状态机。
根据输出信号产生方法的不同,状态机可以分为米里型(M ealy )和摩尔型(M oore )两类。M ealy 型状态机输出与当前状态和输入有关,而M oore 型状态机的输出只与当前状态有关。在实际设计工作中,M ealy 型状态机应用较为普遍,而在设计高速电路时,常常把状态变量直接用作输出,以提高运行速度,则M oore 型状态机更为适合。有限状态机的结构如图1所示:
我们可以从图1
中清楚地看出两类状态机的
图1 有限状态机的结构
第25卷第1期
2007年3月 集成电路通讯
JICHENGDIANLU TONGXUN
V o.l 25 N o .1
M ar .2007
结构除了在输出部分有些不同外,其他部分都是相同的。图1中的虚线部分则是区分M ealy型状态机和M oore型状态机的关键。有限状态机的结构通常包括输入,状态寄存器和输出三个部分。
2 有限状态机的状态编码方式
有限状态机有很多种编码方式,最常见的编码方式有二进制编码(B inary State M ach i n e),格雷编码(G ray Code State M ach i n e)和一位热码编码(One-H ot S tateM achine Encod i n g)三种。不同的逻辑结构往往会选择不同的编码方式。通常在一个复杂的电路设计中,可将多种编码方式交替使用。
2.1 三种不同的编码方式
二进制编码的状态寄存器是由触发器组成的。如果触发器的个数为n,则就对应着2n个状态。比如:有4个状态分别为S0、S1、S2、S3,其每个状态的二进制编码所对应的码字为:00、01、10、11。二进制编码从一个状态转换到相邻的状态时,有可能有多个b it位同时发生变化,容易产生毛刺,引起逻辑错误。
格雷编码和二进制编码有很多相似的地方,如果把二进制编码的4个状态S0、S1、S2、S3的二进制编码00、01、10、11变成00、01、11、10,则对应的编码为格雷编码。格雷编码比较节省逻辑单元,而且在状态转换中,相邻的状态每次只有一个bit位产生变化,这样减少了瞬变的次数,也减少了产生毛刺和一些暂态的可能。
一位热码编码即采用n位来编码具有n个状态的状态机。比如对于S0、S1、S2、S3四个状态可用码字1000,0100,0010,0001来表示。FPGA设计中一般采用一位热码编码方式。采用一位热码编码,虽然多用了触发器,但可以有效的节省和简化组合电路。对于寄存器数量多而门逻辑相对缺乏的FPGA器件来说,采用一位热码编码可以有效的提高电路的速度和可靠性,也有利于提高器件资源的利用效率。表1是分别用上述三种方法编码的对比。
表1 三种编码方式对比
状态二进制编码格雷编码一位热码编码
S000000001
S101010010
S210110100
S311101000
2.2 有限状态机的状态编码目标
HDL的译码方式是选择怎样编码的关键。一旦H DL的译码方式确定,就可以设计出很多类型的编码方法。在基于HDL的FSM设计中,以下几点应该引起注意:
编码应该紧凑。
编码应有利于译码和理解。
编码应有助于电路调试。
编码时应优先考虑有效的综合结果。
3 基于V erilog-HDL的状态机(序列检测器)的设计
序列检测器是时序电路设计中较为经典的状态机设计。序列检测器就是将一个指定的序列从数字码流中识别出来。下面我们将用V erilog-HDL语言来描述、仿真并实现它。
本例中,我们将设计一个10010!序列的检测器。设x为数字码流输入,z为检出标志,高电平表示发现指定序列!,低电平表示没有发现指定序列!。假设码流为110010010000100101...!,则如表2所列。
表2 序列检测器的逻辑功能
时钟12345678910111213141516171819
x110010010000100101...
z000001001000000010...
在时钟2~6,码流x中出现指定序列10010!,对应输出z在第6个时钟变为高电平
21 第25卷第1期 集成电路通讯
1!,表示发现指定序列!。同样,在时钟13~ 17中,码流x中再次出现指定序列10010!,z输出1!。而在时钟5~9也出现一次,但它和第一次有所重叠。根据以上所述,我们可以分析其状态转换图如图2所示。
图2中,状态A~E表示5位序列10010!按顺序正确地出现在码流中。考虑到序列重叠的可能,转换图的状态在E时能够回到C,其它各状态能够回到A。电路的初态为I DLE
。
图2 状态转换图
根据上面的分析,编写V eril o g-HDL程序如下:
22
集成电路通讯 第25卷第1期