EDA技术及应用实习报告
自动售卖机
信息13-2班06号
GMH
北华大学电气信息工程学院
目 录
一、设计任务功能简介... 3
1、设计任务... 3
2、主要功能... 3
二、原理、方案、框图及任务分解... 3
1、原理... 3
2、方案... 4
3、框图... 4
4、任务分解... 5
三、关键任务的设计代码及注释... 5
四、调试中出现的问题及解决方案... 7
1、问题一... 7
2、问题二... 7
五、产业化市场分析及预测... 7
六、测试及运行结果... 8
七、参考文献... 10
一、设计任务功能简介
1、设计任务
自动售货机设计。利用软件QuartusII软件,使用VHDL语言结合硬件要求对本题目设计功能进行编程,并在完成整个硬件程序设计后,在软件平台上进行编译和电路仿真,最后生成的目标文件下载到DE2-70实验板上实现上述所有功能并验证程序的可行性。
2、主要功能
本设计主要实现的功能为:货物信息存储功能、商品选择功能、输入钱数处理功能、货架商品更换功能、语音提示功能、信息显示等功能。
二、原理、方案、框图及任务分解
1、原理
自动售货机(Vending Machine,VEM)是能根据投入的钱币自动付货的机器。自动售货机是商业自动化的常用设备,它不受时间、地点的限制,能节省人力、方便交易。是一种全新的商业零售形式,又被称为24小时营业的微型超市。能分为三种:饮料自动售货机、食品自动售货机、综合自动售货机。自动售货机是台机电一体化的自动化装置,在接受到货币已输入的前提下,靠触摸控制按 扭输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。
2、方案
根据题目要求机器设有2个投币孔,机器可以接受1元和5元的纸币,分别有八种商品,价格分别为1元,4元,2元,3元,6元, 7元,5元,8元,机器采用拨码开关模拟机器的复位键、确认购买键和商品选择,并且通过开发板上的LED等分别显示购买的不同情况,数码管实时显示购买金额,包括投入的价钱,找零的价钱。此设计按照EDA课程设计 的流程进行源代码的编写、仿真。本设计主要利用QuartusⅡ等设计软件进行设计。
3、框图
依题目要求设计流程框图如下所示:
图 2-1 程序流程图
4、任务分解
本设计主要包括按键模块、显示模块、语音提示模块。设计程序任务如下图:
图2-2 程序任务图
任务一:存储商品信息。商品名称及商品价格等信息。
任务二:响应用户选择商品的操作。用户用过按键选择商品,售卖机要实时显示商品名称及价格信息。
任务三:货币处理。待用户选择商品结束,售卖机要接收用户投币,包括判断纸币的面额、总金额、是否投币结束等信息。
任务四:人性化设计。售卖机要有良好的人性化交互界面,以及必要的文字、语音等提示信息。
三、关键任务的设计代码及注释
商品选择进程设计:
data:process(START,sel_add)
begin
if START='1' then
f sel_add'event and sel_add='1' then item<=item+1;
if item ="000" then item_dis <="11000000";money_dis<="10011001";
elsif item ="001" then item_dis <="11111001";money_dis<="11111000";
elsif item ="010" then item_dis <="10100100";money_dis<="10100100";
elsif item ="011" then item_dis <="10110000";money_dis<="10110000";
elsif item ="100" then item_dis <="10011001";money_dis<="11111001";
elsif item ="101" then item_dis <="10010010";money_dis<="10011001";
elsif item ="110" then item_dis <="10000010";money_dis<="10110000";
elsif item ="111" then item_dis <="11111000";money_dis<="10000000";
end if;
end if;
else item_dis<="11111111";money_dis<="11111111";price <="0000";
end if; end process data;
----------------------------------------------------------------------------------------------------------------------
付钱进程设计:
pay:process(finish ,one,five)
begin if finish='1' then
if one'event and one ='1' then pay_money_one<=pay_money_one+1;
if five'event and five ='1' then pay_money_five<=pay_money_five+5; end if;
pay_money <= pay_money_five+pay_money_one;
case pay_money is
when "0000" => pay_money_dis_g <= "11000000";pay_money_dis_s <= "11000000";
when "0001" => pay_money_dis_g <= "11111001";pay_money_dis_s <= "11000000";
when "0010" => pay_money_dis_g <= "10100100";pay_money_dis_s <= "11000000";
when "0011" => pay_money_dis_g <= "10110000";pay_money_dis_s <= "11000000";
when "0100" => pay_money_dis_g <= "10011001";pay_money_dis_s <= "11000000";
when "0101" => pay_money_dis_g <= "10010010";pay_money_dis_s <= "11000000";
when "0110" => pay_money_dis_g <= "10000010";pay_money_dis_s <= "11000000";
when "0111" => pay_money_dis_g <= "11111000";pay_money_dis_s <= "11000000";
when "1000" => pay_money_dis_g <= "10000000";pay_money_dis_s <= "11000000";
when "1001" => pay_money_dis_g <= "10010000";pay_money_dis_s <= "11000000";
when "1010" => pay_money_dis_g <= "11000000";pay_money_dis_s <= "11111001";
when "1011" => pay_money_dis_g <= "11111001";pay_money_dis_s <= "11111001";
when "1100" => pay_money_dis_g <= "10100100";pay_money_dis_s <= "11111001";
when "1101" => pay_money_dis_g <= "10110000";pay_money_dis_s <= "11111001";
when "1110" => pay_money_dis_g <= "10011001";pay_money_dis_s <= "11111001";
when "1111" => pay_money_dis_g <= "10010010";pay_money_dis_s <= "11111001";
when others => pay_money_dis_g <="11000000"; pay_money_dis_s <= "11000000";
end case;
if pay_money >= price then
back <= pay_money-price;
case back is
when "0000" => money_back_dis <= "11000000";
when "0001" => money_back_dis <= "11111001";
when "0010" => money_back_dis <= "10100100";
when "0011" => money_back_dis <= "10110000";
when "0100" => money_back_dis <= "10011001";
when "0101" => money_back_dis <= "10010010";
when "0110" => money_back_dis <= "10000010";
when "0111" => money_back_dis <= "11111000";
when "1000" => money_back_dis <= "10000000";
when "1001" => money_back_dis <= "10010000";
when others => money_back_dis <="11000000";
------------------------------------------------------------------------------------
声音提示进程设计:
int:process(START,finish)
begin
if START ='1' and finish = '0' then sound<="01";
elsif START ='1' and finish = '1' then sound<="10";
elsif START ='0' and finish = '0' then sound<="11";
end if;
end process int;
------------------------------------------------------------------------------------
end architecture behav;
四、调试中出现的问题及解决方案
1、问题一
问题描述:本设计语音芯片采用LJ600, 选择扬声器输出模式,可存储6段语音片段,对应6个引脚下降沿触发且低电平至少维持1ms,语音触发之后必须处于高电平状态,否则影响其他语音输出。综上描述,触发信号应为一个门信号。由于系统未引入时钟,且在同一进程中不可对输出信号重复赋值,产生问题。
解决办法:代码如下图,在if语句中实现状态跳转。
2、问题二
变量初始化状态必须明确定义高低电平。即状态输出时,必须考虑高低电平两种状态,不可以出现不确定状态。完全按照语法要求。
五、产业化市场分析及预测
随着信息技术的发展及人们生活水平的不断提高,人们的消费观念及消费需求都在不断地改变和提高。自动售卖机正是为了满足人们的这种需求而在多年前被引入国内的。但早期的自动售卖机在国内并未获得预期的市场反应及消费者的广泛使用。现阶段大多数的自动售卖机只投放在国内一线城市,销售的货品也只停留在零食、饮料、饮用水、计生用品等有限的几样品种。
在零售业市场竞争日趋白热化的今天,压缩经营成本是增强企业市场竞争力的一个主要手段。然而无论是连锁超市还是便利店,日益高涨的店面租金及人力成本,已经成为他们无法忽视也无法回避的沉重负担。而自动售卖机却完全没有上述所说的麻烦,它24小时营业、售货便利、方便找零,占地面积小(一般仅需1平方米)、移动性强,无须常驻人员盯守、省人工成本,时尚新颖、个性独特、集高科技于一体,有利于树立品牌形象,养护费用低,日常免维护……这些优势势必引领潮流,使得自动售卖机日发成为市场新宠,在零售业市场占领一席之地。
六、测试及运行结果
售卖机整体结构如下图所示:
图6-1 整体结构
商品0的价格为4元。
商品1价格为7元。
商品7价格为8元,输入11元,找零3元。
商品选择按钮及确定按键。
七、参考文献
[1]潘松,黄继业. EDA技术与VHDL. 第4版. 北京:清华大学出版社,2013.4
[2]潘松,王国栋. VHDL实用教程(修订版). 成都:成都电子科技大学出版社,2001
[3]曾繁泰,陈美金. VHDL程序设计. 北京:清华大学出版社,2001.1