1、这个题把题干翻译下来读懂还是挺简单的,害英语还是重点的啊。
2、状态的话就跟表所示就四个状态,根据水位来判断,水位低的话进水就多一点。水位高的话就进水少一点。那四个输出其实就是进水的开关,当时看的时候这里弄晕了好久。还有就是那个dfr那里其实那个也简单只要上一个水位比现在的水位高那就开,比现在的低或者一样那就不开。(其实就是水位如果一直增加那就不开,水位减少那就开)
3、写的时候那三个还好说就是dfr没考虑上一个状态跟现在状态一样的情况。
4、仿真的时候说我会有lanch的情况,case语句一定要有default。这次没写了,下次注意。(主要是题干也没要求,应该不会有)。
完整代码如下:
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter A=3'd0,B=3'd1,C=3'd2,D=3'd3;
reg [2:0]state,last_state,next_state;
always@(*)begin //切换状态
case(s)
3'b000:next_state=A;
3'b001:next_state=B;
3'b011:next_state=C;
3'b111:next_state=D;
endcase
end
always@(posedge clk)begin
if(reset)begin
state<=A;
end
else begin
last_state<=state;
state<=next_state;
end
end
always@(*)begin
case(state)
A:begin
fr3=1'b1;
fr2=1'b1;
fr1=1'b1;
end
B:begin
fr3=1'b0;
fr2=1'b1;
fr1=1'b1;
end
C:begin
fr3=1'b0;
fr2=1'b0;
fr1=1'b1;
end
D:begin
fr3=1'b0;
fr2=1'b0;
fr1=1'b0;
end
endcase
//dfr=((last_state-state)>1)?1'b0:1'b1;//忽略了之前状态跟现在状态一样的情况
end
always @(*) begin
if(state == A)
dfr = 1'b1;
else if(last_state > state)
dfr = 1'b1;
else if(last_state < state)
dfr = 1'b0;
else
dfr = dfr; //will generate latch
end
endmodule