Verilog-自动售卖机

基础

题目

输入输出及状态定义

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:交易完成,并找零

状态转移:

posted @ 2020-06-02 20:03  笑着刻印在那一张泛黄  阅读(585)  评论(0编辑  收藏  举报