always @ (posedge clk or negedge rst)
begin
if(!rst)
begin
next_state=idle;
dout=0;
end
else
begin
case(next_state)
idle:
if(din)
begin
next_state=st0;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st0:
if(din)
begin
next_state=st1;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st1:
if(!din)
begin
next_state=st2;
dout=0;
end
else
begin
next_state=st1;
dout=0;
end
st2:
if(!din)
begin
next_state=st3;
dout=0;
end
else
begin
next_state=st0;
dout=0;
end
st3:
if(din)
begin
next_state=st4;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st4:
if(din)
begin
next_state=st5;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st5:
if(!din)
begin
next_state=st6;
dout=0;
end
else
begin
next_state=st1;
dout=0;
end
st6:
if(din)
begin
next_state=idle;
dout=1;
end
else
begin
next_state=idle;
dout=0;
end
default:
begin
next_state=idle;
dout=0;
end
endcase
end
end
always @ (posedge clk or negedge rst)
begin
if(!rst)
current_state<=idle;
else
current_state<=next_state;
end
always @ (next_state or current_state or din or dout)
begin
case(current_state)
idle:
if(din)
begin
next_state=st0;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st0:
if(din)
begin
next_state=st1;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st1:
if(!din)
begin
next_state=st2;
dout=0;
end
else
begin
next_state=st1;
dout=0;
end
st2:
if(!din)
begin
next_state=st3;
dout=0;
end
else
begin
next_state=st0;
dout=0;
end
st3:
if(din)
begin
next_state=st4;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st4:
if(din)
begin
next_state=st5;
dout=0;
end
else
begin
next_state=idle;
dout=0;
end
st5:
if(!din)
begin
next_state=st6;
dout=0;
end
else
begin
next_state=st1;
dout=0;
end
st6:
if(din)
begin
next_state=idle;
dout=1;
end
else
begin
next_state=idle;
dout=0;
end
default:
begin
next_state=idle;
dout=0;
end
endcase
end