使用Verilog设计电路,完成以下功能:每瓶饮料1.5元,一次只能投入一个硬币,可投入0.5与1.0两种硬币,具有找零功能。
这个手撕代码应该用状态机来完成
IDLE:复位状态,表示饮料机中的余额为0元
s1:饮料机的余额为0.5元
s2:饮料机中的余额为1元
s3:饮料机中的余额为1.5元(输出饮料,不找零)
s4:饮料集中的余额为2元(输出饮料,找零)
分别设置两个输入(五毛、一块)和两个输出(出饮料、找零)
module ylj(clk,rst,pfive,one,cush,drink);
input clk,rst,pfive,one;
output cush,drink;
parameter IDLE=3'd0,S1=3'd1,S2=3'd2,S3=3'd3,S4=3'd4;
reg[2:0]state,nstate;
always@(posedge clk or negedge rst)begin
if(!rst)
state<=IDLE;
else
state<=nstate;
end
always@(*)begin
case(state)
IDLE: nstate=pfive?S1:(one?S2:IDLE);
S1:nstate=pfive?S2:(one?S3:S1);
S2:nstate=pfive?S3:(one?S4:S2);
S3:nstate=pfive?S1:(one?S2:IDLE);
S4:nstate=pfive?S1:(one?S2:IDLE);
default:nstate=IDLE;
endcase
end
assign cush=(state==S4)?1:0;
assign drink=(state==S3||state==S4)?1:0;
endmodule
testbench 五毛一块只有一个为1
`timescale 1ns/1ps
module ylj_tb();
reg clk;
reg rst;
reg pfive;
reg one;
wire cush;
wire drink;
ylj u1(.clk(clk),.rst(rst),.pfive(pfive),.one(one),.cush(cush),.drink(drink));
always
#5 clk=~clk;
always begin
#9.999 pfive=$random;
one=!pfive;
end
initial begin
clk=0;
rst=1;
#10 rst=0;
#20 rst=1;
#300
$stop;
end
endmodule
波形