牛客网Verilog刷题——VL39
- 题目
- 答案
题目
设计一个自动贩售机,输入货币有两种,为0.5/1元,饮料价格是1.5/2.5元,要求进行找零,找零只会支付0.5元。
1、投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号
2、此题忽略出饮料后才能切换饮料的问题
注意rst为低电平复位。
信号示意图:
输入输出描述:
信号 | 类型 | 输入/输出 | 位宽 | 描述 |
---|---|---|---|---|
clk | wire | Intput | 1 | 系统时钟信号 |
rst | wire | Intput | 1 | 异步复位信号,低电平有效 |
d1 | wire | Intput | 1 | 投入0.5元 |
d2 | wire | Intput | 1 | 投入1元 |
sel | wire | Intput | 1 | 选择饮料,0表示选择1.5元饮料,1表示选择2.5元饮料 |
out1 | reg | Output | 1 | 输出饮料1 |
out2 | reg | Output | 1 | 输出饮料2 |
out3 | reg | Output | 2 | 找零,只找零0.5元 |
答案
`timescale 1ns/1nsmodule seller2(input wire clk ,input wire rst ,input wire d1 ,input wire d2 ,input wire sel ,output reg out1,output reg out2,output reg out3
);
//*************code***********//
//金额状态
reg [6:0] cuur_state;
reg [6:0] next_state; parameter S0 = 7'b000_0001; //0元
parameter S1 = 7'b000_0010; //0.5元
parameter S2 = 7'b000_0100; //1元
parameter S3 = 7'b000_1000; //1.5元
parameter S4 = 7'b001_0000; //2元
parameter S5 = 7'b010_0000; //2.5元
parameter S6 = 7'b100_0000; //3元always @(posedge clk or negedge rst) beginif(!rst)cuur_state <= S0;elsecuur_state <= next_state;
endalways @(*) begincase(cuur_state) S0 : next_state = d1 ? S1 : d2 ? S2 : next_state;S1 : next_state = d1 ? S2 : d2 ? S3 : next_state;S2 : next_state = d1 ? S3 : d2 ? S4 : next_state;S3 : next_state = ~sel ? S0 : d1 ? S4 : d2 ? S5 : next_state;S4 : next_state = ~sel ? S0 : d1 ? S5 : d2 ? S6 : next_state;S5 : next_state = S0;S6 : next_state = S0;default : next_state = S0;endcase
endalways @(*) beginif(!rst) begin{out1,out2,out3} = 3'b000;endelse begincase(cuur_state) S0,S1,S2 : {out1,out2,out3} = 3'b000;S3 : {out1,out2,out3} = ~sel ? 3'b100 : 3'b000;S4 : {out1,out2,out3} = ~sel ? 3'b101 : 3'b000;S5 : {out1,out2,out3} = ~sel ? 3'b101 : 3'b010;S6 : {out1,out2,out3} = ~sel ? 3'b101 : 3'b011;default : {out1,out2,out3} = 3'b000;endcaseend
end//*************code***********//
endmodule