格雷码(Grey Code)生成规则

(1)

Grey码在FPGA实际应用中是实用的码,在8421BCD码累加计数器中,如果寄存器需要发生多位(两位或者以上)的跳变,会出现中间态,这样作为组合逻辑的输入是不稳妥的。

下面看两个中间态的例子

这是累加器的状态转换时序观察,存在中间不希望的状态。如果作为组合逻辑的输入,状态有可能跑飞。

左边0111 -> 0101 -> 1000,右边0101 -> 0111 -> 0110

(2)

采用格雷码可以避免中间态的出现,因为相邻两个状态之间只有1 bit差异。

下面是8421BCD码(自然计数码)和格雷码的对应关系,以3bit为例:

        自然码    0    1       2     3     4   5    6    7

     自然码二进制  000   001  010  011   100  100   101   111

  格雷码对应的十进制    0    1    3   2    6    7    5    4

        格雷码  000   001  011  010   110   111   101   100

在百度百科上面看到了这个图片,发现了规律

对于这个4 bit格雷码,我们发现最高位(g3)在组群前一半是0,后一半是1,非常整齐。而且非最高位(g2,g1,g0)组成的状态关于黄线对称,比如离黄线最近的g2g1g0都是100,再远一位是101,。。。最远一位是000。

按照这个规则,我们可以由n长度的格雷码生成n+1长度的格雷码。

- - 附录 - -

把这个图倒过来,看到白色蓝色的方块图案

我们发现格雷码的方块图案关于红线是轴对称的(除了最高位g3),

8421BCD码的方块图案关于红线是取反轴对称的(除了最高位g3)。

原文地址:https://www.cnblogs.com/YangGuangPu/p/11259514.html

时间: 2024-10-10 04:58:30

格雷码(Grey Code)生成规则的相关文章

二维码(QR Code)生成与解析

二维码(QR Code)生成与解析 写在前面 经常在大街上听到扫码送什么什么,如果真闲着没事,从头扫到位,估计书包都装满了各种东西.各种扫各种送,太泛滥了.项目中从没接触过二维码的东东,最近要使用,就扒了扒网络,发现关于解析二维码的类库还是非常多的,这里就选择一个做一个demo,玩玩. 一个例子 关于二维码的组件还是非常多的,你可以使用nuget选择一款使用就可以了. 生成二维码 // GET: Home public ActionResult Index() { QRCodeEncoder e

LeetCode 格雷码序列的生成

问题概述:在一组数的编码中,若随意两个相邻的代码仅仅有一位二进制数不同.则称这样的编码为格雷码. 2位数的格雷码序列:00 : 001 : 111 : 310 : 2找规律:假设要求n位的格雷码,先要求出n-1位的格雷码. 循环上一次格雷码的每一位,都会生成两个新的格雷码: 统计'1'出现的次数假设为偶数: 两个新格雷码分别为xxx1和xxx0假设为奇数: 两个新格雷码分别为xxx0和xxx1 以3位格雷码为例: 由00得:000 = 00+(0)001 = 00+(1) 由01得:011 =

格雷码(Gray code)仿真

作者:桂. 时间:2018-05-12  16:25:02 链接:http://www.cnblogs.com/xingshansi/p/9029081.html 前言 FIFO中的计数用的是格雷码,简要记录格雷码的分析思路. 一.格雷码与8421码对应关系 通过真值表分析,可以得出: 即格雷码是:8421码从最右边起,依次与左边一位异或,最左边一位不变,对应实现语言: GrayCount_out <= {BinaryCount[COUNTER_WIDTH-1],BinaryCount[COUN

[C#]二维码(QR Code)生成与解析

写在前面 经常在大街上听到扫码送什么什么,如果真闲着没事,从头扫到位,估计书包都装满了各种东西.各种扫各种送,太泛滥了.项目中从没接触过二维码的东东,最近要使用,就扒了扒网络,发现关于解析二维码的类库还是非常多的,这里就选择一个做一个demo,玩玩. 一个例子 关于二维码的组件还是非常多的,你可以使用nuget选择一款使用就可以了. 生成二维码 // GET: Home public ActionResult Index() { QRCodeEncoder endocder = new QRCo

格雷码(Gray Code)

https://www.yuque.com/docs/share/45ca4609-0038-4ae1-beb5-76320d5b0acd 原文地址:http://blog.51cto.com/4754569/2326827

[腾讯]生成格雷码

时间限制:3秒 空间限制:32768K 热度指数:24655 本题知识点: 递归 题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码,顺序为从0开始. 测试样例: 1 返回:["0","1"] 思路: class GrayCode {public:    vector<string> getGray(int

腾讯生成格雷码

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码,顺序为从0开始. 测试样例: 1 返回:["0","1"] 代码: import java.util.*; public class GrayCode {    public String[] getGray(int n) {        int m = 1<<n

[编程题]生成格雷码

[编程题] 生成格雷码 腾讯在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码.给定一个整数n,请返回n位的格雷码,顺序为从0开始.测试样例:1返回:["0","1"] class GrayCode { vector<string> res; public: vector<string> getGray(int n) { // write c

格雷码那点事——递归非递归实现

简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码.在数字系统中,常要求代码按一定顺序变化.例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100.1111等).在特定情况下可能导致电路状态错误或输入错误.使用格雷码可以避免这种错误.格雷码有多种

格雷码的实现

问题:产生n位元的所有格雷码. 格雷码(Gray Code)是一个数列集合,每个数使用二进位来表示,假设使用n位元来表示每个数字,任两个数之间只有一个位元值不同. 例如以下为3位元的格雷码: 000 001 011 010 110 111 101 100 . 如果要产生n位元的格雷码,那么格雷码的个数为2^n. 假设原始的值从0开始,格雷码产生的规律是:第一步,改变最右边的位元值:第二步,改变右起第一个为1的位元的左边位元:第三步,第四步重复第一步和第二步,直到所有的格雷码产生完毕(换句话说,已