FPGA设计略讲

来源:互联网 发布:php去除重复数组值 编辑:程序博客网 时间:2024/05/17 17:56

问:就是我们在  延时效率  上没有什么经验,后时序仿真时由于不同步的问题也产生了0的输出,所以我们不知道如何对其进行时间、面积、功耗上的一个优化及其权衡 ?

答:fpga一般前仿就行了,后仿结果和前仿结果应该一致。如果不一致,则可能是代码中有些不可实现的语句(例如测试语句),属于设计错误。timing和area是一对矛盾:为

了优化timing,需要了解如何适当地插入寄存器,将一个复杂的组合逻辑变成pipeline。如果你的fpga型号逻辑资源够用,暂时不需要优化area。至于功耗,老实说在FPGA设

计时你省不了多少,设计好坏功耗区别不大,不信你可以用ise自带的功耗仿真软件看看。所以,重点关注timing(即性能),timing满足后可以适当地优化area和power。

 

问:1、我们在后仿真时出现了一个如下的警告:

at 2.750 (3): Warning: /X_FF SETUP High VIOLATION ON I WITH RESPECT TO CLK;Expected := 0.115 ns; Observed := 0.1 ns; At : 2.75 ns,这个就应该是时钟不同步产生

的,而这个代码的逻辑在前仿真里面验证了是正确的,现在的问题可能是时序方面没有达到设计的要求,我们所想的是添加时钟约束来达到这个数据输入和时钟的同步。做时序

约束的时候有什么好的建议,如何才能让我的设计在时序方面达到一个比较好的效果  2、另外我们觉得timing这个问题应该核心就在于延时上,而这个延时则要求代码的一些设

计技巧以减少延时,如如何设计才能尽可能减少LUT个数,降低逻辑级数等,以及IO输入输出上的延迟,而我们的问题就在于不熟悉代码和具体物理映射之间的关系,当然我们

也在尽可能找寻相关的知识,所以就只能一步步的摸索,而没有一个明确的标准或者说方向?

答:1. 如果你的目标是跑100MHz(周期10ns),你就把“周期约束”改成8~9ns(留点余量)

2. 所谓的延时指组合逻辑延迟太大,pipeline可以解决组合逻辑延时的问题。你们在逻辑上实现ip查找,不可能遇到io延迟太大的问题。总的LUT个数和逻辑级数更你的功能
关,一般不能降低,需要降低的是,每两个FF之间的组合逻辑级数和LUT个数。这个用pipeline可以解决。建议:看ise的手册,学习period constraint如何添加;搜索vhdl编码
中的pipeline技巧。

 

问:第一个问题我能不能理解成实际值会略小于理论值,所以通过留点余量来保证实际效果,余量具体是多少则是经验所得或者大量测试所得了?

答:是的。余量根据经验设置就可以了,80-90%的余量就行。

 

问:第二个问题我们也主要就是在时序逻辑上的延迟,触发器和寄存器他们之间的逻辑级数上有点不知所措,我们可以通过pipeline来解决这里面的问题?另外除了周期约束,

应该还会跟偏移约束有关吧~

答:跟offset约束没有太大关系,offset约束一般加在输入输出io上。你们的ip lookup逻辑,数据包是从mac过来,mac都是xilinx自己的core,你们不太可能涉及修改io部分的逻

辑,所以不会有io部分的timing问题。自己写的逻辑,频率跑不上去,一般都是组合逻辑延时太大,加pipeline就行了。

问:物理器件上的频率和我们设置的频率应该只是一种映射上的关系吧,具体到时候要在物理器件上跑的话,它的频率还是按照fpga板子上的来?

答:是的。fpga上跑的时钟是你板子上输入时钟的倍频或者分频(通过DCM or pll)。如果你的逻辑跑出来的频率小于系统用的主时钟频率,逻辑就会出现时序问题,根本跑不

通;必须保证逻辑实现达到的时钟频率,高于所用的系统时钟。

总结:(参考http://www.21ic.com/app/eda/201203/109947_3.htm)

如何提高电路工作频率

对于设计者来说,我们当然希望我们设计的电路的工作频率(在这里如无特别说明,工作频率指FPGA片内的工作频率)尽量高。我们也经常听说用资源换速度,用流水的
方式可以提高工作频率,这确实是一个很重要的方法,今天我想进一步去分析该如何提高电路的工作频率。
 
我们先来分析下是什么影响了电路的工作频率。

我们电路的工作频率主要与寄存器到寄存器之间的信号传播时延及clock skew有关。在FPGA内部如果时钟走长线的话,clock skew很小,基本上可以忽略, 在这里为了简
单起见,我们只考虑信号的传播时延的因素。

信号的传播时延包括寄存器的开关时延、走线时延、经过组合逻辑的时延(这样划分或许不是很准确,不过对分析问题来说应该是没有可以的),要提高电路的工作频率
,我们就要在这三个时延中做文章,使其尽可能的小。

我们先来看开关时延,这个时延是由器件物理特性决定的,我们没有办法去改变,所以我们只能通过改变走线方式和减少组合逻辑的方法来提高工作频率。

1.通过改变走线的方式减少时延。 
 
以altera的器件为例,我们在quartus里面的timing closure floorplan可以看到有很多条条块块,我们可以将条条块块按行和按列分,每一个条块代表1个LAB,每个LAB里有8个
 
或者是10个LE。它们的走线时延的关系如下:同一个LAB中(最快) < 同列或者同行 < 不同行且不同列。我们通过给综合器加适当的约束(不可贪心,一般以加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语句去对命令进行译码,并触发相应的状态机,这样做下来这一个模
 
块的频率就可以跑得比较高了。

总结:提高工作频率的本质就是要减少寄存器到寄存器的时延,最有效的方法就是避免出现大的组合逻辑,也就是要尽量去满足四输入的条件,减少LUT级联的数量。我们可以
 
通过加约束、流水、切割状态的方法提高工作频率。