生成格雷码

以下是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

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

相关推荐
nnerddboy5 小时前
FPGA自学笔记(正点原子ZYNQ7020):1.Vivado软件安装与点灯
笔记·fpga开发
li星野1 天前
打工人日报#20251005
笔记·程序人生·fpga开发·学习方法
通信小呆呆1 天前
FPGA 上的 OFDM 同步:从 S&C 到残差 CFO 的工程化实现
fpga开发·信号处理·同步·ofdm
hahaha60162 天前
高层次综合基础-vivado hls第三章
算法·fpga开发
XINVRY-FPGA4 天前
XCVU9P-2FLGA2104E Xilinx AMD Virtex UltraScale+ FPGA
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga
范纹杉想快点毕业5 天前
ZYNQ7045芯片中UART实现RS422通信详解,50000字解析,C语言,嵌入式开发,软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·fpga开发
千宇宙航6 天前
闲庭信步使用图像验证平台加速FPGA的开发:第三十课——车牌识别的FPGA实现(2)实现车牌定位
图像处理·计算机视觉·fpga开发·车牌识别
灵风_Brend6 天前
最大最小延时约束
fpga开发
li星野7 天前
打工人日报#20250930
笔记·程序人生·fpga开发·学习方法
9527华安7 天前
FPGA实现SRIO图像视频传输,基于Serial Rapidlo Gen2,提供6套工程源码和技术支持
图像处理·fpga开发·音视频·srio·xilinx