反应游戏 FPGA 设计 Verilog Quartus
2026/6/4 18:35:23 网站建设 项目流程

名称:反应游戏 FPGA 设计 Verilog Quartus

软件:Quartus

语言:Verilog

开发板/平台:Cyclone IV FPGA开发板

功能介绍

本项目是一个反应游戏/反应计时类 FPGA 设计,使用 Verilog 编写并在 Quartus 环境下完成工程搭建。系统通过开发板按键实现启动计数、停止计数、保存成绩、查看已保存数据、切换最大/最小值显示、查看下一条数据、触发排序以及切换原始/排序数据等功能,适合用于数字系统课程设计和 FPGA 综合实验。 顶层模块名为 FinalDesign,输入包含 50MHz 系统时钟、全局清零信号、多路按键控制信号以及排序模式拨码开关;输出连接数码管位选、数码管段选和多个 LED 状态指示。数码管用于显示当前计数值或存储数据,LED 用于提示错误/状态、运行中状态、最大最小值提示以及排序完成状态。 设计不仅包含基础计时和显示功能,还加入了数据保存、数据查看、最大值/最小值显示以及数据排序功能。用户可以通过按键保存多次反应数据,再通过查看和排序功能对结果进行比较,功能完整度高于单纯计数器或简单按键显示实验。

运行环境

开发语言:Verilog 开发软件:Quartus 目标平台:Cyclone IV FPGA开发板 工程包含 Quartus 工程文件、Verilog 源码、管脚约束/分配文件、编译输出文件和测试文件,可用于综合、编译、下载验证和仿真参考。

设计思路

本设计围绕“反应计时/数据记录/数据显示”这一类交互式 FPGA 应用展开。系统以 50MHz 时钟作为基础时钟输入,通过按键控制计数运行状态,使用 start、stop、save、view、next_data、sort 等控制信号完成启动、停止、保存、查看、排序和显示切换等操作。由于按键属于机械输入,顶层对各个按键控制信号统一接入 debounce_fsm 去抖模块,减少抖动对状态机和数据操作的影响。 计数部分输出 10 位计数数据,并配合状态标志反馈当前计数状态。主逻辑模块负责控制计数启停及错误标志,数据存储模块负责保存计数结果、维护数据数量、查看当前数据、输出最大值/最小值显示状态,并支持排序完成标志输出。这样可以把计时控制、数据管理和显示驱动分开处理,模块职责较清晰,便于调试和二次扩展。 显示部分采用动态扫描数码管输出,顶层提供 8 位位选 DIG 和 7 位段选 codeout。系统根据当前模式选择正常计数显示、数据查看显示、最大值显示或最小值显示,并通过 LED、LED_InRuning、LED_comp、LED_SortDone 等信号给出错误状态、运行状态、比较提示和排序完成提示。排序模式由 sort_mode 拨码选择,支持升序和降序两种方向。

模块结构

工程顶层模块为 FinalDesign,主要由以下 Verilog 模块组成: FinalDesign:系统顶层,连接时钟、复位、按键、拨码开关、数码管和 LED,并完成各子模块例化。 MainLogic:主逻辑控制模块,用于处理计数启动、停止及错误状态生成。 Counter:计数器模块,输出 10 位计数结果和计数状态标志。 debounce_fsm:按键去抖模块,用于对 start、stop、save、view、show_max_min、next_data、sort、toggle_sorted 等按键信号进行去抖处理。 DataStorage:数据存储与排序相关模块,负责保存数据、输出当前查看数据、最大/最小值显示、排序完成标志等功能。 DynamicScanTubes:数码管动态扫描显示模块,驱动 DIG 位选和 codeout 段选输出。 FinalDesign_tb:仿真测试文件,用于对工程逻辑进行仿真验证参考。

开发板验证

工程支持 Cyclone IV FPGA 开发板验证,工程中配置了管脚约束/分配文件,并配有开发板实物运行展示。按键、拨码开关、LED 和数码管等外设接口已经在顶层端口中统一定义,便于直接结合开发板资源进行下载测试。 实际验证重点包括按键去抖后的启动、停止、保存、查看、排序触发等操作,以及数码管动态扫描显示、运行状态 LED、错误/状态 LED、最大最小值提示 LED、排序完成 LED 等输出状态。该设计适合用于 FPGA 课程设计、数字逻辑综合实验以及带按键交互和数据显示的综合项目参考。

演示视频

