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

FPGA状态机实战:用Verilog实现自动售卖机(附三段式完整代码)

FPGA状态机实战用Verilog实现自动售卖机附三段式完整代码在数字电路设计中状态机是最核心的设计思想之一。它能够将复杂的控制逻辑分解为有限的状态和状态之间的转换使得设计更加清晰、可维护。自动售卖机作为一个经典的控制系统案例非常适合用来展示状态机的设计思路和实现方法。本文将从一个实际项目开发的角度详细介绍如何使用Verilog语言实现一个自动售卖机的控制逻辑。我们会重点讲解三段式状态机的设计方法并提供完整的代码实现。无论你是FPGA初学者还是需要巩固状态机实践的工程师这篇文章都能为你提供实用的参考。1. 状态机基础与自动售卖机需求分析1.1 Moore与Mealy状态机对比在数字电路设计中状态机主要分为两种类型Moore型状态机输出仅与当前状态有关Mealy型状态机输出与当前状态和输入信号都有关两者的主要区别可以通过下表对比特性Moore型Mealy型输出依赖仅当前状态当前状态输入响应速度较慢需完整时钟周期较快输入变化立即响应状态数量通常较多通常较少设计复杂度相对简单相对复杂对于自动售卖机这种需要快速响应用户输入的系统Mealy型状态机通常是更好的选择。1.2 自动售卖机需求规格我们的自动售卖机设计需要满足以下需求饮料单价固定为2元接受0.5元和1元两种硬币需要处理找零逻辑每次只能处理一枚硬币的投入出货和找零完成后才能进入下一轮售卖根据这些需求我们可以定义系统的输入输出信号input clk; // 时钟信号 input rstn; // 复位信号低电平有效 input [1:0] coin; // 硬币输入01表示0.5元10表示1元 output [1:0] change; // 找零输出01表示找0.5元 output sell; // 出货信号2. 状态转移图设计与三段式状态机原理2.1 状态转移图设计在开始编写代码前我们需要先设计状态转移图。对于这个自动售卖机可以定义以下状态IDLE初始状态等待投币GET05已投入0.5元GET10已投入1元GET15已投入1.5元状态转移条件由输入的硬币决定。例如在IDLE状态下投入0.5元会转移到GET05状态投入1元会转移到GET10状态。2.2 三段式状态机结构三段式状态机是Verilog中最推荐的状态机写法它将状态机的实现分为三个部分状态寄存器时序逻辑负责状态转换次态逻辑组合逻辑决定下一个状态输出逻辑时序逻辑产生输出信号这种结构的优势在于清晰分离了时序和组合逻辑易于维护和调试避免了组合逻辑产生的毛刺3. Verilog实现详解3.1 模块定义与状态编码首先定义模块和状态编码module vending_machine ( input clk, input rstn, input [1:0] coin, output [1:0] change, output sell ); // 状态编码 parameter IDLE 3d0; parameter GET05 3d1; parameter GET10 3d2; parameter GET15 3d3; // 内部信号 reg [2:0] st_cur, st_next; // 当前状态和下一状态 reg [1:0] change_r; reg sell_r;3.2 第一段状态寄存器这部分是纯时序逻辑使用非阻塞赋值// 第一段状态寄存器 always (posedge clk or negedge rstn) begin if (!rstn) begin st_cur IDLE; end else begin st_cur st_next; end end3.3 第二段次态逻辑这部分是组合逻辑使用阻塞赋值和case语句// 第二段次态逻辑 always (*) begin st_next st_cur; // 默认保持当前状态 case (st_cur) IDLE: case (coin) 2b01: st_next GET05; 2b10: st_next GET10; default: st_next IDLE; endcase GET05: case (coin) 2b01: st_next GET10; 2b10: st_next GET15; default: st_next GET05; endcase GET10: case (coin) 2b01: st_next GET15; 2b10: st_next IDLE; default: st_next GET10; endcase GET15: if (coin 2b01 || coin 2b10) st_next IDLE; else st_next GET15; default: st_next IDLE; endcase end3.4 第三段输出逻辑这部分也是时序逻辑根据当前状态和输入决定输出// 第三段输出逻辑 always (posedge clk or negedge rstn) begin if (!rstn) begin change_r 2b00; sell_r 1b0; end else begin case (st_cur) IDLE: begin change_r 2b00; sell_r 1b0; end GET05: begin change_r 2b00; sell_r 1b0; end GET10: if (coin 2b10) begin change_r 2b00; sell_r 1b1; end else begin change_r 2b00; sell_r 1b0; end GET15: if (coin 2b01) begin change_r 2b00; sell_r 1b1; end else if (coin 2b10) begin change_r 2b01; sell_r 1b1; end else begin change_r 2b00; sell_r 1b0; end default: begin change_r 2b00; sell_r 1b0; end endcase end end assign change change_r; assign sell sell_r; endmodule4. 测试验证与设计优化4.1 Testbench设计为了验证我们的设计需要编写测试平台模拟各种投币场景timescale 1ns/1ps module tb_vending_machine; reg clk; reg rstn; reg [1:0] coin; wire [1:0] change; wire sell; // 时钟生成 always #5 clk ~clk; // 实例化被测模块 vending_machine uut ( .clk(clk), .rstn(rstn), .coin(coin), .change(change), .sell(sell) ); initial begin // 初始化 clk 0; rstn 0; coin 0; // 复位 #10 rstn 1; // 测试场景10.5 - 0.5 - 0.5 - 0.5 #10 coin 2b01; #10 coin 2b00; #10 coin 2b01; #10 coin 2b00; #10 coin 2b01; #10 coin 2b00; #10 coin 2b01; #10 coin 2b00; // 测试场景21 - 0.5 - 1 (需要找零) #10 coin 2b10; #10 coin 2b00; #10 coin 2b01; #10 coin 2b00; #10 coin 2b10; #10 coin 2b00; // 测试场景30.5 - 1 - 0.5 #10 coin 2b01; #10 coin 2b00; #10 coin 2b10; #10 coin 2b00; #10 coin 2b01; #10 coin 2b00; // 结束仿真 #100 $finish; end endmodule4.2 常见问题与优化建议在实际项目中状态机设计可能会遇到以下问题状态编码选择二进制编码节省触发器但状态译码复杂独热码每个状态用一位表示译码简单但占用资源多格雷码状态转换时只有一位变化减少毛刺输出毛刺处理尽量使用时序逻辑产生输出对异步输入进行同步处理添加输出使能信号控制输出时机状态机规模控制当状态过多时考虑分级状态机使用参数化设计方便状态扩展添加默认状态处理意外情况提示在实际工程中建议为状态机添加超时处理逻辑防止系统因意外输入而进入死锁状态。

