错题集:HDLBits Exams/ece241 2013 q4 水位状态机

错题笔记:

不知道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错误置一的原因;但如果采用注释的输出方法,则不会报错;如果有看出错误的朋友,希望可以指正一下。

仿真分析:

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值