1775.自动售货机控制系统设计报告.doc
自动售货机控制系统设计报告一、课题介绍 自动售货机在当今社会已十分普遍,在各大商场和街头均能找到它的身影,它为人们购买一些常见小商品提供了极大的方便。本数字系统模仿一个小型自动售货机的功能,旨在初步学会数字系统设计的一般方法,提高使用Quartus 软件和运用VHDL语言编写程序的能力。该系统设定自动售货机出售可乐(2元)和汉堡包(4元)2种商品,可以选择所要购买的商品数量(1个或2个),按“确认”后进行投币。本机接受1元和5元的纸币,按投币键若干次。若投入的钱款总额达到应付金额,商品给出并找零;若投入的钱款总额未达到应付金额,商品不给出,此时按“取消”可退出已投入的钱款。该系统的规模较小。二、具体实施方案用8个开关作为控制输入(由0变为1再变为0算一次输入),7个LED灯作为指示输出,4个数码管分别显示找零金额和退币金额。利用Quartus 软件编写VHDL程序,并下载到Cyclone EP1C6Q240C8芯片中,以实现其功能。三、面板图:退币欢迎使用自动售货机!可乐(2元)汉堡包(4元)1个2个找零确认商品给出取消1元5元复位确认取消图例:开关 标签 LED指示灯 四、系统结构图:开关模块消抖模块LED指示灯数码管控制模块译码模块开始选择商品YESNO选择数量YESNO确认投币钱款已够YESNOYESNO“商品给出”指示灯亮“确认”指示灯亮数量指示灯亮商品指示灯亮取消购买YES退币数码管显示退款数NO找零数码管显示找零数复位五、状态流程图:六、程序清单1、vendor.vhd-库定义library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;-实体定义entity vendor isport(cola: in std_logic; -选择可乐开关hamburger: in std_logic; -选择汉堡开关sum1: in std_logic; -选择购买1个开关sum2: in std_logic; -选择购买2个开关note1: in std_logic; -1元纸币投掷开关note5: in std_logic; -5元纸币投掷开关rst: in std_logic; -复位开关ok: in std_logic; -确认开关cancel: in std_logic; -取消开关clk : in std_logic; -时钟信号led_cola: out std_logic; -选择可乐指示灯led_hamburger: out std_logic; -选择汉堡指示灯led_sum1: out std_logic; -选择购买1个指示灯led_sum2: out std_logic; -选择购买2个指示灯led_ok: out std_logic; -确认指示灯led_cancel: out std_logic; -取消指示灯led_out: buffer std_logic; -商品给出指示灯change_money: buffer integer range 0 to 14; -商品给出后的找零return_money: buffer integer range 0 to 10 -商品未给出的退币);end vendor;-结构体定义architecture vendor_arc of vendor issignal hold_ok: std_logic; -保持ok信号signal hold_cancel: std_logic;-保持cancel信号signal money_ok: std_logic; -钱款已够信号signal cola_choice: std_logic; -保持选择商品信号signal hamburger_choice: std_logic; signal sum1_choice: std_logic; -保持选择数目信号signal sum2_choice: std_logic;signal totalsum_note1: integer range 0 to 12; -1元纸币总钱数signal totalsum_note5: integer range 0 to 16; -5元纸币总钱数signal totalmoney: integer range 0 to 16; -总投币数signal totalprice: integer range 0 to 18; -实际需要钱款数signal goods_out: std_logic; -给出商品信号begin-计算1元纸币总钱数模块note1_counting:blockbeginprocess(rst,note1)beginif(rst='1' or hold_cancel='1') then totalsum_note1<=0;elsif rising_edge(note1) then totalsum_note1<=totalsum_note1+1;end if;end process;end block;-计算5元纸币总钱数模块note5_counting:blockbeginprocess(rst,note5)beginif(rst='1' or hold_cancel='1') then totalsum_note5<=0;elsif rising_edge(note5) then totalsum_note5<=totalsum_note5+5;end if;end process;end block;-选择商品种类模块select_goods:blockbeginprocess(rst,clk)beginif(rst='1' or hold_cancel='1' or led_out='1') thenled_cola<='0'led_hamburger<='0'cola_choice<='0'hamburger_choice<='0'elsif rising_edge(clk) thenif cola='1' thenled_cola<='1'cola_choice<='1'end if;if hamburger='1' then led_hamburger<='1'hamburger_choice<='1'end if;end if;end process;end block;-选择购买数目模块select_sum:blockbeginprocess(rst,clk)beginif(rst='1' or hold_cancel='1' or led_out='1') thenled_sum1<='0'led_sum2<='0'sum1_choice<='0'sum2_choice<='0'elsif rising_edge(clk) thenif sum1='1' thenled_sum1<='1'sum1_choice<='1'end if;if sum2='1' then led_sum2<='1'sum2_choice<='1'end if;end if;end process;end block;-计算所需总钱数模块total_money:blockbeginprocess(rst,clk)beginif (rst='1' or hold_cancel='1') then totalprice<=0;elsif rising_edge(clk) thenif(cola_choice='1' and sum1_choice='1') then totalprice<=2;elsif(cola_choice='1' and sum2_choice='1') then totalprice<=4;elsif(hamburger_choice='1' and sum1_choice='1') then totalprice<=4;elsif(hamburger_choice='1' and sum2_choice='1') then totalprice<=8;end if;end if;end process;end block;-确定与取消模块ok_or_cancel:blockbeginp1:process(rst,ok)beginif(rst='1' or hold_cancel='1' or led_out='1') then hold_ok<='0'led_ok<='0'elsif rising_edge(ok) then hold_ok<='1'led_ok<='1'end if;end process;p2:process(rst,cancel)beginif(rst='1') thenhold_cancel<='0'led_cancel<='0'elsif rising_edge(cancel) thenhold_cancel<='1'led_cancel<='1'end if;end process;end block;-退币和计算是否钱款已够模块note_return:blockbeginq1:process(rst,clk)beginif(rst='1' or hold_cancel='1') thentotalmoney<=0;money_ok<='0'elsif rising_edge(clk) thentotalmoney<=totalsum_note1 + totalsum_note5;if(totalprice/=0 and totalmoney>=totalprice) then money_ok<='1'else money_ok<='0'end if;end if;end process;q2:process(rst,cancel)beginif(rst='1') thenreturn_money<=0;elsif rising_edge(cancel) thenreturn_money<=totalmoney; end if;end process;end block;-给出商品并找零模块give_good_and_change_money:blockbeginprocess(rst,clk)beginif(rst='1' or hold_cancel='1') thengoods_out<='0'led_out<='0'change_money<=0;elsif rising_edge(clk) thenif (money_ok='1' and hold_ok='1') thenchange_money<=totalmoney - totalprice;goods_out<='1' ;led_out<=goods_out;end if; end if; end process; end block; end vendor_arc;2、fenpin.vhd-分出500Hz的时钟信号library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin isport(clk:in std_logic; -输入的2MHz时钟信号cp:out std_logic); -输出的500Hz时钟信号end fenpin;architecture fenpin_arc of fenpin isbeginprocess(clk)variable num:integer:=0;beginif(clk'event and clk='1') thenif(num=3999) thencp<='1'num:=0;else num:=num+1; cp<='0'end if;end if;end process;end fenpin_arc;3、xiaodou.vhd-防止机械开关抖动产生的毛刺影响后面的输入library ieee;use ieee.std_logic_1164.all;entity xiaodou is port(clk,input: in std_logic; output: out std_logic);end xiaodou;architecture xiaodou_arc of xiaodou issignal cp:std_logic;signal count:integer range 0 to 3;beginprocess(clk)beginif(clk'event and clk='1') thenif(input='1')thenif(count=3)then count<=count;else count<=count+1;end if;if(count=2)then cp<='1'else cp<='0'end if;else count<=0;end if;end if;output<=cp;end process;end xiaodou_arc;4、yima.vhd-将输入的数字在7段数码管上显示出来library ieee;use ieee.std_logic_1164.all;entity yima isport(data:in integer range 0 to 15; -输入的数字decodeout:out std_logic_vector(6 downto 0); -个位数码管显示decodeout1:out std_logic_vector(6 downto 0); -十位数码管显示end yima;architecture yima_arc of yima isbeginprocess(data)begincase data iswhen 0=>decodeout<="0000001" decodeout1<="0000001"when 1=>decodeout<="1001111" decodeout1<="0000001"when 2=>decodeout<="0010010" decodeout1<="0000001"when 3=>decodeout<="0000110" decodeout1<="0000001"when 4=>decodeout<="1001100" decodeout1<="0000001"when 5=>decodeout<="0100100" decodeout1<="0000001"when 6=>decodeout<="0100000" decodeout1<="0000001"when 7=>decodeout<="0001111" decodeout1<="0000001"when 8=>decodeout<="0000000" decodeout1<="0000001"when 9=>decodeout<="0000100" decodeout1<="0000001"when 10=>decodeout<="0000001" decodeout1<="1001111"when 11=>decodeout<="1001111" decodeout1<="1001111"when others=>decodeout<="0000001" decodeout1<="0000001"end case;end process;end yima_arc;5、管脚对应表端口符号端口名称引脚分配实验箱对应对象cancel取消开关PIN_139乒乓开关1change0找零个位g段PIN_93数码管3g段change1找零个位f段PIN_94数码管3f段change2找零个位e段PIN_95数码管3e段change3找零个位d段PIN_96数码管3d段change4找零个位c段PIN_97数码管3c段change5找零个位b段PIN_98数码管3b段change6找零个位a段PIN_99数码管3a段change10找零十位g段PIN_81数码管4g段change11找零十位f段PIN_82数码管4f段change12找零十位e段PIN_83数码管4e段change13找零十位d段PIN_84数码管4d段change14找零十位c段PIN_85数码管4c段change15找零十位b段PIN_86数码管4b段change16找零十位a段PIN_87数码管4a段clk2MHz时钟信号PIN_282MHz时钟cola选择可乐开关PIN_158未连接端口P1hamburger选择汉堡包开关PIN_132乒乓开关8led_cancel取消指示灯PIN_233LED指示灯1led_cola选择可乐指示灯PIN_202LED指示灯7led_hamburger选择汉堡包指示灯PIN_204LED指示灯6led_ok确认指示灯PIN_227LED指示灯3led_out商品给出指示灯PIN_228LED指示灯2led_sum1选择1个指示灯PIN_220LED指示灯5led_sum2选择2个指示灯PIN_221LED指示灯4note11元纸币投币开关PIN_135乒乓开关5note55元纸币投币开关PIN_136乒乓开关4ok确认开关PIN_138乒乓开关2return0退币个位段PIN_113数码管1g段return1退币个位段PIN_114数码管1f段return2退币个位段PIN_115数码管1e段return3退币个位段PIN_116数码管1d段return4退币个位段PIN_117数码管1c段return5退币个位段PIN_118数码管1b段return6退币个位段PIN_119数码管1a段return10退币十位段PIN_101数码管2g段return11退币十位段PIN_102数码管2f段return12退币十位段PIN_103数码管2e段return13退币十位段PIN_104数码管2d段return14退币十位段PIN_105数码管2c段return15退币十位段PIN_106数码管2b段return16退币十位段PIN_107数码管2a段rst复位开关PIN_137乒乓开关3sum1选择1个开关PIN_133乒乓开关7sum2选择2个开关P IN_134乒乓开关6七、各主要模块仿真结果波形1、vendor.vwf该仿真波形包含3个过程:(1)选择购买可乐1瓶(总价2元),确认后投入2张1元纸币,则“商品给出”指示灯亮,且return_money显示0000,即无找零。(2)选择购买汉堡包2个(总价8元),确认后投入1张5元纸币,钱款不够,取消后return_money显示0101,即退还5元。(3)选择购买可乐1瓶(总价2元),确认后投入1张5元纸币,则change_money显示0011,即找零3元。2、fenpin.vwfclk的周期设定为10ns,cp在40s时第一次出现高电平,即周期为40s,频率变为clk的1/4000。由此可知输入频率为2MHz时,输出频率应为500Hz。3、xiaodou.vwfinput信号有一些毛刺,经消抖后毛刺消除,得到单一的脉冲。4、yima.vwf可以看出,该译码器能够将BCD码转换为7段共阳极数码管对应的码。5、zdshj.bdf该数字系统的电路图如上图所示,最左边一个为分频器,中间一排9个为消抖电路,后面为控制器,右下方2个为数码管的译码器。八、课程设计总结1、此次数字系统设计结果与预期的目标有较大差异,功能上有删减,系统结构和流程上也有一些变化,主要有:(1)原本打算使用的键盘电路有些问题,有些键电路无法识别,调试多次也未找出原因,因此只好用开关产生脉冲,作为输入,其实质是相同的;(2)商品的种类减为2种,币种减为2种,增加了选择商品数量的功能,其实核心原理是类似的,只是为了减少几个开关输入和数码管输出;(3)由于系统的流程有些变化,感觉预定的定时电路用处不是很大,因此舍去了。2、该电路还可以有如下有待提高的地方:(1)商品的价格可以进行设置,当然还要加上密码电路,防止其他人随意修改价格;(2)用数码管显示自动售货机中商品的剩余数量,若某商品数量为0,则该商品无法售出;(3)可以添加赠品功能,如买2个某商品则送赠品1个等。3、此次数字系统设计使我对VHDL这种硬件描述语言有了初步的认识,进一步提高了使用Quartus 软件的能力。虽然设计过程经历了不少挫折,设计结果也没有预期的那么完美,但我觉得本次设计的目的已经达到了。如果以后我能更加深入地学习VHDL语言,对数字系统设计方法有更多的了解,我想我一定能做出更好的作品。九、参考文献1 黄正瑾编著. 计算机结构与逻辑设计. 第1版. 北京:高等教育出版社,20012 陈雪松 滕立中编著. VHDL入门与应用. 第1版. 北京:人民邮电出版社,2000