《基于FPGA的自动售货机课程设计《电子线路EDA》课程设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA的自动售货机课程设计《电子线路EDA》课程设计.doc(20页珍藏版)》请在三一办公上搜索。
1、绪论自动售货机(Vending Machine,VEM)是能根据投入的钱币自动付货的机器。自动售货机是商业自动化的常用设备,它不受时间、地点的限制,能节省人力、方便交易。是一种全新的商业零售形式,又被称为24小时营业的微型超市。能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。它能够在无人操作的情况下根据程序自动地销售商品。自动售货机不受工作时间及地点限制的特点,使其实现了一种提高营业额的同时又降低了成本的销售模式。进入21世纪之后,自动售货机的发展进一步加快,智能化的自动售货机正在逐步进入普通民众的生活之中,在未来,自动售货机的发展将会更加迅速,更加智能的自动售货机会让人们的生活更
2、加便利。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。因此,此次运用VHDL语言来实现一个简易的自动售货机是一个很有意义并且非常有乐趣的课题!关键词:自
3、动售货机 VHDL 1 课程设计实验要求1.1 初始条件设计一个自动售货机控制器,具有投币和选择商品等功能。可出售四种商品,分别为纯净水(2元)、可乐(4.5元)、牛奶(5元)、果汁(5.5元)。在购买过程中,采取投币方式,只能投入5元、10元或20元三种规格的纸币,且一次只能投入一张纸币。1.2 要求完成的主要任务1. 顾客通过按键选择某种商品后,由数码管显示该商品价格。顾客投币过程中,数码管显示投币额。2. 投币后,按下确认键,判断投币额是否足够,若投币额足够则根据顾客的要求自动售货并找零。若投币额不够,则报警5s并退钱。3. 投币后,按下取消键,则终止交易,自动退钱。4. 售货机还具有供
4、商家使用的累加卖货额的功能,由数码管显示累加的售出金额。5. 广泛调研,提出几种可行的方案,多方论证,确定设计方案。在仿真软件上完成设计和仿真。6. 按规定格式完成报告书。7. 近5年参考文献不少于5篇。2 程序设计思路2.1 方案论证及选择方案一:通过VHDL的状态机以及CASE语句进行编程,用6个状态分别表示商品选择、投币额累加、找零售货以及总销售额的累加等功能。但是由于对状态机的理解和应用并不是很熟练,并且程序相对比较复杂。方案二:通过一步一步的过程,按顺序将程序运行下去,并且用IF语句实现对售出金额的累加,完成目标要求。程序通俗易懂,按照大体的思路可以很容易的编出来,思路清晰。经比较,
5、方案二更能较好的完成对实验目标的实验,且编程部分相对比较简单。所以选择方案二作为最终的方案。2.2 系统组成框图根据设计要求,系统的组成框图如下图3-1所示。 时钟信号 控制器 按键 投币 译码 显示图2-1 系统的组成框图由图3-1可知,该系统主要由购物控制、译码显示两个部分构成。当有人需要购买物品时,首先选择所要购买的物品,这时,前三个数码显示管选中商品的单价。之后顾客投币进行购买,后两个数码显示管显示总共投入了多少钱。当按下确认键时,将在系统内部进行比较,比较单价和所投入的金额。若投币金额大于或等于该商品单价时,系统显示成功售出该商品并进行找零,即投币金额与商品单价的差值,然后将售出总额
6、加上这次的物品单价。若投币金额小于该商品单价时,系统显示购买失败,在报警5后退换投币金额,售出总额不变。无论哪种情况,完成后回到初始状态。2.3 程序流程图图2-2 系统的程序流程图 运行开始之后,由顾客选择商品,然后进行投币,此时若顾客选择取消按键,则立即执行退币,程序结束,若顾客选择的确定键,则进一步判断顾客的投币金额是够足够买所选商品,如果不够,则报警5S后退币并结束,若足够,则出货并且退币,程序结束。3 系统程序及各模块说明3.1 购物模块 购物模块分成三个部分,分别是选择商品部分,投币部分和确认或取消部分,选择商品有四种情况分别为纯净水(2元)、可乐(4.5元)、牛奶(5元)、果汁(
7、5.5元);投币有三种情况分别是5元10元和20元,确认或取消有两种情况,因为价格中有小数部分,所以导致其中的数据部分都可能含有小数部分,因此,此处选择将所有的价格以及投币均放大十倍,这样就消除了小数带来的影响。LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_logic_unsigned.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_signed.all;entity VendingMachine is -定义实体port(clk:in std_logic; btn_water
8、:in std_logic; -分别定义9个输入 btn_cola:in std_logic; btn_milk:in std_logic; btn_juice:in std_logic; money_5:in std_logic; money_10:in std_logic; money_20:in std_logic; btn_submit:in std_logic; btn_cancel:in std_logic; warn_out:out std_logic; -分别定义5个输出 price_out:out std_logic_vector(7 downto 0); money_out
9、:out std_logic_vector(7 downto 0); backmoney_out:out std_logic_vector(7 downto 0); sum_out:out std_logic_vector(7 downto 0) );end VendingMachine;architecture behav_vm of VendingMachine is -定义结构体signal cur_price:integer range 0 to 300;signal cur_money:integer range 0 to 300;signal btn_water_areg:std_
10、logic;signal btn_cola_areg:std_logic;signal btn_milk_areg:std_logic;signal btn_juice_areg:std_logic;signal money_5_areg:std_logic;signal money_10_areg:std_logic;signal money_20_areg:std_logic;signal btn_submit_areg:std_logic;signal btn_cancel_areg:std_logic;signal warn:std_logic;signal warn_count:in
11、teger range 0 to 100;-signal sum:integer range 0 to 300;beginclk_process:process(clk, money_5, money_10, money_20) variable sum:integer range 0 to 3000; - variable back_areg:integer range 0 to 3000; beginif clkevent and clk=1 thenbtn_water_areg = btn_water;if btn_water_areg = 0 and btn_water=1 then
12、-判断顾客选择的商品价格cur_price = 20;end if;btn_cola_areg = btn_cola;if btn_cola_areg = 0 and btn_cola=1 thencur_price = 45;end if;btn_milk_areg = btn_milk;if btn_milk_areg = 0 and btn_milk=1 thencur_price = 50;end if;btn_juice_areg = btn_juice;if btn_juice_areg = 0 and btn_juice=1 thencur_price = 55;end if;p
13、rice_out = conv_std_logic_vector(cur_price, 8); -将十进制的价格化为8位二进制表示的数money_5_areg = money_5;if money_5_areg = 0 and money_5=1 then -判断顾客投币金额 cur_money = cur_money + 50;end if;money_10_areg = money_10;if money_10_areg = 0 and money_10=1 thencur_money = cur_money + 100;end if;money_20_areg = money_20;if
14、 money_20_areg = 0 and money_20=1 thencur_money = cur_money + 200;end if;money_out = conv_std_logic_vector(cur_money, 8);btn_submit_areg = btn_submit;if btn_submit_areg = 0 and btn_submit=1 then -顾客按下确定键if cur_money cur_price then -投币不够warn = 1; -进入报警程序warn_out = 1;backmoney_out = conv_std_logic_vec
15、tor(cur_money, 8); -退币 else -投币够 backmoney_out =conv_std_logic_vector(cur_money - cur_price,8); sum := sum + cur_price; sum_out = conv_std_logic_vector(sum, 8); end if; cur_money = 0; cur_price = 0; end if;btn_cancel_areg = btn_cancel;if btn_cancel_areg = 0 and btn_cancel=1 then -顾客按下取消键 backmoney_o
16、ut =conv_std_logic_vector(cur_money,8);cur_price = 0;cur_money = 0;end if;if warn = 1 then -持续100个时钟周期的报警信号warn_count = warn_count + 1;if warn_count = 100 thenwarn = 0;warn_out = 0;warn_count = 0;end if;end if; end if; end process clk_process;end behav_vm;图3-1 购物模块芯片该购物模块的集成芯片如图4-1所示:输入一共有9个不同的信号,输出
17、4个信号3.2 译码显示模块 译码显示模块的输入是三个八位的std_logic_vector信号,分别是商品价格price_out,投币金额money_out以及总营业额sum_out,因为题目要求是将商品价格,投币金额以及总营业额都可以显示出来,所以,需要对三个信号进行译码,并将译码后的信号分别送入三段数码管,即将每个8位的输入信号用三个数码管显示,每一位数码管显示一个数字,因此一共定义了三个输出,即putout_h,putout_m以及putout_l,分别对应不同的数位,程序如下:LIBRARY IEEE;USE IEEE.std_logic_1164.all;USE IEEE.std_
18、logic_unsigned.all;USE IEEE.std_logic_arith.all;USE IEEE.std_logic_signed.all;entity xianshi isport(putin:in std_logic_vector(7 downto 0);-输入为8位std_logic_vector clk:in std_logic; putout_h:out std_logic_vector(6 downto 0);-输出为三个数码管 putout_m:out std_logic_vector(6 downto 0); putout_l:out std_logic_vec
19、tor(6 downto 0) );end xianshi;architecture a of xianshi issignal money:integer range 0 to 255;signal money_h:integer range 0 to 9;signal money_m:integer range 0 to 9;signal money_l:integer range 0 to 9;beginprocess begin wait until clkevent and clk=1; money=conv_integer(putin(7)*128-将输入的8位二进制数字转化成 +
20、conv_integer(putin(6)*64 -十进制的数字 +conv_integer(putin(5)*32 +conv_integer(putin(4)*16 +conv_integer(putin(3)*8 +conv_integer(putin(2)*4 +conv_integer(putin(1)*2 +conv_integer(putin(0); money_h=(money/100); -提取最高位 money_m=(money/10) rem 10; -提取中间位 money_lputout_hputout_hputout_hputout_hputout_hputout_
21、hputout_hputout_hputout_hputout_hputout_hputout_mputout_mputout_mputout_mputout_mputout_mputout_mputout_mputout_mputout_mputout_mputout_lputout_lputout_lputout_lputout_lputout_lputout_lputout_lputout_lputout_lputout_l=0000000;end case;end process;end a;图3-2译码显示模块芯片此模块输入为8位的二进制数,输出为三个用于点亮数码管的7位二进制数3.
22、3 系统模块连接图3-3 系统模块连接总图由图4-4中可以看到,九个代表不同意思的输入端口接入到购物模块上,从购物模块输出的三个端口分别连接在两个二进制译码显示器上,再将二进制译码器的输出端连接到数码显示管上,用来显示商品单价、投币金额和售出总额。其中的找零金额因未要求显示,所以只给出了找零的金额并没有显示出来。4. 程序运行及调试4.1 购物模块仿真 购物过程中一共有三种情况发生:1.选择商品后并且投币金额大于商品价格,按下确认键后,购物成功,找零并将售货额加入总售货额中图4-1 购物成功仿真图 由仿真结果图可以看出,此时选择了橙汁(5.5元)此时价格显示price_out显示为55,(5.
23、5元),在投币10元之后,可以看到投币金额money_out为100(10元),按下确定之后,立刻将价格显示和投币金额清零,完成退币和统计售货额,可以看到退币金额backmoney_out为45(4.5元)正好等于投币的金额减去商品的价格,总售货额sum_out为55(即此次购物的5.5元),可以看出程序正确地得出了结果。 2.选择商品之后投币金额小于商品价格,此时应该在报警五秒之后完成退币,将商品价格和投币金额清零,售货总额不变化。图4-2投币金额不够仿真图由图5-2可以看出,当选择橙汁(5.5元),此时价格显示price_out显示为55,(5.5元),在投币5元之后,可以看到投币金额mo
24、ney_out为50(5元),按下确定键之后,立刻将价格显示和投币金额清零,但是因为投币金额小于商品所需价格,所以报警信号开始了报警,即warn_out开始了一串总长度为5S的报警信号,然后退币金额为全部的投币金额50(5元),总售货额sum_out还是为原来的5.5元,并没有改变。此情况下工作也正常。3.选择商品投币后,按下的是取消键,此时将投币金额送入退币金额,总售货额sum_out不做改变,然后将商品金额和投币金额清零。图4-3选货投币之后按取消键仿真图当选择商品为牛奶,此时显示价格为5元,并投币10元,显示的投币金额也为10元,在按下取消键之后,退币金额backmoney_out为10
25、元,售货总额sum_out还是为原来的5.5元不变,完成之后将商品价格和投币金额清零。4.2 译码显示模块仿真选择用来译码的是购物成功的情况,此时选择商品橙汁(5.5元)并投币10元,此时的仿真结果如下:图4-4译码显示部分仿真图 由图5-3可以看出,此时选择的商品是橙汁.为5.5元,因此三个数码管应分别显示0,5,5,因为是共阴极数码管显示,所以对应的三个数码管的二进制序列为Price_h:0111111,price_m:1101101,price_l:1101101,分别对应数字0,5,5。投币金额是10元,所以三个数码管应分别显示1,0,0可以看出money_h:0000110 ,mon
26、ey_m:0111111,money_l:0111111,分别显示的正好是1,0,0,同理我们也可以看出sumout的三个数码管显示的售货总额正好是055,即此次购物成功的5.5元,至此译码显示部分成功实现了预期功能。5. 总结与体会在刚开始做这个课程设计的时候,我感觉无从下手,因为对于VHDL语言掌握得并不是很熟练并且大多都忘记了,除此之外Quartus软件也是第一次用,关于软件的用法也一度成为了难题。VHDL语言有限状态机设计控制电路,可大大降低设计难度和时间,提高设计效率和可靠性,利用语言的灵活性及功能强大的EDA工具,可以轻松完成硬件的功能扩充与升级,还可以实现更复杂的数字系统,整个设
27、计过程相对于传统的设计方法,有较大的突破。VHDL语言作为现代数字系统的重要设计工具,以其灵活、简洁的设计风格在电路设计中发挥着越来越重要的作用。通过此次课程设计,我除了加深对VHDL语言的了解之外,还学会了如何运用用Quartus编程作图,掌握了软件硬件的综合应用,当然更重要的是在课程设计的过程中,是老师的殷切指导以及同学的热心帮助,并最终自己完成了此次课题,所以,这次课程设计我感觉除了巩固了VHDL编程知识之外,还对运用Quartus软件有了更加深入的了解,可以说是受益匪浅!参考文献1徐志军,王金明等.EDA技术与VHDL设计.北京:电子工业出版社,2009.12 梁瑞宇 编写FPGA设计
28、实验指导书(Verilog HDL)3潘松,黄继业.EDA技术实用教程.北京:科学出版社,20094周润景.基于Quartus II的FPGA/CPLD数字系统设计实例.北京:电子工业出版社,20105李青. EDA技术在电子线路实训教学中的运用.活力,2011,13:3-146郑燕.基于VHDL与Quartus软件的可编程逻辑器件应用与开发.北京:国防工业出版社,20117 夏宇闻 编著 Verilog数字系统教程 北京航空航天出版社绪论11 课程设计实验要求21.1 初始条件21.2 要求完成的主要任务22 程序设计思路22.1 方案论证及选择22.2 系统组成框图32.3 程序流程图43 系统程序及各模块说明53.1 购物模块53.2 译码显示模块103.3 系统模块连接134. 程序运行及调试144.1 购物模块仿真144.2 译码显示模块仿真175. 总结与体会18参考文献19