推荐答案
测试一下
题目
用moore型状态机实现序列“1101”从右到左的不重叠检测。(注:典型的状态机设计分为moore与mealy两大类,其中mealy状态机的输出不仅与当前状态值有关,而且与当前输入有关;moore状态机的输出仅与当前状态值有关,而与此时的…
参考答案与知识点
参考答案
我们分析这道题:用moore型状态机实现序列“1101”从右到左的不重叠检测。注意:从右到左意味着序列比特顺序是从右往左看,即先检测最低位?实际上“1101”从右到左就是“1011”?需要理解:题目说“从右到左的不重叠检测”,通常序列检测是从左到右,即按输入顺序依次匹配。但这里指定“从右到左”,意味着检测的是反转后的序列?或者是在移位寄存器中数据从高位到低位输入?仔细看:可能是说检测的序列是“1101”,但输入数据的顺序是从右向左(即先输入最低位),那么实际检测的序列应该是“1011”(反转)。或者另一种理解:检测序列“1101”时,输入数据比特流是从左到右还是从右到左?通常题目会明确。这里可能是个陷阱:从右到左不重叠检测,意思是当检测到序列时,从右边开始不重叠。更合理的解释是:要检测的序列是“1101”,但是输入数据的顺序是低位先来(即从右向左读取)。例如输入比特流...,我们检测是否存在连续的“1101”模式,但输入顺序是从右向左。因此实际需要检测的模式是反转后的“1011”。但题目明确说“序列‘1101’从右到左”,可能意味着在数据流中,序列是从右向左排列的,即检测时,应该按照数据流的方向(从右到左)匹配“1101”。为了简化,我们可以认为:输入数据是按顺序从低位到高位(LSB first)输入的,我们要检测是否存在连续的“1101”模式(注意顺序:先检测到1,然后1,然后0,然后1?但LSB first,则最先输入的是最低位,那么序列“1101”从低到高是“1”(LSB)、“0”、“1”、“1”(MSB)?不对。通常表示法:二进制数1101,从右到左(即从LSB到MSB)是1,0,1,1。所以如果输入顺序是LSB先,那么检测的序列应该是1,0,1,1(即1011)。因此,状态机应设计为检测序列1011。
但题目原文是“用moore型状态机实现序列“1101”从右到左的不重叠检测”,可能期望按正常顺序检测“1101”但输入顺序是从右到左?很多笔试题会这样出,以考察对序列检测方向的理解。为了保险,我们查阅常见解释:在一些笔试题中,“从右到左”意味着数据流是从右向左移动,即每次输入的新数据是低位,序列检测时,我们需要检测的反向序列。例如检测“1101”从右到左,实际检测的是“1011”。但题目没有明确,可能有两种理解。但按照通常的序列检测器设计,如果输入顺序是MSB先,则直接检测1101;如果输入顺序是LSB先,则检测1011。但题目特意说“从右到左”,可能是在强调输入顺序是从低位到高位,因此要检测的反转序列。
另一种可能是:不重叠检测意味着检测到一次后,状态机必须回到初始状态,不能重叠。例如序列1101101,检测到第一个1101后,第二个必须重新开始,不能利用重叠的部分。但通常不重叠是指检测成功一次后,状态机回到初始状态,忽略重叠部分。也有重叠检测,允许重叠。所以这里明确不重叠。
我们作为参考答案,应首先明确理解:由于是moore型状态机,输出仅与状态有关,所以我们需要定义多个状态来记录已经匹配的部分。序列“1101”从右到左,即输入顺序是LSB first,所以实际检测“1011”。我们设计状态:S0:初始,未匹配任何;S1:已匹配位数1(即收到第一个1,注意第一个输入应该是LSB,即序列1011的第一个是1);S2:已匹配“10”(即收到1后收到0);S3:已匹配“101”(即收到1,0,1);S4:检测到完整序列“1011”,输出1,然后回到S0(不重叠)。但注意:如果输入继续,在检测到完整序列后,下一个输入可能成为新序列的开始?所以通常不重叠检测在输出后回到S0,但也可以考虑在输出后,将当前输入作为下一个序列的开始。例如检测到1011时,最后一个输入是1,那么下一个输入应该作为新序列的起始。所以状态转移图:S0输入1->S1;S0输入0->S0(因为第一个必须是1);S1输入0->S2(匹配10);S1输入1->S1(继续等待第二个1?实际上如果输入1,则匹配了“11”?但按照序列1011,第2位是0,所以如果输入1,则当前匹配的部分还是1?但已经有一个1,再输入1,相当于两个连续1,但序列需要的是1,0,1,1,所以第二个1不能作为第二个位,而是可能作为第一个位?实际上需要重新考虑匹配。常见状态机设计:从初始状态S0,输入1则进入S1,表示已匹配第一位的1;S1输入0则进入S2,表示匹配了“10”;S1输入1则仍留在S1(因为两个连续的1,但只有第一个1被视为匹配,第二个1可以视为新序列的第一个?但这样会丢失重叠的可能性?但题目是不重叠,不重叠意味着检测到一次后重新开始,但中间重叠部分不能利用。所以如果连续输入1,1,0,1,1,可能检测到一个序列吗?第一个1->S1,第二个1输入,此时S1下输入1,根据状态机设计,有两种处理方式:一种是认为第二个1不匹配,因为需要0,所以应该回到S0?但这样会漏掉序列。实际上,对于不重叠检测,通常的状态机是允许在未完成检测时,如果输入不符合预期,可以转移到某个状态继续匹配,以确保不错过可能的序列。例如检测1011,当S1收到1时,实际形成了两个连续的1,但可能第二个1是新序列的开始,所以可以转移到S1(视为已匹配一个1)。但这样,如果输入是1,1,0,1,1,在第一个1后输入第二个1,状态从S1又回到S1(匹配了一个1);然后输入0,从S1到S
涉及知识点
- 状态机