生成格雷码

以下是Verilog实现格雷码的两种常见方法:

1. 二进制转格雷码(组合逻辑实现)

verilog 复制代码
module binary_to_gray #(
    parameter N = 4 // 默认4位位宽
)(
    input  [N-1:0] binary, // 二进制输入
    output [N-1:0] gray    // 格雷码输出
);
    assign gray = binary ^ (binary >> 1); // 转换公式
endmodule

原理

格雷码的最高位与二进制相同,其余各位为二进制对应位与其高一位的异或(G[i] = B[i] ^ B[i+1])。

2. 格雷码计数器(时序逻辑实现)

verilog 复制代码
module gray_counter #(
    parameter N = 4 // 默认4位位宽
)(
    input        clk,   // 时钟
    input        rst_n, // 异步低电平复位
    output reg [N-1:0] gray // 格雷码输出(寄存型)
);
    reg [N-1:0] binary; // 内部二进制计数器

    // 二进制计数器逻辑
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) 
            binary <= 0; // 复位时清零
        else 
            binary <= binary + 1; // 每个时钟周期加1
    end

    // 二进制转格雷码(组合逻辑)
    wire [N-1:0] next_gray = binary ^ (binary >> 1);

    // 寄存格雷码输出
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            gray <= 0;
        else
            gray <= next_gray;
    end

endmodule

原理

  • 内部维护一个二进制计数器,每个时钟周期递增。
  • 通过组合逻辑将二进制转换为格雷码。
  • 输出格雷码经过寄存器处理,确保时序稳定。

使用说明

  • 组合逻辑转换:直接连接二进制输入,立即得到格雷码输出。
  • 格雷码计数器:每个时钟上升沿输出下一个格雷码值,复位后从0开始。

示例波形(4位)

时钟周期 二进制 格雷码
0 0000 0000
1 0001 0001
2 0010 0011
3 0011 0010
4 0100 0110

相邻格雷码仅有一位不同,符合设计预期。

相关推荐
GateWorld10 小时前
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析LLP (二)
fpga开发·mipi csi2
hahaha601621 小时前
Xilinx 325T FPGA 中的 GT(GTP 或 GTX)收发器和普通 LVDS 接口的差模和共模电压
fpga开发
hahaha60161 天前
FPGA没有使用的IO悬空对漏电流有没有影响
fpga开发
贝塔实验室2 天前
FPGA 动态重构配置流程
驱动开发·fpga开发·硬件架构·硬件工程·射频工程·fpga·基带工程
GateWorld2 天前
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
fpga开发·mipi csi2
思尔芯S2C2 天前
思尔芯携手Andes晶心科技,加速先进RISC-V 芯片开发
人工智能·科技·fpga开发·risc-v·debugging·prototyping·soc validation
tiantianuser2 天前
RDMA简介5之RoCE v2队列
fpga开发·verilog·fpga·rdma·高速传输·rocev2
碎碎思2 天前
打破延迟极限的 FPGA 机械键盘
fpga开发·计算机外设
hahaha60163 天前
Flash烧录速度和加载配置速度(纯FPGA & ZYNQ)
fpga开发
hahaha60163 天前
ARINC818编解码设计FPGA实现
fpga开发