• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

自动售货机basys2开发板VHDL可改单价找零贩卖机自助机

05/23 11:06
711
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1-2311062209123F.doc

共1个文件

名称:自动售货机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开发板验证,开发板如下,其他开发板可以修改管脚适配:

basys2.png

演示视频:

设计文档:

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;

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=266

  • 1-2311062209123F.doc
    下载

相关推荐