三段式状态机

`timescale 1ns / 1ps

module water_sell(
	input wire	clk	,
	input wire  rst_n	,
	input wire  half	,
	input wire  one	,
	
	output reg water	,
	output reg change
);
	parameter	ZERO 		= 5'b00001;
	parameter	HALF 		= 5'b00010;
	parameter	ONE  		= 5'b00100;
	parameter	ONE_HALF    = 5'b01000;
	parameter	TWO 		= 5'b10000;
	
	reg 	[4:0]	            c_state;
	reg 	[4:0]	            n_state;

	always @(posedge clk, negedge rst_n)
	begin
		if(rst_n == 1'b0)
			c_state <= ZERO;
		else
			c_state <= n_state;
	end

	always @(*)
	begin
		case(c_state)
			ZERO	: begin
						if(half)
							n_state = HALF;
						else if(one)
							n_state = ONE;
						else
							n_state = ZERO;
					  end
			HALF	: begin
						if(half)
							n_state = ONE;
						else if(one)
							n_state = ONE_HALF;
						else
							n_state = HALF;
					  end
			ONE	: begin
						if(half)
							n_state = ONE_HALF;
						else if(one)
							n_state = TWO;
						else
							n_state = ONE;
					  end
			ONE_HALF:begin
						if(half)
							n_state = TWO;
						else if(one)
							n_state = ZERO;
						else
							n_state = ONE_HALF;
					   end
			TWO	: begin
						if(half || one)
							n_state = ZERO;
						else
							n_state = TWO;
					  end
			default : n_state = ZERO;
		endcase
	end
	
	
	always @(posedge clk, negedge rst_n)
	begin
		if(rst_n == 1'b0)
			water <= 1'b0;
		else
		 case(c_state)
			ZERO : water <= 1'b0;
			HALF : water <= 1'b0;
			ONE : water <= 1'b0;
			ONE_HALF : begin
							if(one)	    water <= 1'b1;
							else		water <= 1'b0;
						  end
			TWO : 	  begin
							if(one || half)      water <= 1'b1;
							else		   	     water <= 1'b0;
						  end
			default: ;
		endcase
	end
	
	always @(posedge clk, negedge rst_n)
	begin
		if(rst_n == 1'b0)
			change <= 1'b0;
		else if(c_state == TWO && one)
			change <= 1'b1;
		else
			change <= 1'b0;
	end
	
endmodule

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值