Verilog 实现状态机自动售卖机

Verilog 实现状态机自动售卖机

教学视频:https://www.bilibili.com/video/BV1Ve411x75W?p=33&spm_id_from=pageDriver&vd_source=19ae31dff4056e52d2729a4ca212602b

功能需求

使用1元、2元、5元面值的纸币进行支付,获取6元的物品,不设找零

  • 输入:1元,2元,5元
  • 判定条件:>=6元
  • 输出:可以交货(输入额满足判断条件)

代码思路:使用状态机进行逻辑设计(详细教学可以看最上面的链接)

module vlg_design(input 		clk			,input 		rst_n		,input 		one_yuan	,input		two_yuan	,input 		five_yuan	,output 	reg done
);//变量声明
localparam 	IDLE	=4'd0 ,IN_1 	=4'd1 ,IN_2 	=4'd2 ,IN_3 	=4'd3 ,IN_4 	=4'd4 ,IN_5 	=4'd5 ,IN_6 	=4'd6 ,DONE 	=4'd7 ;localparam	MONEY_PAY = 4'd6;reg [3:0] cstate,nstate;
reg [3:0] money_sum;//时序逻辑,锁存状态
always @(posedge clk or negedge rst_n) beginif(!rst_n)cstate <= IDLE;elsecstate <= nstate;
end//组合逻辑实现状态变迁
always @(*) begincase(cstate)IDLE : beginif(one_yuan||two_yuan||five_yuan)nstate = IN_1;elsenstate = IDLE;endIN_1 : beginif(one_yuan||two_yuan||five_yuan)nstate = IN_2;elsenstate = IN_1;end		IN_2 : beginif(money_sum >= MONEY_PAY)nstate = DONE;else if(one_yuan||two_yuan||five_yuan)nstate = IN_3;elsenstate = IN_2;end	IN_3 : beginif(money_sum >= MONEY_PAY)nstate = DONE;else if(one_yuan||two_yuan||five_yuan)nstate = IN_4;elsenstate = IN_3;end	IN_4 : beginif(money_sum >= MONEY_PAY)nstate = DONE;else if(one_yuan||two_yuan||five_yuan)nstate = IN_5;elsenstate = IN_4;end	IN_5 : beginif(money_sum >= MONEY_PAY)nstate = DONE;else if(one_yuan||two_yuan||five_yuan)nstate = IN_6;elsenstate = IN_5;end	IN_6 : beginif(money_sum >= MONEY_PAY)nstate = DONE;else if(one_yuan||two_yuan||five_yuan)nstate = DONE;elsenstate = IN_6;end	DONE : nstate = IDLE;default : ;endcase
end//当前状态输入钱币的累计计算
always @(posedge clk or negedge rst_n) beginif(!rst_n)money_sum <= 'b0;else begincase(cstate)DONE : money_sum <= 'b0;default : beginif(one_yuan)money_sum <= money_sum + 4'd1;else if(two_yuan)                 money_sum <= money_sum + 4'd2;else if(five_yuan)                money_sum <= money_sum + 4'd5;else ;endendcaseend
end//状态机的输出赋值
always @(posedge clk or negedge rst_n) beginif(!rst_n)done <= 'b0;else if(cstate == DONE)done <= 1'b1;elsedone <= 'b0;
endendmodule

测试文件:

