欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Verilog 访谈录 [2]- 构建和保持时间、触发器、可替代性 ★

最编程 2024-06-13 20:28:22
...

by yang

最近准备数字IC岗时复习整理的知识点,参考了比较火的fpga面试题,和一些相关知识。主要是写着自己看着方便的,有很多不严谨的地方,有些地方有参考链接,那些博客写的都很好。

Part.2

建立时间与保持时间、触发器、亚稳态 ★
1:锁存器(latch)、触发器(flip-flop)、 寄存器(Register)的区别?
2:建立时间与保持时间的概念? ★
3:为什么触发器要满足建立时间和保持时间?
4:经典例题 ★
5:如何计算周期 T 与设计频率(最大频率)Fmax?
6:建立时间,保持时间不满足怎么处理?
7:什么是亚稳态?
8:有关两级触发器进行异步时钟域同步
9:如何防止亚稳态?
例:异步信号同步提取边沿:2级或4级寄存器,消除亚稳态
例:异步复位与同步复位:★


1:锁存器(latch)、触发器(flip-flop)、 寄存器(Register)的区别?

首先要知道什么是触发器FF

  • 锁存器电平触发。用于不同时钟之间的信号同步。OUT ≈ EN ? IN : no changelatch只要输入信号电平变化,输出就会按照一定逻辑变化(D锁存器输出对输入是透明的)。latch属于异步电路设计,往往会导致时序分析困难,容易引入竞争,不适当的应用latch会大量浪费芯片资源。

  • 触发器边沿触发。简称FF,双稳态触发器。可以理解为是两个不同电平敏感的锁存器串连而成。前一个锁存器决定了触发器的建立时间,后一个锁存器则决定了保持时间。

    latch.png

  • 寄存器通常是指能够用来存储一组二进制代码的同步时序逻辑电路,Flip-flop是register的基本构成单位(一个触发器存一位数据)。register 在同一时钟边沿触发下动作,符合同步电路的设计思想。图为4位寄存器电路结构。

    寄存器.png

    应避免使用锁存器,尽量使用触发器的原因:
    1、latch容易产生毛刺,对输入电平敏感,受布线延迟影响大
    2、在FPGA的资源中没有标准latch,但有FF,所以需要用一个逻辑门和ff来组成锁存器,这样就浪费了资源。
    3、latch会让时序十分复杂。没有时钟端

如何避免偶然生成锁存器?如果有的输入没有对应明确的输出,系统会综合出latch。比如没有写else,没有写default。还可以用fullcase语句等等。

always@( a or b)        //【锁存器】
    begin
        if(a==1)        //缺少else语句
        y = b;
      end
----
always@( posedge clk )  //【触发器】
    begin
        if(a==1)
        y = b;
    end
避免锁存.png

PS:不支持always的边沿触发和条件触发同时用,就是说不能一个是always @(a, negedge b)

2:建立时间与保持时间的概念? ★

电路设计的难点在时序设计,时序设计的实质就是满足每一个触发器的建立/保持时间的要求。(是相对时钟的概念)

  • 建立时间(setup time):触发器在时钟上升沿到来之前,其数据输入端的数据必须保持不变的时间。如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;
  • 保持时间(hold time):触发器在时钟上升沿到来之后,其数据输入端的数据必须保持不变的时间。如果保持时间不够,数据同样不能被打入触发器。


    保持时间.png
3:为什么触发器要满足建立时间和保持时间?

从物理层面来讲,需要建立时间是因为触发器的D端像一个锁存器在接受数据,前级门的状态需要一段稳定时间;需要保持时间是因为在时钟沿到来之后,触发器要通过反馈来锁存状态,从后级门传到前级门需要时间。

从后果层面讲,如果不满足建立和保持时间,触发器将进入亚稳态,而且0-1中间电压会使亚稳态向后级电路传播。

4:经典例题 ★

经典例题1:时钟周期为T,触发器D1的时钟沿到来.至触发器输出Q变化的时间Tco(CLK-Q)最大为T1max,最小为T1min,逻辑组合电路的延迟时间最大为T2max,最小为T2min,问:触发器D2的建立时间和保持时间应满足什么条件?

华为题.png
T3 setup < T - T1max - T2max
T3 hold  < T1min + T2min

D2的建立时间应该满足: Tco + T2+ T3 setup < T;
D2的保持时间——在时钟沿到来后,D2 in保持旧数据不变的时间,所以时钟到来后(T1+T2)时,D2 in发生变化,T1+T2 应该必须大于D2hold。

经典例题2:已知reg的setup,hold时间,求中间组合逻辑的delay范围?

   Delay < period - setup – hold
5:如何计算周期 T 与设计频率(最大频率)Fmax?

周期约束是一个基本时序和综合约束,它附加在时钟网线上,时序分析工具根据PERIOD约束检查时钟域内所有同步元件的时序是否满足要求。


