Dice Game Controller
Dice Game Controller
input rb,reset,clk;
input [3:0]sum;
output reg roll,win,lose;
reg [2:0]state,nextstate;
reg [3:0]point;
reg sp;
initial begin
state=0;nextstate=0;
point=2;
end
always@(rb,reset,sum,state)
begin
sp=1'b0;
roll=1'b0;
win=1'b0;
lose=1'b0;
nextstate=0;
case(state)
0: begin if(rb==1)
nextstate=1;
end
1: begin
if(rb==1) roll=1'b1;
else if((sum==7)|(sum==11))
nextstate=2;
else if((sum==2)|(sum==3)|(sum==12))
nextstate=3;
else
begin
sp=1'b1;
nextstate=4;
end
end
2: begin
win=1'b1;
if(reset==1)
nextstate=0;
end
3: begin
lose=1'b1;
if(reset==1)
nextstate=0;
end
4: begin
if(rb==1)
nextstate=5;
end
5: begin
if(rb==1)
roll=1'b1;
else if(sum==point)
nextstate=2;
else if(sum==7)
nextstate=3;
else
nextstate=4;
end
endcase
end
always@(posedge clk)
begin
if(clk)
state<=nextstate;
if(sp==1)
point<=sum;
end
initial $monitor($time, " sum=%d, win=%b,lose=%b,point=
%d",sum,win,lose,point);
endmodule
`timescale 1ns / 1ps
module gametest(rb,reset,sum,clk,roll,win,lose);
input clk;
input roll,win,lose;
reg[1:0] tstate,tnext;
reg trig1;
integer i;
integer sumarray[0:11];
initial begin
sumarray[0]=7;
sumarray[1]=11;
sumarray[2]=2;
sumarray[3]=4;
sumarray[4]=7;
sumarray[5]=5;
sumarray[6]=6;
sumarray[7]=7;
sumarray[8]=6;
sumarray[9]=8;
sumarray[10]=9;
sumarray[11]=6;
i=0;tstate=0;tnext=0;trig1=0;
end
always@(roll,win,lose,tstate)
begin
case(tstate)
0: begin
rb=1'b1;
reset=1'b0;
if(i>=12)
tnext=3;
else if(roll==1'b1)
begin
sum=sumarray[i];
i=i+1;
tnext=1;
end
end
1: begin
rb=1'b0;
tnext=2;
end
2: begin
tnext=0;
trig1=~trig1;
end
3: begin
end
endcase
end
always@(posedge clk)
begin
tstate=tnext;
end
endmodule
`timescale 1ns / 1ps
module test_tester();
wire rb1,reset1;
reg clk1;
wire roll1,win1,lose1;
initial begin
clk1=0;
end
dicegame d1(rb1,reset1,clk1,sum1,roll1,win1,lose1);
gametest g1(rb1,reset1,sum1,clk1,roll1,win1,lose1);
endmodule