用状态机实现简单的自动售卖机(Verilog)并验证

目录

一、设计要求

二、分析

1、输入输出

(1)input

(2)output

2、状态

3、状态机

三、源代码

1、FSM.v

2、FSM_tb.v

四、仿真波形


一、设计要求

使用FSM实现自动售卖机。FSM的概念可参考:https://blog.csdn.net/qq_42922513/article/details/130828381icon-default.png?t=N7T8https://blog.csdn.net/qq_42922513/article/details/130828381售卖机描述:商品为可乐,一瓶可乐5元钱,每次只能投三种人民币中的一种,分别是:1元,2元,5元。当投够5元时,出一瓶可乐,并找零。

二、分析

1、输入输出

(1)input

输入包括:时钟信号clk,低电平复位信号rst_n,投币in_m

clk, rst_n, [3:0] in_m;

(2)output

输出包括:可乐goods,找零out_m

goods, [3:0] out_m;

2、状态

根据售卖机中有多少钱,将状态机共划分为5个状态,分别为:IDLE(0元)、S0(1元)、S1(2元)、S2(3元)、S3(4元)。

3、状态机描述

本文采用mealy型状态机。对各状态采用独热码进行编码,5个状态需要5bit。

三、源代码

1、FSM.v

`timescale 1ns/1ns

module FSM (
	input clk,
	input rst_n,
	input [3:0] in_m,
	output reg goods,
	output reg [3:0] out_m
);

reg [4:0] CS, NS;

parameter [4:0]
	IDLE = 'b00001,
	S0   = 'b00010,
	S1   = 'b00100,
	S2   = 'b01000,
	S3   = 'b10000;

//第一always块,同步时序逻辑
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n)
		CS <= IDLE;
	else
		CS <= NS;
end

//第二always块,组合逻辑
always @ (*) begin
	case (CS)
		IDLE:
			if (in_m == 4'd1)		NS = S0;
			else if (in_m == 4'd2)	NS = S1;
			else if (in_m == 4'd5)	NS = IDLE;
			else					NS = IDLE;
		
		S0:
			if (in_m == 4'd1)		NS = S1;
			else if (in_m == 4'd2)	NS = S2;
			else if (in_m == 4'd5)	NS = IDLE;
			else					NS = S0;
		
		S1:
			if (in_m == 4'd1)		NS = S2;
			else if (in_m == 4'd2)	NS = S3;
			else if (in_m == 4'd5)	NS = IDLE;
			else					NS = S1;
		
		S2:
			if (in_m == 4'd1)		NS = S3;
			else if (in_m == 4'd2)	NS = IDLE;
			else if (in_m == 4'd5)	NS = IDLE;
			else					NS = S2;
		
		S3:
			if (in_m == 4'd1)		NS = IDLE;
			else if (in_m == 4'd2)	NS = IDLE;
			else if (in_m == 4'd5)	NS = IDLE;
			else					NS = S3;
	
		default:
			NS = IDLE;
	endcase
end

//第三always块,同步时序逻辑
always @ (posedge clk or negedge rst_n) begin
	if (!rst_n) begin
		out_m <= 'd0;
		goods <= 'd0;
	end
	else begin
		case (CS)
			IDLE: begin
				out_m <= 'd0;
				if (in_m == 'd5)    goods <= 'd1;
				else                goods<= 'd0;
			end
			
			S0: begin
				out_m <= 'd0;
				if (in_m == 'd1 || in_m == 'd2) begin
					goods <= 'd0;
					out_m <= 'd0;
				end
				else begin
					goods <= 'd1;
					out_m <= 'd1;
				end
			end
			
			S1: begin
				out_m <= 'd0;
				if (in_m == 'd1 || in_m == 'd2) begin
					goods <= 'd0;
					out_m <= 'd0;
				end
				else begin
					goods <= 'd1;
					out_m <= 'd2;
				end
			end
				
			S2: begin
				out_m <= 'd0;
				if (in_m == 'd1) begin
					goods <= 'd0;
					out_m <= 'd0;
				end
				else if (in_m == 'd2) begin
					goods <= 'd1;
					out_m <= 'd0;
				end
				else begin
					goods <= 'd1;
					out_m <= 'd3;
				end
			end
			
			S3: begin
				goods <= 'd1;
				if (in_m == 'd1)		out_m <= 'd0;
				else if (in_m == 'd2)	out_m <= 'd1;
				else					out_m <= 'd4;
			end
			
			default: begin
				goods <= 'd1;
				out_m <= 'd0;
			end
		endcase
	end
end
endmodule

2、FSM_tb.v

//FSM_tb.v

`timescale 1ns/1ns

module FSM_tb;

reg clk;
reg rst_n;
reg [3:0] in_m;
wire [3:0] out_m;
wire goods;

FSM u(
	.clk(clk),
	.rst_n(rst_n),
	.in_m(in_m),
	.goods(goods),
	.out_m(out_m)
);

initial begin
	rst_n = 'b0;
	clk = 'b0;
	#50
	rst_n = 'b1;
end

always #20 clk = ~clk;

