一、交換兩個整數(shù)的值而不必用第三個參數(shù) 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中的每一位按位逐一進(jìn)行異或,例如a=4'b1010,則b=1^0^1^0=0,由此可以判斷a中為1的位數(shù)是奇數(shù)還是偶數(shù),是一個便捷的操作。 三、格雷碼(Gray code) 格雷碼(Gray code)是由貝爾實驗室的Frank Gray在1940年提出,用于在PCM(Pusle Code Modulation)方法傳送訊號時防止出錯,并于1953年三月十七日取得美國專利。格雷碼是一個數(shù)列集合,相鄰兩數(shù)間只有一個位元改變,為無權(quán)數(shù)碼,且格雷碼的順序不是唯一的。 直接排列 以二進(jìn)制為0值的格雷碼為第零項,第一項改變最右邊的位元,第二項改變右起第一個為1的位元的左邊位元,第三、四項方法同第一、二項,如此反覆,即可排列出n個位元的格雷碼。 1、自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼 自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼,其法則是保留自然二進(jìn)制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進(jìn)制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似。

2、二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼 二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼,其法則是保留格雷碼的最高位作為自然二進(jìn)制碼的最高位,而次高位自然二進(jìn)制碼為高位自然二進(jìn)制碼與次高位格雷碼相異或,而自然二進(jìn)制碼的其余各位與次高位自然二進(jìn)制碼的求法相類似。
 二進(jìn)制數(shù)轉(zhuǎn)格雷碼 (假設(shè)以二進(jìn)制為0的值做為格雷碼的0) 格雷碼第n位 = 二進(jìn)制碼第(n+1)位+二進(jìn)制碼第n位。不必理會進(jìn)制。
Verilog 代碼:gray=(binary>>1)^binary; 格雷碼轉(zhuǎn)二進(jìn)制數(shù) 二進(jìn)制碼第n位 = 二進(jìn)制碼第(n+1)位+格雷碼第n位。因為二進(jìn)制碼和格雷碼皆有相同位數(shù),所以二進(jìn)制碼可從最高位的左邊位元取0,以進(jìn)行計算。
verilog 代碼://------假設(shè) 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 四、奇數(shù)分頻 奇數(shù)分頻電路: 奇數(shù)分頻電路常用的是錯位“異或”法的原理。如進(jìn)行三分頻,通過待分頻時鐘的上升沿觸發(fā)計數(shù)器進(jìn)行模三技術(shù),當(dāng)計數(shù)器計數(shù)到鄰近值進(jìn)行兩次翻轉(zhuǎn)。比如計數(shù)器在計數(shù)到1時,輸出時鐘進(jìn)行翻轉(zhuǎn),計數(shù)到2時再進(jìn)行翻轉(zhuǎn),即在鄰近的1和2時刻進(jìn)行兩次翻轉(zhuǎn)。這樣實現(xiàn)的三分頻占空比為1/3或2/3.如果要實現(xiàn)占空比為50%的三分頻時鐘,可通過待分頻的時鐘上升沿觸發(fā)計數(shù)器和下降沿觸發(fā)計數(shù)器進(jìn)行三分頻,然后將上升沿和下降沿產(chǎn)生的三分頻時鐘進(jìn)行相或預(yù)算,即可得到占空比為50%的三分頻時鐘。 錯位“異或”法推廣: 對于實現(xiàn)占空比為50%的N倍奇數(shù)分頻,首先進(jìn)行上升沿觸發(fā)的模N計數(shù),計數(shù)到某一選定值時,進(jìn)行輸出時鐘翻轉(zhuǎn),然后進(jìn)過(N-1)/2再次進(jìn)行翻轉(zhuǎn)得到一個占空比非50%的技術(shù)分頻時鐘。再者同時進(jìn)行下降沿觸發(fā)的模N計數(shù),到和上升沿觸發(fā)輸出時鐘翻轉(zhuǎn)選定值相同時,進(jìn)行輸出時鐘翻轉(zhuǎn),同樣經(jīng)過(n-1)/2時,輸出時鐘再次翻轉(zhuǎn)生成占空比非50%的奇數(shù)N分頻時鐘。兩個占空比非50%的時鐘相或運算,得到占空比為50%的奇數(shù)N分頻時鐘。 |