我是靠谱客的博主 粗暴柠檬,最近开发中收集的这篇文章主要介绍格雷码与二进制之间的转换一、格雷码简介  二、转换规律 三、代码实现总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一、格雷码简介

 二、转换规律

      1、二进制转格雷码

      2、格雷码转二进制码

 三、代码实现

总结


一、格雷码简介

      格雷码(Binary Gray Code),是指在一组数的编码中,任意两个相邻的代码只有一位二进制数不同,这使得它在递增或递减的过程中,每次只变化一位。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲,而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化,它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。但是相对于二进制计数,它也有它的不足,那就是循环技术深度必须是2的N次幂,否则就失去了每位只变化一位的特性。下边给出了深度为16的二进制及格雷码递变表

     Binary      Gray
      0000       0000
      0001       0001
      0010       0011
      0011       0010
      0100       0110
      0101       0111
      0110       0101
      0111       0100
      1000       1100
      1001       1101
      1010       1111
      1011       1110
      1100       1010
      1101       1011
      1110       1001
      1111       1000


 二、转换规律

      1、二进制转格雷码

        观察上式给出的16组二进制与格雷码的转换表,可以得到以下规律:格雷码的最高位等于二进制码的最高位,格雷码的次高位等于二进制码的最高位与次高位的异或,依次类推得到以下公式:若二进制码的最高位为b[n-1],最低位为b[0],格雷码码的最高位为g[n-1],最低位为g[0],则g[n-1]=b[n-1],g[n-2]=b[n-1]^b[n-2];g[n-3]=b[n-2]^b[n-3]……g[0]=b[1]^b[0];

       综上所述,将二进制码整体右移一位,然后再与二进制码本身进行异或,得到该二进制码对应的格雷码。对应公式:g[n-1:0]=(b[n-1:0]>>1)^b[n-1:0];

      2、格雷码转二进制码

        同理对于格雷码转换二进制可以得到以下规律:二进制码的最高位同样等于格雷码的最高位,二进制码的次高位等于格雷码的次高位异或二进制码的最高位,以此类推得到以下公式,即b[n-1] = g[n-1],b[n-2] = g[n-2]^b[n-1]……b[0]=g[0]^b[1];

 三、代码实现

module transform_b_g
#(
     parameter    N = 8
)
(
   input       [N-1:0]b      ,//输入二进制
   output      [N-1:0]g      ,//输出对应的格雷码
   output      [N-1:0]bx      //将转换后的格雷码再转化成二进制
);

wire         true;//判断转换是否正确

assign g = (b>>1)^b;

assign bx[N-1]   =  g[N-1];
//assign reg1      =  (g<<1)^bx; 
//assign bx[N-2:0] =  reg1[N-1:0];
generate 
    genvar i;   
      for(i = N-2;i>=0;i=i-1)begin 
          assign bx[i]   =  bx[i+1]^g[i];
      end 
endgenerate

assign  true = (b==bx)?1'b1:1'b0;


endmodule 


下面给出仿真的tb测试代码:

`timescale 1ns/1ns
module tb_g();
reg       [7:0]  bin;
reg              clk;
wire      [7:0]  gray;
wire      [7:0]  bx ;
parameter   M = 8;
initial begin
   clk <= 1'b0;
   bin <= 8'd0;
end 
always #50 clk <= ~clk;
always@(posedge clk)
   bin <= bin + 1'b1 ; 

transform_b_g
#(
  .N(M)
)
u_transform_b_g
(
 .b(bin)      ,
 .g(gray)     ,
 .bx(bx) 
);


endmodule 

下图给出仿真结果:

 可以发现二进制与格雷码之间转换正确

总结

初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!

最后

以上就是粗暴柠檬为你收集整理的格雷码与二进制之间的转换一、格雷码简介  二、转换规律 三、代码实现总结的全部内容,希望文章能够帮你解决格雷码与二进制之间的转换一、格雷码简介  二、转换规律 三、代码实现总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部