题解 | #自动贩售机2#

自动贩售机2

https://www.nowcoder.com/practice/298dec1c3dce45c881f3e53e02558828

`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
);
//*************code***********//

reg [6:0]state;
parameter s0 = 7'b000_0001;
parameter s1 = 7'b000_0010;
parameter s2 = 7'b000_0100;
parameter s3 = 7'b000_1000;
parameter s4 = 7'b001_0000;
parameter s5 = 7'b010_0000;
parameter s6 = 7'b100_0000;

always@(posedge clk or negedge rst)
    if (rst == 1'b0)
	    state <= s0;
	else if (sel == 1'b0) 
	    case(state)
		    s0 : 
			    if (d1 == 1'b1)
				    state <= s1;
				else if (d2 == 1'b1)
				    state <= s2;
				else 
				    state <= s0;
			s1 : 
			    if (d1 == 1'b1)
				    state <= s2;
				else if (d2 == 1'b1)
				    state <= s3;
				else 
				    state <= s1;
			s2 : 
			    if (d1 == 1'b1)
				    state <= s3;
				else if (d2 == 1'b1)
				    state <= s4;
				else 
				    state <= s2;
			s3 : 
			    state <= s0;
			s4 : 
			    state <= s0;
			default : state <= s0;
		endcase
			

always@(posedge clk or negedge rst)
    if (rst == 1'b0)
	    state <= s0;
	else if (sel == 1'b1) 
	    case(state)
		    s0 : 
			    if (d1 == 1'b1)
				    state <= s1;
				else if (d2 == 1'b1)
				    state <= s2;
				else 
				    state <= s0;
			s1 : 
			    if (d1 == 1'b1)
				    state <= s2;
				else if (d2 == 1'b1)
				    state <= s3;
				else 
				    state <= s1;
			s2 : 
			    if (d1 == 1'b1)
				    state <= s3;
				else if (d2 == 1'b1)
				    state <= s4;
				else 
				    state <= s2;
			s3 : 
			    if (d1 == 1'b1)
				    state <= s4;
				else if (d2 == 1'b1)
				    state <= s5;
				else 
				    state <= s3;
			s4 : 
			    if (d1 == 1'b1)
				    state <= s5;
				else if (d2 == 1'b1)
				    state <= s6;
				else 
				    state <= s4;
			s5 : 
				state <= s0;
			s6 : 
				state <= s0;
			default : state <= s0;
		endcase

always@(posedge clk or negedge rst)
    if (rst == 1'b0)
	    begin
	        out1 <= 1'b0;
			out2 <= 1'b0;
			out3 <= 1'b0;
		end
	else if (state == s3 && sel == 1'b0)
	     begin
	        out1 <= 1'b1;
			out2 <= 1'b0;
			out3 <= 1'b0;
		end
	else if (state == s4 && sel == 1'b0)
	     begin
	        out1 <= 1'b1;
			out2 <= 1'b0;
			out3 <= 1'b1;
		end
	else if (state == s5 && sel == 1'b1)
	     begin
	        out1 <= 1'b0;
			out2 <= 1'b1;
			out3 <= 1'b0;
		end
	else if (state == s6 && sel == 1'b1)
	     begin
	        out1 <= 1'b0;
			out2 <= 1'b1;
			out3 <= 1'b1;
		end
	else 
	    begin
			out1 <= 1'b0;
			out2 <= 1'b0;
			out3 <= 1'b0;
		end


//*************code***********//
endmodule

用了两个状态机,第一个状态机是在sel 1'b0 时执行的状态机,对应饮料1的输出;第二个状态机是在sel == 1'b1时执行的,对应饮料2的输出。(采用二段式状态机写法)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务