名称:弹球游戏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同步模块

按键同步模块

产生墙、球和球拍模块

数码管模块

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=250
阅读全文
643