用verilog设计一个自动售货机,实现以下功能: a. 机器接受1元硬币; b. 机器共提供4种货物,价格分别为1元、2元、3元、4元,并且数量初始值分别为8、7、6、9; c. 顾客先选择需要的一种货物,再确认所选货物后,进入投币状态。当顾客选择的货物卖光时,在顾客确认货物之时,提示顾客货物卖光,并返回初始状态。 d. 若等待30s,顾客不投币,则返回初始状态;顾客投币后,系统自动计算所投钱币。若投币够,则出货找零。若30s后或用户按下确认键后,投币不够,则退币并返回初始状态。
时间: 2024-03-21 18:44:20 浏览: 84
基于Verilog语言的自动售货机的设计
以下是一个可能的 Verilog 设计,实现了自动售货机的功能:
```verilog
module vending_machine(
input clk, // 时钟信号
input rst, // 复位信号
input coin, // 投币信号
input [1:0] choice, // 选择信号
input confirm, // 确认信号
output [1:0] out, // 出货信号
output reg [3:0] change // 找零信号
);
// 定义状态类型和状态常量
typedef enum logic [3:0] {
ST_IDLE, ST_SELECT, ST_COIN, ST_SOLD, ST_CHANGE, ST_REFUND
} state_t;
localparam state_t INIT_STATE = ST_IDLE;
// 定义常量
localparam int COIN_PRICE[4] = '{1, 2, 3, 4};
localparam int COIN_QUANTITY[4] = '{8, 7, 6, 9};
localparam int TIMEOUT = 30000000; // 30s
// 定义寄存器
reg [2:0] cnt;
reg [1:0] sel;
reg [2:0] timeout;
reg [3:0] state;
// 状态机逻辑
always_ff @(posedge clk) begin
if (rst) begin
cnt <= 0;
sel <= 0;
timeout <= TIMEOUT;
state <= INIT_STATE;
change <= 0;
end else begin
case (state)
ST_IDLE: begin
sel <= choice;
if (confirm) begin
if (COIN_QUANTITY[sel] > 0) begin
state <= ST_COIN;
end else begin
state <= ST_REFUND;
end
end
end
ST_SELECT: begin
sel <= choice;
state <= ST_COIN;
end
ST_COIN: begin
if (timeout == 0) begin
state <= ST_REFUND;
end else if (coin) begin
cnt <= cnt + 1;
timeout <= TIMEOUT;
end else if (cnt * COIN_PRICE[sel] >= COIN_PRICE[sel]) begin
COIN_QUANTITY[sel] <= COIN_QUANTITY[sel] - 1;
out <= sel;
change <= cnt * COIN_PRICE[sel] - COIN_PRICE[sel];
state <= ST_CHANGE;
end else if (confirm) begin
state <= ST_REFUND;
end else begin
timeout <= timeout - 1;
end
end
ST_SOLD: begin
out <= sel;
change <= 0;
state <= ST_IDLE;
end
ST_CHANGE: begin
if (cnt * COIN_PRICE[sel] > COIN_PRICE[sel]) begin
change <= change - 1;
end else begin
state <= ST_SOLD;
end
end
ST_REFUND: begin
change <= cnt * COIN_PRICE[sel];
state <= ST_IDLE;
end
endcase
end
end
endmodule
```
该模块包含一个状态机,实现了自动售货机的全部功能。状态机有六个状态,分别是:
- ST_IDLE:初始状态,等待顾客选择货物;
- ST_SELECT:顾客选择新的货物;
- ST_COIN:顾客投币状态;
- ST_SOLD:售货成功状态;
- ST_CHANGE:找零状态;
- ST_REFUND:退币状态。
状态机的行为如下:
- 初始状态下,等待顾客选择货物。当顾客选择新的货物时,转移到 ST_SELECT 状态;
- 在 ST_SELECT 状态下,记录顾客选择的货物,并转移到 ST_COIN 状态;
- 在 ST_COIN 状态下,等待顾客投币。如果顾客投币不够或确认键按下,转移到 ST_REFUND 状态;如果顾客投币够,转移到 ST_CHANGE 状态;如果等待超时,转移到 ST_REFUND 状态;
- 在 ST_CHANGE 状态下,找零并等待顾客取走货物。如果找零完毕,转移到 ST_SOLD 状态;
- 在 ST_SOLD 状态下,等待顾客取走货物。如果顾客取走货物,转移到 ST_IDLE 状态;
- 在 ST_REFUND 状态下,退币并等待顾客取走退币。如果顾客取走退币,转移到 ST_IDLE 状态。
该设计使用了 Verilog 中的状态机实现,可以通过仿真验证其正确性,并可以使用 FPGA 等器件实现自动售货机的功能。
阅读全文