基础
题目
输入输出及状态定义
input:
[1:0] coin; coin=00,01:无投币操作;coin=10:投入5分硬币;coin=11:投入10分硬币
output:
retuin_coin; return_coin=1:找回5分硬币; return_coin=0:不找回
finish; finish=1:交易完成,售出饮料; finish=0:交易还未完成
state:
IDLE:闲置状态
WAIT:等待再次投币的状态
PAY:交易完成,不找零状态
PAY_RETURN:交易完成,并找零
状态转移:
代码
`timescale 1ns / 1ps
module vending_machine(
input clk,
input rstn,
input [1:0] coin,
output return_coin,
output finish
);
localparam IDLE = 2'd0;
localparam WAIT = 2'd1;
localparam PAY = 2'd2;
localparam PAY_RETURN = 2'd3;
reg [1:0] state,next_state;
always @(posedge clk or negedge rstn) begin
if(!rstn) state <= IDLE;
else state <= next_state;
end
always @(*) begin
case(state)
IDLE:
begin
case(coin)
2'b00,2'b01:next_state = IDLE;
2'b10:next_state = WAIT;
2'b11:next_state = PAY;
endcase
end
WAIT:
begin
case(coin)
2'b00,2'b01:next_state = IDLE;
2'b10:next_state = PAY;
2'b11:next_state = PAY_RETURN;
endcase
end
PAY,PAY_RETURN:next_state = IDLE;
default:next_state = IDLE;
endcase
end
assign return_coin = (state == PAY_RETURN)? 1'b1 : 1'b0;
assign finish = (state == PAY || state == PAY_RETURN)? 1'b1 : 1'b0;
endmodule
仿真波形
第一次直接投10分硬币;第二次先投5分,再投5分;第二次先投5分,再投10分
扩展
设计一个自动饮料售卖机,饮料有A和B两种,A价格为5分,B价格为10分,硬币有5分和10分两种,并考虑找零
输入输出及状态定义
input:
[1:0] sel; sel=00,01:无选择操作;sel=10:选择5分饮料;sel=11:选择10分饮料
[1:0] coin; coin=00,01:无投币操作;coin=10:投入5分硬币;coin=11:投入10分硬币
output:
retuin_coin; return_coin=1:找回5分硬币; return_coin=0:不找回
finish; finish=1:交易完成,售出饮料; finish=0:交易还未完成
state:
IDLE:闲置状态
PAY_A:购买A饮料(5分)的状态
PAY_B:购买B饮料(10分)的状态
WAIT:购买B饮料等待再次投币的状态
FINISH:交易完成,不找零状态
RETURN:交易完成,并找零
状态转移: