FPGA——verilog实现格雷码与二进制的转换

文章目录

一、格雷码简介

格雷码是一种循环二进制码或者叫作反射二进制码。跨时钟域会产生亚稳态问题(CDC问题):从时钟域A过来的信号难以满足时钟域B中触发器的建立时间和保持时间,输入与clk的变化不同步而导致了亚稳态。此时触发器输出端Q在有效时钟沿之后比较长的一段时间处于不确定的状态,在这段时间里Q端在0和1之间处于振荡状态,而不是等于数据输入端D的值。而格雷码的每次变化位数只有一位,因此使用格雷码可以有效避免这种情况。所以格雷码常用于通信,FIFO 或者 RAM 地址寻址计数器中。

下面是典型的格雷码与二进制的转换:

二、二进制转格雷码

二进制转格雷码的原理:

二进制的最高位作为格雷码的最高位,次高位的格雷码为二进制的高位和次高位相异或得到,其他位与次高位类似。

代码实现:

c 复制代码
module bin_gray #(parameter data_width = 'd4)(
    input   [data_width-1:0]    bin,

    output  [data_width-1:0]    gray
);
    
    assign  gray = (bin >> 1) ^ bin;//二进制转格雷码:二进制右移一位与二进制相异或

endmodule

三、格雷码转二进制

格雷码转二进制的原理:

使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷码相异或得到,其他位的值与次高位产生过程类似。

代码实现:

c 复制代码
module gray_bin #(parameter data_width = 'd4)(
    input   [data_width-1:0]    gray,

    output  [data_width-1:0]    bin
);

assign bin[data_width-1] = gray[data_width-1];//格雷码转二进制:最高位直接相等

genvar i;
generate    
    for(i=0;i<=data_width-2;i=i+1)begin:BLOCK1
        assign bin[i] = bin[i+1] ^ gray[i];     //次高位等于高位与格雷码次高位相异或
    end

endgenerate
    
endmodule

四、仿真

仿真代码:

c 复制代码
`timescale 1ns/1ns
module gray_code_tb ();
    parameter data_width = 'd4  ;
    
    reg     [data_width-1:0]    bin_in  ;
    wire    [data_width-1:0]    gray    ;
    wire    [data_width-1:0]    bin_out ;

    initial begin
        bin_in = 4'd0;
        repeat(20)begin
          #20 bin_in = bin_in + 1'd1;
        end
        $stop;
    end

    bin_gray #(.data_width (data_width))    u_bin_gray(
        .bin    (bin_in),
        
        .gray   (gray)
    );

    gray_bin #(.data_width (data_width))   u_gray_bin(
        .gray   (gray),

        .bin    (bin_out)
    );
endmodule

仿真波形:

通过波形可以看到二进制转格雷码再转二进制结果无误。

相关推荐
DS小龙哥7 小时前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
上理考研周导师16 小时前
第二章 虚拟仪器及其构成原理
fpga开发
FPGA技术实战18 小时前
《探索Zynq MPSoC》学习笔记(二)
fpga开发·mpsoc
bigbig猩猩1 天前
FPGA(现场可编程门阵列)的时序分析
fpga开发
Terasic友晶科技1 天前
第2篇 使用Intel FPGA Monitor Program创建基于ARM处理器的汇编或C语言工程<二>
fpga开发·汇编语言和c语言
码农阿豪1 天前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发·sd nand·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
江山如画,佳人北望1 天前
EDA技术简介
fpga开发
淘晶驰AK1 天前
电子设计竞赛准备经历分享
嵌入式硬件·fpga开发
最好有梦想~1 天前
FPGA时序分析和约束学习笔记(4、IO传输模型)
笔记·学习·fpga开发