有限状态机的状态编码(第八节)

合集下载

有限状态机

有限状态机

1.1概述有限状态机是指输出取决于过去输入部分和当前输入部分的时序逻辑电路。

有限状态机又可以认为是组合逻辑和寄存器逻辑的一种组合。

状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情,其实这就是状态机的本质。

状态机就是对具有逻辑顺序或时序规律的事件进行描述的一种方法在实际的应用中根据状态机的输出是否与输入条件相关,可将状态机分为两大类,即摩尔(Moore) 型状态机和米勒(Mealy) 型状态机。

Mealy型状态转移图1.2状态机的描述方法状态机的描述方法多种多样,将整个状态机写到1个always 模块里,在该模块中既描述状态转移,又描述状态的输入和输出,这种写法一般被称为一段式FSM 描述方法;还有一种写法是使用两个always 模块,其中一个always 模块采用同步时序的方式描述状态转移,而另一个模块采用组合逻辑的方式判断状态转移条件,描述状态转移规律,这种写法被称为两段式FSM 描述方法;还有一种写法是在两段式描述方法的基础上发展而来的,这种写法使用3 个always模块,一个always 模块采用同步时序的方式描述状态转移,一个采用组合逻辑的方式判断状态转移条件,描述状态转移规律,第三个always 模块使用同步时序电路描述每个状态的输出,这种写法称为三段式写法。

1.3 FSM的状态编码二进制码(Binary)和格雷码(Gray)属于压缩状态编码,这种编码的优点是使用的状态向量最少,但是需要较多的逻辑资源用来状态译码。

二进制码从一个状态转换到相邻状态时,可能有多个比特位发生变化,易产生中间状态转移问题,状态机的速度也要比采用其它编码方式慢。

格雷码两个相邻的码值仅有一位就可区分,这将会减少电路中相邻物理信号线同时变化的情况,因而可以减少电路中的电噪声。

Johnson码也有同样的特点,但是要用较多的位数。

独热码(One-hot)指对任意给定的状态,状态寄存器中只有l位为1,其余位都为0。

状态编码

状态编码

经常会看到在状态机设计中别人使用各种不同的编码方式,那么一般情况下,这种编码方式的选择依据是什么?我们知道,在数字逻辑设计中最常用的有三种编码方式:二进制,格雷码Gray,独热编码One-hot One hot 编码使用一组码元,每一个码元仅有1bit有效,例如IDLE = 0001,WRITE = 0010,READ = 0100,WAIT = 1000这种编码的译码部分可以最简,因此可以总结出One-hot编码的特点:组合逻辑最少,触发器最多,工作时钟频率可以做到最高。

FPGA 的一个最小结构单元(CLB/LE)中含有查找表(实现组合逻辑)和DFF(实现时序逻辑),布局布线最好的结果是同一个结构单元中的查找表和DFF都使用,但是大部分情况是仅使用其中一种资源,这样另外的资源就是闲置而浪费。

而CPLD中DFF资源本来就很少,由此可见One-hot编码更适合于FPGA 设计,而不适合CPLD设计,在CPLD中应该选择二进制编码。

IC设计中,应该综合考虑。

因为One-hot编码使用DFF会大大增加设计面积(die size),因此在时序可以满足的条件下尽可能使用二进制编码。

就面积与速度的折中考虑来说Gray码是最好的选择,当然Gray 码还有其他很多好的特性,暂时不属于这次讨论的范畴。

一般的综合工具对状态机进行综合时都可以让用户对这三种编码进行选择。

基本依据就以上所说。

二进制与格雷码之间的转换自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似通过减少寄存器间的逻辑延时来提高工作频率,或通过流水线设计来优化数据处理时的数据通路来满足高速环境下FPGA或CPLD中的状态机设计要求。

C语言实现有限状态机

C语言实现有限状态机

C语言实现有限状态机有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。

最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。

