- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
可综合状态机设计
状态机在某种程度上可以称是一种时序电路,如前面的触发器、计数器等,都可以看成是功能固定的状态机。在状态机中常使用以状态图及状态表描述的方式,然后根据这个状态图去设计符合要求的电路。本章将介绍状态机、状态的编码方式及状态机的设计范例。
状态机简介
状态机简写为FSM(FiniteStateMachine),主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机:第二类,输出不仅和状态有关而且和输入有关系,则称为Melay状态机。要特别注意的是,因为Melay状态机和输入有关,输出会受到输入的干扰,所以可能会产生毛刺(Gitch)现象,使用时应当注意。事实上现在市面上有很多EDA工具可以很方便的将采用状态图的描述转换成可以综合的VHDL程序代码。
Moore状态机
其Moore状态图如图1所示。
S
S0/0
S1/1
S3/0
S2/0
0
0
1
1
0
0
1
1
其中S0/0所代表的意思为现在是状态S0且输出为0,状态图最主要是将每个状态都给予一个编号,详细描述如下:
在某状态时,列出所有的输出条件。
在某状态时,当输入信号是什么则会跳至哪一个状态。
在某状态时,当输入信号是什么则会维持原状态不变。
可以将图1的Moore状态机写成状态表如表1.
表1Moore状态表
状态
次态
输出
X=0
X=1
S0
S0
S1
0
S1
S1
S2
1
S2
S3
S0
0
S3
S0
S3
0
状态表主要描述它与状态图的关系,再设计状态机电路是,需要先定义状态机的变量,定义状态机的变量时使用枚举类型来定义,如下范例所示:
Type
接下来,状态会被加以编码。其状态编码方式如下:
时序编码(Sequential)
将每个状态以二进制来做编码。
格雷码(Gray)
也是将四个State以二进制来编码,不过不同的是每次编码只会差一个位,其主要缺点是状态改变是要依据改变才可以,若状态不是依序是,则Gray编码不适用。
独热码(Onehot)
独热码状态编码的特色为每一个状态均有自己的触发器,所以若有N个状态就也存在有N个触发器,在任一时刻只会有一组状态编码,缺点是会产生较大的电路,但是相对的使用独热码状态编码对帧错相当有帮助。
三种格式之状态编码如表2所示。
状态
时序编码
Gray编码
Onehot编码
S0
00
00
0001
S1
01
01
0010
S2
10
11
0100
S3
11
10
1000
从状态编码表可以看出时序编码和Gray编码均是用二个位来做编码,而以独热码作为编码方式则编码位增加至四个位,所以电路比其他两种编码方式都大一些。
所以可以使用属性来定义编码方式,若要编码成独热码编码,则可加上:
Type
Attributeencodingofstate;
Typeis“00010010
在设计状态机时,通常使用进程语句来描述状态机,其中进程语句又可以分为三种方式:
一个进程
利用一个进程来描述状态的转换及输出信号的定义。
两个进程
一个为时序电路主要负责状态变量的更新,此进程为同步电路,而另一个进程语句主要是描述下次态变量和输出的更新。
三个进程
第一个进程主要负责状态变量的更新,第二个进程语句负责描述次态变量,而最后一个则是负责输出信号的更新。
有了以上的初步观念,可以设计图1四个状态的Moore状态机。
范例
首先根据之前的状态表编写VHDL程序如下所示:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.numeric_std.all;
Entitymoore_fsmis
Port(
clk:instd_logic;
rstn:instd_logic;
x:instd_logic;
output:outstd_logic
);
Endmoore_fsm;
Architecturertlofmoore_fsmis
Typestateis(s0,s1,s2,s3);---状态定义
Signalcurrent_state:state;---现态
Signalnext_state:state;---次态
Begin
Statefsm:process(rstn,x,current_state)
Begin
Ifrstn=‘0’
next_state=s0;
output=‘0’
else
casecurrent_stateis
whens0=
ifx=’0
文档评论(0)