赞
踩
可以看到里面有一个4输入的LUT,有一个3输入的LUT。
LE有两种模式,如果是普通模式,就只用到那个4输入的LUT,用来实现4输入的组合逻辑功能。
如果是算术模式,就是用来实现加法运算。这个时间一般DATA D输入为VCC或其他,反正不用。
DATA C选择使用CIN。4输入的LUT就用来实现DATA,DATAB,CIN的加法运算。3输入的LUT用来
实现DATA,DATAB,CIN的进位运算。
进位链的输入必须来自上一个进位链的输出,进位链的输出只能输向进位链的输入。
进位链的延时是影响加法运算速度的关键:我是这样理解的,假设是4位+4位的加法运算,如果没有进位运算,那么4位+4位各自对应的位可以同时进行运算,但是在进位的运算上,第1位的进位要等待第0位的进位运算出来,第2位的进位要等待第1位的进位运算出来,第3位的进位要等第2位的进位运算出来,第3位再进行进位运算输出,有4进进位运算,是串行的,延时会增加,这个是多位加法运算成为时序瓶颈的原因。
还有一点要理解:
LUTMASK的理解:说拍了就是一个真值表,对于4输入,输出只有16种结果,所以LUTMASK是16位。每一位代表4输入的一种情况。
从LE结构中可以看出,其实里面有两个LUT,但是这里只有一种真值表。这个原因是:DATA D为1时,LUT MASK的高8位就是4输入 LUT的真值表,下面的3输入的LUT可以认为是DATA D为0时的情况,是LUT MASK的低8位。也就是4输入的LUT,根据DATA D的为1或者0,看作是两个3输入的LUT。
详细理解请看:http://bbs.ednchina.com/BLOG_ARTICLE_3013423.HTM
http://www.alteraforum.com.cn/showtopic-5644-1.aspx
其他的原语从这里找:
如果设得不对:例如如果DATA 没有输入信号(是空的),但是根据 LUT MASK的真值表发现,在DATA 为1和为0的时候有两种值,那么显然这个真值表是与DATA A有关的,DATA A肯定应该有输入,这个时候编译是不通过的,会报错。如果LUMASK设置得不对,有时候虽然不会报错,但是进位链不会产生,因为根据LUMASK编译器判断输出根本与输入无关,所以就不会有进位链的电路产生。
cyclone iv:
LCELL:LUT 从入到组合逻辑出 0.226ns
LUT组合逻辑出到另一个相临LUT的入:0.127ns
进位链:
EP4CE30F23I7 0.278ns 实测:0.167ns(30级构成5ns)
(
[root@TF /]# <0x0100>:0xaaaaaaa9
mcpset n r 101
[root@TF /]# <0x0101>:0xaaaaaaaa
mcpset n r 102
[root@TF /]# <0x0102>:0xaaaaaaaa
mcpset n r 103
<0x0103>:0xbaaaaaaa
<0x0100>:0xfffffffe
<0x0101>:0xffffffff
<0x0102>:0xffffffff
<0x0103>:0x0fffffff
)
EP4SGX230KF40C4ES 0.012ns
EP2S130F1508I4 0.041ns
EP2AGX260FF35I5 0.013ns
参考资料:
http://bbs.ednchina.com/BLOG_PERSONALCAT_100226_41415_1.HTM
http://www.alteraforum.com.cn/showtopic-5644-2.aspx
遇到的问题:
1.0.2,4,6,。。。 延时递增 1,3,5,7。。。延时递增
0,1,2,3,4.。。。不是递增,0与1从sumout到bit_out_reg路径延时不同。
2.分析set_up,使用report false path,把时钟路径考虑进去,排序与实际的延时测量结果不同。
3.0-15路径延时不停在变,原因是set false path的路径没有包括路径bit_out_reg[0] - 3,我在想是不是全局时钟端可以加buf什么的?
曾经遇到的问题:
1.用AII芯片时,延时不固定:要固定全局是G7,还是G5...
即使是同一个BUFG,如果设计改变了,扇出改变了,延时还是会变化,虽然全局的硬件走线并没有变化,但因为扇出增加,由于电容效应,延时会增加。
2.FIT发生错误:不能只固定一个延时链的位置,要全部都固定。
3.使用了电路:将start,stop转化为一个脉冲。电路的up,down寄存器的清零信号接到了clk_en端,在assign中添加约束auto clock enable replacement ,清零信号连到了清零端。
原因及解决方法:譬如延时链是从0-63,但是对寄存器位置的约束只约束了0-47,或者约束了0-63,而且位置也是对的,只是40(随便一个)忘了写约束,漏了,就会报这个错误。个人推测,基本意思:不能将一个延迟链割裂,如果没有把每个延迟链约束完整,就算是割裂了。
在算术模式下:
Combout = F1(dataa, datab, datac or cin) & datad + F0(dataa, datab, datac or cin) & ! datad
Cout = F0(dataa, d a tab, cin)
通常,datad是连接到VCC,那么,combout是由F1查找表决定(输入是dataa,datab,datac或cin),cout是由F0查找表决定(输入是dataa,datab,cin),如果datad是连接到0,那么,combout的查找表也是F0(输入是data,datab,datac或cin,具体是datac还是cin,是由例化的参数决定的)。
使用MODELSIM可以看到仿真模型的源代码。
按照上面的图来构建进位链,代码如下图:
仿真是没有问题的,当然仿真的时候,为了显示延时效果,比如说CARRY_IN的COUT端到CARRY_0的CIN端信号,要加个软延时,否则看不到效果,比如说
但是发现一个问题,从构造进位链的LUT_MASK可以看出,CARRY_0的COUT = CIN,但是在后端却发现,是取反过的,COUT=!CIN(查看CARRY_MASK),还有combout的输出(看SUM_MASK)是0,这与原来代码中并没有使用CARRY_IN到CAYYR_4的comb_out有关,所以被优化掉了,所以如果代码中将comb_out用起来,comb_out的sum_mask就对了。但是carry_mask还是不对,这也是软件优化的结果,因为预计到后级的进位链有取反操作,所以在这一级就提前取反了,但是我们并不希望有这样的动作,因为,我们要在特定的时间有特定的翻转,而不是简单的关注最后一级进位链的最终输出,本来想通过调整编译选项,能禁止这个优化,或者加(*keep*),或者(*preserve*),都不能达到此目的。最终采取此方式解决:DATAD的输入设为0,这样,comb_out与cout的输出就一致了,发现后端的综合结果保持了不变。
有如下发现:
在进位链延时上,如果CIN-COUT没有取反操作,那么,FF - FF延时固定是147PS RR-RR延时固定是278PS,
如果有取反操作 RR - RF,FF-FR是67PS。
做进位链时遇到的问题:
1.根据WAVE UINON的设计,在寄存器端应该能看到两个上升沿,实际去发现,经常看不到两个上升沿,还是只有1个上升沿,实际原因是下降沿的传播速度远快于上升沿的传输速度,前面那个上升沿与下降沿之间的脉冲宽度,随着逐级传递,这个宽度会越来越小,直至下降沿超过上升沿,脉冲完全消失,导致看不到第1个沿。
TDC思路1:
1.构建延时链,通过查看下升沿或者下降沿的位置,确定当前时延值。下降沿的延时链细分更长一些。
2. WUA 原来的上升沿,变成1个包含两个上升沿的序列,以这个序列在延时链中进行传播,这样可以防止上升沿落在超宽延时单元中这个问题,不可能两个沿都落在超宽延时单元之中。
3.WUB 输入电平为0时,进位链输出都为0.输入变以1之后,进位链输出变以周期信号,周期是大约为1个周期,实现多次测量,提高测量精度。
4.WUC 输入电平为0时,减肥舞输出为全0,输入变以1以后,进位链输出变位周期信号,周期略大于超宽延时单元,即1个延时链之中,会有多个信号周期,再加上最后一个发射单元的余值。这种方法的好处是,测量精度只取决于发射器单元各延时值准不准确,与后面延时链的精度无关,只要关心有几个周期,只需要将发射单元校准好,校准方法是,弄2倍延时链长度,用后一延时链测得的值减去前1个延时链测的值,就是1个周期的值,除以等效的发射单元的延时单元数(这里是假设发射的延时单元是等延时的)
5.
下降沿标定的进位链延时:
http://blog.sina.com.cn/s/blog_48fd99310102vigx.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。