搜档网
当前位置:搜档网 › 小球游戏verilog

小球游戏verilog

小球游戏verilog
小球游戏verilog

小球游戏

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

相关主题