这个题表基本上给了状态和输出的FR1,2,3的思路,即input [3:1]s,output [3:1]fr。
简单的说就是水位在S1以下全开阀门,随着逐渐升高减少阀门用量。虽然提到了一嘴当当前水量大于之前的水量才用FR1,2,3但是其实只用考虑反向的dfr就行。
Dfr的用法这道题少说了一句当水量变化不足以改变状态s的时候,DFR保持不变。
其他情况的DFR无非 1、直接reset 2、小于最低点位 3、之前的水量大于现在的水量
上代码的话就是:
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
wire [1:0]state;
wire [1:0]next_state;
wire [1:0]p_state;
parameter A=0, B=1, C=2, D=3;
always@(*)
begin
casez(s)
3'b zz0:next_state=A;
3'b z01:next_state=B;
3'b 011:next_state=C;
3'b 111:next_state=D;
endcase
end
always@(posedge clk)
begin
if(reset) begin
p_state=state;
state=A;
dfr=1;
end
else
begin
p_state=state;
state=next_state;
if(p_state==state) dfr=dfr;
else dfr=(p_state>state||state==A)?1:0;
end
end
assign fr3=(state==A)?1:0;
assign fr2=(state==A||state==B)?1:0;
assign fr1=(state==A||state==B||state==C)?1:0;
endmodule
因为个人是软件转硬件可能一些逻辑比较奇怪,轻喷家人们