experiment 8 //design of FSM - Vending Machine
experiment 8 //design of FSM - Vending Machine
CODE
module fsm_(nw_pa,clk,coin,rst);
output reg nw_pa;
begin
if(rst)
state=s0;
else
state=next_state;
end
always@(state,coin)
begin
case(state)
s0:
begin
if(coin==2'b00)
next_state=s0;
else
if(coin==2'b01)
next_state=s10;
else
if(coin==2'b10)
next_state=s10;
end
s5:
begin
if(coin==2'b00)
next_state=s5;
else
if(coin==2'b01)
next_state=s10;
else
if(coin==2'b10)
next_state=s15;
end
s10:
begin
if(coin==2'b00)
next_state=s10;
else
if(coin==2'b01)
next_state=s15;
else
if(coin==2'b10)
next_state=s15;
end
s15:
begin
next_state=s0;
end
default:next_state=s0;
endcase
end
always@(state)
begin
case(state)
s0:nw_pa<=1'b0;
s5:nw_pa<=1'b0;
s10:nw_pa<=1'b0;
s15:nw_pa<=1'b1;
default:nw_pa<=1'b0;
endcase
end
endmodule
TESTBENCH
module fsm_TBv;
// Inputs
reg clk;
reg [1:0] coin;
reg rst;
// Outputs
wire nw_pa;
// Instantiate the Unit Under Test (UUT)
fsm_uut (
.nw_pa(nw_pa),
.clk(clk),
.coin(coin),
.rst(rst)
);
initial begin
clk= 0;coin= 2'b00; rst=1; #100;
endmodule
//POSTLAB
CODE
module mealy_(
);
// Define states
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b10;
parameter S3 = 2'b11;
// Define outputs
// Initialize state
if (reset)
else
end
always @* begin
case(state)
S0: begin
if (data_in)
next_state = S1;
else
next_state = S0;
end
S1: begin
if (data_in)
next_state = S1;
else
next_state = S2;
end
S2: begin
if (data_in)
next_state = S3;
else
next_state = S0;
end
S3: begin
if (data_in)
next_state = S1;
else
next_state = S0;
end
endcase
end
// Output logic
case(state)
endcase
end
endmodule
TESTBENCH
module mealy_TB_v;
// Inputs
reg clk;
reg reset;
reg data_in;
// Outputs
wire detected;
mealy_ uut (
.clk(clk),
.reset(reset),
.data_in(data_in),
.detected(detected)
);
initial begin
// Initialize Inputs
clk = 0;
reset = 1;
data_in = 0;
// Wait 100 ns for global reset to finish
#100; reset = 0;
#100; data_in = 1;
#100; data_in = 1;
#100; data_in = 0;
#100; data_in = 1;
#100; data_in = 0;
#100; data_in = 1;
#100; data_in = 0;
#100; data_in = 1;
end
endmodule