1.什么是格雷码?
格雷码的特点:相邻的两个数之间只有一位不同。这就是格雷码存在的意义。
2.二进制转换格雷码方法
方法一:递归法,我喊作:顺序逆序递归法
1. 1位格雷码有2个码字:0和1
2. (n+1)位格雷码中的前2^n(2的N次方)个字码等于n位格雷码的码字,按顺序书写,加前缀0.
3. (n+1)位格雷码中的后2^n(2的N次方)个字码等于n位格雷码的码字,但按逆序书写,加前缀1.
解释说明:
之所以称此方法为递归,是因为对于任意位的二进制的格雷码最终都将归结于1位二进制的格雷码的求解。上图就是根据已知的3bit二进制的格雷码,求4bit二进制的格雷码,此时的n为3,所以2^3=8,所以0-7 的格雷码为0+3bit格雷,8-15的格雷码为1+逆序3bit格雷码。
方法二:向左异或法
1. 对n位二进制或格雷码的码字,将数位从右到左,从0到n-1编码。
2. 如果二进制码字的第i位和第i+1位相同,则对应的格雷码码字的第i位为0,否则为1.
(当i+1=n,二进制码字的第n位被认为是0)
解释说明:
就那四位二进制数4'b0010举例,二进制第0位为0,第1位为1,异或结果为1,所以格雷码的第0位为1;二进制第1位为1,第2位为0,异或为1,所以格雷码的第1位为1;二进制第2位为0,第3位为0,异或为0,所以格雷码的第2位为0;二进制的第3位为0,二进制没有第4位,所以第4位默认为0,异或为0,所以格雷码第3位为0。。。结果4'b0010的格雷码为0011。
代码
module bin2gray(
input [7:0] b,
output [7:0] g
);
assign g=b^(b>>1);
endmodule
3、格雷码转换成二进制
格雷码转换为二进制码算法有以下几种表述形式:
方法一:
二进制格雷码为Gn-1Gn-2...G2G1G0
对应的自然二进制码为Bn-1Bn-2...B2B1B0
其中:最高位保留—Bn-1=Gn-1
其他各位—Bi-1=Gi-1 xor Bi ,i=1,2,...,n-1
方法二:
Bi = ˆG[n-1:i]=G[n-1]ˆG[n-2]ˆ..ˆG[i],i=0,1,...,n-1
方法三:
Bi = ˆ(G>>i),i=0,1,...,n-1
编程:
方法一:
module gray2bin (bin, gray);
parameter n = 4;
output reg [n-1:0] bin;
input [n-1:0] gray;
integer i;
always @ (gray)
begin
bin[n-1]=gray[n-1];
for(i=n-1;i>0;i=i-1)
bin[i-1]=gray[i-1] ^ bin[i];
end
endmodule
方法二:
module gray2bin (bin, gray);
parameter SIZE = 4;
output [SIZE-1:0] bin;
input [SIZE-1:0] gray;
genvar i;
generate
for (i=0; i