自动售饮料机逻辑电路的设计
数字电子:设计一个自动售饮料机的逻辑电路。
功能要求:它的投币口每次只能投入一枚五角或一元的硬币。投入一元五角钱硬币后机器自动给出一瓶饮料;投入两元(两枚一元)硬币后,在给出饮料的同时找回一枚五角的硬币。
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