原创 Gray code原理

2011-3-23 10:18 1547 6 6 分类: 工程师职场

在红外线技术中使用的0.85或者0.95微米波段的谩射传输,它允许有两种速率:1M和2M速率,在1M速率上,采用的是格雷编码:它的编码原理是每四位一组,每个组被编码成一个16位的码字,任意两个相临位只有一个二进制数不同,它和奇偶校验码都属于可靠性编码.

    格雷码(Gray code)是由贝尔实验室的Frank Gray在1940年提出,用于在PCM(Pusle Code Modulation)方法传送讯号时防止出错,并于1953年三月十七日取得美国专利。格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一的。

直接排列

    以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。

    二进制数转格雷码

(假设以二进制为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= ^(gray>>i)//gray移位后,自身按位异或

^(gray>>i)//第一次看到这样的用法,特意查了下verilog语法

 Verilog 的位运算语法:

  位逻辑运算符

在Verilog语言中有7种位逻辑运算符:

1           ~   (非)

2           &   (与)

3           |   (或)

4           ^   (异或)

5           ^~  (同或)

6           ~&  (与非)

7           ~|  (或非)

位逻辑运算符对其自变量的每一位进行操作,例如,表达式A & B的结果是A和B的对应位相与的值。对具有不定值的位进行操作,视情况而定会得到不同的结果。例如:x和FALSE相与得结果x,x和TRUE相或得结果TURE。如果操作数的长度不相等,较短的操作数将用0来补位,逐位运算将返回一个与两个操作数中位宽较大的一个等宽的值。

在此需要注意的是,不要将逻辑运算符和位运算符相混淆,比如,!是逻辑非,而~是位操作的非,即按位取反,例如:对于前者!(5 = = 6)结果是TRUE,后者对位进行操作,~{1,0,1,1} = 0100。

 

 一元约简运算符

  约简运算符是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。位运算是对操作数的相应位进行与、或、非运算,操作数是几位数则运算结果也是几位数。而约简运算则不同,约简运算是对单个操作数进行与、或、非递推运算,最后的运算结果是1位的二进制数。约简运算的具体运算过程是:1°先将操作数的第1位与第2位进行与、或、非运算;2°将运算结果与第3位进行与、或、非运算,依次类推,直至最后一位。

  例如:

      reg [3:0]  B;

      reg  C;

      C = &B;

  相当于:

      C = ( (B[0]&B[1]) & B[2] ) & B[3];

  一完整的模块举例如下:

  module reduction(a, out1, out2, out3, out4, out5, out6);

      input [3:0] a;

      output out1, out2, out3, out4, out5, out6;

      reg out1, out2, out3, out4, out5, out6;

     

    always @ (a)

    begin

      out1 = & a;     //与约简运算

      out2 = | a;         //或约简运算

      out3 = ~& a;        //与非约简运算

      out4 = ~| a;        //或非约简运算

      out5 = ^ a;     //异或约简运算

      out6 = ~^ a;        //同或约简运算

    end

 

  endmodule

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条