相关文章:

FPGA状态机实战:用Verilog实现自动售卖机(附三段式完整代码)

FPGA状态机实战:用Verilog实现自动售卖机(附三段式完整代码) 在数字电路设计中,状态机是最核心的设计思想之一。它能够将复杂的控制逻辑分解为有限的状态和状态之间的转换,使得设计更加清晰、可维护。自动售卖机作为一…...

Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案

Minecraft世界修复全攻略:从数据损坏到完整恢复的专业解决方案 【免费下载链接】Minecraft-Region-Fixer Python script to fix some of the problems of the Minecraft save files (region files, *.mca). 项目地址: https://gitcode.com/gh_mirrors/mi/Minecraf…...

Anything V5图像生成效果实测:高清画质与丰富风格展示

Anything V5图像生成效果实测:高清画质与丰富风格展示 1. 引言:惊艳的二次元创作体验 1.1 模型核心能力概述 Anything V5作为Stable Diffusion生态中的明星模型,专为动漫风格图像生成优化。经过大规模高质量二次元数据训练,它能…...

新手福音:通过快马平台生成带注释的nap自动化运维脚本快速入门

作为一个刚接触网络自动化运维的新手,第一次看到"深圳网络自动化运维nap"这个概念时,整个人都是懵的。各种专业术语、复杂的协议和库让我望而却步,直到发现了InsCode(快马)平台,才真正找到了入门的好方法。 为什么选择n…...

Pixel Fashion Atelier实战教程:如何导出带元数据的PNG并适配Unity像素精灵管线

Pixel Fashion Atelier实战教程:如何导出带元数据的PNG并适配Unity像素精灵管线 1. 教程概述 Pixel Fashion Atelier作为一款专为像素艺术设计的AI生成工具,其输出结果需要经过特殊处理才能完美适配Unity的像素精灵管线。本教程将手把手教你如何导出带…...

