同步以及时钟的设计原则 本文节选自特权同学的图书《FPGA设计实战演练(逻辑篇)》 有了前面的铺垫,大家应该明白了寄存器的代码编写。接下来我们要更进一步从深沉次来探讨基于寄存器的同步以及时钟的设计原则。(特权同学,版权所有) 虽然在上一章已经对组合逻辑和时序逻辑的基本概念做过描述,但是这里还是要再额外唠叨几句组合逻辑和时序逻辑的历史渊源,好让大家更加信服为什么时序逻辑要明显优于组合逻辑的设计。早期的可编程逻辑设计,限于当时的工艺水平,无论是逻辑资源还是布线资源都比较匮乏,所以工程师们更多是用可编程器件做一些简单的逻辑粘合。所谓的逻辑粘合,无非是一些与、或、非等逻辑门电路简单拼凑的组合逻辑,没有时序逻辑,因此不需要引入时钟。而今天的FPGA器件的各种资源都非常丰富,已经很少有人只是用其实现简单的组合逻辑功能,而是更多的大量使用时序逻辑来实现各种复杂的功能,而一旦大量的使用时序逻辑,时钟设计的各种攻略也就被不断的提上台面。可不是,时钟好比时序逻辑的心脏,它的好坏直接关系到整个系统的是非成败。那么,时钟设计到底有什么讲究,哪些基本原则是必须遵循的呢?搞清楚这个问题之前,我们势必要先全面的了解时钟以及整个时序电路的工作原理。(特权同学,版权所有) 在一个时序逻辑中,时钟信号掌控着所有输入和输出信号的进出。在每个时钟有效沿(通常是上升沿),寄存器的输入数据将会被采样并传送到输出端,此后输出信号可能会在经历长途跋涉般的“旅途”中经过各种组合逻辑电路并会随着信号的传播延时而处于各种“摇摆晃荡”之中,直到所有相关的信号都到达下一级寄存器的输入端。这个输入端的信号将会一直保持直到下一个时钟有效沿的来临。每一级寄存器都在不断的重复着这样的数据流采集和传输。单是这样枯燥的文字描述时序逻辑和时钟之间的工作机理未免有些乏味,不妨举个轮船通行三峡大坝的例子做类比。(特权同学,版权所有) 如图5.8所示,三峡大坝有五级船闸,船由上游驶往下游时,船位于上游。①先关闭上游闸门和上游阀门。②关闭第一级下游闸门和阀门,打开上游阀门,水由上游流进闸室,闸室水面与上游相平时,打开上游闸门,船由上游驶进闸室。③关闭上游闸门和阀门,打开第一级下游阀门,当闸室水面降到跟下游水面相平时,打开下游闸门,船驶出第一级闸室。如此操作4次,通过后面的四级船闸,开往下游。船闸的原理实际上是靠两个阀门开关,人为地先后造成两个连通器,使船闸内水面先后与上、下游水面相平。(特权同学,版权所有) 图5.8 三峡大坝五级闸门示意图 对于单个数据的传输,就非常类似这里轮船通过多级闸门的例子。轮船就是我们要传输的数据,闸门的开关就好比时钟的有效边沿变化,水位的升降过程也好像相关数据在两个寄存器间经过各种组合逻辑的传输过程。当轮船还处于上一级闸门准备进入下一级闸门时,要么当前闸门的水位要降低到下一级闸门的水平,要么下一级闸门的水位要升到上一级闸门的水平,只要这个条件不满足,最终结果都有可能造成轮船的颠簸甚至翻船。这多少页有点像寄存器锁存数据需要保证的建立时间和保持时间要求。关于建立时间和保持时间,有如下的定义: ● 在时钟的有效沿之前,必须确保输入寄存器的数据在“建立时间”内是稳定的。(特权同学,版权所有) ● 在时钟的有效沿之后,必须确保寄存器的输出数据至少在“保持时间”内是稳定的。(特权同学,版权所有) 在大家理解了时钟和时序逻辑的工作机理后,也就能够理解为什么时钟信号对于时序逻辑而言是如此的重要。关于时钟的设计要点,主要有以下几个方面: ① 避免使用门控时钟或系统内部逻辑产生的时钟,多用使能时钟去替代。(特权同学,版权所有) 门控时钟或系统内部逻辑产生的时钟很容易导致功能或时序出现问题。尤其是内部逻辑(组合逻辑)产生的时钟容易出现毛刺,影响设计的功能实现;组合逻辑固有的延时也容易导致时序问题。(特权同学,版权所有) ② 对于需要分频或倍频的时钟,用器件内部的专用时钟管理(如PLL或DLL)单元去生成。(特权同学,版权所有) 用FPGA内部的逻辑去做分频倒不是难事,倍频恐怕就不行了。但是无论是分频还是倍频,在通常情况下都不建议用内部逻辑去实现,而应该采用器件内部的专用时钟管理单元(如PLL或DLL)来产生,这类专用时钟管理单元的使用并不复杂,在EDA工具中打开配置页面进行简单参数的设置,然后在代码中对接口进行例化就可以很方便的使用引出的相应分频或倍频时钟进行使用了。(特权同学,版权所有) ③ 尽量对输入的异步信号用时钟进行锁存。(特权同学,版权所有) 所谓异步信号,是指两个处于不同时钟频率或相位控制下的信号。这样的信号在相互接口的时候如果没有可靠的同步机制,则存在很大的隐患,甚至极有可能导致数据的误采集。笔者在工程实践中常常遇到这类异步信号误触发或误采集的问题,因此也需要引起初学者足够的重视。在笔者的《深入浅出玩转FPGA》笔记6中列举的一些改进的复位设计方法就是非常典型的异步信号的同步机制。(特权同学,版权所有) ④ 避免使用异步信号进行复位或置位控制。(特权同学,版权所有) 这个点和上一个点所强调的是同一类问题,异步信号不建议直接作为内部的复位或置位控制信号,最好能够用本地时钟锁存多拍后做同步处理,然后再使用。(特权同学,版权所有) 上述几个点对于初学者可能很难理解和体会,没有关系,当你有了实践经历以后回头再品味一下或许就有味道多了。由于这几个点多少也算是比较高级的技巧了,所以无法一一扩展开来深入剖析。更多相关扩展的知识点读者可以参考笔者的《深入浅出玩转FPGA》一书,那里有更多更详细的介绍和说明。(特权同学,版权所有)
|