Verilog 综合练习 自制简易贪吃蛇游戏

此次试验为我们的一次课程练习,仅供参考。

所用硬件为老师基于MAXll系列EMP240T100C5芯片设计的电路板,包含振荡器、64个发光二极管、3个按钮,4个七段译码显示器等相关器件。原电路板为实现电子钟而设计,我们在此电路上编写程序完成自制贪吃蛇游戏。

电子钟实现:https://blog.csdn.net/Glasier/article/details/86660287

程序接口:
    input pin_50, pin_51,未用。
    input CP,振荡器脉冲输入。RST,Ch,Cm,三个按钮 这里设计为 初始化 加速 暂停。Hc,未用。
    output wire [7:0] Sh,Sl,用于控制60个发光二极管显示秒针(硬件上为8×8的行列矩阵)。
    output wire [3:0] W,用于选择显示4个七段译码显示器(每次只亮一个显示器)。
    output wire [7:0] ddo,控制七段译码显示器显示的数字。

引脚连接:

主模块程序:

Fin:完成信号,高位有效。
Gro:成长信号,高位有效。
Q:振荡器脉冲计数。
Beg:蛇头位置。
Len:蛇长。
egg:食物位置。

module Sna
(
	input pin_50, pin_51,
	input CP,RST,Ch,Cm,Hc,
	output wire [7:0] Sh,Sl,
	output wire [3:0] W,
	output wire [7:0] ddo
);

wire Fin,Gro;
wire [14:0]Q;
wire [5:0]Beg,Len,egg;

Count Co(CP,Q);
Egg Eg(Gro,Len,egg);
Length Le(Gro,RST,Fin,Len);
Speed Sp(Cm,Ch,RST,Q[13],Q[9],Beg);
Bingo Bi(Gro,Q[14],Fin,Q[9],Q[8],W,ddo);
Pul Pu(Q[2],Q[7],Fin,egg,Beg,Len,Gro,Sh,Sl,C);

endmodule

显示模块:

显示蛇身和食物位置,由于器件限制,食物可能位于蛇身位置。

单点常规以 Q[2] 频率刷新
同时判断蛇头吃到蛋返回 Gro 信号给 Egg 和 Length
收到 Fin 信号时以 Q[7] 频率刷新

module Pul
(	
	input P1,P2,
	input F,
	input [5:0]EG,
	input [5:0]B,Len,
	output reg GR,
	output reg[7:0]H,L,
	output reg[5:0]R
);

reg[6:0]E;
wire P;
assign P=(~F&P1)|(F&P2);

always @(posedge P)
begin
	
	if(B==EG) GR<=1;
	else GR<=0;

	E=B+Len;
	if(E<60)
	begin
		if((B<=R&&R<=E)||R==EG)
		begin
			H<=8'b00000001<<({R[5],R[4],R[3]});
			L<=~(8'b00000001<<({R[2],R[1],R[0]}));
		end
		else
		begin
			H<=8'b00000000;
			L<=8'b11111111;
		end
	end
	else
	begin
		E=E-60;
		if((B<=R||R<=E)||R==EG)
		begin
			H<=8'b00000001<<({R[5],R[4],R[3]});
			L<=~(8'b00000001<<({R[2],R[1],R[0]}));
		end
		else
		begin
			H<=8'b00000000;
			L<=8'b11111111;
		end
	end
	
	if(R<59) R<=R+1; 
	else R<=0; 
	
end

endmodule 

脉冲计数模块:

对振荡器脉冲计数,产生各个脉冲用于其他模块。

module Count
(	
	input P,
	output reg[14:0]R
);

always @(posedge P)
begin
	R<=R+1;
end

endmodule 

速度控制模块:

即改变蛇头 Beg 位置
Cm 停止
Ch 切换 Q[13] Q[9] 速度
RST 信号 Beg 置零

module Speed
(	
	input P,
	input C,
	input RS,
	input S1,S2,
	output reg[5:0]R
);

wire S;
assign S=~P|((C&S1)|(~C&S2));

always @(posedge S or negedge RS)
begin
	if(~RS) R<=0;
	else if(R==0) R<=59;
	else R<=R-1;
end

endmodule 

蛇长模块:

收到 Gro 信号 Len 加一
如果长度最大 返回 Fin 信号给 Bingo 和 Pul
RST 信号 Len 置零

module Length
(	
	input G,
	input RS,
	output reg F,
	output reg[5:0]R
);

always @(posedge G or negedge RS)
begin
	if(~RS)
	begin
		R<=0;
		F<=0;
	end
	else if(R<58) R<=R+1;
	else
	begin
		R<=59;
		F<=1;
	end
end

endmodule 

食物伪随机生成模块:

假的随机生成
在收到 Gro 信号生成一个新的蛋

module Egg
(
	input G,
	input [5:0]L,
	output reg[5:0]E
);

reg[5:0]T;

initial
begin
	E=30;
end

always @(posedge G)
begin
	T=E;
	E=(T~^L)%60;
end

endmodule 

事件触发反馈模块:

收到 Gro 显示 OOPS
收到 Fin 显示 COOL

module Bingo
(	
	input G,P,F,
	input F1,F2,
	output [3:0]W,
	output [7:0]DD
);

reg S;

always @(posedge G or posedge P)
begin
	if(G)
	begin
		if(~F) S<=1;
	end
	else S<=0;
end

wire [6:0] Hh,Hl,Mh,Ml;
wire [6:0] hh,hl,mh,ml;

assign Hh={7{W[3]}}&(7'b0111001);
assign Hl={7{W[2]}}&(7'b0111111);
assign Mh={7{W[1]}}&(7'b0111111);
assign Ml={7{W[0]}}&(7'b0111000);

assign hh={7{W[3]}}&(7'b0111111);
assign hl={7{W[2]}}&(7'b0111111);
assign mh={7{W[1]}}&(7'b1110011);
assign ml={7{W[0]}}&(7'b1101101);

assign W=4'b0001<<({F1,F2});
assign DD={1'b0,{7{F}}&{Hh+Hl+Mh+Ml}|{7{S}}&{hh+hl+mh+ml}};

endmodule 

编译逻辑仿真:

最终在电子表器件上实现了简易贪吃蛇游戏,并具有 初始化 加速 暂停功能。

游戏开始蛇长为1,逆时针运动,伪随机生成食物,吃到食物蛇长加1,七段译码显示器显示OOPS,生成新的食物,蛇长满一圈时,七段译码器显示COOL,并触发简易动画效果。

 

 

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值