格雷碼(Gray code)是1880年由法國工程師Jean-Maurice-Emlle Baudot發明的一種編碼,是一種絕對編碼方式,典型格雷碼是一種具有反射特性和迴圈特性的單步自補碼,它的迴圈、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式,因為,雖然自然二進位碼可以直接由數/模轉換器轉換成類比訊號,但在某些情況,例如從十進位的3轉換為4時二進位碼的每一位都要變,能使數字電路產生很大的尖峰電流脈衝。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減少了由一個狀態到下一個狀態時邏輯的混淆。由於這種編碼相鄰的兩個碼組之間只有一位不同,引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。
格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,為無權數位,且格雷碼的順序不是唯一 的。
格雷碼的構造方法為:直接排列以二進位為0值的格雷碼為第零項,第一項改變最右邊的位元,第二項改變右起第一個為1的位元的左邊位元,第三、四項方法同第一、二項,如此反覆,即可排列出n個位元的格雷碼。
下面主要談談格雷碼和自然二進位碼之間的轉換方法。
1)自然二進位碼轉換為格雷碼的方法
自然二進位碼轉換成二進位格雷碼,其法則是保留自然二進位碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進位碼的高位與次高 位相異或,而格雷碼其餘各位與次高位的求法相類似。 原理: 若二進位碼錶示為: B[N-1]B[N-2]...B[2]B[1]B[0]; 相應地, 則二進位格雷碼錶示為: G[N-1]G[N-2]...G[2]G[1]G[0]. 其中最高位保留: G[N-1] = B[N-1]; 其他各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, ..., n-2) 圖示如下:
bin[3] bin[2] bin[1] bin[0] ---二進位值 : 二進位
+ 0 bin[3] bin[2] bin[1] ---右移值(二進位)
gray[3] gray[2] gray[1] gray[0] ---對應的格雷碼值
總結:格雷碼的值只需要在原來的二進位的基礎上右移一位再加上原來的二進位值即可得到。
其實現代碼如下: module bin2gry(Gry,Bin);
parameter length = 8; //以八位樣本
output [length-1:0] Gry;
input [length-1:0] Bin; reg [length-1:0] Gry;
integer i; always @ (Bin)
begin
for(i=0;i<length-1;i=i+1)
Gry[i]=Bin[i]^Bin[i+1];
Gry[i]=Bin[i];
end /*另一種簡單的實現方法如下:*/
// assign Gray = (Bin >> 1) ^ Bin; endmodule
2)格雷碼轉換為二進位碼的實現方法
二進位格雷碼轉換成自然二進位碼,其法則是保留格雷碼的最高位作為自然二進位碼的最高位,而次高位自然二進位碼為高位自然二進位 碼與次高位格雷碼相異或,而自然二進位碼的其餘各位與次高位自然二進位碼的求法相類似。 原理: 若二進位格雷碼錶示為: G[N-1]G[N-2]...G[2]G[1]G[0]; 相應地, 則二進位碼錶示為: B[N-1]B[N-2]...B[2]B[1]B[0]. 其中最高位保留: B[N-1] = G[N-1]; 其他各位: B[i-1] = G[i-1] xor B[i]. (i = 1, 2, ..., n-1)
圖示如下:
module gry2bin(Gry,Bin); parameter length = 8; input [length-1:0] Gry; output [length-1:0] Bin; reg [length-1:0] Bin; integer i; always @ (Gry)begin Bin[length-1]=Gry[length-1]; for(i=length-2;i>=0;i=i-1) Bin[i]=Bin[i+1]^Gry[i]; end endmodule 綜合結果如下: