首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

浅谈高速FPGA设计的一些要点

浅谈高速FPGA设计的一些要点

大家在做FPGA设计时,首先肯定追求功能是否满足要求,等Behavior Simulation通过后,就开始布局布线的考虑,如果时序方面达不到设计指标要求,就要对设计做调整修改,有时这种调整修改比较容易做到,但很多时候,并不是那么简单,有时侯甚至要重新确定设计方案。如果设计者一开始就能对那些有可能关系到时序的因素做考虑,那么就减少了后期的烦恼。关于高速FPGA的设计,牵涉到很深的知识,需要设计师具备深厚扎实的理论知识(算法)与长期的实践经验的积累,同时我觉得也是FPGA相对于DSP最有魅力的地方——细节的地方你必须也要注意到,否则你仍然完成不了。
后面我会把自己知道的一点东西与大家分享,由于自己能力有限,希望能起到抛砖引玉的作用。
我们考虑的高速设计主要有三个方面:
(1)模块每单位时间处理的数据量;
(2)系统关键路径的延时,有建立时间、组合逻辑延时、布线延时等组成;
(3)输出数据相比数据输入的延时。
下面分别介绍可能采用的策略:
关于提高系统每单位时间处理的数据量(吞吐量),需要提到流水线(pipeline)的概念。假设输入的数据X(1bit)需要经过三个运算模块A,B,C,才能输出如下图所示:

假设每个单元的处理都在时钟的驱动下完成,且延迟一个时钟就能得到输出,那么输入需要经过3个CLK才能输出,每输入一个数据就要等3个CLK才能再次输入,即每个时钟平均处理1/3(bit)的数据量,实际上我们可以看到,当B单元在工作时,A、C单元都处于闲置状态,假如A、C也能处于工作状态是不是效率就提高了呢?答案是肯定的,我们用三个寄存器将各个单元拆开,如下图所示:

虽然现在每输入一个数据要6个CLK的处理流程,但数据可以持续地输入,持续地输出,从整体看,每个CLk平均处理1bit的数据量,这就是我们所说的流水线操作,当然所付出的代价就是增加了几个寄存器(面积),但从系统的角度看,这样做是值得的。

系统的关键路径就是限制系统能跑多高速度(及CLK周期的限制)的那些路径,即在系统中任意两个时序元件间的延时的最大值决定了系统的时钟速率。CLK能达到的最大值为:

其中Tcomb为组合延时,若关键路径的组合延时太大势必会影响到时钟的提高,一般可以采用寄存器分割的方法将组合逻辑拆分成几个部分。那么如何拆分组合逻辑呢?譬如说,如果你的FPGA是基于4输入LUT的,那么如果第一个REG的输出经过判断逻辑与第二个REG的输入相连,而且判断逻辑条件大于四个输入,那就要由多个LUT级联组合才能完成,这就引入一级组合逻辑延迟,我们要减少组合逻辑,无非就是要输入条件尽可能的少,逻辑层次尽可能少,这样就可以使级联的LUT更少,从而减少了组合逻辑引起的时延。我的一个清晰的印象是自己在写代码时发现,如果if语句嵌套了许多层那么在做仿真的时候能够明显地看到延迟增加了许多。看一个简单的例子,假如只有一层判断逻辑如下:

综合出来的RTL为

Place&Route后的仿真波形如下,注意延时为6027ps

现在我让它通过3层判断逻辑:

RTL模型与布局布线后仿真分别如下,注意延时为6033ps



我们看到判断逻辑的层次增加导致延时的增加。注意如果判断逻辑之间要经历几个模块,那么延时会急剧增加。即,我们能将关键路径拆分成两个更小的路径(可以通过添加寄存器来实现)可以改善时序。
当然为达到高速设计的目的,需要付出的代价是增加面积,本来可以复用的模块现在做了多块,当然减轻了对时序的压力(即关键路径的延时能降低的更多)。实现时,设计者需找到关键路径,合理调整逻辑,使之最小化。这是一个需要在实践中慢慢体会才会掌握的技能,可以说每个具体的问题的解决方法都不相同,特别要注意,实际的逻辑是如何运作的,这对时序的改善有直接的影响,否则虽然时序被你“改善”了,功能却不对了!

附件大小附件大小pipeline1.JPG7.35 KBpipeline2.JPG9.28 KBclk_max.JPG7.36 KByiceng.JPG10.41 KBrtl1.JPG54.01 KBwave1.JPG24.28 KB3ceng.JPG14.77 KBrtl2.JPG77.73 KBwave2.JPG34.5 KB
记录学习中的点点滴滴,让每一天过的更加有意义!
返回列表