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

用Quartus和Modelsim手把手教你:一个FPGA自动售货机的完整状态机设计(附Verilog代码)

从零构建FPGA自动售货机状态机设计与Verilog实战指南1. 项目概述与设计思路想象一下你正站在一台自动售货机前准备购买一瓶饮料。这个看似简单的交互过程背后隐藏着一套精密的状态控制系统。今天我们将用FPGA和Verilog HDL来重现这一机制打造一个数字化的自动售货机核心逻辑。这个项目特别适合已经掌握Verilog基础语法想要通过完整项目提升实战能力的学习者。我们将采用**有限状态机(FSM)**作为核心架构这是数字逻辑设计中最经典的模式之一。整个系统将包含五个主要状态IDLE待机状态显示商品价格PICK商品选择状态BUY投币计算状态ZL找零状态CH出货完成状态为了增强实用性我们还实现了以下功能细节数码管动态显示商品价格、投币金额、找零信息LED流水灯出货指示按键消抖处理实际工程中需额外模块状态超时自动复位机制2. 开发环境准备2.1 软件工具安装开始前请确保已安装以下开发工具Quartus Prime Lite EditionIntel官方FPGA开发套件ModelSim-Intel FPGA Starter Edition仿真验证工具文本编辑器VS Code推荐或其它支持Verilog的编辑器提示所有工具均可从Intel官网免费下载安装时注意勾选器件支持包如Cyclone IV系列2.2 新建Quartus工程启动Quartus选择File → New Project Wizard设置工程路径和名称如vending_machine选择目标器件型号示例使用EP4CE6E22C8添加新Verilog文件File → New → Verilog HDL File// 工程顶层模块框架 module vending_machine( input clk, // 50MHz时钟 input rst_n, // 低电平复位 input [2:0] key, // 按键输入 output [5:0] seg_sel, // 数码管位选 output [7:0] seg_data, // 数码管段选 output [3:0] led // 状态指示灯 ); // 主逻辑将在这里实现 endmodule3. 状态机详细设计与实现3.1 状态编码与转换逻辑我们采用独热码One-Hot编码方式定义五个状态这种方式在FPGA中实现效率较高localparam IDLE 5b00001, PICK 5b00010, BUY 5b00100, ZL 5b01000, CH 5b10000; reg [4:0] current_state, next_state;状态转换由以下条件触发当前状态转换条件下一状态IDLE按下选择键(key[0])PICKPICK按下确认键(key[0])BUYBUY投币金额≥商品金额ZLBUY投币金额商品金额CHZL找零显示超时(2秒)CHCH出货完成超时(2秒)IDLE3.2 核心状态机实现状态机的Verilog实现采用经典的三段式写法// 第一段状态寄存器 always (posedge clk or negedge rst_n) begin if(!rst_n) current_state IDLE; else current_state next_state; end // 第二段状态转移逻辑 always (*) begin case(current_state) IDLE: next_state key[0] ? PICK : IDLE; PICK: next_state key[0] ? BUY : PICK; BUY: next_state (pay_sum total) ? ZL : ((pay_sum total) ? CH : BUY); ZL: next_state (timer_2s) ? CH : ZL; CH: next_state (timer_2s) ? IDLE : CH; default: next_state IDLE; endcase end // 第三段状态输出逻辑 always (posedge clk) begin case(current_state) IDLE: begin seg_data {A_price, B_price, C_price}; led 4b0000; end // 其他状态输出... endcase end4. 关键功能模块实现4.1 商品选择逻辑在PICK状态下用户可以通过按键选择商品和数量reg [1:0] item_select; // 当前选择商品 reg [3:0] item_count; // 选择数量 always (posedge clk or negedge rst_n) begin if(!rst_n) begin item_select 2b00; item_count 4d1; end else if(current_state PICK) begin if(key[1]) // 切换商品 item_select item_select 1; if(key[2]) // 增加数量 item_count (item_count 9) ? 1 : item_count 1; end end4.2 投币与金额计算投币系统支持两种面额1元和5元并实时计算总额reg [7:0] pay_sum; // 已投币金额 wire [7:0] total; // 商品总价 wire [7:0] change; // 找零金额 // 商品价格定义 parameter A_PRICE 3, B_PRICE 5, C_PRICE 1; // 总价计算 assign total (item_select 2b00) ? A_PRICE * item_count : (item_select 2b01) ? B_PRICE * item_count : C_PRICE * item_count; // 投币处理 always (posedge clk or negedge rst_n) begin if(!rst_n) pay_sum 8d0; else if(current_state BUY) begin if(key[1]) pay_sum pay_sum 1; // 投1元 if(key[2]) pay_sum pay_sum 5; // 投5元 end else if(current_state IDLE) pay_sum 8d0; end // 找零计算 assign change pay_sum - total;5. 显示与用户反馈设计5.1 数码管动态显示数码管需要显示不同状态下的信息reg [23:0] seg_data; // 6位数码管数据 always (*) begin case(current_state) IDLE: seg_data {8hA3, 8hB5, 8hC1}; // 显示A3 B5 C1 PICK: seg_data {8hA0item_select, 8h00, item_count}; BUY: seg_data {total/10, total%10, pay_sum/10, pay_sum%10}; ZL: seg_data {8hFF, 8hFF, change/10, change%10}; CH: seg_data {8hFF, 8hFF, 8hFF, 8hFF}; // 全亮 endcase end5.2 LED出货指示出货时通过LED流水灯效果增强交互体验reg [3:0] led; reg [24:0] led_timer; always (posedge clk or negedge rst_n) begin if(!rst_n) begin led 4b0000; led_timer 0; end else if(current_state CH) begin if(led_timer 25_000_000) begin // 0.5秒间隔 led_timer 0; led {led[2:0], led[3]}; // 循环左移 end else led_timer led_timer 1; end else led 4b0000; end6. 仿真验证与调试技巧6.1 测试平台搭建使用ModelSim进行功能仿真timescale 1ns/1ps module tb_vending_machine(); reg clk, rst_n; reg [2:0] key; wire [5:0] seg_sel; wire [7:0] seg_data; wire [3:0] led; // 实例化被测模块 vending_machine uut( .clk(clk), .rst_n(rst_n), .key(key), .seg_sel(seg_sel), .seg_data(seg_data), .led(led) ); // 时钟生成50MHz always #10 clk ~clk; initial begin // 初始化 clk 0; rst_n 0; key 0; #100 rst_n 1; // 测试场景1购买1件A商品 #100 key[0] 1; #20 key[0] 0; // 进入选择状态 #100 key[2] 1; #20 key[2] 0; // 选择数量1 #100 key[0] 1; #20 key[0] 0; // 确认选择 #100 key[1] 1; #20 key[1] 0; // 投1元 #100 key[1] 1; #20 key[1] 0; // 投1元 #100 key[1] 1; #20 key[1] 0; // 投1元共3元 // 等待状态机完成流程 #2000; $stop; end endmodule6.2 常见问题排查在实际开发中可能会遇到以下典型问题状态机卡死检查所有状态转换条件是否完备确保没有形成不可跳出的状态循环添加超时复位机制作为容错显示异常验证数码管扫描频率建议1kHz左右检查段码和位选信号的同步性确认消隐处理避免鬼影按键抖动实际硬件需添加消抖模块软件或硬件采样间隔建议10-20ms采用状态机实现可靠的边沿检测// 简易按键消抖示例 reg [19:0] debounce_cnt; reg key_stable; always (posedge clk) begin if(key ! key_stable) debounce_cnt 0; else if(debounce_cnt 1_000_000) // 20ms50MHz debounce_cnt debounce_cnt 1; else key_stable key; end7. 项目优化与扩展方向完成基础功能后可以考虑以下增强功能多商品支持扩展状态机处理更多商品类型增加库存管理逻辑支付方式扩展集成NFC/RFID模块添加二维码支付接口网络监控通过UART上传销售数据实现远程库存预警用户界面增强添加LCD显示屏设计更丰富的交互动画实际部署时建议将状态机控制模块与底层硬件驱动如数码管扫描、按键检测分离采用层次化设计提高代码可维护性。例如顶层架构 ├── 状态机控制器FSM ├── 显示驱动模块 │ ├── 数码管扫描 │ └── LED控制 ├── 输入处理模块 │ ├── 按键消抖 │ └── 边沿检测 └── 外设接口模块 ├── UART通信 └── 支付接口

