• 【Verilog】时序逻辑电路 -- 有限同步状态机[补充]


    有限同步状态机

    • 在我上一篇博客中,我有对有限同步状态做简单的举例说明,在这个地方有一个极小的细节需要注意:状态机的是否需要考虑已有状态

    接收110111的有限同步状态机

    • 状态设计
      • parameter S0 = 3’b000; //初始状态
      • parameter S1 = 3’b001; //接收到1的状态
      • parameter S2 = 3’b010; //接收到11的状态
      • parameter S3 = 3’b011; //接收到110的状态
      • parameter S4 = 3’b100; //接收到1101的状态
      • parameter S5 = 3’b101; //接收到11011的状态
      • parameter S6 = 3’b110; //接收到110111的状态
    不考虑已有状态
    • 状态转移图
      不考虑之前状态

    • 转移图解释:

      • 在S2状态时,已接收到数据11
        • 当下一个接收数据为0则跳到状态S3;
        • 当下一个接收数据为1时,此时收到数据为111,由于不考虑之前数据状态,故有效数据为1,跳转到S1状态
      • 在S3、S4、S5状态时
        • 当下一个接收数据为1则跳转到当前状态的下一个有效状态
          • S3 -> S4
          • S4 -> S5
          • S5 -> S6
        • 当下一个接收数据为0,由于不考虑之前数据状态,故此时有效数据只有0,跳转到初始状态S0
      • 在S6状态时,已接收到数据110111,对于不考虑之前数据状态而言,此时无有效数据
        • 当下一个数据为0则跳转到初始状态S0;
        • 当下一个数据为1则跳转到有效状态为1的S1
    考虑已有状态
    • 状态转移图
      考虑之前状态

    • 转移图解释:

      • 在S2状态时,已接收到数据11
        • 当下一个接收数据为0则跳到状态S3;
        • 当下一个接收数据为1时,不直接跳转到初始状态,而是保持在S2状态(下一个跳转的状态依然为S2);
      • 在S5状态时,已接收到数据11011
        • 当下一个接收数据为1则跳转到状态S6;
        • 当下一个接收数据为0,此时收到的数据为110110,有效数据为110,故下一状态跳转到S3,而不是直接跳转到初始状态;
      • 在S6状态时,已接收到数据110111
        • 对于不考虑已有状态的情况,已接收到有效数据,下一数据收到0会跳转到初始状态S0,下一数据收到1会跳转到状态S1;
        • 对于考虑已有状态的情况,下一数据收到0,收到数据为1101110,有效数据为110,会跳转到状态S3,下一个数据收到1,收到数据为1101111,有效数据为11,会跳转到状态S2

    两者区别

    思维逻辑区别
    • 两者从思维逻辑上最简单的区别就是:在某一状态有新数据到来时,是否考虑已接收到的数据
    • 对于检验某数据中是否有给定序列时,
      • 考虑已接收到数据,不仅会大大降低检验所需的时间,更重要的是在检测中不会漏掉每一块该被检测的数据;
      • 而不考虑已接收到数据有一定机会会漏掉数据,从而得到错误的结果
    一个小例子
    • 以上文中所给的数据相同,需检测"110111"数据是否存在在所接收数据"11011011111"中
      • 首先根据已知进行判断,接收数据中存在需检测序列"110111" -> 11011011011111

      • 接着用状态机逻辑进行验证:
        对比例子

        • 考虑已有数据状态:
          • 在检测到11011011111时,下一个接收到的数据为0,不满足110111的检验序列,此时有效数据为110,11011011111,跳转到状态S3;
          • 在检验到11011011111时,下一个接收到的数据为1,满足110111的检验序列,此时输出结果z = 1表示检验到数据110111
          • 得出结果:存在需检验序列110111
        • 不考虑已有状态:
          • 在检测到11011011111时,下一个接收到的数据为0,不满足110111的检验序列,此时有效数据为0,跳转到状态S0;
          • 在检验到11011011111时,无下一个数据,不满足110111检验序列,此时输出结果z = 0表示未检验到序列110111
          • 得出结果:不存在需检验序列110111
        • 显而易见:不考虑已有状态会得出错误结果
  • 相关阅读:
    Java 基于 SpringBoot 的校园疫情防控系统
    【C#】解析和操作HTML文档,并进行同级或跨级匹配元素
    Linux权限管理
    Python学习第10天:类与对象
    用Python绘制简单曲线的几个方法
    Tomcat颁布自定义SSL(Https)证书
    C#神器"BlockingCollection"类实现C#神仙操作
    如何做好一个配置中心
    别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅
    @Transactional事务方法中包含多个同类事务方法,这些事务方法本身设置失效两种解决方案
  • 原文地址:https://blog.csdn.net/weixin_44321600/article/details/126191710