状态机例子自动售货机.docx
- 文档编号:25005863
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:7
- 大小:52.05KB
状态机例子自动售货机.docx
《状态机例子自动售货机.docx》由会员分享,可在线阅读,更多相关《状态机例子自动售货机.docx(7页珍藏版)》请在冰豆网上搜索。
状态机例子自动售货机
例:
用三进程状态机实现一个简单自动售货机控制电路,电路框图如下。
该电路有两个投币口(1元和5角),商品2元一件,不设找零。
In[0]表示投入5角,In[1]表示投入1元,Out表示是否提供货品。
根据题意,可分析出状态机的状态包括:
S0(00001):
初始状态,未投币或已取商品
S1(00010):
投币5角
S2(00100):
投币1元
S3(01000):
投币1.5元
S4(10000):
投币2元或以上
用独热码表示状态编码,如上所示。
相应状态转换图如下(按Moore状态机设计)。
设计代码
第一个Always块:
状态转移。
`timescale1ns/100ps
modulesaler_3always(Reset,Clk,In,Out);
inputClk,Reset;
input[1:
0]In;
outputOut;
regOut;
reg[4:
0]state,next_state;
parameterS0=5'b00001,S1=5'b00010,S2=5'b00100,S3=5'b01000,S4=5'b10000;
always@(posedgeClkorposedgeReset)
begin
if(Reset)
state<=S0;
else
state<=next_state;
end
第二个Always块:
状态转移的组合逻辑条件判断
always@(stateorIn)
begin
case(state)
S0:
begin
if(In[1])
next_state<=S2;
elseif(In[0])
next_state<=S1;
else
next_state<=S0;
end
S1:
begin
if(In[1])
next_state<=S3;
elseif(In[0])
next_state<=S2;
else
next_state<=S1;
end
S2:
begin
if(In[1])
next_state<=S4;
elseif(In[0])
next_state<=S3;
else
next_state<=S2;
end
S3:
begin
if(In[0]|In[1])
next_state<=S4;
else
next_state<=S3;
end
S4:
begin
next_state<=S0;
end
default:
next_state<=S0;
endcase
end
第三个Always块:
输出组合逻辑
always@(state)
begin
case(state)
S0:
begin
Out<=0;
end
S1:
begin
Out<=0;
end
S2:
begin
Out<=0;
end
S3:
begin
Out<=0;
end
S4:
begin
Out<=1;
end
default:
Out<=0;
endcase
end
endmodule
测试平台代码
`timescale1ns/1ns
moduletestbench_saler;
regclk,reset;
reg[1:
0]in;
wireout;
parameterDELY=20;
saler_3alwaystb(.Clk(clk),.Reset(reset),.In(in),.Out(out));
always#(DELY/2)clk=~clk;
initial
begin
clk=0;
reset=0;
#20reset=1;
#20reset=0;
end
initial
begin
in=0;
repeat(20)
#20in=$random;
end
initial
#400$finish;
endmodule
功能仿真结果
综合结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 状态机 例子 自动 售货