建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计

时间:2024-03-14 16:56:13

1数字电路设计中的几个基本概念:

1.1  建立时间和保持时间:

 
  建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计
图1建立时间和保持时间关系图

建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间, 如果保持时间不够,数据同样不能被打入触发器。 数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。PLD/FPGA开发软件可以自动计算两个相关输入的建立和保持时间


注:

在考虑建立保持时间时,应该考虑时钟树向后偏斜的情况,在考虑建立时间时应该考虑时钟树向前偏斜的情况。在进行后仿真时,最大延迟用来检查建立时间,最小延时用来检查保持时间。

建立时间的约束和时钟周期有关,当系统在高频时钟下无法工作时,降低时钟频率就可以使系统完成工作。保持时间是一个和时钟周期无关的参数,如果设计不合理,使得布局布线工具无法布出高质量的时钟树,那么无论如何调整时钟频率也无法达到要求,只有对所设计系统作较大改动才有可能正常工作,导致设计效率大大降低。因此合理的设计系统的时序是提高设计质量的关键。在可编程器件中,时钟树的偏斜几乎可以不考虑,因此保持时间通常都是满足的。

 

1.2 FPGA中的竞争和冒险现象
信号在 FPGA 器件内部通过连线和逻辑单元时,都有一定的延时。 延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时, 在信号变化的瞬间, 组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现, 就说明该电路存在"冒险"。 (与分立元件不同, 由于PLD 内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在PLDFPGA设计中尤为突出)图 2是一个逻辑冒险的例子,从图 3的仿真波形可以看出,"ABCD"四个输入信号经过布线延时以后, 高低电平变换不是同时发生的, 这导致输出信号"OUT"出现了毛刺。 (我们无法保证所有连线的长度一致,所以即使四个输入信号在输入端同时变化,但经过PLD内部的走线,到达或门的时间也是不一样的,毛刺必然产生)。可以概括的讲,只要输入信号同时变化, (经过内部走线) 组合逻辑必将产生毛刺。 将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的, 这可能会导致严重的后果。 所以我们必须检查设计中所有时钟、清零和置位等对毛刺敏感的输入端口,确保输入不会含有任何毛刺

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

2 存在逻辑冒险的电路示例

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

3电路的仿真波形

冒险往往会影响到逻辑电路的稳定性。时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题。

如何处理毛刺

我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。
毛刺并不是对所有的输入都有危害,例如 D 触发器的 D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说触发是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间, 就不会对系统造成危害。 (由于毛刺很短, 多为几纳秒, 基本上都不可能满足数据的建立和保持时间)

去除毛刺的一种常见的方法是利用 D触发器的 D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。 图给出了这种方法的示范电路,图是仿真波形。

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

 4消除毛刺信号方法之二

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

5 所示电路的仿真波形

1.3同步复位与异步复位
1.3.1一个简单的异步复位的例子 

 1 module test
 2 (
 3  input clk,
 4  input rst_n,
 5  input data_in,
 6  output reg out
 7  );
 8  always @ (posedge clkor negedge rst_n)
 9          if(!rst_n) out <= 1'b0;
10           else out <= data_in;
11  endmodule 

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计

我们可以看到FPGA的寄存器都有一个异步的清零端(CLR),在异步复位的设计中这个端口一般就是接低电平有效的复位信号rst_n。即使说你的设计中是高电平复位,那么实际综合后会把你的复位信号反向后接这个CLR端。

 

1.3.2一个简单的同步复位的例子 

 1 module test
 2 (
 3  input clk,
 4 input rst_n,
 5 input data_in,
 6 output reg out
 7  );
 8 always @ (posedge clk )
 9          if(!rst_n) out <= 1'b0;
