自动售货机串口投币 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 闪烁提示的场景。

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image9.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image8.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image6.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image4.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image3.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image1.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image2.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image5.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image10.png

自动售货机串口投币 FPGA 设计 Verilog Vivado 设计文档图片 image7.png

部分代码

以下展示顶层模块 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

代码文件(付费下载)

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

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

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