精华内容
下载资源
问答
  • 格雷码计数器

    2015-09-09 22:54:00
    简介实现FIFO存储器读写指针比较好的方法就是使用格雷码计数器格雷码计数器的优势在于其相邻两个数值之间只有一位发生变化,提高了系统的抗干扰能力,而且在计数时,各个输出的门电路翻转次数要远远小于二进制...
    简介

    实现FIFO存储器读写指针比较好的方法就是使用格雷码计数器。格雷码计数器的优势在于其相邻两个数值之间只有一位发生变化,提高了系统的抗干扰能力,而且在计数时,各个输出的门电路翻转次数要远远小于二进制计数器,从而可以大幅度降低系统的功耗。

    实现格雷码计数器的步骤如下:

    1. 将格雷值转换为二进制值。
    2. 根据条件递增二进制值。
    3. 将二进制值转换为格雷码
    4. 将计数器的最终格雷值保存到寄存器中。

    gray

    格雷码转二进制

    格雷码转二进制的公式如下:

    binngrayn1
    bingrayibini+1

    格雷码转二进制Verilog代码如下:

    module gray_to_bin (gray,bin);
    
        parameter WIDTH = 8;
    
        input [WIDTH-1:0] gray;
        output [WIDTH-1:0] bin;
        wire [WIDTH-1:0] bin;
    
        assign bin[WIDTH-1] = gray[WIDTH-1];
        genvar i;
        generate
            for (i=WIDTH-2; i>=0; i=i-1)
                begin: gry_to_bin
                    assign bin[i] = bin[i+1] ^ gray[i];
                end
        endgenerate
    
    endmodule
    
    二进制转格雷码

    二进制转格雷码公式如下:

    graynbinn1
    graybinibini+1

    二进制转格雷码Verilog代码如下:

    module bin_to_gray (bin,gray);
    
        parameter WIDTH = 8;
    
        input [WIDTH-1:0] bin;
        output [WIDTH-1:0] gray;
        wire [WIDTH-1:0] gray;
    
        assign gray = bin ^ (bin >> 1);
    
    endmodule
    
    格雷码计数器

    将四个步骤组合在一起(格雷码转二进制、加法器、二进制转格雷码、保存格雷码的寄存器)即可实现格雷码计数器,其Verlog代码如下:

    module gray_counter(clk, rst_n, gray_dout);
        parameter WIDTH = 8;
        input clk;
        input rst_n;
        output [WIDTH-1:0] gray_dout;
    
        reg  [WIDTH-1:0] gray_dout;
        wire [WIDTH-1:0] gray_temp;
        wire [WIDTH-1:0] bin_dout;
        wire [WIDTH-1:0] bin_add;
    
        assign bin_add = bin_out + 1'b1;
        assign gray_temp = bin_add ^ (bin_add >> 1);
    
        always@(posedge clk or negedge rst_n) begin
            if(!rst_n)
                gray_dout <= {WIDTH{1'b0}};
            else
                gray_dout <= gray_temp;
        end
    
        gray_to_bin gtb(.gray(gray_dout), .bin(bin_dout));
        defparam gtb .WIDTH = WIDTH;
    
    endmodule
    

    功能仿真结果如下:
    rt

    如果需要设计更加可靠快速的格雷码计数器,请参考Advanced Synthesis Cookbook





    转载于:https://www.cnblogs.com/yfwblog/p/4796272.html

    展开全文
  • 使用Verilog语言实现格雷码计数器 已经在Spartan-7平台验证通过,附带testbench
  • 格雷码计数器GrayCn

    2011-03-15 14:29:56
    格雷码为安全二进制码,在异步时钟域中采用格雷码计数器,能抑制不安全因素发生
  • altera官方格雷码计数器,verilog代码编写
  • 8bit 格雷码计数器,已经通过调试验证,保证下载直接可用。
  • 格雷码计数器verilog实现  格雷码(Gray code),又叫循环二进制码或反射二进制码 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型...

      格雷码(Gray code),又叫循环二进制码或反射二进制码 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式。

      因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换到4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。

     下表为几种自然二进制码与格雷码的对照表:

     
    十进制数 自然二进制数 格雷码
    0 0000 0000
    1 0001 0001
    2 0010 0011
    3 0011 0010
    4 0100 0110
    5 0101 0111
    6 0110 0101
    7 0111 0100
    8 1000 1100
    9 1001 1101
    10 1010 1111
    11 1011 1110
    12 1100 1010
    13 1101 1011
    14 1110 1001
    15 1111 1000

    一般的,普通二进制码与格雷码可以按以下方法互相转换:

      二进制码->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
      格雷码-〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。
    View Code
     1 // Gray counter
     2 
     3 module gray_count
     4 (
     5     input clk, enable, reset,
     6     output reg [7:0] gray_count
     7 );
     8 
     9 // Implementation:
    10 
    11 // There's an imaginary bit in the counter, at q[-1], that resets to 1
    12 // (unlike the rest of the bits of the counter) and flips every clock cycle.
    13 // The decision of whether to flip any non-imaginary bit in the counter
    14 // depends solely on the bits below it, down to the imaginary bit.    It flips
    15 // only if all these bits, taken together, match the pattern 10* (a one
    16 // followed by any number of zeros).
    17 
    18 // Almost every non-imaginary bit has a submodule instance that sets the
    19 // bit based on the values of the lower-order bits, as described above.
    20 // The rules have to differ slightly for the most significant bit or else 
    21 // the counter would saturate at it's highest value, 1000...0.
    22 
    23     // q is the counter, plus the imaginary bit
    24     reg q [7:-1];
    25     
    26     // no_ones_below[x] = 1 iff there are no 1's in q below q[x]
    27     reg no_ones_below [7:-1];
    28     
    29     // q_msb is a modification to make the msb logic work
    30     reg q_msb;
    31     
    32     integer i, j, k;
    33     
    34     always @ (posedge reset or posedge clk)
    35     begin
    36         if (reset)
    37         begin
    38         
    39             // Resetting involves setting the imaginary bit to 1
    40             q[-1] <= 1;
    41             for (i = 0; i <= 7; i = i + 1)
    42                 q[i] <= 0;
    43                 
    44         end
    45         else if (enable)
    46         begin
    47             // Toggle the imaginary bit
    48             q[-1] <= ~q[-1];
    49             
    50             for (i = 0; i < 7; i = i + 1)
    51             begin
    52                 
    53                 // Flip q[i] if lower bits are a 1 followed by all 0's
    54                 q[i] <= q[i] ^ (q[i-1] & no_ones_below[i-1]);
    55             
    56             end
    57             
    58             q[7] <= q[7] ^ (q_msb & no_ones_below[6]);
    59         end
    60     end
    61     
    62     
    63     always @(*)
    64     begin
    65         
    66         // There are never any 1's beneath the lowest bit
    67         no_ones_below[-1] <= 1;
    68         
    69         for (j = 0; j < 7; j = j + 1)
    70             no_ones_below[j] <= no_ones_below[j-1] & ~q[j-1];
    71             
    72         q_msb <= q[7] | q[6];
    73         
    74         // Copy over everything but the imaginary bit
    75         for (k = 0; k < 8; k = k + 1)
    76             gray_count[k] <= q[k];
    77         end    
    78         
    79 endmodule

     

     

    posted on 2012-10-05 15:12 sheller_liu 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lsl2964/archive/2012/10/05/2712228.html

    展开全文
  • variable count:std_logic_vector(3 downto 0); if clk'event and clk='1' then case count is when "0000"=>count:="0001"; when "0001"=>count:="0011"; when "0011"=>count:="0010"; when "0010"=>count:="0110";...
  • [转]格雷码计数器的Verilog描述

    千次阅读 2010-01-07 08:48:00
    格雷码计数器的Verilog描述一、格雷码介绍(转载) 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自...

    格雷码计数器的Verilog描述

    一、格雷码介绍(转载)

           在数字系统中只能识别01,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。下表为几种自然二进制码与格雷码的对照表:

    ┌────┬──────┬───┬────┬──────┬────┐

    │十进制数│自然二进制数│格雷码│十进制数│自然二进制数│ 格雷码  

    ├────┼──────┼───┼────┼──────┼────┤

    0              0000                0000    8              1000                1100        │ 

    ├────┼──────┼───┼────┼──────┼────┤

    1               0001                   0001    9              1001                1101        

    ├────┼──────┼───┼────┼──────┼────┤

    2              0010                0011    10            1010                1111       

    ├────┼──────┼───┼────┼──────┼────┤

    3              0011                0010    11            1011                1110       

    ├────┼──────┼───┼────┼──────┼────┤

    4              0100                0110    12            1100                1010        

    ├────┼──────┼───┼────┼──────┼────┤

    5              0101                0111    13            1101                1011       

    ├────┼──────┼───┼────┼──────┼────┤

    6              0110                0101    14            1110                1001        

    ├────┼──────┼───┼────┼──────┼────┤

    7              0111                0100    15            1111                1000       

    └────┴──────┴───┴────┴──────┴────┘

     

    一般的,普通二进制码与格雷码可以按以下方法互相转换:

    二进制码-->格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0)

    格雷码--〉二进制码(解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).

    数学(计算机)描述:

    原码:p[0~n];格雷码:c[0~n](nN);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.

    编码:c=p XOR p[i+1](iN,0in-1)c[n]=p[n]

    解码:p[n]=c[n]p=c XOR p[i+1](iN,0in-1).

     

    Gray Code是由贝尔实验室的Frank Gray20世纪40年代提出的(是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的),用来在使用PCMPusle Code Modulation)方法传送讯号时避免出错,并于1953317日取得美国专利。由定义可知,Gray Code的编码方式不是唯一的,这里讨论的是最常用的一种。

     

    二、格雷码计数器算法(原创)

           格雷码计数器的关键在于根据当前码计算出下一个码,也就是计算出当前哪个位需要取反。

    此处给出Matlab的一种算法:

    function NxG = fNextGray( CurG, N )

    B(1) = CurG(1);

    for k = 2 : N

       B(k) = xor( CurG(k), B(k-1));

    end

     C = CurG;

    for k = N : -1 : 1

       if B(k) == 0 | k == 1

          C(k) = not( C(k));

          break

       end

    end

    NxG = C;

     

    三、8bits格雷码计数器的Verilog描述(原创)

           module GrayCnt( Clk, nRst, CntOut );

     

    input Clk, nRst;

    output [7:0] CntOut;

     

    reg [7:0]   CntOut;

    reg [7:0]   NextCnt;

     

    always @(posedge Clk)

    begin

       if (~nRst)

          CntOut <= 8'b0000_0000;

       else

          CntOut <= NextCnt;   

    end

     

    reg [7:0]   tmpCnt;

    integer k;

     

    always @( CntOut )

    begin

        tmpCnt[7] = CntOut[7];

       

        for( k=6; k>=0; k=k-1 )

           tmpCnt[k] = CntOut[k] ^ tmpCnt[k+1];

     

       

        if( tmpCnt[0]==1'b0 )

        begin

            NextCnt[0] = ~CntOut[0];

            NextCnt[7:1] = CntOut[7:1];

        end

        else if( tmpCnt[1]==1'b0 )

        begin

            NextCnt[0] = CntOut[0];

            NextCnt[1] = ~CntOut[1];

            NextCnt[7:2] = CntOut[7:2];

        end

        else if( tmpCnt[2]==1'b0 )

        begin

            NextCnt[1:0] = CntOut[1:0];

            NextCnt[2] = ~CntOut[2];

            NextCnt[7:3] = CntOut[7:3];

        end

        else if( tmpCnt[3]==1'b0 )

        begin

            NextCnt[2:0] = CntOut[2:0];

            NextCnt[3] = ~CntOut[3];

            NextCnt[7:4] = CntOut[7:4];

        end

        else if( tmpCnt[4]==1'b0 )

        begin

            NextCnt[3:0] = CntOut[3:0];

            NextCnt[4] = ~CntOut[4];

            NextCnt[7:5] = CntOut[7:5];

        end

        else if( tmpCnt[5]==1'b0 )

        begin

            NextCnt[4:0] = CntOut[4:0];

            NextCnt[5] = ~CntOut[5];

            NextCnt[7:6] = CntOut[7:6];

        end

        else if( tmpCnt[6]==1'b0 )

        begin

            NextCnt[5:0] = CntOut[5:0];

            NextCnt[6] = ~CntOut[6];

            NextCnt[7] = CntOut[7];

        end

        else

        begin

            NextCnt[6:0] = CntOut[6:0];

            NextCnt[7] = ~CntOut[7];

        end

    end

     

    endmodule

     

    综合结果为(Synplify Pro 9.6.2):

     


    仿真结果为(Modelsim 6.2b):

     

     


    附件中包括了完整的Matlba仿真程序和8bits格雷码计数器的ISE工程, 计数器输出保存在GrayOut.txt中,然后读入Matlab校验。有问题欢迎与我交流,zldpublic@gmail.com

    同时欢迎光临我的博客:http://jasonzhang.spaces.eepw.com.cn/

    展开全文
  • Gray code counters (having one bit change per counter transition) are often used in FIFO design and digital communication.Here I will show two styles gray code counter.Style #1 First style gray code ....

    Gray  code counters (having one bit change per counter transition) are often used in FIFO design and digital communication.

    Here I will show two styles gray code counter.

    Style #1

    First style gray code counter uses a single set of flip-flops as the Gray code register with accompanying Gray-tobinary conversion, binary increment, and binary-to-Gray conversion. 

     

     

     1module gray_counter(
     2        input iclk,
     3        input irst_n,
     4        input ivalid,
     5        output reg [3:0] gray);
     6
     7wire [3:0] bin_counter;
     8wire [3:0] gray_counter;
     9 
    10reg  [3:0] G2B_counter;
    11
    12// convert gray to  bin;
    13always@(ocounter)
    14begin
    15    G2B_counter[3= gray[3];
    16    G2B_counter[2= gray[2^ G2B_counter[3];
    17    G2B_counter[1= gray[1^ G2B_counter[2];
    18    G2B_counter[0= gray[0^ G2B_counter[1];
    19end
    20
    21//binary counter increased by one
    22assign bin_counter = bin_counter +ivalid;
    23
    24//convert bin to gray 
    25assign gray_counter = (bin_counter >>1^ bin_counter;
    26
    27always@(posedge iclk or negedge irst_n)
    28begin
    29    if(!irst_n)
    30    begin
    31        gray <= 4'b0;
    32    end
    33    else
    34    begin
    35        gray <= gray_counter;
    36    end
    37end
    38
    39endmodule
    40


    Style #2

    A second Gray code counter style, the one described below, uses two sets of registers, one a binary counter and a second to capture a binary-to-Gray converted value. The intent of this Gray code counter style #2 is to utilize the binary carry structure, simplify the Gray-to-binary conversion; reduce combinational logic, and increase the upper frequency limit of the Gray code counter.

     

     

     

     1module graycounter(
     2           input iclk,
     3           input irst_n,
     4           input ivalid,
     5           output     [ADDSIZE-1 : 0]  bin,
     6           output reg [ADDSIZE : 0]  gray);
     7
     8parameter ADDSIZE = 4;
     9
    10wire[ADDSIZE : 0] binnext;
    11wire[ADDSIZE : 0] graynext;
    12reg[ADDSIZE : 0] bin_o;
    13
    14assign binnext = bin_o + ivalid;
    15
    16assign graynext = (binnext >>1^ binnext;
    17
    18assign bin = bin_o[ADDSIZE-1 : 0];
    19
    20always@(posedge iclk or negedge irst_n )
    21if(!irst_n)
    22ExpandedBlockStart.gifContractedBlock.gif    {bin_o, gray} <= 0;
    23else
    24ExpandedBlockStart.gifContractedBlock.gif    {bin_o, gray} <= {binnext, graynext};
    25
    26
    27endmodule
    28
    29
    30
    31


    Reference:

    1.Vijay A. Nebhrajani," Asynchronous FIFO Architectures" part2

    2. Clifford E. Cummings, Sunburst Design, Inc " Simulation and Synthesis Techniques for Asynchronous
    FIFO Design"

     

    转载于:https://www.cnblogs.com/zhangzhi/archive/2009/11/03/1595060.html

    展开全文
  • Gray Counter (格雷码计数器)

    千次阅读 2011-03-28 22:47:00
    异步FIFO采用Gray Counter产生读写地址,Empty/Full信号的产生也与Gray Counter的最高两位相关。 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // ...
  • 测试脚本任务、格雷码计数器、LUT格雷码转换、快速格雷码转换算法
  • 格雷码计数器(Gray counter)是为了在异步时钟域之间传递计数结果而用到的计数器,因为格雷码计数器计数时相邻的数之间只有一个bit发生了变化,例如:000-001-011-010-110-111-101-100。  一般的,普通二进制码与...
  • 这篇博客会再次详细分析一下数字IC设计中关于 **格雷码(Gray Code)** 的问题 一、什么是格雷码 二、为什么要用格雷码 三、用格雷码实现FIFO指针 四、 将格雷码转换为二进制 ...下图显示格雷码计数器的逻辑原理图:
  • 异步FIFO的设计详解(格雷码计数+两级DFF同步)

    千次阅读 热门讨论 2020-04-06 20:07:44
    格雷码计数器二、代码code 一、异步FIFO介绍   FIFO有同步和异步两种,同步即读写时钟相同,同步FIFO用的少,可以作为数据缓存;异步即读写时钟不相同,异步FIFO可以 解决跨时钟域的问题,在应用时需根据实际情况...
  • 二进制与格雷码互相转换

    千次阅读 2021-03-10 19:12:18
    格雷码常用于通信,异步 FIFO或者 RAM 地址寻址计数器中。 一、格雷码简介 格雷码是一个叫弗兰克*格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数...
  • 格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作...格雷码常用于通信,FIFO或者RAM地址寻址计数器中。 如二进制计数编码从0到F的计数过程如下: ...
  • 0 目录 1)格雷码简介 2)进制转换列表 3)二进制转格雷码原理 4)FPGA简介 5)二进制转格雷码代码 ...格雷码常用于通信,FIFO或者RAM地址寻址计数器中。 2 进制转换列表 图1 不同进制转换 3 二进制转格雷码
  • 格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信。格雷码是一种循环二进制码或者叫...格雷码常用于通信,FIFO或者RAM地址寻址计数器中。 如二进制计数编码从0到F的计数过程如下: ...
  • 备战秋招[五]-异步FIFO

    2020-05-03 21:05:00
    目录异步FIFO1.0 摘要2.0 传递多个异步信号2.1 同步FIFO指针2.2 异步FIFO指针2.3 二进制FIFO指针注意事项2.4 FIFO测试的问题3.0格雷码计数器(风格1)3.1 格雷码模式3.2格雷码计数器基础3.3 对偶n-bit格雷码计数器3.4 ...
  • 而绝对式编码器是直接输出数字量的传感器,它是利用自然二进制或循环二进制(格雷码)方式进行光电转换的,编码的设计一般是采用自然二进制码、循环二进制码、二进制补码等。特点是不要计数器,在转轴的任意位置都可...
  • Verilog 实现 Splitter、 ALU、EXT、格雷码计数器、表达式状态机
  • FPGA中竞争和冒险现象

    千次阅读 2018-08-08 17:33:28
    冒险往往会影响到逻辑电路的稳定性。时钟端口、清零和置位端口对...例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件...
  • 移位时序控制器是高级在轨系统帧同步发送器设计的一部分,通过分析移位时序控制器的特点及其在传输过程中所遇到的各种问题,设计了基于格雷码计数器的移位时序控制器。其硬件电路部分由格雷码计数器、3-8译码器和D...
  • 异步fifo的设计(三)

    千次阅读 2017-07-26 18:10:10
    这篇文章主要讲述一下另一种异步fifo的设计方法,这种设计方法与上篇文章设计方法的...由前面博客中讲到的格雷码计数器可知,有两种设计方法:一种设计只用到一组触发器,但是Grey-to-binary转换器,二进制增量器,Bi
  • 摘要:FIFO经常应用于从一个时钟域传输数据到另一个异步时钟域...为解决异步FIFO设计过程中空满标志判断难以及FPGA亚稳态的问题,提出一种新颖的设计方案,即利用格雷码计数器(每次时钟到来仅有1位发生改变)表示读/写
  • 异步FIFO控制器的设计

    2020-10-18 23:06:39
    通过分析异步FIFO设计中的难点,以降低电路中亚稳态出现的概率为主要目的,提出了一种格雷码计数器的技术,通过仿真验证,有效地实现了异步FIFO控制器的设计。该设计将大大提高工作频率和资源利用率。

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

格雷码计数器