HDLbits答案更新系列17(3.2.5 Finite State Machines 3.2.5.24 Q3a: FSM等)

本文深入探讨了状态机与计数器在电路设计中的应用,通过具体实例讲解了如何结合状态机和计数器实现特定逻辑功能,如在SDRAM控制器中的作用。

目录

前言

3.2.5 Finite State Machines

3.2.5.24 Q3a: FSM(Exams/2014 q3fsm)

3.2.5.25 Q3b: FSM(Exams/2014 q3bfsm)

3.2.5.26 Q3c: FSM logic(Exams/2014 q3c)

结语

HDLbits网站链接


前言

今天继续更新几道题目,这几道题目很有技巧性,其中又有状态机加计数器的组合题,下面就让我们一起看看解题思想吧。

3.2.5 Finite State Machines

3.2.5.24 Q3a: FSM(Exams/2014 q3fsm)

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input s,
    input w,
    output z
);
    
    parameter A = 1'b0, B = 1'b1;
    reg	        current_state;
    reg	        next_state;
    
    always@(posedge clk)begin
        if(reset)begin
            current_state <= A;
        end
        else begin
            current_state <= next_state;
        end
    end
    
    always@(*)begin
        case(current_state)
            A:begin
                next_state = s ? B : A;
            end
            B:begin
                next_state = B;
            end
        endcase
    end

    reg	w_reg1;
    reg w_reg2;
    always@(posedge clk)begin
        if(reset)begin
            w_reg1 <= 1'b0;
            w_reg2 <= 1'b0;
        end
        else if(next_state == B)begin
            w_reg1 <= w;
            w_reg2 <= w_reg1;
        end
        else begin
            w_reg1 <= 1'b0;
            w_reg2 <= 1'b0;
        end
    end  
    
    always@(posedge clk)begin
        if(reset)begin
            z <= 1'b0;
        end
        else if(current_state == B && counter == 2'd0)begin
            if(~w & w_reg1 & w_reg2 | w & ~w_reg1 & w_reg2 | w & w_reg1 & ~w_reg2)begin
                z <= 1'b1;
            end
            else begin
                z <= 1'b0;
            end
        end
        else begin
            z <= 1'b0;
        end
    end   
    
    reg [1:0]	counter;
    always@(posedge clk)begin
        if(reset)begin
            counter <= 2'd0;
        end
        else if(counter == 2'd2)begin
            counter <= 2'd0;
        end
        else if(next_state == B)begin
            counter <= counter + 1'b1;
        end
    end
    
endmodule

题意表明,当s为0时,进入B状态,然后会检查w的值,如果在接下来的三个周期中w值有两个周期都为1,那么z输出1,否则z输出0。注意,这里隐含的条件是不重叠检测,意味着每三个周期检查一次,周期与周期之间不重叠。

首先,我按照题目中给出的状态转移图写了基础的状态机模块;接着,用一个计数器进行计数,在状态B时,counter计数三次清零,然后循环;然后,我使用了类似边沿检测的方法,将w打了两拍,判定条件为三拍中两拍为高,如果满足条件,z输出1,否则输出0。

注意:这里counter的判定条件为counter == 2'd0,大家可以想一想,在next_state为B时counter加1,也就是current_state为A且s为1时counter就要等于1(三拍中的第一拍其实counter已经等于1了),而我们这里是将counter数三次然后清零,所以第三个周期是counter == 2'd0。

3.2.5.25 Q3b: FSM(Exams/2014 q3bfsm)

module top_module (
    input clk,
    input reset,   // Synchronous reset
    input x,
    output z
);
    
    parameter S0 = 3'd0, S1 = 3'd1, S2 = 3'd2;
    parameter S3 = 3'd3, S4 = 3'd4;
    
    reg	[2:0]	current_state;
    reg [2:0]	next_state;
    
    always@(posedge clk)begin
        if(reset)begin
            current_state <= S0;
        end
        else begin
            current_state <= next_state;
        end
    end
    
    always@(*)begin
        case(current_state)
            S0:begin
                next_state = x ? S1 : S0;
            end
            S1:begin
                next_state = x ? S4 : S1;
            end
            S2:begin
                next_state = x ? S1 : S2;
            end
            S3:begin
                next_state = x ? S2 : S1;
            end
            S4:begin
                next_state = x ? S4 : S3;
            end
            default:begin
                next_state = S0;
            end
        endcase
    end
    
    assign z = (current_state == S3 || current_state == S4);           
            
endmodule

这道题目应该没有什么问题,大家看着状态转移表应该就可以完成。

3.2.5.26 Q3c: FSM logic(Exams/2014 q3c)

module top_module (
    input clk,
    input [2:0] y,
    input x,
    output Y0,
    output z
);
    
    assign Y0 = (x & y == 3'b000 || ~x & y == 3'b001 || x & y == 3'b010 || ~x & y == 3'b011 || ~x & y == 3'b100);
    assign z = (y == 3'b011 || y == 3'b100);
    
    /*
    //second way
    parameter S0 = 3'd0, S1 = 3'd1, S2 = 3'd2;
    parameter S3 = 3'd3, S4 = 3'd4;

    reg [2:0]	next_state;
    
    always@(*)begin
        case(y)
            S0:begin
                next_state = x ? S1 : S0;
            end
            S1:begin
                next_state = x ? S4 : S1;
            end
            S2:begin
                next_state = x ? S1 : S2;
            end
            S3:begin
                next_state = x ? S2 : S1;
            end
            S4:begin
                next_state = x ? S4 : S3;
            end
            default:begin
                next_state = S0;
            end
        endcase
    end
    
    assign Y0 = (next_state == S1 || next_state == S3);
    assign z = (y == S3 || y == S4);    
*/
    
endmodule

这道题目我没有用到clk,基本上算是为了做题而做题了,两种方法大家看一下吧。

结语

今天更新这几道题目吧,第一道题目需要重点去理解,又是涉及到了状态机和计数器的组合,这种组合在电路设计中用的非常广泛,比如SDRAM控制器,每一个状态之间都需要计数器等待,可以说状态机和计数器是电路设计的精髓了。最后还是那句话,如果哪里有错误,欢迎大家留言~

HDLbits网站链接

https://hdlbits.01xz.net/wiki/Main_Page

### Dubbo 3.2.5 连接断开解决方案 对于 Dubbo 服务端口 `192.168.81.1:20880` 出现连接断开的情况,通常涉及多个方面的原因分析和排查。以下是详细的解决方案: #### 添加 Netty 依赖 如果遇到类似于 `com.alibaba.dubbo.rpc.RpcException: Fail to start server(url: dubbo://192.168.137.1:20880)` 的异常提示,则可能是由于缺少必要的Netty库文件所引起的[^1]。 为了确保应用程序能够正常启动并保持稳定运行,在项目的构建配置文件(如 Maven 或 Gradle 文件)中加入如下所示的 Netty 依赖声明: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.32.Final</version> </dependency> ``` 这一步骤可以有效防止因缺失网络通信组件而导致的服务无法初始化问题[^2]。 #### 配置心跳机制 Dubbo 提供了内置的心跳检测功能来维持客户端和服务提供者之间的长连接状态。通过合理设置参数可增强系统的健壮性和容错能力。建议调整以下属性以优化心跳策略: - **heartbeat**: 定义每次发送心跳请求的时间间隔,默认值为60秒; - **timeout**: 设置远程调用超时时长,推荐根据实际业务需求适当延长此时间; 具体实现方式是在 Spring Boot 应用程序中的 application.properties 或 yml 文件里添加相应项: ```properties dubbo.provider.heartbeat=60 dubbo.consumer.timeout=3000 ``` 上述措施有助于减少不必要的重连操作次数,并提高整体性能表现。 #### 检查防火墙与安全组规则 当目标地址位于不同网段时,还需确认服务器所在环境下的网络安全策略是否允许外部访问指定端口号。必要情况下应联系运维人员协助开放相应的出入站权限。 另外值得注意的是,某些云平台可能会额外施加更为严格的流量控制条件,因此也需同步核查实例关联的安全组设定情况。 #### 日志监控与告警 最后但同样重要的一点是要建立健全的日志记录体系以及配套的事前预警通知渠道。借助 ELK Stack (Elasticsearch, Logstash 和 Kibana) 等开源工具集可以帮助快速定位潜在隐患位置,从而做到防患于未然。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值