名称:VIVADO售货机verilog代码Nexys4开发板(文末获取)
软件:VIVADO
语言:Verilog
代码功能:
要求如下
(1)售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是1元的硬币,纸币的识别范围是5元,10元,20元,50元。乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16 种,分别为A11-A44;价格如下表所示
A11:3A12: 4A13:6A14:3
A21:10A22: 8A23:9A24: 7
A31: 4A32:6A33:15A34: 8
A41: 9A42: 4A43:5A44: 5
顾客可以通过输入商品的编号来实现商品的选择。比如依次按下2和1后,数码管显示商品A21的价格。
(1)顾客选择完商品后,可以选择需要的数量,数量为1-3件
(2)顾客可以继续选择商品及其数量,最多可选择两种商品。
(3)选择完货品,按确认键确认。如果没有按确认键,可以更改商品的种类和数量。
(4)系统计算并显示出所需金额。
(5)顾客此时可以投币,并且显示已经投币的总币值。当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
(6)找零时需要手动找零,按一次退一张纸币或硬币,钱币按从大到小的顺序退出。比如需找零46元,则需要按四次手动找零键,每次退出的分别是20元(纸币)、20元(纸币)、5元(纸币)、1元(硬币)。
在投币期间,顾客可以按取消键取消本次操作,可以按手动找零键退出硬币。如果没有退出,可以重新选择货品进行交易。
本代码已在Nexys4开发板验证,Nexys4开发板如下,其他开发板可以修改管脚适配:
部分代码展示:
//售货机 //空闲状态下,按下BTNR,进入商品1状态,设置SW567(种类第一位),和SW8910(种类第二位),选择种类。 //再设置SW11,12设置数量。然后按BTNL进入第二种商品的设置。 //进入商品2状态,设置SW567(种类第一位),和SW8910(种类第二位),选择种类。 //再设置SW11,12设置数量。 //再按BTNR进入投币状态。按键SW0~SW4对应金额。金额满足后自动出货,进入找零状态。 //按下BTNU找零 //按下BTND取消 module auto_sell( input clk,//100MHz input reset_p,//复位--BTNC input goods_btn_in,//商品1/2按键--BTNL input confirm_btn_in,//确认--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,//输入商品的数量--SW11,12 output [3:0] btn_LED,//按键指示灯 output [5:0] state_LED,//LD0~7 output [7:0] bit_select,//数码管位选 output [7:0] seg_select//数码管段选 ); 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按键确认 wire confirm_btn;//确认 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),//复位 . goods_btn(goods_btn),//商品1/2按键确认 . confirm_btn(confirm_btn),//确认 . 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),//输入商品的数量 . 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),//数码管位选 . seg_select(seg_select)//数码管段选 ); endmodule
源代码
扫描文章末尾的公众号二维码