生成格雷码

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

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

相关推荐
upper202017 小时前
从零开始动手做Verilog实验--04--11阶FIR滤波器
fpga开发
nuoxin11420 小时前
SSD201-富利威
arm开发·驱动开发·fpga开发·ffmpeg·射频工程
哄娃睡觉20 小时前
FPGA、ARM、MCU、DSP的区别
fpga开发
nature_forest2 天前
vivado2018.2固化程序方法之.bin文件固化法
windows·fpga开发
m0_46644103詹湛2 天前
FPGA时序优化与高速接口实战手册
笔记·学习·fpga开发·硬件架构·verilog
upper20202 天前
从零开始做Verilog实验--01--4位计数器
fpga开发
upper20202 天前
从零开始动手做Verilog实验--02--模为60的BCD加法器
fpga开发
nbwenren2 天前
基于AD9250数据接收的FPGA纯Verilog实现JESD204B协议及三套工程源码支持
fpga开发
upper20202 天前
从零开始动手做Verilog实验--03--自动售卖机
fpga开发
salipopl2 天前
FPGA中AXI-FIFO主机接口的自定义实现与versal读写工程分析
网络·fpga开发