什么是Johnson计数器中的寄生状态机

Vai*_*yal 6 system-verilog

module johnson #(parameter N=8)
  (output logic [N-1:0] q, input logic clk,reset);

  always_ff @(posedge clk,posedge reset)
    if(reset)
      q<=0;
    else
      q<={~q[0],q[N-1:1]};

endmodule
Run Code Online (Sandbox Code Playgroud)

以上是8位Johnson计数器的systemverilog HDL.我从教科书中读到它有大量未使用的状态,这些状态形成了他们自己的计数器,即寄生状态机.这个寄生状态机究竟是什么?

ngu*_*rie 6

这里的问题是,如果这个电路由于某种原因最终进入一个未使用状态,你将陷入循环,然后永远不会返回到其中一个使用状态.此计数器具有以下状态:

00000000
10000000
11000000
11100000
11110000
...
00001111
00000111
00000011
00000001
Run Code Online (Sandbox Code Playgroud)

如果宇宙射线撞击你的芯片并翻转其中一个位,那么你可能会得到正常操作中不存在的状态:

00010000
10001000
11000100
11100010
11110001
01111000
10111100
....
Run Code Online (Sandbox Code Playgroud)

恢复正常的唯一方法是断言重置.您有两种方法可以解决这个问题:要么添加一堆逻辑来检测情况,要么假设随机翻转不会发生.我会说你不需要担心它,除非那个翻转的钻头要发射导弹.