数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现

关于数字电路中的码制问题在这篇博客中已经做了详细分析,
数字电路基础知识——数字IC中的进制问题(原码,反码,补码以及各进制的转换)
这篇博客会再次详细分析一下数字IC设计中关于 格雷码(Gray Code) 的问题,在数字IC设计中格雷码的使用范围很广,格雷码由于其误码率底的有点基本上每个模块都会使用到格雷码。
近期在学习FIFO的时候碰到格雷码转换二进制码的问题。特此写这篇博客总结一下。

一、什么是格雷码

格雷码的每一位按照一定的顺序循环。如最右边的一位按照0110的顺序循环,右边第二位按照00111100的顺序循环。即自右向左0、1的循环数目翻倍。
格雷码的最主要特点:各个相邻码之间仅有一位状态不同,首尾也是仅有一位状态不同。

二、为什么要用格雷码

首先说下二进制码,在FIFO的设计中,在写请求中,写指针在写时钟作用下递增,在产生FIFO满信号时,需要将写指针和读指针进行比较,由于两个指针分别与其各自的时钟同步,但是彼此之间又是异步的关系,所以在使用二进制计数器实现指针的时候,就会出现比较的指针出现取样值错误的问题。
如从FFF到000可能会进行如下的转换

如果此时同步时钟边沿在FFF向000转换的时候,就可能会把上面的的三位二进制数的任何取样值同步到新的时钟域,导致数据错误。
所以采取的办法通常是使用格雷码计数

格雷码的优势在于一个数变为另一个数时,只有一位发生变化。

三、用格雷码实现FIFO指针


如果要产生完美的FIFO空或满条件,首先需要正确的读写指针,在时钟域传递指针的最好的办法就是使用格雷码来实现指针,这种编码能够消除绝大数错误。上面是格雷码的设计流程。

  1. 将格雷码转换为二进制
  2. 根据条件递增二进制值
  3. 将二进制转换为格雷码
  4. 将计数器的最终格雷码保存至寄存器中
四、由格雷码转换为二进制
  1. 公式
    格雷码的转换公式:(i < n-1)

    计数器的位编号如下:
    MSB: Most Significant Bit的缩写,指最高有效位
    LSB: Least Significant Bit,指最低有效位
  2. 例:将格雷码转换为相等的二进制数(@表示异或xor)
    i = 3,
    bin3=gray3 = gray[3] = 1
    i = 2,
    bin2 = gray2 @ bin3 = gray2 @ gray3 = gray[2] @ gray[3] = 1
    i = 1,
    bin1 = gray1 @ bin2 = gray1 @ gray2 @ gray3 = gray[1] @gray[2] @gray[3] = 0
    i = 0,
    bin0 = gray0 @ bin1 = gray0 @ gray1 @ gray2 @ gray3 = gray[0] @ gray[1] @ gray[2] @ gray[3] =0
    于是可以得到如下四个等式:
  3. Verilog 语言描述格雷码转换为二进制码
module gray_to_bin (bin, gray);
parameter SIZE = 4;
input [SIZE – 1:0] bin;
output [SIZE – 1:0] gray;
reg [SIZE – 1:10] bin;
integer i;
always @ (gray)
for ( i = 0; i <= SIZE; i = i + 1)
bin[i] = ^(gray >> i);       //右移一位并按位异或
endmodule
五、由二进制码转换为格雷码
  1. 公式
    二进制向格雷码的转换公式:(i < n-1)
  2. 例:将二进制转换为相等的格雷码(@表示异或xor)
    i = 3,
    gray3 = bin3 = bin[3] = 1
    i = 2,
    gray2 = bin2 @ bin3 = bin[2] @ bin[3] = 0
    i = 1,
    gray1 = bin1 @ bin2 = bin[1] @ bin[2] = 1
    i = 0,
    gray0 = bin0 @ bin1 = bin[0] @ bin[1] = 0
    于是可以得到如下四个等式:

    由上式可以看出,通过逐位异或,或者将二进制码右移后与自己异或的操作方式,计算相应的格雷码,如下
  3. Verilog 语言描述二进制码转换为格雷码
module bin_to_gray (bin, gray);
parameter SIZE = 4;
input [SIZE-1:0] bin;
output [SIZE-1:0] gray;
assign gray = (bin >> 1) ^ bin;          //右移与自己异或
endmodule
六、格雷码计数逻辑的实现

由格雷码实现FIFO指针的流程图发现

module gray_ counter (clk, gray, inr, reset_n)parameter SIZE = 4;input clk, inr, reset_n;toutput [SIZE -1 ] gray;reg [SIZE] – 1 ] gray_temp, gray, bin_temp, bin;integer i;always @ (gray or inr)begin:gray_bin_grayfor (i = 0; i<SIZE ; 1 = i +1)bin[i] = ^(gray >> i); // gray to binary conversionbin_temp = bin + inr; // addition in binarygray_temp = bin_temp >> 1) ^ bin_temp; // binary to gray conversionend
endmodule

