觀察一組數據:
0000 <-> 0000
0001 <-> 0001
0010 <-> 0011
0011 <-> 0010
0100 <-> 0110
0101 <-> 0111
0110 <-> 0101
0111 <-> 0100
1000 <-> 1100
1001 <-> 1101
1010 <-> 1111
1011 <-> 1110
1100 <-> 1010
1101 <-> 1011
1110 <-> 1001
1111 <-> 1000
左邊一列是正常的4位二進位自然碼,右邊就是4位格雷碼。
格雷碼的名字來源於1953年公開的弗蘭克·格雷的專利,最初發明出來是為了用於通訊當中,後來發現很多地方用它都會帶來好處。它的特點就是從G(n)到G(n+1)每次只有一位數據發生變化,這就可以避免多位數據「同時」變化的時候帶來的「不同時」問題。
1,數字通訊
當通訊雙方採用多通道並行傳輸(例如多根線)時,數據在發送端同時變化,可是到了接收端這個同時很難對齊,這就會出現一些中間狀態,格雷碼極大的避免了這種「中間狀態」。
2,跨時鐘域FIFO設計
同通訊一樣,從寫時鐘到讀時鐘也存在「同時」對齊的問題,因此這種FIFO同行也會採用格雷碼作為索引來避免錯誤的中間態。
3,位置編碼器
無論是角度位置還是直線位置,由於存在加工誤差,當多位數據需要同時變化時,不可避免的也會存在錯誤的中間態,因此在編碼器中採用格雷碼也有效的避免了這種中間態。
計算:假如自然數n,其二進位為B(n),格雷碼為G(n),則:
G(n) = B(n) xor (B(n) >> 1)
反過來,從G(n)到B(n)稍複雜一些,假如格雷碼的位數為m,G(n)[m-1]到G(n)[0]分別表示格雷碼的MSB到LSB,B(n)[m-1]到B(n)[0]表示自然碼的MSB到LSB,則:
B(n)[m-1] = G(n)[m-1];
B(n)[m-2] = B(n)[m-1] xor G(n)[m-2];
...
B(n)[0] = B(n)[1] xor G(n)[0];
4,狀態機
狀態機採用格雷碼的好處是當系統時鐘頻率很高時,可以節省能耗,並讓能耗更平穩。
每天都有新的收穫