1. 程式人生 > >FPGA自動售賣機(verilog狀態機設計)

FPGA自動售賣機(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;
//同步時序描述狀態轉移
[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

最後綜合後的圖: 在這裡插入圖片描述 3.設計工程中可使用的工具及設計大致過程。 ①功能定義與器件選型 ②設計輸入: ultra ③功能模擬:modesim ④邏輯綜合:quartus ii 或者 ise的邏輯綜合器 ⑤實現佈局佈線:pin planner ⑥時序模擬:modesim ⑦靜態時序模擬: quartus 的signal Tap或者ise的chipscope ⑧上板除錯。