4849|3

6423

帖子

17

TA的资源

版主

楼主
 

单根信号线,跨越时钟域,该怎么处理(转) [复制链接]

本帖最后由 白丁 于 2016-2-7 17:42 编辑

转自http://www.21ic.com/mcucourse/201601/661616.htm

这十几年来,我面试过很多新人,也带过很多新人,他们之中很多人的成就都已经超越了我。但是当我们偶尔回顾这个小小的跨越时钟域的问题时,仍然有很多的困惑和不理解。
我喜欢用这个题目作为我的面试题目,因为它不是一个简单的题目,而是涉及到ASIC设计本质的题目,如果细细研究起来,还非常复杂。写这个东西,希望所有在做ASIC的人,能从一个更高的角度去审视它,并且能因此更深刻的体会做ASIC的严谨。
言归正传:
1、首先给一个最简单的答案: 用寄存器打两拍

这里其实有一个很本质的问题需要讨论,就是为什么要所存两拍? 把这个问题插进来说说吧。所有做ASIC的人,都要面对两个基本的概念:setup time 和  hold time。如果寄存器不满足这两个时间,将会出现亚稳态。很多新人以为亚稳态仅仅是逻辑上的障碍,其实亚稳态是实实在在的电路上的问题。
模拟电路中,三极管主要工作在其放大区间,而在数字电路却是要工作在截至态。亚稳态非常类似模拟电路中的放大态,这个状态将使得器件的输出电流被放大,如果这个状态被传递,那么将导致更多的电路处在放大电路的工作状态中,这将引起巨大的电流和功耗,甚至烧毁芯片,所以,跨时钟域是一定会出现亚稳态的,但是我们必须要把亚稳态控制在一个很小的范围内。这就是为什么要在其后面再用一个寄存器的原因。它的功能就是把亚稳态仅仅限制在那一个寄存器的小区域。
好了,继续说逻辑上的事情。这个两拍的电路很显然,只适合信号从低频时钟跨越到高频时钟,那么当高频时钟要跨越到低频时钟该怎么办呢?
2、高频信号要进入低频时钟域,最原始的想法就是  展宽。如果我们知道这两个时钟之间的频率差别,那么用一个计数器去将高频信号做适当的展宽,使其宽度大于低频时钟的一个周期,然后就可以继续用上述的方法跨域时钟域了。
这种方法的本质,是降低时钟频率,是把高频时钟产生的信号先做了频率的降低,降低到比原来的低频时钟还要低,因此当然就可以用第一种方法了。
那么,如果我们不能在设计的最初就知道彼此的频率差异,该怎么办呢? 通常这个问题,都会让面试者陷入绝境。
3、仍然是高频时钟域的信号要进入低频时钟域,但是我们不能确切的知道两个时钟频率到底差异多少,这时,我们的基本思路还是展宽,只是这个展宽要做成一个能自动适配的功能,当然,这就需要做反馈。我是学自控的,反馈,我很熟悉。

这里面其实是3组寄存器,reg-1和reg-2是clk-a的时钟域,其中reg-2的功能就是要把高频时钟clk-a产生的信号根据clk-b的频率来做展宽。
reg-3和reg-4是两个寄存器,用来把clk-a的信号跨时钟域到clk-b中。
reg-5和reg-6其实也是两个寄存器,用来把clk-b时钟域的信号跨越到clk-a,这个信号将作为一个反馈信号,来实现展宽的逻辑,实现这个逻辑的,主要是那一个与门和一个或门。

具体的逻辑就不说了,只说说思想:这是一个逻辑反馈电路,和模拟电路中的电压跟随电路的思考方式不太一致。它的思考逻辑是,如果输出还没有得到逻辑1,那么输入的逻辑1就要保持。但是我们很容易就看出来了,这个电路仅仅可以把一个  高电平脉冲 展宽。那么如何将一个低电平展宽呢?其实简单的调整一下那个与门和或门的电路就可以了:

但是这仍然不是一个完全意义上的跨越时钟域的逻辑。那么能不能做一个完整功能的电路呢?这就要考虑如何把上述这两种展宽逻辑融合到一起。

4、融合这两个电路,就必须先从原理上说清楚一件事情:低频时钟是无法完全去采样高频信号的,这里面一定会丢失信息。这是无法避免的。

如果reg-2的输出是1,那么我认为目前正在把逻辑1展宽,如果当前reg-2的输出是0,那么我认为正在把逻辑0展宽。至于短时间内频繁的出现逻辑1和逻辑0,那么很可能会丢失某些状态,这也是我们上面说到的,不可避免的问题。
说到这里,是不是所有的事情都说完了呢?还没有,至少我们的思考还不应该结束。

5、如果一个信号需要跨越时钟域,但是我们不知道哪个时钟快,哪个时钟慢,该怎么办呢?期待你的奇思妙想。


此帖出自FPGA/CPLD论坛

最新回复

本帖最后由 5525 于 2016-5-8 21:18 编辑 版主,转的都是要点啊!见过周围很多项目的苦战,最终发现,此处每人至少中枪两回。 最后统一做法如下: 异步的单信号传递,一个时间片里面,只在一个地方做一次。 另外,这异步的事情,本来是等看对方的状态来判断, 应用层规定好之后, 宏观上只有 快时钟采样慢时钟, 微观上无需对 快到慢 和 漫到快分开处理,都是慢到快的统一处理。   详情 回复 发表于 2016-5-8 21:15
点赞 关注(1)
个人签名training
 

回复
举报

6423

帖子

17

TA的资源

版主

沙发
 
在FPGA开发中,经常性会遇到整个系统不止一个时钟,如果需要在两个时钟间交互,则需要时钟切换操作,通常可以分为控制信号和数据信号的跨时钟域处理。

(1)控制信号:此种信号一般只有1bit,可以在接收端加入双触发结构,即使用两个触发器去采集这个控制信号,即使第一个触发器端采集发生了亚稳态,第二个触发器则应该能避免亚稳态;但是此种结构适用于慢时钟域到快时钟域的切换,如果做快时钟域到慢时钟域的切换,则需要加入前提条件,从快时钟域出来的控制信号的有效宽度应为 2倍的慢时钟周期,这样可以避免控制信号被漏采的问题。

(2)数据信号:此种信号往往不止1bit,如果同样采用双触发器结构,则可能会造成信号的不同步,通常对数据信号采用握手协议或者FIFO作为时钟切换的方法。由于采用握手协议数据的吞吐率较低,FIFO是现在最常用的方法。
此帖出自FPGA/CPLD论坛
个人签名training
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
自己带的新人有所成就并且超过了自己有时也有一种成就感
此帖出自FPGA/CPLD论坛
 
 
 

回复

1950

帖子

4

TA的资源

版主

4
 
本帖最后由 5525 于 2016-5-8 21:18 编辑

版主,转的都是要点啊!见过周围很多项目的苦战,最终发现,此处每人至少中枪两回。

最后统一做法如下:
异步的单信号传递,一个时间片里面,只在一个地方做一次。

另外,这异步的事情,本来是等看对方的状态来判断,
应用层规定好之后,
宏观上只有 快时钟采样慢时钟,
微观上无需对 快到慢 和 漫到快分开处理,都是慢到快的统一处理。
此帖出自FPGA/CPLD论坛
个人签名MicroPython中文社区https://micropython.org.cn/forum/  
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表