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. 

【Verilog】Gray Code Counter 格雷码计数器 

 

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


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.

 

 【Verilog】Gray Code Counter 格雷码计数器

 

 1【Verilog】Gray Code Counter 格雷码计数器module graycounter(
 2【Verilog】Gray Code Counter 格雷码计数器           input iclk,
 3【Verilog】Gray Code Counter 格雷码计数器           input irst_n,
 4【Verilog】Gray Code Counter 格雷码计数器           input ivalid,
 5【Verilog】Gray Code Counter 格雷码计数器           output     [ADDSIZE-1 : 0]  bin,
 6【Verilog】Gray Code Counter 格雷码计数器           output reg [ADDSIZE : 0]  gray);
 7【Verilog】Gray Code Counter 格雷码计数器
 8【Verilog】Gray Code Counter 格雷码计数器parameter ADDSIZE = 4;
 9【Verilog】Gray Code Counter 格雷码计数器
10【Verilog】Gray Code Counter 格雷码计数器wire[ADDSIZE : 0] binnext;
11【Verilog】Gray Code Counter 格雷码计数器wire[ADDSIZE : 0] graynext;
12【Verilog】Gray Code Counter 格雷码计数器reg[ADDSIZE : 0] bin_o;
13【Verilog】Gray Code Counter 格雷码计数器
14【Verilog】Gray Code Counter 格雷码计数器assign binnext = bin_o + ivalid;
15【Verilog】Gray Code Counter 格雷码计数器
16【Verilog】Gray Code Counter 格雷码计数器assign graynext = (binnext >>1^ binnext;
17【Verilog】Gray Code Counter 格雷码计数器
18【Verilog】Gray Code Counter 格雷码计数器assign bin = bin_o[ADDSIZE-1 : 0];
19【Verilog】Gray Code Counter 格雷码计数器
20【Verilog】Gray Code Counter 格雷码计数器always@(posedge iclk or negedge irst_n )
21【Verilog】Gray Code Counter 格雷码计数器if(!irst_n)
22


Reference:

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

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

 

相关文章:

  • 2021-11-29
  • 2022-12-23
  • 2021-08-12
  • 2021-09-11
  • 2022-12-23
  • 2021-12-12
  • 2022-12-23
猜你喜欢
  • 2022-02-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-27
  • 2022-01-04
  • 2022-01-13
相关资源
相似解决方案