飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL

名称:飞机射击 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 1024x768@60Hz,像素时钟使用 65MHz 相关时钟资源 工程文件:包含 Vivado `.xpr` 工程、Verilog 源码、图像 ROM 初始化文件、IP 生成文件和 Nexys4 相关管脚约束。

设计思路

设计以 `plane_game` 作为顶层模块,将 VGA 时序、游戏状态、角色位置、子弹控制、图像 ROM 读取和外设显示整合在同一套 FPGA 逻辑中。VGA 部分按照 1024x768@60Hz 的时序参数组织水平同步、垂直同步、有效显示区域和像素坐标输出,为后级图像叠加提供稳定的扫描坐标基准。 游戏控制部分通过按键信号完成玩家飞机的上下左右移动和射击操作,内部设置玩家飞机、敌机、玩家子弹、敌机子弹等对象的尺寸参数,并使用 60Hz 游戏逻辑时钟推动位置更新,使移动和碰撞判断与画面刷新节奏相匹配。工程中还设置 100Hz 时钟、按键处理、边沿检测等辅助逻辑,用于提升控制信号的可用性。 显示渲染部分通过 `VGA_rgb` 模块根据当前扫描坐标、飞机坐标、子弹坐标、命中状态和游戏状态输出 RGB 数据。玩家飞机、敌机、子弹、开始画面和 GAME OVER 画面使用 ROM 图像数据进行显示,适合学习 FPGA 中基于存储器初始化文件实现图像素材显示的方法。 得分和生命状态通过命中信号进行累计,`hited` 与 `hited2` 共同参与游戏结束判断,当累计受击次数达到设定条件后进入 game over 状态。整体结构清晰,既包含 VGA 图像显示,也包含按键交互、游戏逻辑、ROM 图像资源和开发板约束,适合作为 FPGA 小游戏课程设计或综合实验参考。

模块结构

主要模块包括: `plane_game`:顶层模块,连接时钟、复位、按键、数码管、LED、VGA 同步与 RGB 输出,并组织游戏主逻辑。 `VGA_driver`:VGA 时序驱动模块,产生行同步、场同步、有效显示标志、屏幕坐标和帧同步边沿信号。 `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 游戏 FPGA 设计 Verilog Vivado VHDL 开发板验证图片 上板照片 (3).jpg

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 开发板验证图片 上板照片 (1).jpg

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 开发板验证图片 上板照片 (2).jpg

演示视频

配套演示视频展示了飞机游戏在 VGA 显示环境中的运行效果,可用于观察画面刷新、飞机移动、子弹发射、敌机与游戏结束显示等实际表现。

仿真图/仿真说明/设计文档图片

设计文档内容包含工程文件、程序文件、程序编译、RTL 图和管脚分配等说明图片,可用于查看 Vivado 工程结构、源码组织、编译结果、RTL 连接关系以及约束分配情况。

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 设计文档图片 image1.png

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 设计文档图片 image2.png

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 设计文档图片 image3.png

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 设计文档图片 image4.png

飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL 设计文档图片 image5.png

部分代码

以下展示顶层模块 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 = 11'd128, MY_PLANE_HEIGHT = 11'd128;      // ��ҷɻ�: 128x128
parameter ENEMY_PLANE_WIDTH = 11'd128, ENEMY_PLANE_HEIGHT = 11'd128; // �л�: 128x128
parameter MY_BULLET_WIDTH = 11'd32, MY_BULLET_HEIGHT = 11'd64;       // ����ӵ�: 32x64
parameter ENEMY_BULLET_WIDTH = 11'd18, ENEMY_BULLET_HEIGHT = 11'd33; // �л��ӵ�: 18x33

//-----------------------------------------------------------------------------
// VGAʱ�������1024x768@60Hz��
//-----------------------------------------------------------------------------
parameter HOR_SYNC = 11'd136, HOR_BACK_PORCH = 11'd160;              // ˮƽͬ���ͺ���
parameter HOR_ACTIVE_VEDIO = 11'd1024, HOR_FRONT_PORCH = 11'd24;     // ��Ч��ʾ��ǰ�� (136+160+1024+24=1344)
parameter VER_SYNC = 11'd6, VER_BACK_PORCH= 11'd29;                  // ��ֱͬ���ͺ���
parameter VER_ACTIVE_VEDIO = 11'd768, VER_FRONT_PORCH = 11'd3;       // ��Ч��ʾ��ǰ�� (6+29+768+3=806)

//-----------------------------------------------------------------------------
// ͼ�����������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 >= 5'd3);

//-----------------------------------------------------------------------------
// ��λ�źŴ��������͵�ƽ��ЧתΪ�ߵ�ƽ��Ч��
//-----------------------------------------------------------------------------
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),
// ... 以下代码略,完整源码请下载压缩包查看

代码文件(付费下载)

📥 付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 飞机射击 VGA 游戏 FPGA 设计 Verilog Vivado VHDL

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员