三招轻松解决FPGA资源优化问题

创业点子 阅读(933)


  在进行完分析之后,可以进行资源的优化,由于FPGA资源有限,因此对设计人员来说资源优化相当重要。本节将介绍几种常用的优化方法,设计人员可以结合实际项目选择不同的方法。

  1.资源优化意义

  FPGA资源有限,在设计过程中必须要注意整个设计所用到的资源不能超过所选芯片能提供的资源,通常情况下,要求整个工程占的资源最多占芯片资源的80%,保证整个工程有一定的余量。这种要求首先是要保证工程能达到最终的频率,确保有足够的资源来优化时序;其次保证在上板调试过程中有空余资源方便调试;再次需要保证整个工程的需求增加,确保比较小的变更不会影响整个系统的设计。

  2.设计代码优化

  当编译结果出来之后,根据编译结果进行整个工程的优化,除了通过编译软件的优化之外,最根本的还是进行设计代码及设计架构的优化。

  一般情况下,设计架构在前期确定之后,后期很难会再改动,因此需要进行改动的是设计代码。通常情况下,在确保功能正常的情况下,修改设计代码是为了提高整个工程的最高频率,或者是为了节省资源,提高资源利用率。

  代码的优化方法主要有几个比较典型的优化方法,基本上是进行面积换速度的方法或者速度换资源的方法,根据情况进行小范围的速度、面积互换保证整个工程编译满足最终要求。如何灵活应用前面章节介绍的几种设计方法,需要读者不断地练习、实践。

  3.资源重新分配

  在编译过程中,设计中往往会用到一些RAM或者专用的DSP,如果编译时没有指定,那么在进行资源映射时,软件不使用这种专用的资源,而是使用其他逻辑资源进行拼接。这种拼接即使能满足功能需求,而由于没有专门进行优化,所以最后使用的资源以及工作效率都是不能保证的。

  而在内部RAM等专用资源不够的情况下,可以使用内部逻辑资源实现,实际上是逻辑芯片内部的资源重新分配。在设计过程中,对于RAM等内部资源推荐使用芯片自己的专用资源,例如,当在工程fir_filter输出后加入一级FIFO,那么就需要单独生成FIFO。打开工程fir_filter之后通过选择【Tools】|【MegaWizard plug】|【In Manager】|【Memory Compiler】打开Memory设置选项,如图9-15所示为存储器设置选择。

  

  图9-15 Ram使用选项

  通过Megawizard Plug来产生期望的资源,一般软件也会根据情况选择合适的资源实现,例如上图的FIFO,如果设计人员没有指定该FIFO是由内部哪个RAM资源产生时,软件会根据情况自动进行选择。当芯片资源较多时,对这种选择并不会过多关心,但是当芯片资源紧张时,通常需要在开始时分配好芯片内部的RAM资源,评估分配的资源大小,因为一旦选择好内部RAM资源后,如果只使用了一部分该RAM,那其余模块也不能使用未用到的RAM。

  {!-- PGC_COLUMN --}

  4.综合面积优化

  在设计流程中,综合对于整个设计的结果影响非常大,在综合过程中,如何选择约束条件以及编译选项非常重要。如果设置不当,软件会浪费很多资源进行一些不必要的工作。

  同样针对工程fir_filter,如果使用默认编译选项后资源使用情况不理想,那么就需要进行面积优化。图9-16通过选择【Assignments】|【Settings】|【Analysis&Synthesis Settings】来进行常见的面积相关设置,通过不同的选择可以达到不同的优化效果。

  

  图9-16 常见的综合设置选项

  1)首先可以选择面积优化选项,在保证速度满足要求的情况下,选择面积优化,编译器会进行相应的优化,使工程尽量用少的资源实现功能。

  2)其次可以选择【Auto ROM Replacement】、【Auto RAM Replacement】、【Auto RAM Block Balancing】这些用于资源分配的选项,这些选项将使软件决定是否用芯片的这些资源来替换同等功能的模块。通过这些干预可以获得最优的面积、速度。

  3)另外选择【More Settings】选项,可以看到更多的可优化项,例如图9-17所示的状态机编码,如果在编码过程中没有进行规划,那么在这里可以进行选择,综合器将会按照选择的编码方式进行处理。通常情况下,对较大规模状态机采用二进制顺序编码或者格雷码能获得较优的面积。

  

  图9-17 状态机编码选项

  同时,像【Auto Resource Sharing】选项将会进行自动资源共享,对于功能相同的模块进行优化,减少资源浪费,尽量充分利用资源,如图9-18所示,合理地设置资源分配状态可以减少资源浪费。

  

  图9-18 自动资源共享选项

  而像【Remove Duplicate Logic】、【Remove Duplicate Registers】、【Remove Redundant Logic Cells】等选项可以去除复制的逻辑资源或者冗余逻辑,减少浪费,同时在整体设计过程中对整个设计的结构进行优化,使模块边界充分优化,同样可以达到资源优化的目的。