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

仿真波形:

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

相关推荐
北京青翼科技5 小时前
【PCIE044】基于复旦微 JFM7VX690T 的全国产化 FPGA 开发套件
图像处理·人工智能·fpga开发·信号处理·智能硬件
崇子嵘6 小时前
复杂可乐机(野火升腾拓展)
fpga开发
HAPPY酷6 小时前
DDR 压测与系统验证知识全集
arm开发·驱动开发·fpga开发·硬件架构·硬件工程·dsp开发·基带工程
Aaron15886 小时前
基于FPGA实现卷积方法比较分析
arm开发·算法·fpga开发·硬件架构·硬件工程·射频工程·基带工程
Terasic友晶科技8 小时前
DE10-Nano的HDMI方块移动案例——显示器时序(DMT)标准介绍
fpga开发·计算机外设·hdmi·显示器时序·dmt
search78 小时前
芯片-IP集成
fpga开发
9527华安9 小时前
紫光同创FPGA实现 TCP/IP 协议栈,千兆网服务器版本,提供5套工程源码和技术支持
服务器·tcp/ip·fpga开发
Terasic友晶科技9 小时前
【答疑解惑】如何临时解决带Nios II的FPGA设计在测试时遇到time_limited文件导致elf下载不了的问题
fpga开发·nios ii·quartus lite·opencore plus·time_limited
FPGA_小田老师9 小时前
AXI_DMA IP核实战:24路并行数据高速存储方案
fpga开发·axi_dma·adc采样并行数据存储·高速并行数据存储
崇子嵘9 小时前
为什么需要“输出锁存”
fpga开发