📜  Verilog Johnson计数器

📅  最后修改于: 2021-01-11 15:13:50             🧑  作者: Mango

Verilog Johnson柜台

约翰逊计数器是一种数字电路,具有以反馈方式连接的一系列触发器。如果位数为N,则Verilog Johnson计数器是对2N个状态进行计数的计数器。

该电路是一种特殊类型的移位寄存器,其中最后一个触发器的补码输出反馈到第一个触发器的输入。这几乎类似于环形计数器,但有一些额外的优点。

约翰逊计数器的主要优点是,与标准环形计数器相比,它仅需要触发器数量的一半,然后其模数减半。因此, n级约翰逊计数器将循环单个数据位,给出2n个不同状态的序列,因此可以将其视为mod-2n计数器。

最后一个触发器的反相输出Q连接回第一个触发器的输入D。以下是4位Johnson计数器的电路图:

Q的这种反转在反馈到输入D之前使计数器的计数有所不同。而不是像普通的环形计数器一样通过固定的一组模式进行计数(例如对于4位计数器),而是使用“ 0001”(1),“ 0010”(2),“ 0100”(4),“ 1000”(8 )并重复。约翰逊计数器递增计数,然后递减计数,因为初始逻辑“ 1”通过它向右传递,从而替换了先前的逻辑“ 0”。

4位Johnson环计数器传递四个逻辑“ 0”的块,然后传递四个逻辑“ 1”的块,从而产生8位模式。

当反相的输出Q连接到输入D时,此8位模式将连续重复。例如,“ 1000”,“ 1100”,“ 1110”,“ 1111”,“ 0111”,“ 0011”,“ 0001”,“ 0000”。下表演示了这一点:

Clock Pulse No FFA FFB FFC FFD
0 0 0 0 0
1 1 0 0 0
2 1 1 0 0
3 1 1 1 0
4 1 1 1 1
5 0 1 1 1
6 0 0 1 1
7 0 0 0 1

除了围绕连续循环对数据进行计数或旋转外,环形计数器还可以用于检测或识别一组数据中的各种模式或数值。通过将简单的逻辑门(例如“或”门)连接到触发器的输出,可以使电路检测到设定的数字或值。

标准的2级,3级或4级Johnson环形计数器还可用于通过改变其反馈连接来对时钟信号频率进行分频,并且还可提供3分频或5分频输出。

例如,通过连接到A,B和NOT-B处的数据输出,可以将3级Johnson环形计数器用作3相,120度相移方波发生器。

标准的5级Johnson计数器,例如常用的CD4017,通常用作同步十进制计数器/分频器电路。

其他组合,例如较小的2级电路,也称为正交振荡器或发生器,可用于产生四个单独的输出,每个输出彼此相差90度,以产生4相时序信号。

module johnson_ctr #(parameter WIDTH=4)
  (
    input clk,
    input rstn,
      output reg [WIDTH-1:0] out
  );

  always @ (posedge clk) begin
      if (!rstn)
         out <= 1;
      else begin
        out[WIDTH-1] <= ~out[0];
        for (int i = 0; i < WIDTH-1; i=i+1) begin
          out[i] <= out[i+1];
        end
      end
  end
endmodule

试验台

module tb;
  parameter WIDTH = 4;

  reg clk;
  reg rstn;
  wire [WIDTH-1:0] out;

  johnson_ctr     u0 (.clk (clk),
                .rstn (rstn),
                .out (out));

  always #10 clk = ~clk;

  initial begin
    {clk, rstn} <= 0;

    $monitor ("T=%0t out=%b", $time, out);
    repeat (2) @(posedge clk);
    rstn <= 1;
    repeat (15) @(posedge clk);
    $finish;
  end
endmodule

输出看起来像:

ncsim> run
T=0 out=xxxx
T=10 out=0001
T=50 out=0000
T=70 out=1000
T=90 out=1100
T=110 out=1110
T=130 out=1111
T=150 out=0111
T=170 out=0011
T=190 out=0001
T=210 out=0000
T=230 out=1000
T=250 out=1100
T=270 out=1110
T=290 out=1111
T=310 out=0111
Simulation complete via $finish(1) at time 330 NS + 0