配套演示视频展示了工程在开发板上的实际运行效果,可用于观察按键操作、数码管显示变化以及状态 LED 响应。对于需要复现实验现象或检查功能流程的用户,视频可以作为上板调试和验收时的参考。

演示视频请关注公众号后获取对应资料查看。

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

设计文档内容包含工程文件、程序文件、程序编译、RTL 图和管脚分配等说明,并配有相关文档图片。工程中包含 FinalDesign_tb 测试文件,可作为仿真和功能检查参考。

部分代码

以下展示顶层模块FinalDesign的部分代码,完整代码可关注下方公众号卡片获取。

module FinalDesign ( // 系统时钟与复位 input clk_50M, // 50MHz系统时钟 input clear, // 全局同步清零(高有效) // 功能控制按键(需去抖) input start, // 启动计数/运行(按键,上升沿有效) input stop, // 停止计数/运行(按键,上升沿有效) input save, // 保存数据(按键,上升沿有效) input view, // 切换查看模式(按键,上升沿有效) input show_max_min, // 切换最大/最小值显示(按键,上升沿有效) input next_data, // 查看下一个数据(按键,上升沿有效) input sort, // 触发数据排序(按键,上升沿有效) input toggle_sorted, // 切换原始/排序数据(按键,上升沿有效) // 排序模式选择(拨码开关,无需去抖) input sort_mode, // 0=升序,1=降序 // 输出外设 output wire [7:0] DIG, // 数码管位选 output wire [6:0] codeout, // 数码管段选 output wire LED, // 错误/状态LED output wire LED_InRuning, // 运行中LED output wire LED_comp, // 最大最小值提示LED output wire LED_SortDone // 排序完成LED(新增) ); // -------------------------- 内部信号定义 -------------------------- // 计数器模块接口 wire [9:0] CounterOut_wire; // 计数器输出数据(10位) wire [1:0] CounterFlag_wire; // 计数器状态标志 // 主逻辑模块接口 wire ErrorFlag_wire; // 错误标志(如计数越界、无效操作) // 数据存储模块接口 wire [9:0] display_data; // 待显示数据 wire display_error; // 显示错误标志 wire [3:0] data_count; // 已存储数据个数 wire [9:0] current_stored_data; // 当前查看的存储数据 wire [1:0] display_mode_wire; // 显示模式(00-正常 01-查看 10-最大值 11-最小值) wire sort_done; // 排序完成标志(来自DataStorage) // 按键去抖后信号(所有按键类输入均需去抖) wire view_deb; wire show_max_min_deb; wire next_data_deb; wire save_deb; wire stop_deb; wire start_deb; wire sort_deb; // 排序触发去抖后信号 wire toggle_sorted_deb; // 切换原始/排序数据去抖后信号 // -------------------------- 按键去抖模块实例化 -------------------------- // 去抖模块:view按键 debounce_fsm deb_view( .clk(clk_50M), .rst(clear), .key_in(view), .key_out(view_deb) ); // 去抖模块:show_max_min按键 debounce_fsm deb_show_max_min( .clk(clk_50M), .rst(clear), .key_in(show_max_min), .key_out(show_max_min_deb) ); // 去抖模块:next_data按键 debounce_fsm deb_next_data( .clk(clk_50M), .rst(clear), .key_in(next_data), .key_out(next_data_deb) ); // 去抖模块:save按键 debounce_fsm deb_save( .clk(clk_50M), .rst(clear), .key_in(save), .key_out(save_deb) ); // 去抖模块:start按键 debounce_fsm deb_start( .clk(clk_50M), .rst(clear), .key_in(start), .key_out(start_deb) ); // 去抖模块:stop按键 debounce_fsm deb_stop( .clk(clk_50M), .rst(clear), .key_in(stop), .key_out(stop_deb) ); // 去抖模块:sort按键(新增) debounce_fsm deb_sort( .clk(clk_50M), .rst(clear), .key_in(sort), .key_out(sort_deb) ); // 去抖模块:toggle_sorted按键(新增) debounce_fsm deb_toggle_sorted( .clk(clk_50M), .rst(clear), .key_in(toggle_sorted), .key_out(toggle_sorted_deb) ); // -------------------------- 子模块实例化 -------------------------- // 1. 主逻辑模块:控制计数启停、错误标志生成 MainLogic ML( .clk_50M(clk_50M), .clear(clear), .start(start_deb), .stop(stop_deb), // ... 以下代码略,完整源码请下载压缩包查看

代码获取:点击下方公众号卡片

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询