有限状态机的状态编码(第八节)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
13
最少位变化启发式方法
目的是使所有状态间的转换中发生变化的位数最少 第二种分配方案:
分配S0,由于复位逻辑工作,通常将全0分配给起始状态 接下来分配S1、S2,将它们放在S0邻近位置 然后将S3放在S1、S2之间 最后将S4放在S3附近
11
面向输出的编码
对于摩尔型,输出直接与状态位有关,但如果设 计者直接实现摩尔型输出(即触发器的输出就是状 态机的输出),则可以使用输出来区别状态
对于整个状态机都使用面向输出的编码方式并不 是很好的策略,明智的使用部分输出作为编码, 也许能减少状态位的数量
VIII - Working with Sequential
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
16
4比特序列检查器
最高优先级:相同输入下具有同 一次态的状态。[S3’、S4’] [ S7’、S10’]
中等优先级:具有相同现态的次 态。[S1、S2],2个[S3’、 S4’][ S7’、S10’]
步骤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
小规模的逻辑函数 适合于FPGA实现
大量的触发器可用
对大的状态机不实用
太多的状态需要太多的flip-flops 对大的有限状态机划分成小块可用单点编码
对单点编码进行一些改变
one-hot + all-0
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
01
1 S5 [0]...10
0
寻找相同的意思 最小的状态使代表状态的位数
S3 ...010 [1]
S6 ...100 [0]
0 or 1
可以尽可能少
一旦所有状态有完整的条件转换, 意味着是一个最终状态图
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
reg [2:1] state; reg [2:1] next_state; always @(posedge clk)
if (rst) state <= S0; else state< = next_state;
assign Z = (state == S2);
always @(state or X) case (state)
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
9
单点编码
用m位状态位编码m个状态,每个状态的单点编码只有在对 应的位上为1,在其它位上均为0
简单
容易编码、容易诊断和修改
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]
reg clk,rst; reg[10:0] data; wire z,x;
assign x=data[10]; always #10 clk = ~clk;
always @(posedge clk) data<={data[9:0],data[10]};
initial begin clk=0; rst=0; #2 rst=1; #30 rst=0; data ='b1010_1001_00; #500 $stop; end
状态分配是选择二进制位向量分配给每个符号状态
如果m个状态用n位来对状态进行编码,则可能的分配方 案有2n!/(2n – m)!
简单的按照二进制顺序来进行状态分配,设计者仅需要保 证每个状态对应唯一的编码,以保证组合逻辑能区分各个 状态
单点编码是用m位状态位编码m个状态,每个状态的单点 编码只有在对应的位上为1,在其它位上均为0
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
有限输入串的识别器
S6 ...100 [0]
0 or 1
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
3
有限输入串的识别器
S2和S5仍然是不完整的条件
S2= …01; 如果下一个输入为
S4: if (X) next_state = S4 ; else next_state = S5;
S5: if (X) next_state = S2 ; else next_state = S6;
S6: next_state = S6; default: next_state = S0;
endcase endmodule
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;
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
5
有限输入串的识别器(测试程序)
`timescale 1ns/1ns `include "./seq.v" module seqdet_Top;
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
12
启发式方法
该方法试图缩短相关状态间的布尔空间的距离。如状态Y用状 态X转换而来,则它们的状态编码中的不同比特位应尽量少
状态图:类似于卡诺图,提供观察状态分配的相邻性的方法。
状态图中的方格按照 状态位的二进制值进 行索引,给出该编码 的状态便放在图中对 应的的方格里
10
随机编码
这是更简单的策略,随机选择可能的编码进 行分配,它仅需要保证每个状态对应唯一的 编码,以保证组合逻辑能够区分各个状态
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
14
基于次态和输入/输出的启发式方法
最高优先级:在给定的输入转换条件下,具有相同次态的状态应
该在状态图中放到邻近的位置
I Q Q+ O i acj i bck
最低优先级:在给定输入条件下 具有相同输出行为的状态。 0/0:S0、S1 、S2、 S3’ 、S4’ 、 S7’
有限输入串的识别器
设计要求:有限输入串的识别器 一个输入端 (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 …
S0
中等优先级:具有相同状态的次态。S3’、
X/0
S1’
0/0
1/0
S4’
最低优先级:在给定输入条件下具有相 同输出行为的状态。
S3’
S4’
0/0:S0、S1’ 、S3’
X/0 0/1 1/0 1/0:S0、S1’ 、S3’、S4’
VIII - Working with Sequential
Logic
启发式编码能实现良好的状态分配,但不能保证是好的电 路实现
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
7
状态分配策略
可能的策略
顺序编码 随机编码 单点编码 面向输出的编码 启发式编码
© Copyright 2004, Gaetano Borriello and Randy H. Katz
2
有限输入串的识别器
离开状态S3条件: 已经识别到 …010序列
如果下一位输入为0,那么状态机已经接收到…100 (终 止),到状态 S6,即终止循环状态
如果下一位输入为1,则状态机接收序列
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’
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
不能保证结果是最优的 – 另一个复杂的问题
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
8
顺序编码
简单的将符号状态名字替换成为规则的编码, 设计者仅需要保证每个状态对应唯一的编码, 以保证组合逻辑能够区分各个状态
为…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]
string1 m(clk,x,rst,z);
endmodule
VIII - Working with Sequential
Logic
© Copyright 2004, Gaetano Borriello and Randy H. Katz
6
状态分配
实现时序逻辑网络所需门的数量严重依赖于如何将编码后 的逻辑值分配给符号状态,最优的分配方案的唯一途径是尝试 所有的分配方案