错题笔记:
不知道dfr为什么出错
题目:
一个大水库为几个用户服务。为了保持水位足够高,三个传感器以5英寸的间隔垂直放置。
- 当水位高于最高传感器(S3)时,输入流量应为零。
- 当液位低于最低传感器(S1)时,流量应最大(标称流量阀和补充流量阀均打开)。
- 水位在上下传感器之间时的流速由两个因素决定:水位和上次传感器变化之前的水位。每个水位具有与其相关的标称流量,如下表所示。
- 如果传感器变化表明先前液位低于当前液位,则应采用标称流量。
- 如果之前的液位高于当前液位,则应通过打开补充流量阀(由OFR控制)来增加流量。
- 绘制水库控制器的摩尔模型状态图。明确指出每个状态的所有状态转换和输出。FSM的输入为SI、S2和S3;输出为FR1、FR2、FR3和△FR。
-
还包括一个主动高同步复位,将状态机复位到相当于水位长期低的状态(无传感器断言,所有四个输出断言)。
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);
parameter W0=0,W1=1,W2=2,W3=3;
reg [1:0] state,next_state,last_state;
always@(*)begin
case(state)
W0: next_state = (s[1])?W1:W0;
W1: next_state = (s[1])?((s[2])?W2:W1):W0;
W2: next_state = (s[2])?((s[3])?W3:W2):W1;
W3: next_state = (s[3])?W3:W2;
endcase
end
always@(posedge clk)begin
if(reset) state <= W0;
else begin
last_state <= state;
state <= next_state;
end
end
always@(*)begin
if(state==W3)//当前水位在W3
{fr3,fr2,fr1,dfr}=4'b000;
else if(state==W0)//当前水位在W0
{fr3,fr2,fr1,dfr}=4'b1111;
else if(state==W2&&last_state==W1)//当前水位在W2,相比前水位上升
{fr3,fr2,fr1,dfr}=4'b0010;
else if(state==W2&&last_state==W3)//当前水位在W2,相比前水位下降
{fr3,fr2,fr1,dfr}=4'b0011;
else if(state==W1&&last_state==W0)//当前水位在W1,相比前水位上升
{fr3,fr2,fr1,dfr}=4'b0110;
else if(state==W1&&last_state==W2)//当前水位在W1,相比前水位下降
{fr3,fr2,fr1,dfr}=4'b0111;
else if(state==last_state)//水位不变
{fr3,fr2,fr1,dfr}={fr3,fr2,fr1,dfr};
end
// always@(*)begin
// case(state)
// W0:{fr3,fr2,fr1}=3'b111;
// W1:{fr3,fr2,fr1}=3'b011;
// W2:{fr3,fr2,fr1}=3'b001;
// W3:{fr3,fr2,fr1}=3'b000;
// endcase
// end
//
// always@(*)begin
// if(state==W0)
// dfr=1;
// else if(state<last_state)
// dfr=1;
// else if(state>last_state)
// dfr=0;
// else
// dfr=dfr;
// end
endmodule
上述的输出方式,dfr总是报错,而且找不到图二中dfr错误置一的原因;但如果采用注释的输出方法,则不会报错;如果有看出错误的朋友,希望可以指正一下。
仿真分析: