12.21自动售货机,单物品,多物品

自动售货机 

if朴素方法

 一种思路是用寄存器cnt记录已有的最小单位货币量,这里就是0.5

当d1时,cnt+1;d2时,cnt+2;d3时,cnt+4;

`timescale 1ns/1ns
module seller1(input wire clk  ,input wire rst  ,input wire d1 ,input wire d2 ,input wire d3 ,output reg out1,output reg [1:0]out2
);
reg[2:0]cnt;
always@(posedge clk,negedge rst)beginif(!rst)begincnt<=0;out1<=0;out2<=0;endelse beginif(d1)cnt<=cnt+1;else if(d2)cnt<=cnt+2;else if(d3)cnt<=cnt+4;else if(cnt>=3)beginout1<=1;out2<=cnt-3;cnt<=0;//记得复位为0,表示一个过程的结束endelse beginout1<=0;out2<=0;end//这里需要注意一定需要这一步,不然在不复位时,将保持一直输出1的状态end
end
endmodule

这里注意,d1,d2,d3都是以脉冲的形式,即只会接受一个时间步里,检测也都是

`timescale 1ns/1nsmodule seller1(input wire clk  ,input wire rst  ,input wire d1 ,input wire d2 ,input wire d3 ,output reg out1,output reg [1:0]out2
);parameter S0 = 'd0, S1 = 'd1, S2 = 'd2, S3 = 'd3 , S4 = 'd4, S5 = 'd5 , S6 = 'd6;reg  [2:0]	current_state;reg  [2:0]	next_state;wire [2:0]   input_state;//将输入组合起来assign input_state = {d1,d2,d3};always@(posedge clk or negedge rst)beginif(rst == 1'b0)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endend   always@(*)begincase(current_state)S0:begincase(input_state)3'b100:next_state = S1 ;3'b010:next_state = S2 ;3'b001:next_state = S4 ;default:next_state = next_state;endcase	endS1:begincase(input_state)3'b100:next_state = S2 ;3'b010:next_state = S3 ;3'b001:next_state = S5 ;default:next_state = next_state; endcaseendS2:begincase(input_state)3'b100:next_state = S3 ;3'b010:next_state = S4 ;3'b001:next_state = S6 ;default:next_state = next_state;endcase				enddefault:beginnext_state = S0;endendcaseendalways@(posedge clk or negedge rst)beginif(rst == 1'b0)beginout1 <= 1'b0;out2 <= 2'b0;endelse begincase(next_state)S3:		   begin out1 <= 1'b1;out2 <= 2'b0; end S4:		   begin out1 <= 1'b1;out2 <= 2'b1; end S5:		   begin out1 <= 1'b1;out2 <= 2'b10; end S6:		   begin out1 <= 1'b1;out2 <= 2'b11; end default:   begin out1 <= 1'b0;out2 <= 2'b0; end endcase	endendendmodule

状态机方法

采用MOORE状态机,即输出只与状态有关,而与当前输入信号无关

状态机的方式可以支持一次投入多枚硬币

MOORE三段

第一段:信号声明,状态定义,状态转换

第二段:由现态,依据输入信号确定次态

这里可以看出,如果一次投入多个硬币,可以进行转移与判断,只需在case里增添判断即可

第三段:依据次态确定输出信号

自动售货机(支持多物品售卖)

sel为0时买一块五,即第四个状态,s3;为1时买两块五,为第六个状态,s5

状态机