下面的逻辑快将转换后的格雷码值寄存起来

always @ (posedge clk or negedge reset_n)
begin:gray_registered
if (~reset_n)gray <= {SIZE {1’b0}};
elsegray <= gray_temp;
end

下图显示格雷码计数器的逻辑原理图:

数字电路基础知识——格雷码和二进制码的转换的算法和Verilog实现相关推荐

  1. 【数字电路基础】格雷码、二进制码与格雷码的转换、独热码

    文章目录 一. 格雷码 二.二进制码与格雷码的转换 2.1.二进制码转格雷码(编码) 2.2.格雷码转二进制码(解码) 三.代码实现 3.1.`b2g.v`(**二进制码转格雷码**) 3.2.`g2 ...

  2. 格雷码、二进制码、BCD编码

    格雷码 格雷码(12页).pdf 格雷码(12页).pdf-其它文档类资源-CSDN下载 奇偶校验码(25页).pdf 奇偶校验码(25页).pdf-其它文档类资源-CSDN下载 经验:如何快速地写出 ...

  3. 数字电路基础知识——组合逻辑电路(奇偶校验电路、数据比较器的设计)

    数字电路基础知识--组合逻辑电路(奇偶校验器.比较器的Verilog设计) 本次主要介绍组合逻辑电路中的奇偶校验电路以及比较器的设计,以及相干的实例来熟悉这两种电路. 一.奇偶校验电路 奇偶校验码 奇 ...

  4. AAC音频基础知识及码流解析

    AAC音频基础知识及码流解析 目录 AAC简介 AAC规格简介 AAC特点 AAC音频文件格式及代码解析 AAC元素信息 AAC文件处理流程 AAC解码流程 技术解析 1. AAC简介 AAC是高级音 ...

  5. 数字电路基础知识——乘法器的设计(二)( 串行、流水线、有符号数八位乘法器)

    数字电路基础知识--乘法器的设计(二)( 串行.流水线.有符号数八位乘法器) 前面一节关于乘法器的具体实现方式有很多种方法,均有各自的优缺点. 本节将再介绍一下两种乘法器的设计,分别用Verilog语 ...

  6. 格雷码与二进制码的相互转换 (python代码实现)

    ⭐ What? 格雷码 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连&quo ...

  7. 数字电路基础知识|时钟和时序

    时钟的概念 时钟对数字电路而言非常重要,没有时钟数字电路就没法工作,其全称是时钟频率,一般由晶振来提供时钟频率. 在数字电路中,所有数据.逻辑单元等状态的更新都是以时钟为基础的,时钟频率在数字电路中起 ...

  8. 数字电路基础知识——组合逻辑电路之乘法器的设计(一)—— 并行、移位相加、加法树、查找表乘法器

    数字电路基础知识--乘法器的设计(一)-- 并行.移位相加.加法树.查找表 乘法器的设计主要应用在数字信号处理和数字通信,本节主要介绍乘法器的四种实现方法.使用并行乘法器.移位相加乘法器.查找表乘法器 ...

  9. [Verilog]格雷码与二进制码的相互转换

    格雷码与二进制码的相互转换 摘要:在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相 ...

最新文章

  1. 后端返回的数据中换行符 html换行
  2. 多线程(十、AQS原理-ReentrantLock公平锁)
  3. 【Deep Learning笔记】卷积神经网络必须要掌握的知识(看不懂你来打我)
  4. 跟我一起做一个vue的小项目(十一)
  5. 判断checkbox是否选中并改变值
  6. httpClient学习的初步认识
  7. 【整理】使用云计算服务面临的几个安全问题
  8. Internet 打印提示“打印机安装失败、打印机名称无效”的解决
  9. [swift] LeetCode 347. Top K Frequent Elements
  10. 【李宏毅2020 ML/DL】P10 Classification_1 | 简单的例子告诉你使用 wx+b 以及 Sigmoid 作为激活函数的合理性
  11. 顶级的CSS和Javascript动画框架推荐
  12. 移远ec20 openLinux交叉编译python
  13. 开通写scdn博客第一天
  14. VFIO IOMMU简介
  15. 如何采用SMW0存储模板和OLED操作Excel的方式生成Excel单据
  16. 如何解决百度识图中图片被限制百度防盗链破解方法
  17. Rancher搭建Longhorn分布式存储
  18. vs2013编译ffmpeg之四十二 zvbi
  19. android内存扩展格式,一文看懂:如何为你的安卓手机选择合适的存储卡
  20. switch内部执行顺序

热门文章

  1. plsql相同变量高亮显示
  2. Tikz 画图技巧二
  3. 米家和HomeKit等智能家居联动的重要性
  4. 11种典型的时间序列回归预测方法大集合——附代码
  5. 基于android的资源文件管理器
  6. java utf8 简繁转换 类库,java 中文繁简体转换工具 opencc4j
  7. Android开发 - PsyDuck说明书
  8. 软件测评师知识点(2020.09.11)
  9. Android开发,XML文件注释方法
  10. BlackArch安装(译文)