10          else out <= data_in;
11 endmodule 

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计

   和异步复位相比,同步复位没有用上寄存器的CLR端口,综合出来的实际电路只是把复位信号rst_n作为了输入逻辑的使能信号。那么,这样的同步复位势必会额外增加FPGA内部的资源消耗。 

       那么同步复位和异步复位到底孰优孰劣呢? 

       只能说,各有优缺点。同步复位的好在于它只在时钟信号clk的上升沿触发进行系统是否复位的判断,这降低了亚稳态出现的概率;它的不好上面也说了,在于它需要消耗更多的器件资源,这是我们不希望看到的。FPGA的寄存器有支持异步复位专用的端口,采用异步复位的端口无需额外增加器件资源的消耗,但是异步复位也存在着隐患。异步时钟域的亚稳态问题同样的存在与异步复位信号和系统时钟信号之间。

  

1.3.3异步复位、同步释放

 1 module test
 2 (
 3 input clk,
 4 input rst_n,
 5 input a,
 6 output reg c
 7  );
 8  
 9 reg b,rst_nr;
10 always @ (posedge clk)
11          rst_nr <= rst_n;  
12             
13 always @ (posedge clkor negedge rst_nr)
14          if(!rst_nr) b <= 1'b0;
15          else b <= a; 
16             
17 always @ (posedge clkor negedge rst_nr)
18          if(!rst_nr) c <= 1'b0;
19          else c <= b; 
20             
21 endmodule 

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计

如此一来,既解决了同步复位的资源消耗问题,也解决了异步复位的亚稳态问题。其根本思想,也是将异步信号同步化。

 

1.4锁存器、触发器和寄存器
1.4.1锁存器

锁存器(latch---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态

锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化。

锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样;一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用。锁存器也称为透明锁存器,指的是不锁存时输出对于输入是透明的。

锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,当锁存器处于使能状态时,输出才会随着数据输入发生变化。(简单地说,它有两个输入,分别是一个有效信号EN,一个输入数据信号DATA_IN,它有一个输出Q,它的功能就是在EN有效的时候把DATA_IN的值传给Q,也就是锁存的过程)。

应用场合:数据有效迟后于时钟信号有效。这意味着时钟信号先到,数据信号后到。在某些运算器电路中有时采用锁存器作为数据暂存器。

缺点:时序分析较困难。

不要锁存器的原因有二:1、锁存器容易产生毛刺,2、锁存器在ASIC设计中应该说比FF要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和FF来组成锁存器,这样就浪费了资源。

优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。

1.4.2触发器

触发器(Flip-Flop,简写为 FF---对脉冲边沿敏感,其状态只在时钟脉冲的上升沿或下降沿的瞬间改变。

触发器也叫双稳态门,又称双稳态触发器。是一种可以在两种状态下运行的数字逻辑电路。触发器一直保持它们的状态,直到它们收到输入脉冲,又称为触发。当收到输入脉冲时,触发器输出就会根据规则改变状态,然后保持这种状态直到收到另一个触发。

  触发器(flip-flops)电路相互关联,从而为使用内存芯片和微处理器的数字集成电路(IC)形成逻辑门。它们可用来存储一比特的数据。该数据可表示音序器的状态、计数器的价值、在计算机内存的ASCII字符或任何其他的信息。

  有几种不同类型的触发器(flip-flops)电路具有指示器,如T(切换)、S-R(设置/重置)J-K(也可能称为Jack Kilby)和D(延迟)。典型的触发器包括零个、一个或两个输入信号,以及时钟信号和输出信号。一些触发器还包括一个重置当前输出的明确输入信号。第一个电子触发器是在1919年由W.H.EcclesF.W.Jordan发明的。

T触发器(Toggle Flip-Flopor Trigger Flip-Flop)设有一个输入和输出,当时钟频率由0转为1时,如果TQ不相同时,其输出值会是1。输入端T1的时候,输出端的状态Q发生反转;输入端T0的时候,输出端的状态Q保持不变。把JK触发器的JK输入点连接在一起,即构成一个T触发器。

应用场合:时钟有效迟后于数据有效。这意味着数据信号先建立,时钟信号后建立。在CP上升沿时刻打入到寄存器。

1.4.3寄存器

寄存器(register):用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果,它被广泛的用于各类数字系统和计算机中。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。寄存器的存储电路是由锁存器或触发器构成的,因为一个锁存器或触发器能存储1位二进制数,所以由N个锁存器或触发器可以构成N位寄存器。 工程中的寄存器一般按计算机中字节的位数设计,所以一般有8位寄存器、16位寄存器等。

对寄存器中的触发器只要求它们具有置1、置0的功能即可,因而无论是用同步RS结构触发器,还是用主从结构或边沿触发结构的触发器,都可以组成寄存器。一般由D触发器组成,有公共输入/输出使能控制端和时钟,一般把使能控制端作为寄存器电路的选择信号,把时钟控制端作为数据输入控制信号。

寄存器的应用

a)可以完成数据的并串、串并转换;

b)可以用做显示数据锁存器:许多设备需要显示计数器的记数值,以8421BCD码记数,以七段显示器显示,如果记数速度较高,人眼则无法辨认迅速变化的显示字符。在计数器和译码器之间加入一个锁存器,控制数据的显示时间是常用的方法。

