自动售邮票机的控制电路设计说明
- 格式:doc
- 大小:64.50 KB
- 文档页数:15
题目:自动售邮票机的控制电路设计用两个发光二极管分别模拟售出面值为6角和8角的邮票,购买者可以通过开关选择一种一种面值的邮票,灯亮表示邮票售出,用开关分别模拟1角、5角和1元硬币投入,用发光二极管分别代表找回的剩余的硬币,每次只能售出一枚邮票,当所投硬币达到或超过购买者所选面值时,售出一枚邮票,并找回剩余的硬币,回到初始状态;当所投硬币值不足面值时,可以通过一个复位键退回所投硬币,回到初始状态。
EDA实验设计报告题目:自动售邮票机的控制电路设计班级:姓名:指导教师:完成时间: 2011-5-30一、设计目标与要求用两个发光二极管分别模拟售出面值为6角和8角的邮票,购买者可以通过开关选择一种一种面值的邮票,灯亮表示邮票售出,用开关分别模拟1角、5角和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 ISPORT ( 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 ISTYPE 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; --次态BEGINP1 :PROCESS(CLK) --将输入送相应的信号BEGINIF CLK'EVENT AND CLK='1' THENYIMAO <= INYM;WUMAO <= INWM;YIKUAI <=INYY;END IF;END PROCESS P1;p2 :PROCESS(RESET,CLK)--次态给现态BEGINIF RESET = '1' THENCURRENT_STATE <= ST0;ELSIF CLK'EVENT AND CLK='1' THENCURRENT_STATE <= NEXT_STATE;END IF;END PROCESS p2;p3 :PROCESS(CLK,CURRENT_STATE,NEXT_STATE,YIMAO,WUMAO,YIKUAI)--状态转换BEGINIF RESET ='1' THEN SIG_ZHAO<=ZHAORE;NEXT_STATE<=ST0;--复位找钱ELSIF LIU='1'THENCASE CURRENT_STATE ISWHEN ST0 => ZHAORE<="0000"; --状态S0IF YIMAO = '1' THEN --输入1毛SIG_YOU <= '0'; --不出邮票SIG_ZHAO <= "0000"; --不找钱NEXT_STATE <= ST1; --次态为ST1ELSIF WUMAO = '1' THEN --输入5毛SIG_YOU <= '1'; --出邮票SIG_ZHAO <= "0000"; --不找钱NEXT_STATE <= ST5; --次态为ST5ELSIF YIKUAI ='1' THEN --输入1块SIG_YOU <= '1'; --出邮票SIG_ZHAO <= "0100"; --找4毛NEXT_STATE <= ST0; --次态为ST0ELSESIG_YOU <= '0';SIG_ZHAO <= "0000"; --不输入都不变NEXT_STATE <= ST0;END IF;WHEN ST1 => ZHAORE<="0001" ;IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST2;ELSIF WUMAO = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0000";NEXT_STATE <= ST0;ELSIF YIKUAI = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0101";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST1;END IF;WHEN ST2 => ZHAORE<="0010";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST3;ELSIF WUMAO = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0001";NEXT_STATE <= ST0;ELSIF YIKUAI = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0110";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST2;END IF;WHEN ST3 => ZHAORE<="0011";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST4;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0010";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0111";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST3;END IF;WHEN ST4 =>ZHAORE<="0100";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST5;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0011";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "1000";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST4;END IF;WHEN ST5 => ZHAORE<="0101";IF YIMAO = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0000";NEXT_STATE <= ST0;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0100";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "1001";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST5;END IF;WHEN OTHERS => NULL; --其他状态空操作END CASE;ELSIF BA='1'THEN --选择8毛的邮票CASE CURRENT_STATE ISWHEN ST0 => ZHAORE<="0000"; --状态S0IF YIMAO = '1' THEN --输入1毛SIG_YOU <= '0'; --不出邮票SIG_ZHAO <= "0000"; --不找钱NEXT_STATE <= ST1; --次态为ST1ELSIF WUMAO = '1' THEN --输入5毛SIG_YOU <= '0'; --不出邮票SIG_ZHAO <= "0000"; --不找钱NEXT_STATE <= ST5; --次态为ST5ELSIF YIKUAI ='1' THEN --输入1块SIG_YOU <= '1'; --出邮票SIG_ZHAO <= "0010"; --找2毛NEXT_STATE <= ST0; --次态为ST0ELSESIG_YOU <= '0';SIG_ZHAO <= "0000"; --不输入都不变NEXT_STATE <= ST0;END IF;WHEN ST1 => ZHAORE<="0001" ;IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST2;ELSIF WUMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST6;ELSIF YIKUAI = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0011";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST1;END IF;WHEN ST2 => ZHAORE<="0010";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST3;ELSIF WUMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST7;ELSIF YIKUAI = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0100";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST2;END IF;WHEN ST3 => ZHAORE<="0011";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST4;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0000";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0101";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST3;END IF;WHEN ST4 =>ZHAORE<="0100";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST5;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0001";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0110";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST4;END IF;WHEN ST5 => ZHAORE<="0101";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST6;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0010";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0111";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST5;END IF;WHEN ST6 => ZHAORE<="0110";IF YIMAO = '1' THENSIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST7;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0011";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "1000";NEXT_STATE <= ST0;ELSESIG_YOU <= '0';SIG_ZHAO <= "0000";NEXT_STATE <= ST6;END IF;WHEN ST7 => ZHAORE<="0111";IF YIMAO = '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0000";NEXT_STATE <= ST0;ELSIF WUMAO= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "0100";NEXT_STATE <= ST0;ELSIF YIKUAI= '1' THENSIG_YOU <= '1';SIG_ZHAO <= "1001";NEXT_STATE <= ST0;ELSESIG_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)--将输出信号送输出端BEGINIF CLK'EVENT AND CLK='1' THENYOU <= SIG_YOU;ZHAO <= SIG_ZHAO;END IF;END PROCESS p4;END BEHAV;三、电路的连接调试与问题在程序编写完毕后按照编译仿真后的下载图正确连接电路,通过高低电平开关模拟钱的输入,通过在实验箱上的模拟仿真,发现在输入端存在输入一次而模拟机却扫描到有多次输入这一问题,后来我们将扫描脉冲与输入端的脉冲进行了分离,也就是定义了两个脉冲,扫描脉冲依旧频率很快,不断对输入信号进行扫描,另外将输入端得脉冲频率调低,经过这样的改进有所进步,不再是输入一次而被多次的扫描,但是这样的改进也并没有彻底解决问题,经过我们的讨论我们发现,我们的设计最适合弹片式的输入端,那样在一次输入的情况下,弹片只可能被压下一次,这样脉冲也只能在弹片被压下的那一刻扫描到有输入存在,在很短的时间弹片又恢复原有状态,这样就避免了一次输入被误认为有多次输入的这一问题。