状态机面积优化
0赞状态机面积优化
速度和面积都是FPGA/CPLD设计中非常关键的性能指标。二者之间却往往是此消彼长的关系,尤其在一些速度要求稍低一些的应用中,面积的优化需求可能就更重要一些。特权同学在优化一个旧有设计时,觉得仅仅是一个状态机的面积优化,也是大有可为的。当然了,本文罗列出的一些优化手段仅限于特权手头的项目应用,或许不具有绝对的普遍适用性,只能是抛砖引玉,给大家一些启发,具体工程的面积优化还要结合实际情况。
1. 一段式状态机改为三段式状态机。从本次工程看,这一步大大的减少了面积,能够将原本309LEs优化到仅仅271LEs。
2. 任何输出寄存器在复位时建议赋初始值。这一步后占用了269个LEs。
3. 一些判断逻辑内进行初始化的寄存器,在不影响功能的情况下,可以考虑放到其他空闲状态(不含判断逻辑)下进行初始化。这一步后占用了265个LEs。
该优化的基本原理如EX1到EX2的改变,这类优化的前提是不影响逻辑本身的功能。
EX1:
IDLE: ;
S1: if(…) mreg <= 0;
S2: mreg <= mreg+1;
EX2:
IDLE: mreg <= 0;
S1: ;
S2: mreg <= mreg+1;
4. 对于某个if…else…判断语句,逻辑处理较多的一方建议放在else里进行处理。
例如EX3到EX4的优化。
EX3:
If(…) begin
a……; b……; c……;
end
else a……;
EX4:
If(…) a……;
ese begin
a……; b……; c……;
end
5. 一个很重要的面积优化原则是“化复杂的逻辑为多个小的简单的逻辑”。前面几个点里其实都符合这个原则的。可以考虑在几个平行的状态机中将原本只在一个状态机里进行的数据输出处理分配到其他几个状态分别处理,这也可以优化不少面积,并且这一步还能够很大程度上提高速度,真可谓设计优化过程中少有的“鱼和熊掌兼得”。
6. 还有一个绝招就是利用工具选项来优化面积,这是最后一招,而且副作用明显,不到非不得以不考虑。