格雷碼與二進位製碼的轉換

2022-09-04 11:12:12 字數 3210 閱讀 5158

gray code是2023年由法國工程師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;

#5 binary=4'b0001;

#10 binary=4'b0010;

#15 binary=4'b0011;

#20 binary=4'b0100;

#25 binary=4'b0101;

#30 binary=4'b0110;

#35 binary=4'b0111;

#40 binary=4'b1000;

#45 binary=4'b1001;

#50 binary=4'b1010;

#55 binary=4'b1011;

#60 binary=4'b1100;

#65 binary=4'b1101;

#70 binary=4'b1110;

#75 binary=4'b1111;

#80 binary=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;

#5 gray=4'b0001;

#10 gray=4'b0011;

#15 gray=4'b0010;

#20 gray=4'b0110;

#25 gray=4'b0111;

#30 gray=4'b0101;

#35 gray=4'b0100;

#40 gray=4'b1100;

#45 gray=4'b1101;

#50 gray=4'b1111;

#55 gray=4'b1110;

#60 gray=4'b1010;

#65 gray=4'b1011;

#70 gray=4'b1001;

#75 gray=4'b1000;

#80 gray=4'b1000;

#90 $stop;

end

bin_gray bin_gray1(.gray(gray),.binary(binary));

endmodule

格雷碼二進位制轉換

在結構光編碼方法中,有一種格雷碼編碼方法 與二進位制編碼方法相比,格雷碼編碼方法能夠更好的乙隻雜訊干擾,方便糾錯。用格雷碼對三維測量空間進行編碼,在解碼時需要將格雷碼在此轉換成二進位制,方便計算。實現 如下 unsigned binarytogray unsigned num 將二進位制值右移一位,...

格雷碼與二進位制的轉換

格雷碼,又叫迴圈二進位製碼或反射二進位製碼,格雷碼是我們在工程中常會遇到的一種編碼方式,它的基本的特點就是任意兩個相鄰的 只有一位二進位制數不同,這點在下面會詳細講解到。格雷碼的基本特點就是任意兩個相鄰的 只有一位二進位制數不同,這點很重要。常用的二進位制數與格雷碼間的轉換關係如下表 1 二進位製碼...

Gray碼 格雷碼 二進位制

以下內容是看了matrix67的關於二進位制的blog link 的一點總結與摘錄。gray碼,中文 格雷碼 是一種特殊的編碼,相鄰兩個格雷碼的二進位制表示中有且僅有一位不同,且 n 階 gray 碼是 0 2 n 1 的乙個排列。n 階 gray 碼可以由 n 1 階 gray 碼映象翻轉之後最前...