`timescale 1ns/1ns module seq_circuit( input C , input clk , input rst_n, output wire Y ); reg y_r; reg [1:0] s, ns; parameter P_S0 = 2'b00 , P_S1 = 2'b01 , P_S2 = 2'b11, P_S3 = 2'b10; //first always state change always@(posedge clk or negedge rst_n) begin if(!rst_n) s <= P_S0; else s <= ns; end //secend always state shif rules combination always@(s or C) begin case(s) P_S0: begin if(C) ns = P_S1; else ns = P_S0; end P_S1: begin if(C) ns = P_S1; else ns = P_S2; end P_S2:begin if(C) ns = P_S3; else ns = P_S2; end P_S3:begin if(C) ns = P_S3; else ns = P_S0; end default: ns = P_S0; endcase end //third always output logic //always@(posedge clk or negedge rst_n) begin always@(*) begin case (s) P_S0: y_r = 1'b0; P_S1: y_r = 1'b0; P_S2: y_r = 1'b1; P_S3:begin if(C) y_r = 1'b1; else y_r = 1'b0; end default: y_r = 1'b0; endcase end assign Y = y_r; endmodule