1.什么是门控时钟?
为时钟输入增加一个使能信号en.
1.1为什么使用时钟门控?
时钟树由大量的缓冲器和反相器组成,时钟信号是设计中翻转率最高的信号,时钟树的功耗可能高达整个设计的30%。
当数据无效时,将寄存器的时钟关闭,也就是加入门控时钟电路,可以减少时钟树开关行为,从而节省系统的动态功耗。同时,由于减少了时钟引脚的开关行为,寄存器的内部功耗也减少了。
采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。
1.2什么情况下使用门控时钟电路?
时钟门控通过在电路中增加额外的逻辑单元,优化时钟树结构减少功耗。由于门控时钟逻辑具有一定的开销,因此,数据宽度过小不适合做Clock Gating。一般情况下,数据宽度大于8比特时间、、建议采用门控时钟。
2.时钟门控怎么实现
2.1一般来讲将系统时钟和使能信号en进行与逻辑
![](https://i-blog.csdnimg.cn/blog_migrate/698d7103c4144f33bb548daf137f903c.png)
缺点:
1.en信号不受控制,随时可能发生信号跳变,未经过时钟同步,和clk信号直接相与容易产生毛刺
2.时钟clk为高电平时,en信号的毛刺会传播到时钟信号GCLK中。
![](https://i-blog.csdnimg.cn/blog_migrate/e871ab52e02c006e0587350b468e5642.png#pic_center)
如图所示,这种直接将控制en信号和时钟CLK进行操作完成门控的方式,可以完成en为0时,时钟被关掉。但同时带来的问题是毛刺。
解决思路:通过寄存器或触发器同步en信号,且clk为高电平时,寄存器或触发器的输出不变化。
2.2采用锁存器同步en信号
![](https://i-blog.csdnimg.cn/blog_migrate/d26d2c27c90226f3bc68fa8d28bbfcac.png)
我的理解是当en 为1时,clk为0时,锁存器联通 ,但是与逻辑后gclk输出为0,当clk为1时,锁存器所存,Q端仍是1,clk是1,与逻辑后是1,然后输出就是时钟,无毛刺。
当en为0,clk为0,与逻辑后是0,clk为1后,Q端锁存的是0,与逻辑后仍是0,此时通过en控制了时钟。
注意:en由0拉高到1,需得经历一次时钟低位,才能把1,锁存再q端,下次clk为1时才可以输出时钟波形。
所以使用Latch可以有效地锁存clk_en值,同时不影响clk的周期性
基于锁存器的门控时钟Verilog代码
测试代码
波形图
不过需要注意的是,如果在电路中,锁存器与与门相隔很远,到达锁存器的时钟与到达与门的时钟有较大的延迟差别,则仍会出现毛刺,下面就来分析一下:
上述的右上图中,B点的时钟比A时钟迟到,并且Skew > delay,这种情况下,产生了毛刺。为了消除毛刺,要控制Clock Skew,使它满足Skew >Latch delay(也就是锁存器的clk-q的延时)。上述的右下图中,B点的时钟比A时钟早到,并且|Skew| > ENsetup 一 (D->Q),这种情况下,也产生了毛刺。为了消除毛刺,要控制Clock Skew,使它满足|Skew|< ENsetup一(D->Q)。
常见的是第一种毛刺,不过我们可以将这个逻辑做成一个单元,这样就基本上能消除上面的那两种毛刺了,即:
常情况下,时钟树由大量的缓冲器和反相器组成,时钟信号为设计中翻转率最高的信号,时钟树的功耗可能高达整个设计功耗30%。加入门控时钟电路后,由于减少了时钟树的开关行为,节省了开关功耗。同时,由于减少了时钟引脚的开关行为,寄存器的内部功耗也减少了。采用门控时钟,可以非常有效地降低设计的功耗,一般情况下能够节省20%~60%的功耗。
此外,由于门控时钟不需要用到MUX单元,加入门控时钟电路后,设计的面积也减少了。门控时钟电路的扇出越大,减低功耗和面积的效能越好。当然,扇出太大了,又会产生时序等的问题。
门控时钟电路非常容易实现,用工具自动插入门控时钟,不需要修改RTL代码,门控时钟与工艺无关。
3.基于寄存器的门控时钟
使用寄存器,只要把en信号用sclk寄存一下,那么输出就是以sclk为基准的了。RTL代码如下所示:
//--------------------------
module test(
input wire sclk ,
input wire rst_n ,
input wire en ,
output wire clk_en
);
reg enl;
always@(posedge sclk ornegedge rst_n)
if(rst_n ==1'b0)
enl <=1'b0;
else
enl <= en;
assign clk_en = sclk & enl;
endmodule
//--------------------
我们查看仿真波形发现已经没有毛刺了。
分析:由于 DFF 输出会 delay 一个周期,所以除非 到达与门的CLK 上升沿提前 到达寄存器的CLK 很多,快半个周期,才会出现毛刺,而这种情况一般很难发生。但是,这种情况 到达与门的CLK 比到达寄存器的CLK 迟到,是不会出现毛刺的。
当然,如果第一个 D 触发器不能满足 setup 时间,还是有可能产生亚稳态
4.适用于FPGA的门控时钟设计
即便是没有了毛刺门控时钟还是会给设计带来一些负面影响,一个不可忽略的影响是综合工具并不会对门控时钟插入BUFG(全局时钟缓冲器),这就意味着该时钟会占用传统的布线资源,也就是Fabric中的布线资源,而不会使用时钟网络资源,从而可能会跟其他关键路径争夺布线资源,并影响时序。在Vivado工具中,有一个专门用于管理门控时钟的综合优化选项-gated_cLock_conversion,将其打开,就可以将门控时钟信号变为使能信号,其默认情况下是关闭的。
上面介绍的基于锁存器的门控时钟实际上更适合在ASIC中实现,一方面FPGA中没有专门的锁存器资源,需要利用其中的组合逻辑资源外加寄存器来等效地实现,不经济;另一方面,锁存器本身的特性没法进行静态时序分析,出问题了不易排查。
真正适合在FPGA中实现的是基于寄存器的门控时钟,如下图所示。
前段使用加法器产生计数值,通过比较器产生使能信号,送入使能寄存器。值得注意的是,前端产生使能逻辑时序元件是上升沿触发,而使能寄存器是下降沿触发。如此一来,同样需要满足产生使能信号的组合逻辑简单这一前提要求(半周期内达到en寄存器的建立时间)。好处在于,AND门时时刻刻都只有一个输入在变,不容易产生毛刺。时序图如下:
前段使用加法器产生计数值,通过比较器产生使能信号,送入使能寄存器。值得注意的是,前端产生使能逻辑时序元件是上升沿触发,而使能寄存器是下降沿触发。如此一来,同样需要满足产生使能信号的组合逻辑简单这一前提要求(半周期内达到en寄存器的建立时间)。好处在于,AND门时时刻刻都只有一个输入在变,不容易产生毛刺。时序图如下:
为了便于理解,此处给出若使能寄存器也是上升沿触发的时序图:
可见,AND门变化时两个个输入在变,容易产生毛刺。
总结
SOC 芯片设计中使用最多的是锁存结构的门控时钟:
原因:在实际的 SOC 芯片中,要使用大量的门控时钟单元。所以通常会把门控时钟做出一个标准单元,有工艺厂商提供。那么锁存器结构中线延时带来的问题就不存在了,因为是做成一个单元,线延时是可控和不变的。而且也可以通过挑选锁存器和增加延时,总是能满足锁存器的建立时间,这样通过工艺厂预先把门控时钟做出标准单元,这些问题都解决了。
不用寄存门控时钟的原因:
那么用寄存器结构也可以达到这种效果,为什么不用寄存器结构呢?那是因为面积!一个
DFF 是由两个 D 锁存器组成的,采样 D 锁存器组成门控时钟单元,可以节省一个锁存器的
面积。当大量的门控时钟插入到 SOC 芯片中时,这个节省的面积就相当可观了。所谓门控时钟就是指连接触发器时钟端来自于组合逻辑,凡是组合逻辑在布局布线之后肯定会产生毛刺,而如果采用这种有毛刺的信号来作为时钟使用的话将会出现功能上的错误。
转载:1.门控时钟介绍_狮子座硅农(Leo ICer)的博客-CSDN博客
2.FPGA设计之门控时钟_fpga 门控时钟_吉大秦少游的博客-CSDN博客 3. 【转载】门控时钟的一些基本概念_门控时钟电路_芯语新源的博客-CSDN博客 4. 时钟门控电路_星河带悦流的博客-CSDN博客