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.hqwc.cn/news/310213.html

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

相关文章

AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲

【课程简介】 本课程介绍了chatGPT相关模型的具体案例实践&#xff0c;通过实操更好的掌握chatGPT的概念与应用场景&#xff0c;可以作为chatGPT领域学习者的入门到进阶级课程。 【课程时长】 1天&#xff08;6小时/天&#xff09; 【课程对象】 理工科本科及以上&#xff0…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-00x01

如上表所示&#xff0c;MOE0&#xff0c;OSSI0&#xff0c;CCxE0&#xff0c;CCxNE1时&#xff0c;OCx与OCxN的输出状态取决于GPIO端口上下拉状态。 ---------------------------------------------------------------------------------------------------------------------…

ElasticSearch学习笔记(二)

通过前面的一阵胡乱操作&#xff0c;显然提升了我的学习兴趣&#xff0c;趁热打铁&#xff0c;接着往下学。还是先看看别人的教程吧。这里我看的是B站上【尚硅谷】的ElasticSearch教程&#xff0c;有兴趣的同学也可以去看看。 一、缘起–索引操作 看B站上的视频教程&#xff0…

LoongArch指令集-特权指令系统——摘抄自胡伟武体系结构和龙芯架构32位精简版参考手册

例外与中断 1 中断 1.1 中断类型 龙芯架构 32 位精简版下的中断采用线中断的形式。每个处理器核内部可记录 12 个线中断&#xff0c;分别是&#xff1a;1 个核间中断&#xff08;IPI&#xff09;&#xff0c;1 个定时器中断&#xff08;TI&#xff09;&#xff0c;8 个硬中断…

AI模型训练【偏差/方差】与【欠拟合/过拟合】

在我们拿到一个数据集&#xff0c;高高兴兴准备训练一个模型时&#xff0c;会遇到欠拟合或过拟合的问题&#xff0c;业内也喜欢用偏差和方差这两指标去定义它们&#xff0c;那这些词什么意思呢&#xff1f;有什么方法能避免/解决 欠拟合和过拟合呢&#xff1f; 这其实是非常非常…

Docker单点部署Seata(2.0.0) + Nacos(v2.3.0) + Mysql(5.7)

文章目录 一、部署Nacos二、部署Mysql三、Seata准备工作1. 记住nacos、mysql、宿主机的ip2. 建立数据库3. Nacos远程配置文件 四、部署Seata五、初步检验Seata部署情况六、微服务使用Seata1.引入依赖2. application.yml配置 七、遇到的坑1. Nacos显示Seata服务的ip为容器内网ip…

分布式系统架构设计之分布式数据存储的分类和组合策略

在现下科技发展迅猛的背景下&#xff0c;分布式系统已经成为许多大规模应用和服务的基础架构。分布式架构的设计不仅仅是一项技术挑战&#xff0c;更是对数据存储、管理和处理能力的严峻考验。随着云原生、大数据、人工智能等技术的崛起&#xff0c;分布式系统对于数据的高效存…

Vue 框架前导:详解 Ajax

Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性&#xff0c;可在不刷新页面的情况下实现和服务器的通信&#xff0c;交换数据或者更新页面 01. 体验 A…

SpringValidation自定义注解以及分组校验

SpringValidation的参数校验使用可参考&#xff1a;【SpringMVC应用篇】Spring Validation 参数校验-CSDN博客 目录 1. 引入依赖 2. 自定义注解校验 2.1 创建Validation类 2.2 创建注解对象 2.3 使用注解 3. 分组校验 3.1 实体类内部定义接口 3.2 在参数上指定分组 1. …

<JavaEE> 协议格式 -- 应用层协议 HTTP

目录 一、HTTP的概念 1&#xff09;什么是HTTP协议&#xff1f; 2&#xff09;什么是超文本&#xff1f; 二、HTTP协议格式 三、请求&#xff08;request&#xff09; 1&#xff09; 方法&#xff08;Method&#xff09; 1> GET方法 2> POST方法 3> GET和POS…

大数据- Hadoop入门

目录 &#x1f436;2.1 hadoop的简介 1. 概述 2. 什么是分布式&#xff1f; 3. Hadoop的指代 &#x1f436;2.2 hadoop的发展历程 &#x1f436;2.3 hadoop的版本介绍 &#x1f436;2.4 hadoop的常用端口号 &#x1f436;2.5 hadoop的设计目的 &#x1f436;2.6 hadoo…

商会集聚区正式启动,云迈科技成为首批入驻企业,助力片区信息化升级!

“商”聚雨花&#xff0c;“会”集新城。12月27日&#xff0c;长沙市雨花区举行高铁新城商会集聚区政策发布暨首家商会大厦揭牌活动。活动现场发布了《关于支持高铁新城商会集聚区发展的若干措施》&#xff0c;首家商会大厦长沙市耒阳商会大厦揭牌并与入驻会员签约&#xff0c;…