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
以上是8位Johnson计数器的systemverilog HDL。我从教科书中读到它有大量未使用的状态,这些状态形成了它们自己的计数器,即寄生状态机。这个寄生状态机究竟是什么?
答案 0 :(得分:6)
这里的问题是,如果这个电路由于某种原因最终进入其中一个未使用状态,那么你将陷入循环,然后永远不会返回到其中一个使用状态。此计数器具有以下状态:
00000000
10000000
11000000
11100000
11110000
...
00001111
00000111
00000011
00000001
如果宇宙射线撞击你的芯片并翻转其中一个位,你可能会得到正常操作中不存在的状态:
00010000
10001000
11000100
11100010
11110001
01111000
10111100
....
恢复正常的唯一方法是断言重置。您有两种方法可以解决这个问题:要么添加一堆逻辑来检测情况,要么假设随机翻转不会发生。我会说你不需要担心它,除非那个翻转的钻头要发射导弹。