My title page contents

自动售货机控制系统设计-VHDL-QuartusII

 自动售货机控制系统设计-VHDL-QuartusII

 名称:自动售货机控制系统-VHDL-QuartusII

软件:Quartus II

语言:VHDL

 

商品自动售货机

1、支持投币1元、2元、5元

2、具有单价1元、2元、3元的商品,通过按键选择商品

3、选中后确认,开始投币,若投币金额大于单价则自动出货并找零

4、投币过程中可以取消,退回所投金额

5、数码管显示购买状态(单价,投币金额,找零金额),led指示购买成功


设计文档:

设计文档.doc


    





1、工程文件

 

2、程序文件

 

 

 

3、程序编译

 

4、RTL图

 

5、仿真图

整体仿真图

 

按键消抖模块

 

控制模块

 

显示模块

部分代码展示:

--售货控制模块
LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;

ENTITY 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;--投币1
      coin_2_p       : IN STD_LOGIC;--投币2
      coin_5_p       : IN STD_LOGIC;--投币5
      
      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 sell_ctrl;

ARCHITECTURE trans OF sell_ctrl IS
   
   SIGNAL need_money_buf    : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000";
   SIGNAL input_money_buf   : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000";
   SIGNAL refound_money_buf : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000";
   
   SIGNAL state             : STD_LOGIC_VECTOR(2 DOWNTO 0) := "000";
   
   SIGNAL buy_succeed_buf   : STD_LOGIC := '0';
BEGIN
   select_num <= need_money_buf;
   input_money <= input_money_buf;
   refound_money <= refound_money_buf;
	--状态转换
   PROCESS (clk, reset_n)
   BEGIN
      IF (reset_n = '0') THEN
         state <= "000";
      ELSIF (clk'EVENT AND clk = '1') THEN
         CASE state IS
            WHEN "000" =>
               state <= "001";
            WHEN "001" =>--选择票价
               IF (confirm_p = '1') THEN
                  state <= "010";
               ELSE
                  state <= "001";
               END IF;
            WHEN "010" =>--投币
               IF (input_money_buf >= need_money_buf) THEN
                  state <= "011";
               ELSIF (concel_p = '1') THEN
                  state <= "011";
               ELSE
                  state <= "010";
               END IF;
            WHEN "011" =>--找零
               IF (confirm_p = '1') THEN
                  state <= "100";
               ELSE
                  state <= "011";
               END IF;
            WHEN "100" =>--结束
               state <= "000";
            WHEN OTHERS =>
               state <= "000";
         END CASE;
      END IF;
   END PROCESS;
   
	--票价选择(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
               IF (need_money_buf >= "0011") THEN
                  need_money_buf <= "0001";
               ELSE
                  need_money_buf <= need_money_buf + "0001";
               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";
            ELSIF (coin_5_p = '1') THEN
               input_money_buf <= input_money_buf + "0101";
            ELSIF (coin_2_p = '1') THEN
               input_money_buf <= input_money_buf + "0010";
            ELSE
               input_money_buf <= input_money_buf;
            END IF;
         ELSIF (state = "100") THEN
            input_money_buf <= "0000";
         END IF;
      END IF;
   END PROCESS;
   
   buy_succeed <= (buy_succeed_buf);--购买成功
	--找零计算
   PROCESS (clk, reset_n)
   BEGIN
      IF (reset_n = '0') THEN
         refound_money_buf <= "0000";
         buy_succeed_buf <= '0';
      ELSIF (clk'EVENT AND clk = '1') THEN
         IF (state = "011") THEN
            IF (input_money_buf >= need_money_buf) THEN
               refound_money_buf <= input_money_buf - need_money_buf;
               buy_succeed_buf <= '1';
            ELSE
               refound_money_buf <= input_money_buf;
               buy_succeed_buf <= '0';
            END IF;
         ELSIF (state = "100") THEN
            refound_money_buf <= "0000";
            buy_succeed_buf <= '0';
         END IF;
      END IF;
   END PROCESS;
   
   
END trans;

代码下载(付费可见)



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 自动售货机控制系统设计-VHDL-QuartusII

发表评论

模板文件不存在: ./template/plugins/comment/pc/index.htm

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员