题解 | #自动贩售机1#
自动贩售机1
https://www.nowcoder.com/practice/dcf59e6c51f6489093495acb1bc34dd8
真的要吐血...严格来讲上升沿上升,下降沿下降的,半周期脉冲,用上升沿去踩就很不对劲。结果这里就是要用上升沿去踩...用下降沿去踩反而还不对...
`timescale 1ns/1ns module seller1( input wire clk , input wire rst , input wire d1 , input wire d2 , input wire d3 , output reg out1, output reg [1:0]out2 ); //*************code***********// reg [2:0] cur,nxt; reg d1_tmp,d2_tmp,d3_tmp; parameter S0=0,S1=1,S2=2,S3=3,S4=4; always@(posedge clk or negedge rst) begin if(~rst) begin d1_tmp <= 1'b0; d2_tmp <= 1'b0; d3_tmp <= 1'b0; end else begin d1_tmp <= d1; d2_tmp <= d2; d3_tmp <= d3; end end always@(posedge clk or negedge rst) begin if(~rst) begin cur <= S0; end else begin cur <= nxt; end end always@(*) begin case(cur) S0: nxt = d1_tmp ? S1 : (d2_tmp ? S2 : (d3_tmp ? S4 : S0)); S1: nxt = d1_tmp ? S2 : (d2_tmp ? S4 : (d3_tmp ? S4 : S1)); S2: nxt = d1_tmp ? S4 : (d2_tmp ? S4 : (d3_tmp ? S4 : S2)); S4: nxt = S0; default : nxt = S0; endcase end always@(posedge clk or negedge rst) begin if(~rst) begin out1 <= 1'b0; end else begin out1 <= (nxt == S4); end end always@(posedge clk or negedge rst) begin if((nxt == S4) && rst) begin case(cur) S0: out2 <= 3'd1; S1: out2 <= d2_tmp ? 3'd0 : 3'd2; S2: begin if(d1_tmp) out2 <= 3'd0; else if(d2_tmp) out2 <= 3'd1; else out2 <= 3'd3; end endcase end else begin out2 <= 3'b000; end end endmodule