时钟与复位信号设计方案

描述

01时钟方案

1、避免内部产生时钟

我们设计时要尽可能避免在内部产生时钟,如果操作不当,会导致设计功能和时序问题。总而言之,尽量在代码中避免操作时钟。

组合逻辑搭建的时钟会引入毛刺,使功能出现问题,数据输入有毛刺会被过滤,但是时钟端毛刺会有明显问题。如图所示为组合逻辑产生的时钟效果。

复位信号

解决办法:在组合逻辑产生的时钟后面加入一个寄存器,用寄存器输入作为后续的时钟输入。但是由于组合逻辑会增加时钟线上的延迟,在一些情况下,逻辑延迟会导致时钟偏移比两个寄存器之间的数据延迟大。这样会违背寄存器的时序要求。

复位信号

2、分频时钟

在设计中尽量保证所需的时钟来自PLL。若要对主时钟进行分频时,始终使用同步计数器或者状态机。产生输出时钟时用寄存器进行输出,而不应该用组合逻辑。

3、多路时钟复用

多路时钟复用器,可以使同一个逻辑拥有不同的时钟。前提是得满足以下标准:

  • 在初始化配置后,时钟多路逻辑就不再改变;
  • 在测试时,设计会绕过功能时钟多路逻辑而选择普通时钟;
  • 在时钟切换时,寄存器始终处于复位状态;
  • 在时钟切换时产生的短暂错误响应没有负面影响

复位信号

4、门控时钟

门控时钟使用使能信号开关时钟,实现对某些门控电路的控制。在时钟关闭时,对应的时钟域的寄存器就会停止翻转。所以门控时钟时减少功耗的有效手段之一。

复位信号

显而易见,这种方式并不是同步设计,会导致时钟偏移以及毛刺现象。下图是同步时钟门控使能,不过此种方式由于时钟一直在不停的驱动,虽然后面寄存器输出保持不变,却并没有停止工作,因此不能达到降低功耗的作用。

复位信号

那有没有既满足同步要求又降低功耗的设计呢?

首先需要知道功耗到底耗在哪。传统的同步设计中,系统时钟连接到每个寄存器的时钟端,这使得功耗主要由三个部分组成:

  1. 在时钟沿变化的组合逻辑所产生的的功耗
  2. 由触发器产生的功耗
  3. 设计中时钟树产生的功耗

时钟门控能够大幅降低触发器的功耗,时钟门控可以存在于时钟树的根部、末端或者两者之间任何位置。由于 时钟树几乎消耗了整个芯片功耗的50% ,因此最好始终在根部产生或者关闭时钟。

基于锁存器的门控时钟电路是在上述门控时钟电路中加入一个电平敏感时钟的锁存。其只需要保证EN信号在时钟上升沿附近稳定不变就可以。如此就可以保证输出不含任何毛刺与尖峰脉冲。

复位信号

为了保证较高的生产缺陷覆盖率,有必要保证在插入扫描链时门控时钟电路是完全可控和可观察的。加入Test控制信号,使得测试状态下不管使能值是多少都能被时钟驱动。大多数ASIC生产商都提供“门控时钟单元”作为标准单元库的一部分。

复位信号

02复位信号设计方案

复位的基本目的是使SoC进入一个能进行稳定操作的确定状态 。好的设计会在系统没有明确要求的情况下为SoC的每个触发器都提供复位信号。但是在某些情况下,当流水线的寄存器在高速应用中使用时,应该去掉某些寄存器的复位信号以使设计达到更高的性能。

1、同步复位和异步复位

同步复位: 复位信号只有在时钟的有效沿到来时才能影响或者复位触发器的状态。

同步复位的优点:

1)同步复位一般能确保电路100%同步;

2)同步复位会综合为更小的触发器;

3)同步复位确保复位只发生在有效时钟沿,可过滤毛刺。

同步复位缺点:

1)同步复位可能需要一定长度的脉宽,保证时钟有效沿附近复位信号有效;

2)复位信号可能经过多级组合逻辑,会存在潜在问题;

3)复位电路需要复位时钟,门控时钟电路中,可能因为时钟无效导致复位无效。

异步复位: 复位触发器在设计时加入了一个复位引脚,通过复位信号直接控制。

异步复位优点:

1)保证数据路径上的整洁干净;

2)不管有没有时钟都可以复位。

异步复位缺点:

1)异步复位信号不一定可以被I/O口直接驱动;

2)异步复位为异步过程,撤销异步信号时,若刚好处于时钟有效沿,会使电路进入亚稳态;

3)板机系统或者其他造成的噪声毛刺引起伪复位。

2、常用的解决方案:异步复位,同步释放。

所谓异步复位同步释放,是指复位信号到来时不受时钟信号的同步,复位信号释放时需要进行时钟信号的同步。

复位信号

上图清楚地展示了异步复位和同步释放两个阶段。

异步复位阶段:当rst_async_n有效时,此时第二个D触发器的输出rst_sync_n立即置为低电平,实现异步复位。

同步释放阶段:假设rst_async_n在clk的上升沿时撤除,那么第一级触发器处于亚稳态,但是由于两级触发器的缓冲作用,第二级触发器的输入为clk到来前第一级触发器的输出,即为低电平。因此,此时第二级触发器的输出一定是稳定的低电平,方框左中触发器仍然处于复位状态。在下一个clk到来时,第一级触发器的输出已经是稳定的高电平了,故rst_sync_n已经是稳定的高电平,此时复位释放,实现同步释放。

代码示例:

always@(posedge clk, negedge rst_async_n)begin
    if (!rst_async_n) begin   
        rst_s1 <= 1'b0;  
        rst_s2 <= 1'b0;  
    end  
    else begin  
        rst_s1 <= 1'b1;  
        rst_s2 <= rst_s1;  
    end
end

assign rst_sync_n = rst_s2;

rst_async_n=0时,rst_sync_n会被立即复位为0,输出到后续电路用于异步复位;rst_async_n=1时,假设此时恰好在时钟沿附近,会造成recovery或者removal的违例,但经过DFF1和DFF2的两级同步,rst_sync_n释放沿与时钟沿同步,送入到后续电路不会再有recovery和removal违例出现。

可以看到,异步复位、同步释放其最显著特征是既保留了异步复位的功能,又避免了异步复位释放时所面临的recovery或者removal违例问题。

03小结

本文简单介绍了在ASIC设计中常用的时钟方案选择和处理复位信号时的方案选择。时钟设计上,应尽可能避免通过内部逻辑产生时钟,需要多个时钟域时可以选择用PLL产生分频时钟。需要考虑功耗的情况下可以选择带锁存器的门控时钟来降低功耗。在处理复位信号时,一般采用异步复位、同步释放的方法,既保留异步复位的功能,又避免了复位信号释放时的恢复时间和去除时间违例问题。

在后续的文章中,面对时钟,还将介绍更为复杂棘手的多时钟切换问题。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分