自动售饮料机逻辑电路的设计

数字电子:设计一个自动售饮料机的逻辑电路。

功能要求:它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角钱硬币后机器自动给出一瓶饮料;投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币。

1,逻辑抽象:

取投币信号为输入逻辑变量,

投入一枚一元硬币时用A=1表示,未投入时A=0。

投入一枚五角硬币用B=1表示,未投入时B=0。

找出饮料和找钱为两个输出变量,分别以Y,Z表示。

给出饮料时Y=1,不给时Y=0;

找出一枚五角硬币时Z=1,不找时Z=0。

假定通过传感器产生的投币信号(A=1或B=1)在电路转入新状态的同时也随之消失,否则将被误认为作又一次投币信号。

设未投币前电路的初始状态为S0,投入五角硬币以后为S1,投入一元硬币(包括投入一枚一元硬币和投入两枚五角硬币的情况)以后为S2。再投入一枚五角硬币后电路返回S0,同时输出Y=1,Z=0;如果投入的是一枚一元硬币,则电路也应返回S0,同时输出Y=1,Z=1。因此,电路的状态数M=3已足够,因此,可以绘制状态转化图。

2,状态转化图:

自动售饮料机逻辑电路的设计

3,用Verilog语言描述电路设计

//售货机模块

module VendingMachine(

input A, B, clk, reset,

output wire Y, Z);

 

//描述时用到的时间变量

reg [1:0] state;

wire    [1:0] in;

reg    [1:0] out;

assign in={A,B};

assign Y=out[1];

assign Y=out[0];

 

//根据设计,对输入变量的取值,以及状态进行编码

parameter S0=2’b00, S1=2’b01, S2=2’b10;

parameter NONE=2’b00, GOODS=2’b10, S2=2’b11;

parameter COIN_00=2’b00, COIN_05=2’b01, COIN_10=2’b10;

 

//同步状态转换模块

[email protected](posedge clk or postdge reset) begin

  if (reset)

    state <=S0;

    else if (state==S0)

    begin

    if (in==COIN_00)                   state<=S0;

    else if(in==COIN_05)             state<=S1;

    else if(in==COIN_10)             state<=S2;

    else                                      state<=S0;

    end

else if (state==S1)

    begin

    if (in==COIN_00)                   state<=S1;

    else if (in==COIN_05)            state<=S2;

    else if (in==COIN_10)            state<=S0;

    else                                        state<=S0;

  end

else if (state==S2)

  begin

  if (in==COIN_00)                   state<=S2;

  else if (in==COIN_05)            state<=S0;

  else if (in==COIN_10)            state<=S0;

  else                                       state<=S0;

  end

end

 

//输出模块,此例为Mealy型设计

[email protected] (state or in)

begin

if (state==S0)          out=NONE;

  else if (state==S1)

    begin

    if (in==COIN_0 || in==COIN_05)    out=NONE;

    else if (in==COIN_10)              out=GOODS;

    else

      end

else if (state==S2)

  begin

if (in==COIN_00)                             out=NONE;

  else if (in==COIN_05)             out=GOODS;

  else if (in==COIN_10)             out=ALL;

  else                              out=NONE;

  end

end

endmodule