弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏FPGA代码下载

名称:弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏

软件:Quartus II

语言:Verilog

代码功能:

弹球游戏

设计一个弹球游戏,并在VGA显示器上显示

1、可以控制游戏开始,开始时数码管显示0分

2、使用按键控制球拍的运动,当控制球拍接住球时,分数加1

3、弹球触碰屏幕边缘或者球拍时可以反弹

4、可以控制小球的移动速度和球拍的大小

4、当未成功接球时,游戏结束

本代码已在DE1-SoC开发板验证,其他开发板可以修改管脚适配,开发板如下:

VGA_ball_DE1_SoC.png

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com

代码下载:

弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏(代码在文末下载)软件:Quartus II语言:Verilog代码功能:弹球游戏设计一个弹球游戏,并在VGA显示器上显示1、可以控制游戏开始,开始时数码管显示0分2、使用按键控制球拍的运动,当控制球拍接住球时,分数加13、弹球触碰屏幕边缘或者球拍时可以反弹4、可以控制小球的移动速度和球拍的大小4、当未成功接球时,游戏结束本代名称:弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏(代码在文末下载)软件:Quartus II语言:Verilog代码功能:弹球游戏设计一个弹球游戏,并在VGA显示器上显示1、可以控制游戏开始,开始时数码管显示0分2、使用按键控制球拍的运动,当控制球拍接住球时,分数加13、弹球触碰屏幕边缘或者球拍时可以反弹4、可以控制小球的移动速度和球拍的大小4、当未成功接球时,游戏结束本代icon-default.png?t=N7T8http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=250

部分代码展示:

//弹球控制游戏
module vga_controller_top(clk_50M, rst, speed_sw, size_sw, btn_up, btn_down, hsync, vsync, VGA_CLK, VGA_BLANK_N, HEX1,HEX, rgb);
   input         clk_50M;//时钟
   input         rst;//复位
   input [1:0]   speed_sw;//球速控制
   input [1:0]   size_sw;//球拍大小控制
   input         btn_up;//上按键
   input         btn_down;//下按键
   output        hsync;//VGA水平同步信号
   output        vsync;//VGA垂直同步信号
   output        VGA_CLK;//VGA控制时钟
   output        VGA_BLANK_N;//VGA控制有效信号
   output [6:0]  HEX;//数码管信号
	output [6:0]  HEX1;//数码管信号
   output [11:0] rgb;//RGB信号
   
   
   wire          clk;
   wire          video_on;
   wire          rst_s;
   wire [9:0]    pixel_x;
   wire [9:0]    pixel_y;
   wire          db_btn_up;
   wire          db_btn_down;
   
   wire [1:0]    btn_up_dowm;
   wire [7:0]    score;
   wire          hsync_buf;
   wire          vsync_buf;
   wire [11:0]   rgb_buf;
   //信号输出
   assign hsync = hsync_buf;
   assign vsync = vsync_buf;
   assign rgb = rgb_buf;
   
   assign clk = clk_50M;
   
   //复位信号同步模块
   aiso_rst u0(.clk(clk), .reset(rst), .reset_s(rst_s));
   
   //VGA时序控制模块
   vga_sync u1(.clk(clk), .rst(rst_s), .VGA_CLK(VGA_CLK), .VGA_BLANK_N(VGA_BLANK_N), .hsync(hsync_buf), .vsync(vsync_buf), .pixel_x(pixel_x), .pixel_y(pixel_y), .video_on(video_on));
   
   //按键信号控制模块
   debounce u2(.clk(clk), .reset(rst_s), .sw(btn_up), .db(db_btn_up));
   
   //按键信号控制模块
   debounce u3(.clk(clk), .reset(rst_s), .sw(btn_down), .db(db_btn_down));
   //将上下控制按键信号拼接为一个2位的信号
   assign btn_up_dowm = ({db_btn_down, db_btn_up});
   
   
   //调用图形控制模块
   graphic_generator u4(.clk(clk), .rst(rst_s), .btn(btn_up_dowm), .pixel_x(pixel_x), .pixel_y(pixel_y), .speed_sw(speed_sw), .size_sw(size_sw), .video_on(video_on), .score(score), .rgb(rgb_buf));
   
   //调用数码管显示模块
   display u5(.score(score), .HEX(HEX), .HEX1(HEX1));
   
endmodule