c)用作缓冲器;

d)组成计数器:移位寄存器可以组成移位型计数器,如环形或扭环形计数器。

 

2 FPGA/CPLD中的一些设计方法
2.1 FPGA设计中的同步设计

2.1.1同步电路和异步电路的区别是什么?

同步:存储电路中所有触发器时钟输入接同一个时钟源,所有触发器的状态的变化与所加的时钟脉冲信号同步。

异步:电路无统一时钟,触发器的时钟输入与时钟脉冲源相连,状态变化与时钟同步,其他触发器状态变化不同步

2.1.2单个时钟域设计方法

a)所有的数据都要通过组合逻辑和延时单元,典型的延时单元是触发器,这些触发器被一个时钟信号所同步;

b)延时总是由延时单元来控制,而不是由组合逻辑来控制;

c)组合逻辑所产生的信号不能在没有通过一个同步延时单元的情况下反馈回到同一个组合逻辑;

d)时钟信号不能被门控,必须直接到达延时单元的时钟输入端,而不是经过任何组合逻辑;

e)数据信号必须只通向组合逻辑或延时单元的数据输入端。

2.1.3多个时钟域设计方法

把通过两个不同时钟作用区域之间的信号作为异步信号处理

2.2 FPGA设计中的延时电路的产生
在日常的电路设计中,有时候我们需要对信号进行延时处理来适应对外接口的时序关系,最经常也是最典型的情况是做处理机的接口;因为与处理的接口时序关系是异步的,而一个规范的 FPGA 设计应该是尽可能采用同步设计。那么遇到这种情况该如何处理呢?
首先在 FPGA 中要产生延时,信号必须经过一定的物理资源。在硬件描述语言中有关键词 Wait for xx ns,需要说明的是该语法是仅仅用于仿真而不能用于综合的,可综合的延时方法有:

首先说说异步电路的延时实现:异步电路一半是通过加buffer、两级与非门等,但这是不适合同步电路实现延时的。在同步电路中,对于比较大的和特殊要求的延时,一半通过高速时钟产生计数器,通过计数器来控制延时;对于比较小的延时,可以通过触发器打一拍,不过这样只能延迟一个时钟周期。

注意:当使用多级非门的时候综合器往往会将其优化掉, 因为综合器会认为一个信号非两次还是它自己。

2.3系统最高速度计算(最快时钟频率)和流水线设计思想

