弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏
名称:弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏(代码在文末下载)
软件:Quartus II
语言:Verilog
代码功能:
弹球游戏
设计一个弹球游戏,并在VGA显示器上显示
1、可以控制游戏开始,开始时数码管显示0分
2、使用按键控制球拍的运动,当控制球拍接住球时,分数加1
3、弹球触碰屏幕边缘或者球拍时可以反弹
4、可以控制小球的移动速度和球拍的大小
4、当未成功接球时,游戏结束
本代码已在DE1-SoC开发板验证,其他开发板可以修改管脚适配,开发板如下:

FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
部分代码展示:
//弹球控制游戏
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. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

6. 仿真图
整体仿真图


复位按键同步模块

VGA同步模块

按键同步模块

产生墙、球和球拍模块

数码管模块

代码文件(付费下载):
![]()
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 弹球游戏VGA显示DE1-SoC开发板Verilog乒乓球小球游戏
发表评论
模板文件不存在: ./template/plugins/comment/pc/index.htm