请问一个关于生成格雷码的问题
时间:10-02
整理:3721RD
点击:
昨天跑去一个公司面试别人问了我格雷码和异步FIFO的问题,我以为答得很好,顺便多说了一句:异步FIFO的深度最好是2的N次方,不然不好编译格雷码。人家就问了我一个比较难的的问题:怎么设计不是2的N次方,而是一个深度12的异步FIFO的格雷码,即从0-11循环的格雷码,我想了半天觉得只要一次只要1bit变就行了,于是写出如下答案:0000(0)->0001(1)->0011(2)->0111(3)->0110(4)->1110(5)->1111(6)->1110(7)-1100(8)->1101(9)->1001(10)->1000(11)->0000(12,0)写完以后对方摇摇头说这个可能会有些问题,我知道这个打错了,请问对的0-11循环格雷码应该是怎样的?我这样写有何错误,我一次只变了一个bit呀?
1)5和7的编码都是1110,笔误?
2)这套编码和自然二进制码之间的转换公式是什么,这一点设计中需要考虑的吧!
非2^N的也可以。只有是偶数深度都可以。用的时候把2^N的gray code头尾去掉相同个数个值就可以啦。
我们用6来举例:
0-7的gray code如下:
0 --> 000
1 --> 001
2 --> 011
3 --> 010
4 --> 110
5 --> 111
6 --> 101
7 --> 100
那么0-5的就是
1(0) --> 001
2(1) --> 011
3(2) --> 010
4(3) --> 110
5(4) --> 111
6(5) --> 101
格雷码原理http://baike.baidu.com/view/358724.htm
这个是我真的写错了,不是笔误,谢谢你帮我发现
除了最高位以外,格雷码的其它位都是镜像对称的
谢谢大牛的回答,让我茅塞顿开,那么我再追问一个问题:如您所说,这样的格雷码翻译成二进制码就会是0010(2)->1101(13),在这个2-13区间上变化。但是,往往我们产生将空(Aempty)和将满(Afull)信号的时候,我们是直接用减法就可以了,比如在深度是2的N次方的时候,直接减这种做法很方便。如果改成上面的情况,如何做个逻辑来产生将空将满信号呢?比如我要留3个冗余,即还有3个位置就要空或者满的时候就出将空将满信号,如果写才能尽量省面积?
学习一下。
学习一下。