`timescale 1ns/1psmodule tb_top();reg clk;
reg rst_n;
reg one_yuan;
reg two_yuan;
reg five_yuan;wire done;vlg_design u_vlg_design(.clk		(clk),.rst_n		(rst_n),.one_yuan	(one_yuan),.two_yuan	(two_yuan),.five_yuan	(five_yuan),.done       (done)
);//产生时钟
initial clk = 1;
always #10 clk = ~clk;integer i;//测试激励产生
initial beginrst_n = 0;one_yuan	=0 ;two_yuan	=0 ;five_yuan	=0 ;#200;rst_n = 1;for(i=0;i<50;i=i+1)begintask_random_pay();end#5000;endinteger random_data;task task_random_pay;begin #1000;random_data = {$random}%3;@(posedge clk);if(random_data == 0)one_yuan <= 1'd1;else if(random_data == 1)two_yuan <= 1'd1;else if(random_data == 2)five_yuan <= 1'd1;@(posedge clk);one_yuan	<=0 ;two_yuan	<=0 ;five_yuan	<=0 ;end
endtaskalways @(posedge clk) beginif(one_yuan)$display("Pay 1 yuan.");else if(two_yuan)$display("Pay 2 yuan.");else if(five_yuan)$display("Pay 5 yuan.");else if(done)$display("Got you want.\n*********\n");else ;
endendmodule

仿真结果

波形:

在这里插入图片描述

结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/83568.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Jenkins自动打包并部署Tomcat环境

基于上一章创建部署 Linux下Jenkins安装 &#xff08;最新&#xff09;_学习新鲜事物的博客-CSDN博客 传统网站部署的流程 在运维过程中&#xff0c;网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码--&g…

python+django+mysql旅游景点推荐系统-前后端分离(源码+文档)

系统主要采用Python开发技术和MySQL数据库开发技术以及基于OpenCV的图像识别。系统主要包括系统首页、个人中心、用户管理、景点信息管理、景点类型管理、景点门票管理、在线反馈、系统管理等功能&#xff0c;从而实现智能化的旅游景点推荐方式&#xff0c;提高旅游景点推荐的效…

GEE/PIE遥感大数据处理与典型案例

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

Redis笔记——(狂神说)待续

Nosql概述 为什么要用NoSql&#xff1f; 1、单机mysql的年代&#xff1a;90年代&#xff0c;网站访问量小&#xff0c;很多使用静态网页html写的&#xff0c;服务器没压力。 当时瓶颈是&#xff1a;1)数据量太大一个机器放不下。2)数据的索引(BTree)&#xff0c;一个机器内存也…

html动态爱心代码【四】(附源码)

目录 前言 特效 完整代码 总结 前言 情人节马上就要到了&#xff0c;为了帮助大家高效表白&#xff0c;下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐&#xff0c;可用于520&#xff0c;情人节&#xff0c;生日&#xff0c;表白等场景&#xff0c;可直接使用。…

nrm管理源仓库及发布私人npm包

使用nrm管理源及切换源仓库 1.安装nrm源管理器 npm install nrm -g2.查看目前现有的源仓库 通过 nrm ls 查看现有的源 nrm ls 输出&#xff1a;这是目前现有的源 3.切换不同的源 可以通过 nrm use xxx&#xff08;源仓库名&#xff09;来切换不同的源地址 nrm use taobao…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域&#xff0c;测试已经不仅仅是一个简单的步骤&#xff0c;而是确保软件质量的核心环节。Python&#xff0c;作为全球最受欢迎的编程语言之一&#xff0c;拥有丰富的测试框架和工具。而在这其中&#xff0c;pytest无疑是最受欢迎和最具影响力的一个。本文将…

VR法治警示教育:情景式课堂增强教育效果

VR法治警示教育平台是一款基于虚拟现实技术的在线教育平台&#xff0c;旨在通过模拟真实场景和互动体验&#xff0c;向公众普及法律知识&#xff0c;提高公民的法律意识和素养。该平台采用先进的虚拟现实技术&#xff0c;将用户带入一个逼真的仿真环境&#xff0c;让用户身临其…

c++都补了c语言哪些坑?

目录 1.命名空间 1.1 定义 1.2 使用 2.缺省参数 2.1 概念 2.2 分类 3.函数重载 4.引用 4.1 概念 4.2 特性 4.3 常引用 4.4 引用和指针的区别 5.内联函数 1.命名空间 在 C/C 中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将…

Android Studio调试出现错误时,无法定位错误信息解决办法

做项目时运行项目会出现问题&#xff0c;但是找不到具体位置&#xff0c;如下图所示&#xff1a;感觉是不是很懵逼~&#xff0c;Log也没有显示是哪里的问题 解决方案&#xff0c;在右侧导航栏中选择Gradle——app——build&#xff0c;然后点击运行 运行结果如下&#xff0c;很…

vue若依导出word文件,简单的实现

首先前端导包,注意exportDocx的导包位置要修改成你自己的 import {exportDocx} from /utils/docUtil/docutil.js; import {addDays} from date-fns; import {listGongyi} from "/api/system/detail";然后新建一个测试按钮 <el-col :span"1.5"><…

LLM-chatgpt训练过程

流程简介 主要包含模型预训练和指令微调两个阶段 模型预训练&#xff1a;搜集海量的文本数据&#xff0c;无监督的训练自回归decoder&#xff1b; O T P ( O t < T ) O_TP(O_{t<T}) OT​P(Ot<T​)&#xff0c;损失函数CE loss指令微调&#xff1a;在输入文本中加入…