名称:自动售货机basys2开发板VHDL可改单价贩卖机自助机
软件:ISE
语言:VHDL
代码功能:
自动售货机
1、具有3元、6元、7元、9元的商品,通过按键选择商品
2、可以投币1元、2元、5元、10元。
3、购买成功后有led灯提示,且具有找零功能
4、具有取消按键,可以取消购买,退回已投金额
本代码商品单价及投币金额可以自行修改(二进制表示),相关代码如下
--商品选择(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; --投币累计 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开发板验证,开发板如下,其他开发板可以修改管脚适配:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. Testbench
5. 仿真图
整体仿真图
按键下降沿输出模块仿真
售货机控制模块仿真,下图select_p按下三次,最终选择了7元商品(select_num=7),再按下确认键(confirm_p=1)后开始投币,先后投币了1,2,5元,共8元(input_money=8),找零金额为refound_money=1。
数码管显示模块仿真
7段数码管对照编码
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; --顶层模块 ENTITY auto_sell IS PORT ( clk_50M : IN STD_LOGIC;--50M时钟 reset_n : IN STD_LOGIC;--复位 select_key_n : IN STD_LOGIC;--商品选择按键 confirm_key_n : IN STD_LOGIC;--确认按键 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);--数码管位选 seg_select : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)--数码管段选 ); 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; --调用按键消抖模块 i1_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => select_key_n, key_negedge => select_p ); --调用按键消抖模块 i2_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => confirm_key_n, key_negedge => confirm_p ); --调用按键消抖模块 i3_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => cancel_key_n, key_negedge => concel_p ); --调用按键消抖模块 i4_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => coin_1_n, key_negedge => coin_1_p ); --调用按键消抖模块 i5_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => coin_2_n, key_negedge => coin_2_p ); --调用按键消抖模块 i6_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => coin_5_n, key_negedge => coin_5_p ); --调用按键消抖模块 i7_key_jitter : key_jitter PORT MAP ( clkin => clk_50M, key_in => coin_10_n, key_negedge => coin_10_p ); --调用售货控制模块 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 ); --调用显示模块 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;