典型二進制格雷碼(Binary Gray Code)簡稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名。
在一組數的編碼中,若任意兩個相鄰的代碼隻有一位二進制數不同,則稱這種編碼為格雷碼(Gray Code),另外由于最大數與最小數之間也僅一位數不同,即“首尾相連”,是以又稱循環碼或反射碼。 在數字系統中,常要求代碼按一定順序變化。例如,按自然數遞增計數,若采用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它代碼(1100、1111等)。在特定情況下可能導緻電路狀态錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。格雷碼有多種編碼形式,一般不做說明都是指典型格雷碼。
十進制數 | 4位自然二進制碼 | 4位典型格雷碼 | 十進制餘三格雷碼 | 十進制空六格雷碼 | 十進制跳六格雷碼 | 步進碼 |
---|---|---|---|---|---|---|
0000 | 0000 | 0010 | 0000 | 0000 | 00000 | |
1 | 0001 | 0001 | 0110 | 0001 | 0001 | 00001 |
2 | 0010 | 0011 | 0111 | 0011 | 0011 | 00011 |
3 | 0011 | 0010 | 0101 | 0010 | 0010 | 00111 |
4 | 0100 | 0110 | 0100 | 0110 | 0110 | 01111 |
5 | 0101 | 0111 | 1100 | 1110 | 0111 | 11111 |
6 | 0110 | 0101 | 1101 | 1010 | 0101 | 11110 |
7 | 0111 | 0100 | 1111 | 1011 | 0100 | 11100 |
8 | 1000 | 1100 | 1110 | 1001 | 1100 | 11000 |
9 | 1001 | 1101 | 1010 | 1000 | 1000 | 10000 |
10 | 1010 | 1111 | ---- | ---- | ---- | ---- |
11 | 1011 | 1110 | ---- | ---- | ---- | ---- |
12 | 1100 | 1010 | ---- | ---- | ---- | ---- |
13 | 1101 | 1011 | ---- | ---- | ---- | ---- |
14 | 1110 | 1001 | ---- | ---- | ---- | ---- |
15 | 1111 | 1000 | ---- | ---- | ---- | ---- |
表中典型格雷碼具有代表性。若不作特别說明,格雷碼就是指典型格雷碼,它可從自然二進制碼轉換而來。
格雷碼的特點:
- 格雷碼屬于可靠性編碼,是一種錯誤最小化的編碼方式。因為,雖然自然二進制碼可以直接由數/模轉換器轉換成模拟信号,但在某些情況,例如從十進制的3轉換為4時二進制碼的每一位都要變,能使數字電路産生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,隻有一位産生變化。它大大地減少了由一個狀态到下一個狀态時邏輯的混淆。由于這種編碼相鄰的兩個碼組之間隻有一位不同,因而在用于方向的轉角位移量-數字量的轉換中,當方向的轉角位移量發生微小變化(而可能引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。
- 格雷碼是一種絕對編碼方式,典型格雷碼是一種具有反射特性和循環特性的單步自補碼,它的循環、單步特性消除了随機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常友善。
- 由于格雷碼是一種變權碼,每一位碼沒有固定的大小,很難直接進行比較大小和算術運算,也不能直接轉換成液位信号,要經過一次碼變換,變成自然二進制碼,再由上位機讀取。
- 典型格雷碼是一種采用絕對編碼方式的準權碼,其權的絕對值為2^i-1(設最低位i=1)。
- 格雷碼的十進制數奇偶性與其碼字中1的個數的奇偶性相同。
轉換方法
遞歸生成碼表
這種方法基于格雷碼是反射碼的事實,利用遞歸的如下規則來構造:
- 1位格雷碼有兩個碼字
- (n+1)位格雷碼中的前2n個碼字等于n位格雷碼的碼字,按順序書寫,加字首0
- (n+1)位格雷碼中的後2n個碼字等于n位格雷碼的碼字,按逆序書寫,加字首1 [4]
- n+1位格雷碼的集合 = n位格雷碼集合(順序)加字首0 + n位格雷碼集合(逆序)加字首1
異或轉換
二進制碼→格雷碼(編碼):
此方法從對應的n位二進制碼字中直接得到n位格雷碼碼字,步驟如下:
- 對n位二進制的碼字,從右到左,以0到n-1編号
- 如果二進制碼字的第i位和i+1位相同,則對應的格雷碼的第i位為0,否則為1(當i+1=n時,二進制碼字的第n位被認為是0,即第n-1位不變) ,即n位的二進制碼的低位與相鄰高位進行異或,異或結果替換目前位
公式表示:
(G:格雷碼,B:二進制碼)
通俗來講:保留二進制碼最高位作為格雷碼最高位,而次高位格雷碼為二進制碼的高位于次高位相異或結果,其餘低位類似。
二進制數 1 0 1 1 0
二進制數右移一位,空位補0 0 1 0 1 1
異或運算 1 1 1 0 1
一句話:右移并且異或。
Verilog實作: assign wgraynext = (wbinnext >>1) ^wbinnext。