考虑一个具有输入s和w的有限状态机。假设 FSM 以称为A的复位状态开始,如下所示。只要s = 0, FSM 就保持在状态A ,当s = 1 时,它移动到状态 B。一旦处于状态B,FSM在接下来的三个时钟周期内检查输入w的值。如果w = 1 在恰好两个时钟周期中,则 FSM 必须 在下一个时钟周期中将输出z设置为 1。否则z必须为 0。FSM 继续检查w接下来的三个时钟周期,依此类推。下面的时序图说明了不同w值所需的z值。
使用尽可能少的状态。请注意,s输入仅用于状态A,因此您只需要考虑w输入。
module top_module (
input clk,
input reset, // Synchronous reset
input s,
input w,
output z
);
parameter A=1'b0,B=1'b1;
reg state,next_state;
reg [3:0]num;
reg [3:0] z1;
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(*)begin
case(state)
A:next_state=s?B:A;
B:begin
next_state=B;
end
endcase
end
always@(posedge clk)begin//num记录第几个周期,z1作为中间量,对三个周期内有几个1计数,在第三个周期中根据z1对z赋值
if(reset)begin
num<=0;
z1<=0;
z<=0;
end
else if(state==B&num==4'd2)begin
num<=0;
if(z1+w==4'd2)
z<=1;
else
z<=0;
z1<=0;
end
else if(state==B&num<4'd2)begin
num<=num+1;
z<=0;
if(w)
z1=z1+1;
else
z1<=z1;
end
end
endmodule