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

最近看了下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分。
为此画出了状态图

FPGA自动售卖机(verilog状态机设计)IC笔试
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;
//同步时序描述状态转移
[email protected](posedge clk or negedge rst_n)
	if(!rst_n)
		CS<=S0;
	else
		CS<=NS;
//使用组合逻辑判断转移状态条件
[email protected](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

最后综合后的图:
FPGA自动售卖机(verilog状态机设计)IC笔试
3.设计工程中可使用的工具及设计大致过程。
①功能定义与器件选型
②设计输入: ultra
③功能仿真:modesim
④逻辑综合:quartus ii 或者 ise的逻辑综合器
⑤实现布局布线:pin planner
⑥时序仿真:modesim
⑦静态时序仿真: quartus 的signal Tap或者ise的chipscope
⑧上板调试。