用硬件(Verilog)實現二進制碼和格雷碼的轉換

     格雷碼(Gray code)是1880年由法國工程師Jean-Maurice-Emlle Baudot發明的一種編碼,是一種絕對編碼方式,典型格雷碼是一種具備反射特性和循環特性的單步自補碼,它的循環、單步特性消除了隨機取數時出現重大偏差的可能,它的反射、自補特性使得求反很是方便。格雷碼屬於可靠性編碼,是一種錯誤最小化的編碼方式,由於,雖然天然二進制碼能夠直接由數/模轉換器轉換成模擬信號,但在某些狀況,例如從十進制的3轉換爲4時二進制碼的每一位都要變,能使數字電路產生很大的尖峯電流脈衝。而格雷碼則沒有這一缺點,它在相鄰位間轉換時,只有一位產生變化。它大大地減小了由一個狀態到下一個狀態時邏輯的混淆。因爲這種編碼相鄰的兩個碼組之間只有一位不一樣,引發數字量發生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的狀況相比更爲可靠,便可減小出錯的可能性。編碼

     格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,爲無權數碼,且格雷碼的順序不是惟一 的。
     格雷碼的構造方法爲:直接排列以二進制爲0值的格雷碼爲第零項,第一項改變最右邊的位元,第二項改變右起第一個爲1的位元的左邊位元,第3、四項方法同第1、二項,如此反覆,便可排列出n個位元的格雷碼。
spa

     下面主要談談格雷碼和天然二進制碼之間的轉換方法。3d

    1)天然二進制碼轉換爲格雷碼的方法code

        天然二進制碼轉換成二進制格雷碼,其法則是保留天然二進制碼的最高位做爲格雷碼的最高位,而次高位格雷碼爲二進制碼的高位與次高    位相異或,而格雷碼其他各位與次高位的求法相相似。      blog

    原理: 若二進制碼錶示爲: B[N-1]B[N-2]...B[2]B[1]B[0];
         相應地, 則二進制格雷碼錶示爲: G[N-1]G[N-2]...G[2]G[1]G[0].
         其中最高位保留: G[N-1] = B[N-1];
         其餘各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, ..., n-2)
    圖示以下:

       

 

            bin[3]    bin[2]     bin[1]      bin[0]          ---二進制值 : 二進制get

         +     0     bin[3]     bin[2]      bin[1]          ---右移值(二進制)input


          gray[3]  gray[2]    gray[1]    gray[0]      ---對應的格雷碼值class

總結:格雷碼的值只須要在原來的二進制的基礎上右移一位再加上原來的二進制值便可獲得。基礎

 

 

其實現代碼以下:module

module bin2gry(Gry,Bin);
parameter length = 8;     //以八位示例
output [length-1:0] Gry;
input [length-1:0] Bin;

reg [length-1:0] Gry;
integer i;

always @ (Bin)
begin
    for(i=0;i<length-1;i=i+1)
        Gry[i]=Bin[i]^Bin[i+1];
    Gry[i]=Bin[i];
end

/*另外一種簡單的實現方法以下:*/
// assign Gray = (Bin >> 1) ^ Bin;
endmodule

 
仿真波形

圖1. length ="3"

點擊看大圖

 

圖2. length ="4"

 

    2)格雷碼轉換爲二進制碼的實現方法

         二進制格雷碼轉換成天然二進制碼,其法則是保留格雷碼的最高位做爲天然二進制碼的最高位,而次高位天然二進制碼爲高位天然二進制       碼與次高位格雷碼相異或,而天然二進制碼的其他各位與次高位天然二進制碼的求法相相似。      

    原理: 若二進制格雷碼錶示爲: G[N-1]G[N-2]...G[2]G[1]G[0];
         相應地, 則二進制碼錶示爲: B[N-1]B[N-2]...B[2]B[1]B[0].
         其中最高位保留: B[N-1] = G[N-1];
         其餘各位: B[i-1] = G[i-1] xor B[i]. (i = 1, 2, ..., n-1)
    圖示以下:
  
 用代碼實現以下:
module gry2bin(Gry,Bin);
parameter length = 8; 
input [length-1:0] Gry; 
output [length-1:0] Bin; 

reg [length-1:0] Bin; 
integer i;
always @ (Gry)
begin    
    Bin[length-1]=Gry[length-1];    
    for(i=length-2;i>=0;i=i-1)        
        Bin[i]=Bin[i+1]^Gry[i];
end
endmodule
 
仿真波形
 

圖3. length="3"
 

 

點擊看大圖

 

圖4. length="4"
相關文章
相關標籤/搜索