格雷码与卡诺图顺序
一、格雷码编码规则
画卡诺图的时候需要先将所有变量可能以格雷码的形式排列在方格两侧,所有变量有2^n个,虽然我们常用的变量为四个及以下,可以熟记格雷码,但为了学习还是有必要了解格雷码的编码规则。格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这样在数字电路中变化时每次就只有一位发生变化,提高了电路的稳定性。
格雷码与二进制的转换
规则:
格雷码转二进制
格雷码转二进制码的公式,如下所示:
1
|
b[n-1]=g[n-1], b[i]=gray[i]^b[i+1], i=[0,1,...,n-2] |
其运算过程的示意图如图2所示(这里以8位的数据位宽为例):
格雷码转二进制码示意图
从图可以看出,除格雷码的最高位直接赋给二进制码的最高位外,其他二进制码位等对应格雷码位与其高位格雷码位异或的结果,因此可归纳出一表达式,如下所示(其中“^”表示变量各位异或):
1
2
|
for (i = 0; i < n-1; i++) b[i] = ^(gray >> i); |
观察上表可知,格雷码转二进制是从左边第二位起,将每位与左边一位二进制码的值异或,作为该位二进制码后的值(最左边一位依然不变)。
module gray_to_bin( gray_in, bin_out ); parameter data_width = 4; input [data_width-1:0] gray_in; output [data_width-1:0] bin_out; reg [data_width-1:0] bin_out; always @(gray_in) begin bin_out[3] = gray_in[3]; bin_out[2] = gray_in[2]^bin_out[3]; bin_out[1] = gray_in[1]^bin_out[2]; bin_out[0] = gray_in[0]^bin_out[1]; end endmodule
二进制转格雷码
首先给出二进制码转格雷码的公式,如下所示(以下公式中二进制码和格雷码都是n位的):
1
|
g[n-1]=b[n-1], g[i]=b[i]^b[i+1], i=[0,1,...,n-2] |
其运算过程的示意图如图1所示(这里以8位的数据位宽为例):
二进制码转格雷码示意图
从图可以很轻易的看出,二进制码右移1位后与本身异或,其结果就是格雷码。
从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变。
module bin_to_gray( bin_in, gray_out ); parameter data_width = 4; input [data_width-1:0] bin_in; output [data_width-1:0] gray_out; assign gray_out = (bin_in >> 1) ^ bin_in; endmodule
格雷码的应用场合:用于减小亚稳态发生的概率,用于异步FIFO的地址码的转化(现将二进制数转换为格雷码进行跨时钟域的传输,然后在时钟域跨出来以后,再将格雷码转换为二进制)
也就是说格雷码可以进行跨时钟域信号的处理(一共有三种方法:多打两拍;异步双口RAM;以及格雷码(对于格雷码,相邻的两个数间只有一个bit是不一样的(格雷码,在本文中不作详细介绍),如果先将RAM的写地址转为格雷码,然后再将写地址的格雷码进行打两拍,之后再在RAM的读时钟域将格雷码恢复成10进制。这种处理就相当于对单bit数据的跨时钟域处理了。))