gray code(格雷码)

//3bits binary to gray code
//-----binary-------to--------gray------
//------000------------------- 000------
//------001--------------------001------
//------010--------------------011------
//------011--------------------010------
//------100--------------------110------
//------101------------------- 111------
//------110--------------------101------
//------111--------------------100------

module bin2gry(
input [2:0]      bin,
input            clk,
input            rstn,
output reg [2:0] gry
);

always@(posedge clk or negedge rstn)begin
  if(!rstn)
    gry[2:0] <= 3'b0;
  else begin
   //gry[i] <= bin[i]^bin[i+1];
    gry[2] <= bin[2];
    gry[1] <= bin[1]^bin[2];
    gry[0] <= gry[0]^bin[1];
  end
end



endmodule


//3bits gray to binary
//000   --->      000
//001   --->      001
//011   --->      010
//010   --->      011
//110   --->      100
//111   --->      101
//101   --->      110
//100   --->      111

module gry2bin(
         input clk,
         input rstn,
         input [2:0] gry,
         output reg [2:0] bin
              );

always@(posedge clk or negedge rst)begin
   if(!rstn)
     bin[2:0] <= 3'b0;
   else begin
     bin[2] <= gry[2];
     bin[1] <= bin[2]^ gry[1];
     bin[0] <= bin[1]^ gry[0];
   end
end
endmodule

      在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。格雷码有多种编码形式。

1.特点

    1.1 相邻码只有一位二进制不同。镜像对称 ,可靠性高。相邻码不会有多bit变化,否则数字电路中可能产生不必要的脉冲或者状态(若状态机编码)。

    1.2 最大数与最小数之间也仅有一位数不同。循环码 ,卡诺图有关联。

    1.3绝对编码方式

    1.4变权码

    1.5绝对编码方式的准权码

    1.6格雷码的十进制数奇偶性与其码字中1的个数的奇偶性相同。 

2.格雷码表

3.转行方法(b2g/g2b)


觉得GRAY CODE 最主要的:

 1.相邻状态跳转有且只有一位翻转。

 2.binary2gray 和gray2binary 的code实现。

原文地址:https://www.cnblogs.com/chip/p/5084418.html