標籤:
Gray Code是1880年由法國工程師Jean-Maurice-Emlle Baudot發明的一種編碼,是一種絕對編碼方式,典型格雷碼是一種具有反射特性和迴圈特性的單步自補碼,它的迴圈、單步特性消除了隨機取數時出現重大誤差的可能,它的反射、自補特性使得求反非常方便。格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式,因為,雖然自然二進位碼可以直接由數/模轉換器轉換成類比訊號,但在某些情況,例如從十進位的3轉換為4時二進位碼的每一位都要變,能使數字電路產生很大的尖峰電流脈衝。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減少了由一個狀態到下一個狀態時邏輯的混淆。由於這種編碼相鄰的兩個碼組之間只有一位不同,因而在用於風向的轉角位移量-數字量的轉換中,當風向的轉角位移量發生微小變化(而可能引起數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。
但格雷碼不是權重碼,每一位碼沒有確定的大小,不能直接進行比較大小和算術運算,也不能直接轉換成液位訊號,要經過一次碼變換,變成自然二進位碼,再由上位機讀取。解碼的方法是用‘0’和採集來的4位格雷碼的最高位(第4位)異或,結果保留到4位,再將異或的值和下一位(第3位)相異或,結果保留到3位,再將相異或的值和下一位(第2位)異或,結果保留到2位,依次異或,直到最低位,依次異或轉換後的值(位元)就是格雷碼轉換後自然碼的值.
異或:異或則是按位“異或”,相同為“0”,相異為“1”。
一般的,普通二進位碼與格雷碼可以按以下方法互相轉換:
二進位碼->格雷碼(編碼):從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應格雷碼該位的值,最左邊一位不變(相當於左邊是0);
格雷碼-〉二進位碼(解碼):從左邊第二位起,將每位與左邊一位解碼後的值異或,作為該位解碼後的值(最左邊一位依然不變).
數學(電腦)描述:
原碼:p[0~n];格雷碼:c[0~n](n∈N);編碼:c=G(p);解碼:p=F(c);書寫時從左向右標號依次減小.
編碼:c=p XOR p[i+1](i∈N,0≤i≤n-1),c[n]=p[n];
解碼:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).
四位二進位碼和格雷碼互轉程式
module bin_gray (Binary,Gray);//4bit Binary code to Gray code
input [3:0] Binary;
output [3:0] Gray;
reg [3:0] data_reg;
always @(Binary)
begin
data_reg[3]=Binary[3];
data_reg[2]=Binary[3]^Binary[2];
data_reg[1]=Binary[2]^Binary[1];
data_reg[0]=Binary[1]^Binary[0];
end
assign Gray=data_reg;
endmodule
測試代碼
`timescale 1ns / 1ps
module bin_gray_tb;
reg [3:0] Binary;
wire [3:0] Gray;
initial
begin
Binary=0;
#5Binary=4‘b0001;
#10Binary=4‘b0010;
#15Binary=4‘b0011;
#20Binary=4‘b0100;
#25Binary=4‘b0101;
#30Binary=4‘b0110;
#35Binary=4‘b0111;
#40Binary=4‘b1000;
#45Binary=4‘b1001;
#50Binary=4‘b1010;
#55Binary=4‘b1011;
#60Binary=4‘b1100;
#65Binary=4‘b1101;
#70Binary=4‘b1110;
#75Binary=4‘b1111;
#80Binary=4‘b1111;
#90 $stop;
end
bin_gray bin_gray1(.Binary(Binary),.Gray(Gray));
四位格雷碼和二進位碼轉換
module gray_bin (Gray,Binary);//4bit Gray code to Binary code
input [3:0] Gray;
output [3:0] Binary;
reg [3:0] data_reg;
always @(Gray)
begin
data_reg[3]=Gray[3];
data_reg[2]=Gray[2]^data_reg[3];
data_reg[1]=Gray[1]^data_reg[2];
data_reg[0]=Gray[0]^data_reg[1];
end
assign Binary=data_reg;
endmodule
測試代碼
`timescale 1ns / 1ps
module gray_bin_tb;
reg [3:0] Gray;
wire [3:0] Binary;
initial
begin
Gray=0;
#5Gray=4‘b0001;
#10Gray=4‘b0011;
#15Gray=4‘b0010;
#20Gray=4‘b0110;
#25Gray=4‘b0111;
#30Gray=4‘b0101;
#35Gray=4‘b0100;
#40Gray=4‘b1100;
#45Gray=4‘b1101;
#50Gray=4‘b1111;
#55Gray=4‘b1110;
#60Gray=4‘b1010;
#65Gray=4‘b1011;
#70Gray=4‘b1001;
#75Gray=4‘b1000;
#80Gray=4‘b1000;
#90 $stop;
end
bin_gray bin_gray1(.Gray(Gray),.Binary(Binary));
endmodule
格雷碼與二進位碼的轉換