一、二进制码转格雷码
首先给出二进制码转格雷码的公式,如下所示(以下公式中二进制码和格雷码都是n位的):
g[n-1]=b[n-1],g[i]=b[i]^b[i+1],i=[0,1,...,n-2]
其运算过程的示意图如图1所示(这里以8位的数据位宽为例):
图1 二进制码转格雷码示意图
从图1可以很轻易的看出,二进制码右移1位后与本身异或,其结果就是格雷码。Verilog HDL实现过程如下所示:
/**---------------------------------文件信息----------------------------------------
**文件名:bin2gray.v
**创建者:CrazyBird
**创建日期:2016-1-14
**版本号:v1.0
**功能描述:二进制码转格雷码
**
***********************************************************************************/
//synopsystranslate_off
`timescale1ns/1ps
//synopsystranslate_on
modulebin2gray
#(
parameterC_DATA_WIDTH=8
)
(
input[C_DATA_WIDTH-1:0]bin,
output[C_DATA_WIDTH-1:0]gray
);
//------------------------------------
assigngray={1'b0,bin[C_DATA_WIDTH-1:1]}^bin;
endmodule
二、格雷码转二进制码
格雷码转二进制码的公式,如下所示:
b[n-1]=g[n-1],b[i]=gray[i]^b[i+1],i=[0,1,...,n-2]
其运算过程的示意图如图2所示(这里以8位的数据位宽为例):
图2 格雷码转二进制码示意图
从图2可以看出,除格雷码的最高位直接赋给二进制码的最高位外,其他二进制码位等对应格雷码位与其高位格雷码位异或的结果,因此可归纳出一表达式,如下所示(其中“^”表示变量各位异或):
for(i=0;i<n-1;i++)
b[i]=^(gray>>i);
对应的Verilog HDL设计如下所示:
/**---------------------------------文件信息----------------------------------------
**文件名:gray2bin.v
**创建者:CrazyBird
**创建日期:2016-1-14
**版本号:v1.0
**功能描述:格雷码转二进制码
**
***********************************************************************************/
//synopsystranslate_off
`timescale1ns/1ps
//synopsystranslate_on
modulegray2bin
#(
parameterC_DATA_WIDTH=8
)
(
input[C_DATA_WIDTH-1:0]gray,
output[C_DATA_WIDTH-1:0]bin
);
//------------------------------------
genvari;
generate
for(i=0;i<C_DATA_WIDTH;i=i+1)
begin:gray_to_bin
assignbin[i]=^(gray>>i);
end
endgenerate
endmodule