FPGA中改善时序性能的方法_advanced FPGA design

  本文内容摘自《advanced FPGA design》对应中文版是 《高级FPGA设计,结构,实现,和优化》第一章中的内容安全

  FPGA中改善时序,我相信也是你们最关心的话题之一,在这本书中列举了一些方法供给你们参考。dom

1,插入寄存器(Add Register Layers),在中文版中被翻译成:添加寄存器层次。即,在关键路径中插入寄存器。工具

  这种方式会增长设计的时滞(clock latency)。插入了几个寄存器,结果输出就会延长几个周期,在不违反设计规格(对clock latency有要求)以及功能没有影响的时滞状况之下能够这么作。优化

 

2,并行结构。把串行改为并行。最典型的就是乘法器了。spa

  做为一个16bit的乘法器,最省资源的就是等待16个clock出结果,也能够是设计成面积最大可是出来结果速度最快的,只须要一个周期就能够出来结果。翻译

 

3,逻辑展开(Flatten Logic Structures)。中文版一样翻译的很保守:展平逻辑结构。设计

  仔细看了看,以为里面应该包含了连个知识点。第一是逻辑复制,特别是针对大扇出(详情在altera的官方视频资料中有提到),一般使用generate或者是在综合器中设定。第二个是消除代码中的优先级。这里须要多说一句:如今的工具很智能,就算你写成if   else 有优先级的结构,有时候也能综合出并行结构。若是并行也符合你的设计要求,为了安全起见,最好仍是写成case这种并行结构比较好。code

 

4,寄存器平衡 (Register Balancing)。视频

  寄存器平衡就是在你的关键路径中移动你的寄存器。第一就是你手动移动 ——  改代码。第二就是设定综合器让它本身移动 —— 不到万不得已不这么干,由于这么多致使代码移植性变差。blog

 

5,路径重组

  这是最有意思的一个方法,也是体现你的设计水平的方式。结果书中给出的例子确实让我惊讶了一下。为啥呢,先贴出代码

  初版:

 1 module randomlogic_1(
 2     output reg [7:0] Out,
 3     input [7:0] A, B, C,
 4     input clk,
 5     input Cond1, Cond2);
 6 always @(posedge clk)
 7     if(Cond1)
 8         Out <= A;
 9     else if(Cond2 && (C < 8))
10         Out <= B;
11     else
12         Out <= C;
13 endmodule            

 

第二版:

 1 module randomlogic_2(
 2     output reg [7:0] Out,
 3     input [7:0] A, B, C,
 4     input clk,
 5     input Cond1, Cond2);
 6 
 7 wire CondB = (Cond2 & !Cond1);
 8 
 9 always @(posedge clk)
10     if(CondB && (C < 8))
11         Out <= B;
12     else if(Cond1)
13         Out <= A;
14     else
15         Out <= C;
16 endmodule

  从代码上来看2版好像还比初版路径更长,由于 out <= B,的路径从  Cond2 && (C < 8) 变成了 (Cond2 & !Cond1) && (C < 8)。彷佛还变长了,怎么叫优化了呢?实际上,若是咱们不看下面的图,本身模仿RTL Viewer,发现2版的关键路径真的比1短。书中给出的图示也是如此,这是初版的视图,关键路径经历了4个器件

 

 

 

这是第二版的视图,关键路径竟然少了一个器件。

这就是我惊讶的地方,由于这种作法从代码上看不出来。因此须要更高的硬件知识才能驾驭啊。

 

 

欢迎加入: FPGA广东交流群:162664354

      FPGA开发者联盟: 485678884

相关文章
相关标签/搜索