module seq_circuit(
input C ,
input clk ,
input rst_n,
output wire Y
);
reg [1:0] current_stage ;
reg [1:0] next_stage ;
reg Y_reg; //输出
//第一段 : 初始化当前状态和下一个状态
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
current_stage <= 2'b00 ;
next_stage <= 2'b00 ;
end
else begin
current_stage <= next_stage ;
end
end
//第二段 : 翻译状态转换图
always @ (*)begin
case(current_stage)
2'b00:begin next_stage = (C==1 ? 2'b01 : 2'b00); end
2'b01:begin next_stage = (C==1 ? 2'b01 : 2'b11); end
2'b11:begin next_stage = (C==1 ? 2'b10 : 2'b11); end
2'b10:begin next_stage = (C==1 ? 2'b10 : 2'b00); end
endcase
end
//第三段 : 控制输出
always @ (*)begin
if(!rst_n)begin
Y_reg <= 1'b0;
end
else begin
casex({current_stage,C})
3'b00_x : Y_reg <= 1'b0 ;
3'b01_x : Y_reg <= 1'b0 ;
3'b11_x : Y_reg <= 1'b1 ;
3'b10_1 : Y_reg <= 1'b1 ;
3'b10_0 : Y_reg <= 1'b0 ;
endcase
end
end
assign Y = Y_reg ;
endmodule