关于gray code冗余的思考带来了一个全新方案,这个方案将为异步时钟间的数据传输
提供一个普遍的解决方案。
问题是:数据从一个时钟wr_clk,其件数据有效用valid
来指示,怎样将数据传递到另外的一个时钟rd_clk域?这里不对时钟频率做任何假设。
这个问题有以下这么几个关键点:
1. 异步输入亚稳态。
2. 无法用一个时钟采样一个宽度小于一个周期(包括等于,还需要考虑建立保持时间) 的信号。
3. 在将一组信号从一个时钟传递到另外一个时钟的时候,需要考虑各个信号通路上的延迟不同以及信号上的毛刺这两个问题。
4. 必须保证数据的不能够丢失。
5.
解决方案:
基本思想是首先将数据缓冲起来,然后挨个的读取数据。具体方法包括:
1。有一组缓冲区n个。n必须足够大,以便缓冲区不会溢出。
2。读写双方都维护一个指针,表示将要存取的缓冲区,这个指针在数据读写 之后将增加1,并循环。
3。写方通过gray code将信息传递到读的一方,其gray code每写一个数据增加1,读方维护自己的gray code,每次读取数据之后增加1,并比较自己的gray code和写方的gray code ,如不相等,表示可以进行一次读取。
并反复进行下去。
讨论 :
1. 需要多少个缓冲区?这需要由数据有效频率和读取速度和延迟来确定。一般的答案依赖于wr_clk的频率,rd_clk的频率,valid的模式,为了消除亚稳态和其他附加的延迟。
2.为什么需要采用gray code ? 采用gray code是为了满足面的要求3。
3.gray code需要多少位? 一般的考虑上面的要求2。至少需要的位数将是保证gray code 每一位的宽度可满足要求2的最小值。
4.还有其他么? 如果gray code的个数小于了缓冲区的个数(一些情况下发生),可以简单的将gray code多一些位,来避免复杂的控制操作。
5.在wr_clk频率大于rd_clk得时候情况如何?这个电路可以很好的工作,并代替原来的将valid信号接入触发器时钟端和异步复位的办法,并具有更简单的静态时序。
6,还有其他么?如果这个方法属于原创的话,建议把它叫做 PPL方法,或者PPL电路。 PPL(皮皮鲁),是陪伴了我10年以上《童话大王》里的主人公。相信很多人都看过。