当前位置: 首页 > news >正文

自动售货机串口投币 FPGA 设计 Verilog Vivado

名称:自动售货机串口投币 FPGA 设计 Verilog Vivado

软件:Vivado

语言:Verilog

功能介绍

本设计为自动售货机 FPGA 控制系统,采用 Verilog 编写并在 Vivado 环境下完成工程实现。系统面向常见售货机控制流程,支持 1 元、1.5 元、2 元、3 元四类商品选择,通过拨码开关选择商品价格,通过确认按键触发购买流程,并结合 LED、出货指示灯和数码管完成交互显示。 投币部分采用串口输入方式,串口接收模块负责接收外部投币数据,接口说明中给出了 230400 波特率和奇校验设置。系统会累计已投入金额,并与当前选中商品价格进行比较:当金额满足购买条件时输出对应商品的出货完成指示,同时计算找零金额;当金额不足时不会出货,并通过 LED 闪烁进行提示。 显示部分通过两组数码管显示与售货流程相关的金额信息,包括投入总金额、选中商品价格和找零金额,便于观察系统当前状态。整体功能覆盖商品选择、串口投币、购买确认、金额判断、找零、出货提示和异常提示,适合作为 FPGA 状态机控制、UART 接收和数码管动态显示的综合设计参考。

运行环境

开发语言:Verilog 开发软件:Vivado 顶层模块:auto_sell 工程包含 Vivado 工程文件、Verilog 源码、约束文件、仿真工程、Testbench、设计文档及演示视频。

设计思路

系统采用模块化设计,将自动售货机业务流程拆分为串口接收、按键消抖、售货状态控制和数码管显示几个部分。顶层模块 auto_sell 负责连接外部时钟、复位、商品选择拨码、串口输入、确认购买按键、LED 提示、出货指示灯以及两组数码管接口,并在内部完成各功能模块之间的信号连接。 串口接收模块 uart_rx_module 用于把外部投币数据转换为内部可处理的数据与接收完成标志。确认购买按键先经过 key_xiaodou 消抖处理,避免机械按键抖动导致状态机误触发。售货核心逻辑集中在 state_control 模块中,该模块根据商品选择信号、串口投币数据和确认按键信号,完成投入金额累计、商品价格判断、找零金额计算、出货指示和 LED 报警提示。 显示模块 display_num 读取投入总金额、商品价格和找零金额,并驱动数码管段选与位选输出。这样的结构使控制逻辑和显示逻辑分离,便于调试与扩展;如果后续需要增加商品种类、调整金额编码或替换显示方式,也可以围绕状态控制和显示模块分别修改。

模块结构

主要模块包括: auto_sell:顶层模块,连接系统输入输出并例化 UART 接收、按键消抖、状态控制和数码管显示模块。 uart_rx_module:串口接收模块,接收投币数据并输出接收完成标志及 8 位数据。 key_xiaodou:确认购买按键消抖模块,输出稳定的按键信号。 state_control:售货状态控制模块,完成商品选择、投币累计、购买判断、出货指示、找零计算和 LED 提示。 display_num:数码管显示模块,显示投入总金额、选中商品价格和找零金额。 auto_sell_tb:仿真测试模块,用于验证典型购买和金额不足场景。

开发板验证

工程提供了 Vivado 管脚约束文件 pins.xdc,并包含实现后生成的 bit 文件及实现报告,可用于开发板下载验证。约束覆盖时钟、复位、商品选择拨码、确认按键、串口输入、LED、出货指示灯和数码管段选/位选等外设接口,适合结合实际开发板外设观察自动售货机控制流程。 演示中可通过拨码选择商品,通过串口输入模拟投币,按下确认按键后观察出货指示灯、LED 提示以及数码管金额显示。当投入金额满足商品价格时,对应出货指示灯点亮并显示找零结果;金额不足时不出货,并由 LED 闪烁提示。

演示视频

提供演示视频,展示自动售货机 FPGA 工程的实际运行效果,可用于观察商品选择、投币、确认购买、出货指示、LED 提示和数码管显示等功能流程。

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

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

设计文档包含工程文件、程序文件、程序编译、管脚分配、RTL 图、Testbench 和仿真图等内容。 仿真示例包括选择 2.0 元商品后先后投币 20+5=25,购买成功、找零 5 元并成功出货的场景;也包括选择 3.0 元商品后先后投币 20+5=25,投币金额不足、找零 25 元、未成功出货并 LED 闪烁提示的场景。

部分代码

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

