自动售饮料机设计

  • 格式:doc
  • 大小:156.00 KB
  • 文档页数:7

现代电路与系统设计

自动售饮料机设计

姓名:王保健 学号:1200030052

2 自动售饮料机设计

1设计要求的提出和功能的构想[1][2]

① 该饮料机能识别0.5元和1.0元两种硬币;

② 售出3种不同价格的饮料,饮料价格分别为2.5元、3.0元和3.5元;

③ 具有找零功能;

④ 购买者能自主选择所购买的饮料;

⑤ 饮料机在每卖出一次饮料后能自动复位。

因为饮料的价格最高为3.5元,所以设计饮料机最多可接受4.0元的硬币。

2分析设计要求并画出原始状态图

该自动售饮料机设有一个投币孔,通过传感器来识别两种硬币,给出两个不同的信号。在此用half_dollar和one_dollar分别表示投入0.5元和1.0元硬币后电路接收到的两个信号;三个饮料选择按键choose01表示选择价格为2.5元的饮料,choose10表示选择价格为3.0元的饮料,choose11表示选择价格为3.5元的饮料;rest表示复位按键;有2个输出口分别为饮料出口dispense和找零出口out1;用s0表示初始状态,s1表示投入0.5元硬币时的状态,s2表示投入1.0元硬币时的状态,s3表示投入1.5元硬币时的状态,s4表示投入2.0元时的状态;clk表示时钟信号;机器最多接受的钱币为4.0元。

当投入的钱币到达2.5元或高于2.5元时机器处于开始出售饮料的状态。当到达2.5元时如果选择购买2.5元的饮料(choose01)则系统给出一个饮料,即dispense为高电平一次。如果投入的钱币到达3.0元并且选择购买2.5元的饮料则系统显示给出一个饮料并找出1枚0.5元的硬币,即dispense为高电平一次out1为高电平一次。如果选择购买3.0元的饮料(choose10),则系统显示给出一个3.0元的饮料,即饮料输出信号dispense为高电平一次。依次类推。

图1.1为本次设计所构想的状态图。

图1.1 状态图

3程序设计

根据上述对自动售饮料机逻辑状态的分析,编写程序如下:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity stmch1 is

port(clk , rst ,half_dollar ,one_dollar: in std_logic;

choose :in std_logic_vector(1 downto 0);

out1 ,dispense: out std_logic);

end stmch1;

状态2 状态1

状态4 状态3

购买01 投入0.5元 投入0.5元

投入0.5元 投入0.5元 投入0.5元

投入1.0元 投入1.0元

状态5 状态6

状态7 状态8 投入0.5元

不购买01 购买11 购买10 不购买11 不购买10 投入1.0元

投入1.0元

投入1.0元 投入1.0元

4 architecture behave of stmch1 is

type state_values is (s0 , s1 , s2 ,s3 ,s4,s5 ,s6 , s7);

signal state , next_state: state_values;

begin

process (clk , rst)

begin

if rst = '1' then

state <= s0;

elsif (clk'event and clk='1') then

state <= next_state;

end if;

end process;

process (state , half_dollar ,one_dollar ,choose)

begin

out1 <= '0';dispense<='0';

next_state <= s0;

case state is

when s0 =>

if (half_dollar='1') then

next_state <= s1;

elsif (one_dollar='1' )then

next_state <= s2;

else next_state <= s0;

end if;

when s1 =>

if (half_dollar='1') then

next_state <= s2;

elsif( one_dollar='1') then

next_state <= s3;

else next_state <= s1;

end if;

when s2 =>

if (half_dollar='1') then

next_state <= s3;

elsif( one_dollar='1') then

next_state <= s4;

else next_state <= s2;

end if;

when s3 =>

if (half_dollar='1') then

next_state <= s4;

elsif( one_dollar='1') then

5 next_state<=s5;

else next_state <= s3;

end if;

when s4 =>

if (half_dollar='1') then

if(choose="01") then

dispense<='1';

else next_state <= s4;

end if;

elsif( one_dollar='1')then

if(choose="01") then

dispense<='1';

out1<='1';

elsif (choose="10") then

dispense<='1';

end if;

else next_state<=s4;

end if;

when s5 =>

if (choose="01") then dispense<='1';

elsif (choose="10") then

if (half_dollar='1')then

dispense<='1';

elsif(one_dollar='1')then

dispense<='1';

out1<='1';

end if;

else next_state<=s5;

end if;

when s6 =>

if (choose="01") then

dispense<='1';

out1<='1';

elsif (choose="10") then dispense<='1';

elsif (choose="11") then

if (half_dollar='1')then

dispense<='1';

elsif(one_dollar='1')then

dispense<='1';

out1<='1';

end if;

else next_state<=s6;

end if;

when s7=>

6 if (choose="11") then

dispense<='1';

else next_state<=s7;

end if;

end case;

end process;

end behave;

4 仿真波形分析

根据投币信息和购买类型的不同组合,会产生很多种输出波形。在此仅以几种典型情况为例,给出其仿真波形。如下图4.5为当选择购买2.5元的饮料并投入三枚1.0元的硬币时的波形。

由图可以看到当投入3.0元时,dispense(饮料机的饮料输出端)给出高电平一次,也就是系统给出一个价值2.5元的饮料和out1(找零的输出端)为高电平一次,即给出0.5元的硬币一枚。

图4.5 投两枚1元硬币购买饮料1时的波形

如下图4.6所示为当选择饮料2,即价格为3.0元的饮料时,投入两枚3.0元的硬币时所出现的波形。因为价格和所投入的钱币相同,所以找零为零,只给出一个价格为3.0元的饮料,即dispense在上升沿到来时变为高电平一次。

图4.6 投三枚1元硬币购买饮料2时的波形

如图4.7所示为当选择饮料3时,并投入4枚1.0元的硬币时的波形图。在这时机器应该给出1个价格为3.5元的饮料的同时给出一枚0.5元的硬币。

在图中我们看到当投入4枚一元的硬币后的第一个上升沿到来后,dispense和out1同时出现高电平一次,即给出一个价格为3.5元的饮料并找出0.5元,这与所设想的一样,说明所编写的程序是正确的。

图4.7 投4枚1元硬币购买饮料3时的波形