题解 | #自动贩售机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来选择使用哪一个状态机。程序待完成。

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 12:19
点赞 评论 收藏
分享
10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务