格雷碼與卡諾圖順序
一、格雷碼編碼規則
畫卡諾圖的時候需要先將所有變量可能以格雷碼的形式排列在方格兩側,所有變量有2^n個,雖然我們常用的變量為四個及以下,可以熟記格雷碼,但為了學習還是有必要了解格雷碼的編碼規則。格雷碼的基本特點就是任意兩個相鄰的代碼只有一位二進制數不同,這樣在數字電路中變化時每次就只有一位發生變化,提高了電路的穩定性。
格雷碼與二進制的轉換
規則:
格雷碼轉二進制
格雷碼轉二進制碼的公式,如下所示:
1
|
b[n-1]=g[n-1], b[i]=gray[i]^b[i+1], i=[0,1,...,n-2]
|
其運算過程的示意圖如圖2所示(這里以8位的數據位寬為例):
格雷碼轉二進制碼示意圖
從圖可以看出,除格雷碼的最高位直接賦給二進制碼的最高位外,其他二進制碼位等對應格雷碼位與其高位格雷碼位異或的結果,因此可歸納出一表達式,如下所示(其中“^”表示變量各位異或):
1
2
|
for
(i = 0; i < n-1; i++)
b[i] = ^(gray >> i);
|
觀察上表可知,格雷碼轉二進制是從左邊第二位起,將每位與左邊一位二進制碼的值異或,作為該位二進制碼后的值(最左邊一位依然不變)。
module gray_to_bin( gray_in, bin_out ); parameter data_width = 4; input [data_width-1:0] gray_in; output [data_width-1:0] bin_out; reg [data_width-1:0] bin_out; always @(gray_in) begin bin_out[3] = gray_in[3]; bin_out[2] = gray_in[2]^bin_out[3]; bin_out[1] = gray_in[1]^bin_out[2]; bin_out[0] = gray_in[0]^bin_out[1]; end endmodule
二進制轉格雷碼
首先給出二進制碼轉格雷碼的公式,如下所示(以下公式中二進制碼和格雷碼都是n位的):
1
|
g[n-1]=b[n-1], g[i]=b[i]^b[i+1], i=[0,1,...,n-2]
|
其運算過程的示意圖如圖1所示(這里以8位的數據位寬為例):
二進制碼轉格雷碼示意圖
從圖可以很輕易的看出,二進制碼右移1位后與本身異或,其結果就是格雷碼。
從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應格雷碼該位的值,最左邊一位不變。
module bin_to_gray( bin_in, gray_out ); parameter data_width = 4; input [data_width-1:0] bin_in; output [data_width-1:0] gray_out; assign gray_out = (bin_in >> 1) ^ bin_in; endmodule
格雷碼的應用場合:用於減小亞穩態發生的概率,用於異步FIFO的地址碼的轉化(現將二進制數轉換為格雷碼進行跨時鍾域的傳輸,然后在時鍾域跨出來以后,再將格雷碼轉換為二進制)
也就是說格雷碼可以進行跨時鍾域信號的處理(一共有三種方法:多打兩拍;異步雙口RAM;以及格雷碼(對於格雷碼,相鄰的兩個數間只有一個bit是不一樣的(格雷碼,在本文中不作詳細介紹),如果先將RAM的寫地址轉為格雷碼,然后再將寫地址的格雷碼進行打兩拍,之后再在RAM的讀時鍾域將格雷碼恢復成10進制。這種處理就相當於對單bit數據的跨時鍾域處理了。))