名稱:VIVADO售貨機(jī)verilog代碼Nexys4開發(fā)板
軟件:VIVADO
語言:Verilog
代碼功能:
要求如下:
(1)售貨機(jī)有兩個進(jìn)幣孔,一個是輸入硬幣,一個是輸入紙幣,硬幣的識別范圍是1元的硬幣,紙幣的識別范圍是5元,10元,20元,50元。乘客可以連續(xù)多次投入錢幣。
(2)顧客可以選擇的商品種類有16 種,分別為A11-A44;價格如下表所示:
A11:3 A12: 4 A13:6 A14:3
A21:10 A22: 8 A23:9 A24: 7
A31: 4 A32:6 A33:15 A34: 8
A41: 9 A42: 4 A43:5 A44: 5
顧客可以通過輸入商品的編號來實現(xiàn)商品的選擇。比如依次按下2和1后,數(shù)碼管顯示商品A21的價格。
(1)顧客選擇完商品后,可以選擇需要的數(shù)量,數(shù)量為1-3件
(2)顧客可以繼續(xù)選擇商品及其數(shù)量,最多可選擇兩種商品。
(3)選擇完貨品,按確認(rèn)鍵確認(rèn)。如果沒有按確認(rèn)鍵,可以更改商品的種類和數(shù)量。
(4)系統(tǒng)計算并顯示出所需金額。
(5)顧客此時可以投幣,并且顯示已經(jīng)投幣的總幣值。當(dāng)投幣值達(dá)到或超過所需幣值后,售貨機(jī)出貨,并扣除所需金額,并找出多余金額。
(6)找零時需要手動找零,按一次退一張紙幣或硬幣,錢幣按從大到小的順序退出。比如需找零46元,則需要按四次手動找零鍵,每次退出的分別是20元(紙幣)、20元(紙幣)、5元(紙幣)、1元(硬幣)。
在投幣期間,顧客可以按取消鍵取消本次操作,可以按手動找零鍵退出硬幣。如果沒有退出,可以重新選擇貨品進(jìn)行交易。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在Nexys4開發(fā)板驗證,Nexys4開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
部分代碼展示:
//售貨機(jī) //空閑狀態(tài)下,按下BTNR,進(jìn)入商品1狀態(tài),設(shè)置SW567(種類第一位),和SW8910(種類第二位),選擇種類。 //再設(shè)置SW11,12設(shè)置數(shù)量。然后按BTNL進(jìn)入第二種商品的設(shè)置。 //進(jìn)入商品2狀態(tài),設(shè)置SW567(種類第一位),和SW8910(種類第二位),選擇種類。 //再設(shè)置SW11,12設(shè)置數(shù)量。 //再按BTNR進(jìn)入投幣狀態(tài)。按鍵SW0~SW4對應(yīng)金額。金額滿足后自動出貨,進(jìn)入找零狀態(tài)。 //按下BTNU找零 //按下BTND取消 module?auto_sell( input?clk,//100MHz input?reset_p,//復(fù)位--BTNC input?goods_btn_in,//商品1/2按鍵--BTNL input?confirm_btn_in,//確認(rèn)--BTNR input?change_btn_in,//找零按鍵--BTNU input?cancel_btn_in,//取消--BTND input?coin_1_in,//1元硬幣--SW0 input?notes_5_in,//5元紙幣--SW1 input?notes_10_in,//10元紙幣--SW2 input?notes_20_in,//20元紙幣--SW3 input?notes_50_in,//50元紙幣--SW4 input?[2:0]?type_SW1,//輸入商品的編號1--SW5,6,7 input?[2:0]?type_SW2,//輸入商品的編號2--SW8,9,10 input?[1:0]?num_SW,//輸入商品的數(shù)量--SW11,12 output?[3:0]?btn_LED,//按鍵指示燈 output?[5:0]?state_LED,//LD0~7 output?[7:0]?bit_select,//數(shù)碼管位選 output?[7:0]?seg_select//數(shù)碼管段選 ); assign?btn_LED={goods_btn_in,confirm_btn_in,change_btn_in,cancel_btn_in}; wire?[7:0]?need_money;//所需金額 wire?[7:0]?input_money;//投幣的總幣值 wire?[7:0]?change_money;//找出多余金額 wire?goods_btn;//商品1/2按鍵確認(rèn) wire?confirm_btn;//確認(rèn) wire?change_btn;//找零按鍵 wire?cancel_btn;//取消 wire?coin_1;//1元硬幣 wire?notes_5;//5元紙幣 wire?notes_10;//10元紙幣 wire?notes_20;//20元紙幣 wire?notes_50;//50元紙幣 key_jitter?i0_key_jitter( .?clkin(clk), .?key_in(goods_btn_in),//輸入 .?key_posedge(goods_btn)//消抖后按鍵上升沿 ); key_jitter?i1_key_jitter( .?clkin(clk), .?key_in(confirm_btn_in),//輸入 .?key_posedge(confirm_btn)//消抖后按鍵上升沿 ); key_jitter?i2_key_jitter( .?clkin(clk), .?key_in(change_btn_in),//輸入 .?key_posedge(change_btn)//消抖后按鍵上升沿 ); key_jitter?i3_key_jitter( .?clkin(clk), .?key_in(cancel_btn_in),//輸入 .?key_posedge(cancel_btn)//消抖后按鍵上升沿 ); key_jitter?i4_key_jitter( .?clkin(clk), .?key_in(coin_1_in),//輸入 .?key_posedge(coin_1)//消抖后按鍵上升沿 ); key_jitter?i5_key_jitter( .?clkin(clk), .?key_in(notes_5_in),//輸入 .?key_posedge(notes_5)//消抖后按鍵上升沿 ); key_jitter?i6_key_jitter( .?clkin(clk), .?key_in(notes_10_in),//輸入 .?key_posedge(notes_10)//消抖后按鍵上升沿 ); key_jitter?i7_key_jitter( .?clkin(clk), .?key_in(notes_20_in),//輸入 .?key_posedge(notes_20)//消抖后按鍵上升沿 ); key_jitter?i8_key_jitter( .?clkin(clk), .?key_in(notes_50_in),//輸入 .?key_posedge(notes_50)//消抖后按鍵上升沿 ); //控制模塊 sell_ctrl?i_sell_ctrl( .?clk(clk),//100MHz .?reset_p(reset_p),//復(fù)位 .?goods_btn(goods_btn),//商品1/2按鍵確認(rèn) .?confirm_btn(confirm_btn),//確認(rèn) .?change_btn(change_btn),//找零按鍵 .?cancel_btn(cancel_btn),//取消 .?coin_1(coin_1),//1元硬幣 .?notes_5(notes_5),//5元紙幣 .?notes_10(notes_10),//10元紙幣 .?notes_20(notes_20),//20元紙幣 .?notes_50(notes_50),//50元紙幣 .?type_SW1(type_SW1),//輸入商品的編號1 .?type_SW2(type_SW2),//輸入商品的編號2 .?num_SW(num_SW),//輸入商品的數(shù)量 .?need_money(need_money),//所需金額 .?input_money(input_money),//投幣的總幣值 .?change_money(change_money),//找出多余金額 .?state_LED(state_LED) ); //顯示模塊 display?i_display ( .?clk(clk), .?need_money(need_money),//所需金額 .?input_money(input_money),//投幣的總幣值 .?change_money(change_money),//找出多余金額 .?bit_select(bit_select),//數(shù)碼管位選 .?seg_select(seg_select)//數(shù)碼管段選 ); endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=369