有限状态机-售货机例子
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.6.3
自动售货机
实例分析
实例分析
简易自动售货机控制电路
In[1]
(1元)
In[0]
(5角)
Clk
(时钟)
Reset
(重置)
售货机 控制电路
D_out
(提供商品)
In / D_out 00/0
xx/1
状态分析
01/0
00/0
11/0
S0
S1
10/0 11/0
01/0 10/0
1x/0
00/0
01/0 1x/0
下一状态
当前状态
输入 (下一状 状 状态 态 态译 译 组合 码 码逻辑)
状态寄存
(输输 输 出出 出 组译 译 合逻 码 码辑) 输出
时钟
always @(current_state or D_in) begin …… // 状态译码 end
…… case(current_state)
S0:begin if (D_in[1] & D_in[0]) next_state<=S3;
always @(current_state or D_in) begin …… // 状态译码 end
always @(posedge Clk or posedge Reset) begin …… // 状态寄存 end
always @(current_state ) …… // 输出译码
endmodule
01 /1 1x /1
10 / 0
1x/1
10 / 0
S3
01 /0 输出与输入有关
00 /0
00 / 0
S1
01 / 0
S2
00 / 0
下一状态
当前状态
输入
状态译码 (下一状态组合逻辑)
状态寄存
输出译码
输出
(输出组合逻辑)
时钟
程序实现
module vend_moore(Reset , Clk , D_in , D_out); ……
always @(current_state ) …… // 输出译码
always @(current_state ) D_out_moore= (current_state==S4);
endmodule
通过测试平台进行功能仿真, 并与米勒型状态机进行对比。
测试分析
测试分析
仿真结果分析:
✓ 米勒型状态机输出与当前状态和输入都有关, 竞争冒险不能消除。 ✓ 摩尔型状态机输入与输出隔离,输出稳定,能 有效消除竞争冒险,是设计首选。
wk.baidu.com00/0
01/0
00/0 摩尔型状态机 状态转换图
xx/1
输出与输入无关, 只跟当前状态有关
01/0
00/0
11/0
S0
S1
10/0 11/0
01/0 10/0
S4
1x/0 S2
00/0
01/0
S3
01/0
1x/0
00/0
In / D_out
00 /0
01 / 0
11 /1
S0
11 / 0
米勒型状态机 状态转换图
end S2:begin ……
输输入入
√状状态态译译码码
下下一一状状态态
√状状态态寄寄存存
当当前前状状态态
输输出出译译码码
输输出出
时时钟钟
always @(posedge Clk or posedge Reset) begin …… // 状态寄存 end
完整代码在教材 p374
always @(posedge Clk or posedge Reset) begin if (Reset) current_state<=S0; else current_state<=next_state; end
else if (D_in[1]) next_state<=S2;
else if (D_in[0]) next_state<=S1;
else next_state<=S0;
end ……
根据状态转换图 编写代码
……
S1:begin if (D_in[1] & D_in[0]) next_state<=S4; else if (D_in[1]) next_state<=S3; else if(D_in[0]) next_state<=S2; else next_state<=S1;
自动售货机
实例分析
实例分析
简易自动售货机控制电路
In[1]
(1元)
In[0]
(5角)
Clk
(时钟)
Reset
(重置)
售货机 控制电路
D_out
(提供商品)
In / D_out 00/0
xx/1
状态分析
01/0
00/0
11/0
S0
S1
10/0 11/0
01/0 10/0
1x/0
00/0
01/0 1x/0
下一状态
当前状态
输入 (下一状 状 状态 态 态译 译 组合 码 码逻辑)
状态寄存
(输输 输 出出 出 组译 译 合逻 码 码辑) 输出
时钟
always @(current_state or D_in) begin …… // 状态译码 end
…… case(current_state)
S0:begin if (D_in[1] & D_in[0]) next_state<=S3;
always @(current_state or D_in) begin …… // 状态译码 end
always @(posedge Clk or posedge Reset) begin …… // 状态寄存 end
always @(current_state ) …… // 输出译码
endmodule
01 /1 1x /1
10 / 0
1x/1
10 / 0
S3
01 /0 输出与输入有关
00 /0
00 / 0
S1
01 / 0
S2
00 / 0
下一状态
当前状态
输入
状态译码 (下一状态组合逻辑)
状态寄存
输出译码
输出
(输出组合逻辑)
时钟
程序实现
module vend_moore(Reset , Clk , D_in , D_out); ……
always @(current_state ) …… // 输出译码
always @(current_state ) D_out_moore= (current_state==S4);
endmodule
通过测试平台进行功能仿真, 并与米勒型状态机进行对比。
测试分析
测试分析
仿真结果分析:
✓ 米勒型状态机输出与当前状态和输入都有关, 竞争冒险不能消除。 ✓ 摩尔型状态机输入与输出隔离,输出稳定,能 有效消除竞争冒险,是设计首选。
wk.baidu.com00/0
01/0
00/0 摩尔型状态机 状态转换图
xx/1
输出与输入无关, 只跟当前状态有关
01/0
00/0
11/0
S0
S1
10/0 11/0
01/0 10/0
S4
1x/0 S2
00/0
01/0
S3
01/0
1x/0
00/0
In / D_out
00 /0
01 / 0
11 /1
S0
11 / 0
米勒型状态机 状态转换图
end S2:begin ……
输输入入
√状状态态译译码码
下下一一状状态态
√状状态态寄寄存存
当当前前状状态态
输输出出译译码码
输输出出
时时钟钟
always @(posedge Clk or posedge Reset) begin …… // 状态寄存 end
完整代码在教材 p374
always @(posedge Clk or posedge Reset) begin if (Reset) current_state<=S0; else current_state<=next_state; end
else if (D_in[1]) next_state<=S2;
else if (D_in[0]) next_state<=S1;
else next_state<=S0;
end ……
根据状态转换图 编写代码
……
S1:begin if (D_in[1] & D_in[0]) next_state<=S4; else if (D_in[1]) next_state<=S3; else if(D_in[0]) next_state<=S2; else next_state<=S1;