小球游戏
2010211083
目录
1系统综述 (3)
1.1功能描述 (3)
1.2结构框图 (4)
2场行控制器 (5)
2.1场时序 (5)
2.2行时序 (6)
3总控制器 (6)
3.1小球位置控制模块 (7)
3.2挡板位置控制模块 (8)
4颜色控制器 (9)
5代码 (9)
5.1 VGA架构 (9)
5.2行场频控制 (10)
5.3控制器 (13)
5.4颜色控制器 (25)
1系统综述
1.1功能描述
屏幕示意图如下图:
需要输入时钟为50.35MHz 屏幕分辨率:640X800 球大小:13X13 挡板大小:100X10 障碍物个数:3
障碍物大小:80X60
球的形状:正方形
0y
球碰到边界和障碍物时发生弹性碰撞
按“开始”键后球从挡板所在位置向左上抛出
用左右键控制挡板可以左右移动,球碰到挡板中部时发生弹性碰撞 挡板未接住球时游戏结束
1.2结构框图
系统结构框图如下图所示:
系统分为三部分:行场控制器,控制器和颜色控制器
2场行控制器
主要作用:输出对输入时钟clk0的分频信号clk作为系统的主时钟,产生行同步信号,场同步信号,以及当前扫面点的位置坐标x,y。x的范围是0到639,即每行640个像素。Y的范围是0到479,即每场480行。
2.1场时序
场同步信号VS,周期为16.683ms(640×480×60Hz)
每场有525行,其中480行为有效显示行,45行为场消隐区
VS每场有一个脉冲该脉冲的低电平宽度为63μs(2行)
每一场,在扫描480有效显示行时,扫描纵坐标y计数0到479。下一场y归零,重新计数。
2.2行时序
行周期为31.78μs(31.469KHz),每显示行包括800点,其中640点为有效显示区,160点为行消隐区(非显示区)。
HS每行有一个低电平脉冲,宽度为3.81μs(即96个像素,25.175MHz, 0.04us)
每一行,在扫描640有效像素点时,扫描横坐标x计数0到639。下一行x归零,重新计数。3总控制器
控制器主要分为两个部分:小球位置控制模块和挡板位置控制模块。完成小球位置的自动转换和挡板位置手动控制。
3.1小球位置控制模块下图为小球位置控制状态转换图。
s0状态:初始状态,开始后进入s1状态。
s1状态:小球向左上方跑(即小球位置坐标ball_position_x - -,ball_position_y - -)。碰到边界左上角进入s3状态;碰到上边界或者障碍物下面进入s4状态;碰到左边界或者障碍物右面进入s2状态。
s2状态:小球向右上方跑(即小球位置坐标ball_position_x ++,ball_position_y --)。碰到边界右上角进入s4状态;碰到上边界或者障碍物下面进入s3状态;碰到右边界或者障碍物左面进入s1状态。
s3状态:小球向右下方跑(即小球位置坐标ball_position_x ++,ball_position_y ++)。碰到障碍物上面或者被挡板接住进入s2状态;碰到左边界或者障碍物右面进入状态s4;
没被挡板接住进入状态s7。
s4状态:小球向左下方跑(即小球位置坐标ball_position_x - -,ball_position_y ++)。碰到障碍物上面或者被挡板接住进入s1状态;碰到左边界或者障碍物右面进入状态s3;
没被挡板接住进入状态s7。
s7状态:结束状态,死循环。
3.2挡板位置控制模块
下图为挡板位置控制流程图。
首先判断挡板位置,当挡板在中间位置时,输入lft=1,则位置自减2,输入rgt=1,则位置自加2;当挡板在屏幕最左边位置时,输入lft=1,则位置不变,输入rgt=1,则位置自加2;当挡板在屏幕最右边位置时,输入lft=1,则位置自减2,输入rgt=1,则位置不变;
4颜色控制器
开机显示黑色
小球位置显示红色
障碍物位置显示绿色
挡板位置显示蓝色
屏幕其他位置显示青色
5代码
5.1 VGA架构
module vga(rst,clk0,str,lft,rgt,vga_hs,vga_vs,vga_r,vga_g,vga_b);
input rst,clk0,str,lft,rgt;
output vga_hs,vga_vs,vga_r,vga_g,vga_b;
wire clk;
wire [9:0] baffle_position,x,y;
wire [9:0] ball_position_x,ball_position_y;
hvctrl m_hvctrl(.rst(rst),.clk0(clk0),.clk(clk),.vga_hs(vga_hs),.vga_vs(vga_vs),.x(x),.y(y));
ctl
m_ctl(.rst(rst),.clk(clk),.str(str),.lft(lft),.rgt(rgt),.x(x),.y(y),.baffle_position(baffle_position),.ball_pos ition_x(ball_position_x),.ball_position_y(ball_position_y));
rgb
m_rgb(.rst(rst),.clk(clk),.x(x),.y(y),.baffle_position(baffle_position),.ball_position_x(ball_position_ x),.ball_position_y(ball_position_y),.vga_r(vga_r),.vga_g(vga_g),.vga_b(vga_b));
endmodule
5.2行场频控制
module hvctrl(rst,clk0,clk,vga_hs,vga_vs,x,y);
input rst,clk0;
output clk,vga_hs,vga_vs,x,y;
reg clk,vga_hs,vga_vs;
reg [9:0]coordsx,coordsy,x,y;
/*bian huan shi zhong*/
always @(posedge clk0 or posedge rst)
begin
if(rst)
begin
clk<=0;
end
else
begin
clk<=~clk;
end
end
/*chan sheng hang he chang ji su qi*/
always @(posedge clk or posedge rst)
begin
if(rst)
begin
coordsx<=0;
coordsy<=0;
end
else
begin
if(coordsy<524)
begin
if(coordsx<799)
begin
coordsx<=coordsx+1;
end
else
begin
coordsx<=0;
coordsy<=coordsy+1;
end
end
else
begin
if(coordsx<799)
begin
coordsx<=coordsx+1;
end
else
begin
coordsx<=0;
coordsy<=0;
end
end
end
end
/*chan sheng chang pin he chang wei zhi xin hao*/
always @(posedge clk or posedge rst)
begin
if(rst)
begin
vga_vs<=0;
y<=1023;
end
else
begin
if(coordsy<8)
begin
vga_vs<=1;
y<=1023;
end
else if(coordsy<10)
begin
vga_vs<=1;
y<=1023;
end
else if(coordsy<12)
begin
vga_vs<=0;
y<=1023;
end
else if(coordsy<37)
begin
vga_vs<=1;
y<=1023;
end
else if(coordsy<45)
begin
vga_vs<=1;
y<=1023;
end
else
begin
vga_vs<=1;
y<=coordsy-45;
end
end
end
/*chan sheng hang pin he hang wei zhi xin hao*/ always @(posedge clk or posedge rst)
begin
if(rst)
begin
vga_hs<=0;
x<=1023;
end
else
begin
if(coordsx<8)
begin
vga_hs<=1;
x<=1023;
end
else if(coordsx<16)
begin
vga_hs<=1;
x<=1023;
end
else if(coordsx<112)
begin
vga_hs<=0;
x<=1023;
end
else if(coordsx<152)
begin
vga_hs<=1;
x<=1023;
end
else if(coordsx<160)
begin
vga_hs<=1;
x<=1023;
end
else
begin
vga_hs<=1;
x<=coordsx-160;
end
end
end
endmodule
5.3控制器
module ctl(rst,clk,str,lft,rgt,x,y,baffle_position,ball_position_x,ball_position_y);
input rst,clk,str,lft,rgt;
input [9:0] x,y;
output[9:0] baffle_position,ball_position_x,ball_position_y;
reg[9:0] baffle_position,ball_position_x,ball_position_y;
reg [2:0] move_state;
reg str_run,lft_run,rgt_run;
reg [9:0] y_sav;
parameter [2:0]
s0 = 3'b000,
s1 = 3'b001,
s2 = 3'b010,
s3 = 3'b011,
s4 = 3'b100,
s7 = 3'b111;
/*ji cun xin hao*/
always @(posedge clk or posedge rst )
begin
if(rst)
begin
str_run<=0;
lft_run<=0;
rgt_run<=0;
y_sav<=0;
end
else
begin
str_run<=str;
lft_run<=lft;
rgt_run<=rgt;
y_sav<=y;
end
end
//
/*baffle_position */
always @(posedge clk or posedge rst )
begin
if(rst)
begin
baffle_position<=320;
end
else
begin
if(move_state!=7)
begin
if(str_run)
begin
if((y_sav!=1023)&&(y==1023)) //begin scan
begin
if((baffle_position)>55&&(baffle_position<585))//in the middle
begin
if((lft_run==1)&&(rgt_run==0))
begin
baffle_position<=baffle_position-2;
end
else if((lft_run==0)&&(rgt_run==1))
begin
baffle_position<=baffle_position+2;
end
else
begin
baffle_position<=baffle_position;
end
end
else if((baffle_position==55)||(baffle_position==54)) // left
begin
if((lft_run==0)&&(rgt_run==1))
begin
baffle_position<=baffle_position+2;
end
else
begin
baffle_position<=baffle_position;
end
end
else //right
begin
if((lft_run==1)&&(rgt_run==0))
begin
baffle_position<=baffle_position-2;
end
else
begin
baffle_position<=baffle_position;
end
end
end
else
begin
baffle_position<=baffle_position;
end
end
else
begin
baffle_position<=320;
end
end
else
begin
baffle_position<=320;
end
end
end
//
/*state machine*/
always @(posedge clk or posedge rst)
begin
if(rst)
begin
move_state<=s0;
end
else
begin
if(str_run)
begin
if((y_sav!=1023)&&(y==1023))
begin
case(move_state)
s0:move_state<=s1;
s1:
/*wang zuo shang pao */
begin
if((ball_position_x==15)&&(ball_position_y==15)) /*peng dao bian jie zuo shang jiao wang you xia pao */
begin
move_state<=s3;
end
else if(ball_position_y==15)
/*peng dao bian jie shang mian wang zuo xia pao */
begin
move_state<=s4;
end
else if(ball_position_x==15)
/*peng dao bian jie zuo mian wang zuo xia pao */
begin
move_state<=s2;
end
else if(ball_position_y==196) /* peng dao zhang ai wu xia mian wang zuo xia pao*/
begin
if((ball_position_x>105)&&(ball_position_x<215))
begin
move_state<=s4;
end
else
if((ball_position_x>265)&&(ball_position_x<375))
begin
move_state<=s4;
end
else
if((ball_position_x>425)&&(ball_position_x<535))
begin
move_state<=s4;
end
else
begin
move_state<=move_state;
end
end
else if ((ball_position_x==215)||(ball_position_x==375)||(ball_position_x==535))/*peng dao zhang ai wu you mian */
begin
if((ball_position_y>105)&&(ball_position_y<195))
begin
move_state<=s2;
end
else
begin
move_state<=move_state;
end
end
else
begin
move_state<=move_state;
end
end
s2:
/*wang you shang pao */
begin
if((ball_position_x==625)&&(ball_position_y==15)) /*peng dao bian jie you shang jiao wang zuo xia pao */
begin
move_state<=s4;
end
else if(ball_position_y==15)
/*peng dao bian jie shang mian wang you xia pao */
begin
move_state<=s3;
end
else if(ball_position_x==625)
/*peng dao bian jie you mian wang zuo shang pao */
begin
move_state<=s1;
end
else if(ball_position_y==196)
/* peng dao zhang ai wu xia mian wang you xia pao*/
begin
if((ball_position_x>105)&&(ball_position_x<215))
begin
move_state<=s3;
end
else
if((ball_position_x>265)&&(ball_position_x<375))
begin
move_state<=s3;
end
else
if((ball_position_x>425)&&(ball_position_x<535))
begin
move_state<=s3;
end
else
begin
move_state<=move_state;
end
end
else if ((ball_position_x==105)||(ball_position_x==265)||(ball_position_x==425)) /*peng dao zhang ai wu zuo mian */
begin
if((ball_position_y>105)&&(ball_position_y<195))
begin
move_state<=s1;
end
else
begin
move_state<=move_state;
end
end
else
begin
move_state<=move_state;
end
end
s3:
begin
/*wang you xia pao */
if((ball_position_x==625)&&(ball_position_y<445)) /*peng dao you mian bian jie wang zuo xia pao */
begin
move_state<=s4;
end
else if (ball_position_y==105)
/*peng dao zhang ai wu shang mian wang you shang pao*/
begin
if((ball_position_x>105)&&(ball_position_x<215))
begin
move_state<=s2;
end
else
if((ball_position_x>265)&&(ball_position_x<375))
begin
move_state<=s2;
end
else
if((ball_position_x>425)&&(ball_position_x<535))
begin
move_state<=s2;
end
else
begin
move_state<=move_state;
end
end
else
if((ball_position_x==105)||(ball_position_x==265)||(ball_position_x==425))/*peng dao zhang ai wu zuo mian wang zuo xia pao*/
begin
if((ball_position_y>105)&&(ball_position_y<195))
begin
move_state<=s4;
end
else
begin
move_state<=move_state;
end
end
else if(ball_position_y==445)
/*peng dao dang ban or lost */
begin
if(baffle_position<65)
begin
if(ball_position_x begin move_state<=s2; end else begin move_state<=s7; end end else if(baffle_position>575) begin if(ball_position_x>baffle_position-65) begin move_state<=s2; end else begin