//共一段 采用时序逻辑完成状态机的转移、输出等 always @(posedge clk orposedge rst) begin if (rst) begin // reset dout <= 1'b0; state <= S0; end elsebegin case(state) S0:begin dout <= 1'b0; //输出0 if (din == 1'b1) begin state <= S1; end elsebegin state <= S0; end end
S1:begin dout <= 1'b0; //输出0 if (din == 1'b1) begin state <= S1; end elsebegin state <= S2; end end
S2:begin dout <= 1'b0; //输出0 if (din == 1'b1) begin state <= S3; end elsebegin state <= S0; end end
S3:begin dout <= 1'b1; //输出1 if (din == 1'b1) begin state <= S1; end elsebegin state <= S2; end end
default:begin dout <= 1'b0; state <= S0; end endcase end end
//第一段 采用时序逻辑完成状态转移 always @(posedge clk orposedge rst) begin if (rst) begin // reset current_state <= S0; end elsebegin current_state <= next_state; end end
//第二段 采用组合逻辑完成转移条件判断和状态输出 always @(*) begin case(current_state) S0:begin dout = 1'b0; //输出0 if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S0; end end
S1:begin dout = 1'b0; //输出0 if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S2; end end
S2:begin dout = 1'b0; //输出0 if (din == 1'b1) begin next_state = S3; end elsebegin next_state = S0; end end
S3:begin dout = 1'b1; //输出1 if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S2; end end
default:begin dout = 1'b0; next_state = S0; end endcase end
//第一段 采用时序逻辑完成状态转移 always @(posedge clk orposedge rst) begin if (rst) begin // reset current_state <= S0; end elsebegin current_state <= next_state; end end
//第二段 采用组合逻辑完成转移条件判断 always @(*) begin case(current_state) S0:begin if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S0; end end
S1:begin if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S2; end end
S2:begin if (din == 1'b1) begin next_state = S3; end elsebegin next_state = S0; end end
S3:begin if (din == 1'b1) begin next_state = S1; end elsebegin next_state = S2; end end
default:next_state = S0; endcase end
//第三段 采用时序逻辑状态输出 always @(posedge clk orposedge rst) begin if (rst) begin // reset dout <= 1'b0; end elsebegin case(next_state) //采用next state,提前一拍 S0:begin dout <= 1'b0; //输出0 end