题解 | #自动贩售机2#

自动贩售机2

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

两种方案:

方案一:设计一个状态机,通过判断sel来选择下一个状态;

关于输出使用cur_stata还是next_stata。我做了个实验。两种都可以。但是使用cur_stata得用逻辑输出。next_stata是使用正常的时序输出,具体可以看下面得程序。

`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***********//
	parameter S0=0, S0_5=1, S1=2, S1_5=3, S2=4, S2_5=5, S3=6;
	reg [2:0] cur_stata, next_stata;

	always@(posedge clk or negedge rst)
		if(~rst)
			cur_stata <= S0;
		else
			cur_stata <= next_stata;

	always@(*)
		case(cur_stata)
			S0: next_stata <= d1? S0_5: d2? S1: next_stata;
			S0_5: next_stata <= d1? S1: d2? S1_5: next_stata;
			S1: next_stata <= d1? S1_5: d2? S2: next_stata;
			S1_5: next_stata <= ~sel? S0: d1? S2: d2? S2_5: next_stata;
			S2: next_stata <= ~sel? S0: d1? S2_5: d2? S3: next_stata;
			default: next_stata <= S0;
		endcase

	// always@(*)
	// 	if (~rst)
	// 		{out1, out2, out3} <= 3'b000;
	// 	else
	// 		case(cur_stata)
	// 			S1_5: {out1, out2, out3} <= ~sel? 100: 000;
	// 			S2:  {out1, out2, out3} <= ~sel? 101: 000;
	// 			S2_5:{out1, out2, out3} <= ~sel? 101: 010;
	// 			S3:{out1, out2, out3} <= ~sel? 101: 011;
	// 			default: {out1, out2, out3} <= 000;
	// 		endcase


		always@(posedge clk or negedge rst)
		if (~rst)
			{out1, out2, out3} <= 3'b000;
		else
			case(next_stata)
				S1_5: {out1, out2, out3} <= ~sel? 100: 000;
				S2:  {out1, out2, out3} <= ~sel? 101: 000;
				S2_5:{out1, out2, out3} <= ~sel? 101: 010;
				S3:{out1, out2, out3} <= ~sel? 101: 011;
				default: {out1, out2, out3} <= 000;
			endcase
//*************code***********//
endmodule

方案二:

写两个不同的状态机,根据sel来选择使用哪一个状态机。程序待完成。

全部评论

相关推荐

牛可乐121381:卖课的
点赞 评论 收藏
分享
03-16 22:00
武汉大学 C++
幸福的小熊猫想要offer:我阿里投的 c++岗,面试官说自己是做 java 的,c++这辈子才有了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务