crazybird

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

1
阅读(6514)

    今天,之所以想介绍二进制码与格雷码互转换的目的是为介绍异步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