低功耗设计——门控时钟

1. 前言

        芯片功耗组成中,有高达40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。此外,即使输入和输出保持不变,接收时钟的触发器也会消耗一定的功耗。而且这些功耗主要是动态功耗。

        那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。(电路图中看到的CG cell就是门控时钟了)。

2. 门控时钟的结构

2.1 与门门控

        如果让我们设计一个门控时钟的电路,我们会怎么设计呢?最直接的方法,不需要时钟的时候关掉时钟,这就是与操作,我们只需要把enable和CLK进行“与”操作不就行了么,电路图如下:

        这种直接将控制EN信号和时钟CLK进行与操作完成门控的方式,可以完成EN为0时,时钟被关掉。但是同时带来另外一个很大的问题:毛刺。

        如上图所示,EN是不受控制的,随时可能跳变,这样纯组合输出GCLK就完全可能会有毛刺产生。时钟信号上产生毛刺是很危险的。实际中,这种直接与门的方式基本不会被采样。所以我们需要改进电路,为了使门控时钟不产生毛刺,我们必须对EN信号进行处理,使其在CLK的高低电平期间保持不变,或者说EN的变化就是以CLK为基准的。

  1. 很自然的我们会想到触发器,只要把EN用CLK寄存一下,那么输出就是以CLK为基准的;
  2. 其实还有一种办法是锁存器,把EN用锁存器锁存的输出,也是以CLK为基准的。

2.2 锁存门控

        我们先看一下第二种电路,增加锁存器的电路和对应的时序如下:

        该方法的原理在于:锁存器在CLK为

### 插入式门控时钟设计方法 在数字电路设计中,插入式门控时钟是一种有效的技术,用于通过减少不必要的时钟切换来降低动态功耗。这种方法广泛应用于FPGA和ASIC设计中,并可以通过硬件描述语言(如Verilog或VHDL)实现。 #### 功耗分析与门控时钟的作用 动态功耗主要由电容充放电引起,与时钟频率成正比[^1]。因此,在不改变功能的前提下关闭某些模块的时钟信号可以显著节省能量消耗。然而需要注意的是,不当使用门控时钟可能导致毛刺(glitch),进而影响系统的稳定性[^2]。 #### 设计原则 对于任何类型的集成电路(FPGAs 或 ASICS), 实现高效的门控时钟需遵循几个基本原则: - **同步控制信号**: 所有使能/禁用操作应基于全局同步机制完成, 防止异步事件引发竞争条件(race condition)[^3]. - **最小化逻辑路径延迟差异**: 确保经过门控后的时钟树结构保持平衡状态, 减少因额外组合逻辑引入的时间偏移(skew)[^4]. #### Verilog中的实现方式 下面展示了一个简单的例子说明如何利用D触发器构建基本形式的门控单元: ```verilog module gated_clock ( input wire clk, input wire enable, output reg gclk ); always @(posedge clk or negedge enable) begin : proc_gated_clk if (!enable) gclk <= 1'b0; else gclk <= clk; end endmodule ``` 上述代码片段定义了一种基础架构,其中`gclk`仅当`enable`有效时才跟随原始输入时钟变化;反之则固定为低电平[^5]。 #### VHDL中的实现方式 同样地,也可以采用VHDL编写类似的组件如下所示: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Gated_Clock is Port ( Clk : in std_logic; Enable : in std_logic; GClock : out std_logic); end Gated_Clock ; architecture Behavioral of Gated_Clock is signal tempClk :std_logic := '0'; begin process(Clk ,Enable ) begin if(Enable='0')then -- Disable Condition tempClk<='0'; elsif rising_edge(clk ) then-- Clock Edge Detection tempClk<=not(tempClk ); end if ; end process ; Gclock<=TempClk when(enable ='1' )else '0'; end Behavioral ; ``` 此版本提供了另一种视角看待相同概念——即每当允许位处于激活状态下翻转内部临时变量(`tempClk`)直至再次被抑制为止[^6]。 #### 考虑事项 尽管如此简单直接的方式能够满足许多实际需求,但在更复杂场景下还需考虑更多因素比如但不限于测试模式支持、复位行为一致性以及潜在亚稳态风险等问题[^7]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值