题解 | #自动贩售机2#
自动贩售机2
https://www.nowcoder.com/practice/298dec1c3dce45c881f3e53e02558828
这种方式虽然将输入打了一拍来匹配时序,作为状态机,它没有像别的答案那样(至少明面上)引入latch,但它却莫名可以跑通。不知道是不是编译器自己引入了latch呢?
这种逻辑理解虽然不如计数器简单,但输出没有使用组合逻辑来匹配testbench的时序,也算有它的独特优势。
`timescale 1ns/1ns module 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***********// localparam S0 = 0; localparam S0_5 = 1; localparam S1 = 2; localparam S1_5 = 3; localparam S2 = 4; // localparam S2_5 = 4; reg [2:0] state, nexts; reg [2:0] dreg; always@(posedge clk or negedge rst) begin if(!rst) dreg <= 0; else dreg <= {sel,d2,d1}; end always@(posedge clk or negedge rst) begin if(!rst) state <= S0; else state <= nexts; end always@(*) begin if(!rst) nexts = S0; else case(state) S0: case(dreg[1:0]) 2'b01: nexts = S0_5; 2'b10: nexts = S1; default: nexts = state; endcase S0_5: case(dreg[1:0]) 2'b01: nexts = S1; 2'b10: nexts = sel?S1_5:S0; default: nexts = state; endcase S1: case(dreg[1:0]) 2'b01: nexts = sel?S1_5:S0; 2'b10: nexts = sel?S2:S0; default: nexts = state; endcase S1_5: case(dreg[1:0]) 2'b01: nexts = sel?S2:S0; 2'b10: nexts = sel?S0:S0; default: nexts = state; endcase S2: case(dreg[1:0]) 2'b01: nexts = sel?S0:S0; 2'b10: nexts = sel?S0:S0; default: nexts = state; endcase default : nexts = S0; endcase end always@(posedge clk or negedge rst) begin if(!rst) begin out1 <= 0; out2 <= 0; out3 <= 0; end else if (state==S0_5) case(dreg) 3'b010: out1 <= 1; default: begin out1 <= 0; out2 <= 0; out3 <= 0; end endcase else if (state==S1) case(dreg) 3'b001: out1 <= 1; 3'b010: begin out1 <= 1; out3 <= 1; end default: begin out1 <= 0; out2 <= 0; out3 <= 0; end endcase else if (state==S1_5) case(dreg) 3'b110: out2 <= 1; default: begin out1 <= 0; out2 <= 0; out3 <= 0; end endcase else if (state==S2) case(dreg) 3'b101: out2 <= 1; 3'b110: begin out2 <= 1; out3 <= 1; end default: begin out1 <= 0; out2 <= 0; out3 <= 0; end endcase else begin out1 <= 0; out2 <= 0; out3 <= 0; end end //*************code***********// endmodule