应用场景:编写一个自动售货机,功能如下:
共有三种纸币入口,分别支持10元,20元,50元。货物售价为80元。需要支持找钱功能。
分析:状态转换图如下所示,使用三段式状态机将如下状态图描述出来
代码如下:
//三段式moore状态机(输出只与当前状态有关)
module aotu_vending(
input clk,
input rst_n,
input Ten,
input Twnty,
input Fifty,
output Ok,
output Ten_back,
output Twnty_back,
output Thirty_back,
output Fourty_back
);
//用格雷编码表示转态
localparam IDLE = 4'b0000,
S_10 = 4'b0001,
S_20 = 4'b0011,
S_30 = 4'b0010,
S_40 = 4'b0110,
S_50 = 4'b0111,
S_60 = 4'b0101,
S_70 = 4'b0100,
S_80 = 4'b1100,
S_90 = 4'b1101,
S_100 = 4'b1111,
S_110 = 4'b1110,
S_120 = 4'b1010;
reg [3:0] current_state,next_state;
always@(posedge clk,negedge rst_n)begin
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state;
end
always@(*)begin
case(current_state)
IDLE :begin
if(Ten) next_state<=S_10;
else if(Twnty) next_state<=S_20;
else if(Fifty) next_state<=S_50;
else next_state<=IDLE;
end
S_10 :begin
if(Ten) next_state<=S_20;
else if(Twnty) next_state<=S_30;
else if(Fifty) next_state<=S_60;
else next_state<=S_10;
end
S_20 :begin
if(Ten) next_state<=S_30;
else if(Twnty) next_state<=S_40;
else if(Fifty) next_state<=S_70;
else next_state<=S_20;
end
S_