打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
格雷码与二进制的相互转换 Verilog实现

格雷码与二进制的相互转换 Verilog实现

在红外线技术中使用的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[i]= ^(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

    一. 自然二进制码转换为二进制格雷码
原理:若二进制码表示为: 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) Binary_to_Gray.v / Verilog
module Binary_to_Gray (
  input       [N-1:0] B,
  output reg  [N-1:0] G
);
 
parameter N = N_bit_Binary; // 设置自然二进制码的位宽 integer i; always @ (B)
begin
  G[N-1] = B[N-1];
  for (i=0; i<N-1; i="i"+1)
    G[i] = B[i+1] ^ B[i];
end endmodule图2. N="4" 二. 二进制格雷码转换为自然二进制码
原理:若二进制格雷码表示为: 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) Gray_to_Binary.v / Verilog
module Gray_to_Binary (
  input       [N-1:0] G,
  output reg  [N-1:0] B
); parameter N = B_bit_Gray; // 设置二进制格雷码的位宽 integer i; always @ (G)
begin
  B[N-1] = G[N-1];
  for (i=1; i<=N-1; i="i"+1)
    B[i-1] = G[i-1] ^ B[i];
end
 
endmodule
 仿真波形

图3. N="3" 
图4. N="4" 四. 其他本文可作为Verilog的for循环的学习实例
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
二进制格雷码与自然二进制码的互换.(Verilog)
异或 ^ 的几个作用
[基础语法]-第004节:运算符
位运算符
8位数据的奇偶校验verilog程序
同步FIFO和异步FIFO原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服