`timescale 1ns/1nsmodule seller2(input wire clk  ,input wire rst  ,input wire d1 ,input wire d2 ,input wire sel ,output reg out1,output reg out2,output reg out3
);
//*************code***********//parameter S0=0, S0_5=1, S1=2, S1_5=3, S2=4, S2_5=5, S3=6;reg[2:0] state, nstate;always@(posedge clk or negedge rst) beginif(~rst)state <= 0;elsestate <= nstate;endalways@(*) begincase(state)S0     : nstate = d1? S0_5:d2? S1:nstate;S0_5   : nstate = d1? S1:d2? S1_5:nstate;S1     : nstate = d1? S1_5:d2? S2:nstate;S1_5   : nstate = ~sel? S0:d1? S2:d2? S2_5:nstate;S2     : nstate = ~sel? S0:d1? S2_5:d2? S3:nstate;default: nstate = S0;endcaseendalways@(*) beginif(~rst) begin{out1, out2, out3} = 3'b000;endelse begincase(state)S0, S0_5, S1: {out1, out2, out3} = 0;S1_5        : {out1, out2, out3} = ~sel? 3'b100: 3'b000;S2          : {out1, out2, out3} = ~sel? 3'b101: 3'b000;S2_5        : {out1, out2, out3} = ~sel? 3'b101: 3'b010;S3          : {out1, out2, out3} = ~sel? 3'b101: 3'b011;default     : {out1, out2, out3} = 3'b000;endcaseendend
//*************code***********//
endmodule

上面为mealy型状态机,即输出取决于现态与输入信号 

`timescale 1ns/1nsmodule seller2(input wire clk  ,input wire rst  ,input wire d1 ,input wire d2 ,input wire sel ,output reg out1,output reg out2,output reg out3
);parameter S0 = 'd0, S1 = 'd1, S2 = 'd2, S3 = 'd3 , S4 = 'd4, S5 = 'd5, S6 = 'd6;reg [2:0]	current_state;reg [2:0]	next_state;wire [1:0]  input_state;assign input_state = {d1,d2};always@(posedge clk or negedge rst)beginif(rst == 1'b0)begincurrent_state <= S0;endelse begincurrent_state <= next_state;endend   always@(*)beginif (!sel) begincase(current_state)S0:begincase(input_state)2'b10 :next_state = S1 ;2'b01 :next_state = S2 ;default:next_state = next_state;endcase	endS1:begincase(input_state)2'b10 :next_state = S2 ;2'b01 :next_state = S3 ;default:next_state = next_state;endcase	 endS2:begincase(input_state)2'b10 :next_state = S3 ;2'b01 :next_state = S4 ;default:next_state = next_state;endcase	enddefault:  next_state = S0;  endcaseendelse begincase(current_state)S0:begincase(input_state)2'b10 :next_state = S1 ;2'b01 :next_state = S2 ;default:next_state = next_state;endcase	endS1:begincase(input_state)2'b10 :next_state = S2 ;2'b01 :next_state = S3 ;default:next_state = next_state;endcase	 endS2:begincase(input_state)2'b10 :next_state = S3 ;2'b01 :next_state = S4 ;default:next_state = next_state;endcase	endS3:begincase(input_state)2'b10 :next_state = S4 ;2'b01 :next_state = S5 ;default:next_state = next_state;endcase	endS4:begincase(input_state)2'b10 :next_state = S5 ;2'b01 :next_state = S6 ;default:next_state = next_state;endcase	enddefault:  next_state = S0;  endcaseendendalways@(posedge clk or negedge rst)beginif(rst == 1'b0)beginout1 <= 1'b0;out2 <= 1'b0;out3 <= 1'b0;endelse beginif(!sel)begincase (next_state)S3:		begin out1 <= 1'b1;out2 <= 1'b0;out3 <= 1'b0;end S4:		begin out1 <= 1'b1;out2 <= 1'b0;out3 <= 1'b1;end default:begin out1 <= 1'b0;out2 <= 1'b0;out3 <= 1'b0;end endcaseendelse begincase (next_state)	S5:		begin out1 <= 1'b0;out2 <= 1'b1;out3 <= 1'b0;end 	S6:		begin out1 <= 1'b0;out2 <= 1'b1;out3 <= 1'b1;end 	default:begin out1 <= 1'b0;out2 <= 1'b0;out3 <= 1'b0;end 	endcase	endendendendmodule

上面为标准的MOORE状态机代码,即输出只与次态有关

在状态转换中,一定要记得写

即相当于 后面的复位,不然没办法复位

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

苹果CMS超级播放器专业版无授权全开源,附带安装教程

源码介绍 超级播放器专业版v1.0.8&#xff0c;内置六大主流播放器&#xff0c;支持各种格式的视频播放&#xff0c;支持主要功能在每一个播放器内核中都相同效果。 搭建教程 1.不兼容IE浏览器 2.php版本推荐7.4 支持7.1~7.4 3.框架引入不支持同时引入多个播放器 json对接教…

mfc100u.dll文件丢失了要怎么解决?修复mfc100u.dll详细指南

mfc100u.dll文件丢失了要怎么解决?首先让我们扒一扒什么是 mfc100u.dll。这玩意儿是 Microsoft Visual Studio 2010 的一部分&#xff0c;它就像一款程序生活中不可或缺的零件&#xff0c;没了它&#xff0c;程序肯定跑不起来。想想看&#xff0c;没有一个重要的零件&#xff…

【UE5蓝图】读取本地json文件修改窗口大小

效果 插件 蓝图 1.判断文件存在 2.1文件不存在&#xff0c;生成文件 {"ResolutionX":540, "ResolutionY":960} 2.2文件存在&#xff0c;直接读取 3.设置窗口大小 遇到的坑 1.分辨率太大&#xff0c;导致效果不理想&#xff0c;建议先往小填写。 2.选对…

Java核心知识点1-java和c++区别、隐式和显示类型转换

java和c区别 java通过虚拟机实现跨平台特性&#xff0c;但c依赖于特定的平台。java没有指针&#xff0c;它的引用可以理解为安全指针&#xff0c;而c和c一样具有指针。java支持自动垃圾回收&#xff0c;而c需要手动回收。java不支持多重继承&#xff0c;只能通过实现多个接口来…

TCP/IP的五层网络模型

目录 封装&#xff08;打包快递&#xff09; 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用&#xff08;拆快递&#xff09; 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装&#xff08;打包快递&#xff09; 6.1应用层 此时做的数据…

程序的编译、链接

目录 前言&#xff1a; 前置知识回顾 宏 宏定义常量 宏定义语句 宏定义函数 条件编译 应用场景 编译过程概览 预编译阶段 编译阶段 汇编阶段 链接阶段 前言&#xff1a; 在ANSI C的任何一种实现中&#xff0c;存在两种不同的环境&#xff0c;第1种是翻译环境&#x…

12.30 二叉树中等题

236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客在前几天&#xff0c;我们使用yolov8进行了部署&#xff0c;并在目标检测方向上进行自己数据集的训练与测试&#xff0c;今天我们训练下yolov8的图像分类…

【滑动窗口】C++算法:K 个不同整数的子数组

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 LeetCoe992 K 个不同整数的子数组 给定一个正整数数组 nums和一个整数 k&#xff0c;返回 nums 中 「好子数组」 的数目。 如果 nums 的某个子数组中不同整数的个数恰好为 …

【AI导师】利用Coding Agent完成AIGC编程

利用Coding Agent完成AIGC编程 一、前言二、Coding Agent三、1024code四、AI导师README项目初版功能定义代码结构设计方案函数方法设计方案迭代记录 一、前言 AI产品的发展确实在过去两年年中取得了显著进展&#xff0c;尤其是在编程领域。一开始&#xff0c;ChatGPT和类似的语…

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

阿里后端实习二面

阿里后端实习二面 记录面试题目&#xff0c;希望可以帮助到大家 类加载的流程&#xff1f; 类加载分为三个部分&#xff1a;加载、连接、初始化 加载 类的加载主要的职责为将.class文件的二进制字节流读入内存(JDK1.7及之前为JVM内存&#xff0c;JDK1.8及之后为本地内存)&…

EBU7140 Security and Authentication(一)常见加密算法

前言 主要根据 EBU7140 课程内容整理&#xff0c;比较偏向应试~ Block1&#xff1a;介绍课程&#xff0c;传统加密方式。 Block2&#xff1a;公钥加密的原理和应用。 Block3&#xff1a;一些特定安全协议技术&#xff08;如防火墙 Kerberos身份验证协议等&#xff09;。 B…

【教学类-43-03】20231229 N宫格数独3.0(n=1、2、3、4、6、8、9) (ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a;“我会做这种&#xff01;” 原来他会…

《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识(15)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第1章 PCI总线的基本知识&#xff08;14&#xff09; 1.3 PCI总线的存储器读写总线事务 1.3.4 PCI读写主存储器 前文已提到&#xff0c;由于本节内容较长&#xff0c;因此将后一部分内容放在本文中。 为…

Java多线程技术五——单例模式与多线程

1 概述 本章的知识点非常重要。在单例模式与多线程技术相结合的过程中&#xff0c;我们能发现很多以前从未考虑过的问题。这些不良的程序设计如果应用在商业项目中将会带来非常大的麻烦。本章的案例也充分说明&#xff0c;线程与某些技术相结合中&#xff0c;我们要考虑的事情会…

java注解和反射

java注解和反射 内置注解 Override 重写生命 Deprecated 已过时的方法&#xff0c;不推荐使用&#xff0c;可以使用 SuppressWarning 镇压警告&#xff0c;懂的都懂 元注解 作用&#xff1a;负责注解其他的注解 Target 描述注解的使用范围 Retention 描述注解的生命周期 Docu…

从座舱到跨域融合,老牌汽车零部件厂商如何破局数字化变革

当前&#xff0c;整个汽车供应链正在经历深层次的重构&#xff0c;传统零部件厂商必须加速“自我革新”。 在汽车“新四化”的巨变下&#xff0c;大量传统零部件濒临消失或者减少了需求&#xff0c;传统汽车零部件企业的相关业务开始日益萎缩&#xff0c;生存空间遭受不同程度…

我的128天之创作纪念日

目录 序 机缘 收获 日常 成就 憧憬 序 今天收到CSDN的一条消息推送&#xff0c;“初九之潜龙勿用 &#xff0c;不知不觉今天已经是你成为创作者的 第128天 啦。。。” 是啊&#xff0c;自今年8月24日开始写文章以来&#xff0c;时间过得好快&#xff0c;无论开心、痛苦…

51单片机之LED灯

51单片机之LED灯 &#x1f334;前言&#xff1a;&#x1f3ee;点亮LED灯的原理&#x1f498;点亮你的第一个LED灯&#x1f498;点亮你的八个LED灯 &#x1f4cc;让LED灯闪烁的原理&#x1f3bd; LED灯的闪烁&#x1f3d3;错误示范1&#x1f3d3;正确的LED闪烁代码应该是这样&am…