生成格雷码

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

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

相关推荐
ChipCamp3 小时前
Chisel芯片开发入门系列 -- 14. CPU芯片开发和解释4(Load/Store指令再探)
arm开发·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
霖004 小时前
深入讲讲异步FIFO
笔记·vscode·单片机·嵌入式硬件·学习·fpga开发
水果里面有苹果6 小时前
3-verilog的使用-1
fpga开发
嵌入式-老费7 小时前
再谈fpga开发(总结篇)
fpga开发
minglie19 小时前
基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)
fpga开发
朱古力(音视频开发)12 小时前
NDI开发指南
fpga开发·音视频·实时音视频·视频编解码·流媒体
9527华安1 天前
FPGA实现AD9361采集转SRIO与DSP交互,FPGA+DSP多核异构信号处理架构,提供2套工程源码和技术支持
fpga开发·架构·信号处理·dsp·ad9361·多核异构
小眼睛FPGA1 天前
【盘古100Pro+开发板实验例程】FPGA学习 | 基于紫光 FPGA 的键控 LED 流水灯
科技·学习·ai·fpga开发·fpga
最好有梦想~2 天前
分享一个FPGA寄存器接口自动化工具
fpga开发
hahaha60162 天前
FPGA(或者数字电路)中组合逻辑和时序逻辑是怎么划分的
fpga开发