图5.8 三峡大坝五级闸门示意图
对于单个数据的传输,就非常类似这里轮船通过多级闸门的例子。轮船就是我们要传输的数据,闸门的开关就好比时钟的有效边沿变化,水位的升降过程也好像相关数据在两个寄存器间经过各种组合逻辑的传输过程。当轮船还处于上一级闸门准备进入下一级闸门时,要么当前闸门的水位要降低到下一级闸门的水平,要么下一级闸门的水位要升到上一级闸门的水平,只要这个条件不满足,最终结果都有可能造成轮船的颠簸甚至翻船。这多少页有点像寄存器锁存数据需要保证的建立时间和保持时间要求。关于建立时间和保持时间,有如下的定义:
● 在时钟的有效沿之前,必须确保输入寄存器的数据在“建立时间”内是稳定的。
● 在时钟的有效沿之后,必须确保寄存器的输出数据至少在“保持时间”内是稳定的。
在大家理解了时钟和时序逻辑的工作机理后,也就能够理解为什么时钟信号对于时序逻辑而言是如此的重要。关于时钟的设计要点,主要有以下几个方面:
① 避免使用门控时钟或系统内部逻辑产生的时钟,多用使能时钟去替代。
门控时钟或系统内部逻辑产生的时钟很容易导致功能或时序出现问题。尤其是内部逻辑(组合逻辑)产生的时钟容易出现毛刺,影响设计的功能实现;组合逻辑固有的延时也容易导致时序问题。
② 对于需要分频或倍频的时钟,用器件内部的专用时钟管理(如PLL或DLL)单元去生成。
用FPGA内部的逻辑去做分频倒不是难事,倍频恐怕就不行了。但是无论是分频还是倍频,在通常情况下都不建议用内部逻辑去实现,而应该采用器件内部的专用时钟管理单元(如PLL或DLL)来产生,这类专用时钟管理单元的使用并不复杂,在EDA工具中打开配置页面进行简单参数的设置,然后在代码中对接口进行例化就可以很方便的使用引出的相应分频或倍频时钟进行使用了。
③ 尽量对输入的异步信号用时钟进行锁存。
所谓异步信号,是指两个处于不同时钟频率或相位控制下的信号。这样的信号在相互接口的时候如果没有可靠的同步机制,则存在很大的隐患,甚至极有可能导致数据的误采集。笔者在工程实践中常常遇到这类异步信号误触发或误采集的问题,因此也需要引起初学者足够的重视。在笔者的《深入浅出玩转FPGA》笔记6中列举的一些改进的复位设计方法就是非常典型的异步信号的同步机制。
④ 避免使用异步信号进行复位或置位控制。
这个点和上一个点所强调的是同一类问题,异步信号不建议直接作为内部的复位或置位控制信号,最好能够用本地时钟锁存多拍后做同步处理,然后再使用。
上述几个点对于初学者可能很难理解和体会,没有关系,当你有了实践经历以后回头再品味一下或许就有味道多了。由于这几个点多少也算是比较高级的技巧了,所以无法一一扩展开来深入剖析。更多相关扩展的知识点读者可以参考笔者的《深入浅出玩转FPGA》一书,那里有更多更详细的介绍和说明。
`
0