本章将讨论FPGA设计中的能耗问题。
相较于相同逻辑功能的ASIC,FPGA这个耗能大户似乎与低功耗设计不沾边。各大厂家也意识到了这一点,陆续推出了多款低功耗CPLD来作为替代。但CPLD的资源有限,限制了它的应用场景。
如今的逻辑器件大多基于CMOS技术,动态功耗取决于栅极和走线上寄生电容的充放电,其计算公式如下:
其中,I代表电流,V是电压,C使寄生电容大小,f是频率。
所以,降低功耗需要从后面三个参数下手。对于FPGA来讲,V使固定的,除非器件,逻辑设计中无法修改;C取决于逻辑中翻转的门的数量以及走线长度;f与时钟频率直接相关。所有的低功耗设计最终都归结为C与f的优化。
在本章中,将重点就一下几点展开讨论:
1)时钟控制对动态功耗的影响及其引起的问题;
2)输入控制;
3)核心电压影响;
4)双边触发器设计指南;
5)减少静态功耗。
通过最小化高翻转率网络的布线长度来降低动态功耗需要对布局和布线进行背景讨论,因此在第 15 章布局规划中进行了讨论。
3.1 时钟控制
在同步设计中,最有效且目前应用最广泛的低功耗设计方法便是时钟控制——动态地禁止时钟在特定区域翻转。在FPGA中常用的实现方法包括使用触发器上的时钟使能引脚或者全局时钟mux(BUFGMUX for Xilinx)。
可是,门控时钟虽然可以有效地降低动态功耗,但是这会在电路实现和时序分析中造成困难。
相较于ASIC,系统时钟对FPGA要重要的多。EDA工具正是依据系统时钟进行优化、综合、布局布线、STA等任务。ASIC可以自定义实现low-skew时钟树,而FPGA则需要在既有资源上进行设计。
门控时钟所在区域相当于一个新的时钟域,而我们希望的则是时钟域越少越好。
时钟偏移(skew)是时序分析中的重要概念。各家的FPGA都有相应的时钟缓冲技术来保证系统时钟到各单元的skew尽可能小,也正因此原因,FPGA上几乎很少关心hold-violation问题。但是门控时钟会将系统时钟从专用时钟资源中引入普通逻辑资源,增加clk skew,可能造成hold-violation。
不同的综合工具对这种情况有不同的应对策略。Synplify会默认移除门控时钟,来保证时序健康;其他厂家工具则会忽略门控时钟,按照系统时钟去处理,除非进行了专门的约束(工具会在data信号线上加上一定delay)。
3.2 输入控制
基于CMOS技术的FPGA还有一种经常被忽视的低功耗技术——降低压摆率。理想的状态是截止区和线性区可以瞬间切换,但在实际系统中,则必须考虑状态转换的时间和晶体管在转换期间的行为。(一顿分析,不是很懂,此处略过,直接上结论)。
所以,为了最大限度的降低输入设备的功耗,应尽量减少驱动输入的上升和下降时间。
另外,由于引脚悬空状态下的状态不定,可能会处于饱和区的亚稳态点,对功耗产生灾难性后果。所以,不要让FPGA的输入缓冲悬空。(多数厂家工具会对未定义引脚有一个默认端接,当然也可修改端接来配合信号完整性啥的)
3.3 降低核心供电
通常情况下我们不希望把降压作为降低功耗的一个方式,因为电压降低也意味着性能降低,使得我们在进行时序分析的时候要从最坏的情况考虑。
此外,FPGA的核心电压值一般为指定值的5%~10%,所以我们在操作的时候要万分小心,确保在合法范围内。
3.4 双沿触发FF
动态功耗与信号翻转的频率成正比,因此我们希望大扇出的信号的的信号效率越高越好,而最大扇出的信号正式系统时钟。双沿触发器在原理上可以系统时钟工作效率提高一倍。
但需要注意的是,需要确保所用的器件支持双沿触发器,否则便会生成额外的逻辑来模仿双沿功能呢,得不偿失。
3.5 修改端接
连接到输出引脚的电阻负载在具有总线信号、开漏输出或需要端接的传输线的系统中很常见。在这些情况下,FPGA 输出驱动器上的一个 CMOS 晶体管将需要通过这些电阻负载提供或吸收电流。
对于需要上拉电阻的输出,计算可接受的最小上升时间以尽可能大地调整电阻。
如果有高侧驱动器和低侧驱动器,请确保永远不会发生总线争用,因为这会消耗过多的电流,即使一次只有几纳秒。
对于负载处带有并联端接的传输线,根据系统的要求,可以使用串联端接作为替代,因为串联终端没有稳态电流耗散。
虽然串联终端没有稳态电流耗散,但也有缺点:
- 从负载到终端电阻的初始反射
- 转换期间通过串联电阻的少量衰减
如果给定系统可以接受这些性能特征,则串联端接方法将通过端接电阻消除静态功耗。