In: Electrical Engineering
use modelsim write Verilog code for the following digital logic circuits and then simulate them by writing a testbench module for each of them ,
(a)The FSMs for the snail problem that is in the slides (a snail crawls over a tape that has 0 and 1 and smiles if it has detected the '10' bits using both Moore and Mealy FSM. Note that the pattern is '10' not '01' as in the slides.
(b) A rock-paper-scissor game played by two users (A and B) to indicate who's won or draw then they input their choice. Hint: A's output is 1 if A has won, both A's and B's signals is 0 if it was a draw.

Verilog code:-
module morfsm(din, reset, clk, y);
output reg y;
input din;
input clk;
input reset;
reg [1:0] cst, nst;
parameter S0 = 2'b00,
S1 = 2'b01,
S2 = 2'b10,
always @(cst or din)
begin
case (cst)
S0: if (din == 1'b1)
begin
nst = S1;
y=1'b0;
end
else
begin
nst = cst;
y=1'b0;
end
S1: if (din == 1'b0)
begin
nst = S2;
y=1'b0;
end
else
begin
nst = cst;
y=1'b0;
end
S2: if (din == 1'b1)
begin
nst = S1;
y=1'b1;
end
else
begin
nst = S0;
y=1'b1;
end
default: nst = S0;
endcase
end
always@(posedge clk)
begin
if (reset)
cst <= S0;
else
cst <= nst;
end
endmodul:-
Test Bench:-
module morfsm_tb; reg din,clk,reset; wire y; morfsm m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #10 din=1; #10 din=1; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #100 $finish ; endmodule

Verilog Code:-
module melfsm(din, reset, clk, y);
output reg y;
input din;
input clk;
input reset;
reg [1:0] cst, nst;
parameter S0 = 2'b00,
S1 =
2'b01,
S2 =
2'b10,
always @(cst or din)
begin
case (cst)
S0: if (din == 1'b1)
begin
nst = S1;
y=1'b0;
end
else
begin
nst =
cst;
y=1'b0;
end
S1: if (din == 1'b0)
begin
nst = S0;
y=1'b1;
end
else
begin
nst =
cst;
y=1'b0;
end
default: nst = S0;
endcase
end
always@(posedge clk)
begin
if (reset)
cst <= S0;
else
cst <= nst;
end
endmodule
Test Bench:-
module melfsm_tb; reg din,clk,reset; wire y; melfsm m1(din, reset, clk, y); initial begin reset=0 ;clk=0;din=0; $monitor($time, , ,"c=%b",clk,,"y=%b",y,,"r=%b",reset,,"d=%b",din); #5 din=1; #5 din=1; #5 din=1; #10 din=0; #10 din=1; #10 din=0; #10 din=1; #10 din=0; #5 din=1; //#5 reset=1; //#5 reset=0; end always #5 clk=~clk; initial #80 $finish ; endmodule