自动售货机VHDL程序与仿真
- 格式:docx
- 大小:175.23 KB
- 文档页数:9
自动售货机的VHDL 设计2013-9-10一、设计目标自动售货机设计FPGA 模块模拟自动售货机的工作过程,要求如下(1)售货机有两个进币孔,可以输入硬币和纸币,售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是1元的硬币,纸币的识别范围是5 元,10 元,20,50 元,100 元。
乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16 种,价格分别为1-16 元,顾客可以通过输入商品的编号来实现商品的选择。
即有一个小键盘(0-9 按键)来完成,比如输入15 时要先输入1,再输入5。
(3)顾客选择完商品后,可以选择需要的数量。
然后可以继续选择商品及其数量,每次可以选择最多三个商品。
然后显示出所需金额。
顾客此时可以投币,并且显示已经投币的总币值。
当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
二、设计方案本设计方案采用Moore型状态机的设计方案,将整个实现过程拆分成10个具体的状态,个状态描述及相互间的转换关系如下:1、start(系统初始化)系统处于start状态时,当时钟下降沿来临时对进程中数字/数量的高低位临时储存变量进行清零工作,为后续的售货过程做准备,完成后系统跳转至choose_type状态。
2、choose_type(货物种类选择)在本状态进行货物种类的选择,先进行类型低位的选择,完成后跳转至type_sure状态。
3、type_sure(货物类型数字选择的确定)当在choose_type输入了一位数字后即可进行选择是让系统跳转到对应类型的数量选择(ok=’1’)还是进行该类型的高位数字选择(continue=’1’).4、choose_num(货物选择)5、num_sure(数量确定)本状态和上述choose_num与前述的状态choose_type和type_sure类似,故不再重复叙述,完成本状态后跳转到到num_pay状态。
文档从互联网中收集,已重新修正排版,word格式支持编辑,如有帮助欢迎下载支持。
目录引言 (1)1设计要求的提出和功能的构想 (1)2分析设计要求并画出原始状态图 (1)3程序设计 (3)4时序仿真 (6)4.1创建VHDL源文件 (6)4.2 选择合适的器件 (7)4.3 编译程序 (7)4.4 仿真波形 (7)4.5 仿真波形分析 (8)结束语 (9)参考文献 (10)英文摘要 (10)致谢 (10)自动售饮料机逻辑电路的设计和仿真摘要:本文基于VHDL语言对自动售饮料机的逻辑电路进行了逻辑设计和仿真。
该电路可识别1元和5角硬币,实现购买3种不同价格的饮料并且具有找零功能。
本设计在MAX+PLUSⅡ中实现了逻辑仿真并给出正确的仿真波形图。
关键词:MAX+PLUSⅡ;VHDL;自动售饮料机引言随着集成电路技术的快速发展,EDA(Electronic Design Automation电子设计自动化)技术已经成为电路系统分析和设计的有力工具。
EDA技术使得硬件电路设计尤其是数字电路系统的设计变得如同软件设计一样方便快捷、易于修改。
本文采用具有很强硬件描述能力的VHDL语言,对自动售饮料机的逻辑电路进行了设计,并在MAX+PlusⅡ软件中仿真实现。
1设计要求的提出和功能的构想[1][2]①该饮料机能识别0.5元和1.0元两种硬币;②售出3种不同价格的饮料,饮料价格分别为1.5元、2.0元和2.5元;③具有找零功能;④购买者能自主选择所购买的饮料;⑤饮料机在每卖出一次饮料后能自动复位。
因为饮料的价格最高为2.5元,所以设计饮料机最多可接受3.0元的硬币。
2分析设计要求并画出原始状态图该自动售饮料机设有一个投币孔,通过传感器来识别两种硬币,给出两个不同的信号。
在此用half_dollar和one_dollar分别表示投入0.5元和1.0元硬币后电路接收到的两个信号;三个饮料选择按键choose01表示选择价格为1.5元的饮料,choose10表示选择价格为2.0元的饮料,choose11表示选择价格为2.5元的饮料;rest表示复位按键;有2个输出口分别为饮料出口dispense和找零出口out1;用s0表示初始状态,s1表示投入0.5元硬币时的状态,s2表示投入1.0元硬币时的状态,s3表示投入1.5元硬币时的状态,s4表示投入2.0元时的状态;clk 表示时钟信号;机器最多接受的钱币为3.0元。
自动售货机VHL程序与仿真————————————————————————————————作者:————————————————————————————————日期:自动售货机VHDL程序与仿真(1)自动售货机VHDL程序如下:--文件名:pl_auto1.vhd。
--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
--说明:显示的钱数coin的以5角为单位。
--最后修改日期:2004.3.23。
library ieee;use ieee.std_logic_arith.all;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity PL_auto1 isport ( 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 istype ram_type is array(3 downto 0)of std_logic_vector(7 downto 0);signal ram :ram_type; --定义RAMsignal item: std_logic_vector(1 downto 0); --商品种类signal coin: std_logic_vector(3 downto 0); --币数计数器signal pri,qua:std_logic_vector(3 downto 0); --商品单价、数量signal clk1: std_logic; --控制系统的时钟信号begincom:process(set,clk1)variable quan:std_logic_vector(3 downto 0);beginif 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' thenif coin<"1001"then coin<=coin+1; --投入5角硬币,coin自加1else coin<="0000";end if;elsif coin1='1' thenif coin<"1001"then coin<=coin+2; --投入1元硬币,coin自加2else 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;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 looppri(i-4)<=ram (conv_integer(item))(i); --商品单价的读取end loop;for i in 0 to 3 loopquan(i):=ram(conv_integer(item))(i); --商品数量的读取end loop;end if;end if;qua<=quan;end process com;m32:process(clk) --此进程完成对32Mhz的脉冲分频variable q: std_logic_vector( 24 downto 0);beginif 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;code0:process(item) --商品指示灯译码begincase item iswhen "00"=>item0<="0111";when "01"=>item0<="1011";when "10"=>item0<="1101";when others=>item0<="1110";end case;end process;code1: process (coin) --钱数的BCD到七段码的译码begincase coin iswhen "0000"=>y0<="0000001";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到七段码的译码begincase qua iswhen "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";end case;end process;end behav;(2)程序仿真注:仿真图里没有对clk信号进行分频处理。
摘要本文主要介绍了利用VHDL设计语言和Altera公司的MAX+PLUS II软件开发平台, 来设计实现地铁自动售票系统的核心控制部分的功能:站点选择,票数选择,投币处理,余额计算,自动出票等功能。
在本设计中采用了有限状态机的设计方法,将整个售票系统的控制部分化分为五个状态: 选站状态,选票状态,投币状态,出票状态和余额找零状态。
最后通过对程序的调试以及相应部分功能的仿真,验证了整个系统的原理和本设计方案的正确性。
由于采用了有限状态机的设计方法,使得本系统运行可靠性高,非法状态易控制。
关键词: FPGA,CPLD, VHDL语言,MAX+PLUS II 软件,有限状态机, ,地铁自动售票系统目录第一章绪论 (1)1.1 电子器件的发展和现状 (1)1.2 设计方法的发展 (3)1.3 层次化的设计与VHDL的应用 (5)1.4 本课题的提出与意义 (8)1.5 本课题研究内容 (8)第二章 VHDL语言介绍 (10)2.1什么是VHDL (10)2.2 VHDL语言的特点 (10)2.3 VHDL的设计流程 (11)2.4 VHDL程序的基本结构 (13)第三章 MAX+PLUS II软件介绍 (14)3.1 MAX+PLUS II简介 (14)3.2Max+PlusⅡ开发系统的特点 (15)3.3 Max+PlusⅡ功能简介 (16)3.4 Max+plusⅡ设计过程 (20)第四章地铁售票系统的设计与实现 (23)4.1 课题要求 (23)4.2设计分析 (23)4.3状态机设计 (25)第五章结束语 (32)附录 (33)参考文献 (40)致谢 (41)第一章绪论1.1 电子器件的发展和现状电子技术的发展总是同电子器件的发展密切相关的,由于电子器件的不断更新换代,电子技术得到了飞速发展,当今信息技术被广泛应用在国民经济的方方面面。
多媒体技术的普及、高速宽带网络的建设、数字电视的出现以及与我们日常生活息息相关的各种家用电器,都离不开微处理器、存储器和一些采用行业标准的专用芯片。
自动售货机VHDL程序与仿真(1)自动售货机VHDL程序如下:--文件名:pl_auto1.vhd。
--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
--说明:显示的钱数coin的以5角为单位。
--最后修改日期:2004.3.23。
library ieee;use ieee.std_logic_arith.all;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity PL_auto1 isport ( 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 istype ram_type is array(3 downto 0)of std_logic_vector(7 downto 0);signal ram :ram_type; --定义RAMsignal item: std_logic_vector(1 downto 0); --商品种类signal coin: std_logic_vector(3 downto 0); --币数计数器signal pri,qua:std_logic_vector(3 downto 0); --商品单价、数量signal clk1: std_logic; --控制系统的时钟信号begincom:process(set,clk1)variable quan:std_logic_vector(3 downto 0);beginif 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' thenif coin<"1001"then coin<=coin+1; --投入5角硬币,coin自加1else coin<="0000";end if;elsif coin1='1' thenif coin<"1001"then coin<=coin+2; --投入1元硬币,coin自加2else 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;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 looppri(i-4)<=ram (conv_integer(item))(i); --商品单价的读取end loop;for i in 0 to 3 loopquan(i):=ram(conv_integer(item))(i); --商品数量的读取end loop;end if;end if;qua<=quan;end process com;m32:process(clk) --此进程完成对32Mhz的脉冲分频variable q: std_logic_vector( 24 downto 0);beginif 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;code0:process(item) --商品指示灯译码begincase item iswhen "00"=>item0<="0111";when "01"=>item0<="1011";when "10"=>item0<="1101";when others=>item0<="1110";end case;end process;code1: process (coin) --钱数的BCD到七段码的译码begincase coin iswhen "0000"=>y0<="0000001";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到七段码的译码begincase qua iswhen "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";end case;end process;end behav;(2)程序仿真图8.21.2 系统仿真全图图8.21.3 系统仿真图-预置部分图21.4 系统仿真图-商品种类选择部分图8.21.5 系统仿真图-投币部分图8.21.6 系统仿真图-购买、找币结束交易部分。
自动售货机控制模块VHDL程序设计及FPGA实现 近年来,随着集成电路技术的迅猛发展,特别是可编程逻辑器件的高速发展, EDA(Electronic Design Automation,电子设计自动化)技术成为电子设计工程师的新宠。
EDA技术以计算机为工具完成数字系统的逻辑综合、布局布线和设计仿真等工作。
电路设计者只需要完成对系统功能的描述,就可以由计算机软件进行系统处理,最后得到设计结果,并且修改设计方案如同修改软件一样方便。
利用EDA工具可以极大地提高设计效率。
利用硬件描述语言编程来表示逻辑器件及系统硬件的功能和行为,是EDA设计方法的一个重要特征。
VHDL(Very High Speed Integrated Circuit Hardware Description Language,超高速集成电路硬件描述语言)是硬件描述语言的一种,对系统硬件的描述功能很强而语法又比较简单。
VHDL具有强大的行为描述能力,设计者可以不懂硬件的结构,只需集中精力进行电子系统的设计和性能优化;具有方便的逻辑仿真与调试功能,在设计早期就能查验系统的功能,方便地比较各种方案的可行性及其优劣。
目前,VHDL作为IEEE的工业标准硬件描述语言,得到众多EDA公司的支持,在电子工程领域已经成为事实上通用硬件描述语言。
本文采用VHDL作为工具描述了自动售货机控制模块的逻辑控制电路,并在FPGA上实现。
该自动售货机能够根据投入硬币额度,按预定的要求在投入硬币大于规定值时送出饮料并找零。
设计方案 本文所设计的简易自动售货机可销售矿泉水,假设每瓶1.5元。
设两个投币孔,分别接收1元和5角两种硬币,两个输出口,分别输出购买的商品和找零。
假设每次只能投入一枚1元或5角硬币,投入1元5角硬币后机器自动给出一瓶矿泉水;投入2元硬币后,在给出一瓶矿泉水的同时找回一枚5角的硬币。
另外设置一复位按钮,当复位按钮按下时,自动售货机回到初始状态。
电子技术Electronic Technology电子技术与软件工程Electronic Technology & Software Engineering 基于Verilog H D L的自动售货机设计与仿真李红科王庆春贾晓菲(安康学院电子与信息工程学院陕西省安康市725000 )摘要:本文应用Verilog H D L语言采用自顶而下的方法设计自动售货机,整个系统包括商品选择、确认、投币、找零和出货等模块。
在Modelsim平台进行功能仿真验证,经过仿真验证设计正确,符合设计要求。
关键词:Verilog H D L;自动售货机;模块设计1引言随着集成电路产业快速发展,电路集成度越来越高,以计算机辅助为基础的电子设计自动化(EDA Electronics Design Automation)技术成为集成电路设计重要工具m,Verilog HDL硬件描述语言是以文字形式描述数字系统硬件电路结构和行为的语言,只需描述电路的功能和电路模块之间的相互关系,设计者更加专注电路设计整体性能,使电路更加优化,提高设计效率|21。
自动售货机是一种常见的智能自动化设备,由于不受人直接参与,所以广泛应用在办公楼、操场、高速服务K等场所,大大降低时间、地点的限制,在节省人力资源方面有着明显优势。
2自动售货机设计思路有限状态机(FSM Finite-state Machine)是•种用来进行对象行为建模的工具,其作用是表示有限个状态以及这些状态之间相互转移和动作等行为的数学模型。
有限状态机广泛应用于建模行为、硬件电路设计、软件工程和网络协议等的设计。
在数字系统设计中,当某一事物发生连续变化时,可以采用有限状态机设计思路提高设计效率,增加程序可读性,降低错误概率,有限状态机设计思路是数字系统中最常用的设计方法之一 [3]。
2.1自动售货机系统总体设计该售货机电路设计要求:(1)每次只能出售一种商品。
(2)所售商品种类:售货机只售4种商品,所售商品编号分 别用四位二进制数从右向左表示为0001、0010、0100、1000,对应价格分别为2元、3元、4元、5元。
作者:杨海平,江南大学物联网工程学院微电子11级在网上看博文,偶然进入了EEFOCUS网站,感觉网站的气氛很好,由此我也萌生了写博文的念头,今天特地申请了账号,开始写第一篇博文,写些关于自己学习,自己思考的东西,希望能督促自己继续学习,勤于思考吧。
今天写的东西是学习VHDL中的一个小实验,自己用状态机实现了。
1.实验要求设计一个地铁自动售票机的控制器电路,要求如下:1)有两元,三元两种地铁车票。
只能用五角,一元两种硬币购票;2)预先选择车票的票价,投入硬币,数码管显示投入硬币的金额,“确认”后给出车票,找零,并置金额显示为零,并可按“取消”同样退还硬币,并置金额显示为零。
2.实验代码-------------------------------library ieee;use ieee.std_logic_1164.all;---------------------------------entity metro isport( st2,st3:in std_logic;--选择两元还是三元车票1有效clk,rst:in std_logic;--rst 1 有效coin1,coin2:in std_logic;--coin1表示5角硬币,coin2表示1元硬币1有效ok,cancel:in std_logic;--ok表示确认购票,cancel表示退换硬币0有效ssd1,ssd2:out std_logic_vector(7 downto 0);--两位数码管显示金额tout2,tout3:out std_logic;--给出两元,三元车票1有效mout:out std_logic--退出钱款1有效);end metro;-----------------------------------------architecture bhv of metro istype state is(s0,s5,s10,s15,s20,s25,s30);--s0表示没有投硬币,s5表示五角状态,s10表示一元状态,依次类推,最多只能投3元signal pre_state,next_state:state;begin-------------------------------------------------------------process(clk,rst)--复位操作beginif(rst = '1') thenpre_state <= s0;elsif(clk'event and clk = '1') thenpre_state <= next_state;end if;end process;------------------------------------------------------------process(rst,coin1,coin2,st2,st3,ok,cancel)--状态机的编写beginif(rst = '1') thentout2 <= '0';tout3 <= '0';mout <= '0';ssd1 <= "11000000";ssd2 <= "11000000";elsif(cancel = '1') thennext_state <= s0;ssd1 <= "11000000";ssd2 <= "11000000";elsecase pre_state iswhen s0 =>ssd1 <= "11000000";ssd2 <= "11000000";tout2 <= '0';tout3 <= '0';mout <= '0';if(coin1 = '1') then next_state <= s5;elsif(coin2 = '1') then next_state <= s10;end if;when s5 =>ssd1 <= "10010010";ssd2 <= "11000000";tout2 <= '0';tout3 <= '0';mout <= '0';if(coin1 = '1') then next_state <= s10;elsif(coin2 = '1') then next_state <= s15;end if;when s10 =>ssd1 <= "11000000";ssd2 <= "11111001";tout3 <= '0';mout <= '0';if(coin1 = '1') then next_state <= s15;elsif(coin2 = '1') then next_state <= s20;end if;when s15 =>ssd1 <= "10010010";ssd2 <= "11111001";tout2 <= '0';tout3 <= '0';mout <= '0';if(coin1 = '1') then next_state <= s20;elsif(coin2 = '1') then next_state <= s25;end if;when s20 =>ssd1 <= "11000000";ssd2 <= "10100100";if(coin1 = '1') then next_state <= s25;elsif(coin2 = '1') then next_state <= s30;elsif(st2 = '1' and ok = '1') then mout <= '0';tout2 <= '1';tout3 <= '0';next_state <= s0;end if;when s25 =>ssd1 <= "10010010";ssd2 <= "10100100";if(coin1 = '1') then next_state <= s30;elsif(st2 = '1' and ok = '1') then mout <= '1';tout2 <= '1';tout3 <= '0';next_state <= s0;end if;when s30 =>ssd1 <= "11000000";ssd2 <= "10110000";if(st2 = '1' and ok = '1') then mout <= '1';tout2 <= '1';tout3 <= '0';next_state <= s0;elsif(st3 = '1' and ok = '1') then mout <= '0';tout3 <= '1';tout2 <= '0';next_state <= s0;end if;end case;end if;end process;----------------------------------------------------------------------------------------------end bhv;3.仿真代码clk_gen:process--只列出了主要的代码,这是时钟产生激励beginclk <= '1';wait for 5 ns;clk <= '0';wait for 5 ns;end process clk_gen;--------------------------init : PROCESS --这是模拟先投两元硬币,买两元票,再投三元硬币,买三元票beginrst <= '1';cancel <= '0';ok <= '0';coin1 <= '0';coin2 <= '0';st2 <= '0';st3 <= '0';wait for 5 ns;coin2 <= '1';rst <= '0';wait for 10 ns;------------------coin2 <= '0';wait for 10 ns;coin2 <= '1';wait for 10 ns;coin2 <= '0';wait for 10 ns;coin2 <= '0';st2 <= '1';ok <= '1';wait for 10 ns;ok <= '0';st2<= '0';-----------coin2 <= '1';wait for 10 ns;coin2 <= '0';wait for 10 ns;coin2 <= '1';wait for 10 ns;coin2 <= '0';wait for 10 ns;coin2 <= '1';wait for 10 ns;coin2 <= '0';wait for 10 ns;st3 <= '1';ok <= '1';wait for 100 ns;wait;-- wait;END PROCESS init;仿真结果如下:(Quartus II环境下的仿真)结果与预期的一致,大家也可以自己编写试试看。
自动售货机的设计及仿真任务和要求:自动售货机可销售橡皮(0.5元)、铅笔(1元)、直尺(1.5元)、记录本(2元)4种商品,数量无限。
只能投入1元或5角硬币,当投入的币值等于或大于商品的价钱且确认购买时,两个输出口分别输出购买的商品和找零,当投币后取消购买,退回投入的硬币,假设零币无限。
顾客一次只能购买一种商品的一个,若需要更多商品,需要重复操作。
1)基本功能:商品选择;投币购买;出货、找零、退钱。
2)显示功能:有两个LED数码管显示已经投入的币值或找零数系统总体设计:基本功能模块:商品选择模块;投币处理模块;、出货、找零、退钱模块。
自动售货机控制系统共含4个状态:初始状态、投币状态、出货及找零、退钱状态。
1)初始状态(selegoods):表示一次投币销售过程的开始,此状态期间,可选择商品,不允许投币。
2)投币状态(incoins):计算并记录投入总币值,此状态期间,允许投币,不允许选择商品。
3)出售及找零状态(outgoods_coin):根据选择商品的价格及投入的总币值,决定是否出货及找零。
4)退钱状态(back_coin):投币后取消购买,退回投入的硬币。
状态转换图如下表示:商品选择模块:功能:选择一种商品获得此商品的价格。
商品选择模块的元件图符商品选择模块的VHDL描述。
注意:为了直观显示商品的价格,价格选择integer,进行功能仿真时,选择价格为unsigneddecimal 类型。
功能仿真波形及说明:说明:当en=1时,选择eraser,此商品的价格为5角,price=5。
当en=0时,商品选择模块禁止工作,price保持不变。
•投币处理模块计算并记录投入的总币值。
投币处理模块的VHDL描述:为了直观显示投入总币值,总币值total选择integer,进行功能仿真时,选择total为unsigned decimal 类型。
功能仿真及说明:说明:当en=1时,投入一枚5角、一枚一元、一枚5角硬币,总币值为20即2元。
自动售货机 VHDL 程序与仿真1)自动售货机 VHDL 程序如下: -- 文件名: pl_auto1.vhd 。
--功能:货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
-- 说明:显示的钱数 coin 的 以 5 角为单位。
--最后修改日期: 2004.3.23 。
library ieee;use ieee.std_logic_arith.all; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity PL_auto1 is port ( clk:in std_logic;set,get,sel,finish: in std_logic; coin0,coin1: in std_logic;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);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;signal item: std_logic_vector(1 downto 0); signal coin: std_logic_vector(3 downto 0); signalpri,qua:std_logic_vector(3 downto 0); signal clk1: std_logic; begincom:process(set,clk1)variable quan:std_logic_vector(3 downto 0); beginif set='1' then ram(conv_integer(item))<=price & quantity;act<="0000";--把商品的单价、数量置入到 RAMelsif clk1'event and clk1='1' then act5<='0'; act10<='0';--系统时钟--设定、买、选择、完成信号--5 角硬币、 1 元硬币 --价格、数量数据 --显示、开关信号--钱数、商品数量显示数据-- 定义 RAM --商品种类 --币数计数器 --商品单价、数量 --控制系统的时钟if coin0='1' thenif coin<"1001"thencoin<=coin+1; elsecoin<="0000";end if;elsif coin1='1' thenif coin<"1001"thencoin<=coin+2;else coin<="0000";end if;elsif sel='1' then item<=item+1; elsif get='1' then --投入5 角硬币,coin 自加1--投入1元硬币,coin 自加2--对商品进行循环选择--对商品进行购买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 种商品的操作elsifitem="01" then act<="0100";elsif item="10" then act<="0010";elsif item="11" then act<="0001";end if;end if; elsif finish='1' then if coin>"0001" then act10<='1';coin<=coin-2;elsif coin>"0000" then act5<='1'; coin<=coin-1;else act5<='0'; act10<='0';--此IFend if;elsif get='0' then act<="0000";for i in 4 to 7 looppri(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;end if;end if; qua<=quan;end process com;m32:process(clk) -- 此进程完成对32Mhz 的脉冲分频variable q: std_logic_vector( 24 downto 0);beginif 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;code0:process(item) --商品指示灯译码begincase item iswhen "00"=>item0<="0111";when "01"=>item0<="1011";when "10"=>item0<="1101";when others=>item0<="1110";end case;end process;code1: process (coin)begincase coin iswhen "0000"=>y0<="0000001";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)begincase qua iswhen "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"; end case; end process;end behav;( 2)程序仿真--钱数的BCD 到七段码的译码--单价的BCD 到七段码的译码clk图8.21.2 系统仿真全图图8.21.3 系统仿真图-预置部分图21.4 系统仿真图- 商品种类选择部分2图8.21.5 系统仿真图-投币部分易部分2。