module auto_sell( input clk_in,//100M input rst,//高电平有效--S0 //拨码按键 高电平有效 input Selection_goods_10,//选商品1元--SW7 input Selection_goods_20,//选商品2元--SW6 input Selection_goods_30,//选商品3元--SW5 input Selection_goods_15,//选商品1.5元--SW4 input uart_rx,//串口输入(波特率230400,奇校验) //按键 高电平有效 input confirm_button,//确认购买,高电平有效(S1) output [7:0] LED,//闪烁报警(3s)(D9~16) output outgo_done_10,//出货指示灯(D1) output outgo_done_20,//出货指示灯(D2) output outgo_done_30,//出货指示灯(D3) output outgo_done_15,//出货指示灯(D4) output [7:0] dig_led_1,//数码管段选显示 output [3:0] wei_led_1, //数码管位选显示 output [7:0] dig_led_2,//数码管段选显示 output [3:0] wei_led_2 //数码管位选显示 ); wire confirm_button_out; wire data_receive_en; //接收完成指示位 wire [7:0] data_receive; //接收到的数据 //串口接收模块 uart_rx_module i_uart_rx_module ( .clk(clk_in), .rst_p(rst), .uart_rx(uart_rx), .data_receive_en(data_receive_en), .data_receive(data_receive) ); //按键消抖模块 key_xiaodou confirm_btt ( . clk_in(clk_in), . key_in(confirm_button), . key_out(confirm_button_out) ); wire [7:0] total_throw_inmoney;//投入总钱币 wire [7:0] total_need_money;//选中商品价钱 wire [7:0] total_refund_money;//找零金额 //售货状态控制模块 state_control state_control_u( . clk_in(clk_in), . rst(rst), . Selection_goods_10(Selection_goods_10), . Selection_goods_20(Selection_goods_20), . Selection_goods_30(Selection_goods_30), . Selection_goods_15(Selection_goods_15), .data_receive_en(data_receive_en),//串口投币 .data_receive(data_receive), . confirm_button_out(confirm_button_out), . LED(LED), . outgo_done_10(outgo_done_10),//出货指示灯1 . outgo_done_20(outgo_done_20),//出货指示灯2 . outgo_done_30(outgo_done_30),//出货指示灯3 . outgo_done_15(outgo_done_15),//出货指示灯4 . total_throw_inmoney_out(total_throw_inmoney),//投入总钱币 . total_need_money_out(total_need_money),//选中商品价钱 . total_refund_money_out(total_refund_money)//找零金额 ); /////////////////////////////////////////////////////////////////////////////////////////////// //显示模块 display_num i_display_num( . clk(clk_in),//100M . total_throw_inmoney(total_throw_inmoney),//投入总钱币 . total_need_money(total_need_money),//选中商品价钱 . total_refund_money(total_refund_money),//找零金额 . dig_led_1(dig_led_1),//数码管段选显示 . wei_led_1(wei_led_1),//数码管位选显示 . dig_led_2(dig_led_2),//数码管段选显示 . wei_led_2(wei_led_2)//数码管位选显示 ); endmodule

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

http://www.jsqmd.com/news/979378/

相关文章:

  • 基于深度学习YOLOv8的安全手套佩戴识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • Element Plus Tree V2虚拟化树形控件,除了展示大数据,还能这样玩?一个Select下拉框的改造实录
  • Linux zone 体系设计:物理内存为什么要分区
  • 企业知识库聊天机器人实战:RAG+轻量模型构建可溯源客服助手
  • 2026年企业记账工具技术实测:快递查询软件/批量查快递软件/收支记账/流水记账/生意记账/记账本/记账软件/随手记账/选择指南 - 优质品牌商家
  • 从YUV到H.265:搞懂这些‘行话’,你才算入了音视频开发的门
  • 北京管道疏通公司怎么选?6月实测5家靠谱推荐 - 品牌推荐
  • Sqribble文档自动化:模板驱动的结构化排版系统解析
  • ChatGPT革命:从自然语言到可执行指令的认知迁移
  • 2025-2026年海参品牌推荐:五大排行榜专业评测家庭滋补性价比高价格 - 品牌推荐
  • 告别串口调试!用Qt+VISA库搞定普源DM3068万用表的TCP/IP自动化采集(附完整代码)
  • 西安黄金回收市场六大品牌服务测评 - 润富黄金回收
  • 时序签名变换:用路径积分提升拐点预测鲁棒性
  • 从数据混乱到清晰:手把手用reshape和repmat函数搞定MATLAB多维数组重塑(避坑指南)
  • 告别GUI依赖:用APDL命令流高效管理你的ANSYS分析项目(含.log文件妙用)
  • 告别零碎资料!手把手教你搞定ASTER L1T数据的预处理全流程(附ENVI实操)
  • 医疗AI为何伤人?从数据偏见到临床断崖的真相
  • 从地图App到算法竞赛:手把手教你用C++实现Dijkstra最短路径(附邻接表避坑指南)
  • 2026年6月央国企求职机构推荐:五大排行专业评测校招防盲目性价比高价格 - 品牌推荐
  • 10分钟精通跨平台翻译神器Pot:解决多语言工作痛点的终极指南
  • 2026年真空泵厂家选购指南:水环真空泵、真空机组、真空泵出口、真空负压泵站厂家选择指南,产能、工艺、品控三维度权威解析 - 海棠依旧大
  • 拆解TriCore的CMPSWAP.W指令:从TC264官方库看多核锁的硬件实现
  • XR处理器性能对比:高通XR2 Gen 2与旗舰SoC解析
  • DeepSeek大模型架构与生产部署深度解析
  • 从Anaconda到VS Code:为地理数据分析打造无缝的GDAL+Pandas+Jupyter开发环境(Windows版)
  • 2026年操作台厂家选购参考指南:工业操作台、实验室操作台、不锈钢操作台、控制系统操作设备优质厂商汇总 - 海棠依旧大
  • 告别Python依赖:将PaddleSeg人像分割模型转为ONNX,用纯C++实现高性能推理(实测FPS对比)
  • 韩国留学机构挑选指南,京韩留学靠谱推荐 - 品牌推荐
  • 从L1A到L1T:ASTER数据产品升级史与L1T的‘精确地形校正’到底强在哪?
  • 李克特量表建模新范式:用泊松与负二项替代有序Logistic