乒乓球游戏电路设计

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

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值