用Verilog语言编写一个自动售货机,有6元和8元两种饮料,每次只能购买1瓶,支持1元、5元、10元购买,并支持找零,所有信息用led显示
时间: 2023-07-16 07:12:14 浏览: 88
以下是一个简单的自动售货机 Verilog 代码,支持6元和8元两种饮料,使用1元、5元和10元购买,支持找零,并在LED上显示所有必要信息:
```
module vending_machine(
input clk, // 时钟信号
input reset, // 复位信号
input coin1, coin5, coin10, // 接收硬币输入信号
input btn6, btn8, // 接收饮料选择输入信号
output reg led[7:0] // 输出到LED的显示信息
);
parameter INIT = 3'b000, // 初始状态
Q6 = 3'b001, // 饮料6元状态
Q8 = 3'b010, // 饮料8元状态
Q10 = 3'b011, // 找零10元状态
Q15 = 3'b100, // 找零15元状态
Q18 = 3'b101; // 找零18元状态
reg [2:0] state; // 状态寄存器
reg [3:0] coins; // 硬币寄存器
reg [3:0] price; // 饮料价格寄存器
always @(posedge clk or posedge reset) begin
if (reset) begin // 复位状态
state <= INIT;
coins <= 4'b0000;
price <= 4'b0000;
led <= 8'b00000000;
end else begin
case(state)
INIT: begin // 初始状态
if (btn6 && !btn8) begin // 选择饮料6元
state <= Q6;
price <= 4'b0110;
led <= 8'b00000110;
end else if (!btn6 && btn8) begin // 选择饮料8元
state <= Q8;
price <= 4'b1000;
led <= 8'b00001000;
end else begin
state <= INIT;
led <= 8'b00000000;
end
end
Q6: begin // 饮料6元状态
if (coin1) begin // 接收1元硬币
coins <= coins + 1;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000110 - coins;
end
end else if (coin5) begin // 接收5元硬币
coins <= coins + 5;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000110 - coins;
end
end else if (coin10) begin // 接收10元硬币
coins <= coins + 10;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000110 - coins;
end
end else begin
led <= 8'b00000110 - coins;
end
end
Q8: begin // 饮料8元状态
if (coin1) begin // 接收1元硬币
coins <= coins + 1;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00001000 - coins;
end
end else if (coin5) begin // 接收5元硬币
coins <= coins + 5;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00001000 - coins;
end
end else if (coin10) begin // 接收10元硬币
coins <= coins + 10;
if (coins >= price) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00001000 - coins;
end
end else begin
led <= 8'b00001000 - coins;
end
end
Q10: begin // 找零10元状态
coins <= coins - price;
if (coins == 0) begin // 不需要找零
state <= INIT;
led <= 8'b00000000;
end else if (coins == 5) begin // 需要找零5元
state <= Q15;
led <= 8'b00000001;
end else if (coins == 8) begin // 需要找零8元
state <= Q18;
led <= 8'b00000010;
end else if (coins == 10) begin // 需要找零10元
state <= Q10;
led <= 8'b00010000;
end
end
Q15: begin // 找零15元状态
if (coin1) begin // 接收1元硬币
coins <= coins + 1;
if (coins >= 15) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000001 + coins;
end
end else if (coin5) begin // 接收5元硬币
coins <= coins + 5;
if (coins >= 15) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000001 + coins;
end
end else if (coin10) begin // 接收10元硬币
coins <= coins + 10;
if (coins >= 15) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000001 + coins;
end
end else begin
led <= 8'b00000001 + coins;
end
end
Q18: begin // 找零18元状态
if (coin1) begin // 接收1元硬币
coins <= coins + 1;
if (coins >= 18) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000010 + coins;
end
end else if (coin5) begin // 接收5元硬币
coins <= coins + 5;
if (coins >= 18) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000010 + coins;
end
end else if (coin10) begin // 接收10元硬币
coins <= coins + 10;
if (coins >= 18) begin // 硬币足够
state <= Q10;
led <= 8'b00010000;
end else begin
led <= 8'b00000010 + coins;
end
end else begin
led <= 8'b00000010 + coins;
end
end
endcase
end
end
endmodule
```
这个代码使用有限状态机(FSM)来实现自动售货机的逻辑。在初始化状态下,用户可以选择购买6元或8元的饮料。一旦选择了饮料,状态机将进入相应的状态,并等待用户投入硬币。如果用户投入的硬币足够购买饮料,则状态机将进入找零状态并计算出找零金额。如果用户投入的硬币不足以购买饮料,则状态机将继续等待更多的硬币输入。在任何时候,用户都可以按下复位按钮来重置状态机。最后,LED用作输出设备,用于显示当前状态和必要的信息。
阅读全文