相关文章:

用Quartus和Modelsim手把手教你:一个FPGA自动售货机的完整状态机设计(附Verilog代码)

从零构建FPGA自动售货机:状态机设计与Verilog实战指南 1. 项目概述与设计思路 想象一下,你正站在一台自动售货机前,准备购买一瓶饮料。这个看似简单的交互过程背后,隐藏着一套精密的状态控制系统。今天,我们将用FPGA和…...

Qwen3多模态进阶:结合图像描述生成更具上下文感的视频字幕

Qwen3多模态进阶:结合图像描述生成更具上下文感的视频字幕 不知道你有没有过这样的体验:看视频时,字幕只是机械地复述着台词,而画面里那些关键的动作、表情、场景变化,字幕却只字不提。比如,主角激动地举起…...

Android虚拟定位终极指南:FakeLocation如何解决你的位置隐私痛点

Android虚拟定位终极指南:FakeLocation如何解决你的位置隐私痛点 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否曾因应用强制获取位置权限而感到不安&#xff…...

AI小白入门指南:30天掌握核心技能

学习人工智能(AI)是一个循序渐进的过程,尤其对新人小白来说,建议按照以下步骤逐步深入: 1. 打好基础 数学基础: AI的核心依赖数学知识,重点掌握: 线性代数:矩阵运算&…...