Windows 11下保姆级安装Isaac Sim 4.5.0与Isaac Lab避坑全记录(含CUDA 12.8配置)

Windows 11下Isaac Sim 4.5.0与Isaac Lab全流程部署指南(RTX 4090实测版) 对于机器人仿真和AI开发领域的从业者来说,NVIDIA Isaac Sim和Isaac Lab无疑是当前最强大的工具组合之一。然而,当我在自己的RTX 4090显卡上首次尝试部署这…...

2003-2024年上市公司政府补助数据+stata代码

政府补助数据2003-2024 范围:2003 - 2024年,全部A股上市公司 原始数据来源于国泰安,有计算代码和原始数据,可复现出计算结果 政府补贴,政府补助,政府津贴,2024数据全 计算结果:d…...

[特殊字符] Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程

Meixiong Niannian画图引擎应用场景:独立音乐人专辑封面AI生成流程 1. 项目简介 Meixiong Niannian画图引擎是一款专为个人GPU设计的轻量化文本生成图像系统,基于Z-Image-Turbo底座和meixiong Niannian Turbo LoRA技术构建。这个引擎针对通用画图场景进…...

RWKV7-1.5B-g1a镜像部署教程:CSDN平台一键拉起Web服务,7860端口直连体验

RWKV7-1.5B-g1a镜像部署教程:CSDN平台一键拉起Web服务,7860端口直连体验 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型,特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时&#x…...

移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧)

移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧) 在移动端视频播放场景中,屏幕比例适配一直是开发者面临的棘手问题。传统全屏模式在处理非常规比例视频(如竖屏9:16内容)时往往表…...

Llama-3.2V-11B-cot高效部署:双卡4090下11B模型加载时间缩短至92s

Llama-3.2V-11B-cot高效部署:双卡4090下11B模型加载时间缩短至92s 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具。该工具针对双卡RTX 4090环境进行了深度优化,通过一系列技术创新将11B大模型的加…...

SMUDebugTool:16核心独立调节与实时硬件监控的锐龙平台性能优化工具

SMUDebugTool:16核心独立调节与实时硬件监控的锐龙平台性能优化工具 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

告别Redis?在CentOS 7上快速体验国产TongRDS 2.2.x(附与SpringBoot整合对比)

国产内存数据库TongRDS技术评估与SpringBoot整合实战 在技术架构选型的关键时刻,国产基础软件的成熟度与性能表现成为越来越多企业关注的焦点。作为Redis的潜在替代方案,TongRDS凭借其纯Java架构和与Redis协议的高度兼容性,正在技术社区引发热…...

ExcelJS 实战手册:从零构建企业级Excel报表系统

1. ExcelJS入门:为什么选择它构建企业报表? 第一次接触ExcelJS时,我正为一个电商项目头疼——每天要生成近万条订单数据的报表。尝试过直接输出CSV,但客户坚持要带格式的Excel文件;用PHPExcel处理又遇到内存溢出。直到…...

实战指南:基于OpenSpec规范,使用快马平台生成可直接集成的微服务客户端代码

今天在微服务开发中遇到一个典型需求:我们的支付网关服务已经用OpenAPI 3.0规范定义好了接口,现在需要在另一个Java服务中调用这些接口。传统做法要手动写HTTP客户端代码,既耗时又容易出错。最近发现InsCode(快马)平台能基于OpenSpec文档自动…...

人血小板裂解液(hPL)与细胞治疗生产工具解析:Sexton产品应用综述【曼博生物官方代理Sexton】

摘要:人血小板裂解液(hPL)作为无动物源培养补充剂,正在逐步替代FBS应用于细胞与基因治疗(CGT)领域。本文结合相关产品体系,对hPL及细胞冻存与灌装系统进行系统梳理。 关键词:人血小板…...

Biolaminin 层粘连蛋白(LN521)在干细胞培养中的作用与应用解析【曼博生物官方代理BioLamina】

摘要:人类重组层粘连蛋白(Laminin),尤其是LN521亚型,在多能干细胞培养中具有重要作用。本文从细胞微环境、培养体系及应用场景角度,对其在干细胞研究与转化中的价值进行系统梳理。 关键词:LN521…...

PEI转染试剂及相关工具在生命科学研究中的应用解析【曼博生物官方代理Polysciences】