//图形控制模块
module graphic_generator(clk, rst, speed_sw, size_sw, btn, pixel_x, pixel_y, video_on, score, rgb);
   
   input         clk;//时钟
   input         rst;//复位
   
   input [1:0]   speed_sw;//速度控制
   input [1:0]   size_sw;//球拍大小控制
   input [1:0]   btn;//按键
   input [9:0]   pixel_x;//x坐标
   input [9:0]   pixel_y;//y坐标
   input         video_on;//图像使能信号
   output [7:0]  score;//分数
   output [11:0] rgb;//RGB信号
   reg [11:0]    rgb;
   
      //中间信号定义
   wire          refr_tick;
   
   wire [9:0]    paddle_y_t;
   wire [9:0]    paddle_y_b;
   reg [9:0]     paddle_y_reg;
   reg [9:0]     paddle_y_next;
   
   wire [9:0]    ball_x_l;
   wire [9:0]    ball_x_r;
   wire [9:0]    ball_y_t;
   wire [9:0]    ball_y_b;
   reg [9:0]     ball_x_reg;
   reg [9:0]     ball_y_reg;
   wire [9:0]    ball_x_next;
   wire [9:0]    ball_y_next;
   reg [9:0]     x_delta_reg;
   reg [9:0]     x_delta_next;
   reg [9:0]     y_delta_reg;
   reg [9:0]     y_delta_next;
   
   wire          wall_on;
   wire          paddle_on;
   wire          ball_on;
   wire [11:0]   wall_rgb;
   wire [11:0]   paddle_rgb;
   wire [11:0]   ball_rgb;
   
   reg           hit_on;
   reg           hit_on_buf0;
   reg           hit_on_buf1;
   reg [7:0]     score_buf;
   //y坐标481,x坐标0
   assign refr_tick = (((pixel_y == 10'b0111100001) & (pixel_x == 10'b0000000000))) ? 1'b1 : 
                      1'b0;
   assign score = score_buf;//分数
   
   
   always @(posedge clk or posedge rst)
      if (rst == 1'b1)
      begin
         paddle_y_reg <= 10'b0000000000;
         ball_x_reg <= 10'b0000000000;
         ball_y_reg <= 10'b0000000000;
         x_delta_reg <= 10'b0000000100;
         y_delta_reg <= 10'b0000000100;
      end
      else 
      begin//D触发器缓存信号
         paddle_y_reg <= paddle_y_next;
         ball_x_reg <= ball_x_next;
         ball_y_reg <= ball_y_next;
         x_delta_reg <= x_delta_next;
         y_delta_reg <= y_delta_next;
      end
   //绘制墙,x坐标32到35,4像素,y坐标0~480,即左侧一条竖线
   assign wall_on = (((pixel_x >= 10'b0000100000) & (pixel_x <= 10'b0000100011))) ? 1'b1 : 
                    1'b0;
   assign wall_rgb = 12'b000000001111;//墙的颜色
   
   assign paddle_y_t = paddle_y_reg;
   	//size_sw来控制球拍大小(y坐标)
   assign paddle_y_b = ((size_sw == 2'b00)) ? paddle_y_t + 10'b0001100100 : //100像素
                       ((size_sw == 2'b01)) ? paddle_y_t + 10'b0001010000 : //80像素
                       ((size_sw == 2'b10)) ? paddle_y_t + 10'b0000111100 : //60像素
                       paddle_y_t + 10'b0000101000;//40像素
   	//600,603。控制球拍的x,y坐标,x坐标4像素,y坐标根据size_sw控制
   assign paddle_on = (((pixel_x >= 10'b1001011000) & (pixel_x <= 10'b1001011011) & (pixel_y >= paddle_y_t) & (pixel_y <= paddle_y_b))) ? 1'b1 : 
                      1'b0;
   
   assign paddle_rgb = 12'b000011110000;//球拍颜色
   
   //按键控制球拍
   always @(paddle_y_reg or refr_tick or btn or paddle_y_b or paddle_y_t)
   begin
      paddle_y_next <= paddle_y_reg;
      if (refr_tick == 1'b1)
      begin
         if ((btn[1]) == 1'b1 & (paddle_y_b < 10'b0111011011))//475
            paddle_y_next <= paddle_y_reg + 10'b0000000100;//上升,一次移动4像素
         else if ((btn[0]) == 1'b1 & (paddle_y_t > 10'b0000000100))//4
            paddle_y_next <= paddle_y_reg - 10'b0000000100;//下降,一次移动4像素
      end
   end
   //弹球控制
   assign ball_x_l = ball_x_reg;//球心坐标
   assign ball_y_t = ball_y_reg;//球心坐标
   assign ball_x_r = ball_x_l + 10'b0000001000 - 10'b0000000001;//球外径坐标
   assign ball_y_b = ball_y_t + 10'b0000001000 - 10'b0000000001;//球外径坐标

设计文档:

1. 工程文件

4ba817b0-e4f0-4cc2-aeea-e7b21d4bb7a1.png

2. 程序文件

8830deed-8094-46e0-955c-4bdee320726d.png

3. 程序编译

475bfd94-3294-4147-a0b2-7b6d1742ea28.png

4. RTL图

f55fd666-ed04-489a-aadb-f13f3fd4548b.png

6. 仿真图

整体仿真图

复位按键同步模块

VGA同步模块

按键同步模块

产生墙、球和球拍模块

数码管模块

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值