在不考虑时钟的偏移和抖动问题的情况下,先来说一下单周期同步电路的时序问题。通常来说一个同步的时序电路首先要保证单个同步元器件的数据能够稳定的被采集,以不至于太快的传入到下一级同步元件中,这个说的就是hold time。接下来为了保证数据可以在不同的数据流之间进行转换,也就是说由A发出的数据能够正确的被B所采集,以此类推,保证了数据在所有的同步元件中正常传输,为了达到这个目的,就要求发出的数据满足采集数据同步元件的setup time。
依照上面的论述,要使得同步电路正常的工作,首先要保证数据能够被同步元件_稳定的采集_,然后才是在各个同步元件之间流动。那么如何才能保证数据能够被稳定的采集和正确的同步元件中流动呢?这就要求同步元件之间的数据满足hold time和setup time的时序要求。
hold time通俗来讲就是当数据被采集之后需要在稳定保持一段时间。如下图所示,从B寄存器D端传入的数据要能被正确的采集,就要求D端数据至少要稳定hold time这么多的时长。也就是说B寄存器D端的数据改变时间要不少于hold time这么多的时长,这就要求B寄存器D端之间的延迟时间不少于hold time。B寄存器D端之间的延迟时间包括A寄存器CK到Q和逻辑延迟时间,即:
t_CK->Q_ + t_plogic_ > t_holdtime_
也就是说数据最快传入到同步元件中也需要hold time这么多的时长。
而衡量是否满足hold time时序要求,就通过(t_CK->Q_ + t_plogic_)与 (t_holdtime_)之间的差值来衡量。即:
t_slack_ = (t_CK->Q_ + t_plogic_)- (t_holdtime_)
如果t_slack_ >= 0说明满足了hold time的时序要求。通过上面的表达式也可以知道hold time与设计的时钟周期无关。
setup time通俗来讲就是在采集延到来之前数据就已经准备好。从A寄存器D端传入的数据需要经过A寄存器CK到Q和逻辑延迟才能到达B寄存器D端,把这些时间开销叫做数据到达时间。通常如果数据到达时间比规定的setup time早些,那么就说在采集延到来之前数据就已经准备好了。换句话说数据到达时间和setup time总时间在一个时钟周期内,也说明了满足setup time要求,即:
t_CK->Q_ + t_plogic_ + t_setup_ < T
也就是说数据从一个同步元件最慢也必须要一个周期内传入到下一个同步元件中。
而衡量setup time是否满足时序关系,就是通过数据到达时间与规定的setup time谁先早到为标准,即:
t_slack_ = (T - t_setup_) - t_arrival time_
t_slack_ = T - (t_CK->Q_ + t_plogic_ + t_setup_)
若t_slack_ >= 0说明满足了setup time时序要求。通过上面的表达式知道setup time满足与否和设计周期有关系,当不满足setup time要求是要么通过降频,要么通过减少组合逻辑复杂度来满足时序要求。