HDLBits在线练习题之FSM of Water Level

FSM of Water Level

题目

地址:HDLBits - Exams/ece241 2013 q4
详细:

在这里插入图片描述 Also include an active-high synchronous reset that resets the state machine to a state equivalent to if the water level had been low for a long time (no sensors asserted, and all four outputs asserted).

Module Declaration
module top_module (
input clk,
input reset,
input [3:1] s,
output fr3,
output fr2,
output fr1,
output dfr
);

分析

  1. 三段式状态机,第一段组合逻辑判断状态转移条件,描述状态转移规律;第二段时序逻辑描述状态转移;第三段描述状态输出(可以是组合电路,也可是时序电路)。
  2. 第一段,本例中,输入s是下一状态的另一种表述,所以直接将s“翻译”成状态即可。
  3. 第二段:常规写法,reset则重置为s0,否则将next_state赋值给state。
  4. 第三段第一部分:输出fr3,fr2和fr1的描述,其结果与当前状态有关,将上面图片中表格的water level一栏看作状态,nominal一栏则为输出。
  5. 第三段第二部分:时序电路描述,在时钟上升沿时刻,next_state的值表述上升沿之后的current level,state的值表述上升沿之后的previous level(时钟沿采样旧值,时钟沿之后next_state和state才更新为新值)。故时钟上升沿时比较两者大小可得到dfr的输出。根据debug的波形,dfr应重置为1。其他情况下dfr保持不变存疑,以符合波形为准。

代码

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    // state definition
    parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
    
    reg [1:0] state,next_state;

   	// state transition
    always @(*) begin
        case (s) 
            3'b000: next_state = s0;
            3'b001: next_state = s1;
            3'b011: next_state = s2;
            3'b111: next_state = s3;
            default: next_state = s0;
        endcase
    end
    
    // 
    always @(posedge clk) begin
        if (reset) begin
            state <= s0;
        end
        else begin
            state <= next_state;
        end
    end 
    
    // outputs
    always @(*) begin
        case (state) 
            s0: {fr3,fr2,fr1} = 3'b111;
            s1: {fr3,fr2,fr1} = 3'b011;
            s2: {fr3,fr2,fr1} = 3'b001;
            s3: {fr3,fr2,fr1} = 3'b000;
            default: {fr3,fr2,fr1} = 3'b111;
        endcase
    end
    
    always @(posedge clk) begin
        if (reset)
            dfr <= 1'b1;
        else if (state>next_state) 
            dfr <= 1'b1;
        else if (state<next_state)
            dfr <= 1'b0;
        else
            dfr <= dfr;
    end
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值