同步电路的速度是指同步系统时钟的速度,同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间内处理的数据量就愈大。假设Tco是触发器的输入数据被时钟打入到触发器到数据到达触发器输出端的延时时间;Tdelay是组合逻辑的延时;Tsetup是D触发器的建立时间。假设数据已被时钟打入D触发器,那么数据到达第一个触发器的Q输出端需要的延时时间是Tco,经过组合逻辑的延时时间为Tdelay,然后到达第二个触发器的D端,要希望时钟能在第二个触发器再次被稳定地打入触发器,则时钟的延迟必须大于TcoTdelayTsetup,也就是说最小的时钟周期Tmin =TcoTdelayTsetup,即最快的时钟频率Fmax =1/TminFPGA开发软件也是通过这种方法来计算系统最高运行速度Fmax。因为TcoTsetup是由具体的器件工艺决定的,故设计电路时只能改变组合逻辑的延迟时间Tdelay,所以说缩短触发器间组合逻辑的延时时间是提高同步电路速度的关键所在。由于一般同步电路都大于一级锁存,而要使电路稳定工作,时钟周期必须满足最大延时要求。故只有缩短最长延时路径,才能提高电路的工作频率。可以将较大的组合逻辑分解为较小的N块,通过适当的方法平均分配组合逻辑,然后在中间插入触发器,并和原触发器使用相同的时钟,就可以避免在两个触发器之间出现过大的延时,消除速度瓶颈,这样可以提高电路的工作频率。这就是所谓"流水线"技术的基本设计思想,即原设计速度受限部分用一个时钟周期实现,采用流水线技术插入触发器后,可用N个时钟周期实现,因此系统的工作速度可以加快,吞吐量加大。注意,流水线设计会在原数据通路上加入延时,另外硬件面积也会稍有增加。

2.4 FPGA中的时钟设计

无论是用离散逻辑、可编程逻辑,还是用全定制硅器件实现的任何数字设计,为了成功地操作,可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下将导致错误的行为,并且调试困难、花销很大。在设计 FPGA时通常采用几种时钟类型。时钟可分为如下四种类型:全局时钟、门控时钟、多级逻辑时钟和波动式时钟。多时钟系统能够包括上述四种时钟类型的任意组合。
无论采用何种方式,电路中真实的时钟树也无法达到假定的理想时钟, 因此我们必须依据理想时钟, 建立一个实际工作时钟模型来分析电路, 这样才可以使得电路的实际工作效果和预期的一样。 在实际的时钟模型中, 我们要考虑时钟树传播中的偏斜、 跳变和绝对垂直的偏差以及其它一些不确定因素。对于寄存器而言,当时钟工作沿到来时它的数据端应该已经稳定,这样才能保证时钟工作沿采样到数据的正确性, 这段数据的预备时间我们称之为建立时间(setup time)。数据同样应该在时钟工作沿过去后保持一段时间,这段时间称为保持时间(hold time)。因此具体的时钟如图 5 所示。 其中网络延迟是指时钟的传播延时以及因为跳变不垂直等效的偏差, 在此基础上考虑一些不确定因素实际的工作时钟沿如图中所示。 保持时间(hold)和建立时间
setup)都是相对于实际时钟跳变而言的。因此在确定电路时序时,必须要考虑到这些因素,使得建立时间和保持时间符合要求。

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

 5 工作时钟模型

为了使电路正常工作,建立时间和保持时间应该分别满足:
thold +tskew < tclock _Q _ min + tlogic _min

tclock > tclock _Q _ max + tlogic _ max + tsetup + tskew

其中tclock_Q_max是时钟沿变化到数据输出端变化的最慢变化情况, tlogic_max是寄存器间组合逻辑的最大可能延迟, tclock_Q_min和tlogic_min表示最快情况。在考虑建立保持时间时,应该考虑时钟树向后偏斜的情况,在考虑建立时间时应该考虑时钟树向前偏斜的情况。在进行后仿真时,最大延迟用来检查建立时间,最小延时用来检查保持时间。

