问题描述
在做一些项目的时候,拿到算法模型之后,开始进行FPGA代码的实现,在最开始的实现过程中,由于缺乏经验,往往只考虑实现功能,在资源的使用上不够“抠”,耗费了大量的LUT、FF、RAM、BUFG、DSP等各种资源,造成的后果:
1,资源使用超标,超过FPGA芯片资源总量,无法编译通过;
2,资源使用过量,使得资源余量较低,布局布线困难,容易产生时序问题;
3,资源使用过量,虽然时序没有问题,但资源使用过多,会使整个FPGA芯片的功耗增大,从而造成整个硬件模块的功耗增大,不仅会增大能耗,耗费成本,如果此时设备散热不好,在一定的高温条件下,会使芯片及设备功能异常,无法进行工作。
因此,在使用FPGA进行算法实现,及编码过程中,在设计初期就必须考虑降低功耗。
解决方法
一般来说,对于FPGA芯片,使用的资源越多,功耗越大;使用的时钟频率越高,功耗越大。而资源和时钟,也就分别代表了我们经常说的FPGA的面积和时间,这两个东西往往是矛盾的,所以这也涉及到FPGA的“哲学”问题——面积和时间的平衡。
我简单回顾了一下,以往使用到的降功耗的策略(不够完整,想起了再加;不够细节,有些策略涉及到具体代码才能体现),主要有以下部分:
1、巧用RAM
RAM一般是资源中较为吃紧的资源,我之前碰到过的瓶颈一般都在RAM,对于RAM来说,数据位宽很重要,合理的位宽会减少RAM的使用,比如两个1bit的RAM,例化两个分开的RAM,就不如拼起来用一个2bit的RAM。
而对于18kRAM来说,2bit位宽也是极大的浪费,用满18bit位宽应是最佳的选择。
在深度较低时,还可以适当选用RAM-based shift Register。
2、懂得复用
在处理时钟较高的情况下,可以对某些模块进行分时复用,这样虽然只例化了少量模块,但在一定时间内,可以通过高处理时钟,多次利用该模块进行运算。
这样就可用少量资源实现多次运算,减少例化,通信工程中的数字同步往往利用了该原理。
3、降低时钟频率
除非有特别高的处理要求,否则在设计初期,如果时钟频率能够满足要求,则不建议采用更高的处理时钟频率,频率越高,带来的功耗影响是很大的。
在高处理时钟频率下,布局布线也容易产生时序问题。而在一些对性能要求很高的通信系统中,处理时钟频率往往是很高的,这就对工程师的编码能力提出了更高的要求,在编码初期就要考虑如何写代码,才能让时序更优。
4、学会关闭时钟
对于vivado工程来说,善用时钟的BUFGCE功能,在某些模块不需要进行运算的时候,直接关闭该模块的时钟,将带来极大的功耗收益。
但该方法力求精准,不注意的话将引起功能问题。
5、学会关闭模块功能
对于整个硬件模块来说,在控制上,对于闲置的硬件模块或外围器件,要学会关闭,进行模块级的功耗最优化。
6,降采样率
一般来说,对于数字接收处理中的某些步骤(如帧同步等),采样率越高,性能越好,而相对而言,采样率越高,资源消耗越大。这时就需要找到最佳的采样率,达到性能与资源的平衡,采样率达到一定程度,使得帧同步不再是性能瓶颈,则可以采用。
7,不写冗余逻辑
毫无疑问,冗余的逻辑会增加资源的负担,从设计的角度,多考虑下不同的方法,找到最合适最简单的方法,也许有些多余的模块直接就可以省下。一千个人有一千个哈姆雷特,多和有经验的人学习。
8,学会资源之间互相转化,合理配比
资源之间是可以互换的,RAM,LUT,FF之间都可以互换,如果某一项资源紧张,则可以考虑用其他资源代替。资源之间保持合理配比,如LUT和FF的比例一般为2:1最好。
9,减少不必要的大功率接口组件
有些接口组件如GTX等,功率消耗较大,特别是在线速率较高时,因此应尽量减少使用数量。
10,。。。
这会只想到这么多,后面想起再加吧。
没有回复内容