时钟周期.png

时钟的最小周期为:

TCLK = TCKO + TLOGIC + TNET + TSU-TCLK_SKEW
TCLK_SKEW = TCD2 -TCD1
Fmax = 1/ TCLK;

其中TCKO为触发器输出时间,TLOGIC为同步元件之间的组合逻辑延迟,TNET为布线延迟,TSU为同步元件的建立时间,TCLK_SKEW为时钟信号TCD2和TCD1延迟的差别。

6:建立时间,保持时间不满足怎么处理?

1,降低时钟频率; 2,更换更好器件
Setup time不满足:减少组合逻辑时间,或分开做成流水线
Hold time 不满足:好像没办法

7:什么是亚稳态?

亚稳态是指触发器无法在某个规定的时间段内到达一个可以确认的状态。
进入亚稳态后触发器的输出将不稳定,在0和1之间乱飘,这时需要经过一个恢复时间(决断时间Tmet),其输出才能稳定,但稳定后的值是随机的,与输入无关。而只要有异步设计,亚稳态就是无法避免的。

亚稳态.png

这就是为什么要用两级触发器来同步异步输入信号
使用两级触发器来使异步电路同步化的电路其实叫做“一步同位器”,但只能用来对一位异步信号进行同步。

8:有关两级触发器进行异步时钟域同步

两级触发器可防止亚稳态传播的原理:

一位同步器.png

假设第一级触发器的输入不满足其建立保持时间,它在第一个脉冲沿到来后输出的数据就为亚稳态,那么在下一个脉冲沿到来之前,其输出的亚稳态数据在一段恢复时间后必须稳定下来,而且稳定的数据必须满足第二级触发器的建立时间,如果都满足了,在下一个脉冲沿到来时,第二级触发器将不会出现亚稳态,因为其输入端的数据满足其建立保持时间。同步器有效的条件:第一级触发器进入亚稳态后的恢复时间 + 第二级触发器的建立时间 < = 时钟周期。
更确切地说,输入脉冲宽度必须大于同步时钟周期与第一级触发器所需的保持时间之和。最保险的脉冲宽度是两倍同步时钟周期。所以,这样的同步电路对于从较慢的时钟域来的异步信号进入较快的时钟域比较有效,对于进入一个较慢的时钟域,可能根本采不到异步信号。
但是一级FF稳定后的out是随机的,到第二级FF后大概率没有亚稳态了,但是得到的数据0/1都有可能,仅适用于对错误不敏感的地方。对于敏感的电路,可以采用双口RAN或FIFO同步。

亚稳态处理

9:如何防止亚稳态?
  1. 降低系统时钟频率,增大T
  2. 用反应更快的FF(Tsu和Th更小)
  3. 改善时钟质量,用边沿变化快速的时钟信号
    消除:
  4. 异步输入采样2次以上再给内部模块使用(最简单可靠的一位同步器)
  5. 用FIFO对跨时钟域数据进行缓冲设计
  6. 复位电路采用异步复位,同步释放处理
例:异步信号同步提取边沿:2级或4级寄存器,消除亚稳态

在进行异步信号跨频提取边沿时候,一般采用多进行一级寄存器消除亚稳态,可能在系统稳定性要求高的情况下,采用更多级寄存器来消除亚稳态,如下例,即为采用4级寄存器消除亚稳态,相应的边沿信号产生的时间就晚了两个时钟周期。提取上升沿。

input      sig_nsyn;
wire       sig_nsyn_p;
reg[3:0]   sig_nsyn_r;      //or [1:0]
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n) sig_nsyn_r <= 2'd0;
    ---------------------------------------------------------//2级寄存器
    else       sig_nsyn_r <= { sig_nsyn_r [0], sig_nsyn };
    ---------------------------------------------------------//4级寄存器
    else       sig_nsyn_r <= { sig_nsyn_r [2:0], sig_nsyn };    
end

assign     sig_nsyn_p = sig_nsyn_r[0] & ~sig_nsyn_r[1];
assign     sig_nsyn_p = sig_nsyn_r[2] & ~sig_nsyn_r[3];         //4级寄存器
例:异步复位与同步复位:★

同步复位: 必须保证复位电平维持时间大于clk间隔时间

always @(posedge clk)
    begin
       if(!rst_n) a <= 1'b0;
       else       a <= b;
    end

异步复位:需要同步释放。采用第二级寄存器输出作为全局复位信号输出。always @ (posedge clk or negedge reset)

wire        sys_rst_n;  
reg [1:0]   rst_r;  

always @(posedge clk or negedge rst_n)  
begin   
    if(!rst_n)  rst_r <= 2'd0;
    else        rst_r <= {rst_r[0], 1'b1};  
end
assign  sys_rst_n = rst_r[1];

参考博客