1、这个题还是很简单的读懂题干,B状态下是三个周期 内w有两个1才能正常输出。否则就不输出。之前还以为是有w为1就输出发现不对。
2、题干说少用状态,看了一圈别人写的也没少用,B状态下都有三个。代表三个周期,在想是不是可以有延迟三个周期的写法。二周目的时候尝试一下。
3、还有那个标志位flag强制清0的写法也是新学到的。有趣
。
完整代码如下:
module top_module (
input clk,
input reset, // Synchronous reset
input s,
input w,
output z
);
parameter A=0,B=1,B1=2,B2=3;
reg [2:0] state,next_state;
reg [1:0]flag=0;
always@(*)begin
case(state)
A:next_state=s?B:A;
B:next_state=B1;
B1:next_state=B2;
B2:next_state=B;
endcase
end
always@(posedge clk)begin
if(reset)
state<=A;
else
state<=next_state;
end
always@(posedge clk )begin
if(reset)
flag <= 2'b0;
else if(state == B)begin//强制归1或者0
flag <= w;
end
else if(state == B1 || state == B2)begin//有就+1.三个周期有两个才说明可以正常输出。
flag <= flag + w;
end
end
assign z=(state==B&&flag==2)?1:0;
endmodule