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

名称:自动售货机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

代码下载:自动售货机basys2开发板VHDL可改单价贩卖机自助机(代码在文末下载)软件:ISE语言:VHDL代码功能:自动售货机1、具有3元、6元、7元、9元的商品,通过按键选择商品2、可以投币1元、2元、5元、10元。3、购买成功后有led灯提示,且具有找零功能4、具有取消按键,可以取消购买,退回已投金额本代码商品单价及投币金额可以自行修改,相关代码如下--商品选择(1~3)名称:自动售货机basys2开发板VHDL可改单价贩卖机自助机(代码在文末下载)软件:ISE语言:VHDL代码功能:自动售货机1、具有3元、6元、7元、9元的商品,通过按键选择商品2、可以投币1元、2元、5元、10元。3、购买成功后有led灯提示,且具有找零功能4、具有取消按键,可以取消购买,退回已投金额本代码商品单价及投币金额可以自行修改,相关代码如下--商品选择(1~3) PROCESSicon-default.png?t=N7T8http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=266

设计文档:

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;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include<stdio.h> bool GetCharge(int Sum,int Money); void Getsmalcharge(int Money,int *ChargeNum); void main() { char state='N'; int Sum=0; char Pro; printf("\n********************************\n"); while(true) { state='N'; Sum=0; while(state=='N'||state=='n') { printf("\n输入购买物品(a,b,c):"); scanf("%c",&Pro;); getchar(); switch(Pro) { case 'a': Sum=Sum+1; break; case 'A': Sum=Sum+1; break; case 'b': Sum=Sum+5; break; case 'B': Sum=Sum+5; break; case 'c': Sum=Sum+10; break; case 'C': Sum=Sum+10; break; default: printf("\n输入物品有误!!!!\n"); break; }; printf("\n是否完成(Y/N):"); scanf("%c",&state;); getchar(); } int Money; printf("\n购买总价为:%d",Sum); bool st=false; while(!st) { printf("\n输入金额:"); scanf("%d",&Money;); getchar(); st=GetCharge(Sum,Money); }; printf("\n----------------购买结束------------\n"); printf("\n"); printf("\n"); printf("\n"); } } //---------------------------------------------------- bool GetCharge(int Sum,int Money) { int ChargeNum[4]; for(int i=0;i<4;i++) { ChargeNum[i]=0; } if(Sum>Money) { printf("\n金额不够,请重新输入....."); return false; } else if(Sum==Money) { printf("\n余额为0"); return true; } else { int Result=Money-Sum; Getsmalcharge(Result,ChargeNum); printf("\n余额为%d元,应找零\n1 元%d张\n2 元%d张\n5 元%d张\n10元%d张\n",Result,ChargeNum[0],ChargeNum[1],ChargeNum[2],ChargeNum[3]); }//end if return true; } //------------------------------------ void Getsmalcharge(int Money,int *ChargeNum) { if(Money<0) return; int Sum=Money; int charge[4]={1,2,5,10}; ChargeNum[3]=Sum/charge[3]; Sum=Sum%charge[3]; ChargeNum[2]=Sum/charge[2]; Sum=Sum%charge[2]; ChargeNum[1]=Sum/charge[1]; Sum=Sum%charge[1]; ChargeNum[0]=Sum/charge[0]; Sum=Sum%charge[0]; } 或者这个试试#include<stdio.h> main() { int x,n,y; float sum=0.0; printf("请选择: 1.日用品 2.文具 3. 食品\n"); scanf("%d",&x); switch(x) { case 1: printf("请选择:1.牙刷(3.5元/支) 2.牙膏(6.2元支)\n"); printf(" 3.肥皂(2元/块) 4.毛巾(8.6元/条)\n"); scanf("%d",&y); printf("数量?"); scanf("%d",&n); switch(y)/*匹配顾客选择的具体商品*/ { case 1: sum=3.5*n ; break; case 2: sum=6.2*n ; break; case 3: sum=2*n ; break; case 4: sum=8.6*n ; break; } break; case 2: printf("请选择:1.笔( 3元/支) 2.笔记本(1.2元/个)\n"); printf(" 3.文件夹(12元/个) 4.文具盒(8.6元/个)\n"); scanf("%c",&y); printf("数量?"); scanf("%d",&n); switch(y) { case 1: sum=3*n; break; case 2: sum=1.2*n; break; case 3: sum=12*n; break; case 4: sum=8.6*n; break; } break; case 3: printf("请选择:1.白糖(3.6元/包) 2.盐(1元/包)\n"); printf(" 3.饼(2元/个) 4.方便面(3.6元/条)\n"); scanf("%c",&y); printf("数量?"); scanf("%d",&n); switch(y) { case 1: sum=3.6*n; break; case 2: sum=1*n; break; case 3: sum=2*n; break; case 4: sum=3.6*n; break; } break; } printf("总计:%.2f 元\n",sum); }
数字中是一个基于isebasys2开发板设计的数字逻辑电路实验平台。通过数字中,学生可以学习数字逻辑设计的基本理论和实际操作。使用ise软件可以进行数字逻辑电路的设计、仿真和综合,而basys2开发板则可以用来验证电路设计的正确性和实际性能。 数字中的设计包括了基本的逻辑门、组合逻辑电路和时序逻辑电路实验,学生可以通过数字中进行基本的逻辑门实验,可以学习到与门、或门、非门等逻辑运算的基本原理和实现方式。同时,数字中也可以进行组合逻辑电路的设计和仿真,学生可以学习到多路选择器、译码器、加法器等组合逻辑电路的设计和实现。此外,数字中也可以进行时序逻辑电路的设计和仿真,学生可以学习到触发器、计数器、状态等时序逻辑电路的设计和实现。 通过数字中,学生可以在实验平台上进行逻辑电路的设计和验证,可以通过实际操作来加深对数字逻辑设计的理解和掌握。数字中的设计可以帮助学生快速掌握ise软件的使用方法,提高数字逻辑设计的实际操作能力。同时,数字中的实验设计也可以激发学生对数字逻辑设计的兴趣,培养学生的创新能力和实践能力。 综上所述,数字中是一个基于isebasys2开发板设计的数字逻辑电路实验平台,可以帮助学生学习和掌握数字逻辑设计的基本理论和实际操作,提高学生的实践能力和创新能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值