抛砖引玉,一道序列检测小问题,您有更好的方法吗?
用移位寄存器实现序列检测器(Verilog)
https://www.nowcoder.com/questionTerminal/dbbe568066c8439996279d408e89698d
本文提出两种方法,抛砖引玉,欢迎大佬们拿出更好的办法砸过来!!
最近一个学弟问了我一道题,是一道序列检测的小题,还是很有趣的。题目是这样: 设计序列信号检测器,具体要求:当输入码流为 111000 或 101110 时输出信号为 1,否则输出信号 result 为 0。输入信号有效 valid 为 1 时表示当前输入有效,为 0 时表示无效,之前输入依旧计入序列中并不清零。
喜闻乐见的序列检测。见到这道题,首先见到序列检测第一反应就是状态机
如果要是写状态机,就要做下功课研究一下状态转移,序列检测的状态转移可是暗藏玄机。由于接收过程中,我们并不知道序列何时开始。可能有点说的模糊了,那我们这道题举个例子,首先我们来看我们要检测的两个序列:
首先这两个序列都要检查第一位是否为1,如果第一位检测到1,我们就检测第二位,假设第二位还是1,也就是目前还满足序列一,我们继续检测第三位,第三位检测到为0,不满足序列一,一般来说就想到重新检测了。但是实际上现在检测的序列为“1 1 0”他虽然不满足序列一了,但是这三位的后两位“1 0”是满足序列二的,接下来应该判断下一位是不是1,而不是回到最初的状态。
所以这个状态转移要满足序列的特性,而不是简单地一遍一遍的机械的扫。根据上面我们说的可以画出状态转移图:
注意右下角的红线,这个小红线可是个坑!细看当满足第二个序列的时候,也就是序列为“1 0 1 1 1 0”他的后四位“1 1 1 0”还是满足第一个序列的前四位的!很多小伙伴就忘记了这个,上一个序列结束了检测到了,结束了,还是有可能在已经检测到的序列中在检测出新的序列的!(写这句的时候突然想到一句不恰当的诗,“沉舟侧畔千帆过,病树前头万木春”)
这么复杂的状态转移采取检测这么6个数,是不是太慢烦了呢?于是并这一颗懒省事的心,外加受到启发,想到了曾经的项目:扰码器!
甚至于不用扰码器这么复杂,只需要一组移位寄存器。设置一组包括六个寄存器的移位寄存器,每个时钟沿向后移动一位,并且在每个时钟沿检测一下六个寄存器之中是不是我们存储的想要的序列,是就将result赋1,否则赋0.折腾那么半天的状态转移,简简单单一个移位寄存器就解决了,不得不说移位寄存器大法好啊。
设计电路图大致如下
既然我已经提出了两种办法,不知道各位还有没有更简单,更有效更快速的解决办法呢?