名稱:自動(dòng)售貨機(jī)basys2開發(fā)板VHDL可改單價(jià)販賣機(jī)自助機(jī)(代碼在文末下載)
軟件:ISE
語言:VHDL
代碼功能:
自動(dòng)售貨機(jī)
1、具有3元、6元、7元、9元的商品,通過按鍵選擇商品。
2、可以投幣1元、2元、5元、10元。
3、購買成功后有led燈提示,且具有找零功能。
4、具有取消按鍵,可以取消購買,退回已投金額。
本代碼商品單價(jià)及投幣金額可以自行修改,相關(guān)代碼如下
--商品選擇(1~3) ???PROCESS?(clk,?reset_n) ???BEGIN ??????IF?(reset_n?=?'0')?THEN ?????????need_money_buf?<=?"0000"; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"001")?THEN ????????????IF?(select_p?=?'1')?THEN--商品有3.6.7.9元的 ???IF?(need_money_buf?=?"0000")?THEN need_money_buf?<=?"0011";--商品3元的 ???????????????ELSIF(need_money_buf?=?"0011")?THEN ??????????????????need_money_buf?<=?"0110";--商品6元的 ???????????????ELSIF(need_money_buf?=?"0110")?THEN need_money_buf?<=?"0111";--商品7元的 ???????????????ELSIF(need_money_buf?=?"0111")?THEN need_money_buf?<=?"1001";--商品9元的 ???????????????ELSIF(need_money_buf?=?"1001")?THEN need_money_buf?<=?"0011";--商品3元的 ???????????????END?IF; ????????????ELSE ???????????????need_money_buf?<=?need_money_buf; ????????????END?IF; ?????????ELSIF?(state?=?"100")?THEN ????????????need_money_buf?<=?"0000"; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? --投幣累計(jì) ???PROCESS?(clk,?reset_n) ???BEGIN ??????IF?(reset_n?=?'0')?THEN ?????????input_money_buf?<=?"0000"; ??????ELSIF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?(state?=?"010")?THEN ????????????IF?(coin_1_p?=?'1')?THEN ???????????????input_money_buf?<=?input_money_buf?+?"0001";--投幣1元 ????????????ELSIF?(coin_5_p?=?'1')?THEN ???????????????input_money_buf?<=?input_money_buf?+?"0101";--投幣5元 ????????????ELSIF?(coin_2_p?=?'1')?THEN ???????????????input_money_buf?<=?input_money_buf?+?"0010";--投幣2元 ????????????ELSIF?(coin_10_p?=?'1')?THEN ???????????????input_money_buf?<=?input_money_buf?+?"1010";--投幣10元 ????????????ELSE ???????????????input_money_buf?<=?input_money_buf; ????????????END?IF; ?????????ELSIF?(state?=?"100")?THEN ????????????input_money_buf?<=?"0000"; ?????????END?IF; ??????END?IF; ???END?PROCESS;
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在Basys2開發(fā)板驗(yàn)證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. Testbench
5. 仿真圖
整體仿真圖
按鍵下降沿輸出模塊仿真
售貨機(jī)控制模塊仿真,下圖select_p按下三次,最終選擇了7元商品(select_num=7),再按下確認(rèn)鍵(confirm_p=1)后開始投幣,先后投幣了1,2,5元,共8元(input_money=8),找零金額為refound_money=1。
數(shù)碼管顯示模塊仿真
7段數(shù)碼管對(duì)照編碼
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ??? ?--頂層模塊 ENTITY?auto_sell?IS ???PORT?( ??????clk_50M????????:?IN?STD_LOGIC;--50M時(shí)鐘 ??????reset_n????????:?IN?STD_LOGIC;--復(fù)位 ?????? ??????select_key_n???:?IN?STD_LOGIC;--商品選擇按鍵 ??????confirm_key_n??:?IN?STD_LOGIC;--確認(rèn)按鍵 ??????cancel_key_n???:?IN?STD_LOGIC;--取消按鍵 ??????coin_1_n???????:?IN?STD_LOGIC;--投幣1元 ??????coin_2_n???????:?IN?STD_LOGIC;--投幣2元 ??????coin_5_n???????:?IN?STD_LOGIC;--投幣5元 coin_10_n???????:?IN?STD_LOGIC;--投幣10元 ?????? ??????buy_succeed????:?OUT?STD_LOGIC;--購買成功 ??????bit_select?????:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0);--數(shù)碼管位選 ??????seg_select?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0)--數(shù)碼管段選 ???); END?auto_sell; ARCHITECTURE?trans?OF?auto_sell?IS --售貨控制模塊 component?sell_ctrl?IS ???PORT?( ??????clk????????????:?IN?STD_LOGIC; ??????reset_n????????:?IN?STD_LOGIC; ?????? ??????confirm_p??????:?IN?STD_LOGIC; ??????select_p???????:?IN?STD_LOGIC; ??????concel_p???????:?IN?STD_LOGIC; ?????? ??????coin_1_p???????:?IN?STD_LOGIC; ??????coin_2_p???????:?IN?STD_LOGIC; ??????coin_5_p???????:?IN?STD_LOGIC; coin_10_p???????:?IN?STD_LOGIC;--投幣10元 ?????? ??????buy_succeed????:?OUT?STD_LOGIC; ??????select_num?????:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0); ??????input_money????:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0); ??????refound_money??:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0) ???); END?component; --按鍵消抖模塊 component?key_jitter?IS ???PORT?( ??????clkin????????:?IN?STD_LOGIC; ??????key_in???????:?IN?STD_LOGIC; ??????key_negedge??:?OUT?STD_LOGIC ???); END?component; --顯示模塊 component?display?IS ???PORT?( ??????clk????????????:?IN?STD_LOGIC; ?????? ??????select_num?????:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0); ??????input_money????:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0); ??????refound_money??:?IN?STD_LOGIC_VECTOR(3?DOWNTO?0); ?????? ??????bit_select?????:?OUT?STD_LOGIC_VECTOR(3?DOWNTO?0); ??????seg_select?????:?OUT?STD_LOGIC_VECTOR(7?DOWNTO?0) ???); END?component; ???SIGNAL?select_num????????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?input_money???????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?refound_money?????:?STD_LOGIC_VECTOR(3?DOWNTO?0); ??? ???SIGNAL?confirm_p?????????:?STD_LOGIC; ???SIGNAL?select_p??????????:?STD_LOGIC; ???SIGNAL?concel_p??????????:?STD_LOGIC; ??? ???SIGNAL?coin_1_p??????????:?STD_LOGIC; ???SIGNAL?coin_2_p??????????:?STD_LOGIC; ???SIGNAL?coin_5_p??????????:?STD_LOGIC; SIGNAL?coin_10_p??????????:?STD_LOGIC; ??? ???--?Declare?intermediate?signals?for?referenced?outputs ???SIGNAL?buy_succeed_buf?:?STD_LOGIC; ???SIGNAL?bit_select_buf??:?STD_LOGIC_VECTOR(3?DOWNTO?0); ???SIGNAL?seg_select_buf??:?STD_LOGIC_VECTOR(7?DOWNTO?0); BEGIN ???--?Drive?referenced?outputs ???buy_succeed?<=?buy_succeed_buf; ???bit_select?<=?bit_select_buf; ???seg_select?<=?seg_select_buf; --調(diào)用按鍵消抖模塊??? ???i1_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?select_key_n, ?????????key_negedge??=>?select_p ??????); ??? ??? --調(diào)用按鍵消抖模塊??? ???i2_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?confirm_key_n, ?????????key_negedge??=>?confirm_p ??????); ??? ??? --調(diào)用按鍵消抖模塊??? ???i3_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?cancel_key_n, ?????????key_negedge??=>?concel_p ??????); ??? ??? --調(diào)用按鍵消抖模塊??? ???i4_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?coin_1_n, ?????????key_negedge??=>?coin_1_p ??????); ??? ??? --調(diào)用按鍵消抖模塊??? ???i5_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?coin_2_n, ?????????key_negedge??=>?coin_2_p ??????); ??? ??? --調(diào)用按鍵消抖模塊??? ???i6_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?coin_5_n, ?????????key_negedge??=>?coin_5_p ??????); --調(diào)用按鍵消抖模塊??? ???i7_key_jitter?:?key_jitter ??????PORT?MAP?( ?????????clkin????????=>?clk_50M, ?????????key_in???????=>?coin_10_n, ?????????key_negedge??=>?coin_10_p ??????); ??? ?--調(diào)用售貨控制模塊?? ???i_sell_ctrl?:?sell_ctrl ??????PORT?MAP?( ?????????clk????????????=>?clk_50M, ?????????reset_n????????=>?reset_n, ????????? ?????????confirm_p??????=>?confirm_p, ?????????select_p???????=>?select_p, ?????????concel_p???????=>?concel_p, ????????? ?????????coin_1_p???????=>?coin_1_p, ?????????coin_2_p???????=>?coin_2_p, ?????????coin_5_p???????=>?coin_5_p, coin_10_p??????=>?coin_10_p, ????????? ?????????buy_succeed????=>?buy_succeed_buf, ?????????select_num?????=>?select_num, ?????????input_money????=>?input_money, ?????????refound_money??=>?refound_money ??????); ??? ??? ?--調(diào)用顯示模塊?? ???i_display?:?display ??????PORT?MAP?( ?????????clk????????????=>?clk_50M, ????????? ?????????select_num?????=>?select_num, ?????????input_money????=>?input_money, ?????????refound_money??=>?refound_money, ????????? ?????????bit_select?????=>?bit_select_buf, ?????????seg_select?????=>?seg_select_buf ??????); ??? END?trans;
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=266