设计一个状态机,A饮料10分钱,B饮料5分钱,投币分5分钱和10分钱,考虑找零。

//设计一个自动饮料售卖机,共有两种饮料,其中饮料 A 每个 10 分钱,饮料 B 每个 5 分钱
//硬币有 5 分和 10 分两种,并考虑找零。
//要求用状态机实现,定义状态,画出状态转移图,并用 Verilog 完整描述该识别模块。
//sel为1.表示选择饮料A,sel为0,表示选择饮料B。
//输入2’b01–表示5分钱,2’b10–表示10分钱。
//d_in表示投入钱的数量,d_out高表示输出饮料,d_c表示找零。

module sel_fsm (clk,rst,sel,din,dout,dc);
	input clk,rst,sel;
	input [1:0] din;
	output reg dout;
	output reg [1:0] dc;
	
	reg [1:0] state,nstate;
	parameter s0 = 2'b00, s1 = 2'b01, s2 = 2'b10;
	
	always @ (posedge clk or negedge rst) begin
		if(!rst) 
			state <= s0;
		else
			state <= nstate;
	end
	always @ (*) begin
		case(state)
			s0:begin
				if(din == 2'b01 && sel == 1'b1) begin
					nstate = s1;
					{dc,dout} = 3'b000;
				end
				else if(din == 2'b10 && sel == 1'b1) begin 
					nstate = s0;
					{dc,dout} = 3'b001;
				end
				else if(din == 2'b01 && sel == 1'b0) begin
					nstate = s0;
					{dc,dout} = 3'b001;
				end
				else if(din == 2'b10 && sel == 1'b0) begin 	
					nstate = s1;
					{dc,dout} = 3'b011;
				end
				else begin
					nstate = s0;	
					{dc,dout} = 3'b000;
				end
			end
			s1:begin
				if(din == 2'b01 && sel == 1'b1) begin
					nstate = s0;
					{dc,dout} = 3'b001;
				end
				else if(din == 2'b10 && sel == 1'b1) begin
					nstate = s1;
					{dc,dout} = 3'b011;
				end
				else if(sel == 1'b0) begin
					nstate = s0;
					{dc,dout} = 3'b001;
				end	
				else begin
					nstate = s1;
				end
			end
			default: nstate = s0;
		endcase
	end
endmodule

测试代码

```cpp
`timescale 1ns/100ps
module sel_fsm_tb;
	reg clk,rst,sel;
	reg [1:0] din;
	wire dout;
	wire [1:0] dc;
	
	sel_fsm n1 (clk,rst,sel,din,dout,dc);
	
	initial begin
		clk = 0;
		rst = 0;
	#10	rst = 1;
	end
	always begin 
		#10 clk = ~clk;
	end
	initial begin
		#10 sel = 1;
			din = 2'b01;	
		#10	din = 2'b01;
		#10	din = 2'b01;
		#10	din = 2'b10;
		#10	din = 2'b10;
		#10	din = 2'b00;
		#10	sel = 0;
		#10	din = 2'b00;
		#10	din = 2'b01;
		#10	din = 2'b10;
		#10	din = 2'b10;
	end
endmodule

波形图:
在这里插入图片描述
参考文章:https://www.cnblogs.com/shadow-fish/p/13543519.html

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值