收藏 分销(赏)

自动售邮票机的控制电路设计.doc

上传人:天**** 文档编号:3380768 上传时间:2024-07-03 格式:DOC 页数:20 大小:47KB 下载积分:10 金币
下载 相关 举报
自动售邮票机的控制电路设计.doc_第1页
第1页 / 共20页
自动售邮票机的控制电路设计.doc_第2页
第2页 / 共20页


点击查看更多>>
资源描述
题目:自动售邮票机的控制电路设计 用两个发光二极管分别模拟售出面值为6角和8角的邮票,购买者可以通过开关选择一种一种面值的邮票,灯亮表达邮票售出,用开关分别模拟1角、5角和1元硬币投入,用发光二极管分别代表找回的剩余的硬币,每次只能售出一枚邮票,当所投硬币达成或超过购买者所选面值时,售出一枚邮票,并找回剩余的硬币,回到初始状态;当所投硬币值局限性面值时,可以通过一个复位键退回所投硬币,回到初始状态。 EDA 实验设计报告 题 目:自动售邮票机的控制电路设计 班 级: 姓 名: 指导教师: 完毕时间: 2023-5-30 一、 设计目的与规定 用两个发光二极管分别模拟售出面值为6角和8角的邮票,购买者可以通过开关选择一种一种面值的邮票,灯亮表达邮票售出,用开关分别模拟1角、5角和1元硬币投入,用发光二极管分别代表找回的剩余的硬币,每次只能售出一枚邮票,当所投硬币达成或超过购买者所选面值时,售出一枚邮票,并找回剩余的硬币,回到初始状态;当所投硬币值局限性面值时,可以通过一个复位键退回所投硬币,回到初始状态。 二、 设计方案 找零 1、整体方框图 判决电路 脉冲发生器 复位电路 输入电路 售出邮票 2、设计原理 运用状态机模拟输入累加的钱的总数,通过判决电路对输入的钱的总值进行判断,根据判断结果做出售票、找零、复位等相应的动作。 而对状态机得应用应注意其设计环节: a. 逻辑抽象。分析给定的逻辑问题,搞清楚输入和输出,通常取因素或者条件为输入,结果为输出。然后定义输入输出逻辑状态和每个电路状态的含义,并对电路各个状态进行排序和它们之间的转换关系搞清楚。这个过程非常需要严谨务实的作风,由于定义电路的状态的优劣会影响你的整个设计。假如大方向都没有搞好,接下来的设计会变得艰难,甚至走入死角。届时候又回过头来重新定义分析。 b. 通过从实际问题分析出来的时序问题,通过画出状态图一目了然搞清楚它们之间的转换关系。并对状态图进行化简优化。对在相同的输入下有相同输出,并转换到同样一个次态的。要进行合并,这样设计出来的状态机会更简朴,高效。 3、 设计思绪 运用状态机,分别模拟所输入的钱的累积值,根据输入的钱的面值的不同,进入不同的次态,在各个不同的状态下,又通过比较所输入的钱的总值与所选邮票的面值,做出售出邮票并找出相应的零钱。 在下述实验原理中,进程一为脉冲发生电路,不断的通过脉冲变化来扫描是否有相应的输入。进程二是状态转换,将次态的值重新付给现态,不断的改变现有状态。进程三中,一方面判断了是选择的何种面值的邮票,并且在复位信号没有被按下的情况下对所售面值为六毛的邮票进行了分析解决,从刚开始输入为零时,根据输入不同的面值的钱来判断下一个状态是什么,并且对在每个相应状态下应当做什么进行了指明,例如假如刚开始输入了一毛,则由初始状态转到输入了一毛的这个状态,假如此时继续输入钱,根据输入的面值进入下一个相应状态,而假如此时按下复位信号,则找出这一毛钱,当然这时是不会售出邮票的,同时现态恢复为初始状态 在选购六毛邮票的情况下,设投币初始状态为ST0,假如投入一枚一毛硬币为(累积一毛)ST1, 假如投入一枚五毛硬币为(累积五毛)ST5,假如投入一枚一元硬币则输出一枚邮票并且找零四毛且次态重新定义为初始状态ST0;在ST1状态下假如再次输入一枚一毛硬币(累计两毛)为ST2,假如投入一枚五毛硬币(累计六毛)则输出一枚邮票且次态重新定义为初始状态ST0,假如投入一枚一元硬币(累计一块一)则输出一枚邮票并且找零五毛且次态重新定义为初始状态ST0;在ST2状态下假如再次输入一枚一毛硬币(累计三毛)为ST3,假如投入一枚五毛硬币(累计七毛)则输出一枚邮票并且找零一毛且次态重新定义为初始状态ST0,假如投入一枚一元硬币(累计一块二)则输出一枚邮票并且找零六毛且次态重新定义为初始状态ST0;在ST3状态下假如再次输入一枚一毛硬币(累计四毛)为ST4,假如投入一枚五毛硬币(累计八毛)则输出一枚邮票并且找零两毛且次态重新定义为初始状态ST0,假如投入一枚一元硬币(累计一块三)则输出一枚邮票并且找零七毛且次态重新定义为初始状态ST0;在ST4状态下假如再次输入一枚一毛硬币(累计五毛)为ST5,假如投入一枚五毛硬币(累计九毛)则输出一枚邮票并且找零三毛且次态重新定义为初始状态ST0,假如投入一枚一元硬币(累计一块四)则输出一枚邮票并且找零八毛且次态重新定义为初始状态ST0;在ST5状态下假如再次输入一枚一毛硬币(累计六毛)则输出一枚邮票并且态重新定义为初始状态ST0,假如投入一枚五毛硬币(累计一元)则输出一枚邮票并且找零四毛且次态重新定义为初始状态ST0,假如投入一枚一元硬币(累计一块五)则输出一枚邮票并且找零九毛且次态重新定义为初始状态ST0。 假如选择的邮票面值为八毛,七基本原理和六毛面值邮票的同样,在这里就不赘述了。 假如在累计钱数小于邮票面值的情况下按下复位键,这时找零端口的输出为此时的钱的总和,可以实现退钱是通过在每个状态下定义了两个找零信号,在为按复位键的情况下是将信号SIG_ZHAO赋值给找零信号端口,而在按下复位键的情况下,找零信号端口的输出为ZHAORE这个信号的值,而这两个信号的值在不同状态下有相应的不同的值,根据以上思绪我们便可以进行程序的编写了。 4 实验程序 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY ZIDONG IS PORT ( RESET : IN STD_LOGIC; --复位信号 CLK,LIU,BA : IN STD_LOGIC; -- INYM,INWM,INYY : IN STD_LOGIC; --钱输入端口 YOU : OUT STD_LOGIC; --邮票出口 ZHAO : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); --找钱出口 END ZIDONG; ARCHITECTURE BEHAV OF ZIDONG IS TYPE STATES IS (ST0,ST1,ST2,ST3,ST4,ST5,ST6,ST7);--状态定义 SIGNAL YIMAO,WUMAO,YIKUAI : STD_LOGIC; --钱输入信号 SIGNAL SIG_YOU : STD_LOGIC; --输出相应信号 SIGNAL SIG_ZHAO : STD_LOGIC_VECTOR(3 DOWNTO 0);--找零相应信号 SIGNAL ZHAORE :STD_LOGIC_VECTOR(3 DOWNTO 0);--复位时的找零 SIGNAL CURRENT_STATE : STATES; --现态 SIGNAL NEXT_STATE : STATES; --次态 BEGIN P1 :PROCESS(CLK) --将输入送相应的信号 BEGIN IF CLK'EVENT AND CLK='1' THEN YIMAO <= INYM; WUMAO <= INWM; YIKUAI <=INYY; END IF; END PROCESS P1; p2 :PROCESS(RESET,CLK)--次态给现态 BEGIN IF RESET = '1' THEN CURRENT_STATE <= ST0; ELSIF CLK'EVENT AND CLK='1' THEN CURRENT_STATE <= NEXT_STATE; END IF; END PROCESS p2; p3 :PROCESS(CLK,CURRENT_STATE,NEXT_STATE,YIMAO,WUMAO,YIKUAI)--状态转换 BEGIN IF RESET ='1' THEN SIG_ZHAO<=ZHAORE;NEXT_STATE<=ST0;--复位找钱 ELSIF LIU='1'THEN CASE CURRENT_STATE IS WHEN ST0 => ZHAORE<="0000"; --状态S0 IF YIMAO = '1' THEN --输入1毛 SIG_YOU <= '0'; --不出邮票 SIG_ZHAO <= "0000"; --不找钱 NEXT_STATE <= ST1; --次态为ST1 ELSIF WUMAO = '1' THEN --输入5毛 SIG_YOU <= '1'; --出邮票 SIG_ZHAO <= "0000"; --不找钱 NEXT_STATE <= ST5; --次态为ST5 ELSIF YIKUAI ='1' THEN --输入1块 SIG_YOU <= '1'; --出邮票 SIG_ZHAO <= "0100"; --找4毛 NEXT_STATE <= ST0; --次态为ST0 ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; --不输入 都不变 NEXT_STATE <= ST0; END IF; WHEN ST1 => ZHAORE<="0001" ; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST2; ELSIF WUMAO = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST0; ELSIF YIKUAI = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0101"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST1; END IF; WHEN ST2 => ZHAORE<="0010"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST3; ELSIF WUMAO = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0001"; NEXT_STATE <= ST0; ELSIF YIKUAI = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0110"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST2; END IF; WHEN ST3 => ZHAORE<="0011"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST4; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0010"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0111"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST3; END IF; WHEN ST4 =>ZHAORE<="0100"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST5; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0011"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "1000"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST4; END IF; WHEN ST5 => ZHAORE<="0101"; IF YIMAO = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST0; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0100"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "1001"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST5; END IF; WHEN OTHERS => NULL; --其他状态 空操作 END CASE; ELSIF BA='1'THEN --选择8毛的邮票 CASE CURRENT_STATE IS WHEN ST0 => ZHAORE<="0000"; --状态S0 IF YIMAO = '1' THEN --输入1毛 SIG_YOU <= '0'; --不出邮票 SIG_ZHAO <= "0000"; --不找钱 NEXT_STATE <= ST1; --次态为ST1 ELSIF WUMAO = '1' THEN --输入5毛 SIG_YOU <= '0'; --不出邮票 SIG_ZHAO <= "0000"; --不找钱 NEXT_STATE <= ST5; --次态为ST5 ELSIF YIKUAI ='1' THEN --输入1块 SIG_YOU <= '1'; --出邮票 SIG_ZHAO <= "0010"; --找2毛 NEXT_STATE <= ST0; --次态为ST0 ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; --不输入 都不变 NEXT_STATE <= ST0; END IF; WHEN ST1 => ZHAORE<="0001" ; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST2; ELSIF WUMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST6; ELSIF YIKUAI = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0011"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST1; END IF; WHEN ST2 => ZHAORE<="0010"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST3; ELSIF WUMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST7; ELSIF YIKUAI = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0100"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST2; END IF; WHEN ST3 => ZHAORE<="0011"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST4; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0101"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST3; END IF; WHEN ST4 =>ZHAORE<="0100"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST5; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0001"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0110"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST4; END IF; WHEN ST5 => ZHAORE<="0101"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST6; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0010"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0111"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST5; END IF; WHEN ST6 => ZHAORE<="0110"; IF YIMAO = '1' THEN SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST7; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0011"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "1000"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST6; END IF; WHEN ST7 => ZHAORE<="0111"; IF YIMAO = '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST0; ELSIF WUMAO= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "0100"; NEXT_STATE <= ST0; ELSIF YIKUAI= '1' THEN SIG_YOU <= '1'; SIG_ZHAO <= "1001"; NEXT_STATE <= ST0; ELSE SIG_YOU <= '0'; SIG_ZHAO <= "0000"; NEXT_STATE <= ST7; END IF; WHEN OTHERS => NULL; --其他状态 空操作 END CASE; END IF; END PROCESS p3; p4 :PROCESS(CLK,SIG_YOU,SIG_ZHAO)--将输出信号送输出端 BEGIN IF CLK'EVENT AND CLK='1' THEN YOU <= SIG_YOU; ZHAO <= SIG_ZHAO; END IF; END PROCESS p4; END BEHAV; 三、电路的连接调试与问题 在程序编写完毕后按照编译仿真后的下载图对的连接电路,通过高低电平开关模拟钱的输入,通过在实验箱上的模拟仿真,发现在输入端存在输入一次而模拟机却扫描到有多次输入这一问题,后来我们将扫描脉冲与输入端的脉冲进行了分离,也就是定义了两个脉冲,扫描脉冲依旧频率不久,不断对输入信号进行扫描,此外将输入端得脉冲频率调低,通过这样的改善有所进步,不再是输入一次而被多次的扫描,但是这样的改善也并没有彻底解决问题,通过我们的讨论我们发现,我们的设计最适合弹片式的输入端,那样在一次输入的情况下,弹片只也许被压下一次,这样脉冲也只能在弹片被压下的那一刻扫描到有输入存在,在很短的时间内弹片又恢复原有状态,这样就避免了一次输入被误认为有多次输入的这一问题。 四、自我评价与心得体会 这是一次故意义的EDA实验设计课题,也是一次综合性很强的实验,通过这次实验课题设计,不仅加深了我们对EDA设计思绪的理解,更重要的是对VHDL语言以及其中的状态机的设计与应用有了更进一步的了解,使我们的设计思绪有了进一步的提高,并且进一步的回顾并巩固了以前所学的知识。也让我们尝到一步步将问题克服收获到成功的喜悦,坚定了我们克服困难解决问题的意志,在这一次实验中,我们小组也充足发挥了小组的力量,结识到合作的精神所在,通过集体的合作,培养了我们每个人实际动手、分析问题、解决问题的能力,让我们每个人都受益匪浅!
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服