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 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐5 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐5 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH6 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡6 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安6 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐7 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯7 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客7 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA7 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发