此次试验为我们的一次课程练习,仅供参考。
所用硬件为老师基于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,并触发简易动画效果。