例题: 看到一个检测10010 序列的一个例题 功能是检测一个5位二进制序列“10010”。可实现循环检测 (检测到10010之后如果后续输入为010,即序列为
10010010 ,需检测到2次该序列)用Verilog代码实现并给出 测试结果。
状态图:
代码:
tb:
wave:
我的问题 ->
关于检测10010 状态机的那个例题 这里的 input_num 在tb上定义的和clk周期一致, 即每个时钟周期生成一个随机数 这种状态可以正确检验输入序列
_然后我就想, 如果这里的序列 input_num 持续时间大于clk 周期, 是不是会检测错误?_
因为我看着组合逻辑那个块里 current state 变化也会触发下面的逻辑, 我理解的是 当前状态下 S2 -> S3 后状态变了, 然后以S3 为当前状态做判定, num=0 然后回到IDLE 状态
如下为我所想的这种情况下的wave图:
即是发生检测错误? 并且我想 如果input num 持续时间远小于clk的话, 应该也检测不出来吧?
这里的input num 的持续时间是要有个范围的么难道?
希望解答
很有意思的问题,观察思考也很细致
首先我们在做激励代码时,输入的数据一般和时钟的相位基本一致,你的激励代码的输入 input_num 比时钟迟后了半个时钟周期。这样就出现了一个奇怪有趣的波形,S2 -> S3 过程中出现了 IDLE 这个不正常的"毛刺"
首先需要肯定的是这不影响结果,这种同步状态机逻辑具有相当大的容错,允许输入的数据有近一个时钟周期的延时抖动的容错。只要在下个时钟周期的上升沿到来前这个时刻保持正常稳定的电平就行。
我们在做这种设计时应该避免出现一些不可预料的毛刺,当然对一些不能有效去除的毛刺也能保持容忍。这种同步的逻辑设计能有效的去除这种毛刺的干扰。