原创 特定序列检测

2009-11-28 21:53 2068 20 20 分类: FPGA/CPLD

从数据流<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


  010_01101_0_11010_1010_1011_0100_001   


注明:这里的“_”仅为看得方便,并属于数据流的一部分。


之中捡出特定序列“011010”。


 


解:


最后得到的状态转换图如下:


点击看大图


 


分析:


1--- 对它特定序列 011010 进行划分:


定义检索到 0 时, 数据长度为1 ,状态为a


定义检索到 01 时,数据长度为 2,状态为b


定义检索到 011 时,数据长度为 3,状态为c


定义检索到 0110 时,数据长度为 4,状态为d


定义检索到 01101 时,数据长度为 5,状态为e


定义检索到 011010 时,数据长度为 6,状态为f


 


---将上面的数据看做是以数据长度为索引的表格:




数据长度


标识


对应状态


1


0


a


2


01


b


3


011


c


4


0110


d


5


01101


e


6


011010


f


 


2--- idle状态开始,逐步分析:


----假设数据流(输入) 按节拍 逐位 LSBMSB 方向移入缓冲区


            MSB …_|__|__|__|__|__|__|__… LSB


缓冲区数据定义为S(看做是二进制数)。


 


(1)       若第1个输入的数据为1,则S=1 SS末尾的(1~6)位都不存在 S!= Q,因此系统继续保留在idle状态; 而当输入的是0时,则S=0, 而且SS末尾的(1~6)位存在Q=S,那么系统跳至状态a


(2)       当系统进入了状态a,如果输入的第2个数据为1,则S=01SS末尾的(1~6)位存在Q=S(这里S的末2 = 01标识),那么系统进入状态b      如果输入的第2个数据为0,则S=00SS末尾的(1~6)位存在Q=S (这里S的末1 = 0标识),则系统进入a状态,即保持。


(3)       一下以此类推,每一次都 依次把SS末尾的(1~6 因为特定序列只有6位) 标识比较(0 ~ 011010)比较,从而确定下一个状态。


 


------------ 更详细的一个思考过程:


            假如此刻在状态d(即S=0110, 当下一个数据是1时,则S=01101,系统进入状态e


若输入的是0,则S=01100,显然,S=01100是一个新状态,定义为I


再读取下一个数据*,则S=01100*


如果 *= 0,则S=011000 然后取S1尾(即0)与上面的表格比较,得知下一个状态应该是a


如果 *= 1,则S=011001 然后


S1位(即1)与上面的表格比较,得知并不存在相应的次态;   则要继续比较,


再取S2位(即01)与上面的表格比较,得知下一个状态是b 知道次态后,不用再比较下去。


 


当所有的状态都能回归之后,完成装换图。

文章评论0条评论)

登录后参与讨论
我要评论
0
20
关闭 站长推荐上一条 /2 下一条