實現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 而得名。在一組數的編碼中,若任意兩個相鄰的 只有一位二進位制數不同,則稱這種編碼為格雷碼...