微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 异步FIFO中格雷码与二进制码之间的转换问题

异步FIFO中格雷码与二进制码之间的转换问题

时间:10-02 整理:3721RD 点击:

在异步fifo中跨时钟域的读写地址传输过程中需要使用格雷码;而在fifo读写时的地址增减需要使用二进制码;那么就存在一个二进制码与格雷码之间相互转换的问题;通常解决方法是:在读写时钟域进行FIFO读写的时候使用二进制码;写入一次数据;写指针+1;读数据操作类似;在判断FIFO空满状态的时候是使用格雷码比较;那么就需要在同步读写地址的时候需要将二进制码的地址转换成格雷码;转换过程中;如果FIFO地址为2的n次方(例如16);那二进制码转换为格雷码运算为:xgray=(xbin>>1)^xbin;    那如果FIFO地址仅为偶数(例如12);那么此时的格雷码如何选择的呢?我现在有两种方案;一:0000 0001 0011 0111 0101 0100 1100 1101 1111 1011 1001 1000 ;二:0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 ;一般选用哪种呢?我认为第二种更好一些因为这个格雷码取的是0~15(2的4次方)格雷码的中间12个;这样在由二进制码转换为格雷码的时候只需要将前面公式中的(xbin+2)再带入上面公式就可以得到对应的格雷码了;如果使用第一种编码方式应该如何实现二进制码到格雷码的转换呢(除了查表法)?
以上是个人观点;有错误的地方希望大家指出;共同学习;


    如果采用第一种方式,full = (wptr[3:2] == ~rptr[3:2]) && (wptr[1:0] == rptr[1:0]);
    如果采用第二种方式,你如何判断满呢?



   判断空满的方式是一样的啊;都是格雷码;


什么叫一样的?4bit的格雷码能用在8层的异步FIFO上,满的条件是:(wptr[3:2] == ~rptr[3:2]) && (wptr[1:0] == rptr[1:0]);
    你的第二种编码方式不满足这个条件。看下面两种情况,都是写满(12位格雷码,那FIFO应该是6层深度)的情况:
情况一:
0011  <-- 读指针
0010
0110
0111
0101
0100
1100  <-- 写指针
1101
1111
1110
1010
1011
这种情况下,wptr[3:0] == ~rptr[3:0];
情况二:
0011
0010
0110  <-- 读指针
0111
0101
0100
1100  
1101
1111  <-- 写指针
1110
1010
1011
在这种情况下呢?

不知道你明白我的意思没。



   恩 明白你的意思了;你说的对着呢;刚才没多想这一点;那第一种方式的bin2gray如何操作?



    除了查表,我也想不出别的方法。呼唤高人指点

好啊迎谢谢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top