2.6.1 全局时钟
对于一个设计项目来说,全局时钟(或同步时钟)是最简单和最可预测的时钟。在
FPGA 设计中最好的时钟方案是:由专用的全局时钟输入引脚驱动的单个主时钟去钟控
设计项目中的每一个触发器。只要可能就应尽量在设计项目中采用全局时钟。FPGA 都
具有专门的全局时钟引脚,它直接连到器件中的每一个寄存器。这种全局时钟提供器件中最短的时钟到输出的延时。
 1 定时波形示出触发器的数据输入 D[1..3]应遵守建立时间和保持时间的约束条件。建立和保持时间的数值在FPGA数据手册中给出,也可用软件的定时分析器计算出来。如果在应用中不能满足建立和保持时间的要求,则必须用时钟同步输入信号

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

 1全局时钟

2.6.2 门控时钟
在许多应用中,整个设计项目都采用外部的全局时钟是不可能或不实际的。FPGA 具有乘积项逻辑阵列时钟(即时钟是由逻辑产生的),允许任意函数单独地钟控各个触发器。然而,当你用阵列时钟时,应仔细地分析时钟函数,以避免毛刺。
通常用阵列时钟构成门控时钟。门控时钟常常同微处理器接口有关,用地址线去控制写脉冲。然而,每当用组合函数钟控触发器时,通常都存在着门控时钟。如果符合下述条件,门控时钟可以象全局时钟一样可靠地工作:

a)驱动时钟的逻辑必须只包含一个“ 与”门或一个“或”门。如果采用任何附加逻在某些工作状态下,会出现竞争产生的毛刺。

b)逻辑门的一个输入作为实际的时钟,而该逻辑门的所有其它输入必须当成地址或
控制线,它们遵守相对于时钟的建立和保持时间的约束。

2.6.3 多级逻辑时钟
当产生门控时钟的组合逻辑超过一级(即超过单个的“与”门或“或”门)时,证设计项目的可靠性变得很困难。即使样机或仿真结果没有显示出静态险象,但实际上仍然可能存在着危险。通常,我们不应该用多级组合逻辑去钟控FPGA设计中的触发器。
 7 给出一个含有险象的多级时钟的例子。时钟是由 SEL 引脚控制的多路选择器输出的。多路选择器的输入是时钟(CLK)和该时钟的 2 分频(DIV2)。 由图 7 的定时波形图看出, 在两个时钟均为逻辑 1 的情况下,当 SEL 线的状态改变时,存在静态险象。险象的程度取决于工作的条件。 多级逻辑的险象是可以去除的。 例如, 你可以插入“冗余逻辑”到设计项目中。然而,PLD/FPGA 编译器在逻辑综合时会去掉这些冗余逻辑,使得验证险象是否真正被去除变得困难了。为此,必须应寻求其它方法来实现电路的功能。

建立保持时间、毛刺、异步复位同步释放、锁存器、触发器和寄存器、跨时钟处理以及时钟设计 

 7 有静态险象的多级时钟

2.6.4行波时钟
另一种流行的时钟电路是采用行波时钟,即一个触发器的输出用作另一个触发器的时钟输入。如果仔细地设计,行波时钟可以象全局时钟一样地可靠工作。然而,行波时钟使得与电路有关的定时计算变得很复杂。行波时钟在行波链上各触发器的时钟之间产生较大的时间偏移,并且会超出最坏情况下的建立时间、保持时间和电路中时钟到输出的延时,使系统的实际速度下降。
用计数翻转型触发器构成异步计数器时常采用行波时钟,一个触发器的输出钟控下一
个触发器的输入,参看图 9同步计数器通常是代替异步计数器的更好方案,这是因为两者需要同样多的宏单元而同步计数器有较快的时钟到输出的时间。 图 10 给出具有全局时钟的同步计数器, 它和 图 9功能相同,用了同样多的逻辑单元实现, 却有较快的时钟到输出的时间。几乎所有 FPGA开发软件都提供多种多样的同步计数器。