《自动售货机》VHDL设计
- 格式:doc
- 大小:64.50 KB
- 文档页数:8
自动售货机设计实验报告一设计题目:g) 自动售货机设计FPGA模块模拟自动售货机的工作过程,要求如下(1)售货机有两个进币孔,可以输入硬币和纸币,售货机有两个进币孔,一个是输入硬币,一个是输入纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。
乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。
即有一个小键盘(0-9按键)来完成,比如输入15时要先输入1,再输入5。
(3)顾客选择完商品后,可以选择需要的数量。
然后可以继续选择商品及其数量,每次可以选择最多三个商品。
然后显示出所需金额。
顾客此时可以投币,并且显示已经投币的总币值。
当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
在投币期间,顾客可以按取消键取消本次操作,钱币自动退出。
二程序代码:三程序实现功能:FPGA模块模拟自动售货机:(1)售货机有两个进币孔,分别输入硬币和纸币,硬币的识别范围是5角和1 元的硬币,纸币的识别范围是1 元、5 元,10 元,20元,50元,100元。
乘客可以连续多次投入钱币。
(2)顾客可以选择的商品种类有16种,价格分别为1-16元,顾客可以通过输入商品的编号来实现商品的选择。
(3)顾客选择完商品后,可以选择需要的数量。
然后可以继续选择商品及其数量,每次最多选择最种商品,每种商品最多购买三个。
然后显示出所需金额。
顾客此时可以投币,并且显示已经投币的总币值。
当投币值达到或超过所需币值后,售货机出货,并扣除所需金额,并找出多余金额。
在投币期间,顾客可以按取消键取消本次操作,钱币自动退出。
四程序功能模块分析:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;实体说明:entity sellor isport ( clk:in std_logic; --系统时钟sel,cancel,reset: in std_logic; --选择、取消、开始(用于进入初始状态)变量定义:coin: in std_logic_vector(1 downto 0); --5角硬币、1元硬币crash:in std_logic_vector(5 downto 0); --100元、50元、20元、10元、5元、一元纸币item: in std_logic_vector(3 downto 0); --16种商品quantity:in std_logic_vector(1 downto 0); --商品数量(一次最多购买3件)change_out :out std_logic_vector(10 downto 0); --找零item_out :out std_logic_vector(3 downto 0); --是否购买了商品(1表示有商品出来、0表示没有商品出来)change :out std_logic ); --是否有找零end sellor;结构体说明:architecture behave of sellor issignal price:std_logic_vector(7 downto 0);signal counter: std_logic_vector(10 downto 0); --币数计数器signal total_price:std_logic_vector(10 downto 0); --控制系统的时钟信号type state_type is (initial_state,item1_state,quantity_state,money_state,sell_state,change_state);signal state:state_type;signal temp:std_logic_vector(1 downto 0);signal quan:std_logic_vector(3 downto 0);begincom:process(reset,sel,clk)beginif (clk'event and clk='1')thenif reset='1' then state<=initial_state;temp<="00";quan<="0000";end if;case state iswhen initial_state=>item_out<="0000"; --出票口关闭change_out<="00000000000"; --找零口关闭total_price<="00000000000"; --票价总额记录清零counter<="00000000000";--投入钱币总额记录清零change<='0';state<=item1_state; 设定initial_state选择物品程序:when item1_state=>if temp<"11" thenelse state<=money_state;end if;when quantity_state=>if(cancel='1')then --按下“取消”按钮state<=initial_state;else 取消操作程序if quantity="00" thenitem_out<="0000";change<='0';change_out<="00000000000";state<=initial_state;else 当选择0个商品total_price<=total_price+price*quantity;temp<=temp+1;quan<=quan+quantity;if (sel='1') then state<=item1_state;elsestate<=money_state;end if;end if;end if;货币识别:when money_state=>if(cancel='1')then --按下“取消”按钮state<=initial_state;end if;case crash is --纸币识别end case;case coin is --硬币识别end case;if counter>=total_price thenstate<=sell_state;--系统进入出票状态end if;购物操作程序:when sell_state =>if(cancel='1')thenitem_out<="0000";change<='1';change_out<=counter; --按下“取消”按钮state<=initial_state;elseif counter>=total_price thenitem_out<=quan; --判断是否还有找零state<=change_state; --系统进入找零状态elseitem_out<="0000";state<=initial_state;end if;end if;when change_state=>if(cancel='1')thenitem_out<="0000";change<='1';change_out<=counter; --按下“取消”按钮state<=initial_state;elseif counter>total_price thenchange<='1';change_out<=counter-total_price;item_out<=quan;elsechange<='0';change_out<="00000000000";state<=initial_state;end if;end if;end case;end if;end process;end behave;五、仿真波形六、个人总结与感想:良好的沟通与分工是十分重要的,这对程序的实现和质量具有至关重要的作用。
《计算机组成原理》课程设计报告基于VHDL的自动售货机设计与实现课程设计任务书计算机与通信工程学院网络工程专业指导教师对学生在课程设计中的评价指导教师对课程设计的评定意见基于VHDL的自动售货机设计与实现摘要:本设计运用VHDL语言编写一个自动售货机的控制系统,该系统具有货物信息存储,进程控制,硬币处理,余额计算,显示等功能。
商品的种类、单价和数量在初始化时输入,然后存储。
可以识别的币种为硬币,五毛和一元的面额。
用户投入硬币,系统累计数量,然后对比物品的单价和数量,扣除价格,最后计算余额,可以找零。
设计没有考虑硬件的实现,只进行功能的相应仿真,性质为实验性质的课程设计。
关键词:VHDL、自动售货机、课程设计、MXAPLUSⅡ、系统仿真Abstract: This design use of VHDL language design a vending machine control system, the system have the functions to storagethe goods information, process control, coin handling, balance calculation, display and other functions. The type of goods, unit price and quantity in the initialization to be input, and then stored. Currency for the coins can be identified, fifty cents and one dollar denomination. User input coins, the system account sum, and then comparing the unit price and quantity of goods, net price, the final calculation of the balance, you can give change.Design did not consider the hardware implementation, only the corresponding functional simulation, experimental nature of the curriculum design.Keywords: VHDL, vending machines, curriculum design, MXAPLUS Ⅱ, system simulation目录1.引言 (7)1.1自动售货机系统概述 (7)1.2设计任务和主要容 (8)2.系统设计过程 (9)2.1自动售货机系统总体框图 (9)2.2系统功能模块 (9)2.3程序源代码 (11)3.系统仿真 (15)3.1系统仿真全图 (15)3.2系统分步仿真图 (16)4.总结 (20)参考文献 (21)1 引言随着现在生活节奏越来越快,自动售货机的出现大大方便了人们的日常生活。
郑州轻工业学院课程设计任务书题目自动售货机电路设计专业、班级电信2班学号 541101030217 姓名李磊主要内容、基本要求、主要参考资料等:查阅资料完成自动售货机的设计思路,利用硬件编程语言VHDL 或者Verilog-HDL来实现,要求能够识别100元、50元、10元、5元及其钢崩1元五种面值的设计,能够找零,设计中假设找零货贝充裕,货物的价格不允许出现0.5元的情况。
给出完成控制电路所需要的设计模块;给出硬件编程语言的实现,并进行仿真;给出下载电路的设计,设计为2种下载方法,其中一种必须为JTAG;同时设计者报告不允许雷同。
参考资料:1、潘松、黄继业《EDA技术及其应用》(第四版)科学出版社 20092、数字信号处理的教材完成期限:指导教师签名:课程负责人签名:摘要随着电子技术的发展,当今数字系统的设计正朝着速度快,容量大,体积小,重量轻的方向发展,推动该潮流迅猛发展的引擎就是日趋进步和完善的ASIC设计技术,AISC芯片具有价格低,体积小,可靠性高等优点,目前在电子产品中已有广泛的应用,VHDL是一种用来描述数字逻辑系统的“编程语言”,它通过对硬件行为的直接描述来实现对硬件的物理实现,代表了当今硬件设计的发展方向。
本文是在VHDL的基础上对自动售货机进行设计来实现其基本功能的,采用了Altera的开发软件Quarts II。
通过在该软件平台上进行数字电路设计和仿真的方法,阐述了VHDL(Very High Speed Integrated Circuit Hardware Description Language)超高速集成电路硬件描述语言的一些特点及语法结构,介绍了自动售货机的基本原理、系统组成和主要功能,并分析讨论了用VHDL语言开发自动售货机系统的设计流程。
本设计采用VHDL硬件描述语言编程的设计方法设计系统核心电路的硬件程序,在Quartus II软件平台上进行编译和仿真。
文章首先简述了自动售货机系统的意义和发展现状以及VHDL语言的特点,然后介绍了自动售货机的设计要求、设计思路,并给出了总体设计框图,通过分析设计写出VHDL程序源代码,将代码在Quartus II软件平台上进行编译仿真,波形基本符合设计要求。
自动售货机的设计一.实验内容:本自动售货机系统,结合EDA技术,采用ALTERA公司可编程逻辑器件(CPLD)EPM7128SLC84-15芯片作为控制核心,再配以必要的外围电路从而实现只销售两种饮料,售价均为15元,可以找零和退币等功能的EDA应用系统。
芯片的设计是以MAX_PLUS II 作为开发平台,VHDL语言作为开发语言,使用掌宇公司CIC_310 CPLD/FPGA数字开发系统完成软件测试。
自己制作下载板与外围电路。
二.实验分析:本自动售货机只销售两种罐装饮料。
售价均为15元。
顾客可以由两个不同投币孔分别投入3个5元硬币或2个10元硬币。
一次交易只能买一罐,且自动找零。
只要按下取消键就会马上无条件退币。
本设计的硬件电路用2个按键电路代替2个投币孔,以LED点亮的数量显示各币种的投入数量,在以4Hz闪烁的LED来显示退币种类与数量。
因为投币是计次电路,应先经过抖动消除电路处理。
本设计采用1000Hz的系统时钟信号来控制所有买卖行为。
系统中设计的复位键为管理人员所用,并未在用户界面中设计。
三.系统设计流程图:四.自动售货机外观图:(为指示灯)五.电路原理图六.PCB图:根据PROTEL99画的系统原理图,成生PCB图。
然后进行布局与布线。
注意:布线时将晶振这种易产生噪声的器件的输出端与芯片时钟输入端的连线尽量布为直线;将电源与地线的宽度定为30mil到100mil之间。
本系统的电流不是很大,所以不用将板子的两面分别布成电源与地。
七.系统实物图:八.软件系统框图九.源程序:1.产生系统频率和退币信号电路首先要根据硬件电路的晶振频率确定分频系数,先产生系统频率,在进一步分频产生退币信号。
由于掌宇公司的开发系统上的晶振频率为20MHz,所以要分频系数分别为20000(COUNT)和250(COUNT1)。
(注:由于在自制的下载板上使用了1MHz的有源晶振,所以把程序中的COUNT的范围改为0到1000即可。
一、设计目的1.熟悉状态机的使用。
2.了解用VHDL语言实现状态机的过程。
二、设计内容本系统模拟一个自动售票机:所售邮票的价钱分别为:6角和8角;按键设置S1:按一下一角,S2:按一下5角,S3:按一下一元,S8:选择邮票面值,按一下当D1_1亮表示选择6角邮票,按一下D1_2亮表示选择8角邮票,S7:取消操作。
D1_6~D1_8:找回的零钱 D1_1:指示6角邮票D1_2:指示8角邮票 D1_4:提示邮票送出三、设计原理有限状态机FSM及其设计技术是实用数字系统设计中实现高效率、高可靠逻辑控制的重要途径。
传统的状态机设计方法需进行繁琐的状态分配、绘制状态表、化简次态方程等,而利用VHDL可以避免这些繁琐的过程,直接利用状态转换图进行状态机的描述,所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,而状态的转移则通过IF_THEN_ELsE语句实现。
四、管脚分配实验符号对应附录符号管脚money[0] S1 PIN_66money[1] S2 PIN-67money[2] S3 PIN_68rst RESET PIN_240commodity6 D1_1 PIN_215commodity8 D1_2 PIN_217give_change[0] D1_8 PIN_224give_change[1] D1_7 PIN_225give_change[2 D1_6 PIN_213stamp S8 PIN_75back S7 PIN_76clk100hz Clock PIN_29sell D1_4 PIN_207五、使用说明本程序是一个自动处理人机信息交换的程序,它能根据人们的需要,显示邮票的面值,在付款和付款取消的时候给出相应指示,处理交易中出现的各种情况,并且能在交易后显示是否交易成功。
六、流程图设计七、程序设计如下:library ieee; 初始定义投入壹角硬币的处理电路模块投入五角硬币的处理电路模块投入壹元硬币的处理电路模块选择邮票模块确认与取消处理电路模块退币处理电路模块出货电路模块use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity vendor isport(reset :in std_logic; --系统内部给其他顾客重新操作的复位信号clk :in std_logic; --由外接信号发生器提供的1024Hz 系统时钟信号ok_buy :in std_logic; --购买确认的按键信号cancel_buy :in std_logic; --购买取消的按键信号coin_1 :in std_logic;-- 投入壹角硬币的动作按键coin_5 :in std_logic; --投入五角硬币的动作按键coin_10 :in std_logic; --投入壹圆硬币的动作按键select_liu_yp :in std_logic; --选择六角邮票的按键信号select_ba_yp :in std_logic; --选择八角邮票的按键信号led_liu_yp_ok :out std_logic; --灯亮显示还有六角邮票led_ba_yp_ok :out std_logic; --灯亮显示还有八角邮票led_liu_yp_sel :out std_logic; --灯亮显示六角邮票选择键被按 led_ba_yp_sel :out std_logic; --灯亮显示八角邮票选择键被按 led_buy :out std_logic; --灯亮显示按了购买确认键led_cancel :out std_logic; --灯亮显示按了购买取消键led_one :out std_logic;--1个LED,投入1个1角硬币亮一个LEDled_five :out std_logic;--3个LED,投入1个五角硬币亮一个LEDled_ten :out std_logic;--2个LED,投入1个壹圆硬币亮一个LEDDOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);led_liu_yp_out :out std_logic;--灯亮显示六角邮票已出货led_ba_yp_out :out std_logic --灯亮显示八角邮票已出货);end;architecture arch of vendor issignal ok :std_logic;--用来维持ok_buy的状态signal cancel :std_logic;--用来维持cancel_buy的状态signal money_ok1 :std_logic;--投入金额正确signal money_ok2 :std_logic;--投入金额正确signal return_clk :std_logic;--退币的闪烁信号4Hzsignal liu_yp_choice :std_logic;--用来维持select_liu_yp的状态 signal ba_yp_choice :std_logic;--用来维持select_ba_yp的状态signal total_amount_one:integer range 0 to 1;--壹角硬币的累计投入金额signal total_amount_five:integer range 0 to 5;--五角硬币的累计投入金额signal total_amount_ten :integer range 0 to 10;--壹圆硬币的累计投入金额signal total_amount_6 :integer range 0 to 6;--壹圆硬币的累计投入金额signal total_amount_8 :integer range 0 to 8;--壹圆硬币的累计投入金额signal liu_yp_out :std_logic;--六角邮票已经出货的信号signal ba_yp_out :std_logic;--八角邮票已经出货的信号begincoin_1_counting:block --投入壹角硬币的处理电路模块beginprocess(reset,coin_1)beginif reset='1' then total_amount_one<=0; --复位led_one<='0';elsif rising_edge(coin_1) then --按下投入一角硬币的按钮total_amount_one<=1;led_one<='1'; --灯亮几盏表示投入多少个硬币end if;end process;end block;coin_10_counting:block --投入壹圆硬币的处理电路模块beginprocess(reset,coin_10)beginif reset='1' then total_amount_ten<=0; --复位led_ten<='0';elsif rising_edge(coin_10) then --按下投入一元硬币的按钮total_amount_ten<=10;led_ten<='1'; --灯亮几盏表示投入多少个硬币end if;end process;end block;coin_5_counting:block --投入五角硬币的处理电路模块signal no_coin_five:integer range 0 to 1;beginprocess(reset,coin_5)beginif reset='1' then total_amount_five<=0; --复位led_five<='0';elsif rising_edge(coin_5) then --按下投入五角钱硬币的按钮total_amount_five<=5;led_five<='1'; --灯亮几盏表示投入多少个硬币 end if;end process;end block;select_drink:blockbeginprocess(reset,clk)beginif reset='1' then led_liu_yp_sel<='0'; --复位led_ba_yp_sel<='0';ba_yp_choice<='0';liu_yp_choice<='0';elsif rising_edge(clk) then --时钟上升沿if select_liu_yp='1' then --选择led_liu_yp_sel<='1'; --相应的信号灯亮liu_yp_choice<='1'; --维持选择状态led_ba_yp_sel<='0';ba_yp_choice<='0';end if;if select_ba_yp='1' then --选择led_liu_yp_sel<='0';ba_yp_choice<='1'; --维持选择状态led_ba_yp_sel<='1'; --相应的灯亮liu_yp_choice<='0';end if;end if;end process;end block;ok_or_cancel:block --确认与取消处理电路模块beginp1:process(reset,ok_buy)beginif reset='1' then ok<='0'; --复位led_buy<='0';elsif rising_edge(ok_buy) then --按确认按钮ok<='1'; --维持状态led_buy<='1'; --确认灯亮end if;end process;p2:process(reset,cancel_buy)beginif reset='1' then cancel<='0'; --复位led_cancel<='0';elsif rising_edge(cancel_buy) then --按取消键cancel<='1'; --维持状态led_cancel<='1'; --取消灯亮end if;end process;end block;coin_returned:block --退币处理电路模块signal total_amount:integer range 0 to 16;signal ret:integer range 0 to 16;beginprocess(reset,clk)beginif reset='1' then --复位total_amount<=0;money_ok1<='0';money_ok2<='0';DOUT<="1000000";elsif rising_edge(clk) then --时钟上升沿total_amount<=total_amount_ten+total_amount_five+total_amount_one; --投入总钱数,十进制,单位角if total_amount>=6 then money_ok1<='1';else money_ok1<='0';end if;if total_amount>=8 then money_ok2<='1';else money_ok2<='0';end if;if (cancel='1') then --取消购买CASE total_amount ISWHEN 0=>DOUT<="1000000";--0WHEN 1=>DOUT<="1111001";--1WHEN 2=>DOUT<="0100100";--2WHEN 3=>DOUT<="0110000";--3WHEN 4=>DOUT<="0011001";--4WHEN 5=>DOUT<="0010010";--5WHEN 6=>DOUT<="0000010";--6WHEN 7=>DOUT<="1111000";--7WHEN 8=>DOUT<="0000000";--8WHEN 9=>DOUT<="0010000";--9WHEN 10=>DOUT<="0001000";--10WHEN 11=>DOUT<="0000011";--11WHEN 12=>DOUT<="1000110";--12WHEN 13=>DOUT<="0100001";--13WHEN 14=>DOUT<="0000110";--14WHEN 15=>DOUT<="0001110";--15WHEN 16=>DOUT<="0001001";--16WHEN OTHERS=>DOUT<="1111111";END CASE;end if;if (money_ok1='1' and ok='1' and liu_yp_choice='1') thentotal_amount_6<=6;ret<=total_amount-total_amount_6;elsif( money_ok2='1' and ok='1' and ba_yp_choice='1') thentotal_amount_8<=8;ret<=total_amount-total_amount_8;else ret<=total_amount;end if;if ( ok='1') then --取消购买CASE ret ISWHEN 0=>DOUT<="1000000";--0WHEN 1=>DOUT<="1111001";--1WHEN 2=>DOUT<="0100100";--2WHEN 3=>DOUT<="0110000";--3WHEN 4=>DOUT<="0011001";--4WHEN 5=>DOUT<="0010010";--5WHEN 6=>DOUT<="0000010";--6WHEN 7=>DOUT<="1111000";--7WHEN 8=>DOUT<="0000000";--8WHEN 9=>DOUT<="0010000";--9WHEN 10=>DOUT<="0001000";--10WHEN 11=>DOUT<="0000011";--11WHEN 12=>DOUT<="1000110";--12WHEN 13=>DOUT<="0100001";--13WHEN 14=>DOUT<="0000110";--14WHEN 15=>DOUT<="0001110";--15WHEN 16=>DOUT<="0001001";--16WHEN OTHERS=>DOUT<="1111111";END CASE;end if;end if;end process;end block;give_check:block --出货电路模块beginliu_yp_out<='1' when (money_ok1='1' and ok='1' and liu_yp_choice='1') else '0';led_liu_yp_out<=liu_yp_out;ba_yp_out<='1' when (money_ok2='1' and ok='1' and ba_yp_choice='1') else '0';led_ba_yp_out<=ba_yp_out;end block;end arch;八、设计总结:通过这次小学期设计让我更加深入的了解了VHDL语言的使用及其设计方法,在设计过程中遇到很多问题,通过自己和小组成员的共同努力,把所遇到的问题一一克服,在解决问题的过程中对VHDL的实际应用有了很大的提高九、参考文献:[1] 高峰.单片微型计算机原理与接口技术.科学出版社,2007。
自动售货机控制模块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角的硬币。
另外设置一复位按钮,当复位按钮按下时,自动售货机回到初始状态。
唐山学院《EDA技术》课程设计题目自动售货机控制器设计系 (部)班级姓名学号指导教师年月日至月日共周年月日《EDA技术》课程设计任务书课程设计成绩评定表目录1 引言 (1)2 VHDL介绍 (2)2.1硬件描述语言VHDL (2)2.2VHDL语言的特点 (3)3 Quartus II介绍 (4)3.1 Quartus II软件介绍 (4)3.2 Quartus II软件界面介绍 (4)3.2.1代码输入界面 (4)3.2.2编译界面 (5)3.2.3波形仿真界面 (5)4自动售货机控制器设计与仿真 (7)4.1设计内容 (7)4.2输入与输出说明 (7)4.3状态转换图 (8)4.4程序及仿真波形分析 (8)5引脚设定及下载分析 (18)5.1引脚设定 (18)5.2程序下载 (18)5.3结果分析 (19)6设计总结 (20)参考文献 (21)附录 (22)1 引言VHDL的英文全名是VHSIC(Very High Speed Integrated Circuit)Hardware Descriptiong Language, 翻译成中文就是超高速集成电路硬件描述语言,诞生于1982年。
1987年底,VHDL被美国国防部确认为标准硬件描述语言。
自IEEE公布了VHDL的标准版本,IEEE-1076之后,各EDA公司相继推出了自己的VHDL设计环境,或宣布自己的设计工具可以和VHDL接口。
1993年,IEEE对VHDL进行了修订,从更高的抽象层次和系统描述能力上扩展VHDL 的内容,公布了新版本的VHDL,即IEEE标准的1076-1993版本。
现在,VHDL和Verilog作为IEEE的工业标准硬件描述语言,又得到众多EDA公司的支持,在电子工程领域,已成为事实上的通用硬件描述语言。
有专家认为,在新的世纪中,VHDL于Verilog语言将承担起大部分的数字系统设计任务。
目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。
基于VHDL的自动售货机系统设计赵杰【摘要】采用自顶向下的设计原则和模块化的设计思想,将自动售货机系统划分为分频、主控、译码和显示等模块.各模块均采用硬件描述语言VHDL(超高速集成电路硬件描述语言)设计,用电路原理图实现各模块之间的连接关系,完成顶层设计实体.主控模块使用有限状态机完成,将基本功能的实现转换为状态的转移.最终完成的模拟自动售货机系统具有商品选择、投币处理、出货找零、异常退币等主要功能.在Quartus Ⅱ软件平台上完成工程设计,对各模块分别进行仿真,最后对顶层设计实体进行仿真验证.【期刊名称】《系统仿真技术》【年(卷),期】2015(011)002【总页数】5页(P167-171)【关键词】自动售货机;硬件描述语言;模块化【作者】赵杰【作者单位】商洛学院电子信息与电气工程学院,陕西商洛726000【正文语种】中文【中图分类】TP3911 引言自动售货机是能按照投入的货币自动售货的机器,它是贸易自动化的常用设备,受时间、地点的限制少,能节约人力、便利交易,是一种全新的贸易零售方式,又被称为24小时业务的小型超市[1]。
在自动售货机的控制方面,常采用单片机或PLC(可编程逻辑控制器)作为控制核心,完成整个系统的基本功能[2-5]。
然而,实际中主控芯片需和众多外围芯片或接口相连,或者需要进行功能扩展[6]。
用传统方式来应对日益复杂的要求显得力不从心。
而使用硬件描述语言在FPGA(现场可编程门阵列)上实现电路系统的现代EDA(电子设计自动化)技术,具有明显的优势[7-8]。
本文主要利用VHDL硬件描述语言编写程序代码,用状态机实现功能转换,以Quartus II软件作为运行平台,实现一个能够实现货物选择、投币、找零、多次购买等功能的自动售货机。
自动售货机采用模块化设计,可以对各模块实行独自设计、修订和调试,最终通过模拟仿真进行验证。
2 自动售货机设计为方便起见,设定自动售货机可以出售两种商品,标价分别为2元和3元。
EDA课程设计自动售货机11微电2班李秋贤11180049郭一楠11180095 2013年1月5日壹,设计要求:a,要求能够出售3种不同价格的商品(12元,5元,3元);b,能接收10元(纸币),5元(纸币),1元(纸币/硬币)的钱币;c,能够显示买东西的金额,显示投入钱金额,并能显示找零的金额;d,用1元硬币进行找零。
貳,设计思路与说明:1,分4种循环状态:a,货物种类选择模块+单价设定:1,选择货物2,单价设定3,选择货物按钮led背光灯亮b,货物数量选择模块:1,选择商品数量2,商品数量按钮led背光灯亮c,投币状态:1. 投入钱币之前,数码管都显示“00”2. 投入钱币之后,投入钱币数码管显示“(投币金额)”d,钱币总值与总价判断模块判断:投入的钱币>购物的金额ture:之后然后跳到下一个状态false:回到上一个状态追加金额,货物总额清零,货物总额数码管复位。
2,设定变量:输入变量:clk------------------------时钟input---------------------------------输入信号reset---------------------------------复位信号paper10,paper5,paper1--------10元纸币,5元纸币,1元纸币hard -----------------------------------1元硬币quantity10,quantity5,quantity1,quantity01 10、5、1----纸币张数和1元硬币个数buy------------------------------------货物选择any------------------------------------货物数量选择随机变量:unit------------------------------------货物单价x----------------------------------------货物数量sum------------------------------------货物价mon------------------------------------投币总值mon_1,mon_2,sum_1,sum_2,change_1,change_2-----LED数码管信号change-------------------------------找零1元数量输出变量:led_buy------------------------------货物选择背光ledled_any------------------------------货物数量背光ledled_sum_1,led_sum_2,led_mon_1,led_mon_2,led_change_1,led_change----------------------钱数、商品数量显示数据y --------------------------------------出货数量3,变量关系:a,10元纸币paper10 + 10元纸币数量quantity10+ 5元纸币paper5 + 5元纸币数量quantity5+ 1元纸币paper1 + 1元纸币数量quantity1+1元硬币hard + 1元硬币数量quantity01= 投入钱币总额money >> 投入数码管信号led_monb,输入选择货物信号buy根据buy设定单价unit(分别为12,5,3元)led_buy亮起(选择按钮led背光)c,货物单价unit * 货物数量x== 货物总额sum >> 总额数码管信号led_sum led_x亮起(选择按钮led背光)c,如果mon< sum,回到状态1;如果mon > sum,mon - sum = 找零金额change >> 找零数码管信号led_change,出货数量y = x,找零change个硬币4,常量:led数码管7段译码:(dp g f e d c b a)0:00000011:10011112:00100103:00001104:10011005:01001006:01000007:00011118:00000009:0000100叁,程序源代码:--文件名:autosell.vhd--------------------------------------------------------------------------------------------------------------------------------library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;---------------------------------------------------------------------------------------------------------------------------------entity autosell isport ( clk : in std_logic; --时钟input : in std_logic; --(下一步)输入信号reset : in std_logic; --复位信号output : out std_logic;paper10,paper5,paper1 : in std_logic; --10元纸币,5元纸币,1元纸币quantity10,quantity5,quantity1,quantity01:in std_logic;--10、5、1纸币张数和1元硬币个数hard : in std_logic; --1元硬币buy : in std_logic_vector(2 downto 0); --货物选择any : in std_logic_vector(4 downto 0); --货物数量选择led_buy : out std_logic_vector(2 downto 0); --货物选择背光ledled_any : out std_logic_vector(4 downto 0); --货物数量背光ledled_sum_1,led_sum_2,led_mon_1,led_mon_2,led_change_1,led_change_2:out std_logic_vector(6 downto 0); --钱数、商品数量显示数据y : out integer range 0 to 4); --出货数量end autosell;---------------------------------------------------------------------------------------------------------------------------------architecture dataflow of autosell istype state_type is (s0,s1,s2,s3);signal now_state,next_state:state_type;signal unit : integer range 0 to 12; --货物单价signal x : integer range 0 to 6; --货物数量signal sum : integer range 0 to 59; --货物价signal mon : integer range 0 to 59; --投币总值signal mon_1,mon_2,sum_1,sum_2,change_1,change_2: integer range 0 to 9; --LED数码管信号signal change : integer range 0 to 59 ; --找零1元数量begin-----------------------------------------------------------------------------------------process(clk) --时钟模块beginif(reset='1') thennow_state<=s0;elsif(clk'event and clk='1') thennow_state<=next_state;end if;end process;---------------------------------------------------------------------------------------------PROCESS(now_state,buy,any,paper10,paper5,paper1,hard,quantity10,quantity5,quantity1,quantity01) BEGINCASE now_state ISWHEN s0=>if buy="100" then --货物种类选择模块+单价设定----状态1led_buy<=”100”; --【背光】unit<=12;elsif buy="010" thenled_buy<=”010”;unit<=5;elsif buy="001" thenled_buy<=”001”;unit<=3;end if;if(input='0') then --输入input进入下一个状态next_state<=s0;elsif(input='1') thennext_state<=s1;end if;---------------------------------------------------------------------------------------------------WHEN s1=>if any="10000" then --货物数量选择模块--状态2led_any<="10000";--【背光】x<=1;elsif any="01000" thenled_any<="01000";x<=2;elsif any="00100" thenled_any<="00100";x<=3;elsif any="00010" thenled_any<="00010";x<=4;elsif any="00001" thenled_any<="00001";x<=5;end if;if(input='0') then --输入input进入下一个状态next_state<=s1;elsif(input='1') thennext_state<=s2;end if;sum<=unit*x;sum_1<=sum REM 10;sum_2<=sum/10;------------------------------------------------------------------------------------------------------------------------钱币总值计算模块----状态3WHEN s2=>if paper10='1' then mon<=mon+10; --投入10元纸币,mon自加10 elsif paper5='1' then mon<=mon+5; --投入5元纸币,mon自加5elsif paper1='1' then mon<=mon+1; --投入1元纸币,mon自加1elsif hard='1' then mon<=mon+1; --投入1元硬币,mon自加1end if;if(input='0') then --输入input进入下一个状态next_state<=s2;elsif(input='1') thennext_state<=s3;end if;mon_1<=mon REM 10;mon_2<=mon/10;------------------------------------------------------------------------------------------------------------------------WHEN s3=>if mon>sum then --钱币总值与总价判断模块--状态4change<=mon-sum;change_1<=change REM 10;change_2<=change/10;y<=x; --找零next_state<=s0; --返回状态1elsif mon<sum then next_state<=s2; --因为不够钱,返回状态2继续追加购货金额end if;END CASE ;end process;----------------------------------------------------------------------------------------------------------------------------------------- code1: process (sum_1) --货物总额个位的BCD到七段码的译码begincase sum_1 iswhen 0=>led_sum_1<="0000001";--0when 1=>led_sum_1<="1001111";--1when 5=>led_sum_1<="0100100";--5when 6=>led_sum_1<="0100000";--6when 7=>led_sum_1<="0001111";--7when 8=>led_sum_1<="0000000";--8when 9=>led_sum_1<="0000100";--9end case;end process;------------------------------------------------------------------------------------------------------------------------------ code2: process (sum_2) --货物总额十位的BCD到七段码的译码begincase sum_2 iswhen 0=>led_sum_2<="0000001";--0when 1=>led_sum_2<="1001111";--1when 2=>led_sum_2<="0010010";--2when 3=>led_sum_2<="0000110";--3when 4=>led_sum_2<="1001100";--4when 5=>led_sum_2<="0100100";--5when 6=>led_sum_2<="0100000";--6when 7=>led_sum_2<="0001111";--7when 8=>led_sum_2<="0000000";--8when 9=>led_sum_2<="0000100";--9end case;end process;------------------------------------------------------------------------------------------------------------------------------- code3: process (mon_1) --投入钱币总额个位的BCD到七段码的译码begincase mon_1 iswhen 0=>led_mon_1<="0000001";--0when 1=>led_mon_1<="1001111";--1when 2=>led_mon_1<="0010010";--2when 3=>led_mon_1<="0000110";--3when 4=>led_mon_1<="1001100";--4when 5=>led_mon_1<="0100100";--5when 6=>led_mon_1<="0100000";--6when 7=>led_mon_1<="0001111";--7when 8=>led_mon_1<="0000000";--8when 9=>led_mon_1<="0000100";--9end case;end process;--------------------------------------------------------------------------------------------------------------------------------- code4: process (mon_2) --投入钱币总额十位的BCD到七段码的译码begincase mon_2 iswhen 0=>led_mon_2<="0000001";--0when 4=>led_mon_2<="1001100";--4when 5=>led_mon_2<="0100100";--5when 6=>led_mon_2<="0100000";--6when 7=>led_mon_2<="0001111";--7when 8=>led_mon_2<="0000000";--8when 9=>led_mon_2<="0000100";--9end case;end process;--------------------------------------------------------------------------------------------------------------------------------- code5: process (change_1) --找零金额个位的BCD到七段码的译码begincase change_1 iswhen 0=>led_change_1<="0000001";--0when 1=>led_change_1<="1001111";--1when 2=>led_change_1<="0010010";--2when 3=>led_change_1<="0000110";--3when 4=>led_change_1<="1001100";--4when 5=>led_change_1<="0100100";--5when 6=>led_change_1<="0100000";--6when 7=>led_change_1<="0001111";--7when 8=>led_change_1<="0000000";--8when 9=>led_change_1<="0000100";--9end case;end process;-------------------------------------------------------------------------------------------------------------------------------- code6: process (change_1) --找零金额十位的BCD到七段码的译码begincase change_2 iswhen 0=>led_change_2<="0000001";--0when 1=>led_change_2<="1001111";--1when 2=>led_change_2<="0010010";--2when 3=>led_change_2<="0000110";--3when 4=>led_change_2<="1001100";--4when 5=>led_change_2<="0100100";--5when 6=>led_change_2<="0100000";--6when 7=>led_change_2<="0001111";--7when 8=>led_change_2<="0000000";--8when 9=>led_change_2<="0000100";--9end case;end process;--------------------------------------------------------------------------------end dataflow;。