摘要:聚乙烯亚胺(PEI)转染试剂在基因递送、病毒载体生产等领域应用广泛。本文结合Polysciences相关产品体系,对PEI转染、微球技术及神经示踪染料等工具进行系统梳理。 关键词:PEI转染、聚乙烯亚胺、基因转染、HEK293、…...

从零到一:Vision Pro工业视觉软件安装与配置实战指南

1. Vision Pro工业视觉软件入门指南 第一次接触Vision Pro的朋友可能会被这个强大的工业视觉软件震撼到。作为康耐视的拳头产品,它在汽车制造、电子检测、包装印刷等行业应用广泛。我刚开始用的时候也是一头雾水,但跟着正确的步骤走,其实安装…...

抖音视频批量下载神器:3分钟搞定复杂内容管理的终极方案

抖音视频批量下载神器:3分钟搞定复杂内容管理的终极方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 抖音作为全球最受欢迎的短视频平台,每天产生海量的精彩内容。然而&#xff0c…...

Redis管理效率革命:AnotherRedisDesktopManager实战指南

Redis管理效率革命:AnotherRedisDesktopManager实战指南 【免费下载链接】AnotherRedisDesktopManager qishibo/AnotherRedisDesktopManager: Another Redis Desktop Manager 是一款跨平台的Redis桌面管理工具,提供图形用户界面,支持连接到Re…...

5个技巧让Markdown Viewer成为你的浏览器文档中心

5个技巧让Markdown Viewer成为你的浏览器文档中心 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为浏览器无法直接预览Markdown文档而烦恼吗?Markdown Viewer浏览…...

如何突破数据标注瓶颈?Label Studio全攻略:从多模态标注到AI协作

如何突破数据标注瓶颈?Label Studio全攻略:从多模态标注到AI协作 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/l…...

PVB于EVA胶片的区别

PVB于EVA胶片的区别实例:PVB用于封装“双玻璃光伏组件”:玻璃+PVB+电池片+PVB+玻璃,PVB胶片已取代EVA胶片。为什么用PVB,不像我们现在一样用EVA?因为: 在玻璃…...

OpenClaw+GLM-4.7-Flash极客玩法:浏览器自动化与RPA任务融合

OpenClawGLM-4.7-Flash极客玩法:浏览器自动化与RPA任务融合 1. 当OpenClaw遇见GLM-4.7-Flash 去年冬天的一个深夜,我正为重复性的网页数据抓取任务头疼不已。Selenium脚本频繁因页面结构变化而崩溃,每次都需要人工介入调整。直到发现OpenCl…...

告别定位漂移:用Python手把手实现GNSS载波相位平滑伪距(附代码)

告别定位漂移:用Python手把手实现GNSS载波相位平滑伪距(附代码) 在无人机自主飞行或自动驾驶小车导航时,你是否遇到过这样的困扰:明明设备静止不动,地图上的定位点却像喝醉酒一样左右摇摆?这种&…...

图表数据提取的智能转换革命:从像素到数据点的精准跨越

图表数据提取的智能转换革命:从像素到数据点的精准跨越 【免费下载链接】WebPlotDigitizer WebPlotDigitizer: 一个基于 Web 的工具,用于从图形图像中提取数值数据,支持 XY、极地、三角图和地图。 项目地址: https://gitcode.com/gh_mirror…...

实战教学应用:基于快马平台开发生物繁殖课互动学习与测评系统

作为一名生物老师,我一直在寻找能够让学生更直观理解繁殖知识的教学工具。最近尝试用InsCode(快马)平台开发了一个互动学习系统,效果出乎意料的好。这个平台最棒的地方是,不需要复杂的服务器配置,就能把想法快速变成可实际使用的教…...

OpenClaw沙盒体验:不装本地环境玩转GLM-4.7-Flash

OpenClaw沙盒体验:不装本地环境玩转GLM-4.7-Flash 1. 为什么选择沙盒体验? 作为一个长期关注AI自动化工具的技术爱好者,我一直在寻找一个既能快速验证想法又不会污染本地开发环境的方式。OpenClaw的本地部署虽然强大,但配置过程…...

FigmaCN:5分钟快速实现Figma中文界面的终极解决方案

FigmaCN:5分钟快速实现Figma中文界面的终极解决方案 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma英文界面而烦恼吗?figmaCN是一款专为中文用户打造…...