【牛客网verilog刷题】时序逻辑VL39自动贩卖机2

1.题目描述

注意:题目中输入d3应该换成饮料选择信号sel
在这里插入图片描述
在这里插入图片描述
仿真时序:
在这里插入图片描述

2.题目分析

注意:分析方法和步骤为fpga设计时序逻辑电路的方法和步骤,电路采用meely型

(1)确定输入,输出和电路状态

本题已经给出了输入和输出及对应变量,如果题目没有给出就需要自己定义。
输入:

变量说明
d1投入0.5元
d2投入1元
sel0表示购买1.5元的饮料,1表示购买2.5元饮料

输出:

变量说明
out1输出1.5元饮料
out2输出2.5元饮料
out3找零0.5元

状态定义:
分析:有两种饮料(1.5元,2.5元),币值有两种(0.5元,1元)。当购买2.5元饮料时,已经投入的币有7种状态(0,0.5,1,1.5,2,2.5,3)。(购买2.5元饮料的状态包含了购买两元饮料的所有状态)

状态变量说明
IDLE已经投入0元
S1已经投入0.5元
S2已经投入1元
S3已经投入1.5元
S4已经投入2元
S5已经投入2.5元
S6已经投入3元

(2)绘制状态转移图

moore型状态机是不行的

理论上有上述七个状态,对应moore型状态机,但是此电路设计成moore型电路存在问题:在已投入1元状态时,再投入1元后,电路都需要跳转到已投入2元状态,在此状态购买1.5元饮料和2元饮料分别对应两种输出,所以输出不仅仅和当前状态有关,和输入也有关系,所以只能设计为meely状态机。

设计为meely型状态机

(a)在购买1.5元饮料时:
输入大于1时(1.5/2),直接输出饮料1、找零并跳转到初始状态,所以需要的状态为0元,0.5元,1元状态;
(b)在购买2.5元饮料时:
输入大于2时(2.5/3),直接输出饮料2、找零并跳转到初始状态,所以需要的状态为0元,0.5元,1元,1.5元,2元;
所以状态化简为5个状态(0元,0.5元,1元,1.5元,2元)

meely型状态转移图

在这里插入图片描述

3.完整代码

(1)两个问题:
题目给的仿真时序,是在时钟上升沿给脉冲,但是网站检验代码的时候,是在时钟上升沿之给的脉冲;
因为三段式状态机的第二段状态转移条件判断是在下一个时钟上升沿进行判断,但是代码中脉冲只持续了半个时钟周期;
解决方法:
如果为了通过网站的测试,就将所有输入数据在时钟上升沿打一拍,作为完整的输入数据;
如果为了自己用仿真软件(比如modelsim)仿真并得到正确结果,就将所有时钟,在时钟下降沿打一拍,作为完整的输入数据。
(2)代码

