题目:
Consider a finite state machine with inputs s and w. Assume that the FSM begins in a reset state called A, as depicted below. The FSM remains in state A as long as s = 0, and it moves to state B when s = 1. Once in state B the FSM examines the value of the input w in the next three clock cycles. If w = 1 in exactly two of these clock cycles, then the FSM has to set an output z to 1 in the following clock cycle. Otherwise z has to be 0. The FSM continues checking w for the next three clock cycles, and so on. The timing diagram below illustrates the required values of z for different values of w.
Use as few states as possible. Note that the s input is used only in state A, so you need to consider just the w input.
代码:
module top_module (
input clk,
input reset, // Synchronous reset
input s,
input w,
output z
);
parameter A=0,B=1,C=2,D=3;
reg [1:0] state,next;
always @(posedge clk)
if(reset)
state <= A;
else
state <= next;
always @(*)
case (state)
A:next=s?B:A;
B:next=C;
C:next=D;
D:next=B;
default:next=A;
endcase
reg [2:0] w_reg;
always @(*)
case (state)
B:w_reg[2]=w;
C:w_reg[1]=w;
D:w_reg[0]=w;
default:w_reg=0;
endcase
always @(posedge clk)
if(reset)
z <= 0;
else
case(next)
A: z<=0;
C: z<=0;
D: z<=0;
B:begin
case(w_reg)
3'b011:z<=1;
3'b101:z<=1;
3'b110:z<=1;
default:z<=0;
endcase
end
endcase
endmodule