同步器

同步器

我们先来认识同步与异步
1:同步电路与异步电路
同步时序电路:用各种触发器实现,主要信号与OUT都是一个时钟沿经过各种触发器触发的。所以只有时钟脉冲到来才能改变电路的状态,所以不论IN如何变化,状态表中的每个状态都是稳定的。
异步时序电路:用组合逻辑电路(与非门)实现,电路中没有统一的时钟,典型的有FIFO/RAM读写信号、地址译码器等。主要信号与OUT 不是某个时钟信号驱动FF产生的。
核心区别在于是否所有触发器都与唯一时钟脉冲同步。always后面是变量还是沿。比如一个触发器的输出连接到另一个触发器的时钟端去触发就是异步。
同步时序很好避免毛刺,异步时序电路的最大缺点是容易产生毛刺。同步电路的问题在于时钟偏差Clock skew.
比如a+b=c.如果ab不同步,会有毛刺。
PS:阻塞赋值生成组合逻辑,非阻塞生成时序逻辑。
2:多时域设计中,不同时钟域数据如何交换? ★
不同的时钟域之间信号通信时需要进行同步处理,这样可以防止新时钟域中第一级触发器的亚稳态信号对下级逻辑造成影响。
当单个信号跨时钟域时,可以采用两级触发器(一位同步器)来同步;
数据流或地址总线跨时钟域时可以采用异步FIFO(或双口RAM)来实现时钟同步;
多位数据可以采用保持寄存器加握手信号的方法(多数据,控制信号,地址信号)。
3:同步时序电路 & 异步时序电路 如何实现延时?
异步电路一般是通过插入1个buffer、两级非门等,但这是不适合同步电路实现延时的。
在同步电路中的延时,一般通过时序控制实现,作为电路逻辑进行设计。
1)对于比较大的和特殊要求的延时,一般通过高速时钟产生计数器,通过计数器来控制延时;
2)对于比较小的延时,可以通过D触发器打一拍,延时了一个时钟周期,而且完成了信号与时钟的初次同步,在输入信号采样和增加时序约束余量中使用。
像#5 这种语句是“行为级代码描述”,仿真可以,电路综合会被忽略。
4:非同源时钟如何同步化?
当系统中有两个或两个以上非同源时钟的时候,数据的建立和保持时间很难得到保证。
我们可以使用带使能端的 D 触发器,并引入一个高频时钟(频率高于系统中的所有源时钟) ,便可以达到使系统中所有源时钟同步的效果。
例:系统时钟设计:
系统有两个不同源时钟,一个为 3MHz,一个为 5MHz,不同的触发器使用不同的时钟。为了使系统稳定,假设我们引入一个 20MHz 时钟,那么这个 20MHz 的时钟怎么才能将 3M和 5M 时钟同步化呢?
20M 的高频时钟将作为系统时钟,输入到所有触发器的的时钟端。3M_EN 和 5M_EN将控制所有触发器的使能端。即原来接 3M 时钟的触发器,接 20M 时钟,同时 3M_EN 将控制该触发器使能,原接 5M 时钟的触发器,也接 20M 时钟,同时 5M_EN 将控制该触发器使能。这样我们就可以将任何非同源时钟同步化。
异步信号输入总是无法满足数据的建立保持时间, 所以建议大家把所有异步输入都先经过双触发器进行同步化。

同步器
当信号跨时钟域时候,最容易忽视的一个问题是,这个信号需要每个时钟都被采样,不能漏掉每一个值吗?这是新手最容易忽视的一个问题。
信号跨时钟边界,一般有两种场景:
信号跨时钟边界,可以漏掉某些值;
信号跨时钟边界,不能漏掉任何值。
大部分都是第一种场景,忽略这个问题的大部分也是默认是第一种场景。比如一个enable信号,跨时钟后,在另外一个时钟域中,是第5个cycle生效还是第6个cycle生效,其实我们并不关心。几个cycle的延时,在大部分跨时钟域的设计中,并没有影响。
当然还是有第二种场景的存在,比如一个连续计数的counter值,需要跨时钟域,那么在另外一个时钟中就不能漏掉值,否则功能就不正常了。这种情况需要考虑的是,为什么需要把这种信号跨时钟,能否在目标时钟域来进行计数。如果一定要使用这种信号,那么就需要进行握手的设计,来保证目标时钟域不漏掉任何值。
两级触发同步器
最简单和最常用的同步器就是两级FF同步器,如下图所示:
在这里插入图片描述
如图所示,DATA的第一级FF输出发生亚稳态,亚稳态维持了一个周期,并在下一个时钟上升沿稳定,被识别为高,这样第二级的FF就能正确的将DATA采样到了OUTPUT。但是另外两种种可能:
如果亚稳态维持的时间不止一个周期,在下一个时钟上升沿没有稳定,那么第二级的FF就也会进入亚稳态。那么这种情况的概率是多少呢?就是我们之前描述的1/MTBF。
第一级的亚稳态在下一个时钟上升沿稳定,但是被识别为0,那么第二级的FF输出bq2_dat就是0,说明信号跨时钟采样失败。但是这种情况不会造成亚稳态的传播,也就是不会影响后面的设计。针对这种情况,我们一般会改变设计,不会让快时钟域的单cycle脉冲,跨时钟到慢的时钟内采样。
那么第一种情况发生的概率或者说MTBF是多少呢?有文献给出的数据:对于一个采样频率为200Mhz的系统,不做同步MTBF是2.5us,一级DFF同步的MTBF大概是23年,两级DFF同步的大约MTBF大概是640年;虽然不同设计不同工艺的MTBF有些区别,但是对大部分设计来说,两级FF同步器足够了。
一般情况下,2级FF的同步器都是足够的。但是要注意的是MTBF不可能是无穷大,也就是说亚稳态发生的概率(1/MTBF)不可能是0,所以即使用一万级的FF来做同步,还是可能会发生亚稳态。但是,工程设计不可能因噎废食,只要能保证使用中发生的概率足够小就可以了。
同步器的输入:源时钟寄存
采用同步器还有另外一个要求:通常,需要跨时钟的信号,需要在源时钟域先经过一级FF进行寄存输出。也就是说,跨时钟信号必须是寄存器的输出,中间不能有组合逻辑。还是刚才的电路,如果输入不是寄存器的输出,而是组合逻辑的输出那么情况会是怎样的呢?
可以想到,adat是组合逻辑的输出,变化的频率更快了,根据MTBF公式:
数据变化太快,会减小MTBF,增加亚稳态发生的概率。如果adat是FF的输出,那么根据FF的特性,输出在一个时钟周期内是不会改变的,数据的变化频率不会超过时钟频率,这样就能降低跨时钟信号变化的频率,减小亚稳态发生的概率。
所以,在使用同步器同步信号时,要求输入信号必须是源时钟域的寄存输出。

同步脉冲检测器=边沿检测器
脉冲信号A
经过D触发器延迟:B
A & B’ 得脉冲起始处的单周期脉冲
A’ & B 得脉冲末端的单周期脉冲
A ⊕ B 得起始和末端两个周期脉冲
触发器输入起始处的同步脉冲产生器 OUT = INn & IN’n+1
在这里插入图片描述
触发器输入末端的同步脉冲产生器 OUT = INn’ & INn+1
在这里插入图片描述
方法就是将input的反与经过D触发器延迟一周期的信号与一下。
Yn = Xn’ & Xn+1

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值