有限同步状态机
- 在我上一篇博客中,我有对有限同步状态做简单的举例说明,在这个地方有一个极小的细节需要注意:状态机的是否需要考虑已有状态
接收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
- 当下一个接收数据为1则跳转到当前状态的下一个有效状态
- 在S6状态时,已接收到数据110111,对于不考虑之前数据状态而言,此时无有效数据
- 当下一个数据为0则跳转到初始状态S0;
- 当下一个数据为1则跳转到有效状态为1的S1
- 在S2状态时,已接收到数据11
考虑已有状态
-
状态转移图
-
转移图解释:
- 在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
- 在S2状态时,已接收到数据11
两者区别
思维逻辑区别
- 两者从思维逻辑上最简单的区别就是:在某一状态有新数据到来时,是否考虑已接收到的数据
- 对于检验某数据中是否有给定序列时,
- 考虑已接收到数据,不仅会大大降低检验所需的时间,更重要的是在检测中不会漏掉每一块该被检测的数据;
- 而不考虑已接收到数据有一定机会会漏掉数据,从而得到错误的结果
一个小例子
- 以上文中所给的数据相同,需检测"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
- 显而易见:不考虑已有状态会得出错误结果
- 考虑已有数据状态:
-