时钟是 FPGA 设计中最重要的信号,FPGA 系统内大部分器件的动作都是在时钟的上升沿或者下降沿进行。无论是在输入,输出或是寄存器与寄存器之间,只要设计到时钟上升沿或者下降沿的采样,就会提到建立时间(setup time) 和保持时间(hold TIme) 。


建立时间(Tsu:set up TIme)是指在时钟沿到来之前数据从不稳定到稳定所需的时间,如果建立的时间不满足要求那么数据将不能在这个时钟上升沿被稳定的打入触发器;保持时间(Th:hold TIme)是指数据稳定后保持的时间,如果保持时间不满足要求那么数据同样也不能被稳定的打入触发器。建立时间和保持时间这两个指标说明器件本身不是理想的(有时延等),正是这个不理想的特性,限制了 FPGA 的时钟工作频率。

 

首先我们都知道 setup TIme 和 holdup time 是由器件决定的,并不是说可以随着你 FPGA 设计的改变而改变。那么 FPGA 时钟频率是怎么计算的呢,在不考虑时钟延时抖动等条件下,一个信号从触发器的 D 端到 Q 端的延时假设是 Tcd,从 Q 端出来之后会经过组合电路延时,这里注意即使没有组合电路,就单单经过导线也是有延时的,这个延时称作 Tdelay,经过这个延时之后,信号将要去下一个触发器,而且必须要满足触发器的建立时间 tsetup,不然时钟无法采样到稳定的数据。所以这三个时间加起来应该比时钟周期要小,否则数据无法打入下一个触发器,那就会进入亚稳态。

 

至于 FPGA 时钟频率与 holdup time 的关系,具体做设计的时候还是需要满足 Tcd+Tdelay+TsetupTholdup,也就是说 Tholdup 决定了最短路径的下限,也就是说组合逻辑是不能太大也不能太小的。这就是 hold time 能起作用的地方吧。其实一般都能满足保持时间,一般只要考虑都是要满足建立时间。

 

建立时间与保持时间的简单示意图如下图 1 所示,在图 1 中我们看到 clk_r3 的前后各有一条虚线,前一条虚线(最左边的虚线,左边代表出现时间早,与 modelsim 仿真时信号依次从左往右出现)到 clk_r3 上升沿的这段时间即为建立时间,clk_r3 上升沿到后一条虚线(最右边的虚线)的这段时间即为保持时间。前面对建立时间和保持时间下定义时提到过,在这段时间内不能够有数据的变化,数据必须保持稳定。而在这个波形中,也确实没有看到在建立时间和保持时间内,reg3in 的数据有任何的变化,因此我们可以稳定的将 reg3in 的数据锁存到 reg3 的输出 reg3out 中。

 

 

如下图 2 所示的波形,同样的一些信号,但我们发现 reg3in 在 clk_r3 的建立时间内发生了变化,这带来的后果就是 clk_r3 上升沿锁存到的 reg3in 数据不确定,那么随后的 reg3out 值也会处于一个不确定状态。比如第一个时钟周期,原本 reg3in 应该是稳定的低电平,但是由于整个路径上的延时时间(Tcd+Tdelay)过长,导致了 reg3in 在 clk_r3 的建立时间内数据还未能稳定下来,在建立时间内信号出现了电平从高到低的变化,即不稳定的状态,那么导致的后果就是 reg3out 的最终输出不是确定的状态,很可能是忽高忽低的亚稳态,而不是原本期望的低电平。