`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***********//
parameter IDLE = 3'b001;
parameter S0 = 3'b010;
parameter S1 = 3'b100;
reg [2: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, d3, rst)
begin
if( ~rst ) begin
ns = IDLE;
end
else begin
case( cs )
IDLE : begin
case({d1, d2, d3})
3'b000 : ns = ns;
3'b100 : ns = S0;
3'b010 : ns = S1;
3'b001 : ns = IDLE;
default : ns = IDLE;
endcase
end
S0 : begin
case({d1, d2, d3})
3'b000 : ns = ns;
3'b100 : ns = S1;
3'b010 : ns = IDLE;
3'b001 : ns = IDLE;
default : ns = IDLE;
endcase
end
S1 : begin
if({d1, d2, d3} == 3'b000)
ns = ns;
else
ns = IDLE;
end
default : begin
if({d1, d2, d3} == 3'b000)
ns = ns;
else
ns = IDLE;
end
endcase
end
end
reg out1_reg;
reg [1:0] out2_reg;
always @ (posedge clk or negedge rst)
begin
if( ~rst ) begin
out1_reg <= 1'b0;
out2_reg <= 2'b0;
end
else begin
case(cs)
IDLE : begin
if({d1, d2, d3} == 3'b001) begin
out1_reg <= 1'b1;
out2_reg <= 2'd1;
end
else begin
out1_reg <= 1'b0;
out2_reg <= 2'd0;
end
end
S0 : begin
case({d1, d2, d3})
3'b010 : begin
out1_reg <= 1'b1;
out2_reg <= 2'd0;
end
3'b001 : begin
out1_reg <= 1'b1;
out2_reg <= 2'd2;
end
default : begin
out1_reg <= 1'b0;
out2_reg <= 2'd0;
end
endcase
end
S1 : begin
case({d1, d2, d3})
3'b100 : begin
out1_reg <= 1'b1;
out2_reg <= 2'd0;
end
3'b010 : begin
out1_reg <= 1'b1;
out2_reg <= 2'd1;
end
3'b001 : begin
out1_reg <= 1'b1;
out2_reg <= 2'd3;
end
default : begin
out1_reg <= 1'b0;
out2_reg <= 2'd0;
end
endcase
end
default : begin
out1_reg <= 1'b0;
out2_reg <= 2'd0;
end
endcase
end
end
always @ (posedge clk or negedge rst)
begin
if( ~rst ) begin
out1 <= 1'b0;
out2 <= 2'b0;
end
else begin
out1 <= out1_reg;
out2 <= out2_reg;
end
end
//*************code***********//
endmodule