verilog編寫的自動售貨機,使用狀態機實現。

基於verilog的自動售貨機,平臺爲:quartues,仿真:altera-modelsim。
項目要求利用FPGA實現自動售貨機的核心控制部分。說明如下:
1.核心控制部分的時鐘輸入爲50MHz。
2.外部復位輸入爲低電平有效的復位。
3.自動售貨機能夠輸入的錢數只有0.5元和1元,輔助設備將以脈衝的形式提供給核心控制部分(脈衝寬度爲50MHZ的一個時鐘週期)。
4.當輸入的錢數剛好等於2.5元(只賣一種水,水的價格爲2.5元)時,輸出水。如果輸入的錢數爲3元,則輸出水的同時,找回0.5元。
5.輸出水和找零用一個時鐘週期的脈衝表示即可。

經過仔細分析上述要求,得出以下頂層架構。:

在本設計中,採用狀態機的方式實現。共分爲5個狀態,分別爲:ZERO、HALF、ONE、ONE_HALF、TWO。狀態轉移圖如下:
在這裏插入圖片描述
上代碼:
module auto_seller(clk,rst_n,flag_half,flag_one,flag_water,flag_money);
input wire clk;
input wire rst_n;
input wire flag_half;
input wire flag_one;
output reg flag_water;
output reg flag_money;

parameter 	ZERO 										=		5'b00001;
parameter 	HALF 										=		5'b00010;
parameter 	ONE 										=		5'b00100;
parameter 	ONE_HALF 									=		5'b01000;
parameter 	TWO											=		5'b10000;

reg			[4:0]																c_state;
reg			[4:0]																n_state;	

always@(posedge clk) begin
if(!rst_n)
c_state<=ZERO;
else
c_state<=n_state;

end

always@(*) begin
case(c_state)
ZERO : begin
if(flag_half = =1’b1)
n_state=HALF;
else
if(flag_one==1’b1)
n_state=ONE;
else
n_state=ZERO;
end

	HALF	:		begin 
					if(flag_half==1'b1)
						n_state=ONE;
					else
						if(flag_one==1'b1)
							n_state=ONE_HALF;
						else
							n_state=HALF;

					end 
					
	ONE		:		begin 
					if(flag_half==1'b1)
						n_state=ONE_HALF;
					else
						if(flag_one==1'b1)
							n_state=TWO;
						else
							n_state=ONE;

					end 
					
	ONE_HALF:		begin 
					if(flag_half==1'b1)
						n_state=TWO;
					else
						if(flag_one==1'b1)
							n_state=ZERO;
						else
							n_state=ONE_HALF;

					end 
					
	TWO		:		begin 
					if(flag_half==1'b1)
						n_state=ZERO;
					else
						if(flag_one==1'b1)
							n_state=ZERO;
						else
							n_state=TWO;

					end 
	default	:		n_state=ZERO;
endcase					

end

always@(posedge clk) begin
if(!rst_n)
flag_water<=1’b0;
else
case(c_state)
ZERO : flag_water<=1’b0;
HALF : flag_water<=1’b0;
ONE : flag_water<=1’b0;
ONE_HALF: if(flag_one= =1’b1)
flag_water<=1’b1;
else
flag_water<=1’b0;
TWO : if(flag_half1’b1 | | flag_one1’b1)
flag_water<=1’b1;
else
flag_water<=1’b0;
default : flag_water<=1’b0;
endcase

end

always@(posedge clk)begin
if(!rst_n)
flag_money<=1’b0;
else
if(c_stateTWO && flag_one1’b1)
flag_money<=1’b1;
else
flag_money<=1’b0;
end

endmodule

testbench產生的波形圖:
在這裏插入圖片描述
測試代碼在我主頁裏面可自行下載,歡迎各位老鐵批評指正。
https://download.csdn.net/download/weiyunguan8611/11014698

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章