自动售卖机(verilog状态机设计)IC笔试

题目:设计一个自动饮料售卖机,饮料10分钱,硬币5分10分两种,并考虑找零,每次只能投入一个硬币!
1.画出fsm。
2.用verilog编程。
3.设计工程中可使用的工具及设计大致过程

 1.画出fsm
第一步:定义它的输入输出。
输入:a,b;其中a=1,投入5分;b=1,投入10分;
输出:y,z;其中y=1,出饮料;z=1,找零。
第二步:定义状态
状态:两个状态 S0和S1;其中S0为没有投钱;S1为投了5分。
为此画出了状态图

 

2.用verilog编程

module hunter(clk,rst_n,a,b,y,z);
input clk,rst_n;
input a,b;
output reg y,z;

reg CS,NS;

parameter S0=1'b0,S1=1'b1;
//同步时序描述状态转移
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		CS<=S0;
	else
		CS<=NS;
//使用组合逻辑判断转移状态条件
always@(CS or a or b)
	begin
		{y,z}=2'b00;
		NS=1'bz;//状态机初始化,不定态的好处,综合器对不定态x的处理是don't care,仿真时可以考察设计FSM完备状态。
		case(CS)
			S0:begin
					if(a&~b)//投入5分的时候
						begin
							{y,z}=2'b00;
							NS=S1;
						end
					else if(~a&b)//投入10分的时候
						begin
							{y,z}=2'b10;
							NS=S0;
						end
					end
			 S1:begin
			 		 if(a&~b)//再次投入5分
			 		 	begin
			 		 		{y,z}=2'b10;
			 		 		NS=S0;
			 		 	end
			 		 else  if(~a&b)
			 		 	begin
			 		 		{y,z}=2'b11;
			 		 		NS=S1;
			 		 	end
			 	   end
			 default:
			 		NS=S0;
			 endcase
	end
	endmodule

 上面的饮料我们只有一种,我们假设存在两种饮料A和B,价钱分别为5分和10分,状态图又该如何呢?

我们需要添加一个输入c,当c为1是选择饮料B,c为0时选择饮料A;

定义两个状态,初始态S0和转移态S1,到达转移态S1的条件是选择的饮料种类的价格比第一次投入的硬币的面值大,所以画出如下状态转移图:

其实对于售卖机的模型,总结来说就是两种状态,初始态和转移态,状态转移图如下所示:

S0为初始态,S1为选择完商品之后的状态

 

扫描二维码关注公众号,回复: 6545872 查看本文章

猜你喜欢

转载自blog.csdn.net/bleauchat/article/details/92795396