名称:自动售票机 FPGA 设计 Verilog Quartus FPGA代码工程源码下载
软件:Quartus
语言:Verilog
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
功能介绍
本设计为自动售票机 FPGA 实现,使用 Verilog HDL 编写,工程环境为 Quartus。系统围绕售票流程展开,支持 1 元、5 元、10 元三种投币输入,并提供 1 元、2 元、3 元、4 元四种票价选择。用户完成投币和票价选择后,可通过确认按键触发购买判断,系统根据已投入金额与所选票价进行处理。 设计包含购买成功指示、票价选择 LED 指示、投币金额显示、票价显示和找零金额显示等功能。顶层接口中包含复位、投币按键、票价按键、确认按键、退币按键、成功指示灯、票价 LED 以及数码管位选和段选信号,适合用于 FPGA 课程设计、数字逻辑综合实验和状态机控制类项目参考。 按键输入部分加入消抖处理,将机械按键转换为稳定的按键下降沿脉冲,避免一次按键被多次识别。核心控制部分完成金额累加、票价选择、确认购买、退币和找零等逻辑,显示部分负责将金额相关数据输出到数码管,形成完整的人机交互流程。
运行环境
开发语言:Verilog。 开发软件:Quartus。 仿真相关:工程中包含 Testbench 文件 auto_sell_tb.v,并带有 ModelSim 仿真目录,可用于顶层模块及相关功能模块的仿真参考。
设计思路
系统采用模块化设计思路,将自动售票机的输入处理、状态控制和显示输出分开实现。顶层模块 auto_sell 负责连接各功能模块,对外提供时钟、复位、投币按键、票价选择按键、确认按键、退币按键、LED 指示和数码管显示接口,对内完成按键消抖信号、金额数据和显示数据之间的连接。 投币输入采用 1 元、5 元、10 元三个独立按键,票价选择采用 1 元到 4 元四个独立按键。每个按键先进入 key_jitter 消抖模块,输出稳定的单次按键触发脉冲,再送入状态控制模块。这样可以让状态控制逻辑只处理有效事件,减少机械抖动对金额累加、票价选择和确认购买的影响。 状态控制模块 state_ctrl 是系统核心,负责记录当前投入金额、所需票价和找零金额,并控制购买成功指示灯及票价选择 LED。用户投入金额后选择票价,再按确认键进行购买判断;当金额满足票价要求时,系统给出成功指示并计算找零;当需要退回投入金额时,可通过退币按键触发退币相关逻辑。 显示部分通过数码管位选和段选接口输出金额信息,使投币金额、票价和找零等数据能够直观显示。整体结构清晰,既覆盖自动售票机的典型业务流程,也便于读者拆分学习按键消抖、状态机控制、BCD 金额处理和数码管动态显示等 FPGA 常用设计方法。
模块结构
主要模块包括: auto_sell:顶层模块,连接按键输入、状态控制、LED 指示和数码管显示。 key_jitter:按键消抖模块,用于投币、票价选择、确认和退币等按键输入处理。 state_ctrl:状态控制模块,完成投币金额、票价选择、确认购买、退币找零和指示灯控制。 display_num:数码管显示模块,用于金额相关数据的显示输出。 auto_sell_tb:测试平台文件,用于工程仿真验证参考。
演示视频
包含自动售票机功能演示视频,可用于查看投币、票价选择、确认购买、退币找零、LED 指示和数码管显示等运行效果。
仿真图/仿真说明/设计文档图片
设计文档内容包含工程文件、程序文件、程序编译、RTL 图、仿真图、Testbench、顶层模块仿真、按键消抖模块、状态控制模块和数码管显示模块等说明,便于结合源码理解整体工程结构与仿真流程。
部分代码
以下展示顶层模块 auto_sell 的部分代码,完整源码请下载压缩包查看。
module auto_sell( input clk_in,//50M input rst_n,//低电平复位 input coin_1_key,//投币1元 input coin_5_key,//投币5元 input coin_10_key,//投币10元 input return_key,//退回所投币(不足面值时) input price_1_key,//1元商品 input price_2_key,//2元商品 input price_3_key,//3元商品 input price_4_key,//4元商品 input confirm_key,//确认 output succeed_ledn,//购买成功指示灯 output [3:0] led,//选择票价指示灯 output [2:0] DLA,//数码管位选ABC:0~7,8个数码管 output [7:0] HEX//数码管段选 ); wire [7:0] input_money_BCD;//投币金额 wire [3:0] need_money_BCD;//价钱 wire [7:0] change_money_BCD;//找钱 wire coin_1_p;//投币1元 wire coin_5_p;//投币5元 wire coin_10_p;//投币10元 wire price_2_p;//2元商品 wire price_3_p;//3元商品 wire price_4_p;//4元商品 wire price_1_p;//1元商品 wire confirm_p;//确认 wire return_p;//退币 //按键消抖模块 key_jitter i0_key_jitter( . clkin(clk_in), . key_in(coin_1_key),//输入 . key_negedge(coin_1_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i1_key_jitter( . clkin(clk_in), . key_in(coin_5_key),//输入 . key_negedge(coin_5_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i10_key_jitter( . clkin(clk_in), . key_in(coin_10_key),//输入 . key_negedge(coin_10_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i2_key_jitter( . clkin(clk_in), . key_in(price_2_key),//输入 . key_negedge(price_2_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i3_key_jitter( . clkin(clk_in), . key_in(price_3_key),//输入 . key_negedge(price_3_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i4_key_jitter( . clkin(clk_in), . key_in(price_4_key),//输入 . key_negedge(price_4_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i5_key_jitter( . clkin(clk_in), . key_in(price_1_key),//输入 . key_negedge(price_1_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i6_key_jitter( . clkin(clk_in), . key_in(confirm_key),//输入 . key_negedge(confirm_p)//消抖后按键下降沿 ); //按键消抖模块 key_jitter i7_key_jitter( . clkin(clk_in), . key_in(return_key),//输入 . key_negedge(return_p)//消抖后按键下降沿 ); //状态控制模块 state_ctrl i_state_ctrl( . clk_in(clk_in),//50M . rst_n(rst_n),//复位 . coin_1_p(coin_1_p),//投币1元 . coin_5_p(coin_5_p),//投币5元 . coin_10_p(coin_10_p),//投币10元 . price_1_p(price_1_p),//1元商品 . price_2_p(price_2_p),//2元商品 . price_3_p(price_3_p),//3元商品 . price_4_p(price_4_p),//4元商品 . confirm_p(confirm_p),//确认 . return_p(return_p),//退币 . succeed_ledn(succeed_ledn),//购买成功指示灯 . led(led),//选择票价指示灯 . input_money_BCD(input_money_BCD),//投币金额 . need_money_BCD(need_money_BCD),//价钱 // ... 以下代码略,完整源码请下载压缩包查看
225