異或 ^ 的幾個作用

原文地址:http://www.cnblogs.com/danh/archive/2010/12/24/1915810.html

一、交換兩個整數的值而不必用第三個參數
a = 9;
b = 11;

a=a^b; 1001^1011=0010
b=b^a; 1011^0010=1001
a=a^b;  0010^1001=1011

a = 11;
b = 9;

二、奇偶判斷

^a操作就是將a中的每一位按位逐一進行異或,例如a=4'b1010,則b=1^0^1^0=0,由此可以判斷a中爲1的位數是奇數還是偶數,是一個便捷的操作。

三、格雷碼(Gray code)

    格雷碼(Gray code)是由貝爾實驗室的Frank Gray在1940年提出,用於在PCM(Pusle Code Modulation)方法傳送訊號時防止出錯,並於1953年三月十七日取得美國專利。格雷碼是一個數列集合,相鄰兩數間只有一個位元改變,爲無權數碼,且格雷碼的順序不是唯一的。
直接排列
    以二進制爲0值的格雷碼爲第零項,第一項改變最右邊的位元,第二項改變右起第一個爲1的位元的左邊位元,第三、四項方法同第一、二項,如此反覆,即可排列出n個位元的格雷碼。

1、自然二進制碼轉換成二進制格雷碼
  自然二進制碼轉換成二進制格雷碼,其法則是保留自然二進制碼的最高位作爲格雷碼的最高位,而次高位格雷碼爲二進制碼的高位與次高位相異或,而格雷碼其餘各位與次高位的求法相類似。



2、二進制格雷碼轉換成自然二進制碼
  二進制格雷碼轉換成自然二進制碼,其法則是保留格雷碼的最高位作爲自然二進制碼的最高位,而次高位自然二進制碼爲高位自然二進制碼與次高位格雷碼相異或,而自然二進制碼的其餘各位與次高位自然二進制碼的求法相類似。


    二進制數轉格雷碼
(假設以二進制爲0的值做爲格雷碼的0)
格雷碼第n位 = 二進制碼第(n+1)位+二進制碼第n位。不必理會進制。

     Verilog 代碼:gray=(binary>>1)^binary;

     格雷碼轉二進制數
二進制碼第n位 = 二進制碼第(n+1)位+格雷碼第n位。因爲二進制碼和格雷碼皆有相同位數,所以二進制碼可從最高位的左邊位元取0,以進行計算。
      verilog 代碼://------假設 reg [n-1] gray,binary;
             integer i;
             for(i=0;i<=n-1;i=i+1)
              binary[i]= ^(gray>>i)//gray移位後,自身按位異或
放一段代碼這,用於參考:
/*Logic to convert binary numbers into Gray coded binary numbers is implemented in the following Verilog Code.
*/
module binary2gray();
reg clk;
reg rstn;
reg [5:0] counter_binary, counter_binary_reg, counter_gray, counter_gray_reg;
integer count, file_wr;

/* Initial block to generate clock and reset */ 
initial  begin
    clk = 0; rstn = 0;  #100 rstn = 1;
    forever begin
        #10 clk = !clk; 
 end end    

/* Synchronous Logic for registering the data and incrementing the counter for binary data */
always @ (posedge clk or negedge rstn)
begin
    if (!rstn) begin
        counter_binary_reg <= 'b0;
        counter_gray_reg <= 'b0;  end
    else begin 
        counter_binary_reg <= counter_binary + 1;
        counter_gray_reg <= counter_gray;
        $display("binary number= 6'b%b : gray en-coded binary number = 6'b%b", counter_binary_reg, counter_gray_reg);   end end

/* Logic is to get Gray code from Binary code */
function[5:0] binary2gray ;
    input[5:0] value;
    integer i;
    begin 
        binary2gray[5] = value[5];
        for (i=5; i>0; i = i - 1)
            binary2gray[i-1] = value[i] ^ value[i - 1];
    end
endfunction

/* Get gray encoded output */
always @(*)
begin 
  counter_gray = counter_gray_reg;
  counter_binary = counter_binary_reg;
  counter_gray = binary2gray(counter_binary_reg); end
endmodule
 

四、奇數分頻

奇數分頻電路:

  奇數分頻電路常用的是錯位“異或”法的原理。如進行三分頻,通過待分頻時鐘的上升沿觸發計數器進行模三技術,當計數器計數到鄰近值進行兩次翻轉。比如計數器在計數到1時,輸出時鐘進行翻轉,計數到2時再進行翻轉,即在鄰近的1和2時刻進行兩次翻轉。這樣實現的三分頻佔空比爲1/3或2/3.如果要實現佔空比爲50%的三分頻時鐘,可通過待分頻的時鐘上升沿觸發計數器和下降沿觸發計數器進行三分頻,然後將上升沿和下降沿產生的三分頻時鐘進行相或預算,即可得到佔空比爲50%的三分頻時鐘。

      錯位“異或”法推廣:

  對於實現佔空比爲50%的N倍奇數分頻,首先進行上升沿觸發的模N計數,計數到某一選定值時,進行輸出時鐘翻轉,然後進過(N-1)/2再次進行翻轉得到一個佔空比非50%的技術分頻時鐘。再者同時進行下降沿觸發的模N計數,到和上升沿觸發輸出時鐘翻轉選定值相同時,進行輸出時鐘翻轉,同樣經過(n-1)/2時,輸出時鐘再次翻轉生成佔空比非50%的奇數N分頻時鐘。兩個佔空比非50%的時鐘相或運算,得到佔空比爲50%的奇數N分頻時鐘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章