基于Basys 2的VGA视频游戏
一、实验目的
- 掌握ISE软件及FPGA开发板的基本结构
- 熟练应用Verilog语言编程实现
- 掌握VGA的显示方法并将其应用到自己的游戏之中
二、模块结构
三、游戏画面展示
四、实验源代码
游戏主逻辑:
module test(
CLK,
RED,
GREEN,
BLUE,
HS,
VS,
left,
right,
leda,
rest,
rand_num,
fenshu,
life,
nandu);
input CLK; //时钟输入
input left; //向左移动输入
input right; //向右移动输入
input rest; //重置
input [7:0] rand_num;
input nandu; //调整难度
output leda;//用于测试
output [2:0] RED,GREEN;
output [1:0] BLUE;
output HS,VS;
output reg [7:0]fenshu;
output reg [3:0]life;
parameter recal=10;
parameter recah=120;
parameter recbl=150;
parameter recbh=20;
parameter reccl=40;
parameter recch=40;
parameter recckl=20;
parameter recckh=20;
parameter recdl=20;
parameter recdh=20;
parameter recax1=200;
parameter recax2=610;
parameter recay1=60;
parameter recay2=240;
parameter recay3=420;
parameter recay4=-120;
parameter recbx1=240;
parameter recbx2=350;
parameter recbx3=460;
parameter recby=40;
parameter reccx=390;
parameter reccy=440;
parameter recckx=400;
parameter reccky=440;
parameter recdx1=260;
parameter recdx2=380;
parameter recdx3=500;
parameter recdy=20;
parameter char_line0=48'h000000000000; //END数据
parameter char_line1=48'h000000000000;
parameter char_line2=48'h000000000000;
parameter char_line3=48'h000000000000;
parameter char_line4=48'h000000000000;
parameter char_line5=48'h000000000000;
parameter char_line6=48'h7ffcf83e7fc0;
parameter char_line7=48'h180c38081870;
parameter char_line8=48'h18043c081818;
parameter char_line9=48'h18062c08180c;
parameter char_line10=48'h18022c08180c;
parameter char_line11=48'h18002e08180c;
parameter char_line12=48'h181026081806;
parameter char_line13=48'h181027081806;
parameter char_line14=48'h183023081806;
parameter char_line15=48'h1ff023081806;
parameter char_line16=48'h183021881806;
parameter char_line17=48'h181021c81806;
parameter char_line18=48'h181020c81806;
parameter char_line19=48'h180020e81806;
parameter char_line20=48'h180020681806;
parameter char_line21=48'h18002078180c;
parameter char_line22=48'h18022038180c;
parameter char_line23=48'h180220381808;
parameter char_line24=48'h180420381818;
parameter char_line25=48'h180c20181870;
parameter char_line26=48'h7ffcf8187fc0;
parameter char_line27=48'h000000000000;
parameter char_line28=48'h000000000000;
parameter char_line29=48'h000000000000;
parameter char_line30=48'h000000000000;
parameter char_line31=48'h000000000000;
parameter cmp1=8'b10000000;
parameter cmp2=8'b01010101;
parameter cmp3=8'b10101010;
reg[5:0] char_bit;
wire[9:0] y_dis;
reg HS,VS;
reg [11:0] HS_CNT;// 行计数
reg [9:0] VS_CNT;//场计数
reg [9:0] cnt=0; //虚线下降计数
reg [9:0] cntx=0;//最上方虚线计数
reg [9:0] cnty=0;
reg [9:0] cntz=0;
reg [9:0] cnt1=0;//障碍1下降计数
reg [9:0] cnt2=0;//障碍2下降计数
reg [9:0] cnt3=0;//障碍3下降计数
reg [9:0] cnt4=0;//生命1下降计数
reg [9:0] cnt5=0;//生命2下降计数
reg [9:0] cnt6=0;//生命3下降计数
reg signed [11:0] left1=0;
reg signed [11:0] right1=0;
reg signed [11:0] res=0;
reg k1=1;//障碍1使能
reg k2=0;//障碍2使能
reg k3=0;//障碍3使能
reg k4=0;//生命1使能
reg k5=0;//生命2使能
reg k6=0;//生命3使能
reg pk=0;
reg [9:0] pk1=0;
reg p;
reg p1;
reg p2;
reg si1=0;
reg si2=0;
reg si3=0;
reg [9:0] x1;
reg [9:0] y1;
reg [9:0] x2;
reg [9:0] y2;
reg led1=0;
reg endg=0; //结束游戏
reg [5:0] life1=3;
reg jiasu=0;
reg [7:0] lck; //随机数锁存
reg [7:0] score=0;
reg [5:0] v1;
reg [5:0] v2;
reg [7:0] ColorOutput;
wire reset;
wire HBlank;
wire VBlank;
wire Blank;
//----------------------产生HS、VS信号---------------//
always @(posedge CLK)
begin
life=life1;
if(857<=HS_CNT&&HS_CNT<=977) HS<=0;//产生HS信号
else HS<=1;
if(HS_CNT==1039)
begin
HS_CNT<=0;
if(VS_CNT==665) VS_CNT<=0;//VS计数
else VS_CNT<=VS_CNT+1;
end
else HS_CNT<=HS_CNT+1;//HS计数
if(638<=VS_CNT&&VS_CNT<=644) VS<=0;//产生VS信号
else VS<=1;
end
assign HBlank = ((HS_CNT >= 0) & (HS_CNT < 800)) ? 1'b0 : 1'b1;
assign VBlank = ((VS_CNT >= 0) & (VS_CNT < 600)) ? 1'b0 : 1'b1;
assign Blank = (HBlank == 1'b1 | VBlank == 1'b1) ? 1'b1 : 1'b0;
assign RED = (Blank == 1'b0) ? ColorOutput[7:5] :
3'b000;
assign GREEN = (Blank == 1'b0) ? ColorOutput[4:2] :
3'b000;
assign BLUE = (Blank == 1'b0) ? ColorOutput[1:0] :
<