名称飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL软件Vivado语言VHDL功能介绍本工程实现了一个基于 FPGA 的 VGA 飞机射击小游戏使用 Verilog 编写并在 Vivado 环境下开发。系统通过 VGA 接口输出 1024x768 分辨率画面画面中包含玩家飞机、敌机、玩家子弹、敌机子弹、开始画面以及 GAME OVER 显示等元素能够形成完整的小游戏演示效果。 玩家可通过开发板按键控制飞机上下左右移动并通过射击按键发射子弹。游戏逻辑中设置了玩家飞机、敌机、子弹尺寸参数和位置控制信号结合 VGA 当前扫描坐标完成不同图像元素的显示判断。敌机及敌机子弹模块用于产生对抗元素命中与受击信号用于控制得分、受击次数和游戏结束状态。 工程同时包含数码管、LED、VGA 同步信号和 RGB 输出接口顶层模块将游戏控制、显示驱动、图像渲染、按键处理、时钟分频等功能连接在一起。对于学习 FPGA VGA 显示、ROM 图像读取、按键控制和简单游戏状态机设计的用户本设计具有较完整的参考价值。运行环境开发软件Vivado 开发语言Verilog 工程类型FPGA VGA 游戏显示工程 顶层模块plane_game 主要接口系统时钟、复位、方向/射击按键、数码管、LED、VGA hs/vs 同步信号、12 位 RGB 输出 显示参数VGA 1024x76860Hz像素时钟使用 65MHz 相关时钟资源 工程文件包含 Vivado .xpr 工程、Verilog 源码、图像 ROM 初始化文件、IP 生成文件和 Nexys4 相关管脚约束。设计思路设计以 plane_game 作为顶层模块将 VGA 时序、游戏状态、角色位置、子弹控制、图像 ROM 读取和外设显示整合在同一套 FPGA 逻辑中。VGA 部分按照 1024x76860Hz 的时序参数组织水平同步、垂直同步、有效显示区域和像素坐标输出为后级图像叠加提供稳定的扫描坐标基准。 游戏控制部分通过按键信号完成玩家飞机的上下左右移动和射击操作内部设置玩家飞机、敌机、玩家子弹、敌机子弹等对象的尺寸参数并使用 60Hz 游戏逻辑时钟推动位置更新使移动和碰撞判断与画面刷新节奏相匹配。工程中还设置 100Hz 时钟、按键处理、边沿检测等辅助逻辑用于提升控制信号的可用性。 显示渲染部分通过 VGA_rgb 模块根据当前扫描坐标、飞机坐标、子弹坐标、命中状态和游戏状态输出 RGB 数据。玩家飞机、敌机、子弹、开始画面和 GAME OVER 画面使用 ROM 图像数据进行显示适合学习 FPGA 中基于存储器初始化文件实现图像素材显示的方法。 得分和生命状态通过命中信号进行累计hited 与 hited2 共同参与游戏结束判断当累计受击次数达到设定条件后进入 game over 状态。整体结构清晰既包含 VGA 图像显示也包含按键交互、游戏逻辑、ROM 图像资源和开发板约束适合作为 FPGA 小游戏课程设计或综合实验参考。模块结构主要模块包括 plane_game顶层模块连接时钟、复位、按键、数码管、LED、VGA 同步与 RGB 输出并组织游戏主逻辑。 VGA_driverVGA 时序驱动模块产生行同步、场同步、有效显示标志、屏幕坐标和帧同步边沿信号。 VGA_rgb图像显示与颜色输出模块根据坐标、角色位置、子弹位置、命中状态和游戏状态输出 RGB 像素数据。 my_plane_control玩家飞机位置控制模块响应上下左右按键更新玩家飞机坐标。 my_bullet_control玩家子弹控制模块处理射击按键、子弹存在状态和子弹坐标更新。 enemy_position、enemy_position2敌机位置控制模块用于生成不同敌机的位置变化。 enemy_bullet_position、enemy_bullet_position2敌机子弹位置控制模块用于产生敌机攻击逻辑。 button_control、KeyBoard_TOP、KeyBoard_detection、jitter_clr、signal_edge按键/输入处理相关模块用于按键信号整理、消抖和边沿处理。 generate_clk_60Hz、generate_clk_100Hz低速逻辑时钟产生模块用于游戏逻辑刷新和辅助控制。 ROM_start1_image、ROM_my_plane_image、ROM_enemy_plane_image、ROM_my_bullet_image、ROM_enemy_bullet_image、GAME_OVER图像 ROM/IP 资源用于显示开始界面、飞机、子弹和结束界面素材。开发板验证工程配有 Nexys4 相关管脚约束文件 nexy4.xdc按键、数码管、LED、VGA 同步与 RGB 输出等接口可对应到开发板引脚进行综合实现。实物验证照片展示了工程在开发板环境下连接显示设备运行的状态适合需要参考 VGA 游戏上板流程的学习者使用。 该设计不仅停留在 RTL 编写层面还包含 Vivado 工程、约束分配和上板演示素材下载后可以围绕管脚约束、VGA 输出、按键控制与显示效果继续修改和扩展。演示视频配套演示视频展示了飞机游戏在 VGA 显示环境中的运行效果可用于观察画面刷新、飞机移动、子弹发射、敌机与游戏结束显示等实际表现。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档内容包含工程文件、程序文件、程序编译、RTL 图和管脚分配等说明图片可用于查看 Vivado 工程结构、源码组织、编译结果、RTL 连接关系以及约束分配情况。部分代码以下展示顶层模块plane_game的部分代码完整代码可关注下方公众号卡片获取。module plane_game( input clk, rst, // ϵͳʱӺ͸λ input button_left, button_shoot, button_right, button_up, button_down, // ť output [7:0] SSEG_CA, SSEG_AN, // ʾ output [7:0] led, // LEDָʾ output hs, vs, // VGAͬź output [11:0] rgb); // VGAɫ //----------------------------------------------------------------------------- // ɻӵߴλأ //----------------------------------------------------------------------------- parameter MY_PLANE_WIDTH 11d128, MY_PLANE_HEIGHT 11d128; // ҷɻ: 128x128 parameter ENEMY_PLANE_WIDTH 11d128, ENEMY_PLANE_HEIGHT 11d128; // л: 128x128 parameter MY_BULLET_WIDTH 11d32, MY_BULLET_HEIGHT 11d64; // ӵ: 32x64 parameter ENEMY_BULLET_WIDTH 11d18, ENEMY_BULLET_HEIGHT 11d33; // лӵ: 18x33 //----------------------------------------------------------------------------- // VGAʱ1024x76860Hz //----------------------------------------------------------------------------- parameter HOR_SYNC 11d136, HOR_BACK_PORCH 11d160; // ˮƽͬͺ parameter HOR_ACTIVE_VEDIO 11d1024, HOR_FRONT_PORCH 11d24; // Чʾǰ (1361601024241344) parameter VER_SYNC 11d6, VER_BACK_PORCH 11d29; // ֱͬͺ parameter VER_ACTIVE_VEDIO 11d768, VER_FRONT_PORCH 11d3; // Чʾǰ (6297683806) //----------------------------------------------------------------------------- // ͼROMȡ //----------------------------------------------------------------------------- parameter IMAGE_PIX_NUMER 16384; // 128x128 16384 // // ڲź // //----------------------------------------------------------------------------- // ʱӺͿź //----------------------------------------------------------------------------- wire clk_60Hz; // 60HzʱӣϷ߼ wire clk_65MHz; // 65MHzʱӣVGAʱӣ wire clk_100Hz; // 100Hzʱ wire locked; // PLLź wire active_video; // VGAЧʾ־ wire vs_neg; // ֱͬ½أ֡ͬ //----------------------------------------------------------------------------- // ťź //----------------------------------------------------------------------------- wire up, down, left, right; // ť wire shoot; // ťͬʱΪλ wire up_raw, down_raw, left_raw, right_raw; wire shoot_raw; //----------------------------------------------------------------------------- // ӵ״̬ź //----------------------------------------------------------------------------- wire have_bullet_now; // ӵڱ־ wire have_enemy_bullet_now; // л1ӵڱ־ wire have_enemy_bullet2_now; // л2ӵڱ־ //----------------------------------------------------------------------------- // λź //----------------------------------------------------------------------------- wire [10:0] screen_x, screen_y; // ǰɨ wire [10:0] enemy_x, enemy_y; // л1λ wire [10:0] enemy2_x, enemy2_y; // л2λã wire [10:0] enemy_bullet_x, enemy_bullet_y; // л1ӵλ wire [10:0] enemy_bullet2_x, enemy_bullet2_y; // л2ӵλã wire [10:0] my_plane_x, my_plane_y; // ҷɻλ wire [10:0] my_bullet_x, my_bullet_y; // ӵλ //----------------------------------------------------------------------------- // Ʒֺ˺ź //----------------------------------------------------------------------------- wire [3:0] hited; // л1ӵҴ wire [3:0] hited2; // л2ӵҴ wire [3:0] hit; // һел÷֣ wire play; // Ϸб־ wire [4:0] total_hited_sum; assign total_hited_sum hited hited2; wire game_over; assign game_over (total_hited_sum 5d3); //----------------------------------------------------------------------------- // λźŴ͵ƽЧתΪߵƽЧ //----------------------------------------------------------------------------- wire rst_p; assign rst_p ~rst; // // ģʵ // //----------------------------------------------------------------------------- // M0: 60Hzʱ //----------------------------------------------------------------------------- generate_clk_60Hz i_generate_clk_60Hz( .clk (clk), .rst (rst_p),//ߵƽλ .clk_60Hz (clk_60Hz)); //----------------------------------------------------------------------------- // M1: VGAʱ - ͬźź //----------------------------------------------------------------------------- VGA_driver i_VGA_driver( .clk (clk_65MHz), .rst (rst_p), .hs (hs), .vs (vs), .vs_neg (vs_neg), .screen_x (screen_x), .screen_y (screen_y), .active_video (active_video)); //----------------------------------------------------------------------------- // M2: VGAɫģ - Ƹʾ //----------------------------------------------------------------------------- VGA_rgb i_VGA_rgb( .clk (clk_65MHz), .rst (rst_p), .hited (hited), // ... 以下代码略完整源码请下载压缩包查看代码获取点击下方公众号卡片