前两天在论坛上看到了一个兄弟用门级电路实现 A[0] + A[1] +。。。。。+A[255],也就是256个输入相加,
为了测试的方便,我采用了,总共采用了12个 输入相加
在spartan3下,
第一种方法是采用RTL级别,采用最简单的方法,也就是采用了11个加法器树形相加,这时候消耗的查找表为24个,查看布局布线的结构,发现走的是
LUT-MUX-DFF的路线。其中每个查找表中DFF用了两个,输出2位
第二种方法是采用门级电路的形式,通过门级走进位链,采用的原语为 MUXCY 和 XORCY,在这里注意的是XORCY (如果采用名称定为,那么要把进位放在输出后面,XOR的输出放在最后),这样约束后走的就是进位链了 。查看综合消耗的查找表为18个 。其中查找表中DFF用了2个,输出为2+ 1(进位链) ,
通过以上试验可以推断,在SPARTAN3下,做加法器的话,最好走进位链。用RTL级别约束走进位链我不会,哪位兄弟会的话,可以告诉我一下,谢谢了 。
在spartan6下 :
我采用了A[0] + A[1] + ... +A[11]结构 。
第一种方法还是RTL级别 ,消耗查找表为12个,其中关于加法的查找表,用的最大DFF为4个。
第二种方法还是采用门级 MUXCY+XORCY+FiMUX 方式,在这里没有采用carry4原语,这是因为采用carry4原语做这个太复杂了,查看消耗的查找表为 24 个,布局布线后,查看加法计算模块中slice内结果,发现每个slice中只用了一个DFF,
通过上面两个试验,初步了解了spartan3和spartan6的不同,表现在以下方面 :
1: spartan3为4输入查找表,有2个DFF,spartan6为6输入查找表,有4个DFF,
其中进位链在 spartan3中是完全进位链形式,在spartan6中采用的是CRRY4封装的形式 。
2: 在spartan3中采用进位链,11个加法器消耗了11×2个slice,因为每个slice只有2个dff,而采用进位链,可以理解为3个输出,这样就减少了逻辑。而在spartan6中,因为每个slice有4个DFF,也就是11个加法器消耗了11个slice,而采用进位链的slice中只能使用一个DFF,这是因为进位链是连接在一起的,这样就浪费了3个DFF,所以导致了消耗的资源是RTL级别的2倍 。
因此,如果是加法,那么在spartan3中,如果可能那么约束走进位链(SLICE
-xor-MUXCY-XORCY-dff)的方式 ,在spartan6中走(SLICE-MUX-DFF) 方式.
如果是乘法,那么在spartan3和spartan6中都尽量走进位链的方式。