基于VHDL自动售货机的设计
一,概述
随着科技的发展和社会的进步,自动化商业机械有了越来越广泛的应用,自动售货机作为自动化商业机械的代表被广泛用于公共场所自动售货,给人们的生活带来了极大的方便。特别在发达国家,自动售货机已经十分普及,自动售货机可售出各种成型包装小商品,各种袋装,盒装,软瓶装等小商品。因其无需专人值守而可以每天24小时售货,被称为“无人小超市”。在我国,由于多种原因,自动售货机的市场推广缓慢,处于培育阶段,但可以预见,这种方便快捷的服务形式因其适合现代生活快节奏的需要,在不久的将来必会获得大众的喜爱。随着商品市场的不断繁荣,自动售货机和自动服务设施必将逐步得到广泛的应用。
本文设计的自动售货机是基于VHDL(Very High Speed Integrated Circuit Hard-ware Description Language,超高速集成电路硬件描述语言)语言,使用MAXPLUSⅡ软件进行模拟仿真,在FPGA(Field Programmable Gate Arry,现场可编程门阵列)可编程芯片上实现的一款EDA(Electronic Design Automation,电子设计自动化)技术的产品。
二,系统方案
本文设计的自动售货机有4种饮料可以出售,售货机可以识别1元,5元两种货币。如果投入金额总值等于或超过售价就可以将饮料放出,并具有相应的找零钱功能。
(1)用户可多次选择购买的饮料种类,某次饮料种类选定后等待投币。如等待时间超过10秒钟,则认为用户放弃选购,售货机自动回到等待状态,等待新的交易。若在10秒内,再次选中饮料,则再次等待。
1
(2)每次交易完成,售货机自动回到等待状态,等待新的交易。
(3)具有指示电路,分别指示购买成功、交易取消(交易失败)和找零。
(4)相应显示有延时和时控功能。
三,系统设计
自动售货机VHDL程序如下:
--文件名:pl_auto1.vhd。
--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
--说明:显示的钱数coin的 以5角为单位。
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_auto1 is
2
port ( clk:in std_logic; --系统时钟
set,get,sel,finish: in std_logic; --设定、买、选择、完成信号
coin0,coin1: in std_logic; --5角硬币、1元硬币
price,quantity :in std_logic_vector(3 downto 0); --价格、数量数据
item0 , act:out std_logic_vector(3 downto 0); --显示、开关信号
y0,y1 :out std_logic_vector(6 downto 0); --钱数、商品数量显示数据
act10,act5 :out std_logic); --1元硬币、5角硬币
end PL_auto1;
architecture behav of PL_auto1 is
type ram_type is array(3 downto 0)of std_logic_vector(7 downto 0);
signal ram :ram_type; --定义RAM
signal item: std_logic_vector(1 downto 0); --商品种类
signal coin: std_logic_vector(3 downto 0); --币数计数器3
signal pri,qua:std_logic_vector(3 downto 0); --商品单价、数量
signal clk1: std_logic; --控制系统的时钟信号
begin
com:process(set,clk1)
variable quan:std_logic_vector(3 downto 0);
begin
if set='1' then ram(conv_integer(item))<=price & quantity;act<=\"0000\";
--把商品的单价、数量置入到RAM
elsif clk1'event and clk1='1' then act5<='0'; act10<='0';
if coin0='1' then
if coin<\"1001\"then coin<=coin+1; --投入5角硬币,coin自加1
else coin<=\"0000\";
end if;
4
elsif coin1='1' then
if coin<\"1001\"then coin<=coin+2; --投入1元硬币,coin自加2
else coin<=\"0000\";
end if;
elsif sel='1' then item<=item+1; --对商品进行循环选择
elsif get='1' then --对商品进行购买
if qua>\"0000\" and coin>=pri then coin<=coin-pri;quan:=quan-1;
ram(conv_integer(item))<=pri & quan;
if item=\"00\" then act<=\"1000\"; --购买时,自动售货机对4种商品的操作
elsif item=\"01\" then act<=\"0100\";
elsif item=\"10\" then act<=\"0010\";
elsif item=\"11\" then act<=\"0001\";
end if;
5
end if;
elsif finish='1' then --结束交易,退币(找币)
if coin>\"0001\" then act10<='1';coin<=coin-2; --此IF语句完成找币操作
elsif coin>\"0000\" then act5<='1'; coin<=coin-1;
else act5<='0'; act10<='0';
end if;
elsif get='0' then act<=\"0000\";
for i in 4 to 7 loop
pri(i-4)<=ram (conv_integer(item))(i); --商品单价的读取
end loop;
for i in 0 to 3 loop
quan(i):=ram(conv_integer(item))(i); --商品数量的读取
end loop;
6
end if;
end if;
qua<=quan;
end process com;
m32:process(clk) --此进程完成对32Mhz的脉冲分频
variable q: std_logic_vector( 24 downto 0);
begin
if clk'event and clk='1' then q:=q+1;
end if;
if q=\"111111111111111111111111\" then clk1<='1';
else clk1<='0';
end if;
end process m32;
7
code0:process(item) --商品指示灯译码
begin
case item is
when \"00\"=>item0<=\"0111\";
when \"01\"=>item0<=\"1011\";
when \"10\"=>item0<=\"1101\";
when others=>item0<=\"1110\";
end case;
end process;
code1: process (coin) begin
case coin is
when \"0000\"=>y0<=\"0000001\";
--钱数的BCD到七段码的译码8
when \"0001\"=>y0<=\"1001111\";
when \"0010\"=>y0<=\"0010010\";
when \"0011\"=>y0<=\"0000110\";
when \"0100\"=>y0<=\"1001100\";
when \"0101\"=>y0<=\"0100100\";
when \"0110\"=>y0<=\"0100000\";
when \"0111\"=>y0<=\"0001111\";
when \"1000\"=>y0<=\"0000000\";
when \"1001\"=>y0<=\"0000100\";
when others=>y0<=\"1111111\";
end case;
end process;
code2: process (qua) 单价的BCD到七段码的译码9
--
begin
case qua is
when \"0000\"=>y1<=\"0000001\";
when \"0001\"=>y1<=\"1001111\";
when \"0010\"=>y1<=\"0010010\";
when \"0011\"=>y1<=\"0000110\";
when \"0100\"=>y1<=\"1001100\";
when \"0101\"=>y1<=\"0100100\";
when \"0110\"=>y1<=\"0100000\";
when \"0111\"=>y1<=\"0001111\";
when \"1000\"=>y1<=\"0000000\";
when \"1001\"=>y1<=\"0000100\";
when others=>y1<=\"1111111\";
10
end case;
end process;
end behav;
四,仿真模型
图 1 系统仿真全图
11
图 2 系统仿真图-预置部分
12
图 3 系统仿真图-商品种类选择部分
13
图 4 系统仿真图-投币部分
14
图 5 系统仿真图-购买、找币结束交易部分
五,总结
自动售货机系统的设计已全部完成,能按预期的效果进行多次购买、找零出货、并且在数码管上显示出已投货币、还需金额、找零,同时有指示灯提示交易成功、交易失败、正在找零。在设计过程中还需改进的是在选择商品时不能按键过长,否则会认为是重复选择。本文所用的VHDL语言虽然语法规则与其他计算机高级语言如C语言在很多方面很类似,但它毕竟是硬件描述语言,其本质作用在于描述硬件,因而会受到硬件环境的限制。因此,为了达到设计的预期效果,在代码编写前,应做到对硬件电路心中有数,不能一味地追求代码的完美,而应该以实现的硬件电路的性能优劣为标准。
15
通过本次课程设计,我收获了很多,上课学的理论知识得到了应用和巩固,起初,我对这个课题一点思绪也没有,但是后来通过上网查资料,问同学等一系列方法,终于把它做了出来,不骄不躁,就总会做出点东西。
六,参考文献
[1] 李仁发,凌纯清,徐成.VHDL数字系统设计(第二版). 北京:电子工业出版社出版. 2007
[2] 甘历 VHDL应用于开发实践. 北京:科学出版社.2003
[3] Mark Zwolinski Digital System Design with VHDL.BeiJing:Publishing House of Electronics Industry.2007
[4]王晓峰.电子设计的EDA技术应用[J].长春师范学院学报:自然科学版,2005,24(5):55—56.
[5]DOULOS A.The designer S guide to VHDL[EB/OL].[2007—06—06].
[6]侯伯亨.VHDL硬件描述语言与数字逻辑电路设计[M].陕西:西安电子科技大学出版社,1999.东方人华.MAX+PLUS I1入门与提高[M].北京:清华大学出版社,2004
16
因篇幅问题不能全部显示,请点此查看更多更全内容