`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***********// parameter IDLE = 7'b0000001; parameter S05 = 7'b0000010; parameter S10 = 7'b0000100; parameter S15 = 7'b0001000; parameter S20 = 7'b0010000; parameter S25 = 7'b0100000; parameter S30 = 7'b1000000; reg [6:0] cs, ns; always @ (posedge clk or negedge rst) begin if( ~rst ) begin cs <= IDLE; end else begin cs <= ns; end end always @ (d1, d2, sel, rst, cs) begin if( ~rst ) begin ns = IDLE; end else begin case( cs ) IDLE : begin case({d1, d2}) 2'b10 : ns = S05; 2'b01 : ns = S10; default : ns = ns; endcase end S05 : begin case({d1, d2}) 2'b10 : ns = S10; 2'b01 : ns = S15; default : ns = ns; endcase end S10 : begin case({d1, d2}) 2'b10 : ns = S15; 2'b01 : ns = S20; default : ns = ns; endcase end S15 : begin // 1.5 还是 2.5 if(sel == 1'b0) begin ns = IDLE; end else begin case({d1, d2}) 2'b10 : ns = S20; 2'b01 : ns = S25; default : ns = ns; endcase end end S20 : begin // 1.5 还是 2.5 if(sel == 1'b0) begin ns = IDLE; end else begin case({d1, d2}) 2'b10 : ns = S25; 2'b01 : ns = S30; default : ns = ns; endcase end end S25 : begin ns = IDLE; end S30 : begin ns = IDLE; end default : begin ns = IDLE; end endcase end end always @ (posedge clk or negedge rst) begin if( ~rst ) begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end else begin case(ns) IDLE : begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end S05 : begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end S10 : begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end S15 : begin if(sel == 1'b0) begin out1 <= 1'b1; out2 <= 1'b0; out3 <= 1'b0; end else begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end end S20 : begin if(sel == 1'b0) begin out1 <= 1'b1; out2 <= 1'b0; out3 <= 1'b1; end else begin out1 <= 1'b0; out2 <= 1'b0; out3 <= 1'b0; end end S25 : begin if(sel == 1'b0) begin out1 <= 1'b0; out2 <= 1'd0; out3 <= 1'b0; end else begin out1 <= 1'b0; out2 <= 1'd1; out3 <= 1'b0; end end S30 : begin if(sel == 1'b0) begin out1 <= 1'b0; out2 <= 1'd0; out3 <= 1'b0; end else begin out1 <= 1'b0; out2 <= 1'd1; out3 <= 1'b1; end end default : begin out1 <= 1'b0; out2 <= 1'd0; out3 <= 1'b0; end endcase end end //*************code***********// endmodule