crazybird

【原创】二进制码转格雷码互转换的FPGA设计

1
阅读(5687)

今天,之所以想介绍二进制码与格雷码互转换的目的是为介绍异步FIFO作铺垫的。接下来,我们一起了解它们之间是如何转换的以及用Verilog HDL进行设计。

一、二进制码转格雷码

首先给出二进制码转格雷码的公式,如下所示(以下公式中二进制码和格雷码都是n位的):

g[n-1]=b[n-1], g[i]=b[i]^b[i+1], i=[0,1,...,n-2]

其运算过程的示意图如图1所示(这里以8位的数据位宽为例):

二进制码转格雷码.jpg

图1 二进制码转格雷码示意图

从图1可以很轻易的看出,二进制码右移1位后与本身异或,其结果就是格雷码。Verilog HDL实现过程如下所示:

/**********************************版权申明**************************************** ** 电子技术应用网站, CrazyBird ** http://www.chinaaet.com, http://blog.chinaaet.com/crazybird ** **---------------------------------文件信息---------------------------------------- ** 文件名: bin2gray.v ** 创建者: CrazyBird ** 创建日期: 2016-1-14 ** 版本号: v1.0 ** 功能描述: 二进制码转格雷码 ** ***********************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module bin2gray #( parameter C_DATA_WIDTH = 8 ) ( input [C_DATA_WIDTH-1:0] bin, output [C_DATA_WIDTH-1:0] gray ); //------------------------------------ assign gray = {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位的数据位宽为例):

格雷码转二进制码.jpg

图2 格雷码转二进制码示意图

从图2可以看出,除格雷码的最高位直接赋给二进制码的最高位外,其他二进制码位等对应格雷码位与其高位格雷码位异或的结果,因此可归纳出一表达式,如下所示(其中“^”表示变量各位异或):

for(i = 0; i < n-1; i++) b[i] = ^(gray >> i);

对应的Verilog HDL设计如下所示:

/**********************************版权申明**************************************** ** 电子技术应用网站, CrazyBird ** http://www.chinaaet.com, http://blog.chinaaet.com/crazybird ** **---------------------------------文件信息---------------------------------------- ** 文件名: gray2bin.v ** 创建者: CrazyBird ** 创建日期: 2016-1-14 ** 版本号: v1.0 ** 功能描述: 格雷码转二进制码 ** ***********************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module gray2bin #( parameter C_DATA_WIDTH = 8 ) ( input [C_DATA_WIDTH-1:0] gray, output [C_DATA_WIDTH-1:0] bin ); //------------------------------------ genvar i; generate for(i = 0; i < C_DATA_WIDTH; i = i+1) begin : gray_to_bin assign bin[i] = ^(gray >> i); end endgenerate endmodule




Baidu
map