`timescale 1ns/1ns
module 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
);
	//输入数据先打一拍
	//sel是否打一拍
	reg d1_reg;
	reg d2_reg;
	reg sel_reg;
	always@(posedge clk or negedge rst)begin
		if(!rst)begin
			d1_reg <= 1'b0;
			d2_reg <= 1'b0;
			sel_reg <= 1'b0;
		end
		else begin
			d1_reg <= d1;
			d2_reg <= d2;
			sel_reg <= sel;
		end
	end
	//状态定义
	parameter IDLE 	= 7'b000_0001;
	parameter S1	= 7'b000_0010;
	parameter S2	= 7'b000_0100;
	parameter S3	= 7'b000_1000;
	parameter S4	= 7'b001_0000;
	//状态存储变量
	reg [4:0] current_state;
	reg [4:0] next_state;
	//三段式状态机第一段
	always@(posedge clk or negedge rst)begin
		if(!rst)
			current_state <= 5'd0;
		else	
			current_state <= next_state;
	end
	//三段式状态机第二段
	always@(*)begin
		next_state = IDLE;
		case(current_state)
			IDLE:begin
				case({d1_reg,d2_reg})
					{1'b0,1'b0}: 	next_state = IDLE;
					{1'b1,1'b0}:	next_state = S1;
					{1'b0,1'b1}:	next_state = S2;
					default:	next_state = IDLE;
				endcase	
			end
			S1:begin
				casex({sel_reg,d1_reg,d2_reg})
					{1'bx,1'b0,1'b0}:	next_state = S1;
					{1'bx,1'b1,1'b0}:	next_state = S2;
					{1'b0,1'b0,1'b1}:	next_state = IDLE;
					{1'b1,1'b0,1'b1}:	next_state = S3;
					default:	next_state = IDLE;
				endcase
			end
			S2:begin
				casex({sel_reg,d1_reg,d2_reg})
					{1'bx,1'b0,1'b0}:	next_state = S2;
					{1'b0,1'b1,1'b0}:	next_state = IDLE;
					{1'b0,1'b0,1'b1}:	next_state = IDLE;
					{1'b1,1'b1,1'b0}:	next_state = S3;
					{1'b1,1'b0,1'b1}:	next_state = S4;
					default: 	next_state = IDLE;
				endcase
			end
			S3:begin
				casex({sel_reg,d1_reg,d2_reg})
					{1'bx,1'b0,1'b0}:	next_state = S3;
					{1'b1,1'b1,1'b0}:	next_state = S4;
					{1'b1,1'b0,1'b1}:	next_state = IDLE;
					default: next_state = IDLE;
				endcase
			end
			S4:begin
				casex({sel_reg,d1_reg,d2_reg})
					{1'bx,1'b0,1'b0}:	next_state = S4;
					{1'b1,1'b1,1'b0}:	next_state = IDLE;
					{1'b1,1'b0,1'b1}:	next_state = IDLE;
					default: next_state = IDLE;
				endcase
			end
			default:	next_state = IDLE;
		endcase
	end
	//三段式状态机第三段	 
	always@(posedge clk or negedge rst)begin
		if(!rst)begin
			out1	<= 1'b0;
			out2	<= 1'b0;
			out3	<= 1'b0;
		end
		else begin
			case(current_state)
				IDLE:begin
					out1	<= 1'b0;
					out2	<= 1'b0;
					out3	<= 1'b0; 
				end
				S1:begin
					case({sel_reg,d1_reg,d2_reg})
						{1'b0,1'b0,1'b1}:begin
							out1	<= 1'b1;
							out2	<= 1'b0;
							out3	<= 1'b0; 							
						end
						default:begin
							out1	<= 1'b0;
							out2	<= 1'b0;
							out3	<= 1'b0; 							
						end
					endcase
				end
				S2:begin
					case({sel_reg,d1_reg,d2_reg})
						{1'b0,1'b1,1'b0}:begin
							out1	<= 1'b1;
							out2	<= 1'b0;
							out3	<= 1'b0; 							
						end
						{1'b0,1'b0,1'b1}:begin
							out1	<= 1'b1;
							out2	<= 1'b0;
							out3	<= 1'b1; 							
						end
						default:begin
							out1	<= 1'b0;
							out2	<= 1'b0;
							out3	<= 1'b0; 
						end
					endcase
				end
				S3:begin
					case({sel_reg,d1_reg,d2_reg})
						{1'b1,1'b0,1'b1}:begin
							out1	<= 1'b0;
							out2	<= 1'b1;
							out3	<= 1'b0; 
						end
						default:begin
							out1	<= 1'b0;
							out2	<= 1'b0;
							out3	<= 1'b0; 
						end
					endcase
				end
				S4:begin
					case({sel_reg,d1_reg,d2_reg})
						{1'b1,1'b1,1'b0}:begin
							out1 	<= 1'b0;
							out2	<= 1'b1;
							out3	<= 1'b0;
						end
						{1'b1,1'b0,1'b1}:begin
							out1 	<= 1'b0;
							out2	<= 1'b1;
							out3	<= 1'b1;						
						end
						default:begin
							out1 	<= 1'b0;
							out2	<= 1'b0;
							out3	<= 1'b0;	
						end
					endcase
				end
				default:begin
							out1 	<= 1'b0;
							out2	<= 1'b0;
							out3	<= 1'b0;	
						end
			endcase
		end
	end
endmodule
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值