(转)FPGA中系统运行频率计算方法

我们的设计需要多大容量的芯片?我们的设计能跑多快?这是经常困扰工程师的两个问题。对于前一个问题,我们可能还能先以一个比较大的芯片实现原型,待原型完成再选用大小合适的芯片实现。对于后者,我们需要一个比较精确的预估,我们的设计能跑50M,100M 还是133M?

          首先让我们先来看看Fmax 是如何计算出来的。图(1)是一个通用的模型用来计算FPGA的。我们可以看出,Fmax 受Tsu , Tco , Tlogic 和 Troute 四个参数影响。( 由于使用FPGA 全局时钟,时钟的抖动在这里不考虑)。

          时钟周期 T = Tco + Tlogic + Troute + Tsu
         时钟频率 Fmax = 1/Tmax
          
       其中:
          Tco : D 触发器的输出延时
          Tlogic : 组合逻辑延时
          Troute : 布线延时
          Tsu : D 触发器的建立时间  

       165725cvsmsuquulsvgffd.png


       图1 时钟周期的计算模型
       
       让我看一下上图:图1,上图为时钟周期的计算模型,由词可以看出,在影响Fmax 的四个参数中,由于针对某一个器件Tsu 和Tco 是固定的,因此我们在设计中需要考虑的参数只有两个Tlogic 和Troute.通过良好的设计以及一些如Pipeline 的技巧,我们可以把Tlogic 和Troute 控制在一定的范围内。达到我们所要求的Fmax.

          经验表明一个良好的设计,通常可以将组合逻辑的层次控制在4 层以内,即( Lut Levels 《=4 ) 。而Lut Levels( 组合逻辑的层次 )将直接影响Tlogic 和Troute 的大小。 组合逻辑的层次多,则Tlogic 和Troute 的延时就大,反之, 组合逻辑的层次少,则Tlogic 和Troute 的延时就小。

          让我们回过头来看看Xilinx 和Altera 的FPGA 是如何构成的。是由Logic Cell ( Xilinx )或 Logic Element( Altera )这一种基本结构和连接各个Logic Cell 或Logic Element 的连线资源构成。无论是Logic Cell 还是 Logic Element ,排除其各自的特点,取其共性为一个4 输入的查找表和一个D 触发器。如图(2)所示。而任何复杂的逻辑都是由此基本单元复合而成。图(3)。上一个D 触发器的输出到下一个D 触发器的输入所经过的LUT 的个数就是组合逻辑的层次( Lut Levels )。因此,电路中用于实现组合逻辑的延时就是所有Tlut 的总和。在这里取Lut Levels = 4 。故Tlogic = 4 * Tlut 。 

       165731kz5k9kz49k9a23zf.png

 


       图2 FPGA的基本逻辑单元

       165731j4jjfwb7izwpimpp.png


       图3 复杂组合逻辑的实现
       
       解决的 Tlogic 以后,我们来看看Troute 如何来计算。由于Xilinx 和Altera 在走线资源的设计上并不一样,并且Xilinx 没有给出布线延时的模型,因此更难于分析,不过好在业内对布线延时与逻辑延时的统计分析表明, 逻辑延时与布线延时的比值约为1:1 到1:2.由于我们所选用的芯片大量的已经进入0.18um 和0.13um 深亚微米的工艺,因此我们取逻辑延时与布线延时的比值为1:2.

          Troute = 2 * Tlogic

          Tmax = Tco + Tlogic + Troute + Tsu

          = Tco + Tsu + 3 * Tlogic

          = Tco + Tsu + 12 * Tlut

          下表是我们常用的一些 Xilinx 和Altera 器件的性能估算。我们选取的是各个系列中的最低的速度等级。由于Altera 的APEX ,APEX II 系列器件的不同规模的参数不同,我们选取EP20K400E 和 EP2A15 作代表。
       165732pm7nhh1i0xg1z1n1.png



       # 以EP20K400E-3 的数据计算得出。

          ## 以 EP2A15-9 的数据计算得出

       165732ynmnbmum3un8ub85.png



       今天我们就聊到这里,各位,加油

对于设计者来说,当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提高电路的工作频率。我们先来分析下是什么影响了电路的工作频率。我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clockskew有关。在FPGA内部如果时钟走长线的话,clockskew很小,基本上可以忽略,在这里为了简单起见,我们只考虑信号的传播时延的因素。信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率,我们就要在这三个时延中做文章,使其尽可能的小。我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。1.通过改变走线的方式减少时延。我们通过给综合器加适当的约束(不可贪心,一般以加5%裕量较为合适,比如电路工作在100Mhz,则加约束加到105Mhz就可以了,贪心效果反而不好,且极大增加综合时间)可以将相关的逻辑在布线时尽量布的靠近一点,从而减少走线的时延。(注:约束的实现不完全是通过改进布局布线方式去提高工作频率,还有其它的改进措施)   2.通过减少组合逻辑的减少时延。我们知道,目前大部分FPGA都基于4输入LUT的,如果一个输出对应的判断条件大于四输入的话就要由多个LUT级联才能完成,这样就引入一级组合逻辑时延,我们要减少组合逻辑,无非就是要输入条件尽可能的少,这样就可以级联的LUT更少,从而减少了组合逻辑引起的时延。我们平时听说的流水就是一种通过切割大的组合逻辑(在其中插入一级或多级D触发器,从而使寄存器与寄存器之间的组合逻辑减少)来提高工作频率的方法。比如一个32位的计数器,该计数器的进位链很长,必然会降低工作频率,我们可以将其分割成4位和8位的计数,每当4位的计数器计到15后触发一次8位的计数器,这样就实现了计数器的切割,也提高工作频率。在状态机中,一般也要将大的计数器移到状态机外,因为计数器这东西一般是经常是大于4输入的,如果再和其它条件一起做为状态的跳变判据的话,必然会增加LUT的级联,从而增大组合逻辑。以一个6输入的计数器为例,我们原希望当计数器计到111100后状态跳变,现在我们将计数器放到状态机外,当计数器计到111011后产生个enable信号去触发状态跳变,这样就将组合逻辑减少了。上面说的都是可以通过流水的方式切割组合逻辑的情况,但是有些情况下我们是很难去切割组合逻辑的,在这些情况下我们又该怎么做呢?状态机就是这么一个例子,我们不能通过往状态译码组合逻辑中加入流水。如果我们的设计中有一个几十个状态的状态机,它的状态译码逻辑将非常之巨大,毫无疑问,这极有可能是设计中的关键路径。那我们该怎么做呢?还是老思路,减少组合逻辑。我们可以对状态的输出进行分析,对它们进行重新分类,并根据这个重新定义成一组组小状态机,通过对输入进行选择(case语句)并去触发相应的小状态机,从而实现了将大的状态机切割成小的状态机。在ATA6的规范中(硬盘的标准),输入的命令大概有20十种,每一个命令又对应很多种状态,如果用一个大的状态机(状态套状态)去做那是不可想象的,我们可以通过case语句去对命令进行译码,并触发相应的状态机,这样做下来这一个模块的频率就可以跑得比较高了。提高FPGA工作频率的本质,就是要减少寄存器到寄存器的时延,最有效的方法就是避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT级联的数量。我们可以通过加约束、流水、切割状态的方法提高工作频率FPGA设计需要多大容量的芯片,设计需要跑多快?这是经常困扰工程师的两大问题。对于前者,我们还可以选用一个较大的芯片实现原型,待原型完成再选用大小合适的芯片;对于后者,通常我们需要预先有一个较精确的预估,就像我们的设计能跑50M、100M还是150M。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值