📄 ping.txt
字号:
我写的乒乓球游戏机VERILOG程序
//**********************table tennis game***********************
//***********************************************************
//*********************designed by liupeng**********************
//**************************2007.11.22**************************
//信号说明:
/* clk : 主时钟
reset : 复位信号,高有效
in1 : 甲挥拍信号,输入
in2 : 乙挥拍信号,输入
ball : 乒乓球运动轨迹,共10位,只接中间8位至LED
right1 : 甲拥有发球权指示信号
right2 : 乙拥有发球权指示信号
score1 : 甲的得分
score2 : 乙的得分 */
module tennis(clk,reset,in1,in2,ball,right1,right2,score1,score2);
input in1,in2,clk,reset;
output [5:0] score1,score2;
output right1,right2;
output [9:0] ball;
reg [2:0] count;
reg [5:0] score1,score2;
reg right1,right2,ldir,rdir,temp;
reg [9:0] ball;
always @(posedge clk)
begin
if(reset==1)//状态清零
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
ball<=10'b0100000000;
end
else if(ball[8] && in1)//甲正常击球
begin
ball<=10'b0010000000;
rdir<=1;
ldir<=0;
end
else if(ball[1] && in2)//乙正常击球
begin
ball<=10'b0000000100;
rdir<=0;
ldir<=1;
end
else if(ball[0] || ball[9])//球出界
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(ball[0])//乙失球,甲加分
begin
if(score1[3:0]==4'b1001)
begin
score1[3:0]<=4'b0000;
score1[5:4]<=score1[5:4]+1;
end
else if(score1==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score1[3:0]<=score1[3:0]+1;
end
else if(ball[9])//甲失球,乙加分
begin
if(score2[3:0]==4'b1001)
begin
score2[3:0]<=4'b0000;
score2[5:4]<=score2[5:4]+1;
end
else if(score2==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score2[3:0]<=score2[3:0]+1;
end
end
else if(rdir && !ball[8])//球正常向右移动
begin
if(!in1 && !in2)//当甲与乙均没有提前击球时
ball<=ball>>1;
else if(in1 && !in2)//甲提前击球
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score2[3:0]==4'b1001)//乙加分
begin
score2[3:0]<=4'b0000;
score2[5:4]<=score2[5:4]+1;
end
else if(score2==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score2[3:0]<=score2[3:0]+1;
end
else if(!in1 && in2)//乙提前击球
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score1[3:0]==4'b1001)//甲加分
begin
score1[3:0]<=4'b0000;
score1[5:4]<=score1[5:4]+1;
end
else if(score1==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score1[3:0]<=score1[3:0]+1;
end
else if(in1 && in2)//甲乙均提前击球
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score1[3:0]==4'b1001)//各加一分
begin
score1[3:0]<=4'b0000;
score1[5:4]<=score1[5:4]+1;
end
else if(score1==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score1[3:0]<=score1[3:0]+1;
if(score2[3:0]==4'b1001)
begin
score2[3:0]<=4'b0000;
score2[5:4]<=score2[5:4]+1;
end
else if(score2==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score2[3:0]<=score2[3:0]+1;
end
end
else if(ldir && !ball[1])//球正常向左移动
begin
if(!in1 && !in2)//甲乙均未提前击球
ball<=ball<<1;
else if(in1 && !in2)//甲提前击球
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score2[3:0]==4'b1001)//乙加分
begin
score2[3:0]<=4'b0000;
score2[5:4]<=score2[5:4]+1;
end
else if(score2==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score2[3:0]<=score2[3:0]+1;
end
else if(!in1 && in2)//乙提前击球
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score1[3:0]==4'b1001)//甲加分
begin
score1[3:0]<=4'b0000;
score1[5:4]<=score1[5:4]+1;
end
else if(score1==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score1[3:0]<=score1[3:0]+1;
end
else if(in1 && in2)//甲乙均提前击球,各加一分
begin
rdir<=0;
ldir<=0;
if(count<4)//每五次发球后交换发球权
count<=count+1;
else if(count==3'b100)
begin
count=0;
temp=right2;
right2=right1;
right1=temp;
end
if(right1)//甲拥有发球权
ball<=10'b0100000000;
else//乙拥有发球权
ball<=10'b0000000010;
if(score1[3:0]==4'b1001)
begin
score1[3:0]<=4'b0000;
score1[5:4]<=score1[5:4]+1;
end
else if(score1==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score1[3:0]<=score1[3:0]+1;
if(score2[3:0]==4'b1001)
begin
score2[3:0]<=4'b0000;
score2[5:4]<=score2[5:4]+1;
end
else if(score2==6'b100001)
begin
score1<=6'b000000;
score2<=6'b000000;
count<=0;
end
else
score2[3:0]<=score2[3:0]+1;
end
end
if(ball==10'b0000000000)
begin
right1<=1;
right2<=0;
ball<=10'b0100000000;
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -