格雷码计数器(Gray counter)是为了在异步
时钟域之间传递计数结果而用到的
计数器,因为格雷码计数器计数时相邻的数之间只有一个bit发生了变化,例如:000-001-011-010-110-111-101-100。
二进制码-运动项目不一致格雷码(编码):从最右边一位起,依次将每一位与左边一位异或(XOR)(http://bk.7tmusic.com/lemma-php/dispose/view.php/379209.htm),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
格雷码-〉
二进制码(
解码):从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变).
原码:p[0~n];格雷码:c[0~n](n∈N);编码:c=G(p);解码:p=F(c);书写时从左向右标号依次减小.
解码:p[n]=c[n],p=c XOR p[i+1](i∈N,0≤i≤n-1).
Gray Code是由贝尔实验室的Frank Gray在20世纪40年代提出的(是1880年由法国工程师Jean-Maurice-EmlleBaudot发明的),用来在使用PCM(Pusle Code Modulation)方法传送讯号时避免出错,并于1953年3月17日取得美国专利。由定义可知,Gray Code的编码方式不是仅有的,这里讨论的是最常用的一种。 (引用自百度https://baike.baidu.com/view/358724.htm)
所以,在设计格雷码计数器的时候可以使用状态机,给每个码设定一个状态然后用时钟来控制它在状态间转换,这样就完成了我们需要的功能,但是若是状态比较多,如n=6,这时就会有64个状态,显然再用状态机非常不方便,当然理论上是可以的。
所以我们需要的是一种
通用的计数方式,最笨办法就是设计一个二进制计数器binary counter,通过它来计数,然后利用binary -gray的编码就可以得到对应的格雷码计数器,在如今fpga资源那么充裕的情况下,我们学习这样完全可以了,相信二进制计数器大家都会设计,那么接下来的编码器也不是问题,这样就解决了。