1.实验目的:
使用verilog HDL硬件描述语言乒乓球游戏电路设计
2.实验内容:
3.实验原理:按照视书上的内容,书写和运行代码,完成仿真操作
实验代码:
(1)
module pingp(clk, reset, push1, push0, led, decode1, decode2, decode3, decode4, clk_out);
input clk, reset;
input push1, push0;
output [6:0] led, decode1, decode2, decode3, decode4;
output clk_out;
fenpin hz(clk, reset, clk_out);
ctl ctll(.clk(clk),.reset(reset),.push1(push1),.push0(push0),.led(led),
.decode1(decode1),.decode2(decode2),.decode3(decode3),.decode4(decode4));
endmodule
module ctl(clk, reset, push1, push0, led, decode1, decode2, decode3, decode4);
input clk, reset;
input push1, push0;
output [6:0] led, decode1, decode2, decode3, decode4;
reg [3:0] M,N;
reg [6:0] led, decode1, decode2, decode3, decode4;
reg [2:0] state;
parameter s0=3'b000,
s1=3'b001,
s2=3'b010,
s3=3'b011,
s4=3'b100;
always@(posedge clk)
begin
if(reset)
begin
led<=7'b0000000;
M<=4'b0000;
N<=4'b0000;
end
else
begin
case(state)
s0: //初始发球
begin
led<=7'b0000000;
if(push0)
begin
state<=s1;
led<=7'b1000000;
end
else if(push1)
begin
state<=s3;
led<=7'b0000001;
end
end
s1: //甲发球或甲接球后,球的移动
begin
if(push1)
begin
state<=s0;
M<=M+4'b0001;
end
else if(led==7'b0000001)
begin
state<=s2;
end
else
begin
state<=s1;
led[6:0]<=led[6:0]>>1;
end
end
s2:if(push1) //乙接球
begin
state<=s3;
led<=7'b0000010;
end
else
begin
state<=s0;
M<=M+4'b0001;
end
s3: //乙发球或接球后,球的移动
begin
if(push1)
begin
state<=s0;
N<=N+4'b0001;
end
else if(led==7'b1000000)
begin
state<=s4;
end
else
begin
state<=s3;
led[6:0]<=led[6:0]<<1;
end
end
s4: //甲接球
if(push0)
begin
state<=s1;
led=7'b0100000;
end
else
begin
state<=s0;
N<=N+4'b0001;
end
default:state<=s0;
endcase
if(M==4'b1011 || N==4'b1011)
begin
M<=4'b0000;
N<=4'b0000;
end
case(M) //显示甲得分
8'b0000: begin
decode1<=7'b1000000;
decode2<=7'b1000000;
end
8'b0001: begin
decode2<=7'b1000000;
decode1<=7'b1111001;
end
8'b0010: begin
decode2<=7'b1000000;
decode1<=7'b0100100;
end
8'b0011: begin
decode2<=7'b1000000;
decode1<=7'b0101111;
end
8'b0100: begin
decode2<=7'b1000000;
decode1<=7'b0011001;
end
8'b0101: begin
decode2<=7'b1000000;
decode1<=7'b0010010;
end
8'b0110: begin
decode2<=7'b1000000;
decode1<=7'b1000010;
end
8'b0111: begin
decode2<=7'b1000000;
decode1<=7'b1111000;
end
8'b1000: begin
decode2<=7'b1000000;
decode1<=7'b0000000;
end
8'b1001: begin
decode2<=7'b1000000;
decode1<=7'b0010000;
end
8'b1010: begin
decode2<=7'b1111001;
decode1<=7'b1000000;
end
8'b1011: begin
decode2<=7'b1111001;
decode1<=7'b1111001;
end
default: begin
decode2<=7'b1000000;
decode1<=7'b1000000;
end
endcase
end
case(N) //显示乙得分
8'b0000: begin
decode4<=7'b1000000;
decode3<=7'b1000000;
end
8'b0001: begin
decode4<=7'b1000000;
decode3<=7'b1111001;
end
8'b0010: begin
decode4<=7'b1000000;
decode3<=7'b0100100;
end
8'b0011: begin
decode4<=7'b1000000;
decode3<=7'b0101111;
end
8'b0100: begin
decode4<=7'b1000000;
decode3<=7'b0011001;
end
8'b0101: begin
decode4<=7'b1000000;
decode3<=7'b0010010;
end
8'b0110: begin
decode4<=7'b1000000;
decode3<=7'b0000010;
end
8'b0111: begin
decode4<=7'b1000000;
decode3<=7'b1111000;
end
8'b1000: begin
decode4<=7'b1000000;
decode3<=7'b0000000;
end
8'b1001: begin
decode4<=7'b1000000;
decode3<=7'b0010000;
end
8'b1010: begin
decode4<=7'b1111001;
decode3<=7'b1000000;
end
8'b1011: begin
decode4<=7'b1111001;
decode3<=7'b1111001;
end
default: begin
decode4<=7'b1000000;
decode3<=7'b1000000;
end
endcase
end
endmodule
module fenpin(reset, clock, clk1hz);
input reset, clock;
output clk1hz;
reg clk1hz;
reg[24:0] count1;
always @(posedge clock or posedge reset)
begin
if(reset)
count1<=0;
else if(count1==25'd25000000)
begin
clk1hz<=~clk1hz;
count1<=0;
end
else
count1<=count1+1;
end
//always @(clk)
//clk_out=clk;
endmodule
module tbpingp;
reg clk, reset;
reg push1, push0;
wire[6:0] led, decode1, decode2, decode3, decode4;
wire clk_out;
initial
begin
clk=0;
reset=0;
#10 reset=1;
#20 reset=0;
end
always #5 clk=~clk;
initial
begin
push1=0;push0=0;
#40 push1=1;
#10 push1=0;
repeat (7) @(posedge clk);
push0=1;
#20 push0=0;
repeat (3) @(posedge clk);
push1=1;
#10 push1=0;
#30 ;
@(posedge clk);
#5 push1=1;
#10 push1=0;
#100 $stop;
end
pingp pingpang(clk, reset, push1, push0, led, decode1, decode2, decode3,
decode4, clk_out);
endmodule
(2)
module pp(shift, seg7, seg8, clk50Mhz, rst, af, aj, bf, bj);
output[4:0] shift;
output[6:0] seg7;
output[6:0] seg8;
input clk50Mhz;
input af;
input aj;
input bf;
input bj;
input rst;
reg[4:0] shift;
reg[6:0] seg7;
reg[6:0] seg8;
reg clk2hz;
reg[3:0] a_score, b_score;
reg[23:0] cnt;
reg a, b;
reg[4:0] shift_1;
always@(posedge clk50Mhz)
begin
if(cnt==24'd12500000)
begin
clk2hz=~clk2hz;
cnt<=0;
end
else
cnt<=cnt+1;
end
always@(posedge clk50Mhz)
begin
if(rst)
begin
a_score<=0;
b_score<=0;
a<=0;
b<=0;
shift_1<=0;
end
else
begin
if(!a&&!b&&af)
begin
a<=1;
shift_1<='b10000;
end
else if(!a&&!b&&bf)
begin
b<=1;
shift_1<='b00001;
end
else if(a&&!b)
begin
if(shift_1>'b00100)
begin
if(bj)
begin
a_score<=a_score+1;
a<=0;
b<=0;
shift_1<='b00000;
end
else
begin
shift_1[4:0]<=shift_1[4:0]>>1;
end
end
else if(shift_1==1'b0)
begin
a_score<=a_score+1;
a<=0;
b<=0;
end
else
begin
if(bj)
begin
a<=0;
b<=1;
end
else
begin
shift_1[4:0]<=shift_1[4:0]>>1;
end
end
end
else if(b&&!a)
begin
if(shift_1<'b00100&&shift_1!='b0)
begin
if(aj)
begin
b_score<=b_score+1;
a<=0;
b<=0;
shift_1<='b00000;
end
else
begin
shift_1[4:0]<=shift_1[4:0]<< 1;
end
end
else if(shift_1=='b0)
begin
b_score<=b_score+1;
a<=0;
b<=0;
end
else
begin
if(aj)
begin
a<=1;
b<=0;
end
else
begin
shift_1[4:0]<=shift_1[4:0]<<1;
end
end
end
end
shift<=shift_1;
if(a_score=='b1011&&!rst)
begin
a_score<=a_score;
b_score<=b_score;
end
if(b_score=='b1011&&!rst)
begin
a_score<=a_score;
b_score<=b_score;
end
end
always@(posedge clk2hz)
begin
case(a_score[3:0])
'b0000: seg7[6:0]=7'b0000001;
'b0001: seg7[6:0]=7'b1001111;
'b0010: seg7[6:0]=7'b0010010;
'b0011: seg7[6:0]=7'b0000110;
'b0100: seg7[6:0]=7'b1001100;
'b0101: seg7[6:0]=7'b0100100;
'b0110: seg7[6:0]=7'b0100000;
'b0111: seg7[6:0]=7'b0001111;
'b1000: seg7[6:0]=7'b0000000;
'b1001: seg7[6:0]=7'b0000100;
default: seg7[6:0]='bx;
endcase
case(b_score[3:0])
'b0000: seg8[6:0]=7'b0000001;
'b0001: seg8[6:0]=7'b1001111;
'b0010: seg8[6:0]=7'b0010010;
'b0011: seg8[6:0]=7'b0000110;
'b0100: seg8[6:0]=7'b1001100;
'b0101: seg8[6:0]=7'b0100100;
'b0110: seg8[6:0]=7'b0100000;
'b0111: seg8[6:0]=7'b0001111;
'b1000: seg8[6:0]=7'b0000000;
'b1001: seg8[6:0]=7'b0000100;
default: seg8[6:0]='bx;
endcase
end
endmodule
module tbpp;
reg clk;
reg af;
reg aj;
reg bf;
reg bj;
reg reset;
wire[4:0] shift;
wire[6:0] seg7;
wire[6:0] seg8;
initial
begin
clk=0;
reset=0;
#10 reset=1;
#20 reset=0;
end
always #5 clk=~clk;
initial
begin
af=0;bf=0;
#40 bf=1;
#10 bf=0;
repeat (4) @(posedge clk);
#5 aj=1;
#10 aj=0;
repeat (3) @(posedge clk);
bj=1;
#10 bj=0;
#30;
@(posedge clk);
#5 bf=1;
#10 bf=0;
#100 $stop;
end
pp pp(shift,seg7,seg8,clk,reset,af,aj,bf,bj);
endmodule
4实验工具:
pc机和modlsim软件
5.实验截图:
(1)
(2)
6.实验视频:
请下载哔哩哔哩动画打开此网址:
【乒乓球游戏电路设计-哔哩哔哩】https://b23.tv/JlRp4R