格雷碼(Gray code)是1880年由法國工程師Jean-Maurice-Emlle Baudot發明的一種編碼,是一種絕對編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,它的循環、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式,因為,雖然自然二進制碼可以直接由數/模轉換器轉換成模擬信號,但在某些情況,例如從十進制的3轉換為4時二進制碼的每一位都要變,能使數字電路產生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減少了由一個狀態到下一個狀態時邏輯的混淆。由於這種編碼相鄰的兩個碼組之間只有一位不同,引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。
格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,為無權數碼,且格雷碼的順序不是唯一 的。
格雷碼的構造方法為:直接排列以二進制為0值的格雷碼為第零項,第一項改變最右邊的位元,第二項改變右起第一個為1的位元的左邊位元,第三、四項方法同第一、二項,如此反覆,即可排列出n個位元的格雷碼。
下面主要談談格雷碼和自然二進制碼之間的轉換方法。
1)自然二進制碼轉換為格雷碼的方法
自然二進制碼轉換成二進制格雷碼,其法則是保留自然二進制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進制碼的高位與次高 位相異或,而格雷碼其余各位與次高位的求法相類似。
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)格雷碼轉換為二進制碼的實現方法
二進制格雷碼轉換成自然二進制碼,其法則是保留格雷碼的最高位作為自然二進制碼的最高位,而次高位自然二進制碼為高位自然二進制 碼與次高位格雷碼相異或,而自然二進制碼的其余各位與次高位自然二進制碼的求法相類似。