FSM的实现方式:1) switch/case或者if/else这无意是最直观的方式,使用一堆条件判断,会编程的人都可以做到,对简单小巧的状态机来说最合适,但是毫无疑问,这样的方式比较原始,对庞大的状态机难以维护。

2)状态表维护一个二维状态表,横坐标表示当前状态,纵坐标表示输入,表中一个元素存储下一个状态和对应的操作。

这一招易于维护,但是运行时间和存储空间的代价较大。

3)使用State Pattern使用State Pattern使得代码的维护比switch/case方式稍好,性能上也不会有很多的影响,但是也不是100%完美。

不过Robert C. Martin做了两个自动产生FSM代码的工具,for java和for C++各一个,在/resources/index上有免费下载,这个工具的输入是纯文本的状态机描述,自动产生符合State Pattern的代码,这样developer的工作只需要维护状态机的文本描述,每必要冒引入bug的风险去维护code。

4)使用宏定义描述状态机一般来说,C++编程中应该避免使用#define,但是这主要是因为如果用宏来定义函数的话,很容易产生这样那样的问题,但是巧妙的使用,还是能够产生奇妙的效果。

MFC就是使用宏定义来实现大的架构的。

在实现FSM的时候,可以把一些繁琐无比的if/else还有花括号的组合放在宏中,这样,在代码中可以3)中状态机描述文本一样写,通过编译器的预编译处理产生1)一样的效果,我见过产生C代码的宏,如果要产生C++代码,己软MFC可以,那么理论上也是可行的。

Verilog 有限状态机设计(课堂PPT)

Verilog 有限状态机设计(课堂PPT)

begin
case( state )
state0:
out = 3'b001;
state1:
out = 3'b010;
state2:
out = 3'b100;
state3:
out = 3'b111;
default:
out = 3'b001;
endcase
end
endmodule
11
8.2 有限状态机的Verilog描述
begin if(clr) qout<=0;
//异步复位
else case(qout)
3'b000: qout<=3'b001;
3'b001: qout<=3'b010;
3'b010: qout<=3'b011;
3'b011: qout<=3'b100;
3'b100: qout<=3'b000;
default: qout<=3'b000; /*default语句*/
state2 = 2’b11, state3 = 2’b10; // 格雷码
always @( posedge clk or posedge clr ) begin
if( clr ) state <= state0; // 定义初态 state <= next_state; end
8
always @( state or start or step2 or step3 ) // 状态转换
EDA技术与应用
第八章 有限状态机设计
1

状态机讲义

状态机讲义

Digital System Design12011/6/21Computer Faculty of Guangdong University of Technology大部分数字系统都可以划分为控制单元和数据单元(存储单元)两个组成部分,通常,控制单元的主体是一个状态机,它接收外部信号以及数据单元产生的状态信息,产生控制信号序列。

Digital System Design22011/6/21Computer Faculty of Guangdong University of Technology有限状态机特别适合描述那些发生有先后顺序或者有逻辑规律的事情(其实这就是状态机的本质)。

状态机的本质就是对具有逻辑顺序或时序规律事件的一种描述方法,即“逻辑顺序”和“时序规律”就是状态机所要描述的核心和强项,换言之,所有具有逻辑顺序和时序规律的事情都适合用状态机来描述。

Digital System Design32011/6/21Computer Faculty of Guangdong University of Technology1、基本概念有限状态机(Finite State Machine ,FSM )是表示实现有限个离散状态及其状态之间的转移等行为动作的数学模型。

(关注Matlab 的Stateflow )(1)状态:也叫状态变量。

在逻辑设计中,使用状态划分逻辑顺序和时序规律。

状态名称、状态编码、进入/退出操作、内部转移、子状态、延迟事件Digital System Design42011/6/21Computer Faculty of Guangdong University of Technology(2)转移:指两个状态之间的关系,表示当发生指定事件且满足指定条件时,第一个状态中的对象将执行某些操作并进入第二个状态,即“触发”了转移。