initial begin
	in_m = 0;
	#50
	in_m = 'd1;
	#40
	in_m = 'd1;
	#40
	in_m = 'd1;
	#40
	in_m = 'd1;
	#40
	in_m = 'd1;
	#40
	in_m = 'd2;
	#40
	in_m = 'd2;
	#40
	in_m = 'd2;
	#40
	in_m = 'd5;
	#40
	in_m = 'd2;
	#40
	in_m = 'd5;
	#40
	$stop;
end

endmodule

3、FSM_tb.sv

使用system verilog进行随机验证。SV相关基础可参考:System Verilog基础_qq_42922513的博客-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_42922513/article/details/130984574

//FSM_tb.sv
`timescale 1ns/1ns

module FSM_tb;

bit clk;
bit rst_n;
bit [3:0] in_m;
bit [3:0] out_m;
bit goods;

FSM u(
	.clk(clk),
	.rst_n(rst_n),
	.in_m(in_m),
	.goods(goods),
	.out_m(out_m)
);

initial begin
	rst_n = 'b0;
	clk = 'b0;
	#50
	rst_n = 'b1;
end

always #20 clk = ~clk;

class packet;
    rand bit [3:0] money_in;
    constraint c{
        money_in dist{1:=1, 2:=1, 5:=1};
    }
endclass

initial begin
	in_m = 0;
    packet M;
    M = new();
	#50
	repeat(20) begin
        assert(M.randomize());
        in_m = M.money_in;
        $display("******* in_m = %0d********/n", in_m);
        #40;
    end
	#40
	$stop;
end

endmodule

四、仿真波形

1、工具:VIVADO,testbench文件:FSM_tb.v

2、工具:VIVADO,testbench文件:FSM_tb.sv

                           

                                     PS:果觉得有用可以点赞并收藏!!!

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Verilog自动售货机实现是通过使用Verilog语言来描述售货机的行为和逻辑,包括输入输出、控制信号、状态转换等。通过Verilog语言的描述,可以将自动售货机的功能实现FPGA或ASIC中,从而实现一个完全由硬件来实现自动售货机。这个自动售货机可以根据用户的选择,自动出售商品并扣除相应的费用,同时可以显示交易信息和状态。 ### 回答2: Verilog 是一种硬件描述语言,能够描述数字电路的行为和结构。自动售货机是状态机的经典示例,因此我们可以使用 Verilog 描述自动售货机的状态机。下面是详细的步骤: 1. 指定状态:自动售货机的状态图是由多个状态组成的,每个状态代表售货机不同的状态。例如,我们可以定义以下状态:待机、接收货币、选择商品、出货、退货等等。 2. 定义输入输出信号:这些信号将被用来控制状态机的行为。输入信号可能包括按钮、货币接口和显示屏等。输出信号可能包括灯、电机和音频信号等。我们需要定义每个输入和输出信号及其对应的作用。 3. 指定状态转移条件和动作:状态转移指定了状态机从一个状态转移到另一个状态所需的条件,例如,如果货币输入正确,自动售货机应转移到选择商品的状态。动作指定了状态机在转移时必须执行的操作,例如,在出货状态下,我们需要执行出货动作,将商品投放到出货口。 4. 编写 Verilog 代码实现状态机:根据上述步骤,我们可以编写 Verilog 代码实现状态机。我们将输入、输出信号、状态和状态转移和动作分别作为模块输入、输出、参数和逻辑实现的条件,然后设置逻辑实现,使状态机根据输入信号转移到不同的状态,并执行相应的操作输出信号。 综上所述,Verilog 自动售货机状态机实现的过程需要明确状态、输入输出信号以及状态转移条件和动作,并编写相应逻辑实现。根据这些步骤,我们可以通过 Verilog 描述状态机,控制自动售货机的行为。 ### 回答3: Verilog 是一种硬件描述语言,用于电子系统级别的设计和验证。它有丰富的库和模块,使得我们可以对各种电子元器件进行建模,并且能够在较高的抽象层次上进行设计、优化和验证自动售货机是一个常见的应用场景,我们可以用 Verilog实现状态机。首先,我们需要定义自动售货机的各个状态,该状态机有以下状态: 1. 初始状态 2. 等待投币状态 3. 投币状态 4. 等待选择状态 5. 选择状态 6. 支付状态 7. 出货状态 在初始状态下,我们需要初始化自动售货机中的各个计数器,并等待着用户投币,这时候状态机会进入等待投币状态。在等待投币状态下,自动售货机会等待着用户投入硬币,如果用户投硬币,它会进入投币状态。在投币状态下,自动售货机会将投币的钱数加起来,并等待用户选择商品,状态机会转移到等待选择状态。在等待选择状态下,自动售货机会等待用户输入商品编号,如果输入正确,状态机会进入选择状态。在选择状态下,自动售货机会进行支付,如果用户付款成功,状态机会进入支付状态。在支付状态下,自动售货机会进行出货,如果成功出货,状态机会进入出货状态。在出货状态下,自动售货机会等待用户将商品取走,完成交易。 以上是自动售货机状态机实现思路,我们需要根据实际情况进行具体的实现。通过使用 Verilog状态机,我们可以很方便地设计各种硬件系统,从而能够更加高效地进行电子系统的设计、仿真和验证

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值