PyQt6开发教程(四):布局管理

案例:利用QtDesigner设计如下布局,如图1所示。图1一,布局管理分析布局即控件摆放的方式,如图2所示,在Qt Designer左侧的“布局”栏中可以看到有4种布局方式:“Vertical Layout(垂直布局&#xf…...

Poppler for Windows:让PDF处理变得简单的终极指南

Poppler for Windows:让PDF处理变得简单的终极指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上的PDF处理工具烦恼吗…...

从Java到Vue:一名全栈开发者的面试实录

从Java到Vue:一名全栈开发者的面试实录 面试官:你好,我是这次的面试官。请简单介绍一下你自己。 应聘者:你好,我叫林浩,25岁,毕业于上海交通大学计算机科学与技术专业,硕士学历。工作…...

学Simulink——基于Simulink的开关电容变换器电压均衡控制

目录 手把手教你学Simulink——基于Simulink的开关电容变换器电压均衡控制​ 摘要​ 一、背景与挑战​ 1.1 为什么需要主动电压均衡?​ 1.2 开关电容变换器(SCC):能量的“摆渡车”​ 1.3 破局之道:闭环电压均衡控制​ 二、系统架构与核心控制推导​ 2.1 整体架构:…...

CefFlashBrowser:2024年Flash内容终极解决方案,让经典游戏和课件重获新生

CefFlashBrowser:2024年Flash内容终极解决方案,让经典游戏和课件重获新生 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 在2024年的今天,你是否还在为…...

Phi-4-mini-reasoning GPU利用率提升:vLLM动态批处理与显存复用实测

Phi-4-mini-reasoning GPU利用率提升:vLLM动态批处理与显存复用实测 1. 模型简介与部署验证 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据,并进一步微调以提高更高级的数学推理能力。该模型…...

学Simulink——基于Simulink的开关电容变换器电压均衡控制​

目录 手把手教你学Simulink——基于Simulink的开关电容变换器电压均衡控制​ 摘要​ 一、背景与挑战​ 1.1 为什么需要主动电压均衡?​ 1.2 开关电容变换器(SCC):能量的“摆渡车”​ 1.3 破局之道:闭环电压均衡控制​ 二、系统架构与核心控制推导​ 2.1 整体架构:…...

专业的装修门窗避坑服务商

装修时,门窗是影响居住体验的关键一环。选错了,不仅隔音差、漏风漏水,后期维修更是麻烦不断。面对市场上琳琅满目的品牌和五花八门的宣传,普通消费者该如何辨别,找到真正专业、省心的服务商?今天&#xff0…...

C# StreamReader/StreamWriter实战:5个真实场景下的高效文本处理技巧

C# StreamReader/StreamWriter实战:5个真实场景下的高效文本处理技巧 在数据处理的世界里,文本文件就像数字时代的纸张,承载着从配置信息到海量日志的各种关键数据。作为C#开发者,我们每天都要与这些文本文件打交道,而…...

钧瓷信用值——重构钧瓷产业信用新秩序

大禹智库 第 26期〔总第529期〕2026-4-16 钧瓷信用值模型 重构钧瓷产业信用新秩序 (钧瓷信用值模型专题二) 一、降低钧瓷产业信任成本,吸引外部资源 外地客商、跨界资本与外部合作者,可直接依据钧瓷信用分数作出决策,不…...

如何利用AI投喂进行企业推广?

引言在当今数字化时代,AI 技术正深刻改变着企业的营销格局。随着用户决策习惯逐渐向 AI 大模型转移,传统的营销方式如 SEO 效果衰减,企业急需新的推广途径。AI 投喂作为一种新兴的营销手段,为企业提供了在 AI 搜索结果中优先展现品…...

JS函数反人类left,Right,Mid代替slice-取左,取右,取中间

写一套完全仿 VB、不用写 0、支持正负的极简函数,一次性满足:function Left(str, n) {return n > 0 ? str.slice(0, n) : str.slice(0, n) }function Right(str, n) {return str.slice(-n) }function Mid(str, start, len) {return len void 0 ? s…...

VSCODE如何调试JS代码,HTM页面

最新版 ≠ 最好用、最稳!VS Code 1.116 内置的 Edge/Chrome 调试,断点照样 2 秒自动飞! 为什么最新版还这样? 微软每周一更(现在节奏极快)新版只加 AI(Copilot 内置)、智能体前端网…...

方波家长控制:治服假期“神兽”上网时间的神器​

假期神兽归。电脑玩得没节制。禁网、关机太粗暴。方波来治服。为啥用它?方波家长控制软件。专治无节制上网。定时定点锁电脑。比禁网人性化。比闹钟管用。核心功能1. 时间段设置:精确到分勾选星期几可用。设开始结束时间。一键加工作日/周末。界面像课程…...

Wan2.2-I2V-A14B效果对比:不同--num_inference_steps对质量影响

Wan2.2-I2V-A14B效果对比:不同--num_inference_steps对质量影响 1. 引言 视频生成技术正在改变内容创作的方式。Wan2.2-I2V-A14B作为一款先进的文生视频模型,能够将文字描述转化为高质量的视频内容。在实际使用中,我们发现--num_inference_…...

怎样使用HsMod插件:55项炉石传说功能全面解锁与高效安装方案

怎样使用HsMod插件:55项炉石传说功能全面解锁与高效安装方案 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说多功能插件,提供…...

FRCRN语音降噪工具效果惊艳:远场拾音(3米外)语音增强真实案例

FRCRN语音降噪工具效果惊艳:远场拾音(3米外)语音增强真实案例 1. 远场语音降噪的挑战与突破 你有没有遇到过这样的场景:在宽敞的会议室里开会,手机放在桌子中央录音,结果回放时发现自己的声音被环境噪音淹…...

空洞骑士模组安装终极指南:Scarab管理器一键搞定

空洞骑士模组安装终极指南:Scarab管理器一键搞定 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否曾经为《空洞骑士》模组安装的繁琐步骤感到头疼&#xff1f…...

3秒克隆你的声音:Qwen3-TTS在VMware虚拟机中的部署与应用

3秒克隆你的声音:Qwen3-TTS在VMware虚拟机中的部署与应用 1. 为什么选择Qwen3-TTS进行语音克隆 语音合成技术近年来取得了突破性进展,而Qwen3-TTS-12Hz-1.7B-Base模型以其出色的语音克隆能力脱颖而出。这个开源模型能够在短短3秒内学习并复刻一个人的声…...

知识图谱 04:知识表示模型

继续沿用前面的任务。我们要做一个科技史知识服务系统,并希望它能回答:詹姆斯瓦特(James Watt)是谁?James Watt 与蒸汽机(steam engine)是什么关系?James Watt 属于哪一类人物&#…...

从 0 搭建现代前端组件库:2026年完整实战指南

前言 很多前端工程师用过 Element Plus、Ant Design,但自己动手搭建组件库时却无从下手。本文从零开始,带你搭建一个生产级组件库,包含设计系统、工程化、文档、发布全流程。 正文 一、组件库架构设计 1.1 整体架构 my-ui/ ├── packages/ …...

跨平台部署方案:DamoFD-0.5G在Windows/Linux/macOS的对比测试

跨平台部署方案:DamoFD-0.5G在Windows/Linux/macOS的对比测试 1. 引言 人脸检测技术在日常应用中越来越普及,从手机相册的自动分类到安防监控的实时分析,都离不开高效准确的检测模型。DamoFD-0.5G作为达摩院推出的轻量级人脸检测器&#xf…...

智慧树自动刷课插件:3分钟实现无人值守学习的完整指南

智慧树自动刷课插件:3分钟实现无人值守学习的完整指南 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台的繁琐操作而烦恼吗?智慧…...

当ComfyUI遇上昇腾NPU:一份针对Atlas 300I Duo的深度环境配置与疑难杂症排查指南

Atlas 300I Duo与ComfyUI深度整合实战:从硬件部署到AI创作全流程解析 在AI创作工具井喷式发展的当下,昇腾NPU与ComfyUI的结合为创作者提供了全新的硬件加速方案。不同于常规的GPU配置指南,本文将深入探讨Atlas 300I Duo推理卡在Ubuntu环境下的…...

Pixel Script Temple保姆级教程:Chrome插件模式接入现有写作工具链方案

Pixel Script Temple保姆级教程:Chrome插件模式接入现有写作工具链方案 1. 工具介绍与价值 Pixel Script Temple是一款专为剧本创作者设计的AI辅助工具,基于Qwen2.5-14B-Instruct大模型深度优化。它最大的特点是融合了复古像素风格界面与专业剧本创作功…...

全境封锁2 d3dx11_43.dll 丢失 一键修复:手把手教程与工具推荐

刚准备好装备准备刷全境封锁2的传奇本,结果游戏一启动就提示“丢失d3dx11_43.dll”,反复重试还是进不去。遇到这种情况,第一反应千万别是重装游戏——几十G的下载量太费时间了。这个dll文件其实是DirectX 11的组件,简单来说&#…...