将触发转移之前的状态定义为“源”状态(初始状态),而触发转移之后的状态定义为“目标”状态(次态)。

第八讲 状态机

第八讲 状态机

所需寄存器个数: 用于存储两个状态编码。 所需寄存器个数 1个,用于存储两个状态编码。
10
设计风格#2 8.3 设计风格#2
在很多应用中(如波形整齐、流水线技术等), 在很多应用中(如波形整齐、流水线技术等), 需要同步的寄存器输出, 需要同步的寄存器输出,即需先使用寄存器存储起 然后在时钟边沿时才进行更新,如图b 来,然后在时钟边沿时才进行更新,如图b:
1
8.1 引言
•状态机的组成:如图。 状态机的组成:如图。 状态机的组成
input 组合逻辑电路 output
•状态机的种类: 状态机的种类: 状态机的种类 Mealy型 当前状态、 Mealy型:当前状态、当前输入相关 Moore型 Moore型:仅当前状态相关
pr_state
nx_state
•VHDL代码结构: VHDL代码结构: VHDL代码结构 时序逻辑部分:process内部 时序逻辑部分:process内部
•标准的设计 标准的设计
表现为位宽
•寄存器数目少:默认的编码方式下,log2n 寄存器数目少:默认的编码方式下, 寄存器数目少
4
FSM中组合逻辑部分的设计特点: 的设计特点 FSM中组合逻辑部分的设计特点:
input 组合逻辑电路 output
•并发代码、顺序代码皆可; 并发代码、顺序代码皆可; 并发代码 •顺序代码方式的设计模板 顺序代码方式的设计模板
8
所需寄存器个数: 上限[log 所需寄存器个数 上限[log210]=4
简单的FSM#1 例8.2 简单的FSM#1 功能描述:
d=1 a b FSM c d=1 clk rst rst x d=0 stateA (x=a) state代码实现:

关于有限状态机(FSM)编码的技巧和注意事项

关于有限状态机(FSM)编码的技巧和注意事项

贴1 状态机的编码a.状态机的编码。

Biary、gray-code编码使用最少的触发器,较多的组合逻辑。

而one-hot编码反之。

由于CPLD更多的提供组合逻辑资源,而FPGA更多的提供触发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot编码。

另一方面,对于小型设计使用gray-code和binary编码更有效,而大型状态机使用one-hot更高效。

b.在代码中添加综合器的综合约束属性或者在图形界面下设置综合约束属性可以比较方便的改变状态的编码。

如VHDL的示例:Synplicity:attribute syn_encoding : string;attribute syn_encoding of <signal_name> : type is "value ";-- The syn_encoding attribute has 4 values : sequential, onehot, gray and safe.Exemplar:-- Declare TYPE_ENCODING_style attribute-- Not needed if the exemplar_1164 package is usedtype encoding_style is (BINARY, ONEHOT, GRAY, RANDOM, AUTO);attribute TYPE_ENCODING_style : encoding_style;...attribute TYPE_ENCODING_style of <typename> : type is ONEHOT; Verilog示例:Synplicity:Reg[2:0] state; /* synthesis syn_encoding = "value" */;// The syn_encoding attribute has 4 values : sequential, onehot, gray and safe.Exemplar:Parameter /* exemplar enum <type_name> */ s0 = 0, s1 = 1, s2 = 2, s3 = 3, S4 = 4;Reg [2:0] /* exemplar enum <type_name> */ present_state, next_state贴2:状态机的编码风格a.关于FSM的编码方法。

EDA技术6-Verilog状态机

EDA技术6-Verilog状态机
组 合 逻 辑 状 态 寄 存 器
i
o
(c)状态输出型 图 1 有限状态机的分类
厦门理工学院通信系 刘虹
6
说明部分:
厦门理工学院通信系 刘虹
7
8.2 Moore型有限状态机的设计
8.2.1 ADC采样控制设计及多过程结构型状态机
厦门理工学院通信系 刘虹
8
厦门理工学院通信系 刘虹
9
厦门理工学院通信系 刘虹
10
厦门理工学院通信系 刘虹
11
厦门理工学院通信系 刘虹
12
厦门理工学院通信系 刘虹
13
厦门理工学院通信系 刘虹
14
8.3 Mealy型有限状态机的设计
8.3.1 序列检测器之状态机设计
厦门理工学院通信系 刘虹
15
厦门理工学院通信系 刘虹
16
程序8-5描述的是一个 Mealy型状态机,实现 的功能为:序列检测器。 检测的输入序列为 DIN1=11110,输出信号 由DIN2控制,并结合 当前状态得到相应的输 出信号Q,具体输出编 码见右表。
当前状态 st0 st1 st2 st3 st4
DIN2 1 0 1 0 1
Q 5’H10 5’H0A 5’H14 5’H17 5’H15
0
1 0 1 0
5’H13
5’H09 5’H1B 5’H1D 5’H0D
厦门理工学院通信系 刘虹
17
Hale Waihona Puke 厦门理工学院通信系 刘虹 3

i
有限状态机的分类 状
组 合 逻 辑 态 寄 存 器
组 合 逻 辑
o
(1)Moore型状态机:输出仅是状态向量的函数, (a)Mealy 型 结构如图(b)所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

c=i*a+ i*b
a
b
i/j
i/k
c
中等优先级:具有相同现态的次态应放在状态图中邻近的位置
I Q Q+ O i abj kacl
b=i *a c=k*a
a
i/j
k/l
b
c
最低优先级:在给定输入的情况下,具有相同输出的状态应该放
在状态中邻近的位置上
I Q Q+ O i abj i c dj
j=i *a+ i *c b=i*a d=i*c
10
随机编码
这是更简单的策略,随机选择可能的编码进 行分配,它仅需要保证每个状态对应唯一的 编码,以保证组合逻辑能够区分各个状态
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
有限输入串的识别器
设计要求:有限输入串的识别器 一个输入端 (X) 和一个输出端 (Z) 如果上次复位之后输入没有观察到…100…序列,那么只要 在输入端检测到…010…的输入序列,输出端即为1
步骤1: 理解说明 最好写出一些输入样本和输出行为:
X: 0 0 1 0 1 0 1 0 0 1 0 … Z: 0 0 0 1 0 1 0 1 0 0 0 …
步骤2: 画状态图
假设用摩尔机实现
先画出其必须识别的串010 和 100
只有一个输入,则每个状态应 该有两个分支
reset
0 S1 [0] 1
S0 [0]
1
S4 [0]
0
S2
S5
[0]
[0]
0
0
S3
S6
[1]
[0]
0 or 1
VIII - Working with Sequential
Logic
状态分配是选择二进制位向量分配给每个符号状态
如果m个状态用n位来对状态进行编码,则可能的分配方 案有2n!/(2n – m)!
简单的按照二进制顺序来进行状态分配,设计者仅需要保 证每个状态对应唯一的编码,以保证组合逻辑能区分各个 状态
单点编码是用m位状态位编码m个状态,每个状态的单点 编码只有在对应的位上为1,在其它位上均为0
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
12
启发式方法
该方法试图缩短相关状态间的布尔空间的距离。如状态Y用状 态X转换而来,则它们的状态编码中的不同比特位应尽量少
状态图:类似于卡诺图,提供观察状态分配的相邻性的方法。
状态图中的方格按照 状态位的二进制值进 行索引,给出该编码 的状态便放在图中对 应的的方格里
最低优先级:在给定输入条件下 具有相同输出行为的状态。 0/0:S0、S1 、S2、 S3’ 、S4’ 、 S7’
X: 1 1 0 1 1 0 1 0 0 1 0 … Z: 0 0 0 0 0 0 0 1 0 0 0 …
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
1
有限输入串的识别器
S0: if (X) next_state = S4 ; else next_state = S1;
S1: if (X) next_state = S2; else next_state = S1;
S2: if (X) next_state = S4 ; else next_state = S3;
S3: if (X) next_state = S2 ; else next_state = S6;
© Copyright 2004, Gaetano Borriello and Randy H. Katz
2
有限输入串的识别器
离开状态S3条件: 已经识别到 …010序列
如果下一位输入为0,那么状态机已经接收到…100 (终 止),到状态 S6,即终止循环状态
如果下一位输入为1,则状态机接收序列
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
14
基于次态和输入/输出的启发式方法
最高优先级:在给定的输入转换条件下,具有相同次态的状态应
该在状态图中放到邻近的位置
I Q Q+ O i acj i bck
1,就不再是010序列的前缀而 成为终止序列的前缀(01)1(00)
reset
S0 [0]
S4 就是代表这种情况
0
1
S5 =…10;如果下一个输入为1, 0 则接收机的序列为101,可能 为序列010的前缀,S2就是代
S1
S4
1
[0] ...0 ...1 [0]
11
0
表这种情况 尽可能复用状态
S2 ...01 [0]
小规模的逻辑函数 适合于FPGA实现
大量的触发器可用
对大的状态机不实用
太多的状态需要太多的flip-Байду номын сангаасlops 对大的有限状态机划分成小块可用单点编码
对单点编码进行一些改变
one-hot + all-0
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
11
面向输出的编码
对于摩尔型,输出直接与状态位有关,但如果设 计者直接实现摩尔型输出(即触发器的输出就是状 态机的输出),则可以使用输出来区别状态
对于整个状态机都使用面向输出的编码方式并不 是很好的策略,明智的使用部分输出作为编码, 也许能减少状态位的数量
VIII - Working with Sequential
a i/j
b
c i/j
d
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
15
例1:3比特序列检测器,当检测到010或110时输出
为1
最高优先级:相同输入下具有同一次态
的状态。S3’、S4’
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
9
单点编码
用m位状态位编码m个状态,每个状态的单点编码只有在对 应的位上为1,在其它位上均为0
简单
容易编码、容易诊断和修改
4
有限输入串的识别器
包括状态分配(或状态编码)的Verilog描述
module string1 (clk, X, rst, Z); input clk, X, rst; output Z;
parameter S0 = 3'b000, S1= 3'b001, S2 = 3'b010, S3 = 3'b011, S4 = 3'b100, S5 = 3'b101, S6 = 3'b110;
为…0101 , …01 (状态S2) 状态S1条件: S1表示在接收
reset
S0
[0]
0
1
到1之前的…0序列 只要输入为0就会在此循环
状态S4条件: S4描述连1序列的状态 只要输入为1就会在此循环
0
S1
S4
1
[0] ...0 ...1 [0]
1
0
S2
S5
...01 [0]
[0]
01
0
S3 ...010 [1]
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
13
最少位变化启发式方法
目的是使所有状态间的转换中发生变化的位数最少 第二种分配方案:
分配S0,由于复位逻辑工作,通常将全0分配给起始状态 接下来分配S1、S2,将它们放在S0邻近位置 然后将S3放在S1、S2之间 最后将S4放在S3附近
启发式编码能实现良好的状态分配,但不能保证是好的电 路实现
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
7
状态分配策略
可能的策略
顺序编码 随机编码 单点编码 面向输出的编码 启发式编码
不能保证结果是最优的 – 另一个复杂的问题
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
8
顺序编码
简单的将符号状态名字替换成为规则的编码, 设计者仅需要保证每个状态对应唯一的编码, 以保证组合逻辑能够区分各个状态
S6 ...100 [0]
0 or 1
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
3
有限输入串的识别器
相关文档
最新文档