|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 sun_ic 于 2012-4-15 00:27 编辑
同步设计,异步设计,以及metastability
数字电路设计一般是采用同步设计技术。除非在某些特殊的局部场合,有人用时钟延时的补偿达到更高的处理速度。但在大多数情况下,应该遵循同步设计的理念。所谓同步设计指的是对于所设计的一个电路而言,所有logic在一个时钟的domain。这点很重要,因为大量复杂的logic不能靠人工或者工具一点点的验证。靠得是遵循一些统一的timing约束。而这样的约束在同一个时钟domain内描述出来比较容易。所以如果在一个设计中最好用一个统一的时钟。如果有不同的电路运行在不同的时钟速率怎么办?一般有以下几个办法
1)采用通用的时钟,对需要不同时钟速率的电路使用同步使能控制。比如memory的处理,MCU的bus,等等
2)对于同源的不同速率的数据间的转换,尤其是对于同速率不同相位的,采用FIFO来处理。这在采用总线背板的多插件系统中,同步不同linecard来的数据中很是普遍。比如光通信系统的设计,SDH/SONET的phase alignment/pointer processing经常用这种方式。
有时有些简单的电路也可以采用逻辑电路实现,但要十分小心setup时间的保证。一般初学者最容易采用这种方式。但建议在变成中高手后再使用
3)对于不同源,或者速率不同的数据之间的转换,实现起来比较复杂。这需要采用异步FIFO来做。在下认为异步FIFO的设计,与用RAM的lookup table设计,DRAM做大量独立的buffer/FIFO的设计等一起,构成了数字logic设计的高级境界。
在不同时钟domain间的数据转换,主要考虑的是metastability。假设有两个不同源的时钟A和B,时钟B取样产生于时钟A的数据。总有可能会取样在数据的变化沿,这就可能产生取样结果的不确定性。解决这一问题的方式有几个(也可能有别的方法,请有经验的DX分享一下)
i)如果被取样的数据是一个bit,可采用如下的double clock的方式去除metastability
ii) 如果被取样的数据多于一个bit,以上所述的方式不能完全消除metastability。因为如果有两个bit同时在switching时被另一个domain的时钟取样,即使double clock也有一个时钟的不确定性的可能。这时异步FIFO是最好的选择。
在异步FIFO设计中需要对read和write的地址进行比较,以产生Full和empty的指示。一个可能的方法是采用GRAY编码的方式解决。这种编码的特点是每个时钟周期只有一个bit发生变化。这时再采用double clock技术就不会产生metastability了。
注意GRAY编码其实是在时钟domain变换中的一个接口。数据转变到新的domain中后还要转换为正常的binary。
一个4-bit GRAY编码的例子: 0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000
所以利用double clock和GRAY编码的方法先设计AFIFO,然后就可在不同timing domain之间转换任意宽度的数据。
(漫谈写到之50了,贴在了不同的地方。有兴趣的google一下吧)
|
|