有限状态机设计与化简(第5节)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通用有限状态机设计过程
(1) 定义输入和输出 (2) 定义状态机可能的状态
状态化简 状态分配或状态编码 输出编码 可能的输入编码 组合逻辑的实现和优化 步骤2和3对最终的逻辑将产生很大的影响
(3) 用二进制对状态和输出进行编码
(4) 选择适当的逻辑实现状态和输出
1
例:简单的自动售货机
自动售货机在收到15美分之后就会给出一件商品,这台机 器具有能够接收5美分和1角硬币的单个投币口,每次投入 一枚硬币,其中机械传感器用来指示插入投币口是5美分 还是1角,控制器的输出导致一件商品交到顾客手中 两个假设简化设计: 不找零 在每次使用前,机器都会复位
Reset
1、理解问题
假设:投入5美分,在 单个周期内N为真;投 入1角,在单个周期内D 为真;在上一次复位之 后,若收到15美分或更 多,则状态机Open为真, 并保持一个周期
N 硬币传感器 D
自动售货机 FSM
Open
商品释放机制
Clock
2
例:简单的自动售货机
2、有限状态机抽象表达
Reset
列出最终能给出商品的输入顺序: 3个5美分:N,N,N 2个5美分,再1角:N,N,D 1角,5分:D,N 5分,1角:N,D 2个1角:D,D
S0 N S1 N S3 N D S8 [open] D S4 [open] N S5 [open] D S2 D S6 [open]
画状态图:
输入: N, D, reset, clk 输出商品: open
S7 [open]
假设:
假设信号N和D从来不会同时为真 省略了自环 N=D=0 (no coin) 只将open信号为真时列出
3
例:简单的自动售货机
3、状态最简化:
状态S4~S8具有等价,可合并成一个状态 若每个状态表示接受到钱的数量
Reset 0¢ [0] N 5¢ [0] D 5¢ present state 0¢
状态转换表
inputs D N 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 – – next state 0¢ 5¢ 10¢ – 5¢ 10¢ 15¢ – 10¢ 15¢ 15¢ – 15¢ output open 0 0 0 – 0 0 0 – 0 0 0 – 1
状态图
N
D 10¢ [0] N+D 15¢ [open] 15¢ 10¢
最简化的符号状态转换表
4
例:简单的自动售货机
4、进行状态分配
4个状态,采用2位状态编码: 0¢(00)、 5¢(01)、 10¢(10)、 15¢(11)
当前状态 Q1 Q0 0 0 输入 D N 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 – – 次态 N1 N0 0 0 0 1 1 0 – – 0 1 1 0 1 1 – – 1 0 1 1 1 1 – – 1 1 输出t open 0 0 0 – 0 0 0 – 0 0 0 – 1
0
1
1
0
1
1
状态分配后的状态转换表
5
例:简单的自动售货机
5、实现
逻辑电路
D1
Q1 0 0 1 1 0 1 1 1 X X 1 X 1 1 1 1 Q0 N
D0
Q1 0 1 1 0 1 0 1 1 X X 1 X 0 1 1 1 Q0 N
Q1 Open 0 0 1 0 0 0 1 0 D X X 1 X 0 0 1 0 Q0 N
D
D
D1 = Q1 + D + Q0 N D0 = Q0’ N + Q0 N’ + Q1 N + Q1 D OPEN = Q1 Q0
6
简单的自动售货机(verilog)
module autosell (clk, reset, D, N,open); input clk, reset, D,N; output open; parameter cell0= 2'b00,cell5 = 2'b01, cell10= 2'b10, cell15 = 2'b11; reg [1:0] state; reg [1:0] next_state;
always @(posedge clk) if (reset) state = cell0; else state = next_state; always @(N or D or state) case (state) cell0: begin if (N) next_state = cell5; else if (D) next_state = cell10; else next_state = cell0; end cell5: begin if (N) next_state = cell10; else if (D) next_state = cell15; else next_state = cell5; end cell10: begin if (N) next_state = cell15; else if (D) next_state = cell15; else next_state = cell10; end cell15: next_state = cell15; endcase assign open=(state== cell15); endmodule
7
有限输入串的识别器
设计要求:有限输入串的识别器 一个输入端 (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 …
X: 1 1 0 1 1 0 1 0 0 1 0 … Z: 0 0 0 0 0 0 0 1 0 0 0 …
8
有限输入串的识别器
步骤2: 画状态图
假设用摩尔机实现 先画出其必须识别的串010 和 100 只有一个输入,则每个状态应 该有两个分支
reset 0
S1 [0] 1
S0 [0]
1
S4 [0]
0
S5 [0] 0
S2 [0]
0
S3 [1]
S6 [0]
0 or 1
9
有限输入串的识别器
离开状态S3条件: 已经识别到 …010序列 如果下一位输入为0,那么状态机已经接收到…100 (终 止),到状态 S6,即终止循环状态 如果下一位输入为1,则状态机接收序列 为…0101 , …01 (状态S2) reset S0 [0] 0 1 状态S1条件: S1表示在接收 S1 S4 0 1 到1之前的…0序列 [0] ...0 ...1 [0] 只要输入为0就会在此循环 1 0 状态S4条件: S2 S5 [0] [0] ...01 S4描述连1序列的状态 0 1 0 只要输入为1就会在此循环
S3 ...010 [1]
S6 ...100 [0]
0 or 1
10
有限输入串的识别器
S2和S5仍然是不完整的条件 S2= …01; 如果下一个输入为 1,就不再是010序列的前缀而 reset S0 [0] 成为终止序列的前缀(01)1(00) 0 1 S4 就是代表这种情况 S1 S4 0 S5 =…10;如果下一个输入为1, [0] ...0 ...1 [0] 则接收机的序列为101,可能 1 0 1 为序列010的前缀,S2就是代 1 S2 S5 表这种情况 [0]...10 ...01 [0] 尽可能复用状态 0 1 0 寻找相同的意思 S3 S6 最小的状态使代表状态的位数 ...010 [1] ...100 [0] 可以尽可能少 一旦所有状态有完整的条件转换, 意味着是一个最终状态图
1
0 or 1
11
有限输入串的识别器
包括状态分配(或状态编码)的Verilog描述
always @(state or X) case (state) 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; 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
12
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; reg [2:0] state; reg [2:0] next_state; always @(posedge clk) if (rst) state <= S0; else state< = next_state; assign Z = (state == S3);
注意:模块名最好与文件名一致
有限输入串的识别器(测试程序)
`timescale 1ns/1ns `include "./string1.v" module string1_tb; reg clk,rst; reg [10:0] data; wire z,x; assign x=data[10]; always #10 clk = ~clk; initial begin clk=0; rst=0; #2 rst=1; #30 rst=0; data ='b1010_1001_00; #500 $stop; end string1 m (clk,x,rst,z); endmodule
13
always @(posedge clk) data<={data[9:0],data[10]};
设计要求:有限输入串的识别器一个输入端 (X) 和一个输 出端 (Z),只要在输入端检测到10010的输入序列,输出端 即为1. module string10010 (clk, X, rst, Z); input clk, X, rst; output Z;
Parameter S0 = 3'b000, S1= 3'b001, S2 = 3'b010,S4 = 3'b011, S5 = 3'b100;
reg [2:0] state; reg [2:0] next_state; always @(posedge clk) if (rst) state <= S0; else state <= next_state;
assign Z = (state== S5);
14
always @(state or X) case (state) S0: if (X) next_state = S1 ;else next_state = S0; S1: if (X) next_state = S1; else next_state = S2; S2: if (X) next_state = S1 ;else next_state = S3; S3: if (X) next_state = S4 ;else next_state = S0; S4: if (X) next_state = S1 ;else next_state = S5; S5: if (X) next_state = S1 ;else next_state = S3; default next_state = S0; endcase endmodule
15
(1) 定义输入和输出 (2) 定义状态机可能的状态
状态化简 状态分配或状态编码 输出编码 可能的输入编码 组合逻辑的实现和优化 步骤2和3对最终的逻辑将产生很大的影响
(3) 用二进制对状态和输出进行编码
(4) 选择适当的逻辑实现状态和输出
1
例:简单的自动售货机
自动售货机在收到15美分之后就会给出一件商品,这台机 器具有能够接收5美分和1角硬币的单个投币口,每次投入 一枚硬币,其中机械传感器用来指示插入投币口是5美分 还是1角,控制器的输出导致一件商品交到顾客手中 两个假设简化设计: 不找零 在每次使用前,机器都会复位
Reset
1、理解问题
假设:投入5美分,在 单个周期内N为真;投 入1角,在单个周期内D 为真;在上一次复位之 后,若收到15美分或更 多,则状态机Open为真, 并保持一个周期
N 硬币传感器 D
自动售货机 FSM
Open
商品释放机制
Clock
2
例:简单的自动售货机
2、有限状态机抽象表达
Reset
列出最终能给出商品的输入顺序: 3个5美分:N,N,N 2个5美分,再1角:N,N,D 1角,5分:D,N 5分,1角:N,D 2个1角:D,D
S0 N S1 N S3 N D S8 [open] D S4 [open] N S5 [open] D S2 D S6 [open]
画状态图:
输入: N, D, reset, clk 输出商品: open
S7 [open]
假设:
假设信号N和D从来不会同时为真 省略了自环 N=D=0 (no coin) 只将open信号为真时列出
3
例:简单的自动售货机
3、状态最简化:
状态S4~S8具有等价,可合并成一个状态 若每个状态表示接受到钱的数量
Reset 0¢ [0] N 5¢ [0] D 5¢ present state 0¢
状态转换表
inputs D N 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 – – next state 0¢ 5¢ 10¢ – 5¢ 10¢ 15¢ – 10¢ 15¢ 15¢ – 15¢ output open 0 0 0 – 0 0 0 – 0 0 0 – 1
状态图
N
D 10¢ [0] N+D 15¢ [open] 15¢ 10¢
最简化的符号状态转换表
4
例:简单的自动售货机
4、进行状态分配
4个状态,采用2位状态编码: 0¢(00)、 5¢(01)、 10¢(10)、 15¢(11)
当前状态 Q1 Q0 0 0 输入 D N 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 – – 次态 N1 N0 0 0 0 1 1 0 – – 0 1 1 0 1 1 – – 1 0 1 1 1 1 – – 1 1 输出t open 0 0 0 – 0 0 0 – 0 0 0 – 1
0
1
1
0
1
1
状态分配后的状态转换表
5
例:简单的自动售货机
5、实现
逻辑电路
D1
Q1 0 0 1 1 0 1 1 1 X X 1 X 1 1 1 1 Q0 N
D0
Q1 0 1 1 0 1 0 1 1 X X 1 X 0 1 1 1 Q0 N
Q1 Open 0 0 1 0 0 0 1 0 D X X 1 X 0 0 1 0 Q0 N
D
D
D1 = Q1 + D + Q0 N D0 = Q0’ N + Q0 N’ + Q1 N + Q1 D OPEN = Q1 Q0
6
简单的自动售货机(verilog)
module autosell (clk, reset, D, N,open); input clk, reset, D,N; output open; parameter cell0= 2'b00,cell5 = 2'b01, cell10= 2'b10, cell15 = 2'b11; reg [1:0] state; reg [1:0] next_state;
always @(posedge clk) if (reset) state = cell0; else state = next_state; always @(N or D or state) case (state) cell0: begin if (N) next_state = cell5; else if (D) next_state = cell10; else next_state = cell0; end cell5: begin if (N) next_state = cell10; else if (D) next_state = cell15; else next_state = cell5; end cell10: begin if (N) next_state = cell15; else if (D) next_state = cell15; else next_state = cell10; end cell15: next_state = cell15; endcase assign open=(state== cell15); endmodule
7
有限输入串的识别器
设计要求:有限输入串的识别器 一个输入端 (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 …
X: 1 1 0 1 1 0 1 0 0 1 0 … Z: 0 0 0 0 0 0 0 1 0 0 0 …
8
有限输入串的识别器
步骤2: 画状态图
假设用摩尔机实现 先画出其必须识别的串010 和 100 只有一个输入,则每个状态应 该有两个分支
reset 0
S1 [0] 1
S0 [0]
1
S4 [0]
0
S5 [0] 0
S2 [0]
0
S3 [1]
S6 [0]
0 or 1
9
有限输入串的识别器
离开状态S3条件: 已经识别到 …010序列 如果下一位输入为0,那么状态机已经接收到…100 (终 止),到状态 S6,即终止循环状态 如果下一位输入为1,则状态机接收序列 为…0101 , …01 (状态S2) reset S0 [0] 0 1 状态S1条件: S1表示在接收 S1 S4 0 1 到1之前的…0序列 [0] ...0 ...1 [0] 只要输入为0就会在此循环 1 0 状态S4条件: S2 S5 [0] [0] ...01 S4描述连1序列的状态 0 1 0 只要输入为1就会在此循环
S3 ...010 [1]
S6 ...100 [0]
0 or 1
10
有限输入串的识别器
S2和S5仍然是不完整的条件 S2= …01; 如果下一个输入为 1,就不再是010序列的前缀而 reset S0 [0] 成为终止序列的前缀(01)1(00) 0 1 S4 就是代表这种情况 S1 S4 0 S5 =…10;如果下一个输入为1, [0] ...0 ...1 [0] 则接收机的序列为101,可能 1 0 1 为序列010的前缀,S2就是代 1 S2 S5 表这种情况 [0]...10 ...01 [0] 尽可能复用状态 0 1 0 寻找相同的意思 S3 S6 最小的状态使代表状态的位数 ...010 [1] ...100 [0] 可以尽可能少 一旦所有状态有完整的条件转换, 意味着是一个最终状态图
1
0 or 1
11
有限输入串的识别器
包括状态分配(或状态编码)的Verilog描述
always @(state or X) case (state) 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; 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
12
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; reg [2:0] state; reg [2:0] next_state; always @(posedge clk) if (rst) state <= S0; else state< = next_state; assign Z = (state == S3);
注意:模块名最好与文件名一致
有限输入串的识别器(测试程序)
`timescale 1ns/1ns `include "./string1.v" module string1_tb; reg clk,rst; reg [10:0] data; wire z,x; assign x=data[10]; always #10 clk = ~clk; initial begin clk=0; rst=0; #2 rst=1; #30 rst=0; data ='b1010_1001_00; #500 $stop; end string1 m (clk,x,rst,z); endmodule
13
always @(posedge clk) data<={data[9:0],data[10]};
设计要求:有限输入串的识别器一个输入端 (X) 和一个输 出端 (Z),只要在输入端检测到10010的输入序列,输出端 即为1. module string10010 (clk, X, rst, Z); input clk, X, rst; output Z;
Parameter S0 = 3'b000, S1= 3'b001, S2 = 3'b010,S4 = 3'b011, S5 = 3'b100;
reg [2:0] state; reg [2:0] next_state; always @(posedge clk) if (rst) state <= S0; else state <= next_state;
assign Z = (state== S5);
14
always @(state or X) case (state) S0: if (X) next_state = S1 ;else next_state = S0; S1: if (X) next_state = S1; else next_state = S2; S2: if (X) next_state = S1 ;else next_state = S3; S3: if (X) next_state = S4 ;else next_state = S0; S4: if (X) next_state = S1 ;else next_state = S5; S5: if (X) next_state = S1 ;else next_state = S3; default next_state = S0; endcase endmodule
15