异或^的几个应用(verilog)

转载 2016年08月31日 11:09:05
reference : 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 clkor 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分频时钟





















Verilog HDL运算符

一、逻辑运算符:&&:逻辑与; ||:逻辑或; !:逻辑非。 二、关系运算符:==:逻辑相等; !=:逻辑不等; ===:全等; !==:不全等。 "==="和"!=="可以比较含有x和z的操作数,在...
  • formerman
  • formerman
  • 2009年09月10日 22:19
  • 22078

verilog中的一些常用操作符

表1逻辑操作符 逻辑操作符 功能 A,B逻辑操作结果 C,D逻辑操作结果 C,E逻辑操作结果 ~ 逻辑取反 ...
  • yumao99
  • yumao99
  • 2017年06月14日 22:19
  • 733

verilog之赋值和逻辑操作符号

always @*   val = 0; end 是无法赋值的。因为只有敏感变量发生改变才会赋值 && || !这些都是逻辑操作符,用于逻辑连接,结果是true或者false; & | ...
  • richardhuang1123
  • richardhuang1123
  • 2011年12月01日 08:40
  • 2286

奇偶校验,异或校验,和校验,nios串口校验

1.                     奇偶校验 奇偶校验是检错中比较常见的一种方法。它利用数据中的1的个数作为检错的标志位,若1的个数为奇数个,则错误检测的标志位为1,若1的个数为偶数,则错...
  • xiao_yao_ke
  • xiao_yao_ke
  • 2017年04月11日 18:41
  • 1426

关于异或的一些东西和应用

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结...
  • rockpk008
  • rockpk008
  • 2015年11月22日 23:22
  • 1024

异或应用小总结

这里只总结我做过的几道异或的题,所以肯定不全面,日后再添加啦。 1.交换 交换a和b的简单写法 {CSDN:CODE:1862687}...
  • hulamua
  • hulamua
  • 2016年09月02日 10:14
  • 789

异或^的几个应用(verilog)

reference : http://www.cnblogs.com/danh/archive/2010/12/24/1915810.html  (博客有参考价值) 一、交换两个整数的值而不...
  • limanjihe
  • limanjihe
  • 2016年08月31日 11:09
  • 4085

初学verilog必看

原文链接:http://www.cnblogs.com/capark/p/4121369.html先记下来: 1、不使用初始化语句; 2、不使用延时语句; 3、不使用循环次数不确定的语句,如:f...
  • u010712012
  • u010712012
  • 2017年08月30日 10:56
  • 6452

verilog 实现加法器

verilog 实现加法器 (1)半加器的实现 原理:半加器是由两个一位输入实现的,与全加器的区别是不带进位加,相对比较简单,其逻辑关系为:  进位输出:Ci+1=Ai*Bi  和输出:Si = Ai...
  • w40306030072
  • w40306030072
  • 2014年03月07日 12:06
  • 5435

VHDL保留字(Reserved Words)

VHDL保留字(Reserved Words) abs  取绝对值 case 分支语句 generate 生成 map 映射 ...
  • QQ604666459
  • QQ604666459
  • 2017年02月24日 16:32
  • 670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异或^的几个应用(verilog)
举报原因:
原因补充:

(最多只允许输入30个字)