异步设计难题证答
clk1: 频率F,随机同时并行发送32位数据D和数据有效信号valid
clk2:采样时钟,频率可能是1~4F,和clk1完全异步
怎样设计clk2的接收电路,使数据快速有效地按clk1的发送顺序接收到。
要求:不考虑使用异步FIFO的慢速设计,因为地址握手太慢,并且尽量减少数据buffer的使
用。
基本要求:保证解决亚稳态问题,只用4个左右32位的寄存器buffer
。
异步设计难题证答
clk1支持类似hready信号吗?否则会丢数据吧?数据有效信号期间数据变化吗?
异步设计难题证答
慢时钟采快时钟的数据,难度还是有点大也。
异步设计难题证答
不支持,它只给出valid,valid随时有效,你就得想办法缓存住。
异步设计难题证答
[这个贴子最后由老扁在 2005/07/19 09:16pm 第 1 次编辑]
采样时钟是1~4T,应该是快采慢
-------------
阿憨,不好意思,是俺写错了,应该是4倍频率才是,呵呵
异步设计难题证答
这中间还要解决亚稳态问题。
俺搞了个方案要10组32位的buffer,太多了,受不了,必须优化。
高手继续帮忙,俺希望从你们那借鉴一些好的思路。
异步设计难题证答
4T 是4倍周期还是4倍频率?
异步设计难题证答
哦,瞧俺糊涂的,应该是4倍频率,呵呵
异步设计难题证答
到目前为止,俺的方案采用了4组32位buffer,主要对付clk1:clk2 约= 1:1时的亚稳态问题,采样延迟了4个clk左右。
2-4倍频率采样时的方案相对要简单些。
大家如果有更快更少buffer的方案,请不吝赐教。
异步设计难题证答
俺的方案失败,继续研究ing
大家有思路了吗?目标4个32位buffer,可以对valid信号编码。
扁师兄能否把这个问题的具体情况再介绍一下?
时钟是知道了,而这两个时钟之间的数据有什么特定的关系,是传递地址还是传递数据,还是传递握手信号?采到的数据准备如何处理?
好像uart都是八倍或者十六倍采样,不知道对不对?
异步设计难题证答
[这个贴子最后由老扁在 2005/07/20 12:55pm 第 1 次编辑]
题目很简单:就是 clk1 随时并行发送32位数据,同时给出一拍valid信号;用clk2把有效数据快速可靠地按clk1的发送顺序采下来就ok啦。
异步设计难题证答
这个问题太简单了;)干吗这么讨论呢?;)
为什么不用FIFO,难道FIFO很不合适么?我觉得下面的方案很合适:
实现一个FIFO valid信号为写信号。读信号一直有效。因为clk2的频率大于clk1,所以,最多5个深度就应该可以了吧(两个防止亚稳态,两个用来做ping-pong操作,还有一个作为冗余)。
异步设计难题证答
俺改变编码思路,基本搞定,有待仔细再琢磨。
异步设计难题证答
clk2 = 1~4 clk1 的频率,不完全是大于。
本题的难点其实就在clk1和clk2异步相等的情况,fifo不好实现。因为你fifo终归要有空满信号和读信号的来回异步采样,这其实就等同于转化为对valid的采样了。
异步设计难题证答
奇怪扁兄的方案怎么会不对?
扁兄的思路很对啊,将valid信号编码成4个buffer的valid0~3信号,这样每个buffer在极限状态下数据可以寄存至少4个clk1周期,
再用clk2同步valid0~3之后取下降沿单脉冲作为clk2中的valid0~3_clk2信号存储到大缓冲区(maybe big SRAM)中即可。
如果确定clk2与clk1为1:1的话,只需要3级buffer就够了,因为用同步后的valid0~2就可以了。
异步设计难题证答
再说说我的方法,希望小编也把自己的结果写出来,也不枉大家关注了这么久!
这是一个类似FIFO的方法,相当于读一个有效。
假设采用2^n个缓冲区,需要两个个n位的gray code,作为读写指针。
写指针每次数据有效时加一。关键就是读指针的控制和输出信号out_valid的有效,而这两个可以其实只需要out_valid这个信号就可以了,读指针在每次out_valid有效时将增加一。因此问题转换为out_valid的,而这个信号只需要是 rd_addr!=wr_addr的
两次寄存就可以了。
异步设计难题证答
这种方法的问题在于,如果clk1,clk2周期相等。在特殊情况下,就会遇到在采样valid信号的时候,出现一个寄存器建立时间不够,而下一个寄存器保持时间不够的问题。相当于
你用clk信号来采样clk信号,你说能够得到什么冬冬?
异步设计难题证答
,是有些小问题。
将valid编码成clk1单拍valid0~3之后,再产生延时1周期的两个clk1周期宽度的信号,用clk2同步后取上升沿脉冲应该可以解决。
异步设计难题证答
其实我还在考虑采样一个2个时钟周期以上的异步信号上升沿脉冲干脆不做同步,那么可以只用3级Buffer来完成这项任务了。
首先,由于亚稳态的存在,valid采样后的时序顺序会乱,这样你不能按顺序采样;而不按顺序采样,由于如果用4个buffer,则数据只能最多保留4个周期,则造成数据丢失。
异步设计难题证答
俺回头想想你的思路
异步设计难题证答
你的思路基本跟俺是一致的,现在要解决的问题是,1:1时要把valid加长一拍,再加上亚稳态的两拍延迟,造成数据无法在可靠采样时间正确采样了。
异步设计难题证答
有待研究
异步设计难题证答
俺晚上把俺的方案和时序贴上来,大家帮着看看是不是可靠。
异步设计难题证答
看了看,应该可以用fifo撒!不管两个时钟周期是否一致,fifo最好用了,通过比较clk1写地址和clk2的读地址判断是否满是否空,是否读出。非常好用阿!这几天我在搬东西,到了SZ我给师兄找个例子看是否奏效:)
异步设计难题证答
道理是这个道理,仔细分析也许就不好用哦。呵呵。
异步设计难题证答
[这个贴子最后由老扁在 2005/07/20 06:30pm 第 2 次编辑]
先贴图,一般能看懂。工作原理待会再贴。
主要是解决1:1的情况。倍频采样的情况就很easy了。
异步设计难题证答
工作原理:
我们把clk1的valid和数据按4拍一循环,然后顺序进行数据锁存,需4个32位buffer,所以每个数据可以锁4拍。同时V2和V4也要锁存4拍。
创造4个2位one_hot码,两个用于V1和V2编码,两个用于V3和V4编码。
我们下面按顺序来看工作过程:
1. 开始时one_hot码都是00。根据V1=0或1,编两组码(10,01)或(01,10),有效两个clk1周期,然后都回到00。V3时也同理。这两组码到clk2采样后才根据V2的锁存信息来选择其中一个。
2. 这两组码被clk2采样,第一和第二拍进行亚稳态处理。第三拍(带F2标号的)再延一拍用于判断上升沿。
3. 在F1和F2拍都可能进行码的上升沿判断,同时用V2先选择出一个码,然后根据码就可以知道V1和V2的有效与否了。马上进行D1的采样,同时产生下一拍D2的采样脉冲。
4. D3和D4同样处理。问题是我们看时序会发现D3的采样点和D2的采样点有可能重合,这很好解决,在D3采样时看看有没有D2的采样脉冲,如果有就顺延D3和D4的采样。这个处理在D1采样时也受以前D4的影响,可以同理处理 。
5. OK OK OK OK啦!
异步设计难题证答
1:1时不管是gray码还是out_valid要想在clk2被有效采样,都需要至少两拍的有效和两拍无效,这样就是4拍,所以用FIFO要缓存很多拍数据(大于4)。欢迎你给出详细的设计方案和时序,以供大家欣赏。
俺的方案4个buffer就搞定了。唯一复杂的就是倍频采样时要重新考虑时序,然后整合到1:1的方案中去。