推荐答案
测试一下
题目
设计一个自动饮料售卖机,饮料10分钱,硬币有5分和10分两种,并考虑找零:(1)画出fsm(有限状态机);(2)用verilog编程,语法要符合fpga设计的要求;(3)设计工程中可使用的工具及设计大致过程。(未知)
参考答案与知识点
参考答案
1. FSM设计:状态机有IDLE(0分)和S5(已投5分)两个状态。输入硬币:5分(5c)或10分(10c)。转移:IDLE+5c→S5;IDLE+10c→输出饮料(dispense=1),无找零;S5+5c→输出饮料,无找零;S5+10c→输出饮料并找零5分(change=1)。输出只在特定转移时产生(Mealy型),或设计为Moore型在S10状态输出。建议用Mealy减少状态。
2. Verilog代码(符合FPGA设计,同步复位,无latch):
```verilog
module vending_machine(
input clk, rst_n,
input [1:0] coin, // 00:无, 01:5分, 10:10分
output reg dispense, change
);
parameter IDLE = 2'b00, S5 = 2'b01;
reg [1:0] state, next_state;
always @(posedge clk or negedge rst_n) begin
if(!rst_n) state <= IDLE;
else state <= next_state;
end
always @(*) begin
next_state = state; // 默认保持
dispense = 0;
change = 0;
case(state)
IDLE: begin
case(coin)
2'b01: next_state = S5; // 5分
2'b10: begin // 10分
next_state = IDLE;
dispense = 1;
end
default: ;
endcase
end
S5: begin
case(coin)
2'b01: begin // 再投5分,共10分
next_state = IDLE;
dispense = 1;
end
2'b10: begin // 再投10分,共15分
next_state = IDLE;
dispense = 1;
change = 1;
end
default: ;
endcase
end
endcase
end
endmodule
```
注意:组合逻辑中赋初值避免latch,coin编码仅用两种有效组合,default保留。
3. 工具及设计过程:使用Vivado(Xilinx)或Quartus(Intel)作为综合与实现工具,ModelSim或Vivado Simulator进行仿真验证。设计过程:需求分析→状态机建模→编码→行为仿真→综合→布局布线→时序仿真→下载到FPGA。关键点:状态编码用二进制或格雷码,避免毛刺;输出逻辑同步或打一拍;复位信号处理。
涉及知识点
- 状态机
- verilog
- fpga
- Verilog
- FPGA