📜  Verilog灰色计数器

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

Verilog灰色计数器

格雷码是一种二进制数字系统,一次只能更改一位。如今,格雷码已在数字世界中广泛使用。这将有助于纠错和信号传输。格雷计数器在VLSI域的设计和验证中也很有用。

格雷码将整数编码为位序列,其特性是相邻整数的表示在一个二进制位置上完全不同。

格雷码有多种类型,例如平衡,二进制反射,最大间隙和对映格雷码。

计数器的主要函数是产生指定的输出序列,有时也称为模式发生器。

设计

在格雷码中,一次仅更改一位。该设计代码具有两个输入,即时钟和复位信号,以及一个将产生格雷码的4位输出。

首先,如果rstn信号为高电平,则输出将为零,而一旦rstn变为低电平,则在clk的上升沿上,设计将生成一个四位格雷码,并继续在该信号的每个上升沿上生成clk信号。

可以升级此设计代码,并将二进制数字作为输入,并且此设计将用作二进制到格雷码的转换器。

module gray_ctr
  # (parameter N = 4)

  (    input     clk,
    input     rstn,
    output reg [N-1:0] out);

    reg [N-1:0] q;

    always @ (posedge clk) begin
        if (!rstn) begin
        q <= 0;
            out <= 0;
      end else begin
          q <= q + 1;
`ifdef FOR_LOOP
        for (int i = 0; i < N-1; i= i+1) begin
          out[i] <= q[i+1] ^ q[i];
        end
        out[N-1] <= q[N-1];
`else
            out <= {q[N-1], q[N-1:1] ^ q[N-2:0]};
`endif
    end
    end
endmodule

硬件原理图

试验台

module tb;
  parameter N = 4;

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

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

  always #10 clk = ~clk;

  initial begin
    {clk, rstn} <= 0;

    $monitor ("T=%0t rstn=%0b out=0x%0h", $time, rstn, out);

    repeat(2) @ (posedge clk);
    rstn <= 1;
    repeat(20) @ (posedge clk);
    $finish;
  end
endmodule

并产生以下输出,例如:

ncsim> run
T=0 rstn=0 out=0xx
T=10 rstn=0 out=0x0
T=30 rstn=1 out=0x0
T=50 rstn=1 out=0x1
T=70 rstn=1 out=0x3
T=90 rstn=1 out=0x2
T=110 rstn=1 out=0x6
T=130 rstn=1 out=0x7
T=150 rstn=1 out=0x5
T=170 rstn=1 out=0x4
T=190 rstn=1 out=0xc
T=210 rstn=1 out=0xd
T=230 rstn=1 out=0xf
T=250 rstn=1 out=0xe
T=270 rstn=1 out=0xa
T=290 rstn=1 out=0xb
T=310 rstn=1 out=0x9
T=330 rstn=1 out=0x8
T=350 rstn=1 out=0x0
T=370 rstn=1 out=0x1
T=390 rstn=1 out=0x3
T=410 rstn=1 out=0x2
Simulation complete via $finish(1) at time 430 NS + 0

平衡格雷码

在平衡格雷码中,不同坐标位置的变化次数尽可能接近。

如果格雷码的转换计数都相等,则它是均匀均匀平衡的。

如果格雷码的所有转换计数均为2的幂次幂,则也可以实现指数平衡,并且对于2的每个幂次都存在这样的代码。

例如,一个平衡的4位格雷码具有16个过渡,可以在所有四个位置之间平均分配(每个位置四个过渡),从而使其均匀平衡。

0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 0 
0 0 1 1 1 1 0 0 1 1 1 1 0 0 0 0 
0 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 
0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1

一元格雷码

除二进制反射的格雷码外,还有许多特殊类型的格雷码。一种此类格雷码是n元格雷码,也称为布尔格雷码。顾名思义,这种格雷码在其编码中使用非布尔值。

例如,三元三进制格雷码将使用值{0、1和2}。 (n,k)-格雷码是具有k位数字的n元格雷码。 (3,2)-格雷码中的元素顺序为:{00、01、02、12、11、10、20、21和22}。

(n,k)-格雷码可以像BRGC那样递归地构造,或者可以迭代地构造。

单调格雷码

单调代码在互连网络理论中很有用,尤其是在使处理器线性阵列的扩散最小化方面。

如果我们定义一个二进制字符串的重量要在字符串中1的个数,那么尽管我们显然不能与重量严格递增的格雷码,我们可能要通过两个相邻的权重达到之前具有的代码运行到接近这个下一个。

贝克特-格雷码

格雷码的另一种类型,即贝克特-格雷码,以对对称性感兴趣的爱尔兰剧作家塞缪尔·贝克特(Samuel Beckett)的名字命名。他的剧作《四人行》有四个演员,分为16个时间段。每个时期以进入或离开舞台的四个演员之一结束。

戏剧从一个空旷的舞台开始,贝克特希望每个演员的子集都只能在舞台上出现一次。 4位二进制格雷码可以表示当前舞台上的演员组。

然而,

贝克特对剧本施加了额外的限制:他希望演员能够进出,以便在舞台上最长的演员总是能退出的。

然后,可以用先进先出(FIFO)队列来表示参与者,以便要出队的参与者始终是最先入队的参与者。

贝克特无法为其演奏找到贝克特-格雷码,并且确实,所有可能序列的详尽清单显示,对于n = 4,不存在这样的代码。今天已知,对于n = 2、5,确实存在这样的代码。 ,6、7和8,并且对于n = 3或4不存在。

蛇形密码

盒内编码或蛇是n维超立方体图中诱导路径的节点序列,盒内编码或线圈是n维超立方体图中诱导循环的节点序列。超立方体。

从格雷码来看,这些序列具有检测任何一位编码错误的特性。

单轨格雷码

另一类格雷码是由Norman B. Spedding开发的单轨格雷码(STGC),由Hiltgen,PatersonBrandestini在“单轨格雷码”(1996)中进行了改进。

STGC是长度为n的P个唯一二进制编码的循环列表,这样两个连续的单词在一个位置上完全不同。当列表被视为P×n矩阵时,每一列都是第一列的循环移位。

该名称源于旋转编码器的使用,在旋转编码器中,触点感测到许多轨迹,因此每个通道的输出为0或1。为减少由于不同触点未及时切换同一时刻而引起的噪声,最好设置一个跟踪,以便联系人的数据输出为格雷代码。

为了获得较高的角度精度,需要很多触点。为了达到至少1度的精度,每转至少需要360个不同的位置,这至少需要9位数据和相同数量的触点。

如果将所有触点放置在相同的角度位置,则需要9条轨道才能获得至少1度精度的标准BRGC。但是,如果制造商将触点移动到不同的角度位置,但与中心轴的距离相同,则需要将相应的“环形图案”旋转相同的角度以提供相同的输出。

二维格雷码

二维格雷码用于通信中,以最小化星座图中相邻点的正交幅度调制中的位错误数。

在标准编码中,水平和垂直相邻星座点相差一位,而相邻对角点相差2位。