大俠好,歡迎來到FPGA技術江湖,江湖偌大,相見即是緣分。大俠可以關注FPGA技術江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡。
今天給大俠帶來基于FPGA的自動售貨機設計,附源碼,獲取源碼,請在“FPGA技術江湖”公眾號內(nèi)回復“?自動售貨機設計源碼”,可獲取源碼文件。話不多說,上貨。
設計要求
一聽飲料需要2.5美元,規(guī)定只能投入一美元,0.5美元的硬幣。
設計架構(gòu)
設計框架圖:
設計代碼
設計模塊sell代碼:
module sell(clk,rst_n,one_dole,half_dole,descense,back_money);
input clk;
input rst_n;
input one_dole; //輸入1美元
input half_dole; //輸入0.5美元
output reg descense; //是否買到的標志位
output reg [2:0] back_money; //找回的錢
parameter s0 = 2'b00,s1 = 2'b01,s2 = 2'b10;
reg [1:0] state;
reg [4:0] money;
reg [1:0] state_x;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
state_x <= s0;
end
else
begin
state_x <= state;
end
always @ (posedge clk or negedge rst_n)
if(!rst_n)
begin
money <= 5'b0;
state <= s0;
end
else
begin
case (state)
s0:begin
//判斷投入的錢是多少
if(one_dole)
begin
money <= money + 10;
state <= s1;
end
else if(half_dole)
begin
money <= money + 5;
state <= s1;
end
else
begin
state <= s0;
money <= money;
end
end
//判斷和商品的價格是否一樣
s1:begin
if(money < 25)
begin
state <= s0;
end
else
begin
state <= s0;
money <= 5'b0;
end
end
endcase
end
reg [1:0] state_s;
always @ (posedge clk or negedge rst_n )
if(!rst_n)
begin
descense <= 1'b0;
back_money <= 3'b0;
state_s <= s0;
end
else
begin
case (state_s)
s0: begin
if(money < 25) //判斷輸入的錢數(shù)
begin
back_money <= 3'b0;
descense <= 1'b0;
end
else
//找回的錢和買到的標志位
begin
back_money <= money - 25;
descense <= 1'b1;
state_s <= s1;
end
end
s1: begin
descense <= 1'b0;
state_s <= s0;
end
endcase
end
endmodule
測試仿真
測試模塊sell_tb代碼:
`timescale 1ns/1ps //時間精度
module sell_tb();
//定義我們的端口
reg clk;
reg rst_n;
reg one_dole;
reg half_dole;
wire descense;
wire [2:0] back_money;
initial begin
clk = 1'b1;
rst_n = 1'b0;
one_dole = 1'b0;
half_dole = 1'b0;
#200.1 rst_n = 1'b1;
//模擬輸入的錢數(shù)
#200 one_dole = 1'b1;
#20 one_dole = 1'b0;
#200 one_dole = 1'b1;
#20 one_dole = 1'b0;
#200 one_dole = 1'b1;
#20 one_dole = 1'b0;
#1000.1
#200 half_dole = 1'b1;
#20 half_dole = 1'b0;
#200 one_dole = 1'b1;
#20 one_dole = 1'b0;
#200 one_dole = 1'b1;
#20 one_dole = 1'b0;
# 1000 $stop; //停止仿真
end
always #10 clk = ~ clk;
sell sell_dut( //例化端口
.clk(clk),
.rst_n(rst_n),
.one_dole(one_dole),
.half_dole(half_dole),
.descense(descense),
.back_money(back_money)
);
endmodule
仿真圖:
我們從仿真中可以看到當我們的錢數(shù)投夠的時候,就給一個買到的標志位,如果投的超過商品的價格,那么我們就給一個買的標志位,然后找回我們投的多的錢。
閱讀全文