• 【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
        • 显而易见:不考虑已有状态会得出错误结果
  • 相关阅读:
    【C++学习笔记】1.5 extern “C“
    QT基础第三天(3)widget,dialog和mainwindow
    重点:二维数组首地址的三种表示方式
    SpringCloud之@FeignClient()注解的使用方式
    【论文阅读】大语言模型中的文化道德规范知识
    “蔚来杯“2022牛客暑期多校训练营8,签到题F
    HTML5基础汇总
    Win11快速助手在哪里?Win11打开快速助手的方法
    Postman接口&压力测试 ---- Tests使用(断言)
    OpenGL 图像白平衡色温
  • 原文地址:https://blog.csdn.net/weixin_44321600/article/details/126191710