基於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