格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。

格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一 的。
     格雷码的构造方法为:直接排列以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。

下面主要谈谈格雷码和自然二进制码之间的转换方法。

1)自然二进制码转换为格雷码的方法

自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高    位相异或,而格雷码其余各位与次高位的求法相类似。

    原理: 若二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0];
         相应地, 则二进制格雷码表示为: G[N-1]G[N-2]...G[2]G[1]G[0].
         其中最高位保留: G[N-1] = B[N-1];
         其他各位: G[i] = B[i+1] xor B[i]. (i = 0, 1, 2, ..., n-2)
    图示如下:

bin[3]    bin[2]     bin[1]      bin[0]          ---二进制值 : 二进制

+     0     bin[3]     bin[2]      bin[1]          ---右移值(二进制)


gray[3]  gray[2]    gray[1]    gray[0]      ---对应的格雷码值

总结:格雷码的值只需要在原来的二进制的基础上右移一位再加上原来的二进制值即可得到。

其实现代码如下:

module bin2gry(Gry,Bin);
parameter length = ; //以八位示例
output [length-:] Gry;
input [length-:] Bin; reg [length-:] Gry;
integer i; always @ (Bin)
begin
for(i=;i<length-;i=i+1)
Gry[i]=Bin[i]^Bin[i+];
Gry[i]=Bin[i];
end /*另一种简单的实现方法如下:*/
// assign Gray = (Bin >> 1) ^ Bin;
endmodule
 
仿真波形

图1. length ="3"
图2. length ="4"

2)格雷码转换为二进制码的实现方法

二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制       码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。

    原理: 若二进制格雷码表示为: G[N-1]G[N-2]...G[2]G[1]G[0];
         相应地, 则二进制码表示为: B[N-1]B[N-2]...B[2]B[1]B[0].
         其中最高位保留: B[N-1] = G[N-1];
         其他各位: B[i-1] = G[i-1] xor B[i]. (i = 1, 2, ..., n-1)
    图示如下:
  
 用代码实现如下:
module gry2bin(Gry,Bin);
parameter length = ;
input [length-:] Gry;
output [length-:] Bin; reg [length-:] Bin;
integer i;
always @ (Gry)
begin
Bin[length-]=Gry[length-];
for(i=length-;i>=;i=i-1)
Bin[i]=Bin[i+]^Gry[i];
end
endmodule
 
仿真波形
 

图3. length="3"
 
图4. length="4"
 

用硬件(Verilog)实现二进制码和格雷码的转换的更多相关文章

  1. 《FPGA全程进阶---实战演练》第十二章 二进制码与格雷码PK

    大家在写程序的时候,可能会听闻,什么独热码,什么格雷码,什么二进制码等等,本节意在解释这几种编码之间的区别和优势以及用verilog怎么去实现,下面先介绍这几种编码的区别. 1 基础理论部分 1.1 ...

  2. 格雷码(Gray Code)转二进制码(Binary Code)

    学习verilog generate语句时,偶然看到用generate语句来进行格雷码到二进制码转换的代码,就从网上找了一些案例来学习. 下表为几种自然二进制码与格雷码的对照表: 十进制数 自然二进制 ...

  3. 在verilog中使用格雷码

    格雷码的一些知识: https://baike.baidu.com/item/%E6%A0%BC%E9%9B%B7%E7%A0%81/6510858?fr=aladdin 绿色框起来的是0--15的格 ...

  4. 格雷码原理与Verilog实现

    格雷码原理 格雷码是一个叫弗兰克*格雷的人在1953年发明的,最初用于通信.格雷码是一种循环二进制码或者叫作反射二进制码.格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点 ...

  5. 异步FIFO格雷码与空满

    在传递读写时钟域的指针使用格雷码来传递,如何把二进制转换为格雷码,格雷码是如何判断读空写满呢? 二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高 ...

  6. Gray Code - 格雷码

    基本概念 格雷码是一种准权码,具有一种反射特性和循环特性的单步自补码,它的循环.单步特性消除了随机取数时出现重大误差的可能,它的反射.自补特性使得求反非常方便.格雷码属于可靠性编码,是一种错误最小化的 ...

  7. 格雷码Gray Code详解

    格雷码简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.格 ...

  8. HDU 5375 Gray code 格雷码(水题)

    题意:给一个二进制数(包含3种符号:'0'  '1'  '?'  ,问号可随意 ),要求将其转成格雷码,给一个序列a,若转成的格雷码第i位为1,则得分+a[i].求填充问号使得得分最多. 思路:如果了 ...

  9. Gray code---hdu5375(格雷码与二进制码,普通dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5375 题意就是:给你一串二进制码,里面可能含有'?'这个既可以表示0又可以表示1, 让我们把这个二进制 ...

随机推荐

  1. winform中DataGridView的数据实现导出excel

    1,窗体设计 首先需要引入程序集:Microsoft.Office.Interop.Excel  (如果没有引用过的需要右键添加引用再搜索就行了) 实现的方法: /// <summary> ...

  2. jstree 节点拖拽保存数据库

    需要jstree具有拖拽功能需要在加载jstree时添加dnd插件,具体看代码: $('**').jstree({ //plugins-各种jstree的插件引入,展示树的多样性 'plugins' ...

  3. 程序猿接私活经验总结,来自csdn论坛语录

    下面为网上摘录,以做笔记: 但是到网上看看,似乎接私活也有非常多不easy,技术问题本身是个因素,还有非常多有技术的人接私活时被骗,或者是合作到最后以失败告终,所以想请有经验的大侠们出来指点一下,接私 ...

  4. 移植QT到ZedBoard(制作运行库镜像) 交叉编译 分类: ubuntu shell ZedBoard OpenCV 2014-11-08 18:49 219人阅读 评论(0) 收藏

    制作运行库 由于ubuntu的Qt运行库在/usr/local/Trolltech/Qt-4.7.3/下,由makefile可以看到引用运行库是 INCPATH = -I/usr//mkspecs/d ...

  5. python----------进程、线程、协程

    进程与线程 什么是进程(process)? An executing instance of a program is called a process. Each process provides ...

  6. 关于promise

    后来发现promise是解决异步的一个链式调用的好的方法,避免了所谓的回调的监狱, 它有三个状态,未作为,已经完成和已经失败,起始是未作为,然后有了动作总会有个结果, 分成resolve,已经顺利ok ...

  7. VS 创建 使用C++ 静态类库(Dll)

    创建静态类库 Walkthrough: Creating and Using a Dynamic Link Library (C++) 1:菜单栏-->File, New, Project. 2 ...

  8. Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

    canvas绘制图片,由于浏览器的安全考虑,如果在使用canvas绘图的过程中,使用到了外域的图片资源,那么在toDataURL()时会抛出安全异常: Uncaught SecurityError: ...

  9. Android开发----权限大全

    一.添加权限格式:     示例:      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STOR ...

  10. JS调用android逻辑方法

    1.安卓打开webview时做如下配置 并做一回调接口 这里注意的是 参数 FULIBANG   和 回调接口方法  jsCallWebView 一会在JS里会用到 ================= ...