格雷碼計數器

2021-07-05 04:58:44 字數 1995 閱讀 8136

實現fifo儲存器讀寫指標比較好的方法就是使用格雷碼計數器。格雷碼計數器的優勢在於其相鄰兩個數值之間只有一位發生變化,提高了系統的抗干擾能力,而且在計數時,各個輸出的閘電路翻轉次數要遠遠小於二進位制計數器,從而可以大幅度降低系統的功耗。

實現格雷碼計數器的步驟如下:

1. 將格雷值轉換為二進位制值。

2. 根據條件遞增二進位制值。

3. 將二進位制值轉換為格雷碼

4. 將計數器的最終格雷值儲存到暫存器中。

格雷碼轉二進位制的公式如下: bi

nn−1

=gra

yn−1

bini

=gra

yi⨁b

ini+

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];

endendgenerate

endmodule

二進位制轉格雷碼公式如下: gr

ayn−

1=bi

nn−1

gray

i=bi

ni⨁b

ini+

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 <= };

else

gray_dout <= gray_temp;

endgray_to_bin gtb(.gray(gray_dout), .bin(bin_dout));

defparam gtb .width = width;

endmodule

功能**結果如下:

如果需要設計更加可靠快速的格雷碼計數器,請參考advanced synthesis cookbook

生成格雷碼

程式設計題 生成格雷碼 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 思想 用遞迴法實現,把求n位格雷碼分解為求n 1...

生成格雷碼

題目描述 在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼 gray code 請編寫乙個函式,使用遞迴的方法生成n位的格雷碼。給定乙個整數n,請返回n位的格雷碼,順序為從0開始。測試樣例 1返回 0 1 1 n 1時,返回0,1 2 n 2時,返回00,01,10,...

關於格雷碼

典型二進位制格雷碼 binary gray code 簡稱格雷碼,因1953年公開的弗蘭克 格雷 frank gray,18870913 19690523 專利 pulse code communication 而得名。在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼...