设计一个自动饮料售卖机,饮料 1.5元,硬币有5角和1元的两种,并考虑找零。注意,一次只能投一枚硬币,一次只能找零一枚硬币。请自行定义输入输出信号含义,画出状态机状态转换图,并用verilog语言完成设计。(26分)
时间: 2024-09-16 07:03:25 浏览: 152
设计一个自动饮料售卖机的状态机需要考虑以下几个步骤:
1. **状态定义**:
- 状态1:准备接收货币
- 状态2:识别硬币面额
- 状态3:验证硬币并扣除相应金额
- 状态4:确认支付成功,等待取货
- 状态5:找零(如果必要)
- 状态6:交易结束,关闭出货口
2. **输入输出信号**:
- **输入**:硬币投入信号coin_in、找零请求signal_refund
- **输出**:硬币识别结果coin_value(0表示无效,1表示5角,2表示1元)、饮料出货信号drink_out、找零硬币信号change_out
- **内部信号**:硬币余额balance,商品价格price(1.5元)
3. **状态转移条件**:
- 从状态1到状态2:接收到硬币
- 从状态2到状态3:识别硬币面额
- 从状态3到状态4:验证硬币有效,余额足够
- 从状态4到状态5:用户请求找零
- 从状态5到状态4:找零完成后回到正常交易流程
- 使用case结构处理状态转移和相应的操作
- 存储器用于存储硬币余额和当前状态信息
- 定义触发器或组合逻辑更新状态和显示输出
```verilog
module vending_machine(
input coin_in,
input signal_refund,
output [1:0] coin_value,
output drink_out,
output change_out,
input price //假设价格已固定为1.5
);
// 状态变量定义
reg [1:0] state;
wire refill_required;
always @(posedge clk) begin
case(state)
0: if (coin_in) begin
coin_value <= 0; // 验证硬币前标记为无效
state <= 1;
end
1: if (!valid_coin(coin)) begin
coin_value <= 0; // 无效硬币
state <= 0;
else begin
coin_value <= coin_side; // 根据硬币面额更新值
state <= 2;
end
// ... (继续其他状态的处理)
5: if (signal_refund && balance >= price) begin
refill_required <= 1;
state <= 4;
end
// ... (找零后回到状态4)
6: begin
drink_out <= 1;
state <= 6; // 交易结束
end
endcase
end
// 其他辅助逻辑如硬币验证函数valid_coin,余额计算等
// ...
endmodule
```
阅读全文