使用verilog设计电路,完成以下功能:每瓶饮料1.5元,一次只能投入一个硬币,可投入0.5与1.0两种硬币,具有找零功能。
原理
一瓶饮料1.5元,一次投入一个硬币,那么饮料机中硬币对应面值最多为2.0元,使用状态机设计电路,根据饮料机中剩余的硬币面值进行状态划分
状态划分
◆IDLE:复位状态,饮料机余额为0
◆s1:饮料机余额0.5元
◆s2:饮料机余额1.0元
◆s3:饮料机余额1.5元(输出饮料,不找零)
◆s4:饮料机余额2.0元(输出饮料,找零0.5元)
对于状态机的输入来说
input [1:0] money: money[1]为1元;money[0]为0.5元
output drink: 输出饮料状态
output coin: 输出硬币是否找零
状态转移图想画的好看有点复杂,按照00/01递进就行,略。
代码实现
module drink_machine(
input clk,
input rst_n,
input [1:0] money,
output drink,
output coin
);
parameter IDLE = 3'd0; // 余额0
parameter s1 = 3'd1; // 余额0.5
parameter s2 = 3'd2; // 余额1.0
parameter s3 = 3'd3; // 余额1.5
parameter s4 = 3'd4; // 余额2.0
reg [2 : 0] state;
reg [2 : 0] nstate;
always@(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
state <= IDLE;
else
state <= nstate;
end
always@(*) begin
case(state)
IDLE : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
s1 : nstate = money[1] ? s3 : (money[0] ? s2 : s1);
s2 : nstate = money[1] ? s4 : (money[0] ? s3 : s2);
s3 : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
s4 : nstate = money[1] ? s2 : (money[0] ? s1 : IDLE);
dafault nstate = IDLE;
endcase
end
assign drink = (state == s3 || state == s4) ? 1 : 0;
assign coin = (state == s4) ? 1 : 0;
endmodule