在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 老扁

异步设计难题证答

[复制链接]
发表于 2005-7-21 11:30:44 | 显示全部楼层

异步设计难题证答

--在每一次数据有效时,写指针增加
        --同时,数据写入ram.
wr_pointer_p: process(clk_wr)
begin
if( rising_edge(clk_wr))then
  if( valid='1') then
    wr_pointer<=gray_adv(wr_pointer);
  end if;
end if;
end process;
        --每一次输出有效时,读指针增加
        --同时,使用者应该将数据寄存.
rd_pointer_p:process(clk_rd)
begin
  if( rising_edge(clk_rd))then
  if( out_valid='1') then
   rd_pointer<=gray_adv(rd_pointer);
end if;
  end if;
end process;
        --产生out_valid
        --将写指针同步到读时钟
        --因为是gray code,同步的不会造成数据错误,
        --而仅仅产生最多2个读时钟的延迟
        --两级触发器是为了防止亚稳态。
process(clk_rd)
begin
  if( rising_edge(clk_rd))then
     wr_pointer_delay_1<=wr_pointer;
     wr_pointer_delay_2<=wr_pointer_delay_1;
  end if;
end process;
--这是相当直截了当的。
out_valid<= '1' when(wr_pointer_delay_2!=rd_pointer) else '0';
        现在分析一下,
        连续的写:这种情况下wr_pointer一直连续变化,可是,wr_pointer的任何一位
        都不会连续变化(至少有两位的情况),所以从读时钟看来,将会产生最多两个
        时钟的误差,一个由于特殊的时序产生。再加上另外一级的延迟,也就是最多三个时钟的
        延迟。最精确的表示应该是T_delay = T_setup+T_hold+2*T_rd。也就是说,
        最多需要 1 + T_delay/T_wr个缓冲就可以了。计算的时候,要向上取整,同时增加一个缓冲
        以便防止例如时钟抖动之类的信号问题。
 楼主| 发表于 2005-7-21 11:53:23 | 显示全部楼层

异步设计难题证答

谢谢pppaaa大侠的设计,有个问题再讨论一下:
gray码要完备编码的连续工作才能有效,也就是说buffer必须是2的倍数,所以如果4个buffer不够的话,就需要8个,这个问题怎么解决。所以在这个问题里由于必须只能用4个buffer,时序能不能可靠工作?俺要再验证一下。
 楼主| 发表于 2005-7-21 12:26:25 | 显示全部楼层

异步设计难题证答

这种其实已经不是fifo了,跟俺的设计有共通之处:
首先是2位gray码,必须用4个buffer;然后是clk1和clk2各维持一套顺序码,保证数据的采样顺序。
俺的设计里也用4个buffer,然后通过对Valid编码使clk2采样后能知道clk1的数据顺序。
所以基本思路是一样的,只不过一个是gray码,一个是one_hot编码。gray码的方案如果有效,最大的好处是对clk2的频率通用。我的方案最大的好处是buffer数不以2的幂增加。
俺要对两个方案都实现一下。
再次感谢pppaaa大侠的优秀思路。
发表于 2005-7-21 14:02:03 | 显示全部楼层

异步设计难题证答

不敢称大虾,不过时待业青年而已;)
想凭技术创业两次未成,准备找工作又拿不定注意,只好天天上论坛;)
你的思路我看了一下,可惜没有太搞清楚。
我想着里边有三个关键点,只要注意了,就有很多方法,这三个关键点是:
1. 异步输入亚稳态。
2. 无法用一个时钟采样一个频率比自己高(包括等于,还需要考虑建立保持时间) 的信号。
3. 在将一组信号从一个时钟传递到另外一个时钟的时候,需要考虑各个信号通路上的延迟不同以及信号上的毛刺这两个问题。
例如,考虑延迟:01->10,在一个异步时钟,看来,可能是,00,01,10,11。
考虑毛刺,00->00就有可能产生上面的四个结果。
这时突然想到一个通用问题,可以简单描述如下:
如何将一组状态从一个时钟域安全的转移到另外一个时钟域呢?这可是个头疼的问题。
昨晚想了一下,发现可能的依赖因素是: 状态的数目N,每一个状态可能转移到
多少M(i)个不同的状态。想来想去,也没有找到一个好的方法,希望斑竹有时间了
看看。如果有了通用的方案,可能就不再需要讨论gray码的冗余问题了;)


 楼主| 发表于 2005-7-21 15:26:49 | 显示全部楼层

异步设计难题证答

这是pppaaa的方案的时序图,目前看来没有问题;大家一起研究一下吧
eetop_cn_5_2559_34.jpg
发表于 2005-7-21 15:50:27 | 显示全部楼层

异步设计难题证答

这是用什么工具画的时序图?
gray code的冗余,不是一个问题,只要在使用的时候,把几个连续的编码当作一个编码使用就行了。
 楼主| 发表于 2005-7-21 16:45:41 | 显示全部楼层

异步设计难题证答



下面引用由pppaaa2005/07/21 03:50pm 发表的内容:
这是用什么工具画的时序图?
gray code的冗余,不是一个问题,只要在使用的时候,把几个连续的编码当作一个编码使用就行了。

用visio画的。
富裕的码你怎么来处理?比如俺用了5个码,下面要回到000码,怎么办?这样不就造成有的位有效周期只有1拍了?
发表于 2005-7-21 18:26:04 | 显示全部楼层

异步设计难题证答

o ,我一般用visio画框图,没有做过时序图。;)
gray code的冗余是这样子的
000 001 011 010  110 111 101 100
就收缩成:
000 001 011 010  110 000
这里边的关键是110到000的转变,
可能被同步成:  000,010 100,110
显然,只要把其中非法的码子当成其相邻的码子处理就可以了。你可以再用其他更多的编码做个实验。我觉得在原理上讲,是没有问题的,只不过不好表达出来。
我又一本<数字设计--原理和实践>的书,我一看那个圆盘就知道这样是可行的。

                                    




 楼主| 发表于 2005-7-21 20:39:40 | 显示全部楼层

异步设计难题证答

我感觉冗余时就是要找一组子集,使每位的变化不能少于两拍,保证能传过去;
比如5个有效码就找其中一个自己 000,001,011,110,100,回000;其它子集也可以。
然后在接收方可能要仔细处理,译出来如果是非法码就等待的话,不知道会不会造成大延迟。这点可能要仔细分析。
这种异步传输的编码值得研究 :))
发表于 2005-7-22 10:22:26 | 显示全部楼层

异步设计难题证答

关于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年以上《童话大王》里的主人公。相信很多人都看过。
  




您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-29 22:15 , Processed in 0.028215 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表